ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGIxMjkKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNDQgQEAKKy9saWIKK2JpbgorLm1hbmFnZXIKK3RhcmdldAorLnNldHRpbmdzCisqfgorLnByb2plY3QKKy5jbGFzc3BhdGgKK3JlbGVhc2UucHJvcGVydGllcworKiovLkRTX1N0b3JlCisKKyMgdmlydHVhbCBtYWNoaW5lIGNyYXNoIGxvZ3MsIHNlZSBodHRwOi8vd3d3LmphdmEuY29tL2VuL2Rvd25sb2FkL2hlbHAvZXJyb3JfaG90c3BvdC54bWwKK2hzX2Vycl9waWQqCisKKy5ncmFkbGUKK2J1aWxkLSoKKyouYXNjCitidWlsZAorb3V0CisuamF2YS12ZXJzaW9uCisKKworIyBDb3ZlcnMgSmV0QnJhaW5zIElERXM6IEludGVsbGlKLCBSdWJ5TWluZSwgUGhwU3Rvcm0sIEFwcENvZGUsIFB5Q2hhcm0sIENMaW9uLCBBbmRyb2lkIFN0dWRpbyBhbmQgV2Vic3Rvcm0KKyMgUmVmZXJlbmNlOiBodHRwczovL2ludGVsbGlqLXN1cHBvcnQuamV0YnJhaW5zLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMDY1NDQ4MzkKKworIyBVc2VyLXNwZWNpZmljIHN0dWZmOgorLmlkZWEvKiovd29ya3NwYWNlLnhtbAorLmlkZWEvKiovdGFza3MueG1sCisuaWRlYS9kaWN0aW9uYXJpZXMKKworIyBTZW5zaXRpdmUgb3IgaGlnaC1jaHVybiBmaWxlczoKKy5pZGVhLyoqL2RhdGFTb3VyY2VzLworLmlkZWEvKiovZGF0YVNvdXJjZXMuaWRzCisuaWRlYS8qKi9kYXRhU291cmNlcy54bWwKKy5pZGVhLyoqL2RhdGFTb3VyY2VzLmxvY2FsLnhtbAorLmlkZWEvKiovc3FsRGF0YVNvdXJjZXMueG1sCisuaWRlYS8qKi9keW5hbWljLnhtbAorLmlkZWEvKiovdWlEZXNpZ25lci54bWwKKworIyBHcmFkbGU6CisuaWRlYS8qKi9ncmFkbGUueG1sCisuaWRlYS8qKi9saWJyYXJpZXMKKworKi5pd3MKZGlmZiAtLWdpdCBhLy5pZGVhLy5uYW1lIGIvLmlkZWEvLm5hbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMmFkMQotLS0gL2Rldi9udWxsCisrKyBiLy5pZGVhLy5uYW1lCkBAIC0wLDAgKzEgQEAKK2phdmFwYXJzZXItcGFyZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvLmlkZWEvY29kZVN0eWxlU2V0dGluZ3MueG1sIGIvLmlkZWEvY29kZVN0eWxlU2V0dGluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzFkMGUKLS0tIC9kZXYvbnVsbAorKysgYi8uaWRlYS9jb2RlU3R5bGVTZXR0aW5ncy54bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iUHJvamVjdENvZGVTdHlsZVNldHRpbmdzTWFuYWdlciI+CisgICAgPG9wdGlvbiBuYW1lPSJQRVJfUFJPSkVDVF9TRVRUSU5HUyI+CisgICAgICA8dmFsdWUgLz4KKyAgICA8L29wdGlvbj4KKyAgICA8b3B0aW9uIG5hbWU9IlBSRUZFUlJFRF9QUk9KRUNUX0NPREVfU1RZTEUiIHZhbHVlPSJKYXZhUGFyc2VyIiAvPgorICA8L2NvbXBvbmVudD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8uaWRlYS9jb2RlU3R5bGVzL2NvZGVTdHlsZUNvbmZpZy54bWwgYi8uaWRlYS9jb2RlU3R5bGVzL2NvZGVTdHlsZUNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlYmRlMgotLS0gL2Rldi9udWxsCisrKyBiLy5pZGVhL2NvZGVTdHlsZXMvY29kZVN0eWxlQ29uZmlnLnhtbApAQCAtMCwwICsxLDUgQEAKKzxjb21wb25lbnQgbmFtZT0iUHJvamVjdENvZGVTdHlsZUNvbmZpZ3VyYXRpb24iPgorICA8c3RhdGU+CisgICAgPG9wdGlvbiBuYW1lPSJQUkVGRVJSRURfUFJPSkVDVF9DT0RFX1NUWUxFIiB2YWx1ZT0iSmF2YVBhcnNlciIgLz4KKyAgPC9zdGF0ZT4KKzwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLy5pZGVhL2NvbXBpbGVyLnhtbCBiLy5pZGVhL2NvbXBpbGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg1ZDhiCi0tLSAvZGV2L251bGwKKysrIGIvLmlkZWEvY29tcGlsZXIueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJDb21waWxlckNvbmZpZ3VyYXRpb24iPgorICAgIDxhbm5vdGF0aW9uUHJvY2Vzc2luZz4KKyAgICAgIDxwcm9maWxlIG5hbWU9Ik1hdmVuIGRlZmF1bHQgYW5ub3RhdGlvbiBwcm9jZXNzb3JzIHByb2ZpbGUiIGVuYWJsZWQ9InRydWUiPgorICAgICAgICA8c291cmNlT3V0cHV0RGlyIG5hbWU9InRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9hbm5vdGF0aW9ucyIgLz4KKyAgICAgICAgPHNvdXJjZVRlc3RPdXRwdXREaXIgbmFtZT0idGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMvdGVzdC1hbm5vdGF0aW9ucyIgLz4KKyAgICAgICAgPG91dHB1dFJlbGF0aXZlVG9Db250ZW50Um9vdCB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZhcGFyc2VyLWNvcmUiIC8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMiIC8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yIiAvPgorICAgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlIiAvPgorICAgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYyIgLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJqYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwiIC8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmciIC8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci10ZXN0aW5nIiAvPgorICAgICAgPC9wcm9maWxlPgorICAgIDwvYW5ub3RhdGlvblByb2Nlc3Npbmc+CisgICAgPGJ5dGVjb2RlVGFyZ2V0TGV2ZWw+CisgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItY29yZSIgdGFyZ2V0PSIxLjgiIC8+CisgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzIiB0YXJnZXQ9IjEuOCIgLz4KKyAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yIiB0YXJnZXQ9IjEuOCIgLz4KKyAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci1wYXJlbnQiIHRhcmdldD0iMS44IiAvPgorICAgICAgPG1vZHVsZSBuYW1lPSJqYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZSIgdGFyZ2V0PSIxLjgiIC8+CisgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYyIgdGFyZ2V0PSIxLjgiIC8+CisgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbCIgdGFyZ2V0PSIxLjgiIC8+CisgICAgICA8bW9kdWxlIG5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nIiB0YXJnZXQ9IjEuOCIgLz4KKyAgICAgIDxtb2R1bGUgbmFtZT0iamF2YXBhcnNlci10ZXN0aW5nIiB0YXJnZXQ9IjEuOCIgLz4KKyAgICA8L2J5dGVjb2RlVGFyZ2V0TGV2ZWw+CisgIDwvY29tcG9uZW50PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLy5pZGVhL2VuY29kaW5ncy54bWwgYi8uaWRlYS9lbmNvZGluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmI0NTcKLS0tIC9kZXYvbnVsbAorKysgYi8uaWRlYS9lbmNvZGluZ3MueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJFbmNvZGluZyI+CisgICAgPGZpbGUgdXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJCIgY2hhcnNldD0iVVRGLTgiIC8+CisgICAgPGZpbGUgdXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLWNvcmUiIGNoYXJzZXQ9IlVURi04IiAvPgorICAgIDxmaWxlIHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMiIGNoYXJzZXQ9IlVURi04IiAvPgorICAgIDxmaWxlIHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yIiBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgICA8ZmlsZSB1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlIiBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgICA8ZmlsZSB1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYyIgY2hhcnNldD0iVVRGLTgiIC8+CisgICAgPGZpbGUgdXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwiIGNoYXJzZXQ9IlVURi04IiAvPgorICAgIDxmaWxlIHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmciIGNoYXJzZXQ9IlVURi04IiAvPgorICAgIDxmaWxlIHVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci10ZXN0aW5nIiBjaGFyc2V0PSJVVEYtOCIgLz4KKyAgPC9jb21wb25lbnQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvLmlkZWEvaW5zcGVjdGlvblByb2ZpbGVzL1Byb2plY3RfRGVmYXVsdC54bWwgYi8uaWRlYS9pbnNwZWN0aW9uUHJvZmlsZXMvUHJvamVjdF9EZWZhdWx0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDZhYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvLmlkZWEvaW5zcGVjdGlvblByb2ZpbGVzL1Byb2plY3RfRGVmYXVsdC54bWwKQEAgLTAsMCArMSwxMCBAQAorPGNvbXBvbmVudCBuYW1lPSJJbnNwZWN0aW9uUHJvamVjdFByb2ZpbGVNYW5hZ2VyIj4KKyAgPHByb2ZpbGUgdmVyc2lvbj0iMS4wIj4KKyAgICA8b3B0aW9uIG5hbWU9Im15TmFtZSIgdmFsdWU9IlByb2plY3QgRGVmYXVsdCIgLz4KKyAgICA8aW5zcGVjdGlvbl90b29sIGNsYXNzPSJTcGVsbENoZWNraW5nSW5zcGVjdGlvbiIgZW5hYmxlZD0iZmFsc2UiIGxldmVsPSJUWVBPIiBlbmFibGVkX2J5X2RlZmF1bHQ9ImZhbHNlIj4KKyAgICAgIDxvcHRpb24gbmFtZT0icHJvY2Vzc0NvZGUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJwcm9jZXNzTGl0ZXJhbHMiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJwcm9jZXNzQ29tbWVudHMiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDwvaW5zcGVjdGlvbl90b29sPgorICA8L3Byb2ZpbGU+Cis8L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8uaWRlYS9tYXJrZG93bi1kb2NsZXQueG1sIGIvLmlkZWEvbWFya2Rvd24tZG9jbGV0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2JkMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvLmlkZWEvbWFya2Rvd24tZG9jbGV0LnhtbApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJjaC5yYWZmYWVsLm1kZG9jbGV0LmludGVncmF0aW9ucy5pZGVhLk1hcmtkb3duRG9jbGV0SWRlYS5Qcm9qZWN0Q29uZmlndXJhdGlvbiI+CisgICAgPG9wdGlvbiBuYW1lPSJlbmFibGVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InJlbmRlcmluZ09wdGlvbnMiPgorICAgICAgPFJlbmRlcmluZ09wdGlvbnMgLz4KKyAgICA8L29wdGlvbj4KKyAgPC9jb21wb25lbnQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvLmlkZWEvbWlzYy54bWwgYi8uaWRlYS9taXNjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODAxMGZjCi0tLSAvZGV2L251bGwKKysrIGIvLmlkZWEvbWlzYy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjQiPgorICA8Y29tcG9uZW50IG5hbWU9IkVudHJ5UG9pbnRzTWFuYWdlciI+CisgICAgPGxpc3Qgc2l6ZT0iNCI+CisgICAgICA8aXRlbSBpbmRleD0iMCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciIGl0ZW12YWx1ZT0iY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5EZXJpdmVkUHJvcGVydHkiIC8+CisgICAgICA8aXRlbSBpbmRleD0iMSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciIGl0ZW12YWx1ZT0ib3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5HaXZlbiIgLz4KKyAgICAgIDxpdGVtIGluZGV4PSIyIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIgaXRlbXZhbHVlPSJvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLlRoZW4iIC8+CisgICAgICA8aXRlbSBpbmRleD0iMyIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciIGl0ZW12YWx1ZT0ib3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5XaGVuIiAvPgorICAgIDwvbGlzdD4KKyAgPC9jb21wb25lbnQ+CisgIDxjb21wb25lbnQgbmFtZT0iTWF2ZW5Qcm9qZWN0c01hbmFnZXIiPgorICAgIDxvcHRpb24gbmFtZT0ib3JpZ2luYWxGaWxlcyI+CisgICAgICA8bGlzdD4KKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJFBST0pFQ1RfRElSJC9wb20ueG1sIiAvPgorICAgICAgPC9saXN0PgorICAgIDwvb3B0aW9uPgorICA8L2NvbXBvbmVudD4KKyAgPGNvbXBvbmVudCBuYW1lPSJQcm9qZWN0Um9vdE1hbmFnZXIiIHZlcnNpb249IjIiIHByb2plY3QtamRrLW5hbWU9IjEuOCIgcHJvamVjdC1qZGstdHlwZT0iSmF2YVNESyIgLz4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8uaWRlYS9tb2R1bGVzLnhtbCBiLy5pZGVhL21vZHVsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDhlMTQKLS0tIC9kZXYvbnVsbAorKysgYi8uaWRlYS9tb2R1bGVzLnhtbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iUHJvamVjdE1vZHVsZU1hbmFnZXIiPgorICAgIDxtb2R1bGVzPgorICAgICAgPG1vZHVsZSBmaWxldXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLWNvcmUvamF2YXBhcnNlci1jb3JlLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1jb3JlL2phdmFwYXJzZXItY29yZS5pbWwiIC8+CisgICAgICA8bW9kdWxlIGZpbGV1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMuaW1sIiAvPgorICAgICAgPG1vZHVsZSBmaWxldXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3IvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci5pbWwiIC8+CisgICAgICA8bW9kdWxlIGZpbGV1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItcGFyZW50LmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1wYXJlbnQuaW1sIiAvPgorICAgICAgPG1vZHVsZSBmaWxldXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS5pbWwiIGZpbGVwYXRoPSIkUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlLmltbCIgLz4KKyAgICAgIDxtb2R1bGUgZmlsZXVybD0iZmlsZTovLyRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy5pbWwiIGZpbGVwYXRoPSIkUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMuaW1sIiAvPgorICAgICAgPG1vZHVsZSBmaWxldXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC5pbWwiIC8+CisgICAgICA8bW9kdWxlIGZpbGV1cmw9ImZpbGU6Ly8kUFJPSkVDVF9ESVIkL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmcvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmcuaW1sIiAvPgorICAgICAgPG1vZHVsZSBmaWxldXJsPSJmaWxlOi8vJFBST0pFQ1RfRElSJC9qYXZhcGFyc2VyLXRlc3RpbmcvamF2YXBhcnNlci10ZXN0aW5nLmltbCIgZmlsZXBhdGg9IiRQUk9KRUNUX0RJUiQvamF2YXBhcnNlci10ZXN0aW5nL2phdmFwYXJzZXItdGVzdGluZy5pbWwiIC8+CisgICAgPC9tb2R1bGVzPgorICA8L2NvbXBvbmVudD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8uaWRlYS92Y3MueG1sIGIvLmlkZWEvdmNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGEyNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvLmlkZWEvdmNzLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJWY3NEaXJlY3RvcnlNYXBwaW5ncyI+CisgICAgPG1hcHBpbmcgZGlyZWN0b3J5PSIkUFJPSkVDVF9ESVIkIiB2Y3M9IkdpdCIgLz4KKyAgPC9jb21wb25lbnQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDBkM2FlCi0tLSAvZGV2L251bGwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwxNiBAQAorc3VkbzogZmFsc2UKK2xhbmd1YWdlOiBqYXZhCitpbnN0YWxsOiBtdm4gaW5zdGFsbCAtRHNraXBUZXN0cz10cnVlCitzY3JpcHQ6IG12biB0ZXN0CitqZGs6CisgIC0gb3JhY2xlamRrOAorICAtIG9yYWNsZWpkazkKK25vdGlmaWNhdGlvbnM6CisgIHdlYmhvb2tzOgorICAgIHVybHM6CisgICAgICAtICJodHRwczovL3dlYmhvb2tzLmdpdHRlci5pbS9lL2VjMzEyNzk3NWQ4YTJiOGYxMWQwIgorICAgIG9uX3N1Y2Nlc3M6IGFsd2F5cyAgIyBvcHRpb25zOiBbYWx3YXlzfG5ldmVyfGNoYW5nZV0gZGVmYXVsdDogYWx3YXlzCisgICAgb25fZmFpbHVyZTogYWx3YXlzICAjIG9wdGlvbnM6IFthbHdheXN8bmV2ZXJ8Y2hhbmdlXSBkZWZhdWx0OiBhbHdheXMKK2FmdGVyX3N1Y2Nlc3M6CisgIC0gbXZuIHRlc3QgamFjb2NvOnJlcG9ydCBjb3ZlcmFsbHM6cmVwb3J0CisjIGh0dHA6Ly9saW50LnRyYXZpcy1jaS5vcmcvIHZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTE2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwzMCBAQAorIyMgR2V0dGluZyBzdGFydGVkCitIZXJlIGlzIHNvbWUgaW5mb3JtYXRpb24gdGhhdCdzIGdvb2QgdG8ga25vdyB3aGVuIGNvbnRyaWJ1dGluZyB0byBKYXZhUGFyc2VyOgorCistIFRoZXJlIGlzIHNvbWUgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gb24gdGhlIFt3aWtpXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL3dpa2kpLgorLSBXZSB3b3JrIG9uIEphdmFQYXJzZXIgYmVjYXVzZSB3ZSBsaWtlIHRvLCBub3QgYmVjYXVzZSBpdCBlYXJucyB1cyBtb25leS4gUGxlYXNlIHJlbWVtYmVyIHRoYXQgd2UgdHJ5IHRvIHJ1biBhIHByb2Zlc3Npb25hbCBwcm9qZWN0IGluIG91ciBzcGFyZSB0aW1lLCBvbiBhIGJ1ZGdldCBvZiB6ZXJvLgorLSBCZSBzdXJlIHRvIGNoZWNrIFt0aGUgY29kaW5nIGd1aWRlbGluZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvd2lraS9Db2RpbmctR3VpZGVsaW5lcykgd2hpY2ggYXJlIGVhc2lseSB1c2VkIGJ5IGluc3RhbGxpbmcgdGhlIGZvcm1hdHRpbmcgcnVsZXMgYXMgZGVzY3JpYmVkIHRoZXJlLgorLSBJZiB5b3UncmUgbmV3IGFuZCBsaWtlIHRvIGNhc3VhbGx5IGNvbnRyaWJ1dGUgc29tZXRoaW5nLCBjaGVjayBvdXQgdGhlIFtlYXN5IGlzc3Vlc10oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9sYWJlbHMvRWFzeSkuCistIElmIHlvdSdyZSBuZXcgYW5kIHdvdWxkIGxpa2UgdG8gYmVjb21lIGEgbWVtYmVyLCBzdGFydCB5b3VyIG93biBwcm9qZWN0IHRoYXQgdXNlcyBKYXZhUGFyc2VyLgorV2Ugbm90aWNlZCB3ZSBnZXQgdGhlIGJlc3QgZmVlZGJhY2sgZnJvbSB0aG9zZS4gCitIZXJlIGFyZSBbc29tZSBmdW4gcHJvamVjdCBpZGVhc10oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9sYWJlbHMvZnVuJTIwcHJvamVjdCUyMGlkZWEpLgorLSBJZiB5b3Ugc3RhcnQgd29ya2luZyBvbiBhbiBpc3N1ZSwgcGxlYXNlIHNheSBzbyB3aXRoIGEgY29tbWVudCBpbiB0aGUgaXNzdWUuCistIElmIHlvdSBrbm93IGhvdyB0byBmaXggYSBwcm9ibGVtLCBwbGVhc2UgZml4IGl0IGFuZCBvcGVuIGEgcHVsbCByZXF1ZXN0IGluc3RlYWQgb2Ygb3BlbmluZyBhbiBpc3N1ZS4KKworVGhhbmtzIGZvciBoZWxwaW5nIQorCisjIyBDb250cmlidXRpb24gV29ya2Zsb3cKKworT3VyIGRldmVsb3BtZW50IHdvcmtmbG93IGlzIGJhc2VkIG9uIFB1bGwgUmVxdWVzdC4gSWYgeW91IGFyZSBub3QgZmFtaWxpYXIgd2l0aCB0aGUgUHVsbCBSZXF1ZXN0cywgd2Ugc3VnZ2VzdCB5b3UgdG8gY2hlY2tvdXQgdGhlIFtHaXRodWIgRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvY3JlYXRpbmctYS1wdWxsLXJlcXVlc3QvKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworMS4gKipGb3JrKiogdGhlIEphdmFQYXJzZXIgcHJvamVjdC4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIGZvcmssIGVuc3VyZSB0byBmZXRjaCB0aGUgbGF0ZXN0IGNvbW1pdHMuCisyLiBJbiB5b3VyIGZvcmtlZCBwcm9qZWN0LCAqKmNyZWF0ZSBhIGJyYW5jaCoqIHJlbGF0ZWQgdG8gdGhlIGlzc3VlIHlvdSBhcmUgd29ya2luZyBvbi4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgeW91ciBwdWxsIHJlcXVlc3Qgd2lsbCBub3QgY29udGFpbiB1bnJlbGF0ZWQgd29yay4KKzMuIFdoZW4geW91ciB3b3JrIGluIHlvdXIgYnJhbmNoIGlzIGRvbmUsICoqcHVzaCB5b3VyIGJyYW5jaCB0byB5b3VyIGZvcmtlZCByZXBvc2l0b3J5KiouCis0LiBHbyBiYWNrIHRvIHRoZSBbamF2YXBhcnNlciBwcm9qZWN0IHNpdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIpIGFuZCBpdCBzaG91bGQgaGF2ZSBhIG1lc3NhZ2Ugb2ZmZXJpbmcgdG8gKipjcmVhdGUgYSBwdWxsIHJlcXVlc3QqKi4gSWYgaXQgZG9lc24ndCB5b3UgY2FuIFtjcmVhdGUgb25lIG1hbnVhbGx5XShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2NvbXBhcmUpLgorCisjIyMgUmVtZW1iZXI6CistIEEgcHVsbCByZXF1ZXN0IHNob3VsZCBpbmNsdWRlIHRlc3RzLiBZb3UgY2FuIGVpdGhlciB1c2UgQkREIChbbW9yZSBpbmZvcm1hdGlvbiBoZXJlXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL3dpa2kvVGVzdGluZykpIG9yIEpVbml0LgorLSBFdmVyeSBwdWxsIHJlcXVlc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNoZWNrZWQgYnkgYSBmZXcgdG9vbHMuIE1ha2Ugc3VyZSBBcHBWZXlvciBhbmQgVHJhdmlzIGFyZSBncmVlbi4KKy0gUHVsbCByZXF1ZXN0cyBvZnRlbiBzdGF5IG9wZW4gZm9yIGF0IGxlYXN0IGEgZmV3IGRheXMgdG8gZ2l2ZSBwZW9wbGUgYSBjaGFuY2UgdG8gcmV2aWV3IGl0LgorLSBBIHB1bGwgcmVxdWVzdCBpcyBtZXJnZWQgd2hlbiBhbGwgY29tbWVudHMgb24gaXQgaGF2ZSBiZWVuIHJlc29sdmVkLgorLSBJZiB5b3UgY3JlYXRlIGEgcHVsbCByZXF1ZXN0IGZvciBhbiBpc3N1ZSwgbWVudGlvbiB0aGUgaXNzdWUgaW4gdGhlIGZvcm1hdCAjMTIzIHRvIG1ha2UgZ2l0aHViIGxpbmsgaXQgYXV0b21hdGljYWxseS4KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmRkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCkBAIC0wLDAgKzEsNiBAQAorSmF2YVBhcnNlciBpcyBhdmFpbGFibGUgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCBMaWNlbnNlIG9yIHRoZSBBcGFjaGUgTGljZW5zZS4gWW91IGFzIHRoZSB1c2VyIGFyZSBlbnRpdGxlZCB0byBjaG9vc2UgdGhlIHRlcm1zIHVuZGVyIHdoaWNoIHRvIGFkb3B0IEphdmFQYXJzZXIuCisKK0ZvciBkZXRhaWxzIGFib3V0IHRoZSBMR1BMIExpY2Vuc2UgcGxlYXNlIHJlZmVyIHRvIExJQ0VOU0UuTEdQTC4gUGxlYXNlIG5vdGUKK3RoYXQgTEdQTCBpcyBqdXN0IGFuIGV4dGVuc2lvbiB0byBHUEwsIGxvY2F0ZWQgaW4gTElDRU5TRS5HUEwuCisKK0ZvciBkZXRhaWxzIGFib3V0IHRoZSBBcGFjaGUgTGljZW5zZSBwbGVhc2UgcmVmZXIgdG8gTElDRU5TRS5BUEFDSEUKZGlmZiAtLWdpdCBhL0xJQ0VOU0UuQVBBQ0hFIGIvTElDRU5TRS5BUEFDSEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UuQVBBQ0hFCkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvTElDRU5TRS5HUEwgYi9MSUNFTlNFLkdQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjFhMWIwCi0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRS5HUEwKQEAgLTAsMCArMSw2NzQgQEAKKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3DQorDQorIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4NCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzDQorIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLg0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQ0KKw0KKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3INCitzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuDQorDQorICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQNCit0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsDQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8NCitzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUNCitzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlDQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8NCithbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8NCit5b3VyIHByb2dyYW1zLCB0b28uDQorDQorICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90DQorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQ0KK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3INCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQ0KK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3DQorZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuDQorDQorICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UNCit0aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUNCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYNCit5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLg0KKw0KKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcg0KK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUNCitmcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQ0KK29yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5DQora25vdyB0aGVpciByaWdodHMuDQorDQorICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6DQorKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UNCitnaXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0Lg0KKw0KKyAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zDQordGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZA0KK2F1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMNCitjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8NCithdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLg0KKw0KKyAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bg0KK21vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcg0KK2NhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mDQorcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMNCitwYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bw0KK3VzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQ0KK2hhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQ0KK3Byb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlDQorc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zDQorb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuDQorDQorICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLg0KK1N0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZg0KK3NvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvDQorYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkDQorbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQNCitwYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4NCisNCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kDQorbW9kaWZpY2F0aW9uIGZvbGxvdy4NCisNCisgICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TDQorDQorICAwLiBEZWZpbml0aW9ucy4NCisNCisgICJUaGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLg0KKw0KKyAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YNCit3b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLg0KKw0KKyAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzDQorTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kDQorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLg0KKw0KKyAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaw0KK2luIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbg0KK2V4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQ0KK2VhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLg0KKw0KKyAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQNCitvbiB0aGUgUHJvZ3JhbS4NCisNCisgIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQNCitwZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yDQoraW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhDQorY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywNCitkaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQ0KK3B1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4NCisNCisgIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXINCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gNCithIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLg0KKw0KKyAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiDQordG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQ0KK2ZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQ0KK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlDQorZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQ0KK3dvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmDQordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGENCittZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLg0KKw0KKyAgMS4gU291cmNlIENvZGUuDQorDQorICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaw0KK2ZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UNCitmb3JtIG9mIGEgd29yay4NCisNCisgIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsDQorc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZg0KK2ludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0DQoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuDQorDQorICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcg0KK3RoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mDQorcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcg0KK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdA0KK01ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbg0KK2ltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBDQorIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50DQorKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQ0KKyhpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvDQorcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuDQorDQorICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsDQordGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQ0KK3dvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8NCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MNCitTeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlDQorcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0DQord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlDQoraW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3INCit0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkNCitsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwNCitzdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQ0KK3N1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4NCisNCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMNCitjYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcNCitTb3VyY2UuDQorDQorICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQNCitzYW1lIHdvcmsuDQorDQorICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4NCisNCisgIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mDQorY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQNCitjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkDQorcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGENCitjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMNCitjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cg0KK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3Lg0KKw0KKyAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdA0KK2NvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zDQoraW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQ0KK29mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQ0KK3dpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgNCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbw0KK25vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MNCitmb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uDQorYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mDQoreW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4NCisNCisgIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyDQordGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwDQorbWFrZXMgaXQgdW5uZWNlc3NhcnkuDQorDQorICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3Lg0KKw0KKyAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsDQorbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlDQorMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yDQorc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaA0KK21lYXN1cmVzLg0KKw0KKyAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZA0KK2NpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbg0KK2lzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8NCit0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yDQorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MNCit1c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YNCit0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLg0KKw0KKyAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4NCisNCisgIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQ0KK3JlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kDQorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOw0KK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQ0KK25vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsNCitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbA0KK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLg0KKw0KKyAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LA0KK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuDQorDQorICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLg0KKw0KKyAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bw0KK3Byb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlDQordGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6DQorDQorICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZA0KKyAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuDQorDQorICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzDQorICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbg0KKyAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvDQorICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuDQorDQorICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzDQorICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcw0KKyAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNw0KKyAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLA0KKyAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubw0KKyAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90DQorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuDQorDQorICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5DQorICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQ0KKyAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cg0KKyAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4NCisNCisgIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQNCit3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLA0KK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sDQoraW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbg0KKyJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdA0KK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMNCitiZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsNCitpbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcg0KK3BhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuDQorDQorICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4NCisNCisgIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zDQorb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlDQorbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLA0KK2luIG9uZSBvZiB0aGVzZSB3YXlzOg0KKw0KKyAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0DQorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlDQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0NCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuDQorDQorICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QNCisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhDQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzDQorICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdA0KKyAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhDQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQ0KKyAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbA0KKyAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vDQorICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcw0KKyAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlDQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuDQorDQorICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlDQorICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzDQorICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kDQorICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZA0KKyAgICB3aXRoIHN1YnNlY3Rpb24gNmIuDQorDQorICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkDQorICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQ0KKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubw0KKyAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUNCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8NCisgICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlDQorICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQ0KKyAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4NCisgICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUNCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQ0KKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMNCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4NCisNCisgICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZA0KKyAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZw0KKyAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vDQorICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLg0KKw0KKyAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkDQorZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUNCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuDQorDQorICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQ0KK3RhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksDQorb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbg0KK2ludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwNCitkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXINCitwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGENCit0eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMNCitvZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcg0KK2FjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdA0KK2lzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsDQorY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQNCit0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4NCisNCisgICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywNCitwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwNCithbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tDQorYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0DQorc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QNCitjb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQ0KK21vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLg0KKw0KKyAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3INCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcw0KK3BhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQ0KK1VzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGENCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQ0KK0NvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkDQorYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5DQoraWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwNCittb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzDQorYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4NCisNCisgIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGENCityZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMNCitmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcg0KK3RoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGENCituZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZA0KK2FkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZA0KK3Byb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuDQorDQorICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwNCitpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5DQorZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4NCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3INCit1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4NCisNCisgIDcuIEFkZGl0aW9uYWwgVGVybXMuDQorDQorICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcw0KK0xpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4NCitBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsDQorYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudA0KK3RoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zDQorYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQ0KK3VuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkNCit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuDQorDQorICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uDQorcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mDQoraXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bg0KK3JlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQ0KK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywNCitmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uDQorDQorICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UNCithZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mDQordGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6DQorDQorICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQ0KKyAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcg0KKw0KKyAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3INCisgICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbA0KKyAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcg0KKw0KKyAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yDQorICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluDQorICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3INCisNCisgICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcg0KKyAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3INCisNCisgICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQ0KKyAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3INCisNCisgICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdA0KKyAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZg0KKyAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yDQorICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24NCisgICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLg0KKw0KKyAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXINCityZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91DQorcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMNCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXINCityZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zDQorYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzDQorTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zDQorb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMNCitub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4NCisNCisgIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UNCittdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUNCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcNCit3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLg0KKw0KKyAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUNCitmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOw0KK3RoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4NCisNCisgIDguIFRlcm1pbmF0aW9uLg0KKw0KKyAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5DQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcg0KK21vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcg0KK3RoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQNCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuDQorDQorICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cg0KK2xpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQ0KK3Byb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQNCitmaW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0DQoraG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMNCitwcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uDQorDQorICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMNCityZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUNCit2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlDQorcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0DQorY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcg0KK3lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLg0KKw0KKyAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUNCitsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXINCit0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5DQorcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQ0KK21hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuDQorDQorICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4NCisNCisgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcg0KK3J1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsNCitvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbg0KK3RvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsDQorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yDQorbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8NCitub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGENCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLg0KKw0KKyAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLg0KKw0KKyAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQ0KK3JlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZA0KK3Byb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUNCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4NCisNCisgIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4NCitvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuDQorb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQNCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdA0KK3RyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcg0KK2xpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZA0KK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlDQorQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmDQordGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLg0KKw0KKyAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlDQorcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkNCitub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YNCityaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uDQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQNCithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3INCitzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuDQorDQorICAxMS4gUGF0ZW50cy4NCisNCisgIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMNCitMaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQ0KK3dvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLg0KKw0KKyAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zDQorb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcg0KK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZA0KK2J5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwNCitidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQ0KK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yDQorcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50DQorcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mDQordGhpcyBMaWNlbnNlLg0KKw0KKyAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUNCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8NCittYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQNCitwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLg0KKw0KKyAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MNCithZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQNCisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvDQorc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGENCitwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQ0KK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4NCisNCisgIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsDQorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUNCit0byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhDQorcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywNCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvDQorYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQ0KK3BhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyDQorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudA0KK2xpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQ0KK2FjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQ0KK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsNCitpbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQNCitjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLg0KKw0KKyAgSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcg0KK2FycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGENCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMNCityZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkNCitvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlDQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQNCit3b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4NCisNCisgIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbg0KK3RoZSBzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzDQorY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlDQorc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZA0KK3dvcmsgaWYgeW91IGFyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzDQoraW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudA0KK3RvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nDQordGhlIHdvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlDQorcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5DQorcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yaw0KK2NvbnZleWVkIGJ5IHlvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5DQorZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQNCitjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsDQorb3IgdGhhdCBwYXRlbnQgbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4NCisNCisgIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcNCithbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQ0KK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4NCisNCisgIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLg0KKw0KKyAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcg0KK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QNCitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQ0KK2NvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcw0KK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5DQorbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91DQordG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5DQordGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzDQorTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLg0KKw0KKyAgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuDQorDQorICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlDQorcGVybWlzc2lvbiB0byBsaW5rIG9yIGNvbWJpbmUgYW55IGNvdmVyZWQgd29yayB3aXRoIGEgd29yayBsaWNlbnNlZA0KK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUNCitjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzDQorTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssDQorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLA0KK3NlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUNCitjb21iaW5hdGlvbiBhcyBzdWNoLg0KKw0KKyAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLg0KKw0KKyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YNCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsDQorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvDQorYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuDQorDQorICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZQ0KK1Byb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsDQorUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUNCitvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZA0KK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlDQorRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUNCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQNCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KKw0KKyAgSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZQ0KK3ZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzDQorcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQ0KK3RvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLg0KKw0KKyAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQNCitwZXJtaXNzaW9ucy4gIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55DQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQ0KK2xhdGVyIHZlcnNpb24uDQorDQorICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4NCisNCisgIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkNCitBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUDQorSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQ0KK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLA0KK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQ0KK0lTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRg0KK0FMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4NCisNCisgIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4NCisNCisgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORw0KK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SIENPTlZFWVMNCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkNCitHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUNCitVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GDQorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQNCitQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwNCitFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQorU1VDSCBEQU1BR0VTLg0KKw0KKyAgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4NCisNCisgIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZA0KK2Fib3ZlIGNhbm5vdCBiZSBnaXZlbiBsb2NhbCBsZWdhbCBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZWlyIHRlcm1zLA0KK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcw0KK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUNCitQcm9ncmFtLCB1bmxlc3MgYSB3YXJyYW50eSBvciBhc3N1bXB0aW9uIG9mIGxpYWJpbGl0eSBhY2NvbXBhbmllcyBhDQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLg0KKw0KKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KKw0KKyAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcw0KKw0KKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdA0KK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQNCitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4NCisNCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0DQordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQ0KK3N0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QNCit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4NCisNCisgICAgSmF2YSAxLjUgamFwYS5wYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlDQorICAgIENvcHlyaWdodCAoQykgMjAwNyAgSu+/vWxpbyBWaWxtYXIgR2Vzc2VyDQorDQorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorDQorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+Lg0KKw0KK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLg0KKw0KKyAgSWYgdGhlIHByb2dyYW0gZG9lcyB0ZXJtaW5hbCBpbnRlcmFjdGlvbiwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydA0KK25vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToNCisNCisgICAgSmF2YSAxLjUgamFwYS5wYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlICBDb3B5cmlnaHQgKEMpIDIwMDcgIErvv71saW8gVmlsbWFyIEdlc3Nlcg0KKyAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLg0KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0DQorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4NCisNCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUNCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgeW91ciBwcm9ncmFtJ3MgY29tbWFuZHMNCittaWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuDQorDQorICBZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3Igc2Nob29sLA0KK2lmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuDQorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUNCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uDQorDQorICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtDQoraW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91DQorbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoDQordGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsDQorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuICBCdXQgZmlyc3QsIHBsZWFzZSByZWFkDQorPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4NCmRpZmYgLS1naXQgYS9MSUNFTlNFLkxHUEwgYi9MSUNFTlNFLkxHUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3MzAzYwotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UuTEdQTApAQCAtMCwwICsxLDE2NSBAQAorCQkgICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3DQorDQorIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4NCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzDQorIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLg0KKw0KKw0KKyAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5jb3Jwb3JhdGVzDQordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljDQorTGljZW5zZSwgc3VwcGxlbWVudGVkIGJ5IHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGxpc3RlZCBiZWxvdy4NCisNCisgIDAuIEFkZGl0aW9uYWwgRGVmaW5pdGlvbnMuIA0KKw0KKyAgQXMgdXNlZCBoZXJlaW4sICJ0aGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBMZXNzZXINCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlICJHTlUgR1BMIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUNCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLg0KKw0KKyAgIlRoZSBMaWJyYXJ5IiByZWZlcnMgdG8gYSBjb3ZlcmVkIHdvcmsgZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlLA0KK290aGVyIHRoYW4gYW4gQXBwbGljYXRpb24gb3IgYSBDb21iaW5lZCBXb3JrIGFzIGRlZmluZWQgYmVsb3cuDQorDQorICBBbiAiQXBwbGljYXRpb24iIGlzIGFueSB3b3JrIHRoYXQgbWFrZXMgdXNlIG9mIGFuIGludGVyZmFjZSBwcm92aWRlZA0KK2J5IHRoZSBMaWJyYXJ5LCBidXQgd2hpY2ggaXMgbm90IG90aGVyd2lzZSBiYXNlZCBvbiB0aGUgTGlicmFyeS4NCitEZWZpbmluZyBhIHN1YmNsYXNzIG9mIGEgY2xhc3MgZGVmaW5lZCBieSB0aGUgTGlicmFyeSBpcyBkZWVtZWQgYSBtb2RlDQorb2YgdXNpbmcgYW4gaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBMaWJyYXJ5Lg0KKw0KKyAgQSAiQ29tYmluZWQgV29yayIgaXMgYSB3b3JrIHByb2R1Y2VkIGJ5IGNvbWJpbmluZyBvciBsaW5raW5nIGFuDQorQXBwbGljYXRpb24gd2l0aCB0aGUgTGlicmFyeS4gIFRoZSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIExpYnJhcnkNCit3aXRoIHdoaWNoIHRoZSBDb21iaW5lZCBXb3JrIHdhcyBtYWRlIGlzIGFsc28gY2FsbGVkIHRoZSAiTGlua2VkDQorVmVyc2lvbiIuDQorDQorICBUaGUgIk1pbmltYWwgQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIENvbWJpbmVkIFdvcmsgbWVhbnMgdGhlDQorQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIHRoZSBDb21iaW5lZCBXb3JrLCBleGNsdWRpbmcgYW55IHNvdXJjZSBjb2RlDQorZm9yIHBvcnRpb25zIG9mIHRoZSBDb21iaW5lZCBXb3JrIHRoYXQsIGNvbnNpZGVyZWQgaW4gaXNvbGF0aW9uLCBhcmUNCitiYXNlZCBvbiB0aGUgQXBwbGljYXRpb24sIGFuZCBub3Qgb24gdGhlIExpbmtlZCBWZXJzaW9uLg0KKw0KKyAgVGhlICJDb3JyZXNwb25kaW5nIEFwcGxpY2F0aW9uIENvZGUiIGZvciBhIENvbWJpbmVkIFdvcmsgbWVhbnMgdGhlDQorb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlIGZvciB0aGUgQXBwbGljYXRpb24sIGluY2x1ZGluZyBhbnkgZGF0YQ0KK2FuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IgcmVwcm9kdWNpbmcgdGhlIENvbWJpbmVkIFdvcmsgZnJvbSB0aGUNCitBcHBsaWNhdGlvbiwgYnV0IGV4Y2x1ZGluZyB0aGUgU3lzdGVtIExpYnJhcmllcyBvZiB0aGUgQ29tYmluZWQgV29yay4NCisNCisgIDEuIEV4Y2VwdGlvbiB0byBTZWN0aW9uIDMgb2YgdGhlIEdOVSBHUEwuDQorDQorICBZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayB1bmRlciBzZWN0aW9ucyAzIGFuZCA0IG9mIHRoaXMgTGljZW5zZQ0KK3dpdGhvdXQgYmVpbmcgYm91bmQgYnkgc2VjdGlvbiAzIG9mIHRoZSBHTlUgR1BMLg0KKw0KKyAgMi4gQ29udmV5aW5nIE1vZGlmaWVkIFZlcnNpb25zLg0KKw0KKyAgSWYgeW91IG1vZGlmeSBhIGNvcHkgb2YgdGhlIExpYnJhcnksIGFuZCwgaW4geW91ciBtb2RpZmljYXRpb25zLCBhDQorZmFjaWxpdHkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBBcHBsaWNhdGlvbg0KK3RoYXQgdXNlcyB0aGUgZmFjaWxpdHkgKG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlDQorZmFjaWxpdHkgaXMgaW52b2tlZCksIHRoZW4geW91IG1heSBjb252ZXkgYSBjb3B5IG9mIHRoZSBtb2RpZmllZA0KK3ZlcnNpb246DQorDQorICAgYSkgdW5kZXIgdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IHlvdSBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8NCisgICBlbnN1cmUgdGhhdCwgaW4gdGhlIGV2ZW50IGFuIEFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSB0aGUNCisgICBmdW5jdGlvbiBvciBkYXRhLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3Jtcw0KKyAgIHdoYXRldmVyIHBhcnQgb2YgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLCBvcg0KKw0KKyAgIGIpIHVuZGVyIHRoZSBHTlUgR1BMLCB3aXRoIG5vbmUgb2YgdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb2YNCisgICB0aGlzIExpY2Vuc2UgYXBwbGljYWJsZSB0byB0aGF0IGNvcHkuDQorDQorICAzLiBPYmplY3QgQ29kZSBJbmNvcnBvcmF0aW5nIE1hdGVyaWFsIGZyb20gTGlicmFyeSBIZWFkZXIgRmlsZXMuDQorDQorICBUaGUgb2JqZWN0IGNvZGUgZm9ybSBvZiBhbiBBcHBsaWNhdGlvbiBtYXkgaW5jb3Jwb3JhdGUgbWF0ZXJpYWwgZnJvbQ0KK2EgaGVhZGVyIGZpbGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LiAgWW91IG1heSBjb252ZXkgc3VjaCBvYmplY3QNCitjb2RlIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0LCBpZiB0aGUgaW5jb3Jwb3JhdGVkDQorbWF0ZXJpYWwgaXMgbm90IGxpbWl0ZWQgdG8gbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEgc3RydWN0dXJlDQorbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBvciBzbWFsbCBtYWNyb3MsIGlubGluZSBmdW5jdGlvbnMgYW5kIHRlbXBsYXRlcw0KKyh0ZW4gb3IgZmV3ZXIgbGluZXMgaW4gbGVuZ3RoKSwgeW91IGRvIGJvdGggb2YgdGhlIGZvbGxvd2luZzoNCisNCisgICBhKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIG9iamVjdCBjb2RlIHRoYXQgdGhlDQorICAgTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZQ0KKyAgIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLg0KKw0KKyAgIGIpIEFjY29tcGFueSB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlIEdOVSBHUEwgYW5kIHRoaXMgbGljZW5zZQ0KKyAgIGRvY3VtZW50Lg0KKw0KKyAgNC4gQ29tYmluZWQgV29ya3MuDQorDQorICBZb3UgbWF5IGNvbnZleSBhIENvbWJpbmVkIFdvcmsgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UgdGhhdCwNCit0YWtlbiB0b2dldGhlciwgZWZmZWN0aXZlbHkgZG8gbm90IHJlc3RyaWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUNCitwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSBjb250YWluZWQgaW4gdGhlIENvbWJpbmVkIFdvcmsgYW5kIHJldmVyc2UNCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucywgaWYgeW91IGFsc28gZG8gZWFjaCBvZg0KK3RoZSBmb2xsb3dpbmc6DQorDQorICAgYSkgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBDb21iaW5lZCBXb3JrIHRoYXQNCisgICB0aGUgTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZQ0KKyAgIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLg0KKw0KKyAgIGIpIEFjY29tcGFueSB0aGUgQ29tYmluZWQgV29yayB3aXRoIGEgY29weSBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlDQorICAgZG9jdW1lbnQuDQorDQorICAgYykgRm9yIGEgQ29tYmluZWQgV29yayB0aGF0IGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzIGR1cmluZw0KKyAgIGV4ZWN1dGlvbiwgaW5jbHVkZSB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcNCisgICB0aGVzZSBub3RpY2VzLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIGRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUNCisgICBjb3BpZXMgb2YgdGhlIEdOVSBHUEwgYW5kIHRoaXMgbGljZW5zZSBkb2N1bWVudC4NCisNCisgICBkKSBEbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoNCisNCisgICAgICAgMCkgQ29udmV5IHRoZSBNaW5pbWFsIENvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzDQorICAgICAgIExpY2Vuc2UsIGFuZCB0aGUgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbiBDb2RlIGluIGEgZm9ybQ0KKyAgICAgICBzdWl0YWJsZSBmb3IsIGFuZCB1bmRlciB0ZXJtcyB0aGF0IHBlcm1pdCwgdGhlIHVzZXIgdG8NCisgICAgICAgcmVjb21iaW5lIG9yIHJlbGluayB0aGUgQXBwbGljYXRpb24gd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YNCisgICAgICAgdGhlIExpbmtlZCBWZXJzaW9uIHRvIHByb2R1Y2UgYSBtb2RpZmllZCBDb21iaW5lZCBXb3JrLCBpbiB0aGUNCisgICAgICAgbWFubmVyIHNwZWNpZmllZCBieSBzZWN0aW9uIDYgb2YgdGhlIEdOVSBHUEwgZm9yIGNvbnZleWluZw0KKyAgICAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4NCisNCisgICAgICAgMSkgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlDQorICAgICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoYSkgdXNlcyBhdCBydW4gdGltZQ0KKyAgICAgICBhIGNvcHkgb2YgdGhlIExpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXINCisgICAgICAgc3lzdGVtLCBhbmQgKGIpIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbg0KKyAgICAgICBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIExpbmtlZA0KKyAgICAgICBWZXJzaW9uLiANCisNCisgICBlKSBQcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiwgYnV0IG9ubHkgaWYgeW91IHdvdWxkIG90aGVyd2lzZQ0KKyAgIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbiB1bmRlciBzZWN0aW9uIDYgb2YgdGhlDQorICAgR05VIEdQTCwgYW5kIG9ubHkgdG8gdGhlIGV4dGVudCB0aGF0IHN1Y2ggaW5mb3JtYXRpb24gaXMNCisgICBuZWNlc3NhcnkgdG8gaW5zdGFsbCBhbmQgZXhlY3V0ZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlDQorICAgQ29tYmluZWQgV29yayBwcm9kdWNlZCBieSByZWNvbWJpbmluZyBvciByZWxpbmtpbmcgdGhlDQorICAgQXBwbGljYXRpb24gd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpbmtlZCBWZXJzaW9uLiAoSWYNCisgICB5b3UgdXNlIG9wdGlvbiA0ZDAsIHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gbXVzdCBhY2NvbXBhbnkNCisgICB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbmQgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbg0KKyAgIENvZGUuIElmIHlvdSB1c2Ugb3B0aW9uIDRkMSwgeW91IG11c3QgcHJvdmlkZSB0aGUgSW5zdGFsbGF0aW9uDQorICAgSW5mb3JtYXRpb24gaW4gdGhlIG1hbm5lciBzcGVjaWZpZWQgYnkgc2VjdGlvbiA2IG9mIHRoZSBHTlUgR1BMDQorICAgZm9yIGNvbnZleWluZyBDb3JyZXNwb25kaW5nIFNvdXJjZS4pDQorDQorICA1LiBDb21iaW5lZCBMaWJyYXJpZXMuDQorDQorICBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlDQorTGlicmFyeSBzaWRlIGJ5IHNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkNCitmYWNpbGl0aWVzIHRoYXQgYXJlIG5vdCBBcHBsaWNhdGlvbnMgYW5kIGFyZSBub3QgY292ZXJlZCBieSB0aGlzDQorTGljZW5zZSwgYW5kIGNvbnZleSBzdWNoIGEgY29tYmluZWQgbGlicmFyeSB1bmRlciB0ZXJtcyBvZiB5b3VyDQorY2hvaWNlLCBpZiB5b3UgZG8gYm90aCBvZiB0aGUgZm9sbG93aW5nOg0KKw0KKyAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrIGJhc2VkDQorICAgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzLA0KKyAgIGNvbnZleWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQorDQorICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgdGhhdCBwYXJ0IG9mIGl0DQorICAgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZyB3aGVyZSB0byBmaW5kIHRoZQ0KKyAgIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4NCisNCisgIDYuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4NCisNCisgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zDQorb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcNCit2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkNCitkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLg0KKw0KKyAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZQ0KK0xpYnJhcnkgYXMgeW91IHJlY2VpdmVkIGl0IHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uDQorb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iDQorYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZA0KK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgcHVibGlzaGVkIHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24NCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIExpYnJhcnkgYXMgeW91DQorcmVjZWl2ZWQgaXQgZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBHTlUgTGVzc2VyDQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gb2YgdGhlIEdOVSBMZXNzZXINCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQorDQorICBJZiB0aGUgTGlicmFyeSBhcyB5b3UgcmVjZWl2ZWQgaXQgc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlDQord2hldGhlciBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBzaGFsbA0KK2FwcGx5LCB0aGF0IHByb3h5J3MgcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGFueSB2ZXJzaW9uIGlzDQorcGVybWFuZW50IGF1dGhvcml6YXRpb24gZm9yIHlvdSB0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUNCitMaWJyYXJ5Lg0KZGlmZiAtLWdpdCBhL2FwcHZleW9yLnltbCBiL2FwcHZleW9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgxYmZjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsMjMgQEAKK3ZlcnNpb246ICd7YnVpbGR9Jworb3M6IFdpbmRvd3MgU2VydmVyIDIwMTIKK2luc3RhbGw6CisgIC0gcHM6IHwKKyAgICAgIEFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0KKyAgICAgIGlmICghKFRlc3QtUGF0aCAtUGF0aCAiQzpcbWF2ZW4iICkpIHsKKyAgICAgICAgKG5ldy1vYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgKKyAgICAgICAgICAnaHR0cDovL3d3dy51cy5hcGFjaGUub3JnL2Rpc3QvbWF2ZW4vbWF2ZW4tMy8zLjIuNS9iaW5hcmllcy9hcGFjaGUtbWF2ZW4tMy4yLjUtYmluLnppcCcsCisgICAgICAgICAgJ0M6XG1hdmVuLWJpbi56aXAnCisgICAgICAgICkKKyAgICAgICAgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBGaWxlXTo6RXh0cmFjdFRvRGlyZWN0b3J5KCJDOlxtYXZlbi1iaW4uemlwIiwgIkM6XG1hdmVuIikKKyAgICAgIH0KKyAgLSBjbWQ6IFNFVCBQQVRIPUM6XG1hdmVuXGFwYWNoZS1tYXZlbi0zLjIuNVxiaW47JUpBVkFfSE9NRSVcYmluOyVQQVRIJQorICAtIGNtZDogU0VUIE1BVkVOX09QVFM9LVhYOk1heFBlcm1TaXplPTJnIC1YbXg0ZworICAtIGNtZDogU0VUIEpBVkFfT1BUUz0tWFg6TWF4UGVybVNpemU9MmcgLVhteDRnCisgIC0gY21kOiBTRVQgTTJfSE9NRT1DOlxtYXZlblxhcGFjaGUtbWF2ZW4tMy4yLjUKK2J1aWxkX3NjcmlwdDoKKyAgLSBtdm4gY2xlYW4gcGFja2FnZSAtLWJhdGNoLW1vZGUgLURza2lwVGVzdAordGVzdF9zY3JpcHQ6CisgIC0gbXZuIGNsZWFuIGluc3RhbGwgLS1iYXRjaC1tb2RlCitjYWNoZToKKyAgLSBDOlxtYXZlblwKKyAgLSBDOlxVc2Vyc1xhcHB2ZXlvclwubTIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jaGFuZ2Vsb2cubWQgYi9jaGFuZ2Vsb2cubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyZjE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NoYW5nZWxvZy5tZApAQCAtMCwwICsxLDY3NyBAQAorVmVyc2lvbiAzLjUuMTUKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNzg/Y2xvc2VkPTEpCisqIEphdmEgMTAgc3VwcG9ydCBpcyBjb21wbGV0ZS4KKyogQlJFQUtJTkc6IEphdmEgbGFuZ3VhZ2UgbGV2ZWwgc3VwcG9ydCBoYXMgY2hhbmdlZCB0byBtYWtlIEphdmEgMTAgc3VwcG9ydCBwb3NzaWJsZS4KK1tIZXJlJ3MgYSBsaXR0bGUgYXJ0aWNsZSBhYm91dCBpdF0oaHR0cHM6Ly9tYXRvem9pZC5naXRodWIuaW8vMjAxNy8wNC8xMS9lbmFibGUtamF2YS05LXN1cHBvcnQuaHRtbCkKKworVmVyc2lvbiAzLjUuMTQKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNzc/Y2xvc2VkPTEpCisqIEphdmEgMTAncyBgdmFyYCBjYW4gbm93IGJlIHBhcnNlZCBhbmQgd2lsbCBiZSB0dXJuZWQgaW50byBhIGBWYXJUeXBlYCBub2RlLgorSXQgY2FuIG5vdCBiZSByZXNvbHZlZCB5ZXQuCisqIGBOb2RlTGlzdGAgbm93IGhhcyBhIHByZXR0eSBjb21wbGV0ZSBzZXQgb2YgYC4uLkZpcnN0YCBhbmQgYC4uLkxhc3RgIG1ldGhvZHMuCitUaGFua3Mgc3RlcGhlbnJhbXRodW4gIQorCitWZXJzaW9uIDMuNS4xMworLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS83Nj9jbG9zZWQ9MSkKKyogVGhlIEphdmFkb2MgcGFyc2VyIGhhcyByZWNlaXZlZCBhIGxvdCBvZiBhdHRlbnRpb24uCisKK1ZlcnNpb24gMy41LjEyCistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzc1P2Nsb3NlZD0xKQorKiBUaGFua3MgdG8gdW4wYnRhbml1bSBmb3IgZml4aW5nIHRoZSByZWFkbWUgZmlsZSEKKworVmVyc2lvbiAzLjUuMTEKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNzQ/Y2xvc2VkPTEpCisqIEJSRUFLSU5HOiBgQXNzaWduRXhwci5PcGVyYXRvci5BTkRgIGlzIG5vdyBgQXNzaWduRXhwci5PcGVyYXRvci5CSU5BUllfQU5EYC4KKyogQlJFQUtJTkc6IGBBc3NpZ25FeHByLk9wZXJhdG9yLk9SYCBpcyBub3cgYEFzc2lnbkV4cHIuT3BlcmF0b3IuQklOQVJZX09SYC4KKyogYGdldFByaW1hcnlUeXBlTmFtZWAgYW5kIGBnZXRQcmltYXJ5VHlwZWAgZ2l2ZSBhY2Nlc3MgdG8gdGhlIHR5cGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmlsZSBpdCBjYW1lIGZyb20uCisqIEVudW1zIHdpbGwgbm93IGdldCB0aGVpciBjb25zdGFudHMgYWxpZ25lZCB2ZXJ0aWNhbGx5IGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gZml2ZS4KKyogWW91IGNhbiBub3cgY29udmVydCBiZXR3ZWVuIGBBc3NpZ25FeHByLk9wZXJhdG9yYCBhbmQgYEFzc2lnbkV4cHIuT3BlcmF0b3JgIGlmIHlvdSBsaWtlLgorCitWZXJzaW9uIDMuNS4xMAorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS83Mz9jbG9zZWQ9MSkKKyogSmF2YVN5bWJvbFNvbHZlciBpcyBub3cgaW4gdGhlIHNhbWUgcHJvamVjdCBhcyBKYXZhUGFyc2VyLCBtZWFuaW5nIHRoZXkgZ2V0IHJlbGVhc2VkIHRvZ2V0aGVyIGZyb20gbm93IG9uLgorKiBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIgaGFzIGhhZCBhIGJpZyBzcGVlZCBvcHRpbWl6YXRpb24uCisKK1ZlcnNpb24gMy41LjkKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNzI/Y2xvc2VkPTEpCisqIEJSRUFLSU5HOiB0aGUgdmVyeSBjb25mdXNpbmcgY29uc3RydWN0b3IgYE5vZGVMaXN0KE5vZGUpYCAod2hpY2ggc2V0cyB0aGUgcGFyZW50KSB3YXMgcmVtb3ZlZC4KKyogVG8gYXZvaWQgdXNpbmcgdGhlIGludCB0eXBlIGZvciB0b2tlbiBraW5kcywgdXNlIHRoZSBuZXcgYEphdmFUb2tlbi5LaW5kYCBlbnVtLgorSXQgY2FuIGNvbnZlcnQgdG8gYW5kIGZyb20gdGhlIGludCBraW5kLiAKKworVmVyc2lvbiAzLjUuOAorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS83MT9jbG9zZWQ9MSkKKyogdGhlIG1vZHVsZSBuYW1lIGlzIG5vdyBzZXQgdG8gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmNvcmUKKworVmVyc2lvbiAzLjUuNworLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS83MD9jbG9zZWQ9MSkKKworVmVyc2lvbiAzLjUuNgorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS82OT9jbG9zZWQ9MSkKKyogYHRvU29tZVR5cGUoKWAgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgZm9yIG1hbnkgdHlwZXMgdGhhdCBnaXZlIG1vcmUgZnVuY3Rpb25hbCBhY2Nlc3MgdG8gYSBzdWJ0eXBlLgorKiBCRVRBOiB0aGUgYmVsb3cgd29yayBvbiBKYXZhIFN5bWJvbCBTb2x2ZXIgaXMgc3RpbGwgb25nb2luZy4KKworVmVyc2lvbiAzLjUuNQorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS82OD9jbG9zZWQ9MSkKKyogU291cmNlUm9vdCBpcyBub3cgc2lsZW50IGJ5IGRlZmF1bHQgLSBsb29rIGF0IHRoZSBMb2cgY2xhc3MgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoYXQuIAorKiBCRVRBOiB0aGUgYmVsb3cgd29yayBvbiBKYXZhIFN5bWJvbCBTb2x2ZXIgaXMgc3RpbGwgb25nb2luZy4KKworVmVyc2lvbiAzLjUuNAorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS82Nz9jbG9zZWQ9MSkKKyogQkVUQTogdGhlIGJlbG93IHdvcmsgb24gSmF2YSBTeW1ib2wgU29sdmVyIGlzIHN0aWxsIG9uZ29pbmcuCisKK1ZlcnNpb24gMy41LjMKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNjY/Y2xvc2VkPTEpCisqIFVuaWNvZGUgZXNjYXBlcyAoYFx1MTIzNGApIGFyZSBub3cgcmV0YWluZWQgaW4gdGhlIEFTVCwKKyAgICBidXQgdGhleSBhcmUgbm93IG9ubHkgYWxsb3dlZCBpbiBjb21tZW50cywgc3RyaW5nIGFuZCBjaGFyYWN0ZXIgbGl0ZXJhbHMsIGFuZCBpZGVudGlmaWVycy4gCisqIEJFVEE6IHRoZSBiZWxvdyB3b3JrIG9uIEphdmEgU3ltYm9sIFNvbHZlciBpcyBzdGlsbCBvbmdvaW5nLgorCitWZXJzaW9uIDMuNS4yCistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzY1P2Nsb3NlZD0xKQorKiBUaGUgcHJldHR5IHByaW50ZXIgbm93IGNsZWFucyB1cCBKYXZhZG9jIGNvbW1lbnRzLgorKiBCRVRBOiB0aGUgYmVsb3cgd29yayBvbiBKYXZhIFN5bWJvbCBTb2x2ZXIgaXMgc3RpbGwgb25nb2luZy4KKworVmVyc2lvbiAzLjUuMQorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS82ND9jbG9zZWQ9MSkKKyogQkVUQTogdGhlIGJlbG93IHdvcmsgb24gSmF2YSBTeW1ib2wgU29sdmVyIGlzIHN0aWxsIG9uZ29pbmcuCisKK1ZlcnNpb24gMy41LjAKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNjM/Y2xvc2VkPTEpCisqIEEgZnVuY3Rpb25hbCB2aXNpdG9yIEFQSSBoYXMgYmVlbiBhZGRlZC4gU2VlIFtQUiAxMTk1XShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL3B1bGwvMTE5NSkgZm9yIG5vdy4KKyogQnVpbGQgaXMgd29ya2luZyBhZ2FpbiBvbiBXaW5kb3dzIHRoYW5rcyB0byBMZW9uYXJkbyBIZXJyZXJhLgorKiBUaGUgcHJldHR5IHByaW50ZXIgbm93IGhhcyBhbiBvcHRpb24gdG8gb3JkZXIgaW1wb3J0cywgYWxzbyB0aGFua3MgdG8gTGVvbmFyZG8gSGVycmVyYS4KKyogUmVjZWl2ZXIgcGFyYW1ldGVycyBhcmUgbm93IHdlbGwtc3VwcG9ydGVkIGluc3RlYWQgb2YgYmVpbmcgYSBoYWNrLiBTZWUgW2lzc3VlIDExOTRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvcHVsbC8xMTk0KSBmb3IgYSBkZXNjcmlwdGlvbi4KKyogQkVUQTogdGhlIGJlbG93IHdvcmsgb24gSmF2YSBTeW1ib2wgU29sdmVyIGlzIHN0aWxsIG9uZ29pbmcuCisKK1ZlcnNpb24gMy40LjQKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNjI/Y2xvc2VkPTEpCisqIEJFVEE6IHRoZSBiZWxvdyB3b3JrIG9uIEphdmEgU3ltYm9sIFNvbHZlciBpcyBzdGlsbCBvbmdvaW5nLgorCitWZXJzaW9uIDMuNC4zCistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzYxP2Nsb3NlZD0xKQorKiBCRVRBOiB3ZSdyZSBzdGlsbCBkb2luZyB3b3JrIHRvIGludGVncmF0ZSBwYXJ0cyBvZiBbSmF2YSBTeW1ib2wgU29sdmVyXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyKSB0byBzaW1wbGlmeSBpdHMgQVBJLgorKiBgVmlzaXRvck1hcGAgaXMgam9pbmVkIGJ5IGBWaXNpdG9yU2V0YCBhbmQgYFZpc2l0b3JMaXN0YCwgCitmb3Igd2hlbiB5b3Ugd2FudCB0byBzdG9yZSBgTm9kZWBzIGluIGNvbGxlY3Rpb24gYnV0IGRvbid0IHdhbnQgaXRzIGRlZmF1bHQgZXF1YWxzL2hhc2NvZGUgYmVoYXZpb3VyCisKK1ZlcnNpb24gMy40LjIKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNjA/Y2xvc2VkPTEpCisqIEJFVEE6IHdlJ3JlIGRvaW5nIHdvcmsgdG8gaW50ZWdyYXRlIHBhcnRzIG9mIFtKYXZhIFN5bWJvbCBTb2x2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIpIHRvIHNpbXBsaWZ5IGl0cyBBUEkuCisqIEpESyA5IHdpbGwgY29tcGlsZSBKYXZhUGFyc2VyIG5vdy4KKyogW0FuIG9mZmljaWFsIHNhbXBsZSBNYXZlbiBzZXR1cF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci1tYXZlbi1zYW1wbGUpIHdhcyBhZGRlZC4KKworVmVyc2lvbiAzLjQuMQorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS81OT9jbG9zZWQ9MSkKKyogVHdvIHZpc2l0b3JzIHdlcmUgYWRkZWQ6IGBOb0NvbW1lbnRFcXVhbHNWaXNpdG9yYCBhbmQgYE5vQ29tbWVudEhhc2hDb2RlVmlzaXRvcmAgLSAKK2FzIHRoZSBuYW1lIGltcGxpZXMgeW91IGNhbiB1c2UgdGhlc2UgdG8gY29tcGFyZSBub2RlcyB3aXRob3V0IGNvbnNpZGVyaW5nIGNvbW1lbnRzLgorVGhhbmtzIFJ5YW4gQmVja2V0dCEKKyogYGlzU29tZVR5cGUoKWAgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgZm9yIG1hbnkgdHlwZXMgdGhhdCBoZWxwIGF2b2lkIGBpbnN0YW5jZW9mYC4KKyogYGFzU29tZVR5cGUoKWAgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgZm9yIG1hbnkgdHlwZXMgdGhhdCBoZWxwIGF2b2lkIGNhc3RpbmcgdG8gdGhhdCB0eXBlLgorKiBgaWZTb21lVHlwZSgpYCBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCBmb3IgbWFueSB0eXBlcywgZ2l2aW5nIGEgbmljZSBmdW5jdGlvbmFsIHdheSBvZiBkb2luZyBpZi1pcy10eXBlLXRoZW4tY2FzdC10by10eXBlLXRoZW4tdXNlLgorKiBUaGUgYExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcmAgaGFkIGl0cyBBUEkgY2hhbmdlZCBhIGxpdHRsZTogc2V0dXAgYW5kIHByaW50aW5nIGFyZSBub3cgc2VwYXJhdGUgdGhpbmdzLAorc28geW91IGRvbid0IGhhdmUgdG8gZHJhZyBhbiBpbnN0YW5jZSBvZiBgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyYCB0aHJvdWdoIHlvdXIgY29kZSBhbnltb3JlLiAgCisqIGB0cmF2ZXJzZVNjb3BlYCB3YXMgYWRkZWQgdG8gYWxsIG5vZGVzIHdpdGggYSBzY29wZSwgc28geW91IGNhbiB0cmF2ZWwgdGhyb3VnaCB0aGUgc2NvcGUgd2l0aG91dCB0cmlwcGluZyBvdmVyIChub24tKW9wdGlvbmFsaXR5LgorCisKK1ZlcnNpb24gMy40LjAKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNTg/Y2xvc2VkPTEpCisqIEJSRUFLSU5HOiBXZSBtaXNzZWQgYSBKYXZhIDkgZmVhdHVyZSB3aGljaCBpcyBub3cgb24gYm9hcmQ6IHRyeSB3aXRoIHJlc291cmNlcyBjYW4gbm93IHJlZmVyIHRvIGEgcmVzb3VyY2UgZGVjbGFyZWQgb3V0c2lkZSBvZiB0aGUgc3RhdGVtZW50LgorVGhpcyBtZWFucyB0aGF0IHRoZSBub2RlIHR5cGUgeW91IGdldCBmb3IgdGhvc2UgcmVzb3VyY2VzIGlzIG5vdyBgRXhwcmVzc2lvbmAgaW5zdGVhZCBvZiBgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJgLgorRm9yIEphdmEgOCBhbmQgYmVsb3cgeW91IGNhbiBzaW1wbHkgY2FzdCBpdCB0byBgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJgIGFnYWluLgorU2VlIGFsc28gdGhlIEphdmFkb2MgZm9yIGBUcnlTdG10YC4KKyogWW91IGNhbiBub3cgaW5zcGVjdCB0aGUgQVNUIGJ5IGV4cG9ydGluZyBpdCB0byBYTUwsIEpTT04sIFlBTUwsIG9yIGEgR3JhcGh2aXoncyBkb3QgZGlhZ3JhbSwgdGhhbmtzIHRvIFJ5YW4gQmVja2V0dCEKKyogYEdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzYCBhbmQgYFZvaWRWaXNpdG9yV2l0aERlZmF1bHRzYCB3ZXJlIGFkZGVkIHdoaWNoIGZ1bmN0aW9uIGxpa2UgZW1wdHkgdmlzaXRvcnMsIAorYnV0IGFsbCB0aGUgdmlzaXQgbWV0aG9kcyBjYWxsIGEgZGVmYXVsdCBtZXRob2QgYnkgZGVmYXVsdC4KKyogQW5ub3RhdGlvbiBzdXBwb3J0IHdhcyBjbGVhbmVkIHVwLCBhZGRpbmcgc29tZSBvYnNjdXJlIGxvY2F0aW9ucyB3aGVyZSB5b3UgY2FuIGhhdmUgYW5ub3RhdGlvbnMuCisqIGBFbnVtRGVjbGFyYXRpb25gIHJlZ2FpbmVkIGl0cyBjb25zdHJ1Y3RvciBidWlsZGVyIG1ldGhvZHMuIFRoZXkgd2VyZSBhY2NpZGVudGFsbHkgbG9zdCBhcm91bmQgMy4yLjIuCisqIGBBcnJheVR5cGVgIG5vdyBoYXMgYW4gYG9yaWdpbmAgZmllbGQgd2hpY2ggaW5kaWNhdGVzIGluIHdoaWNoIHBvc2l0aW9uIHRoZSBhcnJheSBicmFja2V0cyB3ZXJlIGZvdW5kLgorCitWZXJzaW9uIDMuMy41CistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzU3P2Nsb3NlZD0xKQorCitWZXJzaW9uIDMuMy40CistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzU2P2Nsb3NlZD0xKQorKiBgU291cmNlWmlwYCBoYXMgYmVlbiBhZGRlZC4KK1VzZSBpdCB0byByZWFkIHNvdXJjZSBjb2RlIGZyb20gamFycyBvciB6aXAgZmlsZXMuCitUaGFuayB5b3UgQHJ5YW4tYmVja2V0dCAhCisqIEphdmFDQyB3YXMgdXBncmFkZWQgdG8gNy4wLjIKKyogQSBuZXcgb3B0aW9uIGZvciB0aGUgcHJldHR5IHByaW50ZXIgd2FzIGFkZGVkLgorWW91IGNhbiBub3cgd3JhcC1hbmQtY29sdW1uLWFsaWduIHBhcmFtZXRlcnMgb2YgbWV0aG9kIGNhbGxzLgorVGhhbmsgeW91IEB0YXJpbGFicyAhCisKK1ZlcnNpb24gMy4zLjMKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNTU/Y2xvc2VkPTEpCisqIFBhcnNpbmcgYSBwYXJ0aWFsIGphdmEgZmlsZSAobGlrZSBhbiBleHByZXNzaW9uIG9yIHN0YXRlbWVudCkgbm8gbG9uZ2VyIGlnbm9yZXMgdHJhaWxpbmcgY29kZS4KKyogTmV3IG1lbW9yeSBzYXZpbmcgb3B0aW9uOiB0dXJuIG9mZiB0b2tlbiBsaXN0LgorCitWZXJzaW9uIDMuMy4yCistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzU0P2Nsb3NlZD0xKQorKiBgVmlzaXRvck1hcGAgbGV0cyB5b3Ugb3ZlcnJpZGUgaGFzaGNvZGUvZXF1YWxzIGZvciBub2RlcyB3aGVuIHVzZWQgYXMgYSBrZXkgZm9yIGEgbWFwLgorCitWZXJzaW9uIDMuMy4xCistLS0tLS0tLS0tLS0tLS0tLS0KK1tpc3N1ZXMgcmVzb2x2ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvbWlsZXN0b25lLzUzP2Nsb3NlZD0xKQorKiBUaGUgdG9rZW4gbGlzdCBpcyBub3cgbXV0YWJsZSAtIHNlZSBtZXRob2RzIG9uIGBKYXZhVG9rZW5gLgorVGhpcyBjYXVzZWQgbWlsZCBicmVha2FnZSAtIHNvbWUgZmllbGRzIGhhdmUgYmVjb21lIGBPcHRpb25hbGAuCisKK1ZlcnNpb24gMy4zLjAKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNTI/Y2xvc2VkPTEpCisqIEJyZWFraW5nOiBgVHJ5U3RtdDo6dHJ5QmxvY2tgIGFuZCBgRW5jbG9zZWRFeHByOjppbm5lcmAgd2VyZSBvcHRpb25hbCBmb3Igbm8gZ29vZCByZWFzb24uIE5vdyB0aGV5IGFyZSByZXF1aXJlZC4KKyogWW91IGNhbiBub3cgYXNrIGEgYEphdmFUb2tlbmAgZm9yIGl0cyBjYXRlZ29yeSwgd2hpY2ggaXMgdXNlZnVsIGZvciBleGFtaW5pbmcgdGhlIHRva2VuIGxpc3Qgb3IgZG9pbmcgc3ludGF4IGhpZ2hsaWdodGluZyBvciBzby4KKyogYGVudW1gIGFuZCBgc3RyaWN0ZnBgIGNhbiBub3cgYmUgdXNlZCBhcyBpZGVudGlmaWVycyBvbiBsb3dlciBKYXZhIHZlcnNpb25zLgorCitWZXJzaW9uIDMuMi4xMgorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS81MT9jbG9zZWQ9MSkKKworVmVyc2lvbiAzLjIuMTEKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNTA/Y2xvc2VkPTEpCisqIFdlJ3JlIHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IEphdmEgOSBtb2R1bGUgc3lzdGVtIGFnYWluLgorCitWZXJzaW9uIDMuMi4xMAorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS80OT9jbG9zZWQ9MSkKKyogYE5vZGUucmVwbGFjZShvbGQsIG5ldylgIHdhcyBhZGRlZCwgaW5jbHVkaW5nIHByb3BlcnR5LXNwZWNpZmljIGBYLnJlcGxhY2VZKG5ld1kpYCBtZXRob2RzCisKK1ZlcnNpb24gMy4yLjkKKy0tLS0tLS0tLS0tLS0tLS0tLQorU2NyYXBwZWQgZHVlIHRvIHJlbGVhc2UgcHJvYmxlbS4KKworVmVyc2lvbiAzLjIuOAorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS80OD9jbG9zZWQ9MSkKKyogQWRkZWQgYGlzSW5uZXJDbGFzcygpYCB0aGF0IGNoZWNrcyBpZiBhIGBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25gIGlzIGFuIGlubmVyIGNsYXNzIChub3RlOiB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgbmVzdGVkIGNsYXNzISkKKyogQHJ5YW4tYmVja2V0dCBjb250cmlidXRlZCBhIGh1Z2UgW0VjbGlwc2Ugc2V0dXAgZ3VpZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvd2lraS9FY2xpcHNlLVByb2plY3QtU2V0dXAtR3VpZGUpCisKK1ZlcnNpb24gMy4yLjcKKy0tLS0tLS0tLS0tLS0tLS0tLQorW2lzc3VlcyByZXNvbHZlZF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9taWxlc3RvbmUvNDc/Y2xvc2VkPTEpCisqIFdlIG5vdyByZWNvdmVyIGZyb20gc29tZSBwYXJzZSBlcnJvcnMhIFtIZXJlIGlzIGFuIGFydGljbGVdKGh0dHBzOi8vbWF0b3pvaWQuZ2l0aHViLmlvLzIwMTcvMDYvMTEvcGFyc2UtZXJyb3ItcmVjb3ZlcnkuaHRtbCkKKworVmVyc2lvbiAzLjIuNgorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS80Nj9jbG9zZWQ9MSkKKyogYEVtcHR5TWVtYmVyRGVjbGFyYXRpb25gIGlzIGdvbmUhIAorSXQgd2FzIGRlcHJlY2F0ZWQgZm9yIGEgd2hpbGUgYmVjYXVzZSBpdCBpdCB3YXMgaW4gdGhlIEFTVCwgYnV0IGRvZXNuJ3QgaGF2ZSBhbnkgbWVhbmluZyBpbiBhIEphdmEgcHJvZ3JhbS4gCitgRW1wdHlTdG10YCB3YXMgYWxzbyBkZXByZWNhdGVkLCBidXQgdGhhdCBoYXMgYmVlbiByZXZlcnRlZC4gCitUaGlzIG5vZGUgKmRvZXMqIGhhdmUgbWVhbmluZy4KKworVmVyc2lvbiAzLjIuNQorLS0tLS0tLS0tLS0tLS0tLS0tCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS80NT9jbG9zZWQ9MSkKKyogYE5vZGVXaXRoQ29uZGl0aW9uYCB3YXMgYWRkZWQgb24gYWxsIG5vZGVzIGNvbnRhaW5pbmcgYSBjb25kaXRpb24uCisqIExvdHMgb2Ygd29yayBvbiBpbXByb3ZpbmcgbGV4aWNhbCBwcmVzZXJ2YXRpb24uCisqIElmIGEgZmlsZSB3YXMgcGFyc2VkIGZyb20gYSBmaWxlIHN5c3RlbSwgeW91IGNhbiBub3cgZ2V0IHBhdGggaW5mb3JtYXRpb24gZXRjLiBmcm9tIGBDb21waWxhdGlvblVuaXRgCisqIEFQSSBCUkVBS0lORzogZXZlcnkgbm9kZSBub3cgcG9pbnRzIHRvIGl0cyBzdGFydCBhbmQgZW5kIHRva2VuLgorU29tZSBvZiB0aGUgQVBJIGhhcyBzdGFydGVkIHJldHVybmluZyBgVG9rZW5SYW5nZWAgaW5zdGVhZCBvZiBgUmFuZ2VgIC0geW91IGNhbiBjYWxsIGB0b1JhbmdlYCB0byBnZXQgdGhlIG9sZCBvYmplY3QgdHlwZS4KK1dlIG1heSBzdGlsbCBjaGFuZ2UgdGhlIG5hbWluZyBvZiBzb21lIG9mIHRoaXMgY29kZSBpbiB0aGUgZm9sbG93aW5nIG1vbnRoLgorCitWZXJzaW9uIDMuMi40CistLS0tLS0tLS0tLS0tLS0tLS0KK05ldyBzdHlsZSBjaGFuZ2Vsb2csIG5vIG1vcmUgaXNzdWUgbnVtYmVycywgYnV0IGEgbGluazogCitbaXNzdWVzIHJlc29sdmVkXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL21pbGVzdG9uZS80ND9jbG9zZWQ9MSkKK2FuZCBhbnkgbm90YWJsZSBjaGFuZ2VzOgorKiB0aGUgbmV3IG1ldGhvZCBgTm9kZS5yZW1vdmVGb3JjZWQoKWAgYnkgcmVtb3ZpbmcgaXQsIG9yIHJlbW92aW5nIHRoZSBmaXJzdCBwYXJlbnQgdGhhdCBpcyBvcHRpb25hbC4KK1RoaXMgaXMgZGlmZmVyZW50IGZyb20gYE5vZGUucmVtb3ZlKClgLCBgcmVtb3ZlKClgIG9ubHkgdHJpZXMgdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIHBhcmVudCBhbmQgZmFpbHMgaWYgaXQgY2FuJ3QuCisqIGBGaWVsZEFjY2Vzc0V4cHIuc2NvcGVgIGlzIG5vdyBhIHJlcXVpcmVkIHByb3BlcnR5LgorWW91IG1pZ2h0IGZpbmQgc29tZSBgZ2V0KClgcyBpbiB5b3VyIGNvZGUgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKyogYFJlZmVyZW5jZVR5cGVgIG5vIGxvbmdlciBoYXMgYSB0eXBlIHBhcmFtZXRlciwgc28gZXZlcnkgYFJlZmVyZW5jZVR5cGU8Pz5gIGNhbiBiZSByZXBsYWNlZCBieSBgUmVmZXJlbmNlVHlwZWAgbm93LgorCitWZXJzaW9uIDMuMi4zCistLS0tLS0tLS0tLS0tLS0tLS0KKyogOTA3IDkwNiA5MDUgOTAzIDkxMSA5MTAgOTA5IDkwOCBzbWFsbGVyIGltcHJvdmVtZW50cyBhbmQgZml4ZXMKKworVmVyc2lvbiAzLjIuMgorLS0tLS0tLS0tLS0tLS0tLS0tCitCZXRhOiBgVHJlZVN0cnVjdHVyZVZpc2l0b3JgLgorCisqIDc3MCA5MDIgOTA0IDkwMSBzbWFsbGVyIGltcHJvdmVtZW50cyBhbmQgZml4ZXMKKworVmVyc2lvbiAzLjIuMQorLS0tLS0tLS0tLS0tLS0tLS0tCitCZXRhOiBgVHJlZVN0cnVjdHVyZVZpc2l0b3JgLgorCisqIE1hdmVuIGRlcGVuZGVuY2llcyB3ZXJlIHVwZGF0ZWQgdG8gdGhlaXIgbGF0ZXN0IHZlcnNpb25zIAorKiA4OTAgdGhlIGNvbmNlcHQgb2YgIm1ldGhvZCBzaWduYXR1cmUiIG5vdyBleGlzdHMgaW4gSmF2YVBhcnNlcgorKiA4OTYgODkxIDg4OSA4ODcgODgyIDc4OSBzbWFsbGVyIGltcHJvdmVtZW50cyBhbmQgZml4ZXMKKworVmVyc2lvbiAzLjIuMAorLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbGV4aWNhbCBwcmVzZXJ2YXRpb24gY29kZSBpcyBzdGFibGUhCisKK0JldGE6IGBUcmVlU3RydWN0dXJlVmlzaXRvcmAuCisKKyogODg1IDg4NCA4NzkgODc4IHNtYWxsZXIgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcworCitWZXJzaW9uIDMuMS40CistLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gdG8gcGFyc2UgSmF2YSA5LgorCitCZXRhOiBgVHJlZVN0cnVjdHVyZVZpc2l0b3JgLCBhbmQgYExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcmAuCisKKyogODcyIDg3MyA4NzQgNzg3IFJlbWFpbmluZyBKYXZhIDkgd29yay4KKworVmVyc2lvbiAzLjEuMworLS0tLS0tLS0tLS0tLS0tLS0tCitCZXRhOiBgVHJlZVN0cnVjdHVyZVZpc2l0b3JgLCBhbmQgYExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcmAuCisKK0Egc3RhcnQgaGFzIGJlZW4gbWFkZSBvbiBzb3VyY2UgbGV2ZWwgc3VwcG9ydC4gVGhlIGRlZmF1bHQgbGV2ZWwgaXMgSmF2YSA4LgorSXQgY2FuIGJlIHNldCB0byBKYXZhIDkgbGlrZSB0aGlzIGZvciBhIHBhcnNlciAqaW5zdGFuY2UqOgorYGBgamF2YQorcHJpdmF0ZSBmaW5hbCBKYXZhUGFyc2VyIHBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0VmFsaWRhdG9yKG5ldyBKYXZhOVZhbGlkYXRvcigpKSk7CitgYGAKK2FuZCBsaWtlIHRoaXMgZm9yIHRoZSBzdGF0aWMgcGFyc2UgbWV0aG9kczoKK2BgYGphdmEKK0phdmFQYXJzZXIuZ2V0U3RhdGljQ29uZmlndXJhdGlvbigpLnNldFZhbGlkYXRvcihuZXcgSmF2YTlWYWxpZGF0b3IoKSk7CitgYGAKKworKiA4NjIgNTUyICJfIiBpcyBhbiBpbGxlZ2FsIGlkZW50aWZpZXIgb24gc291cmNlIGxldmVsIDkuCisqIDg2OSA4NjcgMTA5IDg1NSA4NTcgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4xLjIKKy0tLS0tLS0tLS0tLS0tLS0tLQorQmV0YTogYFRyZWVTdHJ1Y3R1cmVWaXNpdG9yYCwgYENvbmNyZXRlU3ludGF4TW9kZWxgLCBhbmQgYExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcmAuCisKKyogNTk0IDg0OSA4MzEgYSB2YWxpZGF0aW9uIGZyYW1ld29yayB3YXMgaW50cm9kdWNlZCB0byBpbmZvcm0gYWJvdXQgcHJvYmxlbXMgaW4gdGhlIEFTVCB3aXRob3V0IG5lZWRpbmcgdG8gY2hhbmdlIHRoZSBncmFtbWFyLAorYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHBhcnNpbmcgY29kZS4KK0l0IGlzIG9wZW4gZm9yIGV4dGVuc2lvbiBieSB1c2Vycy4KKyogODUyIDg1MyA4MjYgODMyIDg0NiA4Mzkgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4xLjEKKy0tLS0tLS0tLS0tLS0tLS0tLQorQmV0YTogYFRyZWVTdHJ1Y3R1cmVWaXNpdG9yYCwgYENvbmNyZXRlU3ludGF4TW9kZWxgLCBhbmQgYExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcmAuCisKKyogNjU0IDEyNCBsZXhpY2FsIHByZXNlcnZhdGlvbiAocHJpbnRpbmcgc291cmNlIGNvZGUgd2l0aCB0aGUgc2FtZSBmb3JtYXR0aW5nIGl0IGhhZCB3aGVuIHBhcnNpbmcpIGhhcyBiZWVuIGFkZGVkLgorICAgIFRoYW5rIHlvdSBAZnRvbWFzc2V0dGkgZm9yIGEgbG90IG9mIHdvcmshIAorKiA1NTQgODAwIGZpcnN0IChiaWcpIHN0ZXAgdG93YXJkcyBKYXZhIDkgc3VwcG9ydDogSmF2YVBhcnNlciBjYW4gcmVhZCBwcm9qZWN0IEppZ3NhdyBtb2R1bGUgZGVmaW5pdGlvbnMuCisqIDc5NSA3ODYgNzUxIGV4dGVuZCB0aGUgVHJlZVZpc2l0b3Igd2l0aCBtb3JlIHRyYXZlcnNhbCBvcHRpb25zLiBUaGFua3MgQHJ5YW4tYmVja2V0dCEKKyogNzkxIGBHZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyYCBoYXMgYmVlbiBhZGRlZCB3aGljaCBjb2xsZWN0cyBpdHMgcmVzdWx0cyBpbiBhIGxpc3QuIFRoYW5rcyBAR290dG94IQorKiA4MTUgNzk4IDc5NyA4MTMgY2xlYW4gdXAgUHJvYmxlbSB0ZXh0CisqIDgxOSA4MTggODE3IDgxNiA0NDEgODA5IDgwOCA4MDcgZml4IHZhcmlvdXMgYWJzdXJkIGFubm90YXRpb24gcmVsYXRlZCBpc3N1ZXMuIAorKiA3NzcgODA1IDgwMiA3OTYgNzkwIDc5MiA3OTMgNzgxIDc4NCA3ODUgNzgzIDc4MiA3NzkgMzU3IDc5OSA3NjMgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4xLjAKKy0tLS0tLS0tLS0tLS0tLS0tLQorQmV0YTogYFRyZWVTdHJ1Y3R1cmVWaXNpdG9yYCBhbmQgYENvbmNyZXRlU3ludGF4TW9kZWxgLgorCisqIDcwNSA3NTUgQWRkIHRoZSBjb25jcmV0ZSBzeW50YXggbW9kZWwsIHdoaWNoIHdpbGwgZ2l2ZSB5b3UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4YWN0IHN5bnRheCBhIGNlcnRhaW4gbm9kZXMgbWF0Y2hlcy4KKworKiA3Nzcgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4xLjAtYmV0YS4yCistLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgdmVyc2lvbiBpcyBhIGJldGEgYmVjYXVzZSBgVHJlZVN0cnVjdHVyZVZpc2l0b3JgIGlzIG5vdCBpbiBpdHMgZGVmaW5pdGUgc3RhdGUgeWV0LgorCisqIDc2MiA3NjEgNzcyIG1lcmdlIGBqYXZhcGFyc2VyLW1ldGFtb2RlbGAgYW5kIGBqYXZhcGFyc2VyLWdlbmVyYXRvci11dGlsc2AgaW50byBgamF2YXBhcnNlci1jb3JlYC4KKyogNzY2IHRoZSBgTW9kaWZpZXJWaXNpdG9yYCBpcyBub3cgY3JlYXRlZCBieSBhIGNvZGUgZ2VuZXJhdG9yLiBJdHMgYmVoYXZpb3VyIGhhcyBiZWVuIG1hZGUgbG9naWNhbCwgYW5kIG1heSBnaXZlIGRpZmZlcmVudCByZXN1bHRzIHRoYW4gYmVmb3JlLgorKiA3NTUgYENvbnN0cnVjdG9yRGVjbGFyYXRpb25gIGFuZCBgTWV0aG9kRGVjbGFyYXRpb25gIG5vdyBzaGFyZSBhIHBhcmVudDogYENhbGxhYmxlRGVjbGFyYXRpb25gCisqIDY4NyA3NTkgNzczIDc2OSA3NjggNzY3IDc2NSA3NTkgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4xLjAtYmV0YS4xCistLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgdmVyc2lvbiBpcyBhIGJldGEgYmVjYXVzZSB0aGVyZSBhcmUgYSBsb3Qgb2YgbmV3IGZlYXR1cmVzIHRoYXQgbWF5IHN0aWxsIGNoYW5nZS4KKworVGhpcyB2ZXJzaW9uIG5lZWRzIGEgbWlub3IgdmVyc2lvbiBpbmNyZWFzZSBiZWNhdXNlIG9mIGEgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgaXNzdWU6IAorKiA3MTkgYGdldEphdmFkb2NgLCBgZ2V0SmF2YWRvY0NvbW1lbnRgIGFuZCBgZ2V0Q29tbWVudGAgY291bGQgcmV0dXJuIG51bGwuIE91ciBwcm9taXNlIHdhcyB0byByZXR1cm4gYE9wdGlvbmFsYCwgc28gdGhhdCBpcyB3aGF0IHRoZXkgZG8gbm93LgorCitOZXc6CisqIDY1OCA3MTggNzM2IDczNyB3ZSBoYXZlIGNyZWF0ZWQgYSBtZXRhbW9kZWwuCitJdCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RydWN0dXJlIG9mIHRoZSB2YXJpb3VzIEFTVCBub2RlcywgYXMgaWYgeW91IGFyZSBpbnRyb3NwZWN0aW5nIHRoZW0uCitZb3UgY2FuIGZpbmQgaXQgaW4gYGphdmFwYXJzZXItbWV0YW1vZGVsYCwgdGhlIG1haW4gY2xhc3MgaXMgYEphdmFQYXJzZXJNZXRhTW9kZWxgCisqIDM1MyAzNjUgdmlzaXRvcnMgYXJlIG5vIGxvbmdlciBoYW5kIG1hZGUsIHRoZXkgYXJlIG5vdyBnZW5lcmF0ZWQgZnJvbSB0aGUgbWV0YW1vZGVsLiBUaGlzIHNob3VsZCBtYWtlIHRoZW0gMTAwJSByZWxpYWJsZS4KK0FmZmVjdGVkIHZpc2l0b3JzIGFyZTogYEdlbmVyaWNWaXNpdG9yQWRhcHRlcmAsIGBFcXVhbHNWaXNpdG9yYCwgYFZvaWRWaXNpdG9yQWRhcHRlcmAsIGBWb2lkVmlzaXRvcmAsIGBHZW5lcmljVmlzaXRvcmAsIGBIYXNoQ29kZVZpc2l0b3JgLCBgQ2xvbmVWaXNpdG9yYC4KKworSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgeW91ciBvd24gdmlzaXRvcnMsIHlvdSBjYW4gdXNlIHRoZSBgVmlzaXRvckdlbmVyYXRvcmAgY2xhc3MgZnJvbSBgamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnNgCisKK0lmIHlvdSB3YW50IHRvIHJldXNlIHRoZSBjb2RlIGdlbmVyYXRpb24gdXRpbGl0aWVzLCBsb29rIGF0IG1vZHVsZSBgamF2YXBhcnNlci1nZW5lcmF0b3ItdXRpbHNgIC0gdGhlcmUgaXMgYSB2ZXJ5IHVzZWZ1bCBgU291cmNlUm9vdGAgY2xhc3MgaW4gdGhlcmUgdGhhdCB0YWtlcyBhd2F5IGEgbG90IG9mIGZpbGUgbWFuYWdlbWVudCB0cm91Ymxlcy4KKyogNTM4IDczNSBgVHJlZVN0cnVjdHVyZVZpc2l0b3JgIGhhcyBiZWVuIGFkZGVkLCB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBiZXRhLgorKiAyMjAgNzMzIDcxNyA3NDkgNzQ1IDc1MCA3NDMgNzQ4IDY2NiA3MzIgNzQ2IDczNCA3MzMgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4wLjEKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA2OTkgNDMzIDMyNSBKYXZhZG9jIGNhbiBub3cgYmUgcGFyc2VkCisqIDcwMyA2OTYgYWRkZWQgTm9kZVdpdGhPcHRpb25hbFNjb3BlCisqIDcwMiBGaWVsZEFjY2Vzc0V4cHIgbm93IGltcGxlbWVudHMgTm9kZVdpdGhTaW1wbGVOYW1lLCAqd2hpY2ggbWVhbnMgdGhhdCAiZmllbGQiIGhhcyBiZWVuIHJlbmFtZWQgdG8gIm5hbWUiKgorKiA3MDcgNzA2IGltcHJvdmUgcmFuZ2Ugb2YgYXJyYXkgdHlwZXMgYW5kIGxldmVscworKiA3MDkgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4wLjAKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA2OTUgNjk3IDY4OSA2ODAgNjkzIDY5MSA2ODIgNjkwIDY3NyA2NzkgNjg4IDY4NCA2ODMgc21hbGxlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzCisKK1ZlcnNpb24gMy4wLjAtUkMuNAorLS0tLS0tLS0tLS0tLS0tLS0tCisqIDY2OCA2NjkgVHlwZURlY2xhcmF0aW9uU3RtdCBiZWNhbWUgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdAorKiAzNDcgNjY1IGV2ZXJ5IG5vZGUgbm93IGhhcyBzb21lIGRvY3VtZW50YXRpb24KKyogNjYwIDY3MCA2NzMgZm91ciB0eXBlcyBvZiBpbXBvcnQgZGVjbGFyYXRpb24gaGF2ZSBiZWVuIG1lcmdlZCBiYWNrIGludG8gdGhlIG9sZCBJbXBvcnREZWNsYXJhdGlvbgorKiA2NTkgVGhlIHByZXR0eSBwcmludGVyIGNhbiBub3cgdGFrZSBjdXN0b21pemVkIHZpc2l0b3JzIAorKiA2NTAgNjcxIDY3MiA2NzQgNTI0IHNtYWxsZXIgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcworCitWZXJzaW9uIDMuMC4wLVJDLjMKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA2MzkgNjIyIDYzMiA2NTcgNjU2IDY1MiA2NTMgNjQ3IDY0OCA2NDUgMTk0IDY0MyA2MzAgNjI0IDYyOCA2MjcgNjI2IDYyNSA2MjMgY2xlYW51cHMsIHNtYWxsIGZpeGVzLCBhbmQgZ2VuZXJhbCBob3VzZWtlZXBpbmcKKworVmVyc2lvbiAzLjAuMC1SQy4yCistLS0tLS0tLS0tLS0tLS0tLS0KKyogNTkzIEVtcHR5SW1wb3J0RGVjbGFyYXRpb24gYW5kIE5vbkVtcHR5SW1wb3J0RGVjbGFyYXRpb24gaGF2ZSBiZWVuIHJlbW92ZWQKKyogNjEyIFZhcmlhYmxlRGVjbGFyYXRvcklkIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGhhcyBiZWVuIHN1YnN0aXR1dGVkIGJ5ICJTaW1wbGVOYW1lIG5hbWUiCisqIDYxNCA2MTcgdGhlIGxpc3Qgb2YgdG9rZW5zIGhhcyBiZWVuIGxpbmVhcml6ZWQgYW5kIHNpbXBsaWZpZWQKKyogNjE1IHN1cHBvcnQgZm9yIGFycmF5cyBoYXMgb25jZSBtb3JlIGJlZW4gY2hhbmdlZC4gU2VlIFt0aGUgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvaXNzdWVzLzU5MikgCisqIDU4MCA0NTMgMzgwIDYxOCA1ODAgNjExIDYxMCA0MjQgNjA4IHNtYWxsZXIgaW1wcm92ZW1lbnRzIGFuZCBmaXhlcworCitWZXJzaW9uIDMuMC4wLVJDLjEKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA0OTkgNjAxIHJlbmFtZXMgbWFueSBmaWVsZHMgdG8gYmUgbW9yZSBjb25zaXN0ZW50CisqIDU5NiA2MDUgNjAyIDYwNCBzbWFsbGVyIGltcHJvdmVtZW50cyBhbmQgZml4ZXMKKworVmVyc2lvbiAzLjAuMC1hbHBoYS4xMQorLS0tLS0tLS0tLS0tLS0tLS0tCisqIDU0NyA1OTUgTm9kZS5yYW5nZSBpcyBub3cgdXNpbmcgT3B0aW9uYWwgaW5zdGVhZCBvZiBSYW5nZS5VTktOT1dOCisqIDU4NCA1ODggNTQ4IDU4NSBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cworCitWZXJzaW9uIDMuMC4wLWFscGhhLjEwCistLS0tLS0tLS0tLS0tLS0tLS0KKyogNTc4IDU3OSA1NzcgNTc1IDI5MCA1NzAgNTY4IDU2NyA1NjIgNTY0IDU1MSBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cworCitWZXJzaW9uIDMuMC4wLWFscGhhLjkKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA0MDMgMzU4IDU0OSBNYWtlIGFsbCBuYW1lcyBub2RlczogZWl0aGVyIFNpbXBsZU5hbWUgb3IgTmFtZS4gVGhpcyBtYWtlcyBldmVyeSBuYW1lIGluIHRoZSBBU1QgdmlzaXRhYmxlLiBOYW1lRXhwciBpcyBub3cgYSB3cmFwcGVyIHRvIHVzZSBTaW1wbGVOYW1lIGluIGFuIGV4cHJlc3Npb24uCisqIDUxNiA1MzYgdXNlIE9wdGlvbmFsPD4gZm9yIHJldHVybiB2YWx1ZXMuCisqIDU1NiA1NTcgNTU4IDU1MCBzbWFsbCBpbXByb3ZlbWVudHMgYW5kIGZpeGVzLgorKiA1NjAgNTU5IG1ha2Ugbm9kZXMgb2JzZXJ2YWJsZS4KKworVmVyc2lvbiAzLjAuMC1hbHBoYS44CistLS0tLS0tLS0tLS0tLS0tLS0KKyogMzQ0IDUyOSB0dXJuIER1bXBWaXNpdG9yIGludG8gYW4gb2ZmaWNpYWwgUHJldHR5UHJpbnRlcgorKiA1MzIgNTA4IDQyNyA1MzAgNTMxIDUxMyA1MjggY2xlYW51cHMKKworVmVyc2lvbiAzLjAuMC1hbHBoYS43CistLS0tLS0tLS0tLS0tLS0tLS0KKyogNTE1IHJvbGwgYmFjayBhdHRlbXB0IGF0IHVzaW5nIE9wdGlvbmFsCisqIDUyMiA1MDQgbWFrZSBOb2RlTGlzdCBub3QgYSBOb2RlIChyZXN0b3JlcyBwYXJlbnQvY2hpbGRyZW4gYmVoYXZpb3VyIHRvIGJlZm9yZSBhbHBoYS40KQorKiA1MjcgNTI2IHJlbmFtZSBnZXRDaGlsZHJlbk5vZGVzIHRvIGdldENoaWxkTm9kZXMKKyogNTI1IDQ5NSA1MjAgYnVnIGZpeAorCitWZXJzaW9uIDMuMC4wLWFscGhhLjYKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA1MDMgbW9kaWZpZWQgSW1wb3J0RGVjbGFyYXRpb24gaGllcmFyY2h5IHRvIGhhdmUgZ2V0dGVycyBmb3Igc3RhdGljIGFuZCAiYXN0ZXJpc2siIGFnYWluCisqIDUwNiBidWcgZml4CisKK1ZlcnNpb24gMy4wLjAtYWxwaGEuNQorLS0tLS0tLS0tLS0tLS0tLS0tCisqIDQ1MSBudWxsIGlzIG5vIGxvbmdlciBhbGxvd2VkIGluIHRoZSBBU1QuIFtTZWUgbGFzdCBwb3N0IGluIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3Vlcy80NTEpCisqIDUwMSA0MjEgNDIwIDMxNiB1c2UgYSBzcGVjaWFsIHR5cGUgb2YgbGlzdCBmb3Igbm9kZXM6IE5vZGVMaXN0LiBbU2VlIGxhc3QgcG9zdCBpbiBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9pc3N1ZXMvNDIxKQorCitWZXJzaW9uIDMuMC4wLWFscGhhLjQKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA0NjMgNDcxIG5vZGVzIGNhbiBub3cgYmUgcmVtb3ZlZCBlYXNpbHkKKyogNDkxIGltcG9ydCBoYW5kbGluZyBjaGFuZ2VkLiBJbnN0ZWFkIG9mICJJbXBvcnREZWNsYXJhdGlvbiIsIHdlIG5vdyBoYXZlIHRoZSBmb3VyIHR5cGVzIG9mIGltcG9ydCBhcyBkZXNjcmliZWQgaW4gdGhlIEpMUy4gW1NlZSBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9wdWxsLzQ5MSkKKyogNDUyIDM1NSA0NzQgNDk0IHZhcmlvdXMgaW1wcm92ZW1lbnRzCisqIDQ5MyA0OTIgNDg1IFNpbXBsaWZ5IHRoZSBKYXZhUGFyc2VyIGludGVyZmFjZQorCitWZXJzaW9uIDMuMC4wLWFscGhhLjMKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiAxMTIgMjM3IDQ2NiA0NjUgNDYxIDQ2MCA0NTggNDU3IGZ1bmRhbWVudGFsbHkgY2hhbmdlcyBob3cgd2UgZGVhbCB3aXRoIGFycmF5cy4gW0l0IGlzIGV4cGxhaW5lZCBpbiB0aGUgbGFzdCBwb3N0IGhlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvaXNzdWVzLzIzNykKKyogNDcyIDQ1NiBtYWtlcyB0aGUgImRhdGEiIGZpZWxkIG9uIGV2ZXJ5IG5vZGUgbW9yZSBzdHJ1Y3R1cmVkLgorKiA0NzcgNDY4IHJlZmFjdG9yIFR5cGVBcmd1bWVudHMuIFlvdSB3aWxsIGZpbmQgdGhhdCBUeXBlQXJndW1lbnRzIGlzIG5vIGxvbmdlciBhIHR5cGUsIGl0IGlzIGp1c3QgYSBsaXN0IGluIHNvbWUgbm9kZXMuCisqIDQ4MiBhZGRzIHRoZSAibm9kZVR5cGVzIiBwYWNrYWdlcyB0byB0aGUgb3NnaSBleHBvcnQuCisqIDQ3OSA0NzYgbWFrZXMgYWxsIHNldHRlcnMgb24gbm9kZXMgcmV0dXJuIHRoaXMgc28gdGhleSBiZWNvbWUgY2hhaW5hYmxlLgorKiA0NzMgNDM3IGNsZWFuIHVwIENsb25lVmlzaXRvci4KKworVmVyc2lvbiAzLjAuMC1hbHBoYS4yCistLS0tLS0tLS0tLS0tLS0tLS0KKyogMTU3IGEgbmV3IHBhcnNlciBmcm9udGVuZCwgY2hlY2sgaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9wdWxsLzQ0NyBmb3IgZXhwbGFuYXRpb25zCisqIDQzNSBtb3JlIGJ1aWxkZXIgbWV0aG9kcyBsaWtlIDQwMCBhbmQgNDA1CisqIDExMSA0NDAgNDQzIDQ0NCA0NDUgNDQ2IGJ1Z3MgJiBjbGVhbnVwcworCitWZXJzaW9uIDMuMC4wLWFscGhhLjEKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA0MDAgNDA1IGludHJvZHVjZSBtYW55ICJidWlsZGVyIiBzdHlsZSBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgY29kZS4gVGhhbmtzIERlZXBTbm93TmVlTCEKKyogNDA5IHJlbW92ZSBBU1RIZWxwZXIgKG1ldGhvZHMgYXJlIG5vdyBvbiBzcGVjaWZpYyBOb2RlIHN1YmNsYXNzZXMpCisqIDQxNCBKYXZhUGFyc2VyIGNhbiBub3cgYmUgaW5zdGFudGlhdGVkIGFuZCByZXVzZWQuIEluc3RhbmNlSmF2YVBhcnNlciByZW1vdmVkCisqIDQxOCA0MTcgNDExIDQwOCBidWdzCisqIDM2NyA0MjAgNDA3IDQwMiB2YXJpb3VzIGNsZWFudXBzCisKK1ZlcnNpb24gMi41LjEKKy0tLS0tLS0tLS0tLS0KKyogMzk0IE9TR2kgbWFuaWZlc3QgYWRkZWQKKyogMzkxIGZpeCBNb2RpZmllclZpc2l0b3IgTnVsbFBvaW50ZXJFeGNlcHRpb24gYnVnCisqIDM4NSBhIGZldyBuZXcgcGFyc2UgbWV0aG9kcworKiAzODYgZml4IGR1bXBpbmcgYW4gZW1wdHkgaW1wb3J0IChhIHNpbmdsZSA7IGFmdGVyIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uKQorCitWZXJzaW9uIDIuNS4wCistLS0tLS0tLS0tLS0tCitBUEkgYnJlYWtpbmcgY2hhbmdlczoKKworKiAxOTE6IG1vdmVkIFRyZWVWaXNpdG9yIHRvIHZpc2l0b3IgcGFja2FnZQorKiAzNjgsIDE2MiwgMzAzLCAzMDIsIDM2MDogdXNlIGNvcnJlY3QgdHlwZSBpbiBzb21lIHBsYWNlcy4KKyogMzcxOiBjb2RlIGlzIG5vdyBjb21waWxlZCB3aXRoIEphdmEgOAorKiAzNDIsIDMzMTogTW9kaWZpZXJWaXNpdG9yQWRhcHRlciBkZXRlY3RzIGFuZCByZW1vdmVzIGJyb2tlbiBub2RlcworKiAzMjgsIDI3MDogdXBncmFkZSBKYXZhQ0MgKHVzZSBUb2tlbk1nckV4Y2VwdGlvbiBub3cpCitPdGhlciBjaGFuZ2VzOgorCisqIDI5NzogZW5hYmxlIGFjY2VzcyB0byB0b2tlbnMuCisqIDM0MSwgMzYxOiBub2RlIHBvc2l0aW9ucyBhcmUgbm93IE9PCisqIDIxMSwgMzczOiBlc2NhcGluZyBvZiBcbiBcciBmb3Igc3RyaW5nIGxpdGVyYWxzCisqIDMzNiwgMjc2LCAxNDE6IEphdmFEb2Mgc3VwcG9ydCBub3cgd29ya3MKKyogMzM3LCAyODE6IHJlb3JnYW5pemUgdGhlIHN0cmVhbSByZWFkaW5nIGNvZGUKKyogMzQzLCAzMDksIDMzMiwgNTc6IHRha2UgYWR2YW50YWdlIG9mIGNvbW1vbiBpbnRlcmZhY2VzCisqIDMyOSwgMzI2LCAzMjc6IGRlYWwgd2l0aCBwbGF0Zm9ybSBpc3N1ZXMKKyogMTYzLCAyMzYsIDI1MiwgMjk2LCAyNjksIDMzOSwgMzIxLCAzMjIsIDI1MiwgMjUzLCAyOTMsIDI5NTogdmFyaW91cyBmaXhlcworKiAzMTAsIDMxMSwgMzEzLCAzMDEsIDI5NDogc29tZSBjb2RlIGNsZWFuLXVwcyAKKworVmVyc2lvbiAyLjQuMAorLS0tLS0tLS0tLS0tLQorKiBzZXZlcmFsIGZpeGVzIGluIER1bXBWaXNpdG9yIGZvciBidWdzIGR1ZSB0byBsYXp5IGluaXRpYWxpemF0aW9uCisqIG1ha2UgVHlwZURlY2xhcmF0aW9uIGltcGxlbWVudHMgRG9jdW1lbnRhYmxlTm9kZSBkaXJlY3RseQorKiBUeXBlZE5vZGUgaW50ZXJmYWNlIGludHJvZHVjZWQKKyogaW50cm9kdWNlIE11bHRpQm91bmRUeXBlCisqIHJlZmFjdG9yZWQgSW50ZXJzZWN0aW9uVHlwZSBhbmQgVW5pb25UeXBlCisqIHJlZmFjdG9yZWQgQ2F0Y2hDbGF1c2UKKyogcGFyc2luZyBhbm5vdGF0aW9ucyBpbiB0aHJvd3MgZGVjbGFyYXRpb25zCisqIHBhcnNlIG9ycGhhbiBzZW1pY29sb25zIGluIGltcG9ydCBzdGF0ZW1lbnRzCisqIGFkZGVkIFBhY2thZ2VEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZQorKiBzb2x2ZWQgaXNzdWUgd2l0aCBuZXdsaW5lcyBpbiBzdHJpbmcgbGl0ZXJhbHMKKyogZml4ZWQgaGFuZGxpbmcgb2YgVW5rbm93blR5cGUgaW4gRXF1YWxzVmlzaXRvcgorKiBpbXByb3ZlbWVudHMgdG8gQ29tbWVudHNQYXJzZXIKKyogcmVtb3Zpbmcgb2xkIGdyYW1tYXIKKworVmVyc2lvbiAyLjMuMAorLS0tLS0tLS0tLS0tLQorKiBDbGFzc09ySW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRzIE5hbWVkTm9kZQorKiBEdW1wVmlzaXRvciBjYW4gbm93IGJlIGV4dGVuZGVkCisqIEltcHJvdmVkIGRvY3VtZW50YXRpb24KKyogQVNUOiBsaXN0cyBhcmUgbm93IGxhenkgaW5pdGlhbGl6ZWQKKworVmVyc2lvbiAyLjEuMAorLS0tLS0tLS0tLS0tLQorKiBGZWF0dXJlcworICAqIFsjNzUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIGBQb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb25gXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3Vlcy83NSkKKyAgKiBbIzY0IEluIGdldERlY2xhcmF0aW9uQXNTdHJpbmcgcGFyYW1ldGVyIG5hbWVzIHNob3VsZCBiZSBvcHRpb25hbF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9pc3N1ZXMvNjQpCisqIEJ1Z2ZpeGVzCisgICogWyM3OSBGaXggTlBFIGluIGBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmdgXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL3B1bGwvNzkpCisgICogWyM4NiBBZGQgbWlzc2luZyBmdW5jdGlvbnMgdG8gTW9kaWZpZXJWaXNpdG9yQWRhcHRlcl0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9wdWxsLzg2KQorICAqIFsjODIgc2V0IExhbWJkYUV4cHIgYXMgcGFyZW50IG9mIGl0cyBjaGlsZCBub2Rlc10oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9pc3N1ZXMvODIpCisgICogWyM4NyBpbXBsZW1lbnQgYHNldEphdmFkb2NgIGFuZCBgZ2V0SmF2YWRvY2AgYXQgdmFyaW91cyBjbGFzc2VzXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3Vlcy84NykKKyAgKiBbIzk2IEZpeGVkIGVuY29kaW5nIGlzc3VlIGluIGBKYXZhcGFyc2VyLnBhcnNlYF0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9wdWxsLzk2KQorICAqIFsjODUgQ2FzdGluZyBhIGxhbWJkYSBleHByZXNzaW9uIGNhdXNlcyBhIHBhcnNpbmcgZmFpbHVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9pc3N1ZXMvODUpCisgICogWyM4OCBgTWV0aG9kUmVmZXJlbmNlRXhwcmAgYW5kIGBUeXBlRXhwcmAgZG9uJ3Qgc2V0IHRoZW1zZWx2ZXMgYXMgcGFyZW50c10oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9pc3N1ZXMvODgpCisqIEludGVybmFsCisgICogWyM4OSBDb21tZW50c1BhcnNlci5TdGF0ZSBjb250YWlucyB1bnVzZWQgZmllbGRzXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3Vlcy84OSkKKyAgKiBTd2l0Y2hlZCBmcm9tIGRyb25lLmlvIHRvIFtUcmF2aXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9qYXZhcGFyc2VyL2phdmFwYXJzZXIpCisgICogWyMxMDUgRW5mb3JjZSBjb21waWxpbmcgdGhlIGxpYnJhcnkgZm9yIGEgY2VydGFpbiBKYXZhIHZlcnNpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvcHVsbC8xMDUpCisKK1tDb2RlIGNoYW5nZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvY29tcGFyZS9qYXZhcGFyc2VyLXBhcmVudC0yLjAuMC4uLm1hc3RlcikKKworVmVyc2lvbiAyLjAuMAorLS0tLS0tLS0tLS0tLQorKiBzdXBwb3J0IEphdmEgOAorCitWZXJzaW9uIDEuMC44ICgyMDEwLTAxLTE3KQorLS0tLS0tLS0tLS0tLQorKiBGaXhlZCBpc3N1ZXM6CisJKiBJc3N1ZSAxNzogQSByZWZhY3RvciBzdWdnZXN0aW9uIGZvciBBbm5vdGF0aW9uRXhwciBhbmQgaXRzIHN1YmNsYXNzZXMKKwkqIElzc3VlIDIxOiBKYXZhIDUgSmF2YVBhcnNlciBjb21waWxlZCBKQVJzCisJKiBJc3N1ZSAyMjogUGxlYXNlIHVzZSBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllciBjb25zdGFudHMgaW4gamFwYS5wYXJzZXIuYXN0LmJvZHkuTW9kaWZpZXJTZXQKKwkqIElzc3VlIDI3OiBJbXBsZW1lbnQgdGhlICJlcXVhbCIgbWV0aG9kCisJKiBJc3N1ZSAzMDogZXF1YWxzIGFuZCBoYXNoQ29kZSBtZXRob2RzCisKK1ZlcnNpb24gMS4wLjcgKDIwMDktMDQtMTIpCistLS0tLS0tLS0tLS0tCisqIElzc3VlIDE5IGZpeGVkOiAKKyogVGVzdHMgY2hhbmdlZCB0byBydW4gd2l0aCBqdW5pdCA0IAorCitWZXJzaW9uIDEuMC42ICgyMDA5LTAxLTExKQorLS0tLS0tLS0tLS0tLQorKiBJc3N1ZSAxMSBmaXhlZDogY2hhbmdlZCBtZXRob2QgZ2V0L3NldFBha2FnZSB0byBnZXQvc2V0UGFja2FnZSBpbiB0aGUgY2xhc3MgQ29tcGlsYXRpb25Vbml0CisqIENyZWF0ZWQgbmV3IHZpc2l0b3IgYWRhcHRlciB0byBoZWxwIEFTVCBtb2RpZmljYXRpb246IE1vZGlmaWVyVmlzaXRvckFkYXB0ZXIKKyogQ2hhbmdlZCB2aXNpdG9yIGFkYXB0ZXJzIHRvIGFic3RyYWN0ICAKKworVmVyc2lvbiAxLjAuNSAoMjAwOC0xMC0yNikKKy0tLS0tLS0tLS0tLS0KKyogQ3JlYXRlZCBzaW1wbGlmaWVkIGNvbnN0cnVjdG9ycyBpbiB0aGUgbm9kZXMgb2YgdGhlIEFTVCAod2l0aG91dCBwb3NpdGlvbmFsIGFyZ3VtZW50cykgCisqIENyZWF0ZWQgQVNUSGVscGVyIGNsYXNzIHdpdGggc29tZSBoZWxwZnVsIG1ldGhvZHMgKG1vcmUgbWV0aG9kcyBhcmUgc3RpbGwgbmVlZGVkKQorCitWZXJzaW9uIDEuMC40ICgyMDA4LTEwLTA3KQorLS0tLS0tLS0tLS0tLQorKiBNb3ZlZCB0byBqYXZhY2MgNC4xLgorKiBUaGUgamF2YV8xXzUuamogY2FuIGJlIGJ1aWxkIGFsb25lIHdpdGhvdXQgY29tcGlsYXRpb24gZXJyb3JzCisKK1ZlcnNpb24gMS4wLjMgKDIwMDgtMDktMDYpCistLS0tLS0tLS0tLS0tCisqIFJlbW92ZWQgU3VwZXJNZW1iZXJBY2Nlc3NFeHByIGNsYXNzLCBpdCB3YXMgbm8gbG9uZ2VyIHVzZWQKKyogUmVtb3ZlZCB0aGUgbWV0aG9kcyBnZXQvc2V0VHlwZUFyZ3MoKSBmcm9tIEFycmF5Q3JlYXRpb25FeHByLCB0aGlzIG5vZGUgc2hvdWxkbid0IGhhdmUgdGhlc2UgbWV0aG9kcy4KKyogRml4ZWQgdGhlIGJ1ZyB3aXRoIHN0YXJ0L2VuZCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIgYW5kIExvbmdMaXRlcmFsTWluVmFsdWVFeHByICAKKyogVGhlIG1ldGhvZHMgZ2V0L3NldEFubm90YXRpb25zKCkgZnJvbSBhbGwgQm9keURlY2xhcmF0aW9uIHN1YmNsYXNzZXMgd2VyZSBwdXNoZWQgZG93biB0byBCb2R5RGVjbGFyYXRpb24gY2xhc3MgCisKK1ZlcnNpb24gMS4wLjIgKDIwMDgtMDctMjApCistLS0tLS0tLS0tLS0tCisqIElzc3VlIGZpeGVkOiBJc3N1ZSAxOiBBZGQgc3VwcG9ydCBmb3IgZWRpdGluZyBBU1Qgbm9kZXMgb3IgY3JlYXRlIG5ldyBvbmVzCisKK1ZlcnNpb24gMS4wLjEgKDIwMDgtMDctMDEpCistLS0tLS0tLS0tLS0tCisqIElzc3VlIGZpeGVkOiBJc3N1ZSA1OiBlbmQgbGluZSBhbmQgZW5kIGNvbHVtbiBlcXVhbCB0byBiZWdpbiBsaW5lIGFuZCBiZWdpbiBjb2x1bW4KKworVmVyc2lvbiAxLjAuMCAoMjAwOC0wNi0yNSkKKy0tLS0tLS0tLS0tLS0KKyogQ2hhbmdlZCB2ZXJzaW9uIG51bWJlcmluZywgc3RhcnRpbmcgdmVyc2lvbiAxLjAuMAorKiBKYXZhZG9jIGRvbmUgZm9yIHBhY2thZ2VzOgorICAgICogamFwYS5wYXJzZXIKKyAgICAqIGphcGEucGFyc2VyLmFzdAorKiBDb3JyZWN0ZWQgYnVnIHdoZW4gcGFyc2luZyBpbiBtdWx0aXRocmVhZDogCisgICAgKiBKYXZhUGFyc2VyLnNldENhY2hlUGFyc2VyKGZhbHNlKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdG8gdXNlIHRoZSBwYXJzZXIgY29uY3VycmVudCAKKworMjAwOC0wNi0xOQorLS0tLS0tLS0tLS0tLQorKiBObyBjb2RlIGNoYW5nZXMsIGFkZGVkIGJpbmFyeSBkaXN0cmlidXRpb24gdG8gZG93bmxvYWQgcGFnZSAKKworMjAwOC0wNi0xMQorLS0tLS0tLS0tLS0tLQorKiBCdWcgY29ycmVjdGVkOiBOUEUgaW4gVm9pZFZpc2l0b3JBZGFwdGVyIAorCSogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2phdmFwYXJzZXIvaXNzdWVzL2RldGFpbD9pZD0yCisKKzIwMDgtMDYtMDkKKy0tLS0tLS0tLS0tLS0KKyogQWRkZWQgQWRhcHRlcnMgZm9yIGRlIHZpc2l0b3JzCisKKzIwMDgtMDUtMjgKKy0tLS0tLS0tLS0tLS0KKyogVGhpcyBwcm9qZWN0IG5vdyBpcyBwdWJsaXNoZWQgYXQgR29vZ2xlIENvZGU6CisJKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvamF2YXBhcnNlci8KKworMjAwOC0wNS0yNQorLS0tLS0tLS0tLS0tLQorKiBBZGRlZCBzdXBwb3J0IGZvciBjb21tZW50cyBhbmQgamF2YWRvYyB0byB0aGUgdHJlZS4gCisJKiBKYXZhZG9jcyBhcmUgc3RvcmVkIGRpcmVjdGx5IHRvIG1lbWJlcnMgKEJvZHlEZWNsYXJhdGlvbiBhbmQgYWxsIGRlcml2ZWRzIChjbGFzc2VzLCBtZXRob2RzLCBmaWVsZHMsIGV0Yy4pKSwgYWNjZXNzaWJsZSBieSB0aGUgbWV0aG9kIGdldEphdmFkb2MoKS4KKwkqIEFsbCBjb21tZW50cyBhcmUgc3RvcmVkIGluIHRoZSBDb21waWxhdGlvblVuaXQsIGFjY2Vzc2libGUgYnkgdGhlIG1ldGhvZCBnZXRDb21tZW50cygpLgorCisyMDA4LTA0LTAxCistLS0tLS0tLS0tLS0tCisqIENoYW5nZWQgYWxsIG5vZGVzIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIGJlIHByaXZhdGUgYW5kIGNyZWF0ZWQgZ2V0dGVycyB0byBhY2Nlc3MgdGhlbQorKiBDaGFuZ2VkIHRoZSBtZXRob2RzIG9mIHRoZSBOb2RlIGdldExpbmUgZSBnZXRDb2x1bW4gdG8gZ2V0QmVnaW5MaW5lIGFuZCBnZXRCZWdpbkNvbHVtbgorKiBBZGRlZCB0aGUgbWV0aG9kcyBnZXRFbmRMaW5lIGFuZCBnZXRFbmRDb2x1bW4gdG8gdGhlIE5vZGUgY2xhc3MgKHdvcmtzIG9ubHkgaW4gdGhlIEJsb2NrTm9kZSkKKworMjAwNy0xMi0yMgorLS0tLS0tLS0tLS0tLQorKiBDb3JyZWN0ZWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uIGJ1ZworCisyMDA3LTEwLTIxCistLS0tLS0tLS0tLS0tCisqIEFkZGVkIExHUEwgTGljZW5zZQorCisyMDA3LTEwLTIxCistLS0tLS0tLS0tLS0tCisqIEJ1Z3MgY29ycmVjdGVkOiAgCisgICogQ3JlYXRlZCBQYWNrYWdlRGVjbGFyYXRpb24gbWVtYmVyIG9mIENvbXBpbGF0aW9uVW5pdCB0byBhZGQgc3Vwb3J0IGZvciBhbm5vdGF0aW9ucyBpbiB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbgorICAqIFBhcmFtZXRlcml6ZWQgYW5vbnltb3VzIGNvbnN0cnVjdG9yIGludm9jYXRpb24KKyAgKiBFeHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvdGF0aW9uIFR5cGUgQXJndW1lbnRzCisgICogY3RybCt6ICgiXHUwMDFBIikgYXIgZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXQKKworMjAwNy0xMC0wOQorLS0tLS0tLS0tLS0tLQorKiBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQgY29ycmVjdGVkCisqIFBhcnNzaW5nIEphdmEgVW5pY29kZSBlc2NhcGUgY2hhcmFjdGVycyBzdXBvcnQgYWRkZWQKKworMjAwNy0xMC0wMworLS0tLS0tLS0tLS0tLQorKiBCdWcgY29ycmVjdGVkOiAiTW90aWZDb21ib1BvcHVwLnRoaXMuc3VwZXIoKSIgc3RhdGVtZW50IHdhcyBnZW5lcmF0aW5nIHBhcnNlciBlcnJvcgorCSAgICAgICAgICAgICAgICAgICAgCisyMDA3LTEwLTAxCistLS0tLS0tLS0tLS0tCisqIEJ1ZyBjb3JyZWN0ZWQ6IENhc3Rpbmcgc2lnbmVkIHByaW1pdGl2ZSB2YWx1ZXMKK2BgYAorCWRvdWJsZSBkID0gKGRvdWJsZSkgLTE7CisJICAgICAgICAgICAgICAgICAgICBeCitgYGAKKzIwMDctMDgtMDYKKy0tLS0tLS0tLS0tLS0KKyogQnVnIHdpdGggdGhlIHNpbmdsZSBsaW5lIGNvbW1lbnRzIGluIHRoZSBmaW5hbCBvZiB0aGUgdW5pdCBjb3JyZWN0ZWQKKworMjAwNy0wNy0zMQorLS0tLS0tLS0tLS0tLQorKiBGaXhlZCB0aGUgYnVnIHdpdGggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uOiAgYENsYXNzIGMgPSAoaW50LmNsYXNzKTtgCisKKzIwMDctMDYtMjYKKy0tLS0tLS0tLS0tLS0KKyogQnVnIGZpeGVzIGZyb20gTGVvbiBQb3l5YXlpbCB3b3JrCisJKiBzdXBvcnQgZm9yIGhleCBmbG9hdGluZyBwb2ludAorCSogdW5pY29kZSBkaWdpdHMgaW4gaW5kZW50aWZpZXIgCisJKiBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIKKworMjAwNy0wMy0wOQorLS0tLS0tLS0tLS0tLQorKiBMb25nIGFuZCBJbnRlZ2VyIGxpdGVyYWwgTUlOX1ZBTFVFIGJ1ZwkKKworMjAwNy0wMi0yNAorLS0tLS0tLS0tLS0tLQorKiAnXDAnIGJ1ZyBmaXhlZAkKKworMjAwNy0wMi0wMQorLS0tLS0tLS0tLS0tLQorKiBNYW55IGJ1ZyBmaXhlcworKiBBZGRlZCBsaW5lL2NvbHVtbiB0byBub2RlcwpkaWZmIC0tZ2l0IGEvZGV2LWZpbGVzL0phdmFQYXJzZXItZWNsaXBzZS54bWwgYi9kZXYtZmlsZXMvSmF2YVBhcnNlci1lY2xpcHNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM4MTFjCi0tLSAvZGV2L251bGwKKysrIGIvZGV2LWZpbGVzL0phdmFQYXJzZXItZWNsaXBzZS54bWwKQEAgLTAsMCArMSwyOTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHByb2ZpbGVzIHZlcnNpb249IjEyIj4KKzxwcm9maWxlIGtpbmQ9IkNvZGVGb3JtYXR0ZXJQcm9maWxlIiBuYW1lPSJKYXZhUGFyc2VyIiB2ZXJzaW9uPSIxMiI+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXMiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2UiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHMiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWciIHZhbHVlPSJAZm9ybWF0dGVyOm9mZiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb24iIHZhbHVlPSIyIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMiIHZhbHVlPSIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzIiB2YWx1ZT0iMSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlIiB2YWx1ZT0iMSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWciIHZhbHVlPSJAZm9ybWF0dGVyOm9uIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZSIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucyIgdmFsdWU9IjEiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2QiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2siIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoIiB2YWx1ZT0iMTE5Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncyIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGUiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2giIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHkiIHZhbHVlPSIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwiIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlciIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2siIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHkiIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWYiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSIxOCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXIiIHZhbHVlPSJlcnJvciIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeSIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmUiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCIgdmFsdWU9IjAiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5IiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb24iIHZhbHVlPSIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbiIgdmFsdWU9IjgwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGUiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2UiIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlciIgdmFsdWU9ImZhbHNlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlIiB2YWx1ZT0iZW5hYmxlZCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9IjAiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeSIgdmFsdWU9IjgwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW4iIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIgdmFsdWU9IjEuOCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGUiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkIiB2YWx1ZT0iMCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjIiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kIiB2YWx1ZT0iMSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm0iIHZhbHVlPSIxLjgiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaCIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX3R5cGVfYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbCIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iMCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2giIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bmsiIHZhbHVlPSIxIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZSIgdmFsdWU9IjEiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iMTYiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcyIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWYiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTgiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keSIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHMiIHZhbHVlPSIxNiIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvciIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlIiB2YWx1ZT0iMS44Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZCIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudCIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2UiIHZhbHVlPSIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlciIgdmFsdWU9InRydWUiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdyIgdmFsdWU9Imluc2VydCIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHMiIHZhbHVlPSJmYWxzZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uIiB2YWx1ZT0idHJ1ZSIvPgorPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyIiB2YWx1ZT0ic3BhY2UiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3VwcyIgdmFsdWU9IjEiLz4KKzxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0IiB2YWx1ZT0iMTIwIi8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Cis8c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJpbnNlcnQiLz4KKzwvcHJvZmlsZT4KKzwvcHJvZmlsZXM+CmRpZmYgLS1naXQgYS9kZXYtZmlsZXMvSmF2YVBhcnNlci1pZGVhLnhtbCBiL2Rldi1maWxlcy9KYXZhUGFyc2VyLWlkZWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDVkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kZXYtZmlsZXMvSmF2YVBhcnNlci1pZGVhLnhtbApAQCAtMCwwICsxLDM4IEBACis8Y29kZV9zY2hlbWUgbmFtZT0iSmF2YVBhcnNlciI+CisgIDxvcHRpb24gbmFtZT0iT1RIRVJfSU5ERU5UX09QVElPTlMiPgorICAgIDx2YWx1ZT4KKyAgICAgIDxvcHRpb24gbmFtZT0iSU5ERU5UX1NJWkUiIHZhbHVlPSI0IiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJDT05USU5VQVRJT05fSU5ERU5UX1NJWkUiIHZhbHVlPSI4IiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJUQUJfU0laRSIgdmFsdWU9IjQiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9IlVTRV9UQUJfQ0hBUkFDVEVSIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgIDxvcHRpb24gbmFtZT0iU01BUlRfVEFCUyIgdmFsdWU9InRydWUiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9IkxBQkVMX0lOREVOVF9TSVpFIiB2YWx1ZT0iMCIgLz4KKyAgICAgIDxvcHRpb24gbmFtZT0iTEFCRUxfSU5ERU5UX0FCU09MVVRFIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9IlVTRV9SRUxBVElWRV9JTkRFTlRTIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPC92YWx1ZT4KKyAgPC9vcHRpb24+CisgIDxvcHRpb24gbmFtZT0iSkRfQUxJR05fUEFSQU1fQ09NTUVOVFMiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPG9wdGlvbiBuYW1lPSJKRF9BTElHTl9FWENFUFRJT05fQ09NTUVOVFMiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPG9wdGlvbiBuYW1lPSJXUkFQX0NPTU1FTlRTIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgPFhNTD4KKyAgICA8b3B0aW9uIG5hbWU9IlhNTF9MRUdBQ1lfU0VUVElOR1NfSU1QT1JURUQiIHZhbHVlPSJ0cnVlIiAvPgorICA8L1hNTD4KKyAgPGNvZGVTdHlsZVNldHRpbmdzIGxhbmd1YWdlPSJKQVZBIj4KKyAgICA8b3B0aW9uIG5hbWU9IlJJR0hUX01BUkdJTiIgdmFsdWU9IjEyMCIgLz4KKyAgICA8aW5kZW50T3B0aW9ucz4KKyAgICAgIDxvcHRpb24gbmFtZT0iU01BUlRfVEFCUyIgdmFsdWU9InRydWUiIC8+CisgICAgPC9pbmRlbnRPcHRpb25zPgorICA8L2NvZGVTdHlsZVNldHRpbmdzPgorICA8Y29kZVN0eWxlU2V0dGluZ3MgbGFuZ3VhZ2U9IlNjYWxhIj4KKyAgICA8aW5kZW50T3B0aW9ucz4KKyAgICAgIDxvcHRpb24gbmFtZT0iVVNFX1RBQl9DSEFSQUNURVIiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJTTUFSVF9UQUJTIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L2luZGVudE9wdGlvbnM+CisgIDwvY29kZVN0eWxlU2V0dGluZ3M+CisgIDxjb2RlU3R5bGVTZXR0aW5ncyBsYW5ndWFnZT0iWE1MIj4KKyAgICA8aW5kZW50T3B0aW9ucz4KKyAgICAgIDxvcHRpb24gbmFtZT0iVVNFX1RBQl9DSEFSQUNURVIiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJTTUFSVF9UQUJTIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L2luZGVudE9wdGlvbnM+CisgIDwvY29kZVN0eWxlU2V0dGluZ3M+Cis8L2NvZGVfc2NoZW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzLmltbCBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzLmltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQzNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMuaW1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bW9kdWxlIG9yZy5qZXRicmFpbnMuaWRlYS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdHNNYW5hZ2VyLmlzTWF2ZW5Nb2R1bGU9InRydWUiIHR5cGU9IkpBVkFfTU9EVUxFIiB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJOZXdNb2R1bGVSb290TWFuYWdlciIgTEFOR1VBR0VfTEVWRUw9IkpES18xXzgiPgorICAgIDxvdXRwdXQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC9jbGFzc2VzIiAvPgorICAgIDxvdXRwdXQtdGVzdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L3Rlc3QtY2xhc3NlcyIgLz4KKyAgICA8Y29udGVudCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQiPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL21haW4vamF2YSIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy90ZXN0L2phdmEiIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KKyAgICAgIDxleGNsdWRlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQiIC8+CisgICAgPC9jb250ZW50PgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImluaGVyaXRlZEpkayIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJzb3VyY2VGb2xkZXIiIGZvclRlc3RzPSJmYWxzZSIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUiIG1vZHVsZS1uYW1lPSJqYXZhcGFyc2VyLWNvcmUiIC8+CisgIDwvY29tcG9uZW50PgorPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvcG9tLnhtbCBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlZWNmOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3BvbS54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4xNi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9yczwvYXJ0aWZhY3RJZD4KKyAgICA8ZGVzY3JpcHRpb24+QSBjb2RlIGdlbmVyYXRvciBmcmFtZXdvcmssIGFuZCB0aGUgZ2VuZXJhdG9ycyBmb3IgamF2YXBhcnNlci1jb3JlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJ1bi1jb3JlLWdlbmVyYXRvcnM8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1qYXZhcGFyc2VyLWNvcmU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphdmE8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoU2NvcGU+dGVzdDwvY2xhc3NwYXRoU2NvcGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5jb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUuQ29yZUdlbmVyYXRvcjwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudD4ke3Byb2plY3QuYmFzZWRpcn08L2FyZ3VtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9HZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9HZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzg2MGIwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL0dlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnRvTm9kZUxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CisKKy8qKgorICogQSBnZW5lcmFsIHBhdHRlcm4gdGhhdCB0aGUgZ2VuZXJhdG9ycyBpbiB0aGlzIG1vZHVsZSB3aWxsIGZvbGxvdy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRvciB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNvdXJjZVJvb3Qgc291cmNlUm9vdDsKKworICAgIHByb3RlY3RlZCBHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgTm9kZSAmIE5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4+IHZvaWQgYW5ub3RhdGVHZW5lcmF0ZWQoVCBub2RlKSB7CisgICAgICAgIGFubm90YXRlKG5vZGUsIEdlbmVyYXRlZC5jbGFzcywgbmV3IFN0cmluZ0xpdGVyYWxFeHByKGdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgTm9kZSAmIE5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4+IHZvaWQgYW5ub3RhdGVTdXBwcmVzc1dhcm5pbmdzKFQgbm9kZSkgeworICAgICAgICBhbm5vdGF0ZShub2RlLCBTdXBwcmVzc1dhcm5pbmdzLmNsYXNzLCBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoInVuY2hlY2tlZCIpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhbm5vdGF0ZU92ZXJyaWRkZW4oTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisgICAgICAgIGFubm90YXRlKG1ldGhvZCwgT3ZlcnJpZGUuY2xhc3MsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOb2RlICYgTm9kZVdpdGhBbm5vdGF0aW9uczw/Pj4gdm9pZCBhbm5vdGF0ZShUIG5vZGUsIENsYXNzPD8+IGFubm90YXRpb24sIEV4cHJlc3Npb24gY29udGVudCkgeworICAgICAgICBub2RlLnNldEFubm90YXRpb25zKAorICAgICAgICAgICAgICAgIG5vZGUuZ2V0QW5ub3RhdGlvbnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihhIC0+ICFhLmdldE5hbWVBc1N0cmluZygpLmVxdWFscyhhbm5vdGF0aW9uLmdldFNpbXBsZU5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdCh0b05vZGVMaXN0KCkpKTsKKworICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBub2RlLmFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oYW5ub3RhdGlvbi5nZXRTaW1wbGVOYW1lKCksIGNvbnRlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm9kZS5hZGRNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBub2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGFubm90YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgbG9va3MgZm9yIGEgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIHdpdGggYW4gaWRlbnRpY2FsIHNpZ25hdHVyZSBhcyAiY2FsbGFibGUiIGFuZCByZXBsYWNlcyBpdAorICAgICAqIHdpdGggY2FsbGFibGUuIElmIG5vdCBmb3VuZCwgYWRkcyBjYWxsYWJsZS4gV2hlbiB0aGUgbmV3IGNhbGxhYmxlIGhhcyBubyBqYXZhZG9jLCBhbnkgb2xkIGphdmFkb2Mgd2lsbCBiZSBrZXB0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZE9yUmVwbGFjZVdoZW5TYW1lU2lnbmF0dXJlKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjb250YWluaW5nQ2xhc3NPckludGVyZmFjZSwgQ2FsbGFibGVEZWNsYXJhdGlvbjw/PiBjYWxsYWJsZSkgeworICAgICAgICBhZGRNZXRob2QoY29udGFpbmluZ0NsYXNzT3JJbnRlcmZhY2UsIGNhbGxhYmxlLCAoKSAtPiBjb250YWluaW5nQ2xhc3NPckludGVyZmFjZS5hZGRNZW1iZXIoY2FsbGFibGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGxvb2tzIGZvciBhIG1ldGhvZCBvciBjb25zdHJ1Y3RvciB3aXRoIGFuIGlkZW50aWNhbCBzaWduYXR1cmUgYXMgImNhbGxhYmxlIiBhbmQgcmVwbGFjZXMgaXQKKyAgICAgKiB3aXRoIGNhbGxhYmxlLiBJZiBub3QgZm91bmQsIGZhaWxzLiBXaGVuIHRoZSBuZXcgY2FsbGFibGUgaGFzIG5vIGphdmFkb2MsIGFueSBvbGQgamF2YWRvYyB3aWxsIGJlIGtlcHQuIFRoZQorICAgICAqIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBpcyBhbm5vdGF0ZWQgd2l0aCB0aGUgZ2VuZXJhdG9yIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY29udGFpbmluZ0NsYXNzT3JJbnRlcmZhY2UsIENhbGxhYmxlRGVjbGFyYXRpb248Pz4gY2FsbGFibGUpIHsKKyAgICAgICAgYWRkTWV0aG9kKGNvbnRhaW5pbmdDbGFzc09ySW50ZXJmYWNlLCBjYWxsYWJsZSwKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihmKCJXYW50ZWQgdG8gcmVnZW5lcmF0ZSBhIG1ldGhvZCB3aXRoIHNpZ25hdHVyZSAlcyBpbiAlcywgYnV0IGl0IHdhc24ndCB0aGVyZS4iLCBjYWxsYWJsZS5nZXRTaWduYXR1cmUoKSwgY29udGFpbmluZ0NsYXNzT3JJbnRlcmZhY2UuZ2V0TmFtZUFzU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTWV0aG9kKAorICAgICAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNvbnRhaW5pbmdDbGFzc09ySW50ZXJmYWNlLAorICAgICAgICAgICAgQ2FsbGFibGVEZWNsYXJhdGlvbjw/PiBjYWxsYWJsZSwKKyAgICAgICAgICAgIFJ1bm5hYmxlIG9uTm9FeGlzdGluZ01ldGhvZCkgeworICAgICAgICBMaXN0PENhbGxhYmxlRGVjbGFyYXRpb248Pz4+IGV4aXN0aW5nQ2FsbGFibGVzID0gY29udGFpbmluZ0NsYXNzT3JJbnRlcmZhY2UuZ2V0Q2FsbGFibGVzV2l0aFNpZ25hdHVyZShjYWxsYWJsZS5nZXRTaWduYXR1cmUoKSk7CisgICAgICAgIGlmIChleGlzdGluZ0NhbGxhYmxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG9uTm9FeGlzdGluZ01ldGhvZC5ydW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpc3RpbmdDYWxsYWJsZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGYoIldhbnRlZCB0byByZWdlbmVyYXRlIGEgbWV0aG9kIHdpdGggc2lnbmF0dXJlICVzIGluICVzLCBidXQgZm91bmQgbW9yZSB0aGFuIG9uZS4iLCBjYWxsYWJsZS5nZXRTaWduYXR1cmUoKSwgY29udGFpbmluZ0NsYXNzT3JJbnRlcmZhY2UuZ2V0TmFtZUFzU3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDYWxsYWJsZURlY2xhcmF0aW9uPD8+IGV4aXN0aW5nQ2FsbGFibGUgPSBleGlzdGluZ0NhbGxhYmxlcy5nZXQoMCk7CisgICAgICAgIGNhbGxhYmxlLnNldEphdmFkb2NDb21tZW50KGNhbGxhYmxlLmdldEphdmFkb2NDb21tZW50KCkub3JFbHNlKGV4aXN0aW5nQ2FsbGFibGUuZ2V0SmF2YWRvY0NvbW1lbnQoKS5vckVsc2UobnVsbCkpKTsKKyAgICAgICAgYW5ub3RhdGVHZW5lcmF0ZWQoY2FsbGFibGUpOworICAgICAgICBjb250YWluaW5nQ2xhc3NPckludGVyZmFjZS5nZXRNZW1iZXJzKCkucmVwbGFjZShleGlzdGluZ0NhbGxhYmxlLCBjYWxsYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgbWV0aG9kcyBmcm9tIGNvbnRhaW5pbmdDbGFzc09ySW50ZXJmYWNlIHRoYXQgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmUgYXMgY2FsbGFibGUuIFRoaXMgaXMgbm90IHVzZWQgYnkKKyAgICAgKiBhbnkgY29kZSwgYnV0IGl0IGlzIHVzZWZ1bCB3aGVuIGNoYW5naW5nIGEgZ2VuZXJhdG9yIGFuZCB5b3UgbmVlZCB0byBnZXQgcmlkIG9mIGEgc2V0IG9mIG91dGRhdGVkIG1ldGhvZHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWV0aG9kV2l0aFNhbWVTaWduYXR1cmUoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNvbnRhaW5pbmdDbGFzc09ySW50ZXJmYWNlLCBDYWxsYWJsZURlY2xhcmF0aW9uPD8+IGNhbGxhYmxlKSB7CisgICAgICAgIGZvciAoQ2FsbGFibGVEZWNsYXJhdGlvbjw/PiBleGlzdGluZ0NhbGxhYmxlIDogY29udGFpbmluZ0NsYXNzT3JJbnRlcmZhY2UuZ2V0Q2FsbGFibGVzV2l0aFNpZ25hdHVyZShjYWxsYWJsZS5nZXRTaWduYXR1cmUoKSkpIHsKKyAgICAgICAgICAgIGNvbnRhaW5pbmdDbGFzc09ySW50ZXJmYWNlLnJlbW92ZShleGlzdGluZ0NhbGxhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL05vZGVHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9Ob2RlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhYjYwZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9Ob2RlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuTG9nOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5QYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCisvKioKKyAqIE1ha2VzIGl0IGVhc2llciB0byBnZW5lcmF0ZSBjb2RlIGluIHRoZSBjb3JlIEFTVCBub2Rlcy4gVGhlIGdlbmVyYXRlTm9kZSBtZXRob2Qgd2lsbCBnZXQgZXZlcnkgbm9kZSB0eXBlIHBhc3NlZCB0bworICogaXQsIHJlYWR5IGZvciBtb2RpZmljYXRpb24uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKKyAgICBwcm90ZWN0ZWQgTm9kZUdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLmluZm8oIlJ1bm5pbmcgJXMiLCBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIGZvciAoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCA6IEphdmFQYXJzZXJNZXRhTW9kZWwuZ2V0Tm9kZU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgUGFpcjxDb21waWxhdGlvblVuaXQsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gcmVzdWx0ID0gcGFyc2VOb2RlKG5vZGVNZXRhTW9kZWwpOworICAgICAgICAgICAgZ2VuZXJhdGVOb2RlKG5vZGVNZXRhTW9kZWwsIHJlc3VsdC5hLCByZXN1bHQuYik7CisgICAgICAgIH0KKyAgICAgICAgYWZ0ZXIoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGFpcjxDb21waWxhdGlvblVuaXQsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gcGFyc2VOb2RlKEJhc2VOb2RlTWV0YU1vZGVsIG5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IG5vZGVDdSA9IHNvdXJjZVJvb3QucGFyc2Uobm9kZU1ldGFNb2RlbC5nZXRQYWNrYWdlTmFtZSgpLCBub2RlTWV0YU1vZGVsLmdldFR5cGVOYW1lKCkgKyAiLmphdmEiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkID0gbm9kZUN1LmdldENsYXNzQnlOYW1lKG5vZGVNZXRhTW9kZWwuZ2V0VHlwZU5hbWUoKSkub3JFbHNlVGhyb3coKCkgLT4gbmV3IEFzc2VydGlvbkVycm9yKCJDYW4ndCBmaW5kIGNsYXNzIikpOworICAgICAgICByZXR1cm4gbmV3IFBhaXI8Pihub2RlQ3UsIG5vZGVDb2lkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZnRlcigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGVOb2RlKEJhc2VOb2RlTWV0YU1vZGVsIG5vZGVNZXRhTW9kZWwsIENvbXBpbGF0aW9uVW5pdCBub2RlQ3UsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlQ29pZCkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9WaXNpdG9yR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvVmlzaXRvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjVlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvVmlzaXRvckdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuTG9nOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuUFVCTElDOworCisvKioKKyAqIE1ha2VzIGl0IGVhc2llciB0byBnZW5lcmF0ZSB2aXNpdG9yIGNsYXNzZXMuCisgKiBJdCB3aWxsIGNyZWF0ZSBtaXNzaW5nIHZpc2l0IG1ldGhvZHMgb24gdGhlIGZseSwKKyAqIGFuZCB3aWxsIGFzayB5b3UgdG8gZmlsbCBpbiB0aGUgYm9kaWVzIG9mIHRoZSB2aXNpdCBtZXRob2RzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlzaXRvckdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGtnOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZpc2l0b3JDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmV0dXJuVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcmd1bWVudFR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNyZWF0ZU1pc3NpbmdWaXNpdE1ldGhvZHM7CisKKyAgICBwcm90ZWN0ZWQgVmlzaXRvckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QsIFN0cmluZyBwa2csIFN0cmluZyB2aXNpdG9yQ2xhc3NOYW1lLCBTdHJpbmcgcmV0dXJuVHlwZSwgU3RyaW5nIGFyZ3VtZW50VHlwZSwgYm9vbGVhbiBjcmVhdGVNaXNzaW5nVmlzaXRNZXRob2RzKSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QpOworICAgICAgICB0aGlzLnBrZyA9IHBrZzsKKyAgICAgICAgdGhpcy52aXNpdG9yQ2xhc3NOYW1lID0gdmlzaXRvckNsYXNzTmFtZTsKKyAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKyAgICAgICAgdGhpcy5hcmd1bWVudFR5cGUgPSBhcmd1bWVudFR5cGU7CisgICAgICAgIHRoaXMuY3JlYXRlTWlzc2luZ1Zpc2l0TWV0aG9kcyA9IGNyZWF0ZU1pc3NpbmdWaXNpdE1ldGhvZHM7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9nLmluZm8oIlJ1bm5pbmcgJXMiLCBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisKKyAgICAgICAgZmluYWwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHNvdXJjZVJvb3QudHJ5VG9QYXJzZShwa2csIHZpc2l0b3JDbGFzc05hbWUgKyAiLmphdmEiKS5nZXRSZXN1bHQoKS5nZXQoKTsKKworICAgICAgICBPcHRpb25hbDxDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+IHZpc2l0b3JDbGFzc09wdGlvbmFsID0gY29tcGlsYXRpb25Vbml0LmdldENsYXNzQnlOYW1lKHZpc2l0b3JDbGFzc05hbWUpOworICAgICAgICBpZiAoIXZpc2l0b3JDbGFzc09wdGlvbmFsLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB2aXNpdG9yQ2xhc3NPcHRpb25hbCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRJbnRlcmZhY2VCeU5hbWUodmlzaXRvckNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHZpc2l0b3JDbGFzcyA9IHZpc2l0b3JDbGFzc09wdGlvbmFsLmdldCgpOworCisgICAgICAgIEphdmFQYXJzZXJNZXRhTW9kZWwuZ2V0Tm9kZU1ldGFNb2RlbHMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoKGJhc2VOb2RlTWV0YU1vZGVsKSAtPiAhYmFzZU5vZGVNZXRhTW9kZWwuaXNBYnN0cmFjdCgpKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKG5vZGUgLT4gZ2VuZXJhdGVWaXNpdE1ldGhvZEZvck5vZGUobm9kZSwgdmlzaXRvckNsYXNzLCBjb21waWxhdGlvblVuaXQpKTsKKyAgICAgICAgYWZ0ZXIoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZnRlcigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RGb3JOb2RlKEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB2aXNpdG9yQ2xhc3MsIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgZmluYWwgT3B0aW9uYWw8TWV0aG9kRGVjbGFyYXRpb24+IGV4aXN0aW5nVmlzaXRNZXRob2QgPSB2aXNpdG9yQ2xhc3MuZ2V0TWV0aG9kcygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihtIC0+IG0uZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKCJ2aXNpdCIpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtLmdldFBhcmFtZXRlcigwKS5nZXRUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMobm9kZS5nZXRUeXBlTmFtZSgpKSkKKyAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7CisKKyAgICAgICAgaWYgKGV4aXN0aW5nVmlzaXRNZXRob2QuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KG5vZGUsIGV4aXN0aW5nVmlzaXRNZXRob2QuZ2V0KCksIGNvbXBpbGF0aW9uVW5pdCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3JlYXRlTWlzc2luZ1Zpc2l0TWV0aG9kcykgeworICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbmV3VmlzaXRNZXRob2QgPSB2aXNpdG9yQ2xhc3MuYWRkTWV0aG9kKCJ2aXNpdCIpCisgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIobm9kZS5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSwgIm4iKQorICAgICAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKGFyZ3VtZW50VHlwZSwgImFyZyIpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUeXBlKHJldHVyblR5cGUpOworICAgICAgICAgICAgaWYgKCF2aXNpdG9yQ2xhc3MuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIG5ld1Zpc2l0TWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQW5ub3RhdGlvbihuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIobmV3IE5hbWUoIk92ZXJyaWRlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1vZGlmaWVyKFBVQkxJQyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5lcmF0ZVZpc2l0TWV0aG9kQm9keShub2RlLCBuZXdWaXNpdE1ldGhvZCwgY29tcGlsYXRpb25Vbml0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uIHZpc2l0TWV0aG9kLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL0NvcmVHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL0NvcmVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFhNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvQ29yZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUub3RoZXIuVG9rZW5LaW5kR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkxvZzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworCisvKioKKyAqIEdlbmVyYXRlcyBhbGwgZ2VuZXJhdGVkIHZpc2l0b3JzIGluIHRoZSBqYXZhcGFyc2VyLWNvcmUgbW9kdWxlLgorICogU3VnZ2VzdGVkIHVzYWdlIGlzIGJ5IHJ1bm5pbmcgdGhlIHJ1bl9jb3JlX2dlbmVyYXRvcnMuc2ggc2NyaXB0LgorICogWW91IG1heSB3YW50IHRvIHJ1bl9tZXRhbW9kZWxfZ2VuZXJhdG9yLnNoIGJlZm9yZSB0aGF0LgorICovCitwdWJsaWMgY2xhc3MgQ29yZUdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyc2VyQ29uZmlndXJhdGlvbiBwYXJzZXJDb25maWd1cmF0aW9uID0gbmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdG9yZVRva2VucyhmYWxzZSkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXR0cmlidXRlQ29tbWVudHMoZmFsc2UpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldExleGljYWxQcmVzZXJ2YXRpb25FbmFibGVkKHRydWUpCisgICAgICAgICAgICA7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOZWVkIDEgcGFyYW1ldGVyOiB0aGUgSmF2YVBhcnNlciBzb3VyY2UgY2hlY2tvdXQgcm9vdCBkaXJlY3RvcnkuIik7CisgICAgICAgIH0KKyAgICAgICAgTG9nLnNldEFkYXB0ZXIobmV3IExvZy5TdGFuZGFyZE91dFN0YW5kYXJkRXJyb3JBZGFwdGVyKCkpOworICAgICAgICBmaW5hbCBQYXRoIHJvb3QgPSBQYXRocy5nZXQoYXJnc1swXSwgIi4uIiwgImphdmFwYXJzZXItY29yZSIsICJzcmMiLCAibWFpbiIsICJqYXZhIik7CisgICAgICAgIGZpbmFsIFNvdXJjZVJvb3Qgc291cmNlUm9vdCA9IG5ldyBTb3VyY2VSb290KHJvb3QsIHBhcnNlckNvbmZpZ3VyYXRpb24pCisvLyAgICAgICAgICAgICAgICAuc2V0UHJpbnRlcihMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXI6OnByaW50KQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICBmaW5hbCBQYXRoIGdlbmVyYXRlZEphdmFDY1Jvb3QgPSBQYXRocy5nZXQoYXJnc1swXSwgIi4uIiwgImphdmFwYXJzZXItY29yZSIsICJ0YXJnZXQiLCAiZ2VuZXJhdGVkLXNvdXJjZXMiLCAiamF2YWNjIik7CisgICAgICAgIGZpbmFsIFNvdXJjZVJvb3QgZ2VuZXJhdGVkSmF2YUNjU291cmNlUm9vdCA9IG5ldyBTb3VyY2VSb290KGdlbmVyYXRlZEphdmFDY1Jvb3QsIHBhcnNlckNvbmZpZ3VyYXRpb24pCisvLyAgICAgICAgICAgICAgICAuc2V0UHJpbnRlcihMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXI6OnByaW50KQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICBuZXcgQ29yZUdlbmVyYXRvcigpLnJ1bihzb3VyY2VSb290LCBnZW5lcmF0ZWRKYXZhQ2NTb3VyY2VSb290KTsKKworICAgICAgICBzb3VyY2VSb290LnNhdmVBbGwoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuKFNvdXJjZVJvb3Qgc291cmNlUm9vdCwgU291cmNlUm9vdCBnZW5lcmF0ZWRKYXZhQ2NTb3VyY2VSb290KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV3IFR5cGVDYXN0aW5nR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBHZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBHZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IEdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBFcXVhbHNWaXNpdG9yR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IE5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IFZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvcihzb3VyY2VSb290KS5nZW5lcmF0ZSgpOworICAgICAgICBuZXcgVm9pZFZpc2l0b3JHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IFZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBHZW5lcmljVmlzaXRvckdlbmVyYXRvcihzb3VyY2VSb290KS5nZW5lcmF0ZSgpOworICAgICAgICBuZXcgSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvcihzb3VyY2VSb290KS5nZW5lcmF0ZSgpOworICAgICAgICBuZXcgTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBDbG9uZVZpc2l0b3JHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IE1vZGlmaWVyVmlzaXRvckdlbmVyYXRvcihzb3VyY2VSb290KS5nZW5lcmF0ZSgpOworCisgICAgICAgIG5ldyBQcm9wZXJ0eUdlbmVyYXRvcihzb3VyY2VSb290KS5nZW5lcmF0ZSgpOworICAgICAgICBuZXcgUmVtb3ZlTWV0aG9kR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBSZXBsYWNlTWV0aG9kR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBDbG9uZUdlbmVyYXRvcihzb3VyY2VSb290KS5nZW5lcmF0ZSgpOworICAgICAgICBuZXcgR2V0TWV0YU1vZGVsR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBNYWluQ29uc3RydWN0b3JHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IEZpbmFsR2VuZXJhdG9yKHNvdXJjZVJvb3QpLmdlbmVyYXRlKCk7CisgICAgICAgIG5ldyBBY2NlcHRHZW5lcmF0b3Ioc291cmNlUm9vdCkuZ2VuZXJhdGUoKTsKKyAgICAgICAgbmV3IFRva2VuS2luZEdlbmVyYXRvcihzb3VyY2VSb290LCBnZW5lcmF0ZWRKYXZhQ2NTb3VyY2VSb290KS5nZW5lcmF0ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvQWNjZXB0R2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL0FjY2VwdEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjJiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL0FjY2VwdEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuTm9kZUdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlQm9keURlY2xhcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQWNjZXB0R2VuZXJhdG9yIGV4dGVuZHMgTm9kZUdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBnZW5lcmljQWNjZXB0OworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gdm9pZEFjY2VwdDsKKworICAgIHB1YmxpYyBBY2NlcHRHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QpOworICAgICAgICBnZW5lcmljQWNjZXB0ID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oIkBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7IHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7IH0iKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIHZvaWRBY2NlcHQgPSBwYXJzZUJvZHlEZWNsYXJhdGlvbigiQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsgdi52aXNpdCh0aGlzLCBhcmcpOyB9IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTm9kZShCYXNlTm9kZU1ldGFNb2RlbCBub2RlTWV0YU1vZGVsLCBDb21waWxhdGlvblVuaXQgbm9kZUN1LCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZUNvaWQpIHsKKyAgICAgICAgaWYobm9kZU1ldGFNb2RlbC5pc0Fic3RyYWN0KCkpeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5vZGVDdS5hZGRJbXBvcnQoR2VuZXJpY1Zpc2l0b3IuY2xhc3MpOworICAgICAgICBub2RlQ3UuYWRkSW1wb3J0KFZvaWRWaXNpdG9yLmNsYXNzKTsKKyAgICAgICAgYWRkT3JSZXBsYWNlV2hlblNhbWVTaWduYXR1cmUobm9kZUNvaWQsIGdlbmVyaWNBY2NlcHQpOworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgdm9pZEFjY2VwdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9DbG9uZUdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9DbG9uZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzg4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL0Nsb25lR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5Ob2RlR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VCb2R5RGVjbGFyYXRpb247CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CisKK3B1YmxpYyBjbGFzcyBDbG9uZUdlbmVyYXRvciBleHRlbmRzIE5vZGVHZW5lcmF0b3IgeworICAgIHB1YmxpYyBDbG9uZUdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVOb2RlKEJhc2VOb2RlTWV0YU1vZGVsIG5vZGVNZXRhTW9kZWwsIENvbXBpbGF0aW9uVW5pdCBub2RlQ3UsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlQ29pZCkgeworICAgICAgICBub2RlQ3UuYWRkSW1wb3J0KENsb25lVmlzaXRvci5jbGFzcyk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGNsb25lTWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJzZUJvZHlEZWNsYXJhdGlvbihmKAorICAgICAgICAgICAgICAgICJAT3ZlcnJpZGUgcHVibGljICVzIGNsb25lKCkgeyByZXR1cm4gKCVzKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsgfSIsCisgICAgICAgICAgICAgICAgbm9kZU1ldGFNb2RlbC5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSwKKyAgICAgICAgICAgICAgICBub2RlTWV0YU1vZGVsLmdldFR5cGVOYW1lR2VuZXJpZmllZCgpCisgICAgICAgICkpOworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgY2xvbmVNZXRob2QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvRmluYWxHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvRmluYWxHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZThjZWYyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9GaW5hbEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuTm9kZUdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworCitwdWJsaWMgY2xhc3MgRmluYWxHZW5lcmF0b3IgZXh0ZW5kcyBOb2RlR2VuZXJhdG9yIHsKKyAgICBwdWJsaWMgRmluYWxHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTm9kZShCYXNlTm9kZU1ldGFNb2RlbCBub2RlTWV0YU1vZGVsLCBDb21waWxhdGlvblVuaXQgbm9kZUN1LCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZUNvaWQpIHsKKyAgICAgICAgbm9kZUNvaWQuc2V0RmluYWwoIW5vZGVNZXRhTW9kZWwuaXNBYnN0cmFjdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL0dldE1ldGFNb2RlbEdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9HZXRNZXRhTW9kZWxHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjNTJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9HZXRNZXRhTW9kZWxHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5Ob2RlR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlQm9keURlY2xhcmF0aW9uOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCitwdWJsaWMgY2xhc3MgR2V0TWV0YU1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgTm9kZUdlbmVyYXRvciB7CisgICAgcHVibGljIEdldE1ldGFNb2RlbEdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVOb2RlKEJhc2VOb2RlTWV0YU1vZGVsIG5vZGVNZXRhTW9kZWwsIENvbXBpbGF0aW9uVW5pdCBub2RlQ3UsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlQ29pZCkgeworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBnZXRNZXRhTW9kZWxNZXRob2QgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHBhcnNlQm9keURlY2xhcmF0aW9uKGYoIiVzIHB1YmxpYyAlcyBnZXRNZXRhTW9kZWwoKSB7IHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLiVzOyB9IiwKKyAgICAgICAgICAgICAgICBub2RlTWV0YU1vZGVsLmlzUm9vdE5vZGUoKSA/ICIiIDogIkBPdmVycmlkZSIsCisgICAgICAgICAgICAgICAgbm9kZU1ldGFNb2RlbC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBub2RlTWV0YU1vZGVsLmdldE1ldGFNb2RlbEZpZWxkTmFtZSgpKSk7CisKKyAgICAgICAgYWRkT3JSZXBsYWNlV2hlblNhbWVTaWduYXR1cmUobm9kZUNvaWQsIGdldE1ldGFNb2RlbE1ldGhvZCk7CisgICAgICAgIG5vZGVDdS5hZGRJbXBvcnQobm9kZU1ldGFNb2RlbC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIG5vZGVDdS5hZGRJbXBvcnQoSmF2YVBhcnNlck1ldGFNb2RlbC5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3MTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5Ob2RlR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CisKK3B1YmxpYyBjbGFzcyBNYWluQ29uc3RydWN0b3JHZW5lcmF0b3IgZXh0ZW5kcyBOb2RlR2VuZXJhdG9yIHsKKyAgICBwdWJsaWMgTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU5vZGUoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCwgQ29tcGlsYXRpb25Vbml0IG5vZGVDdSwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkKSB7CisgICAgICAgIGlmIChub2RlTWV0YU1vZGVsLmlzKE5vZGUuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkKKyAgICAgICAgICAgICAgICAuc2V0UHVibGljKHRydWUpCisgICAgICAgICAgICAgICAgLnNldE5hbWUobm9kZUNvaWQuZ2V0TmFtZUFzU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmFkZFBhcmFtZXRlcihUb2tlblJhbmdlLmNsYXNzLCAidG9rZW5SYW5nZSIpCisgICAgICAgICAgICAgICAgLnNldEphdmFkb2NDb21tZW50KCJcbiAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLlxuICAgICAiKTsKKworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IGNvbnN0cnVjdG9yLmdldEJvZHkoKTsKKworICAgICAgICBTZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlciBzdXBlckNhbGwgPSBuZXcgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIoInN1cGVyKCIsICIsICIsICIpOyIpOworICAgICAgICBzdXBlckNhbGwuYXBwZW5kKCJ0b2tlblJhbmdlIik7CisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgcGFyYW1ldGVyIDogbm9kZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgY29uc3RydWN0b3IuYWRkUGFyYW1ldGVyKHBhcmFtZXRlci5nZXRUeXBlTmFtZUZvclNldHRlcigpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChub2RlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuY29udGFpbnMocGFyYW1ldGVyKSkgeworICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoIiVzKCVzKTsiLCBwYXJhbWV0ZXIuZ2V0U2V0dGVyTWV0aG9kTmFtZSgpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cGVyQ2FsbC5hcHBlbmQocGFyYW1ldGVyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5hZGRGaXJzdChwYXJzZUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChzdXBlckNhbGwudG9TdHJpbmcoKSkpOworCisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJjdXN0b21Jbml0aWFsaXphdGlvbigpOyIpOworCisgICAgICAgIGFkZE9yUmVwbGFjZVdoZW5TYW1lU2lnbmF0dXJlKG5vZGVDb2lkLCBjb25zdHJ1Y3Rvcik7CisgICAgICAgIG5vZGVDdS5hZGRJbXBvcnQoVG9rZW5SYW5nZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9Qcm9wZXJ0eUdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9Qcm9wZXJ0eUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL1Byb3BlcnR5R2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLk5vZGVHZW5lcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CYXNlTm9kZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlVHlwZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5GSU5BTDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5QVUJMSUM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5jYW1lbENhc2VUb1NjcmVhbWluZzsKKworcHVibGljIGNsYXNzIFByb3BlcnR5R2VuZXJhdG9yIGV4dGVuZHMgTm9kZUdlbmVyYXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb3BlcnR5TWV0YU1vZGVsPiBkZWNsYXJlZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQcm9wZXJ0eU1ldGFNb2RlbD4gZGVyaXZlZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBwdWJsaWMgUHJvcGVydHlHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTm9kZShCYXNlTm9kZU1ldGFNb2RlbCBub2RlTWV0YU1vZGVsLCBDb21waWxhdGlvblVuaXQgbm9kZUN1LCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZUNvaWQpIHsKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBwcm9wZXJ0eSA6IG5vZGVNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgZ2VuZXJhdGVHZXR0ZXIobm9kZU1ldGFNb2RlbCwgbm9kZUNvaWQsIHByb3BlcnR5KTsKKyAgICAgICAgICAgIGdlbmVyYXRlU2V0dGVyKG5vZGVNZXRhTW9kZWwsIG5vZGVDb2lkLCBwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZU1ldGFNb2RlbC5nZXREZXJpdmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuZm9yRWFjaChwIC0+IGRlcml2ZWRQcm9wZXJ0aWVzLnB1dChwLmdldE5hbWUoKSwgcCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVNldHRlcihCYXNlTm9kZU1ldGFNb2RlbCBub2RlTWV0YU1vZGVsLCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZUNvaWQsIFByb3BlcnR5TWV0YU1vZGVsIHByb3BlcnR5KSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOworICAgICAgICAvLyBGaWxsIGJvZHkKKyAgICAgICAgZmluYWwgU3RyaW5nIG9ic2VydmFibGVOYW1lID0gY2FtZWxDYXNlVG9TY3JlYW1pbmcobmFtZS5zdGFydHNXaXRoKCJpcyIpID8gbmFtZS5zdWJzdHJpbmcoMikgOiBuYW1lKTsKKyAgICAgICAgZGVjbGFyZWRQcm9wZXJ0aWVzLnB1dChvYnNlcnZhYmxlTmFtZSwgcHJvcGVydHkpOworCisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBKYXZhUGFyc2VyTWV0YU1vZGVsLm5vZGVNZXRhTW9kZWwuY29tbWVudFByb3BlcnR5TWV0YU1vZGVsKSB7CisgICAgICAgICAgICAvLyBOb2RlLmNvbW1lbnQgaGFzIGEgdmVyeSBzcGVjaWZpYyBzZXR0ZXIgdGhhdCB3ZSBzaG91bGRuJ3Qgb3ZlcndyaXRlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gc2V0dGVyID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKEVudW1TZXQub2YoUFVCTElDKSwgcGFyc2VUeXBlKHByb3BlcnR5LmdldENvbnRhaW5pbmdOb2RlTWV0YU1vZGVsKCkuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCkpLCBwcm9wZXJ0eS5nZXRTZXR0ZXJNZXRob2ROYW1lKCkpOworICAgICAgICBpZiAocHJvcGVydHkuZ2V0Q29udGFpbmluZ05vZGVNZXRhTW9kZWwoKS5oYXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICBzZXR0ZXIuc2V0VHlwZShwYXJzZVR5cGUoIlQiKSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0dGVyLmFkZEFuZEdldFBhcmFtZXRlcihwcm9wZXJ0eS5nZXRUeXBlTmFtZUZvclNldHRlcigpLCBwcm9wZXJ0eS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmFkZE1vZGlmaWVyKEZJTkFMKTsKKworICAgICAgICBmaW5hbCBCbG9ja1N0bXQgYm9keSA9IHNldHRlci5nZXRCb2R5KCkuZ2V0KCk7CisgICAgICAgIGJvZHkuZ2V0U3RhdGVtZW50cygpLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKHByb3BlcnR5LmlzUmVxdWlyZWQoKSkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSA9IHByb3BlcnR5LmdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc05vbkVtcHR5KCkgJiYgcHJvcGVydHkuaXNTaW5ndWxhcigpKSB7CisgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiYXNzZXJ0Tm9uRW1wdHkoJXMpOyIsIG5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBib29sZWFuLmNsYXNzICYmIHR5cGUgIT0gaW50LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiYXNzZXJ0Tm90TnVsbCglcyk7IiwgbmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoImlmICglcyA9PSB0aGlzLiVzKSB7IHJldHVybiAoJXMpIHRoaXM7IH0iLCBuYW1lLCBuYW1lLCBzZXR0ZXIuZ2V0VHlwZSgpKSk7CisKKyAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigibm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LiVzLCB0aGlzLiVzLCAlcyk7Iiwgb2JzZXJ2YWJsZU5hbWUsIG5hbWUsIG5hbWUpKTsKKyAgICAgICAgaWYgKHByb3BlcnR5LmlzTm9kZSgpKSB7CisgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJpZiAodGhpcy4lcyAhPSBudWxsKSB0aGlzLiVzLnNldFBhcmVudE5vZGUobnVsbCk7IiwgbmFtZSwgbmFtZSkpOworICAgICAgICB9CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoInRoaXMuJXMgPSAlczsiLCBuYW1lLCBuYW1lKSk7CisgICAgICAgIGlmIChwcm9wZXJ0eS5pc05vZGUoKSkgeworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigic2V0QXNQYXJlbnROb2RlT2YoJXMpOyIsIG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHkuZ2V0Q29udGFpbmluZ05vZGVNZXRhTW9kZWwoKS5oYXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJyZXR1cm4gKFQpIHRoaXM7IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigicmV0dXJuIHRoaXM7IikpOworICAgICAgICB9CisgICAgICAgIHJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgc2V0dGVyKTsKKyAgICAgICAgaWYgKHByb3BlcnR5LmdldENvbnRhaW5pbmdOb2RlTWV0YU1vZGVsKCkuaGFzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgYW5ub3RhdGVTdXBwcmVzc1dhcm5pbmdzKHNldHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVHZXR0ZXIoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkLCBQcm9wZXJ0eU1ldGFNb2RlbCBwcm9wZXJ0eSkgeworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBnZXR0ZXIgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oRW51bVNldC5vZihQVUJMSUMpLCBwYXJzZVR5cGUocHJvcGVydHkuZ2V0VHlwZU5hbWVGb3JHZXR0ZXIoKSksIHByb3BlcnR5LmdldEdldHRlck1ldGhvZE5hbWUoKSk7CisgICAgICAgIGZpbmFsIEJsb2NrU3RtdCBib2R5ID0gZ2V0dGVyLmdldEJvZHkoKS5nZXQoKTsKKyAgICAgICAgYm9keS5nZXRTdGF0ZW1lbnRzKCkuY2xlYXIoKTsKKyAgICAgICAgaWYgKHByb3BlcnR5LmlzT3B0aW9uYWwoKSkgeworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigicmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoJXMpOyIsIHByb3BlcnR5LmdldE5hbWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigicmV0dXJuICVzOyIsIHByb3BlcnR5LmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgZ2V0dGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVPYnNlcnZhYmxlUHJvcGVydHkoRW51bURlY2xhcmF0aW9uIG9ic2VydmFibGVQcm9wZXJ0eUVudW0sIFByb3BlcnR5TWV0YU1vZGVsIHByb3BlcnR5LCBib29sZWFuIGRlcml2ZWQpIHsKKyAgICAgICAgYm9vbGVhbiBpc0F0dHJpYnV0ZSA9ICFOb2RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocHJvcGVydHkuZ2V0VHlwZSgpKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBjb25zdGFudE5hbWUgPSBjYW1lbENhc2VUb1NjcmVhbWluZyhuYW1lLnN0YXJ0c1dpdGgoImlzIikgPyBuYW1lLnN1YnN0cmluZygyKSA6IG5hbWUpOworICAgICAgICBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiA9IG9ic2VydmFibGVQcm9wZXJ0eUVudW0uYWRkRW51bUNvbnN0YW50KGNvbnN0YW50TmFtZSk7CisgICAgICAgIGlmIChpc0F0dHJpYnV0ZSkgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzRW51bVNldCgpKSB7CisgICAgICAgICAgICAgICAgZW51bUNvbnN0YW50RGVjbGFyYXRpb24uYWRkQXJndW1lbnQoIlR5cGUuTVVMVElQTEVfQVRUUklCVVRFIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVudW1Db25zdGFudERlY2xhcmF0aW9uLmFkZEFyZ3VtZW50KCJUeXBlLlNJTkdMRV9BVFRSSUJVVEUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc05vZGVMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5hZGRBcmd1bWVudCgiVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW51bUNvbnN0YW50RGVjbGFyYXRpb24uYWRkQXJndW1lbnQoIlR5cGUuU0lOR0xFX1JFRkVSRU5DRSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXJpdmVkKSB7CisgICAgICAgICAgICBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5hZGRBcmd1bWVudCgidHJ1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IG9ic2VydmFibGVQcm9wZXJ0eUN1ID0gc291cmNlUm9vdC50cnlUb1BhcnNlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyIiwgIk9ic2VydmFibGVQcm9wZXJ0eS5qYXZhIikuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgICAgIEVudW1EZWNsYXJhdGlvbiBvYnNlcnZhYmxlUHJvcGVydHlFbnVtID0gb2JzZXJ2YWJsZVByb3BlcnR5Q3UuZ2V0RW51bUJ5TmFtZSgiT2JzZXJ2YWJsZVByb3BlcnR5IikuZ2V0KCk7CisgICAgICAgIG9ic2VydmFibGVQcm9wZXJ0eUVudW0uZ2V0RW50cmllcygpLmNsZWFyKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBvYnNlcnZhYmxlUHJvcGVydHlOYW1lcyA9IG5ldyBMaW5rZWRMaXN0PD4oZGVjbGFyZWRQcm9wZXJ0aWVzLmtleVNldCgpKTsKKyAgICAgICAgb2JzZXJ2YWJsZVByb3BlcnR5TmFtZXMuc29ydChTdHJpbmc6OmNvbXBhcmVUbyk7CisgICAgICAgIGZvciAoU3RyaW5nIHByb3BOYW1lIDogb2JzZXJ2YWJsZVByb3BlcnR5TmFtZXMpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlT2JzZXJ2YWJsZVByb3BlcnR5KG9ic2VydmFibGVQcm9wZXJ0eUVudW0sIGRlY2xhcmVkUHJvcGVydGllcy5nZXQocHJvcE5hbWUpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxTdHJpbmc+IGRlcml2ZWRQcm9wZXJ0eU5hbWVzID0gbmV3IExpbmtlZExpc3Q8PihkZXJpdmVkUHJvcGVydGllcy5rZXlTZXQoKSk7CisgICAgICAgIGRlcml2ZWRQcm9wZXJ0eU5hbWVzLnNvcnQoU3RyaW5nOjpjb21wYXJlVG8pOworICAgICAgICBmb3IgKFN0cmluZyBwcm9wTmFtZSA6IGRlcml2ZWRQcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgICAgICBnZW5lcmF0ZU9ic2VydmFibGVQcm9wZXJ0eShvYnNlcnZhYmxlUHJvcGVydHlFbnVtLCBkZXJpdmVkUHJvcGVydGllcy5nZXQocHJvcE5hbWUpLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBvYnNlcnZhYmxlUHJvcGVydHlFbnVtLmFkZEVudW1Db25zdGFudCgiUkFOR0UiKTsKKyAgICAgICAgb2JzZXJ2YWJsZVByb3BlcnR5RW51bS5hZGRFbnVtQ29uc3RhbnQoIkNPTU1FTlRFRF9OT0RFIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9SZW1vdmVNZXRob2RHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvUmVtb3ZlTWV0aG9kR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkNTg5OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL25vZGUvUmVtb3ZlTWV0aG9kR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuTm9kZUdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmNhcGl0YWxpemU7CisKKworcHVibGljIGNsYXNzIFJlbW92ZU1ldGhvZEdlbmVyYXRvciBleHRlbmRzIE5vZGVHZW5lcmF0b3IgeworICAgIHB1YmxpYyBSZW1vdmVNZXRob2RHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTm9kZShCYXNlTm9kZU1ldGFNb2RlbCBub2RlTWV0YU1vZGVsLCBDb21waWxhdGlvblVuaXQgbm9kZUN1LCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZUNvaWQpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gcmVtb3ZlTm9kZU1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyc2VCb2R5RGVjbGFyYXRpb24oInB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHt9Iik7CisgICAgICAgIG5vZGVDdS5hZGRJbXBvcnQoTm9kZS5jbGFzcyk7CisgICAgICAgIG5vZGVNZXRhTW9kZWwuZ2V0U3VwZXJOb2RlTWV0YU1vZGVsKCkuaWZQcmVzZW50KHMgLT4gYW5ub3RhdGVPdmVycmlkZGVuKHJlbW92ZU5vZGVNZXRob2QpKTsKKworICAgICAgICBmaW5hbCBCbG9ja1N0bXQgYm9keSA9IHJlbW92ZU5vZGVNZXRob2QuZ2V0Qm9keSgpLmdldCgpOworCisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Iik7CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBwcm9wZXJ0eSA6IG5vZGVNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5pc05vZGUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGNoZWNrOworICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzTm9kZUxpc3QoKSkgeworICAgICAgICAgICAgICAgIGNoZWNrID0gbm9kZUxpc3RDaGVjayhwcm9wZXJ0eSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdmVBdHRyaWJ1dGVNZXRob2ROYW1lID0gZ2VuZXJhdGVSZW1vdmVNZXRob2RGb3JBdHRyaWJ1dGUobm9kZUNvaWQsIG5vZGVNZXRhTW9kZWwsIHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICBjaGVjayA9IGF0dHJpYnV0ZUNoZWNrKHByb3BlcnR5LCByZW1vdmVBdHRyaWJ1dGVNZXRob2ROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc09wdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICBjaGVjayA9IGYoImlmICglcyAhPSBudWxsKSB7ICVzIH0iLCBwcm9wZXJ0eS5nZXROYW1lKCksIGNoZWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGNoZWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZU1ldGFNb2RlbC5nZXRTdXBlck5vZGVNZXRhTW9kZWwoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoInJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudCgicmV0dXJuIGZhbHNlOyIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgcmVtb3ZlTm9kZU1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlQ2hlY2soUHJvcGVydHlNZXRhTW9kZWwgcHJvcGVydHksIFN0cmluZyByZW1vdmVBdHRyaWJ1dGVNZXRob2ROYW1lKSB7CisgICAgICAgIHJldHVybiBmKCJpZiAobm9kZSA9PSAlcykgeyIgKworICAgICAgICAgICAgICAgICIgICAgJXMoKTsiICsKKyAgICAgICAgICAgICAgICAiICAgIHJldHVybiB0cnVlO1xuIiArCisgICAgICAgICAgICAgICAgIn0iLCBwcm9wZXJ0eS5nZXROYW1lKCksIHJlbW92ZUF0dHJpYnV0ZU1ldGhvZE5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMaXN0Q2hlY2soUHJvcGVydHlNZXRhTW9kZWwgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIGYoImZvciAoaW50IGkgPSAwOyBpIDwgJXMuc2l6ZSgpOyBpKyspIHsiICsKKyAgICAgICAgICAgICAgICAiICBpZiAoJXMuZ2V0KGkpID09IG5vZGUpIHsiICsKKyAgICAgICAgICAgICAgICAiICAgICVzLnJlbW92ZShpKTsiICsKKyAgICAgICAgICAgICAgICAiICAgIHJldHVybiB0cnVlOyIgKworICAgICAgICAgICAgICAgICIgIH0iICsKKyAgICAgICAgICAgICAgICAifSIsIHByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXROYW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlUmVtb3ZlTWV0aG9kRm9yQXR0cmlidXRlKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlQ29pZCwgQmFzZU5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCwgUHJvcGVydHlNZXRhTW9kZWwgcHJvcGVydHkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUgPSAicmVtb3ZlIiArIGNhcGl0YWxpemUocHJvcGVydHkuZ2V0TmFtZSgpKTsKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gcmVtb3ZlTWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJzZUJvZHlEZWNsYXJhdGlvbihmKCJwdWJsaWMgJXMgJXMoKSB7fSIsIG5vZGVNZXRhTW9kZWwuZ2V0VHlwZU5hbWUoKSwgbWV0aG9kTmFtZSkpOworCisgICAgICAgIGZpbmFsIEJsb2NrU3RtdCBibG9jayA9IHJlbW92ZU1ldGhvZC5nZXRCb2R5KCkuZ2V0KCk7CisgICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudChmKCJyZXR1cm4gJXMoKCVzKSBudWxsKTsiLCBwcm9wZXJ0eS5nZXRTZXR0ZXJNZXRob2ROYW1lKCksIHByb3BlcnR5LmdldFR5cGVOYW1lRm9yU2V0dGVyKCkpKTsKKworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgcmVtb3ZlTWV0aG9kKTsKKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9SZXBsYWNlTWV0aG9kR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL1JlcGxhY2VNZXRob2RHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWY5ZDNmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9SZXBsYWNlTWV0aG9kR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuTm9kZUdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VCb2R5RGVjbGFyYXRpb247CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5jYXBpdGFsaXplOworCitwdWJsaWMgY2xhc3MgUmVwbGFjZU1ldGhvZEdlbmVyYXRvciBleHRlbmRzIE5vZGVHZW5lcmF0b3IgeworICAgIHB1YmxpYyBSZXBsYWNlTWV0aG9kR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU5vZGUoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCwgQ29tcGlsYXRpb25Vbml0IG5vZGVDdSwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIHJlcGxhY2VOb2RlTWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJzZUJvZHlEZWNsYXJhdGlvbigicHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7fSIpOworICAgICAgICBub2RlQ3UuYWRkSW1wb3J0KE5vZGUuY2xhc3MpOworICAgICAgICBub2RlTWV0YU1vZGVsLmdldFN1cGVyTm9kZU1ldGFNb2RlbCgpLmlmUHJlc2VudChzIC0+IGFubm90YXRlT3ZlcnJpZGRlbihyZXBsYWNlTm9kZU1ldGhvZCkpOworCisgICAgICAgIGZpbmFsIEJsb2NrU3RtdCBib2R5ID0gcmVwbGFjZU5vZGVNZXRob2QuZ2V0Qm9keSgpLmdldCgpOworCisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJpZiAobm9kZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Iik7CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBwcm9wZXJ0eSA6IG5vZGVNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5pc05vZGUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGNoZWNrOworICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzTm9kZUxpc3QoKSkgeworICAgICAgICAgICAgICAgIGNoZWNrID0gbm9kZUxpc3RDaGVjayhwcm9wZXJ0eSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoZWNrID0gYXR0cmlidXRlQ2hlY2socHJvcGVydHksIHByb3BlcnR5LmdldFNldHRlck1ldGhvZE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJvcGVydHkuaXNPcHRpb25hbCgpKSB7CisgICAgICAgICAgICAgICAgY2hlY2sgPSBmKCJpZiAoJXMgIT0gbnVsbCkgeyAlcyB9IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCBjaGVjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChjaGVjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGVNZXRhTW9kZWwuZ2V0U3VwZXJOb2RlTWV0YU1vZGVsKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJyZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoInJldHVybiBmYWxzZTsiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYWRkT3JSZXBsYWNlV2hlblNhbWVTaWduYXR1cmUobm9kZUNvaWQsIHJlcGxhY2VOb2RlTWV0aG9kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVDaGVjayhQcm9wZXJ0eU1ldGFNb2RlbCBwcm9wZXJ0eSwgU3RyaW5nIGF0dHJpYnV0ZVNldHRlck5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGYoImlmIChub2RlID09ICVzKSB7IiArCisgICAgICAgICAgICAgICAgIiAgICAlcygoJXMpIHJlcGxhY2VtZW50Tm9kZSk7IiArCisgICAgICAgICAgICAgICAgIiAgICByZXR1cm4gdHJ1ZTtcbiIgKworICAgICAgICAgICAgICAgICJ9IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCBhdHRyaWJ1dGVTZXR0ZXJOYW1lLCBwcm9wZXJ0eS5nZXRUeXBlTmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBub2RlTGlzdENoZWNrKFByb3BlcnR5TWV0YU1vZGVsIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBmKCJmb3IgKGludCBpID0gMDsgaSA8ICVzLnNpemUoKTsgaSsrKSB7IiArCisgICAgICAgICAgICAgICAgIiAgaWYgKCVzLmdldChpKSA9PSBub2RlKSB7IiArCisgICAgICAgICAgICAgICAgIiAgICAlcy5zZXQoaSwgKCVzKSByZXBsYWNlbWVudE5vZGUpOyIgKworICAgICAgICAgICAgICAgICIgICAgcmV0dXJuIHRydWU7IiArCisgICAgICAgICAgICAgICAgIiAgfSIgKworICAgICAgICAgICAgICAgICJ9IiwgcHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0VHlwZU5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9UeXBlQ2FzdGluZ0dlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvbm9kZS9UeXBlQ2FzdGluZ0dlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjExZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9ub2RlL1R5cGVDYXN0aW5nR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw5NyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuTm9kZUdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUGFpcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLnNldDsKKworcHVibGljIGNsYXNzIFR5cGVDYXN0aW5nR2VuZXJhdG9yIGV4dGVuZHMgTm9kZUdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QmFzZU5vZGVNZXRhTW9kZWw+IGJhc2VOb2RlcyA9IHNldCgKKyAgICAgICAgICAgIEphdmFQYXJzZXJNZXRhTW9kZWwuc3RhdGVtZW50TWV0YU1vZGVsLAorICAgICAgICAgICAgSmF2YVBhcnNlck1ldGFNb2RlbC5leHByZXNzaW9uTWV0YU1vZGVsLAorICAgICAgICAgICAgSmF2YVBhcnNlck1ldGFNb2RlbC50eXBlTWV0YU1vZGVsLAorICAgICAgICAgICAgSmF2YVBhcnNlck1ldGFNb2RlbC5tb2R1bGVTdG10TWV0YU1vZGVsLAorICAgICAgICAgICAgSmF2YVBhcnNlck1ldGFNb2RlbC5ib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwsCisgICAgICAgICAgICBKYXZhUGFyc2VyTWV0YU1vZGVsLmNvbW1lbnRNZXRhTW9kZWwKKyAgICApOworCisgICAgcHVibGljIFR5cGVDYXN0aW5nR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU5vZGUoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCwgQ29tcGlsYXRpb25Vbml0IG5vZGVDdSwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFpcjxDb21waWxhdGlvblVuaXQsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gYmFzZUNvZGUgPSBudWxsOworICAgICAgICBmb3IgKEJhc2VOb2RlTWV0YU1vZGVsIGJhc2VOb2RlIDogYmFzZU5vZGVzKSB7CisgICAgICAgICAgICBpZihub2RlTWV0YU1vZGVsID09IGJhc2VOb2RlKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYWRqdXN0IHRoZSBiYXNlIG1vZGVscyBmcm9tIHRoZSBjaGlsZCBub2RlcywKKyAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBkbyBhbnl0aGluZyB3aGVuIHdlICphcmUqIHRoZSBiYXNlIG1vZGVsLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2RlTWV0YU1vZGVsLmlzSW5zdGFuY2VPZk1ldGFNb2RlbChiYXNlTm9kZSkpIHsKKyAgICAgICAgICAgICAgICBiYXNlQ29kZSA9IHBhcnNlTm9kZShiYXNlTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmFzZUNvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTm9kZSBpcyBub3QgYSBjaGlsZCBvZiBvbmUgb2YgdGhlIGJhc2Ugbm9kZXMsIHNvIHdlIGRvbid0IHdhbnQgdG8gZ2VuZXJhdGUgdGhpcyBtZXRob2QgZm9yIGl0LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gbm9kZU1ldGFNb2RlbC5nZXRUeXBlTmFtZSgpOworICAgICAgICBmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYmFzZUNvaWQgPSBiYXNlQ29kZS5iOworICAgICAgICBmaW5hbCBDb21waWxhdGlvblVuaXQgYmFzZUN1ID0gYmFzZUNvZGUuYTsKKyAgICAgICAgCisgICAgICAgIGdlbmVyYXRlSXNUeXBlKGJhc2VDdSwgbm9kZUNvaWQsIGJhc2VDb2lkLCB0eXBlTmFtZSk7CisgICAgICAgIGdlbmVyYXRlQXNUeXBlKGJhc2VDdSwgbm9kZUNvaWQsIGJhc2VDb2lkLCB0eXBlTmFtZSk7CisgICAgICAgIGdlbmVyYXRlVG9UeXBlKG5vZGVDdSwgYmFzZUN1LCBub2RlQ29pZCwgYmFzZUNvaWQsIHR5cGVOYW1lKTsKKyAgICAgICAgZ2VuZXJhdGVJZlR5cGUobm9kZUN1LCBiYXNlQ3UsIG5vZGVDb2lkLCBiYXNlQ29pZCwgdHlwZU5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUFzVHlwZShDb21waWxhdGlvblVuaXQgYmFzZUN1LCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZUNvaWQsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBiYXNlQ29pZCwgU3RyaW5nIHR5cGVOYW1lKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIGFzVHlwZUJhc2VNZXRob2QgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHBhcnNlQm9keURlY2xhcmF0aW9uKGYoInB1YmxpYyAlcyBhcyVzKCkgeyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoXCIlJXMgaXMgbm90IGFuICVzXCIsIHRoaXMpKTsgfSIsIHR5cGVOYW1lLCB0eXBlTmFtZSwgdHlwZU5hbWUpKTsKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gYXNUeXBlTm9kZU1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyc2VCb2R5RGVjbGFyYXRpb24oZigiQE92ZXJyaWRlIHB1YmxpYyAlcyBhcyVzKCkgeyByZXR1cm4gdGhpczsgfSIsIHR5cGVOYW1lLCB0eXBlTmFtZSkpOworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShiYXNlQ29pZCwgYXNUeXBlQmFzZU1ldGhvZCk7CisgICAgICAgIGFkZE9yUmVwbGFjZVdoZW5TYW1lU2lnbmF0dXJlKG5vZGVDb2lkLCBhc1R5cGVOb2RlTWV0aG9kKTsKKyAgICAgICAgYmFzZUN1LmFkZEltcG9ydCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZiIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUb1R5cGUoQ29tcGlsYXRpb25Vbml0IG5vZGVDdSwgQ29tcGlsYXRpb25Vbml0IGJhc2VDdSwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkLCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYmFzZUNvaWQsIFN0cmluZyB0eXBlTmFtZSkgeworICAgICAgICBiYXNlQ3UuYWRkSW1wb3J0KE9wdGlvbmFsLmNsYXNzKTsKKyAgICAgICAgbm9kZUN1LmFkZEltcG9ydChPcHRpb25hbC5jbGFzcyk7CisgICAgICAgIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIGFzVHlwZUJhc2VNZXRob2QgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHBhcnNlQm9keURlY2xhcmF0aW9uKGYoInB1YmxpYyBPcHRpb25hbDwlcz4gdG8lcygpIHsgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7IH0iLCB0eXBlTmFtZSwgdHlwZU5hbWUsIHR5cGVOYW1lKSk7CisgICAgICAgIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIGFzVHlwZU5vZGVNZXRob2QgPSAoTWV0aG9kRGVjbGFyYXRpb24pIHBhcnNlQm9keURlY2xhcmF0aW9uKGYoIkBPdmVycmlkZSBwdWJsaWMgT3B0aW9uYWw8JXM+IHRvJXMoKSB7IHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsgfSIsIHR5cGVOYW1lLCB0eXBlTmFtZSkpOworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShiYXNlQ29pZCwgYXNUeXBlQmFzZU1ldGhvZCk7CisgICAgICAgIGFkZE9yUmVwbGFjZVdoZW5TYW1lU2lnbmF0dXJlKG5vZGVDb2lkLCBhc1R5cGVOb2RlTWV0aG9kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVJZlR5cGUoQ29tcGlsYXRpb25Vbml0IG5vZGVDdSwgQ29tcGlsYXRpb25Vbml0IGJhc2VDdSwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVDb2lkLCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYmFzZUNvaWQsIFN0cmluZyB0eXBlTmFtZSkgeworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBpZlR5cGVCYXNlTWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJzZUJvZHlEZWNsYXJhdGlvbihmKCJwdWJsaWMgdm9pZCBpZiVzKENvbnN1bWVyPCVzPiBhY3Rpb24pIHsgfSIsIHR5cGVOYW1lLCB0eXBlTmFtZSkpOworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBpZlR5cGVOb2RlTWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJzZUJvZHlEZWNsYXJhdGlvbihmKCJwdWJsaWMgdm9pZCBpZiVzKENvbnN1bWVyPCVzPiBhY3Rpb24pIHsgYWN0aW9uLmFjY2VwdCh0aGlzKTsgfSIsIHR5cGVOYW1lLCB0eXBlTmFtZSkpOworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShiYXNlQ29pZCwgaWZUeXBlQmFzZU1ldGhvZCk7CisgICAgICAgIGFkZE9yUmVwbGFjZVdoZW5TYW1lU2lnbmF0dXJlKG5vZGVDb2lkLCBpZlR5cGVOb2RlTWV0aG9kKTsKKworICAgICAgICBiYXNlQ3UuYWRkSW1wb3J0KENvbnN1bWVyLmNsYXNzKTsKKyAgICAgICAgbm9kZUN1LmFkZEltcG9ydChDb25zdW1lci5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSXNUeXBlKENvbXBpbGF0aW9uVW5pdCBiYXNlQ3UsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlQ29pZCwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGJhc2VDb2lkLCBTdHJpbmcgdHlwZU5hbWUpIHsKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gYmFzZUlzVHlwZU1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyc2VCb2R5RGVjbGFyYXRpb24oZigicHVibGljIGJvb2xlYW4gaXMlcygpIHsgcmV0dXJuIGZhbHNlOyB9IiwgdHlwZU5hbWUpKTsKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gb3ZlcnJpZGRlbklzVHlwZU1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyc2VCb2R5RGVjbGFyYXRpb24oZigiQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIGlzJXMoKSB7IHJldHVybiB0cnVlOyB9IiwgdHlwZU5hbWUpKTsKKworICAgICAgICBhZGRPclJlcGxhY2VXaGVuU2FtZVNpZ25hdHVyZShub2RlQ29pZCwgb3ZlcnJpZGRlbklzVHlwZU1ldGhvZCk7CisgICAgICAgIGFkZE9yUmVwbGFjZVdoZW5TYW1lU2lnbmF0dXJlKGJhc2VDb2lkLCBiYXNlSXNUeXBlTWV0aG9kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9vdGhlci9HcmFtbWFyTGV0dGVyR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9vdGhlci9HcmFtbWFyTGV0dGVyR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MGJjNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL290aGVyL0dyYW1tYXJMZXR0ZXJHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5vdGhlcjsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworLyoqCisgKiBQcmludHMgdGhlIExFVFRFUiBhbmQgUEFSVF9MRVRURVIgdG9rZW5zLiBUaGV5IHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBncmFtbWFyIG1hbnVhbGx5LgorICovCitwdWJsaWMgY2xhc3MgR3JhbW1hckxldHRlckdlbmVyYXRvciB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBnZW5lcmF0ZSgiTEVUVEVSIiwgYyAtPiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpIHx8IENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoKGNoYXIpIChpbnQpIGMpIHx8IENoYXJhY3Rlci5pc0xvd1N1cnJvZ2F0ZSgoY2hhcikgKGludCkgYykpOworICAgICAgICBnZW5lcmF0ZSgiUEFSVF9MRVRURVIiLCBjIC0+IENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSB8fCBDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKChjaGFyKSAoaW50KSBjKSB8fCBDaGFyYWN0ZXIuaXNMb3dTdXJyb2dhdGUoKGNoYXIpIChpbnQpIGMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFN0cmluZyB0b2tlbk5hbWUsIEZ1bmN0aW9uPEludGVnZXIsIEJvb2xlYW4+IGYpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluZGVudCA9ICIgICAgICAgICAiOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgPCAjIiArIHRva2VuTmFtZSArICI6IFsiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludChpbmRlbnQpOworICAgICAgICBpbnQgbmx0aW1lID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IDB4MTAwMDApIHsKKyAgICAgICAgICAgIHdoaWxlICghZi5hcHBseShpKSAmJiBpIDwgMHgxMDAwMCkgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBzdGFydCA9IGZvcm1hdChpKTsKKyAgICAgICAgICAgIHdoaWxlIChmLmFwcGx5KGkpICYmIGkgPCAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGVuZCA9IGZvcm1hdChpIC0gMSk7CisgICAgICAgICAgICBpZiAoaSA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhcnQuZXF1YWxzKGVuZCkpIHsKKyAgICAgICAgICAgICAgICBubHRpbWUrKzsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHN0YXJ0ICsgIiwgICIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBubHRpbWUgKz0gMjsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHN0YXJ0ICsgIi0iICsgZW5kICsgIiwgICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5sdGltZSA+PSAxMCkgeworICAgICAgICAgICAgICAgIG5sdGltZSA9IDA7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChpbmRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRvbyBsYXp5IHRvIHJlbW92ZSB0aGUgZmluYWwgaWxsZWdhbCBjb21tYS4KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJdIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICA+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChpbnQgaSkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiXCJcXHUlMDR4XCIiLCBpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9vdGhlci9Ub2tlbktpbmRHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL290aGVyL1Rva2VuS2luZEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODhiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS9vdGhlci9Ub2tlbktpbmRHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5vdGhlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5HZW5lcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkxvZzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIFRva2VuS2luZCBlbnVtIGZyb20ge0BsaW5rIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzfQorICovCitwdWJsaWMgY2xhc3MgVG9rZW5LaW5kR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKKyAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVJvb3QgZ2VuZXJhdGVkSmF2YUNjU291cmNlUm9vdDsKKworICAgIHB1YmxpYyBUb2tlbktpbmRHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290LCBTb3VyY2VSb290IGdlbmVyYXRlZEphdmFDY1NvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCk7CisgICAgICAgIHRoaXMuZ2VuZXJhdGVkSmF2YUNjU291cmNlUm9vdCA9IGdlbmVyYXRlZEphdmFDY1NvdXJjZVJvb3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB7CisgICAgICAgIExvZy5pbmZvKCJSdW5uaW5nICVzIiwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAKKyAgICAgICAgZmluYWwgQ29tcGlsYXRpb25Vbml0IGphdmFUb2tlbkN1ID0gc291cmNlUm9vdC5wYXJzZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyIiwgIkphdmFUb2tlbi5qYXZhIik7CisgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBqYXZhVG9rZW4gPSBqYXZhVG9rZW5DdS5nZXRDbGFzc0J5TmFtZSgiSmF2YVRva2VuIikub3JFbHNlVGhyb3coKCkgLT4gbmV3IEFzc2VydGlvbkVycm9yKCJDYW4ndCBmaW5kIGNsYXNzIGluIGphdmEgZmlsZS4iKSk7CisgICAgICAgIGZpbmFsIEVudW1EZWNsYXJhdGlvbiBraW5kRW51bSA9IGphdmFUb2tlbi5maW5kRmlyc3QoRW51bURlY2xhcmF0aW9uLmNsYXNzLCBlIC0+IGUuZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKCJLaW5kIikpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBBc3NlcnRpb25FcnJvcigiQ2FuJ3QgZmluZCBjbGFzcyBpbiBqYXZhIGZpbGUuIikpOworCisgICAgICAgIGtpbmRFbnVtLmdldEVudHJpZXMoKS5jbGVhcigpOworICAgICAgICBhbm5vdGF0ZUdlbmVyYXRlZChraW5kRW51bSk7CisKKyAgICAgICAgZmluYWwgU3dpdGNoU3RtdCB2YWx1ZU9mU3dpdGNoID0ga2luZEVudW0uZmluZEZpcnN0KFN3aXRjaFN0bXQuY2xhc3MpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBBc3NlcnRpb25FcnJvcigiQ2FuJ3QgZmluZCB2YWx1ZU9mIHN3aXRjaC4iKSk7CisgICAgICAgIHZhbHVlT2ZTd2l0Y2guZmluZEFsbChTd2l0Y2hFbnRyeVN0bXQuY2xhc3MpLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuZ2V0TGFiZWwoKS5pc1ByZXNlbnQoKSkuZm9yRWFjaChOb2RlOjpyZW1vdmUpOworCisgICAgICAgIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBjb25zdGFudHNDdSA9IGdlbmVyYXRlZEphdmFDY1NvdXJjZVJvb3QucGFyc2UoImNvbS5naXRodWIuamF2YXBhcnNlciIsICJHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLmphdmEiKTsKKyAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNvbnN0YW50cyA9IGNvbnN0YW50c0N1LmdldEludGVyZmFjZUJ5TmFtZSgiR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cyIpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBBc3NlcnRpb25FcnJvcigiQ2FuJ3QgZmluZCBjbGFzcyBpbiBqYXZhIGZpbGUuIikpOworICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBjb25zdGFudHMuZ2V0TWVtYmVycygpKSB7CisgICAgICAgICAgICBtZW1iZXIudG9GaWVsZERlY2xhcmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmaWVsZCAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YWRvYyA9IGZpZWxkLmdldEphdmFkb2NDb21tZW50KCkuZ2V0KCkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGphdmFkb2MuY29udGFpbnMoIlJlZ3VsYXJFeHByZXNzaW9uIElkIikgfHwgamF2YWRvYy5jb250YWlucygiRW5kIG9mIEZpbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChmaWVsZCAtPiBmaWVsZC5nZXRWYXJpYWJsZSgwKSkKKyAgICAgICAgICAgICAgICAgICAgLmlmUHJlc2VudCh2YXIgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB2YXIuZ2V0TmFtZUFzU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIga2luZCA9IHZhci5nZXRJbml0aWFsaXplcigpLmdldCgpLmFzSW50ZWdlckxpdGVyYWxFeHByKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUVudW1FbnRyeShraW5kRW51bSwgbmFtZSwga2luZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVZhbHVlT2ZFbnRyeSh2YWx1ZU9mU3dpdGNoLCBuYW1lLCBraW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVWYWx1ZU9mRW50cnkoU3dpdGNoU3RtdCB2YWx1ZU9mU3dpdGNoLCBTdHJpbmcgbmFtZSwgSW50ZWdlckxpdGVyYWxFeHByIGtpbmQpIHsKKyAgICAgICAgZmluYWwgU3dpdGNoRW50cnlTdG10IGVudHJ5ID0gbmV3IFN3aXRjaEVudHJ5U3RtdChraW5kLCBuZXcgTm9kZUxpc3Q8PihuZXcgUmV0dXJuU3RtdChuYW1lKSkpOworICAgICAgICB2YWx1ZU9mU3dpdGNoLmdldEVudHJpZXMoKS5hZGRGaXJzdChlbnRyeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRW51bUVudHJ5KEVudW1EZWNsYXJhdGlvbiBraW5kRW51bSwgU3RyaW5nIG5hbWUsIEludGVnZXJMaXRlcmFsRXhwciBraW5kKSB7CisgICAgICAgIGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1FbnRyeSA9IG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihuYW1lKTsKKyAgICAgICAgZW51bUVudHJ5LmdldEFyZ3VtZW50cygpLmFkZChraW5kKTsKKyAgICAgICAga2luZEVudW0uYWRkRW50cnkoZW51bUVudHJ5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0Nsb25lVmlzaXRvckdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9DbG9uZVZpc2l0b3JHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE3ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9DbG9uZVZpc2l0b3JHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5TZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKKworLyoqCisgKiBHZW5lcmF0ZXMgSmF2YVBhcnNlcidzIENsb25lVmlzaXRvci4KKyAqLworcHVibGljIGNsYXNzIENsb25lVmlzaXRvckdlbmVyYXRvciBleHRlbmRzIFZpc2l0b3JHZW5lcmF0b3IgeworICAgIHB1YmxpYyBDbG9uZVZpc2l0b3JHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IiLCAiQ2xvbmVWaXNpdG9yIiwgIlZpc2l0YWJsZSIsICJPYmplY3QiLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVZpc2l0TWV0aG9kQm9keShCYXNlTm9kZU1ldGFNb2RlbCBub2RlLCBNZXRob2REZWNsYXJhdGlvbiB2aXNpdE1ldGhvZCwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgeworICAgICAgICB2aXNpdE1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHAuc2V0RmluYWwodHJ1ZSkpOworCisgICAgICAgIEJsb2NrU3RtdCBib2R5ID0gdmlzaXRNZXRob2QuZ2V0Qm9keSgpLmdldCgpOworICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOworCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgZmllbGQgOiBub2RlLmdldEFsbFByb3BlcnR5TWV0YU1vZGVscygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0dGVyID0gZmllbGQuZ2V0R2V0dGVyTWV0aG9kTmFtZSgpICsgIigpIjsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROb2RlUmVmZXJlbmNlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNPcHRpb25hbCgpICYmIGZpZWxkLmlzTm9kZUxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJOb2RlTGlzdDwlcz4gJXMgPSBjbG9uZUxpc3Qobi4lcy5vckVsc2UobnVsbCksIGFyZyk7IiwgZmllbGQuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCksIGZpZWxkLmdldE5hbWUoKSwgZ2V0dGVyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5pc05vZGVMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiTm9kZUxpc3Q8JXM+ICVzID0gY2xvbmVMaXN0KG4uJXMsIGFyZyk7IiwgZmllbGQuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCksIGZpZWxkLmdldE5hbWUoKSwgZ2V0dGVyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiJXMgJXMgPSBjbG9uZU5vZGUobi4lcywgYXJnKTsiLCBmaWVsZC5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSwgZmllbGQuZ2V0TmFtZSgpLCBnZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFNlcGFyYXRlZEl0ZW1TdHJpbmdCdWlsZGVyKGYoIiVzIHIgPSBuZXcgJXMoIiwgbm9kZS5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSwgbm9kZS5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSksICIsIiwgIik7Iik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCkiKTsKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBmaWVsZCA6IG5vZGUuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKCJjb21tZW50IikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROb2RlUmVmZXJlbmNlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmaWVsZC5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChmKCJuLiVzKCkiLCBmaWVsZC5nZXRHZXR0ZXJNZXRob2ROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJyLnNldENvbW1lbnQoY29tbWVudCk7Iik7CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJyZXR1cm4gcjsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0VxdWFsc1Zpc2l0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvRXF1YWxzVmlzaXRvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTdmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0VxdWFsc1Zpc2l0b3JHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCisvKioKKyAqIEdlbmVyYXRlcyBKYXZhUGFyc2VyJ3MgRXF1YWxzVmlzaXRvci4KKyAqLworcHVibGljIGNsYXNzIEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IgZXh0ZW5kcyBWaXNpdG9yR2VuZXJhdG9yIHsKKyAgICBwdWJsaWMgRXF1YWxzVmlzaXRvckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJFcXVhbHNWaXNpdG9yIiwgIkJvb2xlYW4iLCAiVmlzaXRhYmxlIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVWaXNpdE1ldGhvZEJvZHkoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZSwgTWV0aG9kRGVjbGFyYXRpb24gdmlzaXRNZXRob2QsIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgdmlzaXRNZXRob2QuZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLnNldEZpbmFsKHRydWUpKTsKKworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IHZpc2l0TWV0aG9kLmdldEJvZHkoKS5nZXQoKTsKKyAgICAgICAgYm9keS5nZXRTdGF0ZW1lbnRzKCkuY2xlYXIoKTsKKworICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJmaW5hbCAlcyBuMiA9ICglcykgYXJnOyIsIG5vZGUuZ2V0VHlwZU5hbWUoKSwgbm9kZS5nZXRUeXBlTmFtZSgpKSk7CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBmaWVsZCA6IG5vZGUuZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnZXR0ZXIgPSBmaWVsZC5nZXRHZXR0ZXJNZXRob2ROYW1lKCkgKyAiKCkiOworICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5vZGVSZWZlcmVuY2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc05vZGVMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiaWYgKCFub2Rlc0VxdWFscyhuLiVzLCBuMi4lcykpIHJldHVybiBmYWxzZTsiLCBnZXR0ZXIsIGdldHRlcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoImlmICghbm9kZUVxdWFscyhuLiVzLCBuMi4lcykpIHJldHVybiBmYWxzZTsiLCBnZXR0ZXIsIGdldHRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiaWYgKCFvYmpFcXVhbHMobi4lcywgbjIuJXMpKSByZXR1cm4gZmFsc2U7IiwgZ2V0dGVyLCBnZXR0ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYm9keS5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgdGhlIGNhc3QgbGluZSB3YXMgYWRkZWQsIGJ1dCBub3RoaW5nIGlzIHVzaW5nIGl0LCBzbyByZW1vdmUgaXQgYWdhaW4uCisgICAgICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJyZXR1cm4gdHJ1ZTsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0dlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTAxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0dlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCisvKioKKyAqIEdlbmVyYXRlcyBKYXZhUGFyc2VyJ3MgR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlci4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IgZXh0ZW5kcyBWaXNpdG9yR2VuZXJhdG9yIHsKKyAgICBwdWJsaWMgR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJHZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyIiwgIkxpc3Q8Uj4iLCAiQSIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uIHZpc2l0TWV0aG9kLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgIHZpc2l0TWV0aG9kLmdldFBhcmFtZXRlcnMoKS5mb3JFYWNoKHAgLT4gcC5zZXRGaW5hbCh0cnVlKSk7CisKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSB2aXNpdE1ldGhvZC5nZXRCb2R5KCkuZ2V0KCk7CisgICAgICAgIGJvZHkuZ2V0U3RhdGVtZW50cygpLmNsZWFyKCk7CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOyIpOworICAgICAgICBib2R5LmFkZFN0YXRlbWVudCgiTGlzdDxSPiB0bXA7Iik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdENoZWNrID0gImlmICh0bXAgIT0gbnVsbCkgcmVzdWx0LmFkZEFsbCh0bXApOyI7CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBmaWVsZCA6IG5vZGUuZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnZXR0ZXIgPSBmaWVsZC5nZXRHZXR0ZXJNZXRob2ROYW1lKCkgKyAiKCkiOworICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5vZGVSZWZlcmVuY2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc09wdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiaWYgKG4uJXMuaXNQcmVzZW50KCkpIHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgdG1wID0gbi4lcy5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgJXMiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsIGdldHRlciwgZ2V0dGVyLCByZXN1bHRDaGVjaykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoInsgdG1wID0gbi4lcy5hY2NlcHQodGhpcywgYXJnKTsgJXMgfSIsIGdldHRlciwgcmVzdWx0Q2hlY2spKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoInJldHVybiByZXN1bHQ7Iik7CisgICAgICAgIEFycmF5cy5zdHJlYW0obmV3IENsYXNzPD8+W10ge0xpc3QuY2xhc3MsIEFycmF5TGlzdC5jbGFzc30pLmZpbHRlcihjIC0+CisgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKS5zdHJlYW0oKS5ub25lTWF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICBpIC0+IGMuZ2V0TmFtZSgpLmVxdWFscyhpLmdldE5hbWUoKS5hc1N0cmluZygpKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgKS5mb3JFYWNoKGNvbXBpbGF0aW9uVW5pdDo6YWRkSW1wb3J0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0dlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY1NjNkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCisvKioKKyAqIEdlbmVyYXRlcyBKYXZhUGFyc2VyJ3MgVm9pZFZpc2l0b3JBZGFwdGVyLgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIGV4dGVuZHMgVmlzaXRvckdlbmVyYXRvciB7CisgICAgcHVibGljIEdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJHZW5lcmljVmlzaXRvckFkYXB0ZXIiLCAiUiIsICJBIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVWaXNpdE1ldGhvZEJvZHkoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZSwgTWV0aG9kRGVjbGFyYXRpb24gdmlzaXRNZXRob2QsIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgdmlzaXRNZXRob2QuZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLnNldEZpbmFsKHRydWUpKTsKKworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IHZpc2l0TWV0aG9kLmdldEJvZHkoKS5nZXQoKTsKKyAgICAgICAgYm9keS5nZXRTdGF0ZW1lbnRzKCkuY2xlYXIoKTsKKyAgICAgICAgCisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJSIHJlc3VsdDsiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0Q2hlY2sgPSAiaWYgKHJlc3VsdCAhPSBudWxsKSByZXR1cm4gcmVzdWx0OyI7CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBmaWVsZCA6IG5vZGUuZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnZXR0ZXIgPSBmaWVsZC5nZXRHZXR0ZXJNZXRob2ROYW1lKCkgKyAiKCkiOworICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5vZGVSZWZlcmVuY2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc09wdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiaWYgKG4uJXMuaXNQcmVzZW50KCkpIHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgcmVzdWx0ID0gbi4lcy5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgJXMiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsIGdldHRlciwgZ2V0dGVyLCByZXN1bHRDaGVjaykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoInsgcmVzdWx0ID0gbi4lcy5hY2NlcHQodGhpcywgYXJnKTsgJXMgfSIsIGdldHRlciwgcmVzdWx0Q2hlY2spKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoInJldHVybiBudWxsOyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzFhZWIxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9HZW5lcmljVmlzaXRvckdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CisKKy8qKgorICogR2VuZXJhdGVzIEphdmFQYXJzZXIncyBHZW5lcmljVmlzaXRvci4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIGV4dGVuZHMgVmlzaXRvckdlbmVyYXRvciB7CisgICAgcHVibGljIEdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290LCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yIiwgIkdlbmVyaWNWaXNpdG9yIiwgIlIiLCAiQSIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uIHZpc2l0TWV0aG9kLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgIHZpc2l0TWV0aG9kLmdldFBhcmFtZXRlcnMoKS5mb3JFYWNoKHAgLT4gcC5zZXRGaW5hbChmYWxzZSkpOworICAgICAgICAKKyAgICAgICAgdmlzaXRNZXRob2Quc2V0Qm9keShudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0dlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL0dlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhMjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKKy8qKgorICogR2VuZXJhdGVzIEphdmFQYXJzZXIncyBHZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0cy4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIGV4dGVuZHMgVmlzaXRvckdlbmVyYXRvciB7CisgICAgcHVibGljIEdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290LCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yIiwgIkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzIiwgIlIiLCAiQSIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uIHZpc2l0TWV0aG9kLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgIHZpc2l0TWV0aG9kLmdldFBhcmFtZXRlcnMoKS5mb3JFYWNoKHAgLT4gcC5zZXRGaW5hbCh0cnVlKSk7CisKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSB2aXNpdE1ldGhvZC5nZXRCb2R5KCkuZ2V0KCk7CisgICAgICAgIGJvZHkuZ2V0U3RhdGVtZW50cygpLmNsZWFyKCk7CisKKyAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoInJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuVmlzaXRvckdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CYXNlTm9kZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlByb3BlcnR5TWV0YU1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VTdGF0ZW1lbnQ7CisKKy8qKgorICogR2VuZXJhdGVzIEphdmFQYXJzZXIncyBIYXNoQ29kZVZpc2l0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IgZXh0ZW5kcyBWaXNpdG9yR2VuZXJhdG9yIHsKKyAgICBwdWJsaWMgSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290LCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yIiwgIkhhc2hDb2RlVmlzaXRvciIsICJJbnRlZ2VyIiwgIlZvaWQiLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVZpc2l0TWV0aG9kQm9keShCYXNlTm9kZU1ldGFNb2RlbCBub2RlLCBNZXRob2REZWNsYXJhdGlvbiB2aXNpdE1ldGhvZCwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgeworICAgICAgICB2aXNpdE1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHAuc2V0RmluYWwodHJ1ZSkpOworCisgICAgICAgIGZpbmFsIEJsb2NrU3RtdCBib2R5ID0gdmlzaXRNZXRob2QuZ2V0Qm9keSgpLmdldCgpOworICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOworCisgICAgICAgIGZpbmFsIFNlcGFyYXRlZEl0ZW1TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIoInJldHVybiAiLCAiKiAzMSArIiwgIjsiKTsKKyAgICAgICAgZmluYWwgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gcHJvcGVydHlNZXRhTW9kZWxzPSBub2RlLmdldEFsbFByb3BlcnR5TWV0YU1vZGVscygpOworICAgICAgICBpZiAocHJvcGVydHlNZXRhTW9kZWxzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgZmllbGQgOiBwcm9wZXJ0eU1ldGFNb2RlbHMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0dGVyID0gZmllbGQuZ2V0R2V0dGVyTWV0aG9kTmFtZSgpICsgIigpIjsKKyAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGZpZWxkIGFub3RoZXIgQVNUIG5vZGU/IFZpc2l0IGl0LgorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXROb2RlUmVmZXJlbmNlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzT3B0aW9uYWwoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIihuLiVzLmlzUHJlc2VudCgpPyBuLiVzLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOjApIiwgZ2V0dGVyLCBnZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIihuLiVzLmFjY2VwdCh0aGlzLCBhcmcpKSIsIGdldHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoYm9vbGVhbi5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIobi4lcz8xOjApIiwgZ2V0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhpbnQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgibi4lcyIsIGdldHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiKG4uJXMuaGFzaENvZGUoKSkiLCBnZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KHBhcnNlU3RhdGVtZW50KGJ1aWxkZXIudG9TdHJpbmcoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL01vZGlmaWVyVmlzaXRvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMmY3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL01vZGlmaWVyVmlzaXRvckdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLlZpc2l0b3JHZW5lcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CYXNlTm9kZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlByb3BlcnR5TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5TZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIGV4dGVuZHMgVmlzaXRvckdlbmVyYXRvciB7CisgICAgcHVibGljIE1vZGlmaWVyVmlzaXRvckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJNb2RpZmllclZpc2l0b3IiLCAiVmlzaXRhYmxlIiwgIkEiLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVZpc2l0TWV0aG9kQm9keShCYXNlTm9kZU1ldGFNb2RlbCBub2RlLCBNZXRob2REZWNsYXJhdGlvbiB2aXNpdE1ldGhvZCwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgeworICAgICAgICB2aXNpdE1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHAuc2V0RmluYWwodHJ1ZSkpOworCisgICAgICAgIEJsb2NrU3RtdCBib2R5ID0gdmlzaXRNZXRob2QuZ2V0Qm9keSgpLmdldCgpOworICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOworCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgcHJvcGVydHkgOiBub2RlLmdldEFsbFByb3BlcnR5TWV0YU1vZGVscygpKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuaXNOb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaXNOb2RlTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoIk5vZGVMaXN0PCVzPiAlcyA9IG1vZGlmeUxpc3Qobi4lcygpLCBhcmcpOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldEdldHRlck1ldGhvZE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaXNPcHRpb25hbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoIiVzICVzID0gbi4lcygpLm1hcChzIC0+ICglcykgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldEdldHRlck1ldGhvZE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoIiVzICVzID0gKCVzKSBuLiVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0R2V0dGVyTWV0aG9kTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYobm9kZS5pcyhCaW5hcnlFeHByLmNsYXNzKSl7CisgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudCgiaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIHJpZ2h0OyIpOworICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoImlmIChyaWdodCA9PSBudWxsKSByZXR1cm4gbGVmdDsiKTsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgZmluYWwgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIgY29sbGFwc2VDaGVjayA9IG5ldyBTZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcigiaWYoIiwgInx8IiwgIikgcmV0dXJuIG51bGw7Iik7CisgICAgICAgICAgICBmb3IgKFByb3BlcnR5TWV0YU1vZGVsIHByb3BlcnR5IDogbm9kZS5nZXRBbGxQcm9wZXJ0eU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkgJiYgcHJvcGVydHkuaXNOb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmlzTm9kZUxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJvcGVydHkuaXNOb25FbXB0eSgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUNoZWNrLmFwcGVuZChmKCIlcy5pc0VtcHR5KCkiLCBwcm9wZXJ0eS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlQ2hlY2suYXBwZW5kKGYoIiVzPT1udWxsIiwgcHJvcGVydHkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sbGFwc2VDaGVjay5oYXNJdGVtcygpKSB7CisgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoY29sbGFwc2VDaGVjay50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgcHJvcGVydHkgOiBub2RlLmdldEFsbFByb3BlcnR5TWV0YU1vZGVscygpKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuaXNOb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJuLiVzKCVzKTsiLCBwcm9wZXJ0eS5nZXRTZXR0ZXJNZXRob2ROYW1lKCksIHByb3BlcnR5LmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJyZXR1cm4gbjsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL05vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTc0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL05vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvcjsNCisNCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Ow0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuVmlzaXRvckdlbmVyYXRvcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CYXNlTm9kZU1ldGFNb2RlbDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlByb3BlcnR5TWV0YU1vZGVsOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsNCisNCitwdWJsaWMgY2xhc3MgTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciBleHRlbmRzIFZpc2l0b3JHZW5lcmF0b3Igew0KKw0KKyAgICBwdWJsaWMgTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsNCisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IiLCAiTm9Db21tZW50RXF1YWxzVmlzaXRvciIsICJCb29sZWFuIiwgIlZpc2l0YWJsZSIsIHRydWUpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVZpc2l0TWV0aG9kQm9keShCYXNlTm9kZU1ldGFNb2RlbCBub2RlLCBNZXRob2REZWNsYXJhdGlvbiB2aXNpdE1ldGhvZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgew0KKyAgICAgICAgdmlzaXRNZXRob2QuZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLnNldEZpbmFsKHRydWUpKTsNCisNCisgICAgICAgIEJsb2NrU3RtdCBib2R5ID0gdmlzaXRNZXRob2QuZ2V0Qm9keSgpLmdldCgpOw0KKyAgICAgICAgYm9keS5nZXRTdGF0ZW1lbnRzKCkuY2xlYXIoKTsNCisNCisgICAgICAgIGlmICghKG5vZGUuZXF1YWxzKEphdmFQYXJzZXJNZXRhTW9kZWwubGluZUNvbW1lbnRNZXRhTW9kZWwpDQorICAgICAgICAgICAgICAgIHx8IG5vZGUuZXF1YWxzKEphdmFQYXJzZXJNZXRhTW9kZWwuYmxvY2tDb21tZW50TWV0YU1vZGVsKQ0KKyAgICAgICAgICAgICAgICB8fCBub2RlLmVxdWFscyhKYXZhUGFyc2VyTWV0YU1vZGVsLmphdmFkb2NDb21tZW50TWV0YU1vZGVsKSkpIHsNCisNCisgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJmaW5hbCAlcyBuMiA9ICglcykgYXJnOyIsIG5vZGUuZ2V0VHlwZU5hbWUoKSwgbm9kZS5nZXRUeXBlTmFtZSgpKSk7DQorDQorICAgICAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBmaWVsZCA6IG5vZGUuZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCkpIHsNCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdldHRlciA9IGZpZWxkLmdldEdldHRlck1ldGhvZE5hbWUoKSArICIoKSI7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5lcXVhbHMoSmF2YVBhcnNlck1ldGFNb2RlbC5ub2RlTWV0YU1vZGVsLmNvbW1lbnRQcm9wZXJ0eU1ldGFNb2RlbCkpDQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5vZGVSZWZlcmVuY2UoKS5pc1ByZXNlbnQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzTm9kZUxpc3QoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoImlmICghbm9kZXNFcXVhbHMobi4lcywgbjIuJXMpKSByZXR1cm4gZmFsc2U7IiwgZ2V0dGVyLCBnZXR0ZXIpKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigiaWYgKCFub2RlRXF1YWxzKG4uJXMsIG4yLiVzKSkgcmV0dXJuIGZhbHNlOyIsIGdldHRlciwgZ2V0dGVyKSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJpZiAoIW9iakVxdWFscyhuLiVzLCBuMi4lcykpIHJldHVybiBmYWxzZTsiLCBnZXR0ZXIsIGdldHRlcikpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChib2R5LmdldFN0YXRlbWVudHMoKS5zaXplKCkgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAvLyBPbmx5IHRoZSBjYXN0IGxpbmUgd2FzIGFkZGVkLCBidXQgbm90aGluZyBpcyB1c2luZyBpdCwgc28gcmVtb3ZlIGl0IGFnYWluLg0KKyAgICAgICAgICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KCJyZXR1cm4gdHJ1ZTsiKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL05vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZkMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvcjsNCisNCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlU3RhdGVtZW50Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5TZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7DQorDQorcHVibGljIGNsYXNzIE5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciBleHRlbmRzIFZpc2l0b3JHZW5lcmF0b3Igew0KKw0KKyAgICBwdWJsaWMgTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgew0KKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJOb0NvbW1lbnRIYXNoQ29kZVZpc2l0b3IiLCAiSW50ZWdlciIsICJWb2lkIiwgdHJ1ZSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uIHZpc2l0TWV0aG9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7DQorICAgICAgICB2aXNpdE1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHAuc2V0RmluYWwodHJ1ZSkpOw0KKw0KKyAgICAgICAgZmluYWwgQmxvY2tTdG10IGJvZHkgPSB2aXNpdE1ldGhvZC5nZXRCb2R5KCkuZ2V0KCk7DQorICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOw0KKw0KKyAgICAgICAgZmluYWwgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcigicmV0dXJuICIsICIqIDMxICsiLCAiOyIpOw0KKyAgICAgICAgZmluYWwgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gcHJvcGVydHlNZXRhTW9kZWxzID0gbm9kZS5nZXRBbGxQcm9wZXJ0eU1ldGFNb2RlbHMoKTsNCisgICAgICAgIGlmIChub2RlLmVxdWFscyhKYXZhUGFyc2VyTWV0YU1vZGVsLmxpbmVDb21tZW50TWV0YU1vZGVsKQ0KKyAgICAgICAgICAgICAgICB8fCBub2RlLmVxdWFscyhKYXZhUGFyc2VyTWV0YU1vZGVsLmJsb2NrQ29tbWVudE1ldGFNb2RlbCkNCisgICAgICAgICAgICAgICAgfHwgbm9kZS5lcXVhbHMoSmF2YVBhcnNlck1ldGFNb2RlbC5qYXZhZG9jQ29tbWVudE1ldGFNb2RlbCkgfHwgcHJvcGVydHlNZXRhTW9kZWxzLmlzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIwIik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgZmllbGQgOiBwcm9wZXJ0eU1ldGFNb2RlbHMpIHsNCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdldHRlciA9IGZpZWxkLmdldEdldHRlck1ldGhvZE5hbWUoKSArICIoKSI7DQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5lcXVhbHMoSmF2YVBhcnNlck1ldGFNb2RlbC5ub2RlTWV0YU1vZGVsLmNvbW1lbnRQcm9wZXJ0eU1ldGFNb2RlbCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1ldGFNb2RlbHMuc2l6ZSgpID09IDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiMCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBmaWVsZCBhbm90aGVyIEFTVCBub2RlPyBWaXNpdCBpdC4NCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5vZGVSZWZlcmVuY2UoKS5pc1ByZXNlbnQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzT3B0aW9uYWwoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIobi4lcy5pc1ByZXNlbnQoKT8gbi4lcy5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTowKSIsIGdldHRlciwgZ2V0dGVyKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIihuLiVzLmFjY2VwdCh0aGlzLCBhcmcpKSIsIGdldHRlcik7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIihuLiVzPzE6MCkiLCBnZXR0ZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhpbnQuY2xhc3MpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIm4uJXMiLCBnZXR0ZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiKG4uJXMuaGFzaENvZGUoKSkiLCBnZXR0ZXIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQocGFyc2VTdGF0ZW1lbnQoYnVpbGRlci50b1N0cmluZygpKSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxODJmYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuVmlzaXRvckdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJhc2VOb2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKKworLyoqCisgKiBHZW5lcmF0ZXMgSmF2YVBhcnNlcidzIE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvci4KKyAqLworcHVibGljIGNsYXNzIE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciBleHRlbmRzIFZpc2l0b3JHZW5lcmF0b3IgeworICAgIHB1YmxpYyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IiLCAiT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yIiwgIkJvb2xlYW4iLCAiVmlzaXRhYmxlIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVWaXNpdE1ldGhvZEJvZHkoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZSwgTWV0aG9kRGVjbGFyYXRpb24gdmlzaXRNZXRob2QsIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgdmlzaXRNZXRob2QuZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLnNldEZpbmFsKHRydWUpKTsKKworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IHZpc2l0TWV0aG9kLmdldEJvZHkoKS5nZXQoKTsKKyAgICAgICAgYm9keS5nZXRTdGF0ZW1lbnRzKCkuY2xlYXIoKTsKKworICAgICAgICBib2R5LmFkZFN0YXRlbWVudCgicmV0dXJuIG4gPT0gYXJnOyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGViM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLlZpc2l0b3JHZW5lcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CYXNlTm9kZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlByb3BlcnR5TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5TZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlU3RhdGVtZW50OworCisvKioKKyAqIEdlbmVyYXRlcyBKYXZhUGFyc2VyJ3MgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciBleHRlbmRzIFZpc2l0b3JHZW5lcmF0b3IgeworICAgIHB1YmxpYyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvciIsICJJbnRlZ2VyIiwgIlZvaWQiLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVZpc2l0TWV0aG9kQm9keShCYXNlTm9kZU1ldGFNb2RlbCBub2RlLCBNZXRob2REZWNsYXJhdGlvbiB2aXNpdE1ldGhvZCwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgeworICAgICAgICB2aXNpdE1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHAuc2V0RmluYWwodHJ1ZSkpOworCisgICAgICAgIGZpbmFsIEJsb2NrU3RtdCBib2R5ID0gdmlzaXRNZXRob2QuZ2V0Qm9keSgpLmdldCgpOworICAgICAgICBib2R5LmdldFN0YXRlbWVudHMoKS5jbGVhcigpOworICAgICAgICBib2R5LmFkZFN0YXRlbWVudCgicmV0dXJuIG4uaGFzaENvZGUoKTsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL1ZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzdlYTdlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCisvKioKKyAqIEdlbmVyYXRlcyBKYXZhUGFyc2VyJ3MgVm9pZFZpc2l0b3JBZGFwdGVyLgorICovCitwdWJsaWMgY2xhc3MgVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIGV4dGVuZHMgVmlzaXRvckdlbmVyYXRvciB7CisgICAgcHVibGljIFZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvcihTb3VyY2VSb290IHNvdXJjZVJvb3QpIHsKKyAgICAgICAgc3VwZXIoc291cmNlUm9vdCwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvciIsICJWb2lkVmlzaXRvckFkYXB0ZXIiLCAidm9pZCIsICJBIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVWaXNpdE1ldGhvZEJvZHkoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZSwgTWV0aG9kRGVjbGFyYXRpb24gdmlzaXRNZXRob2QsIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgdmlzaXRNZXRob2QuZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLnNldEZpbmFsKHRydWUpKTsKKworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IHZpc2l0TWV0aG9kLmdldEJvZHkoKS5nZXQoKTsKKyAgICAgICAgYm9keS5nZXRTdGF0ZW1lbnRzKCkuY2xlYXIoKTsKKworICAgICAgICBmb3IgKFByb3BlcnR5TWV0YU1vZGVsIGZpZWxkIDogbm9kZS5nZXRBbGxQcm9wZXJ0eU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdldHRlciA9IGZpZWxkLmdldEdldHRlck1ldGhvZE5hbWUoKSArICIoKSI7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0Tm9kZVJlZmVyZW5jZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzT3B0aW9uYWwoKSAmJiBmaWVsZC5pc05vZGVMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoZigibi4lcy5pZlByZXNlbnQoIGwgLT4gbC5mb3JFYWNoKCB2IC0+IHYuYWNjZXB0KHRoaXMsIGFyZykpKTsiLCBnZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmlzT3B0aW9uYWwoKSkgeworICAgICAgICAgICAgICAgICAgICBib2R5LmFkZFN0YXRlbWVudChmKCJuLiVzLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOyIsIGdldHRlcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNOb2RlTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoIm4uJXMuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOyIsIGdldHRlcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkuYWRkU3RhdGVtZW50KGYoIm4uJXMuYWNjZXB0KHRoaXMsIGFyZyk7IiwgZ2V0dGVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9Wb2lkVmlzaXRvckdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL2NvcmUvdmlzaXRvci9Wb2lkVmlzaXRvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMzI2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL1ZvaWRWaXNpdG9yR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLlZpc2l0b3JHZW5lcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CYXNlTm9kZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworLyoqCisgKiBHZW5lcmF0ZXMgSmF2YVBhcnNlcidzIFZvaWRWaXNpdG9yLgorICovCitwdWJsaWMgY2xhc3MgVm9pZFZpc2l0b3JHZW5lcmF0b3IgZXh0ZW5kcyBWaXNpdG9yR2VuZXJhdG9yIHsKKyAgICBwdWJsaWMgVm9pZFZpc2l0b3JHZW5lcmF0b3IoU291cmNlUm9vdCBzb3VyY2VSb290KSB7CisgICAgICAgIHN1cGVyKHNvdXJjZVJvb3QsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IiLCAiVm9pZFZpc2l0b3IiLCAidm9pZCIsICJBIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVWaXNpdE1ldGhvZEJvZHkoQmFzZU5vZGVNZXRhTW9kZWwgbm9kZSwgTWV0aG9kRGVjbGFyYXRpb24gdmlzaXRNZXRob2QsIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgdmlzaXRNZXRob2QuZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLnNldEZpbmFsKGZhbHNlKSk7CisKKyAgICAgICAgdmlzaXRNZXRob2Quc2V0Qm9keShudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL1ZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvY29yZS92aXNpdG9yL1ZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4OTA2MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9jb3JlL3Zpc2l0b3IvVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5WaXNpdG9yR2VuZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmFzZU5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CisKKy8qKgorICogR2VuZXJhdGVzIEphdmFQYXJzZXIncyBWb2lkVmlzaXRvcldpdGhEZWZhdWx0cy4KKyAqLworcHVibGljIGNsYXNzIFZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIGV4dGVuZHMgVmlzaXRvckdlbmVyYXRvciB7CisgICAgcHVibGljIFZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgeworICAgICAgICBzdXBlcihzb3VyY2VSb290LCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yIiwgIlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzIiwgInZvaWQiLCAiQSIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVmlzaXRNZXRob2RCb2R5KEJhc2VOb2RlTWV0YU1vZGVsIG5vZGUsIE1ldGhvZERlY2xhcmF0aW9uIHZpc2l0TWV0aG9kLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgIHZpc2l0TWV0aG9kLmdldFBhcmFtZXRlcnMoKS5mb3JFYWNoKHAgLT4gcC5zZXRGaW5hbCh0cnVlKSk7CisKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSB2aXNpdE1ldGhvZC5nZXRCb2R5KCkuZ2V0KCk7CisgICAgICAgIGJvZHkuZ2V0U3RhdGVtZW50cygpLmNsZWFyKCk7CisKKyAgICAgICAgYm9keS5hZGRTdGF0ZW1lbnQoImRlZmF1bHRBY3Rpb24obiwgYXJnKTsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvYm5kLmJuZCBiL2phdmFwYXJzZXItY29yZS9ibmQuYm5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDNlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvYm5kLmJuZApAQCAtMCwwICsxLDMzIEBACisjIE1ha2UgdGhlIEJ1bmRsZS1TeW1ib2xpY05hbWUgZnVsbHkgcXVhbGlmaWVkLCBub3QganVzdCB0aGUgYXJ0aWZhY3QgaWQKK0J1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhcGFyc2VyLWNvcmUKKworIyBFeHBvcnQgYWxsIHBhY2thZ2VzIGV4Y2VwdCBpbXBsCistZXhwb3J0Y29udGVudHM6IFwKKyAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIsIFwKKyAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYywgXAorICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jLmRlc2NyaXB0aW9uLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbCwgXAorICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbCwgXAorICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMsIFwKKyAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5wYXJhbWV0cml6YXRpb24sIFwKKyAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMsIFwKKyAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5pbXBvcnRzLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cywgXAorICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcywgXAorICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLCBcCisgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IsIFwKKyAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyCisKKyMgRG9uJ3QgdXNlIHRoZSBwcm9qZWN0J3MgdmVyc2lvbiBmb3IgdGhlIHBhY2thZ2VzCisjIFdlIHByZWZlciBub3Qgc2V0dGluZyBhIHZlcnNpb24gYXMgd2UgZG9uJ3QgZm9sbG93IE9TR2kgdmVyc2lvbiBzZW1hbnRpY3MKKy1ub2RlZmF1bHR2ZXJzaW9uOiB0cnVlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvamF2YXBhcnNlci1jb3JlLmltbCBiL2phdmFwYXJzZXItY29yZS9qYXZhcGFyc2VyLWNvcmUuaW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NWVmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvamF2YXBhcnNlci1jb3JlLmltbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPG1vZHVsZSBvcmcuamV0YnJhaW5zLmlkZWEubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RzTWFuYWdlci5pc01hdmVuTW9kdWxlPSJ0cnVlIiB0eXBlPSJKQVZBX01PRFVMRSIgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iTmV3TW9kdWxlUm9vdE1hbmFnZXIiIExBTkdVQUdFX0xFVkVMPSJKREtfMV84Ij4KKyAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQvY2xhc3NlcyIgLz4KKyAgICA8b3V0cHV0LXRlc3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC90ZXN0LWNsYXNzZXMiIC8+CisgICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9tYWluL2phdmEiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIC8+CisgICAgICA8c291cmNlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydCIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9qYXZhLXRlbXBsYXRlcyIgaXNUZXN0U291cmNlPSJmYWxzZSIgZ2VuZXJhdGVkPSJ0cnVlIiAvPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2phdmFjYyIgaXNUZXN0U291cmNlPSJmYWxzZSIgZ2VuZXJhdGVkPSJ0cnVlIiAvPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2xpY2Vuc2UiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIGdlbmVyYXRlZD0idHJ1ZSIgLz4KKyAgICAgIDxleGNsdWRlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQiIC8+CisgICAgPC9jb250ZW50PgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImluaGVyaXRlZEpkayIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJzb3VyY2VGb2xkZXIiIGZvclRlc3RzPSJmYWxzZSIgLz4KKyAgPC9jb21wb25lbnQ+Cis8L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvcG9tLnhtbCBiL2phdmFwYXJzZXItY29yZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NmIxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvcG9tLnhtbApAQCAtMCwwICsxLDE3MyBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamF2YXBhcnNlcjwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+My41LjE2LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgY29yZSBwYXJzZXIgZnVuY3Rpb25hbGl0eS4gVGhpcyBtYXkgYmUgYWxsIHlvdSBuZWVkLjwvZGVzY3JpcHRpb24+CisKKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC0zLjAuaHRtbDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkEgYnVzaW5lc3MtZnJpZW5kbHkgT1NTIGxpY2Vuc2U8L2NvbW1lbnRzPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8amF2YS52ZXJzaW9uPjEuODwvamF2YS52ZXJzaW9uPgorICAgICAgICA8YnVpbGQudGltZXN0YW1wPiR7bWF2ZW4uYnVpbGQudGltZXN0YW1wfTwvYnVpbGQudGltZXN0YW1wPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5oZWxnZXIubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGgtamF2YWNjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhY2M8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphdmFjYzwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JhbW1hckVuY29kaW5nPiR7cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZ308L2dyYW1tYXJFbmNvZGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amRrVmVyc2lvbj4ke2phdmEudmVyc2lvbn08L2pka1ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbmltYWwtc25pZmZlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1ha2Ugc3VyZSBvbmx5IHRoZSBBUEkgb2YgdGhpcyBKREsgaXMgdXNlZCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvLnNpZ25hdHVyZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmExODwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFuaW1hbC1zbmlmZmVyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS12ZXJzaW9uczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcXVpcmVKYXZhVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWFrZSBzdXJlIGEgY29tcGlsZXIgb2YgdGhpcyB2ZXJzaW9uIGlzIHVzZWQgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phdmEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVxdWlyZUphdmFWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW5mb3JjZUJ5dGVjb2RlVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWFrZSBzdXJlIHRoZSBkZXBlbmRlbmNpZXMgYXJlIGNvbXBpbGVkIGZvciBvdXIgSmF2YSB2ZXJzaW9uIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heEpka1ZlcnNpb24+JHtqYXZhLnZlcnNpb259PC9tYXhKZGtWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VuZm9yY2VCeXRlY29kZVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leHRyYS1lbmZvcmNlci1ydWxlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1iZXRhLTY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBHZW5lcmF0ZSBhbiBPU0dpLWVuYWJsZWQgTUFOSUZFU1QgZHVyaW5nIHRoZSBidWlsZCAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Yml6LmFRdXRlLmJuZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ibmQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmJuZC1wcm9jZXNzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWFrZSBzdXJlIHRoZSBibmQtZ2VuZXJhdGVkIG1hbmlmZXN0IGlzIHBpY2tlZCB1cCwgc2VlIE1KQVItMTkzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RmlsZT4ke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fS9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXQgbW9kdWxlIG5hbWUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBdXRvbWF0aWMtTW9kdWxlLU5hbWU+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmNvcmU8L0F1dG9tYXRpYy1Nb2R1bGUtTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoaXMgc3RvcmVzIG1ldGhvZCBwYXJhbWV0ZXIgbmFtZXMgaW4gdGhlIGNsYXNzIGZpbGUsIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBtZXRhbW9kZWwgZ2VuZXJhdG9yIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFyZz4tcGFyYW1ldGVyczwvYXJnPgorICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJncz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hZGQtc291cmNlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtc291cmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPnNyYy9tYWluL2phdmFjYy1zdXBwb3J0PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGVtcGxhdGluZy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZmlsdGVyLXNyYzwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZmlsdGVyLXNvdXJjZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhLXRlbXBsYXRlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvSmF2YVBhcnNlckJ1aWxkLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS10ZW1wbGF0ZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFQYXJzZXJCdWlsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGVlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS10ZW1wbGF0ZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFQYXJzZXJCdWlsZC5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisvKioKKyAqIFNvbWUgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXZhaWxhYmxlIHdoZW4gdGhpcyBsaWJyYXJ5IHdhcyBidWlsdCBieSBNYXZlbi4KKyAqLworcHVibGljIGNsYXNzIEphdmFQYXJzZXJCdWlsZCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9WRVJTSU9OID0gIiR7cHJvamVjdC52ZXJzaW9ufSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIiR7cHJvamVjdC5uYW1lfSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9CVUlMRF9GSU5BTF9OQU1FID0gIiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVZFTl9WRVJTSU9OID0gIiR7bWF2ZW4udmVyc2lvbn0iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVkVOX0JVSUxEX1ZFUlNJT04gPSAiJHttYXZlbi5idWlsZC52ZXJzaW9ufSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFWRU5fQlVJTERfVElNRVNUQU1QID0gIiR7YnVpbGQudGltZXN0YW1wfSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9WRU5ET1IgPSIke2phdmEudmVuZG9yfSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9WRU5ET1JfVVJMID0iJHtqYXZhLnZlbmRvci51cmx9IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1ZFUlNJT04gPSIke2phdmEudmVyc2lvbn0iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX0FSQ0ggPSIke29zLmFyY2h9IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU19OQU1FID0iJHtvcy5uYW1lfSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfVkVSU0lPTiA9IiR7b3MudmVyc2lvbn0iOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Db21tZW50c0luc2VydGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvQ29tbWVudHNJbnNlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTg4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvQ29tbWVudHNJbnNlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5OT0RFX0JZX0JFR0lOX1BPU0lUSU9OOworCisvKioKKyAqIEFzc2lnbnMgY29tbWVudHMgdG8gbm9kZXMgb2YgdGhlIEFTVC4KKyAqCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBLdWVydGVuCisgKiBAYXV0aG9yIErDumxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK2NsYXNzIENvbW1lbnRzSW5zZXJ0ZXIgeworICAgIHByaXZhdGUgZmluYWwgUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgICAgQ29tbWVudHNJbnNlcnRlcihQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tZW50cyBhcmUgYXR0cmlidXRlZCB0byB0aGUgdGhpbmcgdGhleSBjb21tZW50IGFuZCBhcmUgcmVtb3ZlZCBmcm9tCisgICAgICogdGhlIGNvbW1lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnNlcnRDb21tZW50cyhDb21waWxhdGlvblVuaXQgY3UsIFRyZWVTZXQ8Q29tbWVudD4gY29tbWVudHMpIHsKKyAgICAgICAgaWYgKGNvbW1lbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKiBJIHNob3VsZCBzb3J0IGFsbCB0aGUgZGlyZWN0IGNoaWxkcmVuIGFuZCB0aGUgY29tbWVudHMsIGlmIGEgY29tbWVudAorICAgICAgICAgaXMgdGhlIGZpcnN0IHRoaW5nIHRoZW4gaXQKKyAgICAgICAgIGEgY29tbWVudCB0byB0aGUgQ29tcGlsYXRpb25Vbml0ICovCisKKyAgICAgICAgLy8gRklYTUUgaWYgdGhlcmUgaXMgbm8gcGFja2FnZSBpdCBjb3VsZCBiZSBhbHNvIGEgY29tbWVudCB0byB0aGUgZm9sbG93aW5nIGNsYXNzLi4uCisgICAgICAgIC8vIHNvIEkgY291bGQgdXNlIHNvbWUgaGV1cmlzdGljcyBpbiB0aGVzZSBjYXNlcyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvCisgICAgICAgIC8vIGNhc2VzCisKKyAgICAgICAgTGlzdDxOb2RlPiBjaGlsZHJlbiA9IGN1LmdldENoaWxkTm9kZXMoKTsKKworICAgICAgICBDb21tZW50IGZpcnN0Q29tbWVudCA9IGNvbW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBpZiAoY3UuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuaXNQcmVzZW50KCkKKyAgICAgICAgICAgICAgICAmJiAoY2hpbGRyZW4uaXNFbXB0eSgpIHx8IFBvc2l0aW9uVXRpbHMuYXJlSW5PcmRlcigKKyAgICAgICAgICAgICAgICBmaXJzdENvbW1lbnQsIGN1LmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmdldCgpKSkpIHsKKyAgICAgICAgICAgIGN1LnNldENvbW1lbnQoZmlyc3RDb21tZW50KTsKKyAgICAgICAgICAgIGNvbW1lbnRzLnJlbW92ZShmaXJzdENvbW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdHJ5IHRvIGF0dHJpYnV0ZXMgdGhlIG5vZGVzIHJlY2VpdmVkIHRvIGNoaWxkIG9mIHRoZSBub2RlLiBJdAorICAgICAqIHJldHVybnMgdGhlIG5vZGUgdGhhdCB3ZXJlIG5vdCBhdHRyaWJ1dGVkLgorICAgICAqLworICAgIHZvaWQgaW5zZXJ0Q29tbWVudHMoTm9kZSBub2RlLCBUcmVlU2V0PENvbW1lbnQ+IGNvbW1lbnRzVG9BdHRyaWJ1dGUpIHsKKyAgICAgICAgaWYgKGNvbW1lbnRzVG9BdHRyaWJ1dGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgICAgICBpbnNlcnRDb21tZW50cygoQ29tcGlsYXRpb25Vbml0KSBub2RlLCBjb21tZW50c1RvQXR0cmlidXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBjb21tZW50cyBjYW46CisgICAgICAgIC8vIDEpIEluc2lkZSBvbmUgb2YgdGhlIGNoaWxkLCB0aGVuIGl0IGlzIHRoZSBjaGlsZCB0aGF0IGhhdmUgdG8KKyAgICAgICAgLy8gYXNzb2NpYXRlIHRoZW0KKyAgICAgICAgLy8gMikgSWYgdGhleSBhcmUgbm90IGluc2lkZSBhIGNoaWxkIHRoZXkgY291bGQgYmUgcHJlY2VlZGluZyBub3RoaW5nLCBhCisgICAgICAgIC8vIGNvbW1lbnQgb3IgYSBjaGlsZAorICAgICAgICAvLyBpZiB0aGV5IHByZWNlZWQgYSBjaGlsZCB0aGV5IGFyZSBhc3NpZ25lZCB0byBpdCwgb3RoZXJ3ZWlzZSB0aGV5CisgICAgICAgIC8vIHJlbWFpbiAib3JwaGFucyIKKworICAgICAgICBMaXN0PE5vZGU+IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIFRyZWVTZXQ8Q29tbWVudD4gY29tbWVudHNJbnNpZGVDaGlsZCA9IG5ldyBUcmVlU2V0PD4oTk9ERV9CWV9CRUdJTl9QT1NJVElPTik7CisgICAgICAgICAgICBjb21tZW50c0luc2lkZUNoaWxkLmFkZEFsbCgKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudHNUb0F0dHJpYnV0ZS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiBjLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+IFBvc2l0aW9uVXRpbHMubm9kZUNvbnRhaW5zKGNoaWxkLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5pc0RvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgICAgIGNvbW1lbnRzVG9BdHRyaWJ1dGUucmVtb3ZlQWxsKGNvbW1lbnRzSW5zaWRlQ2hpbGQpOworICAgICAgICAgICAgaW5zZXJ0Q29tbWVudHMoY2hpbGQsIGNvbW1lbnRzSW5zaWRlQ2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgYXR0cmlidXRlTGluZUNvbW1lbnRzT25TYW1lTGluZShjb21tZW50c1RvQXR0cmlidXRlLCBjaGlsZHJlbik7CisKKyAgICAgICAgLyogYXQgdGhpcyBwb2ludCBJIGNyZWF0ZSBhbiBvcmRlcmVkIGxpc3Qgb2YgYWxsIHJlbWFpbmluZyBjb21tZW50cyBhbmQKKyAgICAgICAgIGNoaWxkcmVuICovCisgICAgICAgIENvbW1lbnQgcHJldmlvdXNDb21tZW50ID0gbnVsbDsKKyAgICAgICAgZmluYWwgTGlzdDxDb21tZW50PiBhdHRyaWJ1dGVkQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGRyZW5BbmRDb21tZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgLy8gQXZvaWQgYXR0cmlidXRpbmcgY29tbWVudHMgdG8gYSBtZWFuaW5nbGVzcyBjb250YWluZXIuCisgICAgICAgIGNoaWxkcmVuQW5kQ29tbWVudHMuYWRkQWxsKGNoaWxkcmVuKTsKKyAgICAgICAgY29tbWVudHNUb0F0dHJpYnV0ZS5yZW1vdmVBbGwoYXR0cmlidXRlZENvbW1lbnRzKTsKKworICAgICAgICBjaGlsZHJlbkFuZENvbW1lbnRzLmFkZEFsbChjb21tZW50c1RvQXR0cmlidXRlKTsKKyAgICAgICAgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuQW5kQ29tbWVudHMsCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5pc0RvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uKCkpOworCisgICAgICAgIGZvciAoTm9kZSB0aGluZyA6IGNoaWxkcmVuQW5kQ29tbWVudHMpIHsKKyAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENvbW1lbnQpIHsKKyAgICAgICAgICAgICAgICBwcmV2aW91c0NvbW1lbnQgPSAoQ29tbWVudCkgdGhpbmc7CisgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c0NvbW1lbnQuaXNPcnBoYW4oKSkgeworICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tbWVudCAhPSBudWxsICYmICF0aGluZy5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLmlzRG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZGluZ0VtcHR5TGluZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICF0aGVyZUFyZUxpbmVzQmV0d2VlbihwcmV2aW91c0NvbW1lbnQsIHRoaW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuc2V0Q29tbWVudChwcmV2aW91c0NvbW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlZENvbW1lbnRzLmFkZChwcmV2aW91c0NvbW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21tZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbW1lbnRzVG9BdHRyaWJ1dGUucmVtb3ZlQWxsKGF0dHJpYnV0ZWRDb21tZW50cyk7CisKKyAgICAgICAgLy8gYWxsIHRoZSByZW1haW5pbmcgYXJlIG9ycGhhbiBub2RlcworICAgICAgICBmb3IgKENvbW1lbnQgYyA6IGNvbW1lbnRzVG9BdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIGlmIChjLmlzT3JwaGFuKCkpIHsKKyAgICAgICAgICAgICAgICBub2RlLmFkZE9ycGhhbkNvbW1lbnQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXR0cmlidXRlTGluZUNvbW1lbnRzT25TYW1lTGluZShUcmVlU2V0PENvbW1lbnQ+IGNvbW1lbnRzVG9BdHRyaWJ1dGUsIExpc3Q8Tm9kZT4gY2hpbGRyZW4pIHsKKyAgICAgICAgLyogSSBjYW4gYXR0cmlidXRlIGluIGxpbmUgY29tbWVudHMgdG8gZWxlbWVudHMgcHJlY2VlZGluZyB0aGVtLCBpZgorICAgICAgICAgdGhlcmUgaXMgc29tZXRoaW5nIGNvbnRhaW5lZCBpbiB0aGVpciBsaW5lICovCisgICAgICAgIExpc3Q8Q29tbWVudD4gYXR0cmlidXRlZENvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBjb21tZW50c1RvQXR0cmlidXRlLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihjb21tZW50IC0+IGNvbW1lbnQuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKENvbW1lbnQ6OmlzTGluZUNvbW1lbnQpCisgICAgICAgICAgICAgICAgLmZvckVhY2goY29tbWVudCAtPiBjaGlsZHJlbi5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjaGlsZCAtPiBjaGlsZC5nZXRSYW5nZSgpLmlzUHJlc2VudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY2hpbGQgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlIGNvbW1lbnRSYW5nZSA9IGNvbW1lbnQuZ2V0UmFuZ2UoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZSBjaGlsZFJhbmdlID0gY2hpbGQuZ2V0UmFuZ2UoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSYW5nZS5lbmQubGluZSA9PSBjb21tZW50UmFuZ2UuYmVnaW4ubGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXR0cmlidXRlTGluZUNvbW1lbnRUb05vZGVPckNoaWxkKGNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC5hc0xpbmVDb21tZW50KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZWRDb21tZW50cy5hZGQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICBjb21tZW50c1RvQXR0cmlidXRlLnJlbW92ZUFsbChhdHRyaWJ1dGVkQ29tbWVudHMpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVMaW5lQ29tbWVudFRvTm9kZU9yQ2hpbGQoTm9kZSBub2RlLCBMaW5lQ29tbWVudCBsaW5lQ29tbWVudCkgeworICAgICAgICBpZiAoIW5vZGUuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSB8fCAhbGluZUNvbW1lbnQuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUaGUgbm9kZSBzdGFydCBhbmQgZW5kIGF0IHRoZSBzYW1lIGxpbmUgYXMgdGhlIGNvbW1lbnQsCisgICAgICAgIC8vIGxldCdzIGdpdmUgdG8gaXQgdGhlIGNvbW1lbnQKKyAgICAgICAgaWYgKG5vZGUuZ2V0QmVnaW4oKS5nZXQoKS5saW5lID09IGxpbmVDb21tZW50LmdldEJlZ2luKCkuZ2V0KCkubGluZQorICAgICAgICAgICAgICAgICYmICFub2RlLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpKSB7CisgICAgICAgICAgICAgICAgbm9kZS5zZXRDb21tZW50KGxpbmVDb21tZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdHJ5IHdpdGggYWxsIHRoZSBjaGlsZHJlbiwgc29ydGVkIGJ5IHJldmVyc2UgcG9zaXRpb24gKHNvIHRoZQorICAgICAgICAgICAgLy8gZmlyc3Qgb25lIGlzIHRoZSBuZWFyZXN0IHRvIHRoZSBjb21tZW50CisgICAgICAgICAgICBMaXN0PE5vZGU+IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgY2hpbGRyZW4uYWRkQWxsKG5vZGUuZ2V0Q2hpbGROb2RlcygpKTsKKyAgICAgICAgICAgIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjaGlsZHJlbik7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGNoaWxkcmVuKTsKKworICAgICAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlTGluZUNvbW1lbnRUb05vZGVPckNoaWxkKGNoaWxkLCBsaW5lQ29tbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdGhlcmVBcmVMaW5lc0JldHdlZW4oTm9kZSBhLCBOb2RlIGIpIHsKKyAgICAgICAgaWYgKCFhLmdldFJhbmdlKCkuaXNQcmVzZW50KCkgfHwgIWIuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQb3NpdGlvblV0aWxzLmFyZUluT3JkZXIoYSwgYikpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGVyZUFyZUxpbmVzQmV0d2VlbihiLCBhKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5kT2ZBID0gYS5nZXRFbmQoKS5nZXQoKS5saW5lOworICAgICAgICByZXR1cm4gYi5nZXRCZWdpbigpLmdldCgpLmxpbmUgPiBlbmRPZkEgKyAxOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0hhc1BhcmVudE5vZGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9IYXNQYXJlbnROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkZjBkNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9IYXNQYXJlbnROb2RlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBbiBvYmplY3QgdGhhdCBoYXMgYSBwYXJlbnQgbm9kZS4KKyAqLworcHVibGljIGludGVyZmFjZSBIYXNQYXJlbnROb2RlPFQ+IGV4dGVuZHMgT2JzZXJ2YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhcmVudCBub2RlIG9yIG51bGwsIGlmIG5vIHBhcmVudCBpcyBzZXQuCisgICAgICovCisgICAgT3B0aW9uYWw8Tm9kZT4gZ2V0UGFyZW50Tm9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJlbnQgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIHRoZSBwYXJlbnQgbm9kZSBvciBudWxsLCB0byBzZXQgbm8gcGFyZW50CisgICAgICogQHJldHVybiByZXR1cm4gPGk+dGhpczwvaT4KKyAgICAgKi8KKyAgICBUIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKTsKKworICAgIC8qKgorICAgICAqIDxpPnRoaXM8L2k+IGZvciBldmVyeXRoaW5nIGV4Y2VwdCBOb2RlTGlzdHMuIE5vZGVMaXN0cyB1c2UgdGhlaXIgcGFyZW50IGFzIHRoZWlyIGNoaWxkcmVuIHBhcmVudC4KKyAgICAgKi8KKyAgICBOb2RlIGdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbmNlc3RvciBvZiB0aGUgbm9kZSBoYXZpbmcgdGhlIGdpdmVuIHR5cGUsIG9yIG51bGwgaWYgbm8gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHR5cGUgaXMgZm91bmQuCisgICAgICovCisgICAgZGVmYXVsdCA8Tj4gT3B0aW9uYWw8Tj4gZ2V0QW5jZXN0b3JPZlR5cGUoQ2xhc3M8Tj4gY2xhc3NUeXBlKSB7CisgICAgICAgIE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NUeXBlLmlzQXNzaWduYWJsZUZyb20ocGFyZW50LmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGNsYXNzVHlwZS5jYXN0KHBhcmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKS5vckVsc2UobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFQYXJzZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4ZWU4NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyLmphdmEKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuSmF2YWRvYzsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0Lio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm9ibGVtLlBST0JMRU1fQllfQkVHSU5fUE9TSVRJT047CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CisKKy8qKgorICogUGFyc2UgSmF2YSBzb3VyY2UgY29kZSBhbmQgY3JlYXRlcyBBYnN0cmFjdCBTeW50YXggVHJlZXMuCisgKgorICogQGF1dGhvciBKw7psaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmF2YVBhcnNlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICBwcml2YXRlIEdlbmVyYXRlZEphdmFQYXJzZXIgYXN0UGFyc2VyID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBQYXJzZXJDb25maWd1cmF0aW9uIHN0YXRpY0NvbmZpZ3VyYXRpb24gPSBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIHBhcnNlciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gTm90ZSB0aGF0IHBhcnNpbmcgY2FuIGFsc28gYmUgZG9uZSB3aXRoIHRoZSBzdGF0aWMgbWV0aG9kcyBvbgorICAgICAqIHRoaXMgY2xhc3MuCisgICAgICogQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugd2lsbCByZWR1Y2Ugc2V0dXAgdGltZSBiZXR3ZWVuIHBhcnNpbmcgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIEphdmFQYXJzZXIoKSB7CisgICAgICAgIHRoaXMobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGUgdGhlIHBhcnNlci4gTm90ZSB0aGF0IHBhcnNpbmcgY2FuIGFsc28gYmUgZG9uZSB3aXRoIHRoZSBzdGF0aWMgbWV0aG9kcyBvbiB0aGlzIGNsYXNzLgorICAgICAqIENyZWF0aW5nIGFuIGluc3RhbmNlIHdpbGwgcmVkdWNlIHNldHVwIHRpbWUgYmV0d2VlbiBwYXJzaW5nIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBKYXZhUGFyc2VyKFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHN0YXRpYyBwYXJzZS4uLiBtZXRob2RzLgorICAgICAqIFRoaXMgaXMgYSBTVEFUSUMgZmllbGQsIHNvIG1vZGlmeWluZyBpdCB3aWxsIGRpcmVjdGx5IGNoYW5nZSBob3cgYWxsIHN0YXRpYyBwYXJzZS4uLiBtZXRob2RzIHdvcmshCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJzZXJDb25maWd1cmF0aW9uIGdldFN0YXRpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHN0YXRpYyBwYXJzZS4uLiBtZXRob2RzLgorICAgICAqIFRoaXMgaXMgYSBTVEFUSUMgZmllbGQsIHNvIG1vZGlmeWluZyBpdCB3aWxsIGRpcmVjdGx5IGNoYW5nZSBob3cgYWxsIHN0YXRpYyBwYXJzZS4uLiBtZXRob2RzIHdvcmshCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0NvbmZpZ3VyYXRpb24oUGFyc2VyQ29uZmlndXJhdGlvbiBzdGF0aWNDb25maWd1cmF0aW9uKSB7CisgICAgICAgIEphdmFQYXJzZXIuc3RhdGljQ29uZmlndXJhdGlvbiA9IHN0YXRpY0NvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBub24tc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcGFyc2VyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbm9uLXN0YXRpYyBjb25maWd1cmF0aW9uIGZvciB0aGlzIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyc2VyQ29uZmlndXJhdGlvbiBnZXRQYXJzZXJDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgR2VuZXJhdGVkSmF2YVBhcnNlciBnZXRQYXJzZXJGb3JQcm92aWRlcihQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBpZiAoYXN0UGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFzdFBhcnNlciA9IG5ldyBHZW5lcmF0ZWRKYXZhUGFyc2VyKHByb3ZpZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzdFBhcnNlci5yZXNldChwcm92aWRlcik7CisgICAgICAgIH0KKyAgICAgICAgYXN0UGFyc2VyLnNldFRhYlNpemUoY29uZmlndXJhdGlvbi5nZXRUYWJTaXplKCkpOworICAgICAgICBhc3RQYXJzZXIuc2V0U3RvcmVUb2tlbnMoY29uZmlndXJhdGlvbi5pc1N0b3JlVG9rZW5zKCkpOworICAgICAgICByZXR1cm4gYXN0UGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBzb3VyY2UgY29kZS4KKyAgICAgKiBJdCB0YWtlcyB0aGUgc291cmNlIGNvZGUgZnJvbSBhIFByb3ZpZGVyLgorICAgICAqIFRoZSBzdGFydCBpbmRpY2F0ZXMgd2hhdCBjYW4gYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlIChjb21waWxhdGlvbiB1bml0LCBibG9jaywgaW1wb3J0Li4uKQorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IHJlZmVyIHRvIHRoZSBjb25zdGFudHMgaW4gUGFyc2VTdGFydCB0byBzZWUgd2hhdCBjYW4gYmUgcGFyc2VkLgorICAgICAqIEBwYXJhbSBwcm92aWRlciByZWZlciB0byBQcm92aWRlcnMgdG8gc2VlIGhvdyB5b3UgY2FuIHJlYWQgc291cmNlLiBUaGUgcHJvdmlkZXIgd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgcGFyc2luZy4KKyAgICAgKiBAcGFyYW0gPE4+IHRoZSBzdWJjbGFzcyBvZiBOb2RlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIGluIHRoZSBzdGFydC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZSByZXN1bHQsIGEgY29sbGVjdGlvbiBvZiBlbmNvdW50ZXJlZCBwcm9ibGVtcywgYW5kIHNvbWUgZXh0cmEgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPE4gZXh0ZW5kcyBOb2RlPiBQYXJzZVJlc3VsdDxOPiBwYXJzZShQYXJzZVN0YXJ0PE4+IHN0YXJ0LCBQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXJ0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlcik7CisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEphdmFQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyRm9yUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTiByZXN1bHROb2RlID0gc3RhcnQucGFyc2UocGFyc2VyKTsKKyAgICAgICAgICAgIFBhcnNlUmVzdWx0PE4+IHJlc3VsdCA9IG5ldyBQYXJzZVJlc3VsdDw+KHJlc3VsdE5vZGUsIHBhcnNlci5wcm9ibGVtcywgcGFyc2VyLmdldFRva2VucygpLAorICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkpOworCisgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFBvc3RQcm9jZXNzb3JzKCkuZm9yRWFjaChwb3N0UHJvY2Vzc29yIC0+CisgICAgICAgICAgICAgICAgICAgIHBvc3RQcm9jZXNzb3IucHJvY2VzcyhyZXN1bHQsIGNvbmZpZ3VyYXRpb24pKTsKKworICAgICAgICAgICAgcmVzdWx0LmdldFByb2JsZW1zKCkuc29ydChQUk9CTEVNX0JZX0JFR0lOX1BPU0lUSU9OKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICJVbmtub3duIGVycm9yIiA6IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgcGFyc2VyLnByb2JsZW1zLmFkZChuZXcgUHJvYmxlbShtZXNzYWdlLCBudWxsLCBlKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlUmVzdWx0PD4obnVsbCwgcGFyc2VyLnByb2JsZW1zLCBwYXJzZXIuZ2V0VG9rZW5zKCksIHBhcnNlci5nZXRDb21tZW50c0NvbGxlY3Rpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3ZpZGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgZG9uZSBwYXJzaW5nIGFuZCBoYXZlIG91ciByZXN1bHQsIHdlIGRvbid0IGNhcmUgYWJvdXQgYW55IGVycm9ycy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGluIHtAbGluayBJbnB1dFN0cmVhbX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlLiBJdCB3aWxsIGJlIGNsb3NlZCBhZnRlciBwYXJzaW5nLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBlbmNvZGluZyBvZiB0aGUgc291cmNlIGNvZGUKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpbiwgQ2hhcnNldCBlbmNvZGluZykgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGluLCBlbmNvZGluZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0Ljxicj4KKyAgICAgKiBOb3RlOiBVc2VzIFVURi04IGVuY29kaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4ge0BsaW5rIElucHV0U3RyZWFtfSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUuIEl0IHdpbGwgYmUgY2xvc2VkIGFmdGVyIHBhcnNpbmcuCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGluLCBVVEY4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSB7QGxpbmsgRmlsZX0gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHtAbGluayBGaWxlfSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUuIEl0IHdpbGwgYmUgY2xvc2VkIGFmdGVyIHBhcnNpbmcuCisgICAgICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgY29kZQorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHRoZSBmaWxlIHdhcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIENoYXJzZXQgZW5jb2RpbmcpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGZpbGUsIGVuY29kaW5nKSkuc2V0U3RvcmFnZShmaWxlLnRvUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSB7QGxpbmsgRmlsZX0gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICogTm90ZTogVXNlcyBVVEYtOCBlbmNvZGluZworICAgICAqCisgICAgICogQHBhcmFtIGZpbGUge0BsaW5rIEZpbGV9IGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZS4gSXQgd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgcGFyc2luZy4KKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB0aGUgZmlsZSB3YXMgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihmaWxlKSkuc2V0U3RvcmFnZShmaWxlLnRvUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSBmaWxlIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgYWNjZXNzZWQKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBQYXRoIHBhdGgsIGZpbmFsIENoYXJzZXQgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocGF0aCwgZW5jb2RpbmcpKS5zZXRTdG9yYWdlKHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiBhIGZpbGUgYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICogTm90ZTogVXNlcyBVVEYtOCBlbmNvZGluZworICAgICAqCisgICAgICogQHBhcmFtIHBhdGggcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgYWNjZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocGF0aCkpLnNldFN0b3JhZ2UocGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIGEgcmVzb3VyY2UgYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICogTm90ZTogVXNlcyBVVEYtOCBlbmNvZGluZworICAgICAqCisgICAgICogQHBhcmFtIHBhdGggcGF0aCB0byBhIHJlc291cmNlIGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZS4gQXMgcmVzb3VyY2UgaXMgYWNjZXNzZWQgdGhyb3VnaCBhIGNsYXNzIGxvYWRlciwgYQorICAgICAqIGxlYWRpbmcgIi8iIGlzIG5vdCBhbGxvd2VkIGluIHBhdGhUb1Jlc291cmNlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgYWNjZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZVJlc291cmNlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHJlc291cmNlUHJvdmlkZXIocGF0aCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiBhIHJlc291cmNlIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuPGJyPgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggcGF0aCB0byBhIHJlc291cmNlIGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZS4gQXMgcmVzb3VyY2UgaXMgYWNjZXNzZWQgdGhyb3VnaCBhIGNsYXNzIGxvYWRlciwgYQorICAgICAqIGxlYWRpbmcgIi8iIGlzIG5vdCBhbGxvd2VkIGluIHBhdGhUb1Jlc291cmNlCisgICAgICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgY29kZQorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhlIHBhdGggY291bGQgbm90IGJlIGFjY2Vzc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VSZXNvdXJjZShmaW5hbCBTdHJpbmcgcGF0aCwgQ2hhcnNldCBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCByZXNvdXJjZVByb3ZpZGVyKHBhdGgsIGVuY29kaW5nKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIGEgcmVzb3VyY2UgYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgdGhlIGNsYXNzTG9hZGVyIHRoYXQgaXMgYXNrZWQgdG8gbG9hZCB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIGEgcmVzb3VyY2UgY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlLiBBcyByZXNvdXJjZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIGEgY2xhc3MgbG9hZGVyLCBhCisgICAgICogbGVhZGluZyAiLyIgaXMgbm90IGFsbG93ZWQgaW4gcGF0aFRvUmVzb3VyY2UKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRoZSBwYXRoIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlUmVzb3VyY2UoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIGZpbmFsIFN0cmluZyBwYXRoLCBDaGFyc2V0IGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHJlc291cmNlUHJvdmlkZXIoY2xhc3NMb2FkZXIsIHBhdGgsIGVuY29kaW5nKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIEphdmEgY29kZSBmcm9tIGEgUmVhZGVyIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuPGJyPgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZS4gSXQgd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgcGFyc2luZy4KKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocmVhZGVyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIGNvZGUgYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShTdHJpbmcgY29kZSkgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGNvZGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgYmxvY2sgY29udGFpbmVkIGluIGEge0BsaW5rIFN0cmluZ30gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBCbG9ja1N0bXR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBibG9ja1N0YXRlbWVudCB7QGxpbmsgU3RyaW5nfSBjb250YWluaW5nIEphdmEgYmxvY2sgY29kZQorICAgICAqIEByZXR1cm4gQmxvY2tTdG10IHJlcHJlc2VudGluZyB0aGUgSmF2YSBibG9jaworICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmxvY2tTdG10IHBhcnNlQmxvY2soZmluYWwgU3RyaW5nIGJsb2NrU3RhdGVtZW50KSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQkxPQ0ssIHByb3ZpZGVyKGJsb2NrU3RhdGVtZW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIHN0YXRlbWVudCBjb250YWluZWQgaW4gYSB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIFN0YXRlbWVudH0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlbWVudCB7QGxpbmsgU3RyaW5nfSBjb250YWluaW5nIEphdmEgc3RhdGVtZW50IGNvZGUKKyAgICAgKiBAcmV0dXJuIFN0YXRlbWVudCByZXByZXNlbnRpbmcgdGhlIEphdmEgc3RhdGVtZW50CisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdGF0ZW1lbnQgcGFyc2VTdGF0ZW1lbnQoZmluYWwgU3RyaW5nIHN0YXRlbWVudCkgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoc3RhdGVtZW50KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBOb2RlPiBUIHNpbXBsaWZpZWRQYXJzZShQYXJzZVN0YXJ0PFQ+IGNvbnRleHQsIFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFQ+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKHN0YXRpY0NvbmZpZ3VyYXRpb24pLnBhcnNlKGNvbnRleHQsIHByb3ZpZGVyKTsKKyAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3NmdWwoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRSZXN1bHQoKS5nZXQoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUGFyc2VQcm9ibGVtRXhjZXB0aW9uKHJlc3VsdC5nZXRQcm9ibGVtcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgaW1wb3J0IGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgSW1wb3J0RGVjbGFyYXRpb259IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbXBvcnREZWNsYXJhdGlvbiB7QGxpbmsgU3RyaW5nfSBjb250YWluaW5nIEphdmEgaW1wb3J0IGNvZGUKKyAgICAgKiBAcmV0dXJuIEltcG9ydERlY2xhcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgSmF2YSBpbXBvcnQgZGVjbGFyYXRpb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydERlY2xhcmF0aW9uIHBhcnNlSW1wb3J0KGZpbmFsIFN0cmluZyBpbXBvcnREZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKElNUE9SVF9ERUNMQVJBVElPTiwgcHJvdmlkZXIoaW1wb3J0RGVjbGFyYXRpb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgZXhwcmVzc2lvbiBjb250YWluZWQgaW4gYSB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIEV4cHJlc3Npb259IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBleHByZXNzaW9uCisgICAgICogQHJldHVybiBFeHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgSmF2YSBleHByZXNzaW9uCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEV4cHJlc3Npb24+IFQgcGFyc2VFeHByZXNzaW9uKGZpbmFsIFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgIHJldHVybiAoVCkgc2ltcGxpZmllZFBhcnNlKEVYUFJFU1NJT04sIHByb3ZpZGVyKGV4cHJlc3Npb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgYW5ub3RhdGlvbiBjb250YWluZWQgaW4gYSB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIEFubm90YXRpb25FeHByfSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB7QGxpbmsgU3RyaW5nfSBjb250YWluaW5nIEphdmEgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gQW5ub3RhdGlvbkV4cHIgcmVwcmVzZW50aW5nIHRoZSBKYXZhIGFubm90YXRpb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25FeHByIHBhcnNlQW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbikgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKEFOTk9UQVRJT04sIHByb3ZpZGVyKGFubm90YXRpb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgYW5ub3RhdGlvbiBib2R5IGRlY2xhcmF0aW9uKGUuZyBmaWVsZHMgb3IgbWV0aG9kcykgY29udGFpbmVkIGluIGEKKyAgICAgKiB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhIHtAbGluayBCb2R5RGVjbGFyYXRpb259IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib2R5IHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBib2R5IGRlY2xhcmF0aW9uCisgICAgICogQHJldHVybiBCb2R5RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGFubm90YXRpb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJvZHlEZWNsYXJhdGlvbjw/PiBwYXJzZUFubm90YXRpb25Cb2R5RGVjbGFyYXRpb24oZmluYWwgU3RyaW5nIGJvZHkpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShBTk5PVEFUSU9OX0JPRFksIHByb3ZpZGVyKGJvZHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBKYXZhIGNsYXNzIGJvZHkgZGVjbGFyYXRpb24oZS5nIGZpZWxkcyBvciBtZXRob2RzKSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGJvZHkgdGhlIGJvZHkgb2YgYSBjbGFzcworICAgICAqIEByZXR1cm4gQm9keURlY2xhcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgSmF2YSBjbGFzcyBib2R5CisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICogQGRlcHJlY2F0ZWQganVzdCB1c2UgcGFyc2VCb2R5RGVjbGFyYXRpb24gbm93LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHN0YXRpYyBCb2R5RGVjbGFyYXRpb248Pz4gcGFyc2VDbGFzc0JvZHlEZWNsYXJhdGlvbihTdHJpbmcgYm9keSkgeworICAgICAgICByZXR1cm4gcGFyc2VCb2R5RGVjbGFyYXRpb24oYm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgSmF2YSBpbnRlcmZhY2UgYm9keSBkZWNsYXJhdGlvbihlLmcgZmllbGRzIG9yIG1ldGhvZHMpIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9keSB0aGUgYm9keSBvZiBhbiBpbnRlcmZhY2UKKyAgICAgKiBAcmV0dXJuIEJvZHlEZWNsYXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIEphdmEgaW50ZXJmYWNlIGJvZHkKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKiBAZGVwcmVjYXRlZCBqdXN0IHVzZSBwYXJzZUJvZHlEZWNsYXJhdGlvbiBub3cuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIEJvZHlEZWNsYXJhdGlvbjw/PiBwYXJzZUludGVyZmFjZUJvZHlEZWNsYXJhdGlvbihTdHJpbmcgYm9keSkgeworICAgICAgICByZXR1cm4gcGFyc2VCb2R5RGVjbGFyYXRpb24oYm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgSmF2YSBjbGFzcyBvciBpbnRlcmZhY2UgYm9keSBkZWNsYXJhdGlvbihlLmcgZmllbGRzIG9yIG1ldGhvZHMpIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9keSB0aGUgYm9keSBvZiBhIGNsYXNzIG9yIGludGVyZmFjZQorICAgICAqIEByZXR1cm4gQm9keURlY2xhcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgSmF2YSBpbnRlcmZhY2UgYm9keQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQm9keURlY2xhcmF0aW9uPD8+IHBhcnNlQm9keURlY2xhcmF0aW9uKFN0cmluZyBib2R5KSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ0xBU1NfQk9EWSwgcHJvdmlkZXIoYm9keSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIEphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGUgbmFtZSBhbmQgcmV0dXJucyBhIHtAbGluayBDbGFzc09ySW50ZXJmYWNlVHlwZX0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgbmFtZSBsaWtlIGEuYi5jLlggb3IgWQorICAgICAqIEByZXR1cm4gQ2xhc3NPckludGVyZmFjZVR5cGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ0xBU1NfT1JfSU5URVJGQUNFX1RZUEUsIHByb3ZpZGVyKHR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBKYXZhIHR5cGUgbmFtZSBhbmQgcmV0dXJucyBhIHtAbGluayBUeXBlfSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBuYW1lIGxpa2UgYS5iLmMuWCwgWSwgb3IgaW50CisgICAgICogQHJldHVybiBDbGFzc09ySW50ZXJmYWNlVHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR5cGUgcGFyc2VUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoVFlQRSwgcHJvdmlkZXIodHlwZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGV4cHJlc3Npb24gYW5kIHJldHVybnMgYSB7QGxpbmsgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByfQorICAgICAqIHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNsYXJhdGlvbiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGxpa2UgPGNvZGU+aW50IHg9Mjs8L2NvZGU+CisgICAgICogQHJldHVybiBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciByZXByZXNlbnRpbmcgdGhlIHR5cGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoU3RyaW5nIGRlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUiwgcHJvdmlkZXIoZGVjbGFyYXRpb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGNvbnRlbnQgb2YgYSBKYXZhZG9jQ29tbWVudCBhbmQgcmV0dXJucyBhIHtAbGluayBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYy5KYXZhZG9jfSB0aGF0CisgICAgICogcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gbGlrZSA8Y29kZT5jb250ZW50IG9mIG15IGphdmFkb2NcbiAqIHNlY29uZCBsaW5lXG4gKiB0aGlyZCBsaW5lPC9jb2RlPgorICAgICAqIEByZXR1cm4gSmF2YWRvYyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnQKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEphdmFkb2MgcGFyc2VKYXZhZG9jKFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHJldHVybiBKYXZhZG9jUGFyc2VyLnBhcnNlKGNvbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgdGhpcyguLi4pIGFuZCBzdXBlciguLi4pIHN0YXRlbWVudHMgdGhhdCBtYXkgb2NjdXIgYXQgdGhlIHN0YXJ0IG9mIGEgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGVtZW50IGEgc3RhdGVtZW50IGxpa2Ugc3VwZXIoImhlbGxvIik7CisgICAgICogQHJldHVybiB0aGUgQVNUIGZvciB0aGUgc3RhdGVtZW50LgorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IHBhcnNlRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KFN0cmluZyBzdGF0ZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShFWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1NUTVQsIHByb3ZpZGVyKHN0YXRlbWVudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHF1YWxpZmllZCBuYW1lIChvbmUgdGhhdCBjYW4gaGF2ZSAiLiJzIGluIGl0KSBhbmQgcmV0dXJucyBpdCBhcyBhIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBhIG5hbWUgbGlrZSAiY29tLmxhYW1lbGxhLnBhcmFtZXRlcl9zb3VyY2UiCisgICAgICogQHJldHVybiB0aGUgQVNUIGZvciB0aGUgbmFtZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmFtZSBwYXJzZU5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShOQU1FLCBwcm92aWRlcihxdWFsaWZpZWROYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgc2ltcGxlIG5hbWUgKG9uZSB0aGF0IGNhbiBOT1QgaGF2ZSAiLiJzIGluIGl0KSBhbmQgcmV0dXJucyBpdCBhcyBhIFNpbXBsZU5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgbGlrZSAicGFyYW1ldGVyX3NvdXJjZSIKKyAgICAgKiBAcmV0dXJuIHRoZSBBU1QgZm9yIHRoZSBuYW1lCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTaW1wbGVOYW1lIHBhcnNlU2ltcGxlTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKFNJTVBMRV9OQU1FLCBwcm92aWRlcihuYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgc2luZ2xlIHBhcmFtZXRlciAoYSB0eXBlIGFuZCBhIG5hbWUpIGFuZCByZXR1cm5zIGl0IGFzIGEgUGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciBhIHBhcmFtZXRlciBsaWtlICJpbnRbXSB4IgorICAgICAqIEByZXR1cm4gdGhlIEFTVCBmb3IgdGhlIHBhcmFtZXRlcgorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyIHBhcnNlUGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXIpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShQQVJBTUVURVIsIHByb3ZpZGVyKHBhcmFtZXRlcikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgcGFja2FnZSBkZWNsYXJhdGlvbiBhbmQgcmV0dXJucyBpdCBhcyBhIFBhY2thZ2VEZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlRGVjbGFyYXRpb24gYSBkZWNsYXJhdGlvbiBsaWtlICJwYWNrYWdlIGNvbS5taWNyb3NvZnQuamF2YTsiCisgICAgICogQHJldHVybiB0aGUgQVNUIGZvciB0aGUgcGFyYW1ldGVyCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYWNrYWdlRGVjbGFyYXRpb24gcGFyc2VQYWNrYWdlRGVjbGFyYXRpb24oU3RyaW5nIHBhY2thZ2VEZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKFBBQ0tBR0VfREVDTEFSQVRJT04sIHByb3ZpZGVyKHBhY2thZ2VEZWNsYXJhdGlvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhVG9rZW4uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU2ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFUb2tlbi5qYXZhCkBAIC0wLDAgKzEsNzk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKKworLyoqCisgKiBBIHRva2VuIGZyb20gYSBwYXJzZWQgc291cmNlIGZpbGUuCisgKiAoQXdrd2FyZGx5IG5hbWVkICJKYXZhIlRva2VuIHNpbmNlIEphdmFDQyBhbHJlYWR5IGdlbmVyYXRlcyBhbiBpbnRlcm5hbCBjbGFzcyBUb2tlbi4pCisgKiBJdCBpcyBhIG5vZGUgaW4gYSBkb3VibGUgbGlua2VkIGxpc3QgY2FsbGVkIHRva2VuIGxpc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhVG9rZW4geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVG9rZW4gSU5WQUxJRCA9IG5ldyBKYXZhVG9rZW4oKTsKKworICAgIHByaXZhdGUgUmFuZ2UgcmFuZ2U7CisKKyAgICBwcml2YXRlIGludCBraW5kOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworICAgIHByaXZhdGUgSmF2YVRva2VuIHByZXZpb3VzVG9rZW4gPSBudWxsOworCisgICAgcHJpdmF0ZSBKYXZhVG9rZW4gbmV4dFRva2VuID0gbnVsbDsKKworICAgIHByaXZhdGUgSmF2YVRva2VuKCkgeworICAgICAgICB0aGlzKG51bGwsIDAsICJJTlZBTElEIiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEphdmFUb2tlbihpbnQga2luZCwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBraW5kLCB0ZXh0LCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBKYXZhVG9rZW4oVG9rZW4gdG9rZW4sIExpc3Q8SmF2YVRva2VuPiB0b2tlbnMpIHsKKyAgICAgICAgLy8gWW91IGNvdWxkIGJlIHB1enpsZWQgYnkgdGhlIGZvbGxvd2luZyBsaW5lcworICAgICAgICAvLyAKKyAgICAgICAgLy8gVGhlIHJlYXNvbiB3aHkgdGhlc2UgbGluZXMgYXJlIG5lY2Vzc2FyeSBpcyB0aGUgZmFjdCB0aGF0IEphdmEgaXMgYW1iaWd1b3VzLiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlCisgICAgICAgIC8vIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgIj4+PiIgYW5kICI+PiIgc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgdGhlIHNpbmdsZSB0b2tlbnMgIj4+PiIgYW5kICI+PiIuIEluIG90aGVyCisgICAgICAgIC8vIGNhc2VzIGhvd2V2ZXIgd2Ugd2FudCB0byBzcGxpdCB0aG9zZSBjaGFyYWN0ZXJzIGluIHNpbmdsZSBHVCB0b2tlbnMgKCI+IikuCisgICAgICAgIC8vIAorICAgICAgICAvLyBGb3IgZXhhbXBsZSwgaW4gZXhwcmVzc2lvbnMgIj4+IiBhbmQgIj4+PiIgYXJlIHZhbGlkLCB3aGlsZSB3aGVuIGRlZmluaW5nIHR5cGVzIHdlIGNvdWxkIGhhdmUgdGhpczoKKyAgICAgICAgLy8gCisgICAgICAgIC8vIExpc3Q8TGlzdDxTZXQ8U3RyaW5nPj4+PgorICAgICAgICAvLyAKKyAgICAgICAgLy8gWW91IGNhbiBzZWUgdGhhdCB0aGUgc2VxdWVuY2UgIj4+Pj4iIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBmb3VyIGNvbnNlY3V0aXZlICI+IiB0b2tlbnMgY2xvc2luZyBhIHR5cGUKKyAgICAgICAgLy8gcGFyYW1ldGVyIGxpc3QuCisgICAgICAgIC8vIAorICAgICAgICAvLyBUaGUgSmF2YUNDIGhhbmRsZSB0aGlzIGNhc2UgYnkgZmlyc3QgcmVjb2duaXppbmcgYWx3YXlzIHRoZSBsb25nZXN0IHRva2VuLCBhbmQgdGhlbiBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQKKyAgICAgICAgLy8gcHV0dGluZyBiYWNrIHRoZSB1bnVzZWQgY2hhcnMgaW4gdGhlIHN0cmVhbS4gSG93ZXZlciBpbiB0aG9zZSBjYXNlcyB0aGUgdG9rZW4gcHJvdmlkZWQgaXMgaW52YWxpZDogaXQgaGFzIGFuCisgICAgICAgIC8vIGltYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRleHQgb3JpZ2luYWxseSByZWNvZ25pemVkLCB3aXRob3V0IGNvbnNpZGVyaW5nIHRoYXQgYWZ0ZXIgc29tZSBjaGFyYWN0ZXJzIGNvdWxkCisgICAgICAgIC8vIGhhdmUgYmVlbiBwdXQgYmFjayBpbnRvIHRoZSBzdHJlYW0uCisgICAgICAgIC8vIAorICAgICAgICAvLyBTbyBpbiB0aGUgY2FzZSBvZjoKKyAgICAgICAgLy8gCisgICAgICAgIC8vIExpc3Q8TGlzdDxTZXQ8U3RyaW5nPj4+PgorICAgICAgICAvLyBfX18gICAtPiByZWNvZ25pemVkIGFzICI+Pj4iLCB0aGVuICI+PiIgcHV0IGJhY2sgaW4gdGhlIHN0cmVhbSBidXQgVG9rZW4odHlwZT1HVCwgaW1hZ2U9Ij4+PiIpIHBhc3NlZCB0byB0aGlzIGNsYXNzCisgICAgICAgIC8vIF9fXyAgLT4gcmVjb2duaXplZCBhcyAiPj4+IiwgdGhlbiAiPj4iIHB1dCBiYWNrIGluIHRoZSBzdHJlYW0gYnV0IFRva2VuKHR5cGU9R1QsIGltYWdlPSI+Pj4iKSBwYXNzZWQgdG8gdGhpcyBjbGFzcworICAgICAgICAvLyBfXyAgLT4gcmVjb2duaXplZCBhcyAiPj4iLCB0aGVuICI+IiBwdXQgYmFjayBpbiB0aGUgc3RyZWFtIGJ1dCBUb2tlbih0eXBlPUdULCBpbWFnZT0iPj4iKSBwYXNzZWQgdG8gdGhpcyBjbGFzcworICAgICAgICAvLyBfICAtPiBUb2tlbih0eXBlPUdULCBpbWFnZT0iPiIpIGdvb2QhCisgICAgICAgIC8vIAorICAgICAgICAvLyBTbyBnaXZlbiB0aGUgaW1hZ2UgY291bGQgYmUgd3JvbmcgYnV0IHRoZSB0eXBlIGlzIGNvcnJlY3QsIHdlIGxvb2sgYXQgdGhlIHR5cGUgb2YgdGhlIHRva2VuIGFuZCB3ZSBmaXgKKyAgICAgICAgLy8gdGhlIGltYWdlLiBFdmVyeWJvZHkgaXMgaGFwcHkgYW5kIHdlIGNhbiBrZWVwIHRoaXMgaG9ycmlibGUgdGhpbmcgYXMgb3VyIGxpdHRsZSBzZWNyZXQuCisgICAgICAgIFJhbmdlIHJhbmdlID0gUmFuZ2UucmFuZ2UodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSB0b2tlbi5pbWFnZTsKKyAgICAgICAgaWYgKHRva2VuLmtpbmQgPT0gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5HVCkgeworICAgICAgICAgICAgcmFuZ2UgPSBSYW5nZS5yYW5nZSh0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5iZWdpbkNvbHVtbik7CisgICAgICAgICAgICB0ZXh0ID0gIj4iOworICAgICAgICB9IGVsc2UgaWYgKHRva2VuLmtpbmQgPT0gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SU0lHTkVEU0hJRlQpIHsKKyAgICAgICAgICAgIHJhbmdlID0gUmFuZ2UucmFuZ2UodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4gKyAxKTsKKyAgICAgICAgICAgIHRleHQgPSAiPj4iOworICAgICAgICB9CisgICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsKKyAgICAgICAgdGhpcy5raW5kID0gdG9rZW4ua2luZDsKKyAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgaWYgKCF0b2tlbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBKYXZhVG9rZW4gcHJldmlvdXNUb2tlbiA9IHRva2Vucy5nZXQodG9rZW5zLnNpemUoKSAtIDEpOworICAgICAgICAgICAgdGhpcy5wcmV2aW91c1Rva2VuID0gcHJldmlvdXNUb2tlbjsKKyAgICAgICAgICAgIHByZXZpb3VzVG9rZW4ubmV4dFRva2VuID0gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZpb3VzVG9rZW4gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgdG9rZW4gb2YgYSBjZXJ0YWluIGtpbmQuCisgICAgICovCisgICAgcHVibGljIEphdmFUb2tlbihpbnQga2luZCkgeworICAgICAgICBTdHJpbmcgY29udGVudCA9IEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMudG9rZW5JbWFnZVtraW5kXTsKKyAgICAgICAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aCgiXCIiKSkgeworICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDEsIGNvbnRlbnQubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVG9rZW5UeXBlcy5pc0VuZE9mTGluZVRva2VuKGtpbmQpKSB7CisgICAgICAgICAgICBjb250ZW50ID0gRU9MOworICAgICAgICB9IGVsc2UgaWYgKFRva2VuVHlwZXMuaXNXaGl0ZXNwYWNlKGtpbmQpKSB7CisgICAgICAgICAgICBjb250ZW50ID0gIiAiOworICAgICAgICB9CisgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CisgICAgICAgIHRoaXMudGV4dCA9IGNvbnRlbnQ7CisgICAgfQorCisgICAgcHVibGljIEphdmFUb2tlbihSYW5nZSByYW5nZSwgaW50IGtpbmQsIFN0cmluZyB0ZXh0LCBKYXZhVG9rZW4gcHJldmlvdXNUb2tlbiwgSmF2YVRva2VuIG5leHRUb2tlbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKHRleHQpOworICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7CisgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CisgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMucHJldmlvdXNUb2tlbiA9IHByZXZpb3VzVG9rZW47CisgICAgICAgIHRoaXMubmV4dFRva2VuID0gbmV4dFRva2VuOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxSYW5nZT4gZ2V0UmFuZ2UoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHJhbmdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7CisgICAgICAgIHJldHVybiBraW5kOworICAgIH0KKworICAgIHZvaWQgc2V0S2luZChpbnQga2luZCkgeworICAgICAgICB0aGlzLmtpbmQgPSBraW5kOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgcHVibGljIE9wdGlvbmFsPEphdmFUb2tlbj4gZ2V0TmV4dFRva2VuKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShuZXh0VG9rZW4pOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxKYXZhVG9rZW4+IGdldFByZXZpb3VzVG9rZW4oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHByZXZpb3VzVG9rZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJhbmdlKFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG9rZW4gcmFuZ2UgdGhhdCBnb2VzIGZyb20gdGhlIGJlZ2lubmluZyB0byB0aGUgZW5kIG9mIHRoZSB0b2tlbiBsaXN0IHRoaXMgdG9rZW4gaXMgYSBwYXJ0IG9mLgorICAgICAqLworICAgIHB1YmxpYyBUb2tlblJhbmdlIHRvVG9rZW5SYW5nZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlblJhbmdlKGZpbmRGaXJzdFRva2VuKCksIGZpbmRMYXN0VG9rZW4oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUZXh0KCkucmVwbGFjZSgiXG4iLCAiXFxuIikucmVwbGFjZSgiXHIiLCAiXFxyIikucmVwbGFjZSgiXHJcbiIsICJcXHJcXG4iKS5yZXBsYWNlKCJcdCIsICJcXHQiKTsKKyAgICAgICAgcmV0dXJuIGYoIlwiJXNcIiAgIDwlcz4gICAlcyIsIHRleHQsIGdldEtpbmQoKSwgZ2V0UmFuZ2UoKS5tYXAoUmFuZ2U6OnRvU3RyaW5nKS5vckVsc2UoIig/KS0oPykiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSB0aGUgcGFyc2VyIHdoaWxlIGNvbnN0cnVjdGluZyBub2Rlcy4gTm8gdG9rZW5zIHNob3VsZCBiZSBpbnZhbGlkIHdoZW4gdGhlIHBhcnNlciBpcyBkb25lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZhbGlkKCkgeworICAgICAgICByZXR1cm4gIWludmFsaWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHRoZSBwYXJzZXIgd2hpbGUgY29uc3RydWN0aW5nIG5vZGVzLiBObyB0b2tlbnMgc2hvdWxkIGJlIGludmFsaWQgd2hlbiB0aGUgcGFyc2VyIGlzIGRvbmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaW52YWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMgPT0gSU5WQUxJRDsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBDYXRlZ29yeSB7CisKKyAgICAgICAgV0hJVEVTUEFDRV9OT19FT0wsCisgICAgICAgIEVPTCwKKyAgICAgICAgQ09NTUVOVCwKKyAgICAgICAgSURFTlRJRklFUiwKKyAgICAgICAgS0VZV09SRCwKKyAgICAgICAgTElURVJBTCwKKyAgICAgICAgU0VQQVJBVE9SLAorICAgICAgICBPUEVSQVRPUjsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2VPckNvbW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gaXNXaGl0ZXNwYWNlKCkgfHwgdGhpcyA9PSBDT01NRU5UOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gV0hJVEVTUEFDRV9OT19FT0wgfHwgdGhpcyA9PSBFT0w7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZE9mTGluZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IEVPTDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IENPTU1FTlQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2VCdXROb3RFbmRPZkxpbmUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBXSElURVNQQUNFX05PX0VPTDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSWRlbnRpZmllcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IElERU5USUZJRVI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0tleXdvcmQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBLRVlXT1JEOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMaXRlcmFsKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gTElURVJBTDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VwYXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gU0VQQVJBVE9SOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IE9QRVJBVE9SOworICAgICAgICB9CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm90aGVyLlRva2VuS2luZEdlbmVyYXRvciIpCisgICAgcHVibGljIGVudW0gS2luZCB7CisKKyAgICAgICAgRU9GKDApLAorICAgICAgICBTUEFDRSgxKSwKKyAgICAgICAgV0lORE9XU19FT0woMiksCisgICAgICAgIFVOSVhfRU9MKDMpLAorICAgICAgICBPTERfTUFDX0VPTCg0KSwKKyAgICAgICAgU0lOR0xFX0xJTkVfQ09NTUVOVCg1KSwKKyAgICAgICAgRU5URVJfSkFWQURPQ19DT01NRU5UKDYpLAorICAgICAgICBFTlRFUl9NVUxUSUxJTkVfQ09NTUVOVCg3KSwKKyAgICAgICAgSkFWQURPQ19DT01NRU5UKDgpLAorICAgICAgICBNVUxUSV9MSU5FX0NPTU1FTlQoOSksCisgICAgICAgIENPTU1FTlRfQ09OVEVOVCgxMCksCisgICAgICAgIEFCU1RSQUNUKDExKSwKKyAgICAgICAgQVNTRVJUKDEyKSwKKyAgICAgICAgQk9PTEVBTigxMyksCisgICAgICAgIEJSRUFLKDE0KSwKKyAgICAgICAgQllURSgxNSksCisgICAgICAgIENBU0UoMTYpLAorICAgICAgICBDQVRDSCgxNyksCisgICAgICAgIENIQVIoMTgpLAorICAgICAgICBDTEFTUygxOSksCisgICAgICAgIENPTlNUKDIwKSwKKyAgICAgICAgQ09OVElOVUUoMjEpLAorICAgICAgICBfREVGQVVMVCgyMiksCisgICAgICAgIERPKDIzKSwKKyAgICAgICAgRE9VQkxFKDI0KSwKKyAgICAgICAgRUxTRSgyNSksCisgICAgICAgIEVOVU0oMjYpLAorICAgICAgICBFWFRFTkRTKDI3KSwKKyAgICAgICAgRkFMU0UoMjgpLAorICAgICAgICBGSU5BTCgyOSksCisgICAgICAgIEZJTkFMTFkoMzApLAorICAgICAgICBGTE9BVCgzMSksCisgICAgICAgIEZPUigzMiksCisgICAgICAgIEdPVE8oMzMpLAorICAgICAgICBJRigzNCksCisgICAgICAgIElNUExFTUVOVFMoMzUpLAorICAgICAgICBJTVBPUlQoMzYpLAorICAgICAgICBJTlNUQU5DRU9GKDM3KSwKKyAgICAgICAgSU5UKDM4KSwKKyAgICAgICAgSU5URVJGQUNFKDM5KSwKKyAgICAgICAgTE9ORyg0MCksCisgICAgICAgIE5BVElWRSg0MSksCisgICAgICAgIE5FVyg0MiksCisgICAgICAgIE5VTEwoNDMpLAorICAgICAgICBQQUNLQUdFKDQ0KSwKKyAgICAgICAgUFJJVkFURSg0NSksCisgICAgICAgIFBST1RFQ1RFRCg0NiksCisgICAgICAgIFBVQkxJQyg0NyksCisgICAgICAgIFJFVFVSTig0OCksCisgICAgICAgIFNIT1JUKDQ5KSwKKyAgICAgICAgU1RBVElDKDUwKSwKKyAgICAgICAgU1RSSUNURlAoNTEpLAorICAgICAgICBTVVBFUig1MiksCisgICAgICAgIFNXSVRDSCg1MyksCisgICAgICAgIFNZTkNIUk9OSVpFRCg1NCksCisgICAgICAgIFRISVMoNTUpLAorICAgICAgICBUSFJPVyg1NiksCisgICAgICAgIFRIUk9XUyg1NyksCisgICAgICAgIFRSQU5TSUVOVCg1OCksCisgICAgICAgIFRSVUUoNTkpLAorICAgICAgICBUUlkoNjApLAorICAgICAgICBWT0lEKDYxKSwKKyAgICAgICAgVk9MQVRJTEUoNjIpLAorICAgICAgICBXSElMRSg2MyksCisgICAgICAgIFJFUVVJUkVTKDY0KSwKKyAgICAgICAgVE8oNjUpLAorICAgICAgICBXSVRIKDY2KSwKKyAgICAgICAgT1BFTig2NyksCisgICAgICAgIE9QRU5TKDY4KSwKKyAgICAgICAgVVNFUyg2OSksCisgICAgICAgIE1PRFVMRSg3MCksCisgICAgICAgIEVYUE9SVFMoNzEpLAorICAgICAgICBQUk9WSURFUyg3MiksCisgICAgICAgIFRSQU5TSVRJVkUoNzMpLAorICAgICAgICBMT05HX0xJVEVSQUwoNzQpLAorICAgICAgICBJTlRFR0VSX0xJVEVSQUwoNzUpLAorICAgICAgICBERUNJTUFMX0xJVEVSQUwoNzYpLAorICAgICAgICBIRVhfTElURVJBTCg3NyksCisgICAgICAgIE9DVEFMX0xJVEVSQUwoNzgpLAorICAgICAgICBCSU5BUllfTElURVJBTCg3OSksCisgICAgICAgIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwoODApLAorICAgICAgICBERUNJTUFMX0ZMT0FUSU5HX1BPSU5UX0xJVEVSQUwoODEpLAorICAgICAgICBERUNJTUFMX0VYUE9ORU5UKDgyKSwKKyAgICAgICAgSEVYQURFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTCg4MyksCisgICAgICAgIEhFWEFERUNJTUFMX0VYUE9ORU5UKDg0KSwKKyAgICAgICAgSEVYX0RJR0lUUyg4NSksCisgICAgICAgIFVOSUNPREVfRVNDQVBFKDg2KSwKKyAgICAgICAgQ0hBUkFDVEVSX0xJVEVSQUwoODcpLAorICAgICAgICBTVFJJTkdfTElURVJBTCg4OCksCisgICAgICAgIElERU5USUZJRVIoODkpLAorICAgICAgICBMRVRURVIoOTApLAorICAgICAgICBQQVJUX0xFVFRFUig5MSksCisgICAgICAgIExQQVJFTig5MiksCisgICAgICAgIFJQQVJFTig5MyksCisgICAgICAgIExCUkFDRSg5NCksCisgICAgICAgIFJCUkFDRSg5NSksCisgICAgICAgIExCUkFDS0VUKDk2KSwKKyAgICAgICAgUkJSQUNLRVQoOTcpLAorICAgICAgICBTRU1JQ09MT04oOTgpLAorICAgICAgICBDT01NQSg5OSksCisgICAgICAgIERPVCgxMDApLAorICAgICAgICBBVCgxMDEpLAorICAgICAgICBBU1NJR04oMTAyKSwKKyAgICAgICAgTFQoMTAzKSwKKyAgICAgICAgQkFORygxMDQpLAorICAgICAgICBUSUxERSgxMDUpLAorICAgICAgICBIT09LKDEwNiksCisgICAgICAgIENPTE9OKDEwNyksCisgICAgICAgIEVRKDEwOCksCisgICAgICAgIExFKDEwOSksCisgICAgICAgIEdFKDExMCksCisgICAgICAgIE5FKDExMSksCisgICAgICAgIFNDX09SKDExMiksCisgICAgICAgIFNDX0FORCgxMTMpLAorICAgICAgICBJTkNSKDExNCksCisgICAgICAgIERFQ1IoMTE1KSwKKyAgICAgICAgUExVUygxMTYpLAorICAgICAgICBNSU5VUygxMTcpLAorICAgICAgICBTVEFSKDExOCksCisgICAgICAgIFNMQVNIKDExOSksCisgICAgICAgIEJJVF9BTkQoMTIwKSwKKyAgICAgICAgQklUX09SKDEyMSksCisgICAgICAgIFhPUigxMjIpLAorICAgICAgICBSRU0oMTIzKSwKKyAgICAgICAgTFNISUZUKDEyNCksCisgICAgICAgIFBMVVNBU1NJR04oMTI1KSwKKyAgICAgICAgTUlOVVNBU1NJR04oMTI2KSwKKyAgICAgICAgU1RBUkFTU0lHTigxMjcpLAorICAgICAgICBTTEFTSEFTU0lHTigxMjgpLAorICAgICAgICBBTkRBU1NJR04oMTI5KSwKKyAgICAgICAgT1JBU1NJR04oMTMwKSwKKyAgICAgICAgWE9SQVNTSUdOKDEzMSksCisgICAgICAgIFJFTUFTU0lHTigxMzIpLAorICAgICAgICBMU0hJRlRBU1NJR04oMTMzKSwKKyAgICAgICAgUlNJR05FRFNISUZUQVNTSUdOKDEzNCksCisgICAgICAgIFJVTlNJR05FRFNISUZUQVNTSUdOKDEzNSksCisgICAgICAgIEVMTElQU0lTKDEzNiksCisgICAgICAgIEFSUk9XKDEzNyksCisgICAgICAgIERPVUJMRUNPTE9OKDEzOCksCisgICAgICAgIFJVTlNJR05FRFNISUZUKDEzOSksCisgICAgICAgIFJTSUdORURTSElGVCgxNDApLAorICAgICAgICBHVCgxNDEpLAorICAgICAgICBDVFJMX1ooMTQyKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBraW5kOworCisgICAgICAgIEtpbmQoaW50IGtpbmQpIHsKKyAgICAgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEtpbmQgdmFsdWVPZihpbnQga2luZCkgeworICAgICAgICAgICAgc3dpdGNoKGtpbmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE0MjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENUUkxfWjsKKyAgICAgICAgICAgICAgICBjYXNlIDE0MToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdUOworICAgICAgICAgICAgICAgIGNhc2UgMTQwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUlNJR05FRFNISUZUOworICAgICAgICAgICAgICAgIGNhc2UgMTM5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUlVOU0lHTkVEU0hJRlQ7CisgICAgICAgICAgICAgICAgY2FzZSAxMzg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVDT0xPTjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFSUk9XOworICAgICAgICAgICAgICAgIGNhc2UgMTM2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUxMSVBTSVM7CisgICAgICAgICAgICAgICAgY2FzZSAxMzU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSVU5TSUdORURTSElGVEFTU0lHTjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzNDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJTSUdORURTSElGVEFTU0lHTjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzMzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExTSElGVEFTU0lHTjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJFTUFTU0lHTjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhPUkFTU0lHTjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9SQVNTSUdOOworICAgICAgICAgICAgICAgIGNhc2UgMTI5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU5EQVNTSUdOOworICAgICAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0xBU0hBU1NJR047CisgICAgICAgICAgICAgICAgY2FzZSAxMjc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFSQVNTSUdOOworICAgICAgICAgICAgICAgIGNhc2UgMTI2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUlOVVNBU1NJR047CisgICAgICAgICAgICAgICAgY2FzZSAxMjU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQTFVTQVNTSUdOOworICAgICAgICAgICAgICAgIGNhc2UgMTI0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTFNISUZUOworICAgICAgICAgICAgICAgIGNhc2UgMTIzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVNOworICAgICAgICAgICAgICAgIGNhc2UgMTIyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWE9SOworICAgICAgICAgICAgICAgIGNhc2UgMTIxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQklUX09SOworICAgICAgICAgICAgICAgIGNhc2UgMTIwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQklUX0FORDsKKyAgICAgICAgICAgICAgICBjYXNlIDExOToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNMQVNIOworICAgICAgICAgICAgICAgIGNhc2UgMTE4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUjsKKyAgICAgICAgICAgICAgICBjYXNlIDExNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1JTlVTOworICAgICAgICAgICAgICAgIGNhc2UgMTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUExVUzsKKyAgICAgICAgICAgICAgICBjYXNlIDExNToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ1I7CisgICAgICAgICAgICAgICAgY2FzZSAxMTQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTkNSOworICAgICAgICAgICAgICAgIGNhc2UgMTEzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NfQU5EOworICAgICAgICAgICAgICAgIGNhc2UgMTEyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NfT1I7CisgICAgICAgICAgICAgICAgY2FzZSAxMTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBORTsKKyAgICAgICAgICAgICAgICBjYXNlIDExMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdFOworICAgICAgICAgICAgICAgIGNhc2UgMTA5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEU7CisgICAgICAgICAgICAgICAgY2FzZSAxMDg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUTsKKyAgICAgICAgICAgICAgICBjYXNlIDEwNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9OOworICAgICAgICAgICAgICAgIGNhc2UgMTA2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSE9PSzsKKyAgICAgICAgICAgICAgICBjYXNlIDEwNToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTERFOworICAgICAgICAgICAgICAgIGNhc2UgMTA0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFORzsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExUOworICAgICAgICAgICAgICAgIGNhc2UgMTAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVNTSUdOOworICAgICAgICAgICAgICAgIGNhc2UgMTAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVQ7CisgICAgICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBET1Q7CisgICAgICAgICAgICAgICAgY2FzZSA5OToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTU1BOworICAgICAgICAgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTRU1JQ09MT047CisgICAgICAgICAgICAgICAgY2FzZSA5NzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJCUkFDS0VUOworICAgICAgICAgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMQlJBQ0tFVDsKKyAgICAgICAgICAgICAgICBjYXNlIDk1OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkJSQUNFOworICAgICAgICAgICAgICAgIGNhc2UgOTQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMQlJBQ0U7CisgICAgICAgICAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJQQVJFTjsKKyAgICAgICAgICAgICAgICBjYXNlIDkyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTFBBUkVOOworICAgICAgICAgICAgICAgIGNhc2UgOTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQQVJUX0xFVFRFUjsKKyAgICAgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEVUVEVSOworICAgICAgICAgICAgICAgIGNhc2UgODk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJREVOVElGSUVSOworICAgICAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVFJJTkdfTElURVJBTDsKKyAgICAgICAgICAgICAgICBjYXNlIDg3OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUkFDVEVSX0xJVEVSQUw7CisgICAgICAgICAgICAgICAgY2FzZSA4NjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOSUNPREVfRVNDQVBFOworICAgICAgICAgICAgICAgIGNhc2UgODU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRVhfRElHSVRTOworICAgICAgICAgICAgICAgIGNhc2UgODQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBIRVhBREVDSU1BTF9FWFBPTkVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIDgzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSEVYQURFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTDsKKyAgICAgICAgICAgICAgICBjYXNlIDgyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVDSU1BTF9FWFBPTkVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIDgxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVDSU1BTF9GTE9BVElOR19QT0lOVF9MSVRFUkFMOworICAgICAgICAgICAgICAgIGNhc2UgODA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGTE9BVElOR19QT0lOVF9MSVRFUkFMOworICAgICAgICAgICAgICAgIGNhc2UgNzk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCSU5BUllfTElURVJBTDsKKyAgICAgICAgICAgICAgICBjYXNlIDc4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0NUQUxfTElURVJBTDsKKyAgICAgICAgICAgICAgICBjYXNlIDc3OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSEVYX0xJVEVSQUw7CisgICAgICAgICAgICAgICAgY2FzZSA3NjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ0lNQUxfTElURVJBTDsKKyAgICAgICAgICAgICAgICBjYXNlIDc1OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9MSVRFUkFMOworICAgICAgICAgICAgICAgIGNhc2UgNzQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMT05HX0xJVEVSQUw7CisgICAgICAgICAgICAgICAgY2FzZSA3MzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSQU5TSVRJVkU7CisgICAgICAgICAgICAgICAgY2FzZSA3MjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBST1ZJREVTOworICAgICAgICAgICAgICAgIGNhc2UgNzE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWFBPUlRTOworICAgICAgICAgICAgICAgIGNhc2UgNzA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEU7CisgICAgICAgICAgICAgICAgY2FzZSA2OToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVTRVM7CisgICAgICAgICAgICAgICAgY2FzZSA2ODoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QRU5TOworICAgICAgICAgICAgICAgIGNhc2UgNjc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEVOOworICAgICAgICAgICAgICAgIGNhc2UgNjY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSVRIOworICAgICAgICAgICAgICAgIGNhc2UgNjU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUTzsKKyAgICAgICAgICAgICAgICBjYXNlIDY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVRVUlSRVM7CisgICAgICAgICAgICAgICAgY2FzZSA2MzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdISUxFOworICAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWT0xBVElMRTsKKyAgICAgICAgICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVk9JRDsKKyAgICAgICAgICAgICAgICBjYXNlIDYwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJZOworICAgICAgICAgICAgICAgIGNhc2UgNTk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGNhc2UgNTg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUkFOU0lFTlQ7CisgICAgICAgICAgICAgICAgY2FzZSA1NzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRIUk9XUzsKKyAgICAgICAgICAgICAgICBjYXNlIDU2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEhST1c7CisgICAgICAgICAgICAgICAgY2FzZSA1NToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRISVM7CisgICAgICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNZTkNIUk9OSVpFRDsKKyAgICAgICAgICAgICAgICBjYXNlIDUzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJVENIOworICAgICAgICAgICAgICAgIGNhc2UgNTI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVVBFUjsKKyAgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RSSUNURlA7CisgICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRJQzsKKyAgICAgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0hPUlQ7CisgICAgICAgICAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJFVFVSTjsKKyAgICAgICAgICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFVCTElDOworICAgICAgICAgICAgICAgIGNhc2UgNDY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQUk9URUNURUQ7CisgICAgICAgICAgICAgICAgY2FzZSA0NToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBSSVZBVEU7CisgICAgICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBBQ0tBR0U7CisgICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgY2FzZSA0MjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FVzsKKyAgICAgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFUSVZFOworICAgICAgICAgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMT05HOworICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlRFUkZBQ0U7CisgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVDsKKyAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5TVEFOQ0VPRjsKKyAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU1QT1JUOworICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTVBMRU1FTlRTOworICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRjsKKyAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gR09UTzsKKyAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRk9SOworICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGTE9BVDsKKyAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRklOQUxMWTsKKyAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRklOQUw7CisgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFWFRFTkRTOworICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlVNOworICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTFNFOworICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEU7CisgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERPOworICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfREVGQVVMVDsKKyAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09OVElOVUU7CisgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTlNUOworICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDTEFTUzsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUjsKKyAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0FUQ0g7CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENBU0U7CisgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJZVEU7CisgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLOworICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCT09MRUFOOworICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBU1NFUlQ7CisgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFCU1RSQUNUOworICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT01NRU5UX0NPTlRFTlQ7CisgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTVVMVElfTElORV9DT01NRU5UOworICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBVkFET0NfQ09NTUVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRFUl9NVUxUSUxJTkVfQ09NTUVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRFUl9KQVZBRE9DX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lOR0xFX0xJTkVfQ09NTUVOVDsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTERfTUFDX0VPTDsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTklYX0VPTDsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5ET1dTX0VPTDsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTUEFDRTsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmKCJUb2tlbiBraW5kICVpIGlzIHVua25vd24uIiwga2luZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRLaW5kKCkgeworICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YVRva2VuLkNhdGVnb3J5IGdldENhdGVnb3J5KCkgeworICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5nZXRDYXRlZ29yeShraW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIG5ld1Rva2VuIGludG8gdGhlIHRva2VuIGxpc3QganVzdCBiZWZvcmUgdGhpcyB0b2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoSmF2YVRva2VuIG5ld1Rva2VuKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmV3VG9rZW4pOworICAgICAgICBnZXRQcmV2aW91c1Rva2VuKCkuaWZQcmVzZW50KHAgLT4geworICAgICAgICAgICAgcC5uZXh0VG9rZW4gPSBuZXdUb2tlbjsKKyAgICAgICAgICAgIG5ld1Rva2VuLnByZXZpb3VzVG9rZW4gPSBwOworICAgICAgICB9KTsKKyAgICAgICAgcHJldmlvdXNUb2tlbiA9IG5ld1Rva2VuOworICAgICAgICBuZXdUb2tlbi5uZXh0VG9rZW4gPSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgbmV3VG9rZW4gaW50byB0aGUgdG9rZW4gbGlzdCBqdXN0IGFmdGVyIHRoaXMgdG9rZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QWZ0ZXIoSmF2YVRva2VuIG5ld1Rva2VuKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmV3VG9rZW4pOworICAgICAgICBnZXROZXh0VG9rZW4oKS5pZlByZXNlbnQobiAtPiB7CisgICAgICAgICAgICBuLnByZXZpb3VzVG9rZW4gPSBuZXdUb2tlbjsKKyAgICAgICAgICAgIG5ld1Rva2VuLm5leHRUb2tlbiA9IG47CisgICAgICAgIH0pOworICAgICAgICBuZXh0VG9rZW4gPSBuZXdUb2tlbjsKKyAgICAgICAgbmV3VG9rZW4ucHJldmlvdXNUb2tlbiA9IHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlua3MgdGhlIHRva2VucyBhcm91bmQgdGhlIGN1cnJlbnQgdG9rZW4gdG9nZXRoZXIsIG1ha2luZyB0aGUgY3VycmVudCB0b2tlbiBkaXNhcHBlYXIgZnJvbSB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxldGVUb2tlbigpIHsKKyAgICAgICAgZmluYWwgT3B0aW9uYWw8SmF2YVRva2VuPiBuZXh0VG9rZW4gPSBnZXROZXh0VG9rZW4oKTsKKyAgICAgICAgZmluYWwgT3B0aW9uYWw8SmF2YVRva2VuPiBwcmV2aW91c1Rva2VuID0gZ2V0UHJldmlvdXNUb2tlbigpOworICAgICAgICBwcmV2aW91c1Rva2VuLmlmUHJlc2VudChwIC0+IHAubmV4dFRva2VuID0gbmV4dFRva2VuLm9yRWxzZShudWxsKSk7CisgICAgICAgIG5leHRUb2tlbi5pZlByZXNlbnQobiAtPiBuLnByZXZpb3VzVG9rZW4gPSBwcmV2aW91c1Rva2VuLm9yRWxzZShudWxsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgdG9rZW4gd2l0aCBuZXdUb2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlVG9rZW4oSmF2YVRva2VuIG5ld1Rva2VuKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmV3VG9rZW4pOworICAgICAgICBnZXRQcmV2aW91c1Rva2VuKCkuaWZQcmVzZW50KHAgLT4geworICAgICAgICAgICAgcC5uZXh0VG9rZW4gPSBuZXdUb2tlbjsKKyAgICAgICAgICAgIG5ld1Rva2VuLnByZXZpb3VzVG9rZW4gPSBwOworICAgICAgICB9KTsKKyAgICAgICAgZ2V0TmV4dFRva2VuKCkuaWZQcmVzZW50KG4gLT4geworICAgICAgICAgICAgbi5wcmV2aW91c1Rva2VuID0gbmV3VG9rZW47CisgICAgICAgICAgICBuZXdUb2tlbi5uZXh0VG9rZW4gPSBuOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IHRva2VuIGluIHRoZSB0b2tlbiBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBKYXZhVG9rZW4gZmluZExhc3RUb2tlbigpIHsKKyAgICAgICAgSmF2YVRva2VuIGN1cnJlbnQgPSB0aGlzOworICAgICAgICB3aGlsZSAoY3VycmVudC5nZXROZXh0VG9rZW4oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dFRva2VuKCkuZ2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIHRva2VuIGxpc3QuCisgICAgICovCisgICAgcHVibGljIEphdmFUb2tlbiBmaW5kRmlyc3RUb2tlbigpIHsKKyAgICAgICAgSmF2YVRva2VuIGN1cnJlbnQgPSB0aGlzOworICAgICAgICB3aGlsZSAoY3VycmVudC5nZXRQcmV2aW91c1Rva2VuKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldFByZXZpb3VzVG9rZW4oKS5nZXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0ga2luZDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyB0ZXh0Lmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgSmF2YVRva2VuIGphdmFUb2tlbiA9IChKYXZhVG9rZW4pIG87CisgICAgICAgIGlmIChraW5kICE9IGphdmFUb2tlbi5raW5kKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRleHQuZXF1YWxzKGphdmFUb2tlbi50ZXh0KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFkb2NQYXJzZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhZG9jUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlOTc5NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhZG9jUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuSmF2YWRvYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYy5KYXZhZG9jQmxvY2tUYWc7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb24uSmF2YWRvY0Rlc2NyaXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLm5leHRXb3JkOworCisvKioKKyAqIFRoZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyB0aGUgY29udGVudCBvZiBKYXZhZG9jQ29tbWVudHMgYW5kIHByb2R1Y2UgSmF2YWRvY0RvY3VtZW50cy4KKyAqLworY2xhc3MgSmF2YWRvY1BhcnNlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkxPQ0tfVEFHX1BSRUZJWCA9ICJAIjsKKyAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIEJMT0NLX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl4iICsgQkxPQ0tfVEFHX1BSRUZJWCwgUGF0dGVybi5NVUxUSUxJTkUpOworCisgICAgcHVibGljIHN0YXRpYyBKYXZhZG9jIHBhcnNlKEphdmFkb2NDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGNvbW1lbnQuZ2V0Q29udGVudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEphdmFkb2MgcGFyc2UoU3RyaW5nIGNvbW1lbnRDb250ZW50KSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjbGVhbkxpbmVzID0gY2xlYW5MaW5lcyhub3JtYWxpemVFb2xJblRleHRCbG9jayhjb21tZW50Q29udGVudCwgRU9MKSk7CisgICAgICAgIGludCBpbmRleE9mRmlyc3RCbG9ja1RhZyA9IGNsZWFuTGluZXMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKEphdmFkb2NQYXJzZXI6OmlzQUJsb2NrTGluZSkKKyAgICAgICAgICAgICAgICAubWFwKGNsZWFuTGluZXM6OmluZGV4T2YpCisgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpCisgICAgICAgICAgICAgICAgLm9yRWxzZSgtMSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBibG9ja0xpbmVzOworICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb25UZXh0OworICAgICAgICBpZiAoaW5kZXhPZkZpcnN0QmxvY2tUYWcgPT0gLTEpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uVGV4dCA9IHRyaW1SaWdodChTdHJpbmcuam9pbihFT0wsIGNsZWFuTGluZXMpKTsKKyAgICAgICAgICAgIGJsb2NrTGluZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uVGV4dCA9IHRyaW1SaWdodChTdHJpbmcuam9pbihFT0wsIGNsZWFuTGluZXMuc3ViTGlzdCgwLCBpbmRleE9mRmlyc3RCbG9ja1RhZykpKTsKKworICAgICAgICAgICAgLy9Db21iaW5lIGNsZWFuZWQgbGluZXMsIGJ1dCBvbmx5IHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGJsb2NrIHRhZyB0aWxsIHRoZSBlbmQKKyAgICAgICAgICAgIC8vSW4gdGhpcyBjb21iaW5lZCBzdHJpbmcgaXQgaXMgZWFzaWVyIHRvIGhhbmRsZSBtdWx0aXBsZSBsaW5lcyB3aGljaCBhY3R1YWxseSBiZWxvbmcgdG9nZXRoZXIKKyAgICAgICAgICAgIFN0cmluZyB0YWdCbG9jayA9IGNsZWFuTGluZXMuc3ViTGlzdChpbmRleE9mRmlyc3RCbG9ja1RhZywgY2xlYW5MaW5lcy5zaXplKCkpCisgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKEVPTCkpOworCisgICAgICAgICAgICAvL1NwbGl0IHVwIHRoZSBlbnRpcmUgdGFnIGJhY2sgYWdhaW4sIGNvbnNpZGVyaW5nIG5vdyB0aGF0IHNvbWUgbGluZXMgYmVsb25nIHRvIHRoZSBzYW1lIGJsb2NrIHRhZy4KKyAgICAgICAgICAgIC8vVGhlIHBhdHRlcm4gc3BsaXRzIHRoZSBibG9jayBhdCBlYWNoIG5ldyBsaW5lIHN0YXJ0aW5nIHdpdGggdGhlICdAJyBzeW1ib2wsIHRodXMgdGhlIHN5bWJvbAorICAgICAgICAgICAgLy90aGVuIG5lZWRzIHRvIGJlIGFkZGVkIGFnYWluIHNvIHRoYXQgdGhlIGJsb2NrIHBhcnNlcnMgaGFuZGxlcyBldmVyeXRoaW5nIGNvcnJlY3RseS4KKyAgICAgICAgICAgIGJsb2NrTGluZXMgPSBCTE9DS19QQVRURVJOCisgICAgICAgICAgICAgICAgLnNwbGl0QXNTdHJlYW0odGFnQmxvY2spCisgICAgICAgICAgICAgICAgLmZpbHRlcihTVFJJTkdfTk9UX0VNUFRZKQorICAgICAgICAgICAgICAgIC5tYXAocyAtPiBCTE9DS19UQUdfUFJFRklYICsgcykKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICBKYXZhZG9jIGRvY3VtZW50ID0gbmV3IEphdmFkb2MoSmF2YWRvY0Rlc2NyaXB0aW9uLnBhcnNlVGV4dChkZXNjcmlwdGlvblRleHQpKTsKKyAgICAgICAgYmxvY2tMaW5lcy5mb3JFYWNoKGwgLT4gZG9jdW1lbnQuYWRkQmxvY2tUYWcocGFyc2VCbG9ja1RhZyhsKSkpOworICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSmF2YWRvY0Jsb2NrVGFnIHBhcnNlQmxvY2tUYWcoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpLnN1YnN0cmluZygxKTsKKyAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBuZXh0V29yZChsaW5lKTsKKyAgICAgICAgU3RyaW5nIHJlc3QgPSBsaW5lLnN1YnN0cmluZyh0YWdOYW1lLmxlbmd0aCgpKS50cmltKCk7CisgICAgICAgIHJldHVybiBuZXcgSmF2YWRvY0Jsb2NrVGFnKHRhZ05hbWUsIHJlc3QpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBQmxvY2tMaW5lKFN0cmluZyBsaW5lKSB7CisgICAgICAgIHJldHVybiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKEJMT0NLX1RBR19QUkVGSVgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cmltUmlnaHQoU3RyaW5nIHN0cmluZykgeworICAgICAgICB3aGlsZSAoIXN0cmluZy5pc0VtcHR5KCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJpbmcuY2hhckF0KHN0cmluZy5sZW5ndGgoKSAtIDEpKSkgeworICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmcubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBjbGVhbkxpbmVzKFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gY29udGVudC5zcGxpdChFT0wpOworICAgICAgICBMaXN0PFN0cmluZz4gY2xlYW5lZExpbmVzID0gQXJyYXlzLnN0cmVhbShsaW5lcykubWFwKGwgLT4geworICAgICAgICAgICAgaW50IGFzdGVyaXNrSW5kZXggPSBzdGFydHNXaXRoQXN0ZXJpc2sobCk7CisgICAgICAgICAgICBpZiAoYXN0ZXJpc2tJbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhIGxpbmUgc3RhcnRzIHdpdGggc3BhY2UgZm9sbG93ZWQgYnkgYW4gYXN0ZXJpc2sgZHJvcCB0byB0aGUgYXN0ZXJpc2sKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHNwYWNlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBhc3RlcmlzayBkcm9wIGl0IGFsc28KKyAgICAgICAgICAgICAgICBpZiAobC5sZW5ndGgoKSA+IChhc3Rlcmlza0luZGV4ICsgMSkpIHsKKworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBsLmNoYXJBdChhc3Rlcmlza0luZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcgJyB8fCBjID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLnN1YnN0cmluZyhhc3Rlcmlza0luZGV4ICsgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGwuc3Vic3RyaW5nKGFzdGVyaXNrSW5kZXggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgLy8gbGluZXMgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2UgYXJlIG5vcm1hbGl6ZWQgdG8gZW1wdHkgbGluZXMKKyAgICAgICAgY2xlYW5lZExpbmVzID0gY2xlYW5lZExpbmVzLnN0cmVhbSgpLm1hcChsIC0+IGwudHJpbSgpLmlzRW1wdHkoKSA/ICIiIDogbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgLy8gaWYgdGhlIGZpcnN0IHN0YXJ0cyB3aXRoIGEgc3BhY2UsIHJlbW92ZSBpdAorICAgICAgICBpZiAoIWNsZWFuZWRMaW5lcy5nZXQoMCkuaXNFbXB0eSgpICYmIChjbGVhbmVkTGluZXMuZ2V0KDApLmNoYXJBdCgwKSA9PSAnICcgfHwgY2xlYW5lZExpbmVzLmdldCgwKS5jaGFyQXQoMCkgPT0gJ1x0JykpIHsKKyAgICAgICAgICAgIGNsZWFuZWRMaW5lcy5zZXQoMCwgY2xlYW5lZExpbmVzLmdldCgwKS5zdWJzdHJpbmcoMSkpOworICAgICAgICB9CisgICAgICAgIC8vIGRyb3AgZW1wdHkgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBhbmQgYXQgdGhlIGVuZAorICAgICAgICB3aGlsZSAoY2xlYW5lZExpbmVzLnNpemUoKSA+IDAgJiYgY2xlYW5lZExpbmVzLmdldCgwKS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjbGVhbmVkTGluZXMgPSBjbGVhbmVkTGluZXMuc3ViTGlzdCgxLCBjbGVhbmVkTGluZXMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY2xlYW5lZExpbmVzLnNpemUoKSA+IDAgJiYgY2xlYW5lZExpbmVzLmdldChjbGVhbmVkTGluZXMuc2l6ZSgpIC0gMSkudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY2xlYW5lZExpbmVzID0gY2xlYW5lZExpbmVzLnN1Ykxpc3QoMCwgY2xlYW5lZExpbmVzLnNpemUoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGVhbmVkTGluZXM7CisgICAgfQorCisgICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZworICAgIHN0YXRpYyBpbnQgc3RhcnRzV2l0aEFzdGVyaXNrKFN0cmluZyBsaW5lKSB7CisgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIioiKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAoKGxpbmUuc3RhcnRzV2l0aCgiICIpIHx8IGxpbmUuc3RhcnRzV2l0aCgiXHQiKSkgJiYgbGluZS5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgIGludCByZXMgPSBzdGFydHNXaXRoQXN0ZXJpc2sobGluZS5zdWJzdHJpbmcoMSkpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEgKyByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VQcm9ibGVtRXhjZXB0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VQcm9ibGVtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwNjRkYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVByb2JsZW1FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Q7CisKKy8qKgorICogVGhyb3duIHdoZW4gcGFyc2luZyBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcGFyc2luZyB3aXRoIHRoZSBzdGF0aWMgbWV0aG9kcyBvbiBKYXZhUGFyc2VyLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICogVGhlIHByb2JsZW1zIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9ibGVtPiBwcm9ibGVtczsKKworICAgIHB1YmxpYyBQYXJzZVByb2JsZW1FeGNlcHRpb24oTGlzdDxQcm9ibGVtPiBwcm9ibGVtcykgeworICAgICAgICBzdXBlcihjcmVhdGVNZXNzYWdlKGFzc2VydE5vdE51bGwocHJvYmxlbXMpKSk7CisgICAgICAgIHRoaXMucHJvYmxlbXMgPSBwcm9ibGVtczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyc2VQcm9ibGVtRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgdGhpcyhzaW5nbGV0b25MaXN0KG5ldyBQcm9ibGVtKHRocm93YWJsZS5nZXRNZXNzYWdlKCksIG51bGwsIHRocm93YWJsZSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWVzc2FnZShMaXN0PFByb2JsZW0+IHByb2JsZW1zKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoUHJvYmxlbSBwcm9ibGVtIDogcHJvYmxlbXMpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHByb2JsZW0udG9TdHJpbmcoKSkuYXBwZW5kKEVPTCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxQcm9ibGVtPiBnZXRQcm9ibGVtcygpIHsKKyAgICAgICAgcmV0dXJuIHByb2JsZW1zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVJlc3VsdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYzc5YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CisKKy8qKgorICogVGhlIHJlc3VsdHMgZ2l2ZW4gd2hlbiBwYXJzaW5nIHdpdGggYW4gaW5zdGFuY2Ugb2YgSmF2YVBhcnNlci4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlUmVzdWx0PFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFQgcmVzdWx0OworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9ibGVtPiBwcm9ibGVtczsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SmF2YVRva2VuPiB0b2tlbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21tZW50c0NvbGxlY3Rpb24gY29tbWVudHNDb2xsZWN0aW9uOworCisgICAgLyoqCisgICAgICogR2VuZXJhbCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIEFTVCwgb3IgZW1wdHkgaWYgaXQgd2Fzbid0IGNyZWF0ZWQuCisgICAgICogQHBhcmFtIHByb2JsZW1zIGEgbGlzdCBvZiBlbmNvdW50ZXJlZCBwYXJzaW5nIHByb2JsZW1zLgorICAgICAqIEBwYXJhbSB0b2tlbnMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd2VyZSBwYXJzZWQsIG9yIGVtcHR5IGlmIHBhcnNpbmcgZmFpbGVkIGNvbXBsZXRlbHkuCisgICAgICovCisgICAgcHVibGljIFBhcnNlUmVzdWx0KFQgcmVzdWx0LCBMaXN0PFByb2JsZW0+IHByb2JsZW1zLCBMaXN0PEphdmFUb2tlbj4gdG9rZW5zLCBDb21tZW50c0NvbGxlY3Rpb24gY29tbWVudHNDb2xsZWN0aW9uKSB7CisgICAgICAgIHRoaXMuY29tbWVudHNDb2xsZWN0aW9uID0gY29tbWVudHNDb2xsZWN0aW9uOworICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgdGhpcy5wcm9ibGVtcyA9IHByb2JsZW1zOworICAgICAgICB0aGlzLnRva2VucyA9IHRva2VuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwsIG1lYW5pbmcgbm8gZXJyb3JzIG9mIGFueSBraW5kIHdlcmUgZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCkgeworICAgICAgICByZXR1cm4gcHJvYmxlbXMuaXNFbXB0eSgpICYmIHJlc3VsdCAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHRoZSBjb25zdW1lciB3aXRoIHRoZSByZXN1bHQgaWYgcGFyc2luZyB3YXMgc3VjY2VzZnVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlmU3VjY2Vzc2Z1bChDb25zdW1lcjxUPiBjb25zdW1lcikgeworICAgICAgICBpZiAoaXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgIGNvbnN1bWVyLmFjY2VwdChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBlbmNvdW50ZXJlZCBwYXJzaW5nIHByb2JsZW1zLiBFbXB0eSB3aGVuIG5vIHByb2JsZW1zIHdlcmUgZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UHJvYmxlbT4gZ2V0UHJvYmxlbXMoKSB7CisgICAgICAgIHJldHVybiBwcm9ibGVtczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5pPC9jb2RlPid0aCBlbmNvdW50ZXJlZCBwYXJzaW5nIHByb2JsZW0uIE1heSB0aHJvdyA8Y29kZT5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvYmxlbSBnZXRQcm9ibGVtKGludCBpKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9ibGVtcygpLmdldChpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHRva2VucyB0aGF0IHdlcmUgcGFyc2VkLCBvciBlbXB0eSBpZiBwYXJzaW5nIGZhaWxlZCBjb21wbGV0ZWx5LgorICAgICAqIEBkZXByZWNhdGVkIGxpc3RzIG9mIHRva2VucyBhcmUgbm93IGtlcHQgaW4gZXZlcnkgbm9kZS4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGNvbXBhcmFibGUgdG8gY2FsbGluZyBnZXRSZXN1bHQoKS5nZXQoKS5nZXRUb2tlblJhbmdlKCkuZ2V0KCkKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBPcHRpb25hbDxMaXN0PEphdmFUb2tlbj4+IGdldFRva2VucygpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUodG9rZW5zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSBjb2xsZWN0aW9uIG9mIGNvbW1lbnRzIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPENvbW1lbnRzQ29sbGVjdGlvbj4gZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShjb21tZW50c0NvbGxlY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIEFTVCBvZiB0aGUgcGFyc2VkIHNvdXJjZSBjb2RlLCBvciBlbXB0eSBpZiBwYXJzaW5nIGZhaWxlZCBjb21wbGV0ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxUPiBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgaWYgKGlzU3VjY2Vzc2Z1bCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIlBhcnNpbmcgc3VjY2Vzc2Z1bCI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoIlBhcnNpbmcgZmFpbGVkOiIpLmFwcGVuZChFT0wpOworICAgICAgICBmb3IgKFByb2JsZW0gcHJvYmxlbSA6IHByb2JsZW1zKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChwcm9ibGVtLnRvU3RyaW5nKCkpLmFwcGVuZChFT0wpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwb3N0IHByb2Nlc3NvciB0aGF0IGNhbiBiZSBhZGRlZCB0byBQYXJzZXJDb25maWd1cmF0aW9uIHRvIGFkZCBzb21lIHByb2Nlc3NpbmcgcmlnaHQgYWZ0ZXIgcGFyc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFBvc3RQcm9jZXNzb3IgeworICAgICAgICB2b2lkIHByb2Nlc3MoUGFyc2VSZXN1bHQ8PyBleHRlbmRzIE5vZGU+IHJlc3VsdCwgUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VTdGFydC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlU3RhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2I1NjJjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlU3RhcnQuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CisKKy8qKgorICogVGhlIHN0YXJ0IHByb2R1Y3Rpb24gZm9yIEphdmFQYXJzZXIuCisgKiBUZWxscyBKYXZhUGFyc2VyIHdoYXQgcGllY2Ugb2YgSmF2YSBjb2RlIGl0IGNhbiBleHBlY3QuCisgKiBGb3IgZXhhbXBsZSwKKyAqIENPTVBJTEFUSU9OX1VOSVQgaW5kaWNhdGVzIGEgY29tcGxldGUgSmF2YSBmaWxlLAorICogYW5kIENMQVNTX0JPRFkgd291bGQgaW5kaWNhdGUgdGhlIHBhcnQgb2YgYSBjbGFzcyB0aGF0IGlzIHdpdGhpbiB7IGFuZCB9LgorICoKKyAqIEBzZWUgSmF2YVBhcnNlciNwYXJzZShQYXJzZVN0YXJ0LCBQcm92aWRlcikKKyAqLworQEZ1bmN0aW9uYWxJbnRlcmZhY2UKK3B1YmxpYyBpbnRlcmZhY2UgUGFyc2VTdGFydDxSPiB7CisgICAgUGFyc2VTdGFydDxDb21waWxhdGlvblVuaXQ+IENPTVBJTEFUSU9OX1VOSVQgPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpDb21waWxhdGlvblVuaXQ7CisgICAgUGFyc2VTdGFydDxCbG9ja1N0bXQ+IEJMT0NLID0gR2VuZXJhdGVkSmF2YVBhcnNlcjo6QmxvY2tQYXJzZVN0YXJ0OworICAgIFBhcnNlU3RhcnQ8U3RhdGVtZW50PiBTVEFURU1FTlQgPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpCbG9ja1N0YXRlbWVudFBhcnNlU3RhcnQ7CisgICAgUGFyc2VTdGFydDxJbXBvcnREZWNsYXJhdGlvbj4gSU1QT1JUX0RFQ0xBUkFUSU9OID0gR2VuZXJhdGVkSmF2YVBhcnNlcjo6SW1wb3J0RGVjbGFyYXRpb25QYXJzZVN0YXJ0OworICAgIFBhcnNlU3RhcnQ8RXhwcmVzc2lvbj4gRVhQUkVTU0lPTiA9IEdlbmVyYXRlZEphdmFQYXJzZXI6OkV4cHJlc3Npb25QYXJzZVN0YXJ0OworICAgIFBhcnNlU3RhcnQ8QW5ub3RhdGlvbkV4cHI+IEFOTk9UQVRJT04gPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpBbm5vdGF0aW9uUGFyc2VTdGFydDsKKyAgICBQYXJzZVN0YXJ0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gQU5OT1RBVElPTl9CT0RZID0gR2VuZXJhdGVkSmF2YVBhcnNlcjo6QW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvblBhcnNlU3RhcnQ7CisgICAgUGFyc2VTdGFydDxCb2R5RGVjbGFyYXRpb248Pz4+IENMQVNTX0JPRFkgPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uUGFyc2VTdGFydDsKKyAgICBQYXJzZVN0YXJ0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBDTEFTU19PUl9JTlRFUkZBQ0VfVFlQRSA9IEdlbmVyYXRlZEphdmFQYXJzZXI6OkNsYXNzT3JJbnRlcmZhY2VUeXBlUGFyc2VTdGFydDsKKyAgICBQYXJzZVN0YXJ0PFR5cGU+IFRZUEUgPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpSZXN1bHRUeXBlUGFyc2VTdGFydDsKKyAgICBQYXJzZVN0YXJ0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiBWQVJJQUJMRV9ERUNMQVJBVElPTl9FWFBSID0gR2VuZXJhdGVkSmF2YVBhcnNlcjo6VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25QYXJzZVN0YXJ0OworICAgIFBhcnNlU3RhcnQ8RXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10PiBFWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1NUTVQgPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblBhcnNlU3RhcnQ7CisgICAgUGFyc2VTdGFydDxOYW1lPiBOQU1FID0gR2VuZXJhdGVkSmF2YVBhcnNlcjo6TmFtZVBhcnNlU3RhcnQ7CisgICAgUGFyc2VTdGFydDxTaW1wbGVOYW1lPiBTSU1QTEVfTkFNRSA9IEdlbmVyYXRlZEphdmFQYXJzZXI6OlNpbXBsZU5hbWVQYXJzZVN0YXJ0OworICAgIFBhcnNlU3RhcnQ8UGFyYW1ldGVyPiBQQVJBTUVURVIgPSBHZW5lcmF0ZWRKYXZhUGFyc2VyOjpQYXJhbWV0ZXJQYXJzZVN0YXJ0OworICAgIFBhcnNlU3RhcnQ8UGFja2FnZURlY2xhcmF0aW9uPiBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gR2VuZXJhdGVkSmF2YVBhcnNlcjo6UGFja2FnZURlY2xhcmF0aW9uUGFyc2VTdGFydDsKKworICAgIFIgcGFyc2UoR2VuZXJhdGVkSmF2YVBhcnNlciBwYXJzZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZXJDb25maWd1cmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VyQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YmUyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VyQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLkxleGljYWxQcmVzZXJ2aW5nUHJpbnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5TeW1ib2xSZXNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudmVyc2lvbi5KYXZhMTBQb3N0UHJvY2Vzc29yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci52ZXJzaW9uLkphdmExMVBvc3RQcm9jZXNzb3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRoZSBjb25maWd1cmF0aW9uIHRoYXQgaXMgdXNlZCBieSB0aGUgcGFyc2VyLgorICogTm90ZSB0aGF0IHRoaXMgY2FuIGJlIGNoYW5nZWQgZXZlbiB3aGVuIHJldXNpbmcgdGhlIHNhbWUgSmF2YVBhcnNlciBpbnN0YW5jZS4KKyAqIEl0IHdpbGwgcGljayB1cCB0aGUgY2hhbmdlcy4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlckNvbmZpZ3VyYXRpb24geworICAgIHB1YmxpYyBlbnVtIExhbmd1YWdlTGV2ZWwgeworICAgICAgICAvKiogRG9lcyBubyBwb3N0IHByb2Nlc3Npbmcgb3IgdmFsaWRhdGlvbi4gT25seSBmb3IgcGVvcGxlIHdhbnRpbmcgdGhlIGZhc3Rlc3QgcGFyc2luZy4gKi8KKyAgICAgICAgUkFXKG51bGwsIG51bGwpLAorICAgICAgICAvKiogVGhlIG1vc3QgdXNlZCBKYXZhIHZlcnNpb24uICovCisgICAgICAgIFBPUFVMQVIobmV3IEphdmE4VmFsaWRhdG9yKCksIG51bGwpLAorICAgICAgICAvKiogVGhlIGxhdGVzdCBKYXZhIHZlcnNpb24gdGhhdCBpcyBhdmFpbGFibGUuICovCisgICAgICAgIENVUlJFTlQobmV3IEphdmE4VmFsaWRhdG9yKCksIG51bGwpLAorICAgICAgICAvKiogVGhlIG5ld2VzdCBKYXZhIGZlYXR1cmVzIHN1cHBvcnRlZC4gKi8KKyAgICAgICAgQkxFRURJTkdfRURHRShuZXcgSmF2YTExVmFsaWRhdG9yKCksIG5ldyBKYXZhMTFQb3N0UHJvY2Vzc29yKCkpLAorICAgICAgICAvKiogSmF2YSAxLjAgKi8KKyAgICAgICAgSkFWQV8xXzAobmV3IEphdmExXzBWYWxpZGF0b3IoKSwgbnVsbCksCisgICAgICAgIC8qKiBKYXZhIDEuMSAqLworICAgICAgICBKQVZBXzFfMShuZXcgSmF2YTFfMVZhbGlkYXRvcigpLCBudWxsKSwKKyAgICAgICAgLyoqIEphdmEgMS4yICovCisgICAgICAgIEpBVkFfMV8yKG5ldyBKYXZhMV8yVmFsaWRhdG9yKCksIG51bGwpLAorICAgICAgICAvKiogSmF2YSAxLjMgKi8KKyAgICAgICAgSkFWQV8xXzMobmV3IEphdmExXzNWYWxpZGF0b3IoKSwgbnVsbCksCisgICAgICAgIC8qKiBKYXZhIDEuNCAqLworICAgICAgICBKQVZBXzFfNChuZXcgSmF2YTFfNFZhbGlkYXRvcigpLCBudWxsKSwKKyAgICAgICAgLyoqIEphdmEgNSAqLworICAgICAgICBKQVZBXzUobmV3IEphdmE1VmFsaWRhdG9yKCksIG51bGwpLAorICAgICAgICAvKiogSmF2YSA2ICovCisgICAgICAgIEpBVkFfNihuZXcgSmF2YTZWYWxpZGF0b3IoKSwgbnVsbCksCisgICAgICAgIC8qKiBKYXZhIDcgKi8KKyAgICAgICAgSkFWQV83KG5ldyBKYXZhN1ZhbGlkYXRvcigpLCBudWxsKSwKKyAgICAgICAgLyoqIEphdmEgOCAqLworICAgICAgICBKQVZBXzgobmV3IEphdmE4VmFsaWRhdG9yKCksIG51bGwpLAorICAgICAgICAvKiogSmF2YSA5ICovCisgICAgICAgIEpBVkFfOShuZXcgSmF2YTlWYWxpZGF0b3IoKSwgbnVsbCksCisgICAgICAgIC8qKiBKYXZhIDEwICovCisgICAgICAgIEpBVkFfMTAobmV3IEphdmExMFZhbGlkYXRvcigpLCBuZXcgSmF2YTEwUG9zdFByb2Nlc3NvcigpKSwKKyAgICAgICAgLyoqIEphdmEgMTEgKHdvcmsgaW4gcHJvZ3Jlc3MpICovCisgICAgICAgIEpBVkFfMTFfUFJFVklFVyhuZXcgSmF2YTExVmFsaWRhdG9yKCksIG5ldyBKYXZhMTFQb3N0UHJvY2Vzc29yKCkpOworCisgICAgICAgIGZpbmFsIFZhbGlkYXRvciB2YWxpZGF0b3I7CisgICAgICAgIGZpbmFsIFBhcnNlUmVzdWx0LlBvc3RQcm9jZXNzb3IgcG9zdFByb2Nlc3NvcjsKKworICAgICAgICBMYW5ndWFnZUxldmVsKFZhbGlkYXRvciB2YWxpZGF0b3IsIFBhcnNlUmVzdWx0LlBvc3RQcm9jZXNzb3IgcG9zdFByb2Nlc3NvcikgeworICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7CisgICAgICAgICAgICB0aGlzLnBvc3RQcm9jZXNzb3IgPSBwb3N0UHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHN0b3JlVG9rZW5zID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gYXR0cmlidXRlQ29tbWVudHMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBkb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VkaW5nRW1wdHlMaW5lcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGxleGljYWxQcmVzZXJ2YXRpb25FbmFibGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTeW1ib2xSZXNvbHZlciBzeW1ib2xSZXNvbHZlciA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgdGFiU2l6ZSA9IDE7CisgICAgcHJpdmF0ZSBMYW5ndWFnZUxldmVsIGxhbmd1YWdlTGV2ZWwgPSBDVVJSRU5UOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcnNlUmVzdWx0LlBvc3RQcm9jZXNzb3I+IHBvc3RQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgUGFyc2VyQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcG9zdFByb2Nlc3NvcnMuYWRkKChyZXN1bHQsIGNvbmZpZ3VyYXRpb24pIC0+IHsKKyAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzTGV4aWNhbFByZXNlcnZhdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzTGV4aWNhbFByZXNlcnZhdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuaWZTdWNjZXNzZnVsKExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcjo6c2V0dXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHBvc3RQcm9jZXNzb3JzLmFkZCgocmVzdWx0LCBjb25maWd1cmF0aW9uKSAtPiB7CisgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc0F0dHJpYnV0ZUNvbW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuaWZTdWNjZXNzZnVsKHJlc3VsdE5vZGUgLT4gcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkuaWZQcmVzZW50KGNvbW1lbnRzIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tZW50c0luc2VydGVyKGNvbmZpZ3VyYXRpb24pLmluc2VydENvbW1lbnRzKHJlc3VsdE5vZGUsIGNvbW1lbnRzLmNvcHkoKS5nZXRDb21tZW50cygpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcG9zdFByb2Nlc3NvcnMuYWRkKChyZXN1bHQsIGNvbmZpZ3VyYXRpb24pIC0+IHsKKyAgICAgICAgICAgIExhbmd1YWdlTGV2ZWwgbGFuZ3VhZ2VMZXZlbCA9IGdldExhbmd1YWdlTGV2ZWwoKTsKKyAgICAgICAgICAgIGlmIChsYW5ndWFnZUxldmVsLnBvc3RQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlTGV2ZWwucG9zdFByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFuZ3VhZ2VMZXZlbC52YWxpZGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlTGV2ZWwudmFsaWRhdG9yLmFjY2VwdChyZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCksIG5ldyBQcm9ibGVtUmVwb3J0ZXIobmV3UHJvYmxlbSAtPiByZXN1bHQuZ2V0UHJvYmxlbXMoKS5hZGQobmV3UHJvYmxlbSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHBvc3RQcm9jZXNzb3JzLmFkZCgocmVzdWx0LCBjb25maWd1cmF0aW9uKSAtPiBjb25maWd1cmF0aW9uLmdldFN5bWJvbFJlc29sdmVyKCkuaWZQcmVzZW50KHN5bWJvbFJlc29sdmVyIC0+CisgICAgICAgICAgICAgICAgcmVzdWx0LmlmU3VjY2Vzc2Z1bChyZXN1bHROb2RlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUuc2V0RGF0YShOb2RlLlNZTUJPTF9SRVNPTFZFUl9LRVksIHN5bWJvbFJlc29sdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlQ29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVDb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHJ1biBDb21tZW50c0luc2VydGVyLCB3aGljaCB3aWxsIHB1dCB0aGUgY29tbWVudHMgdGhhdCB3ZXJlIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZSBpbnRvIHRoZSBjb21tZW50CisgICAgICogYW5kIGphdmFkb2MgZmllbGRzIG9mIHRoZSBub2RlcyBpdCB0aGlua3MgdGhleSByZWZlciB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyc2VyQ29uZmlndXJhdGlvbiBzZXRBdHRyaWJ1dGVDb21tZW50cyhib29sZWFuIGF0dHJpYnV0ZUNvbW1lbnRzKSB7CisgICAgICAgIHRoaXMuYXR0cmlidXRlQ29tbWVudHMgPSBhdHRyaWJ1dGVDb21tZW50czsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VkaW5nRW1wdHlMaW5lcygpIHsKKyAgICAgICAgcmV0dXJuIGRvTm90QXNzaWduQ29tbWVudHNQcmVjZWRpbmdFbXB0eUxpbmVzOworICAgIH0KKworICAgIHB1YmxpYyBQYXJzZXJDb25maWd1cmF0aW9uIHNldERvTm90QXNzaWduQ29tbWVudHNQcmVjZWRpbmdFbXB0eUxpbmVzKGJvb2xlYW4gZG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZGluZ0VtcHR5TGluZXMpIHsKKyAgICAgICAgdGhpcy5kb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VkaW5nRW1wdHlMaW5lcyA9IGRvTm90QXNzaWduQ29tbWVudHNQcmVjZWRpbmdFbXB0eUxpbmVzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uKCkgeworICAgICAgICByZXR1cm4gZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb247CisgICAgfQorCisgICAgcHVibGljIFBhcnNlckNvbmZpZ3VyYXRpb24gc2V0RG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24oYm9vbGVhbiBkb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbikgeworICAgICAgICB0aGlzLmRvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uID0gZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb247CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBQYXJzZXJDb25maWd1cmF0aW9uIHNldFN0b3JlVG9rZW5zKGJvb2xlYW4gc3RvcmVUb2tlbnMpIHsKKyAgICAgICAgdGhpcy5zdG9yZVRva2VucyA9IHN0b3JlVG9rZW5zOworICAgICAgICBpZiAoIXN0b3JlVG9rZW5zKSB7CisgICAgICAgICAgICBzZXRBdHRyaWJ1dGVDb21tZW50cyhmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdG9yZVRva2VucygpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlVG9rZW5zOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGFiU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhYlNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBhIFRBQiBjaGFyYWN0ZXIgaXMgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcsIHRoZSBjb2x1bW4gcG9zaXRpb24gd2lsbCBiZSBpbmNyZWFzZWQgYnkgdGhpcyB2YWx1ZS4KKyAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIDEuCisgICAgICovCisgICAgcHVibGljIFBhcnNlckNvbmZpZ3VyYXRpb24gc2V0VGFiU2l6ZShpbnQgdGFiU2l6ZSkgeworICAgICAgICB0aGlzLnRhYlNpemUgPSB0YWJTaXplOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0TGFuZ3VhZ2VMZXZlbAorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIE9wdGlvbmFsPFZhbGlkYXRvcj4gZ2V0VmFsaWRhdG9yKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtZXRob2QgaXMgZGVwcmVjYXRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRMYW5ndWFnZUxldmVsLCBvciBnZXRQb3N0UHJvY2Vzc29ycyBpZiB5b3UgdXNlIGEgY3VzdG9tIHZhbGlkYXRvci4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBQYXJzZXJDb25maWd1cmF0aW9uIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisgICAgICAgIC8vIFRoaXMgd2hvbGUgbWV0aG9kIGlzIGEgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgaGFjay4KKyAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIEphdmExMFZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzEwKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBKYXZhOVZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIEphdmE4VmFsaWRhdG9yKSB7CisgICAgICAgICAgICBzZXRMYW5ndWFnZUxldmVsKEpBVkFfOCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgSmF2YTdWYWxpZGF0b3IpIHsKKyAgICAgICAgICAgIHNldExhbmd1YWdlTGV2ZWwoSkFWQV83KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBKYXZhNlZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzYpOworICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIEphdmE1VmFsaWRhdG9yKSB7CisgICAgICAgICAgICBzZXRMYW5ndWFnZUxldmVsKEpBVkFfNSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgSmF2YTFfNFZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfNCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgSmF2YTFfM1ZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMyk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgSmF2YTFfMlZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMik7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgSmF2YTFfMVZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgSmF2YTFfMFZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTm9Qcm9ibGVtc1ZhbGlkYXRvcikgeworICAgICAgICAgICAgc2V0TGFuZ3VhZ2VMZXZlbChSQVcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICogV2hlbiB0aGlzIGlzIGVuYWJsZWQsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludCBjYW4gYmUgdXNlZCB0byByZXByb2R1Y2UKKyAgICAgKiB0aGUgb3JpZ2luYWwgZm9ybWF0dGluZyBvZiB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyc2VyQ29uZmlndXJhdGlvbiBzZXRMZXhpY2FsUHJlc2VydmF0aW9uRW5hYmxlZChib29sZWFuIGxleGljYWxQcmVzZXJ2YXRpb25FbmFibGVkKSB7CisgICAgICAgIHRoaXMubGV4aWNhbFByZXNlcnZhdGlvbkVuYWJsZWQgPSBsZXhpY2FsUHJlc2VydmF0aW9uRW5hYmxlZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMZXhpY2FsUHJlc2VydmF0aW9uRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGxleGljYWxQcmVzZXJ2YXRpb25FbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBTeW1ib2xSZXNvbHZlciB0byBiZSB1c2VkIHdoaWxlIHBhcnNpbmcsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8U3ltYm9sUmVzb2x2ZXI+IGdldFN5bWJvbFJlc29sdmVyKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShzeW1ib2xSZXNvbHZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTeW1ib2xSZXNvbHZlciB0byBiZSBpbmplY3RlZCB3aGlsZSBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZXJDb25maWd1cmF0aW9uIHNldFN5bWJvbFJlc29sdmVyKFN5bWJvbFJlc29sdmVyIHN5bWJvbFJlc29sdmVyKSB7CisgICAgICAgIHRoaXMuc3ltYm9sUmVzb2x2ZXIgPSBzeW1ib2xSZXNvbHZlcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UGFyc2VSZXN1bHQuUG9zdFByb2Nlc3Nvcj4gZ2V0UG9zdFByb2Nlc3NvcnMoKSB7CisgICAgICAgIHJldHVybiBwb3N0UHJvY2Vzc29yczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyc2VyQ29uZmlndXJhdGlvbiBzZXRMYW5ndWFnZUxldmVsKExhbmd1YWdlTGV2ZWwgbGFuZ3VhZ2VMZXZlbCkgeworICAgICAgICB0aGlzLmxhbmd1YWdlTGV2ZWwgPSBhc3NlcnROb3ROdWxsKGxhbmd1YWdlTGV2ZWwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGFuZ3VhZ2VMZXZlbCBnZXRMYW5ndWFnZUxldmVsKCkgeworICAgICAgICByZXR1cm4gbGFuZ3VhZ2VMZXZlbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUG9zaXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Qb3NpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTk1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUG9zaXRpb24uamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEEgcG9zaXRpb24gaW4gYSBzb3VyY2UgZmlsZS4gTGluZXMgYW5kIGNvbHVtbnMgc3RhcnQgY291bnRpbmcgYXQgMS4KKyAqLworcHVibGljIGNsYXNzIFBvc2l0aW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZTxQb3NpdGlvbj4geworICAgIHB1YmxpYyBmaW5hbCBpbnQgbGluZTsKKyAgICBwdWJsaWMgZmluYWwgaW50IGNvbHVtbjsKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUG9zaXRpb24gSE9NRSA9IG5ldyBQb3NpdGlvbigxLCAxKTsKKworICAgIHB1YmxpYyBQb3NpdGlvbihpbnQgbGluZSwgaW50IGNvbHVtbikgeworICAgICAgICBpZiAobGluZSA8IE5vZGUuQUJTT0xVVEVfRU5EX0xJTkUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHBvc2l0aW9uIGF0IGxpbmUgIiArIGxpbmUpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2x1bW4gPCAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcG9zaXRpb24gYXQgY29sdW1uICIgKyBjb2x1bW4pOworICAgICAgICB9CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbnQgZmFjdG9yeSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQb3NpdGlvbiBwb3MoaW50IGxpbmUsIGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihsaW5lLCBjb2x1bW4pOworICAgIH0KKworICAgIHB1YmxpYyBQb3NpdGlvbiB3aXRoQ29sdW1uKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbih0aGlzLmxpbmUsIGNvbHVtbik7CisgICAgfQorCisgICAgcHVibGljIFBvc2l0aW9uIHdpdGhMaW5lKGludCBsaW5lKSB7CisgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24obGluZSwgdGhpcy5jb2x1bW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBwb3NpdGlvbiBpcyB1c2FibGUuIERvZXMgbm90IGtub3cgd2hhdCBpdCBpcyBwb2ludGluZyBhdCwgc28gaXQgY2FuJ3QgY2hlY2sgaWYgdGhlIHBvc2l0aW9uIGlzIGFmdGVyCisgICAgICogdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZhbGlkKCkgeworICAgICAgICByZXR1cm4gbGluZSA+IDAgJiYgY29sdW1uID4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZhbGlkKCkgeworICAgICAgICByZXR1cm4gIXZhbGlkKCk7CisgICAgfQorCisgICAgcHVibGljIFBvc2l0aW9uIG9ySWZJbnZhbGlkKFBvc2l0aW9uIGFub3RoZXJQb3NpdGlvbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGFub3RoZXJQb3NpdGlvbik7CisgICAgICAgIGlmICh2YWxpZCgpIHx8IGFub3RoZXJQb3NpdGlvbi5pbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbm90aGVyUG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlcihQb3NpdGlvbiBwb3NpdGlvbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPT0gTm9kZS5BQlNPTFVURV9CRUdJTl9MSU5FKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGxpbmUgPiBwb3NpdGlvbi5saW5lKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChsaW5lID09IHBvc2l0aW9uLmxpbmUpIHsKKyAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPiBwb3NpdGlvbi5jb2x1bW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNCZWZvcmUoUG9zaXRpb24gcG9zaXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3NpdGlvbik7CisgICAgICAgIGlmIChwb3NpdGlvbi5saW5lID09IE5vZGUuQUJTT0xVVEVfRU5EX0xJTkUpIHJldHVybiB0cnVlOworICAgICAgICBpZiAobGluZSA8IHBvc2l0aW9uLmxpbmUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGxpbmUgPT0gcG9zaXRpb24ubGluZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8IHBvc2l0aW9uLmNvbHVtbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oUG9zaXRpb24gbykgeworICAgICAgICBhc3NlcnROb3ROdWxsKG8pOworICAgICAgICBpZiAoaXNCZWZvcmUobykpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNBZnRlcihvKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUG9zaXRpb24gcG9zaXRpb24gPSAoUG9zaXRpb24pIG87CisKKyAgICAgICAgcmV0dXJuIGxpbmUgPT0gcG9zaXRpb24ubGluZSAmJiBjb2x1bW4gPT0gcG9zaXRpb24uY29sdW1uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiAzMSAqIGxpbmUgKyBjb2x1bW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIobGluZSAiICsgbGluZSArICIsY29sICIgKyBjb2x1bW4gKyAiKSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb2JsZW0uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm9ibGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm9ibGVtLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBBIHByb2JsZW0gdGhhdCB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9ibGVtIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOworICAgIHByaXZhdGUgZmluYWwgVG9rZW5SYW5nZSBsb2NhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSBjYXVzZTsKKworICAgIHB1YmxpYyBQcm9ibGVtKFN0cmluZyBtZXNzYWdlLCBUb2tlblJhbmdlIGxvY2F0aW9uLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKKworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKGdldFZlcmJvc2VNZXNzYWdlKCkpOworICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RyLmFwcGVuZChFT0wpLmFwcGVuZCgiUHJvYmxlbSBzdGFja3RyYWNlIDogIikuYXBwZW5kKEVPTCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdXNlLmdldFN0YWNrVHJhY2UoKS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IHN0ZSA9IGNhdXNlLmdldFN0YWNrVHJhY2UoKVtpXTsKKyAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIgICIpLmFwcGVuZChzdGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGkgKyAxICE9IGNhdXNlLmdldFN0YWNrVHJhY2UoKS5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoRU9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIHBsdXMgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZXJib3NlTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uKCkubWFwKGwgLT4gbC5nZXRCZWdpbigpLmdldFJhbmdlKCkubWFwKHIgLT4gci5iZWdpbi50b1N0cmluZygpKS5vckVsc2UoIihsaW5lID8sY29sID8pIikgKyAiICIgKyBtZXNzYWdlKS5vckVsc2UobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxUb2tlblJhbmdlPiBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUobG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRMb2NhdGlvbigpCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgT3B0aW9uYWw8VG9rZW5SYW5nZT4gZ2V0UmFuZ2UoKSB7CisgICAgICAgIHJldHVybiBnZXRMb2NhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNhdXNlIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8VGhyb3dhYmxlPiBnZXRDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoY2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNvcnRzIHByb2JsZW1zIG9uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvcjxQcm9ibGVtPiBQUk9CTEVNX0JZX0JFR0lOX1BPU0lUSU9OID0gKGEsIGIpIC0+IHsKKyAgICAgICAgZmluYWwgT3B0aW9uYWw8UG9zaXRpb24+IGFCZWdpbj0gYS5nZXRMb2NhdGlvbigpLmZsYXRNYXAobCAtPiBsLmdldEJlZ2luKCkuZ2V0UmFuZ2UoKS5tYXAociAtPiByLmJlZ2luKSk7CisgICAgICAgIGZpbmFsIE9wdGlvbmFsPFBvc2l0aW9uPiBiQmVnaW4gPSBiLmdldExvY2F0aW9uKCkuZmxhdE1hcChsIC0+IGwuZ2V0QmVnaW4oKS5nZXRSYW5nZSgpLm1hcChyIC0+IHIuYmVnaW4pKTsKKworICAgICAgICBpZiAoYUJlZ2luLmlzUHJlc2VudCgpICYmIGJCZWdpbi5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGFCZWdpbi5nZXQoKS5jb21wYXJlVG8oYkJlZ2luLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS5nZXRMb2NhdGlvbigpLmlzUHJlc2VudCgpIHx8IGIuZ2V0TG9jYXRpb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgaWYgKGEuZ2V0TG9jYXRpb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH07CisKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb3ZpZGVycy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb3ZpZGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjNkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvdmlkZXJzLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CisKKy8qKgorICogRmFjdG9yeSBmb3IgcHJvdmlkZXJzIG9mIHNvdXJjZSBjb2RlIGZvciBKYXZhUGFyc2VyLiBQcm92aWRlcnMgdGhhdCBoYXZlIG5vIHBhcmFtZXRlciBmb3IgZW5jb2RpbmcgYnV0IG5lZWQgaXQgd2lsbAorICogdXNlIFVURi04LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvdmlkZXJzIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgVVRGOCA9IENoYXJzZXQuZm9yTmFtZSgidXRmLTgiKTsKKworICAgIHByaXZhdGUgUHJvdmlkZXJzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXIgcHJvdmlkZXIoUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVByb3ZpZGVyKGFzc2VydE5vdE51bGwocmVhZGVyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcihJbnB1dFN0cmVhbSBpbnB1dCwgQ2hhcnNldCBlbmNvZGluZykgeworICAgICAgICBhc3NlcnROb3ROdWxsKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmNvZGluZyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVByb3ZpZGVyKGlucHV0LCBlbmNvZGluZy5uYW1lKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBUaGUgb25seSBvbmUgdGhhdCBpcyB0aHJvd24gaXMgVW5zdXBwb3J0ZWRDaGFyYWN0ZXJFbmNvZGluZ0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIC8vIGFuZCB0aGF0J3MgYSBmdW5kYW1lbnRhbCBwcm9ibGVtLCBzbyBydW50aW1lIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcihJbnB1dFN0cmVhbSBpbnB1dCkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXIoaW5wdXQsIFVURjgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXIgcHJvdmlkZXIoRmlsZSBmaWxlLCBDaGFyc2V0IGVuY29kaW5nKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oYXNzZXJ0Tm90TnVsbChmaWxlKSksIGFzc2VydE5vdE51bGwoZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcm92aWRlcihhc3NlcnROb3ROdWxsKGZpbGUpLCBVVEY4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyKFBhdGggcGF0aCwgQ2hhcnNldCBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyKEZpbGVzLm5ld0lucHV0U3RyZWFtKGFzc2VydE5vdE51bGwocGF0aCkpLCBhc3NlcnROb3ROdWxsKGVuY29kaW5nKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcihQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcm92aWRlcihhc3NlcnROb3ROdWxsKHBhdGgpLCBVVEY4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyKFN0cmluZyBzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdQcm92aWRlcihhc3NlcnROb3ROdWxsKHNvdXJjZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhIFByb3ZpZGVyIGZyb20gdGhlIHJlc291cmNlIGZvdW5kIGluIGNsYXNzIGxvYWRlciB3aXRoIHRoZSBwcm92aWRlZCBlbmNvZGluZy48YnIvPiBBcyByZXNvdXJjZSBpcworICAgICAqIGFjY2Vzc2VkIHRocm91Z2ggYSBjbGFzcyBsb2FkZXIsIGEgbGVhZGluZyAiLyIgaXMgbm90IGFsbG93ZWQgaW4gcGF0aFRvUmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFN0cmluZyBwYXRoVG9SZXNvdXJjZSwgQ2hhcnNldCBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VBc1N0cmVhbSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aFRvUmVzb3VyY2UpOworICAgICAgICBpZiAocmVzb3VyY2VBc1N0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBmaW5kICIgKyBwYXRoVG9SZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyKHJlc291cmNlQXNTdHJlYW0sIGVuY29kaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGEgUHJvdmlkZXIgZnJvbSB0aGUgcmVzb3VyY2UgZm91bmQgaW4gdGhlIGN1cnJlbnQgY2xhc3MgbG9hZGVyIHdpdGggdGhlIHByb3ZpZGVkIGVuY29kaW5nLjxici8+IEFzCisgICAgICogcmVzb3VyY2UgaXMgYWNjZXNzZWQgdGhyb3VnaCBhIGNsYXNzIGxvYWRlciwgYSBsZWFkaW5nICIvIiBpcyBub3QgYWxsb3dlZCBpbiBwYXRoVG9SZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcihTdHJpbmcgcGF0aFRvUmVzb3VyY2UsIENoYXJzZXQgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gUHJvdmlkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlUHJvdmlkZXIoY2xhc3NMb2FkZXIsIHBhdGhUb1Jlc291cmNlLCBlbmNvZGluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhIFByb3ZpZGVyIGZyb20gdGhlIHJlc291cmNlIGZvdW5kIGluIHRoZSBjdXJyZW50IGNsYXNzIGxvYWRlciB3aXRoIFVURi04IGVuY29kaW5nLjxici8+IEFzIHJlc291cmNlIGlzCisgICAgICogYWNjZXNzZWQgdGhyb3VnaCBhIGNsYXNzIGxvYWRlciwgYSBsZWFkaW5nICIvIiBpcyBub3QgYWxsb3dlZCBpbiBwYXRoVG9SZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlcihTdHJpbmcgcGF0aFRvUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXNvdXJjZVByb3ZpZGVyKHBhdGhUb1Jlc291cmNlLCBVVEY4KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9SYW5nZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1JhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1YjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9SYW5nZS5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLnBvczsKKworLyoqCisgKiBBIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gYSBzb3VyY2UgZmlsZSwgZnJvbSAiYmVnaW4iIHRvICJlbmQiLCBpbmNsdWRpbmcgdGhlIGNoYXJhY3RlcnMgYXQgImJlZ2luIiBhbmQgImVuZCIuCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5nZSB7CisgICAgcHVibGljIGZpbmFsIFBvc2l0aW9uIGJlZ2luOworICAgIHB1YmxpYyBmaW5hbCBQb3NpdGlvbiBlbmQ7CisKKyAgICBwdWJsaWMgUmFuZ2UoUG9zaXRpb24gYmVnaW4sIFBvc2l0aW9uIGVuZCkgeworICAgICAgICBpZiAoYmVnaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmVnaW4gY2FuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW5kIGNhbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJlZ2luID0gYmVnaW47CisgICAgICAgIHRoaXMuZW5kID0gZW5kOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmFuZ2UgcmFuZ2UoUG9zaXRpb24gYmVnaW4sIFBvc2l0aW9uIGVuZCkgeworICAgICAgICByZXR1cm4gbmV3IFJhbmdlKGJlZ2luLCBlbmQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmFuZ2UgcmFuZ2UoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbikgeworICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHBvcyhiZWdpbkxpbmUsIGJlZ2luQ29sdW1uKSwgcG9zKGVuZExpbmUsIGVuZENvbHVtbikpOworICAgIH0KKworICAgIHB1YmxpYyBSYW5nZSB3aXRoQmVnaW5Db2x1bW4oaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gcmFuZ2UoYmVnaW4ud2l0aENvbHVtbihjb2x1bW4pLCBlbmQpOworICAgIH0KKworICAgIHB1YmxpYyBSYW5nZSB3aXRoQmVnaW5MaW5lKGludCBsaW5lKSB7CisgICAgICAgIHJldHVybiByYW5nZShiZWdpbi53aXRoTGluZShsaW5lKSwgZW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmFuZ2Ugd2l0aEVuZENvbHVtbihpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiByYW5nZShiZWdpbiwgZW5kLndpdGhDb2x1bW4oY29sdW1uKSk7CisgICAgfQorCisgICAgcHVibGljIFJhbmdlIHdpdGhFbmRMaW5lKGludCBsaW5lKSB7CisgICAgICAgIHJldHVybiByYW5nZShiZWdpbiwgZW5kLndpdGhMaW5lKGxpbmUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmFuZ2Ugd2l0aEJlZ2luKFBvc2l0aW9uIGJlZ2luKSB7CisgICAgICAgIHJldHVybiByYW5nZShiZWdpbiwgdGhpcy5lbmQpOworICAgIH0KKworICAgIHB1YmxpYyBSYW5nZSB3aXRoRW5kKFBvc2l0aW9uIGVuZCkgeworICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5iZWdpbiwgZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcyBzdHJpY3RseUNvbnRhaW5zLCBidXQgdHdvIGV4YWN0bHkgbWF0Y2hpbmcgcmFuZ2VzIGFyZSBhbHNvIGNvbnNpZGVyZWQgY29udGFpbmVkIG9uZSBpbiBlYWNoIG90aGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFJhbmdlIG90aGVyKSB7CisgICAgICAgIHJldHVybiAoYmVnaW4uaXNCZWZvcmUob3RoZXIuYmVnaW4pIHx8IGJlZ2luLmVxdWFscyhvdGhlci5iZWdpbikpICYmCisgICAgICAgICAgICAgICAgKGVuZC5pc0FmdGVyKG90aGVyLmVuZCkgfHwgZW5kLmVxdWFscyhvdGhlci5lbmQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGlzIHN0cmljdGx5IGNvbnRhaW5zIG90aGVyPyBJdCBtZWFucyB0aGF0IHRoaXMgaGFzIHRvIGJlIGxhcmdlciB0aGFuIG90aGVyIGFuZCBpdCBoYXMgdG8gc3RhcnQgYXMgb3RoZXIKKyAgICAgKiBvciBiZWZvcmUgYW5kIGVuZCBhcyBvdGhlciBvciBhZnRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdHJpY3RseUNvbnRhaW5zKFJhbmdlIG90aGVyKSB7CisgICAgICAgIHJldHVybiBiZWdpbi5pc0JlZm9yZShvdGhlci5iZWdpbikgJiYgZW5kLmlzQWZ0ZXIob3RoZXIuZW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZShQb3NpdGlvbiBwb3NpdGlvbikgeworICAgICAgICByZXR1cm4gZW5kLmlzQmVmb3JlKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyKFBvc2l0aW9uIHBvc2l0aW9uKSB7CisgICAgICAgIHJldHVybiBiZWdpbi5pc0FmdGVyKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSYW5nZSByYW5nZSA9IChSYW5nZSkgbzsKKworICAgICAgICByZXR1cm4gYmVnaW4uZXF1YWxzKHJhbmdlLmJlZ2luKSAmJiBlbmQuZXF1YWxzKHJhbmdlLmVuZCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gMzEgKiBiZWdpbi5oYXNoQ29kZSgpICsgZW5kLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGJlZ2luICsgIi0iICsgZW5kOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlblJhbmdlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW5SYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwY2IwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW5SYW5nZS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBUaGUgcmFuZ2Ugb2YgdG9rZW5zIGNvdmVyZWQgYnkgdGhpcyBub2RlLgorICovCitwdWJsaWMgY2xhc3MgVG9rZW5SYW5nZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPEphdmFUb2tlbj4geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5SYW5nZSBJTlZBTElEID0gbmV3IFRva2VuUmFuZ2UoSmF2YVRva2VuLklOVkFMSUQsIEphdmFUb2tlbi5JTlZBTElEKTsKKworICAgIHByaXZhdGUgZmluYWwgSmF2YVRva2VuIGJlZ2luOworICAgIHByaXZhdGUgZmluYWwgSmF2YVRva2VuIGVuZDsKKworICAgIHB1YmxpYyBUb2tlblJhbmdlKEphdmFUb2tlbiBiZWdpbiwgSmF2YVRva2VuIGVuZCkgeworICAgICAgICB0aGlzLmJlZ2luID0gYXNzZXJ0Tm90TnVsbChiZWdpbik7CisgICAgICAgIHRoaXMuZW5kID0gYXNzZXJ0Tm90TnVsbChlbmQpOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhVG9rZW4gZ2V0QmVnaW4oKSB7CisgICAgICAgIHJldHVybiBiZWdpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YVRva2VuIGdldEVuZCgpIHsKKyAgICAgICAgcmV0dXJuIGVuZDsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmFuZ2U+IHRvUmFuZ2UoKSB7CisgICAgICAgIGlmIChiZWdpbi5nZXRSYW5nZSgpLmlzUHJlc2VudCgpICYmIGVuZC5nZXRSYW5nZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobmV3IFJhbmdlKGJlZ2luLmdldFJhbmdlKCkuZ2V0KCkuYmVnaW4sIGVuZC5nZXRSYW5nZSgpLmdldCgpLmVuZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBUb2tlblJhbmdlIHdpdGhCZWdpbihKYXZhVG9rZW4gYmVnaW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlblJhbmdlKGFzc2VydE5vdE51bGwoYmVnaW4pLCBlbmQpOworICAgIH0KKworICAgIHB1YmxpYyBUb2tlblJhbmdlIHdpdGhFbmQoSmF2YVRva2VuIGVuZCkgeworICAgICAgICByZXR1cm4gbmV3IFRva2VuUmFuZ2UoYmVnaW4sIGFzc2VydE5vdE51bGwoZW5kKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IoSmF2YVRva2VuIHQ6IHRoaXMpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodC5nZXRUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmF0b3I8SmF2YVRva2VuPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxKYXZhVG9rZW4+KCkgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc05leHQgPSB0cnVlOworICAgICAgICAgICAgcHJpdmF0ZSBKYXZhVG9rZW4gY3VycmVudCA9IGJlZ2luOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc05leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEphdmFUb2tlbiBuZXh0KCkgeworICAgICAgICAgICAgICAgIEphdmFUb2tlbiByZXR2YWwgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIGlmKGN1cnJlbnQgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gbW92ZSBwYXN0IGVuZCBvZiByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dFRva2VuKCkub3JFbHNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmKGN1cnJlbnQgPT0gbnVsbCAmJiBoYXNOZXh0KXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW5kIHRva2VuIGlzIG5vdCBsaW5rZWQgdG8gYmVnaW4gdG9rZW4uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuVHlwZXMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlblR5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MGFhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlblR5cGVzLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CisKKy8qKgorICogQ29tcGxlbWVudHMgR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cworICovCitwdWJsaWMgY2xhc3MgVG9rZW5UeXBlcyB7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2hpdGVzcGFjZShpbnQga2luZCkgeworICAgICAgICByZXR1cm4gZ2V0Q2F0ZWdvcnkoa2luZCkuaXNXaGl0ZXNwYWNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGlzRW5kT2ZMaW5lVG9rZW4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuZE9mTGluZUNoYXJhY3RlcihpbnQga2luZCkgeworICAgICAgICByZXR1cm4gaXNFbmRPZkxpbmVUb2tlbihraW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmRPZkxpbmVUb2tlbihpbnQga2luZCkgeworICAgICAgICByZXR1cm4gZ2V0Q2F0ZWdvcnkoa2luZCkuaXNFbmRPZkxpbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlT3JDb21tZW50KGludCBraW5kKSB7CisgICAgICAgIHJldHVybiBnZXRDYXRlZ29yeShraW5kKS5pc1doaXRlc3BhY2VPckNvbW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZU9yVGFiKGludCBraW5kKSB7CisgICAgICAgIHJldHVybiBnZXRDYXRlZ29yeShraW5kKS5pc1doaXRlc3BhY2VCdXROb3RFbmRPZkxpbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21tZW50KGludCBraW5kKSB7CisgICAgICAgIHJldHVybiBnZXRDYXRlZ29yeShraW5kKS5pc0NvbW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZW9sVG9rZW5LaW5kCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGludCBlb2xUb2tlbigpIHsKKyAgICAgICAgcmV0dXJuIGVvbFRva2VuS2luZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGtpbmQgb2YgRU9MIHRva2VuIHRvIHVzZSBvbiB0aGUgcGxhdGZvcm0geW91J3JlIHJ1bm5pbmcgb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZW9sVG9rZW5LaW5kKCkgeworICAgICAgICBpZiAoRU9MLmVxdWFscygiXG4iKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOSVhfRU9MOworICAgICAgICB9CisgICAgICAgIGlmIChFT0wuZXF1YWxzKCJcclxuIikpIHsKKyAgICAgICAgICAgIHJldHVybiBXSU5ET1dTX0VPTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoRU9MLmVxdWFscygiXHIiKSkgeworICAgICAgICAgICAgcmV0dXJuIE9MRF9NQUNfRU9MOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5rbm93biBFT0wgY2hhcmFjdGVyIHNlcXVlbmNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG9rZW4ga2luZCBmb3IgYSBzaW5nbGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc3BhY2VUb2tlbktpbmQoKSB7CisgICAgICAgIHJldHVybiBTUEFDRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc3BhY2VUb2tlbktpbmQKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHNwYWNlVG9rZW4oKSB7CisgICAgICAgIHJldHVybiBzcGFjZVRva2VuS2luZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhdGVnb3J5IG9mIGEgdG9rZW4sIGEgbGl0dGxlIG1vcmUgZGV0YWlsZWQgdGhhbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U4L2h0bWwvamxzLTMuaHRtbCNqbHMtMy41Ij5UaGUgSkxTPC9hPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEphdmFUb2tlbi5DYXRlZ29yeSBnZXRDYXRlZ29yeShpbnQga2luZCkgeworICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgV0lORE9XU19FT0w6CisgICAgICAgICAgICBjYXNlIFVOSVhfRU9MOgorICAgICAgICAgICAgY2FzZSBPTERfTUFDX0VPTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVRva2VuLkNhdGVnb3J5LkVPTDsKKyAgICAgICAgICAgIGNhc2UgRU9GOgorICAgICAgICAgICAgY2FzZSBTUEFDRToKKyAgICAgICAgICAgIGNhc2UgQ1RSTF9aOgorICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVG9rZW4uQ2F0ZWdvcnkuV0hJVEVTUEFDRV9OT19FT0w7CisgICAgICAgICAgICBjYXNlIFNJTkdMRV9MSU5FX0NPTU1FTlQ6CisgICAgICAgICAgICBjYXNlIEpBVkFET0NfQ09NTUVOVDoKKyAgICAgICAgICAgIGNhc2UgTVVMVElfTElORV9DT01NRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVG9rZW4uQ2F0ZWdvcnkuQ09NTUVOVDsKKyAgICAgICAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICAgICAgICBjYXNlIEFTU0VSVDoKKyAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgQlJFQUs6CisgICAgICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgICAgICBjYXNlIENBU0U6CisgICAgICAgICAgICBjYXNlIENBVENIOgorICAgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgY2FzZSBDTEFTUzoKKyAgICAgICAgICAgIGNhc2UgQ09OU1Q6CisgICAgICAgICAgICBjYXNlIENPTlRJTlVFOgorICAgICAgICAgICAgY2FzZSBfREVGQVVMVDoKKyAgICAgICAgICAgIGNhc2UgRE86CisgICAgICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgICAgIGNhc2UgRUxTRToKKyAgICAgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICAgIGNhc2UgRVhURU5EUzoKKyAgICAgICAgICAgIGNhc2UgRkFMU0U6CisgICAgICAgICAgICBjYXNlIEZJTkFMOgorICAgICAgICAgICAgY2FzZSBGSU5BTExZOgorICAgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgIGNhc2UgRk9SOgorICAgICAgICAgICAgY2FzZSBHT1RPOgorICAgICAgICAgICAgY2FzZSBJRjoKKyAgICAgICAgICAgIGNhc2UgSU1QTEVNRU5UUzoKKyAgICAgICAgICAgIGNhc2UgSU1QT1JUOgorICAgICAgICAgICAgY2FzZSBJTlNUQU5DRU9GOgorICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICBjYXNlIElOVEVSRkFDRToKKyAgICAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgIGNhc2UgTkFUSVZFOgorICAgICAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgICBjYXNlIE5VTEw6CisgICAgICAgICAgICBjYXNlIFBBQ0tBR0U6CisgICAgICAgICAgICBjYXNlIFBSSVZBVEU6CisgICAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgUFVCTElDOgorICAgICAgICAgICAgY2FzZSBSRVRVUk46CisgICAgICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgICAgICAgY2FzZSBTVVBFUjoKKyAgICAgICAgICAgIGNhc2UgU1dJVENIOgorICAgICAgICAgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgICAgICAgICBjYXNlIFRISVM6CisgICAgICAgICAgICBjYXNlIFRIUk9XOgorICAgICAgICAgICAgY2FzZSBUSFJPV1M6CisgICAgICAgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgICAgICAgIGNhc2UgVFJVRToKKyAgICAgICAgICAgIGNhc2UgVFJZOgorICAgICAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICAgICAgY2FzZSBWT0xBVElMRToKKyAgICAgICAgICAgIGNhc2UgV0hJTEU6CisgICAgICAgICAgICBjYXNlIFJFUVVJUkVTOgorICAgICAgICAgICAgY2FzZSBUTzoKKyAgICAgICAgICAgIGNhc2UgV0lUSDoKKyAgICAgICAgICAgIGNhc2UgT1BFTjoKKyAgICAgICAgICAgIGNhc2UgT1BFTlM6CisgICAgICAgICAgICBjYXNlIFVTRVM6CisgICAgICAgICAgICBjYXNlIE1PRFVMRToKKyAgICAgICAgICAgIGNhc2UgRVhQT1JUUzoKKyAgICAgICAgICAgIGNhc2UgUFJPVklERVM6CisgICAgICAgICAgICBjYXNlIFRSQU5TSVRJVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFUb2tlbi5DYXRlZ29yeS5LRVlXT1JEOworICAgICAgICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgorICAgICAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKKyAgICAgICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX0xJVEVSQUw6CisgICAgICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICAgICAgICBjYXNlIERFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgICAgICAgIGNhc2UgREVDSU1BTF9FWFBPTkVOVDoKKyAgICAgICAgICAgIGNhc2UgSEVYQURFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgICAgICAgIGNhc2UgSEVYQURFQ0lNQUxfRVhQT05FTlQ6CisgICAgICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVRva2VuLkNhdGVnb3J5LkxJVEVSQUw7CisgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFUb2tlbi5DYXRlZ29yeS5JREVOVElGSUVSOworICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICBjYXNlIFJQQVJFTjoKKyAgICAgICAgICAgIGNhc2UgTEJSQUNFOgorICAgICAgICAgICAgY2FzZSBSQlJBQ0U6CisgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgY2FzZSBSQlJBQ0tFVDoKKyAgICAgICAgICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIGNhc2UgRE9UOgorICAgICAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVRva2VuLkNhdGVnb3J5LlNFUEFSQVRPUjsKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICAgIGNhc2UgQkFORzoKKyAgICAgICAgICAgIGNhc2UgVElMREU6CisgICAgICAgICAgICBjYXNlIEhPT0s6CisgICAgICAgICAgICBjYXNlIENPTE9OOgorICAgICAgICAgICAgY2FzZSBFUToKKyAgICAgICAgICAgIGNhc2UgTEU6CisgICAgICAgICAgICBjYXNlIEdFOgorICAgICAgICAgICAgY2FzZSBORToKKyAgICAgICAgICAgIGNhc2UgU0NfT1I6CisgICAgICAgICAgICBjYXNlIFNDX0FORDoKKyAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgICAgICBjYXNlIFNMQVNIOgorICAgICAgICAgICAgY2FzZSBCSVRfQU5EOgorICAgICAgICAgICAgY2FzZSBCSVRfT1I6CisgICAgICAgICAgICBjYXNlIFhPUjoKKyAgICAgICAgICAgIGNhc2UgUkVNOgorICAgICAgICAgICAgY2FzZSBMU0hJRlQ6CisgICAgICAgICAgICBjYXNlIFBMVVNBU1NJR046CisgICAgICAgICAgICBjYXNlIE1JTlVTQVNTSUdOOgorICAgICAgICAgICAgY2FzZSBTVEFSQVNTSUdOOgorICAgICAgICAgICAgY2FzZSBTTEFTSEFTU0lHTjoKKyAgICAgICAgICAgIGNhc2UgQU5EQVNTSUdOOgorICAgICAgICAgICAgY2FzZSBPUkFTU0lHTjoKKyAgICAgICAgICAgIGNhc2UgWE9SQVNTSUdOOgorICAgICAgICAgICAgY2FzZSBSRU1BU1NJR046CisgICAgICAgICAgICBjYXNlIExTSElGVEFTU0lHTjoKKyAgICAgICAgICAgIGNhc2UgUlNJR05FRFNISUZUQVNTSUdOOgorICAgICAgICAgICAgY2FzZSBSVU5TSUdORURTSElGVEFTU0lHTjoKKyAgICAgICAgICAgIGNhc2UgRUxMSVBTSVM6CisgICAgICAgICAgICBjYXNlIEFSUk9XOgorICAgICAgICAgICAgY2FzZSBET1VCTEVDT0xPTjoKKyAgICAgICAgICAgIGNhc2UgUlVOU0lHTkVEU0hJRlQ6CisgICAgICAgICAgICBjYXNlIFJTSUdORURTSElGVDoKKyAgICAgICAgICAgIGNhc2UgR1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFUb2tlbi5DYXRlZ29yeS5PUEVSQVRPUjsKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHRva2VucyB0aGF0IGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieSB0aGUgbGV4ZXIKKyAgICAgICAgICAgIGNhc2UgRU5URVJfSkFWQURPQ19DT01NRU5UOgorICAgICAgICAgICAgY2FzZSBFTlRFUl9NVUxUSUxJTkVfQ09NTUVOVDoKKyAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9DT05URU5UOgorICAgICAgICAgICAgY2FzZSBIRVhfRElHSVRTOgorICAgICAgICAgICAgY2FzZSBMRVRURVI6CisgICAgICAgICAgICBjYXNlIFVOSUNPREVfRVNDQVBFOgorICAgICAgICAgICAgY2FzZSBQQVJUX0xFVFRFUjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHRva2VuIGtpbmQgIiArIGtpbmQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9BY2Nlc3NTcGVjaWZpZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlOTZiOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworLyoqCisgKiBBY2Nlc3Mgc3BlY2lmaWVyLiBSZXByZXNlbnRzIG9uZSBvZiB0aGUgcG9zc2libGUgbGV2ZWxzIG9mCisgKiBhY2Nlc3MgcGVybWl0dGVkIGJ5IHRoZSBsYW5ndWFnZS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqIEBzaW5jZSBKdWx5IDIwMTQKKyAqLworcHVibGljIGVudW0gQWNjZXNzU3BlY2lmaWVyIHsKKworICAgIFBVQkxJQygicHVibGljIiksCisgICAgUFJJVkFURSgicHJpdmF0ZSIpLAorICAgIFBST1RFQ1RFRCgicHJvdGVjdGVkIiksCisgICAgREVGQVVMVCgiIik7CisKKyAgICBwcml2YXRlIFN0cmluZyBjb2RlUmVwcmVzZW5hdGlvbjsKKworICAgIEFjY2Vzc1NwZWNpZmllcihTdHJpbmcgY29kZVJlcHJlc2VudGF0aW9uKSB7CisgICAgICAgIHRoaXMuY29kZVJlcHJlc2VuYXRpb24gPSBjb2RlUmVwcmVzZW50YXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29kZVJlcHJlc2VuYXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9BbGxGaWVsZHNDb25zdHJ1Y3Rvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9BbGxGaWVsZHNDb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDU4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FsbEZpZWxkc0NvbnN0cnVjdG9yLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVGVsbHMgdG9vbHMgdGhhdCB0aGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBkaXJlY3RseSBpbml0aWFsaXplcyBhbGwgZmllbGRzIChleGNlcHQgInJhbmdlIiBhbmQgImNvbW1lbnQiKQorICovCitAVGFyZ2V0KEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEFsbEZpZWxkc0NvbnN0cnVjdG9yIHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQXJyYXlDcmVhdGlvbkxldmVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5Q3JlYXRpb25MZXZlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTQ4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5Q3JlYXRpb25MZXZlbC5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5BcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKKworLyoqCisgKiBJbiA8Y29kZT5uZXcgaW50WzFdWzJdOzwvY29kZT4gdGhlcmUgYXJlIHR3byBBcnJheUNyZWF0aW9uTGV2ZWwgb2JqZWN0cywKKyAqIHRoZSBmaXJzdCBvbmUgY29udGFpbnMgdGhlIGV4cHJlc3Npb24gIjEiLAorICogdGhlIHNlY29uZCB0aGUgZXhwcmVzc2lvbiAiMiIuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBcnJheUNyZWF0aW9uTGV2ZWwgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhBbm5vdGF0aW9uczxBcnJheUNyZWF0aW9uTGV2ZWw+IHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGRpbWVuc2lvbjsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbmV3IE5vZGVMaXN0PD4oKTsKKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uTGV2ZWwoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25MZXZlbChpbnQgZGltZW5zaW9uKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IEludGVnZXJMaXRlcmFsRXhwcigiIiArIGRpbWVuc2lvbiksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uTGV2ZWwoRXhwcmVzc2lvbiBkaW1lbnNpb24pIHsKKyAgICAgICAgdGhpcyhudWxsLCBkaW1lbnNpb24sIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uTGV2ZWwoRXhwcmVzc2lvbiBkaW1lbnNpb24sIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzKG51bGwsIGRpbWVuc2lvbiwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkxldmVsKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBkaW1lbnNpb24sIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0RGltZW5zaW9uKGRpbWVuc2lvbik7CisgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRpbWVuc2lvbgorICAgICAqCisgICAgICogQHBhcmFtIGRpbWVuc2lvbiB0aGUgZGltZW5zaW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIEFycmF5Q3JlYXRpb25MZXZlbAorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkxldmVsIHNldERpbWVuc2lvbihmaW5hbCBFeHByZXNzaW9uIGRpbWVuc2lvbikgeworICAgICAgICBpZiAoZGltZW5zaW9uID09IHRoaXMuZGltZW5zaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKEFycmF5Q3JlYXRpb25MZXZlbCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRElNRU5TSU9OLCB0aGlzLmRpbWVuc2lvbiwgZGltZW5zaW9uKTsKKyAgICAgICAgaWYgKHRoaXMuZGltZW5zaW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmRpbWVuc2lvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZGltZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFeHByZXNzaW9uPiBnZXREaW1lbnNpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGRpbWVuc2lvbik7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25MZXZlbCBzZXRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSB0aGlzLmFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKEFycmF5Q3JlYXRpb25MZXZlbCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQU5OT1RBVElPTlMsIHRoaXMuYW5ub3RhdGlvbnMsIGFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25MZXZlbCByZW1vdmVEaW1lbnNpb24oKSB7CisgICAgICAgIHJldHVybiBzZXREaW1lbnNpb24oKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpbWVuc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBkaW1lbnNpb24pIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEaW1lbnNpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkxldmVsIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEFycmF5Q3JlYXRpb25MZXZlbCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuYXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkaW1lbnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gZGltZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgc2V0RGltZW5zaW9uKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Db21waWxhdGlvblVuaXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQ29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4YmIyMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTAsMCArMSw2OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLk1vZHVsZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Db21waWxhdGlvblVuaXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5JbnRlcm5hbFByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk9wdGlvbmFsUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuUHJldHR5UHJpbnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ2xhc3NVdGlsczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlsczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlTmFtZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5VVEY4OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5zdWJ0cmFjdFBhdGhzOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKKy8qKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGVudGlyZSBjb21waWxhdGlvbiB1bml0LiBFYWNoIGphdmEgZmlsZSBkZW5vdGVzIGEKKyAqIGNvbXBpbGF0aW9uIHVuaXQuCisgKiA8L3A+CisgKiBBIGNvbXBpbGF0aW9uIHVuaXQgc3RhcnQgd2l0aCBhbiBvcHRpb25hbCBwYWNrYWdlIGRlY2xhcmF0aW9uLAorICogZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGltcG9ydCBkZWNsYXJhdGlvbnMsCisgKiBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgdHlwZSBkZWNsYXJhdGlvbnMuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKiBAc2VlIFBhY2thZ2VEZWNsYXJhdGlvbgorICogQHNlZSBJbXBvcnREZWNsYXJhdGlvbgorICogQHNlZSBUeXBlRGVjbGFyYXRpb24KKyAqIEBzZWUgU3RvcmFnZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgTm9kZSB7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbjsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHM7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PFR5cGVEZWNsYXJhdGlvbjw/Pj4gdHlwZXM7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgTW9kdWxlRGVjbGFyYXRpb24gbW9kdWxlOworCisgICAgQEludGVybmFsUHJvcGVydHkKKyAgICBwcml2YXRlIFN0b3JhZ2Ugc3RvcmFnZTsKKworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdChTdHJpbmcgcGFja2FnZURlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IFBhY2thZ2VEZWNsYXJhdGlvbihuZXcgTmFtZShwYWNrYWdlRGVjbGFyYXRpb24pKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbnVsbCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdChQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uLCBOb2RlTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cywgTm9kZUxpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlcywgTW9kdWxlRGVjbGFyYXRpb24gbW9kdWxlKSB7CisgICAgICAgIHRoaXMobnVsbCwgcGFja2FnZURlY2xhcmF0aW9uLCBpbXBvcnRzLCB0eXBlcywgbW9kdWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24sIE5vZGVMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBOb2RlTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzLCBNb2R1bGVEZWNsYXJhdGlvbiBtb2R1bGUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFBhY2thZ2VEZWNsYXJhdGlvbihwYWNrYWdlRGVjbGFyYXRpb24pOworICAgICAgICBzZXRJbXBvcnRzKGltcG9ydHMpOworICAgICAgICBzZXRUeXBlcyh0eXBlcyk7CisgICAgICAgIHNldE1vZHVsZShtb2R1bGUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIGFsbCBjb21tZW50cyBkZWNsYXJlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICogSW5jbHVkaW5nIGphdmFkb2NzLCBsaW5lIGNvbW1lbnRzIGFuZCBibG9jayBjb21tZW50cyBvZiBhbGwgdHlwZXMsCisgICAgICogaW5uZXItY2xhc3NlcyBhbmQgb3RoZXIgbWVtYmVycy48YnI+CisgICAgICogSWYgdGhlcmUgaXMgbm8gY29tbWVudCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCB3aXRoIGFsbCBjb21tZW50cyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICogQHNlZSBKYXZhZG9jQ29tbWVudAorICAgICAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudAorICAgICAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxDb21tZW50PiBnZXRDb21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgaW1wb3J0cyBkZWNsYXJlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBpbXBvcnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGltcG9ydHMgb3IgPGNvZGU+bm9uZTwvY29kZT4gaWYgdGhlcmUgaXMgbm8gaW1wb3J0CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIGltcG9ydHM7CisgICAgfQorCisgICAgcHVibGljIEltcG9ydERlY2xhcmF0aW9uIGdldEltcG9ydChpbnQgaSkgeworICAgICAgICByZXR1cm4gZ2V0SW1wb3J0cygpLmdldChpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiB1bml0Ljxicj4KKyAgICAgKiBJZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaGFzIG5vIHBhY2thZ2UgZGVjbGFyYXRpb24gKGRlZmF1bHQgcGFja2FnZSksCisgICAgICogPGNvZGU+T3B0aW9uYWwubm9uZSgpPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb3IgPGNvZGU+bm9uZTwvY29kZT4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFBhY2thZ2VEZWNsYXJhdGlvbj4gZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShwYWNrYWdlRGVjbGFyYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiB0b3AgbGV2ZWwgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0Ljxicj4KKyAgICAgKiBJZiB0aGVyZSBhcmUgbm8gdHlwZXMgZGVjbGFyZWQsIDxjb2RlPm5vbmU8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB0eXBlcyBvciA8Y29kZT5ub25lPC9jb2RlPiBudWxsIGlmIHRoZXJlIGlzIG5vIHR5cGUKKyAgICAgKiBAc2VlIEFubm90YXRpb25EZWNsYXJhdGlvbgorICAgICAqIEBzZWUgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCisgICAgICogQHNlZSBFbnVtRGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PFR5cGVEZWNsYXJhdGlvbjw/Pj4gZ2V0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB3cmFwcyA8Y29kZT5nZXRUeXBlcygpPC9jb2RlPi48YnI+CisgICAgICogSWYgPGNvZGU+aTwvY29kZT4gaXMgb3V0IG9mIGJvdW5kcywgdGhyb3dzIDxjb2RlPkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGkgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHRvIHJldHJpZXZlCisgICAgICovCisgICAgcHVibGljIFR5cGVEZWNsYXJhdGlvbjw/PiBnZXRUeXBlKGludCBpKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlcygpLmdldChpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIGltcG9ydHMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LiBUaGUgbGlzdCBpcyBpbml0aWFsbHkKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbXBvcnRzIHRoZSBsaXN0IG9mIGltcG9ydHMKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBzZXRJbXBvcnRzKGZpbmFsIE5vZGVMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW1wb3J0cyk7CisgICAgICAgIGlmIChpbXBvcnRzID09IHRoaXMuaW1wb3J0cykgeworICAgICAgICAgICAgcmV0dXJuIChDb21waWxhdGlvblVuaXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LklNUE9SVFMsIHRoaXMuaW1wb3J0cywgaW1wb3J0cyk7CisgICAgICAgIGlmICh0aGlzLmltcG9ydHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuaW1wb3J0cy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmltcG9ydHMgPSBpbXBvcnRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihpbXBvcnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBzZXRJbXBvcnQoaW50IGksIEltcG9ydERlY2xhcmF0aW9uIGltcG9ydHMpIHsKKyAgICAgICAgZ2V0SW1wb3J0cygpLnNldChpLCBpbXBvcnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBhZGRJbXBvcnQoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0cykgeworICAgICAgICBnZXRJbXBvcnRzKCkuYWRkKGltcG9ydHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIG9yIGNsZWFyIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9ucyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZURlY2xhcmF0aW9uIHRoZSBwYWNrYWdlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGRlZmF1bHQgcGFja2FnZQorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IHNldFBhY2thZ2VEZWNsYXJhdGlvbihmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uKSB7CisgICAgICAgIGlmIChwYWNrYWdlRGVjbGFyYXRpb24gPT0gdGhpcy5wYWNrYWdlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoQ29tcGlsYXRpb25Vbml0KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5QQUNLQUdFX0RFQ0xBUkFUSU9OLCB0aGlzLnBhY2thZ2VEZWNsYXJhdGlvbiwgcGFja2FnZURlY2xhcmF0aW9uKTsKKyAgICAgICAgaWYgKHRoaXMucGFja2FnZURlY2xhcmF0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnBhY2thZ2VEZWNsYXJhdGlvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnBhY2thZ2VEZWNsYXJhdGlvbiA9IHBhY2thZ2VEZWNsYXJhdGlvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YocGFja2FnZURlY2xhcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgc2V0VHlwZXMoZmluYWwgTm9kZUxpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlcykgeworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVzKTsKKyAgICAgICAgaWYgKHR5cGVzID09IHRoaXMudHlwZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ29tcGlsYXRpb25Vbml0KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFUywgdGhpcy50eXBlcywgdHlwZXMpOworICAgICAgICBpZiAodGhpcy50eXBlcyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlcy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGVzID0gdHlwZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBzZXRUeXBlKGludCBpLCBUeXBlRGVjbGFyYXRpb248Pz4gdHlwZSkgeworICAgICAgICBOb2RlTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IGNvcHkgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICBjb3B5LmFkZEFsbChnZXRUeXBlcygpKTsKKyAgICAgICAgZ2V0VHlwZXMoKS5zZXQoaSwgdHlwZSk7CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFUywgY29weSwgdHlwZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFkZFR5cGUoVHlwZURlY2xhcmF0aW9uPD8+IHR5cGUpIHsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PiBjb3B5ID0gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICAgICAgY29weS5hZGRBbGwoZ2V0VHlwZXMoKSk7CisgICAgICAgIGdldFR5cGVzKCkuYWRkKHR5cGUpOworICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRVMsIGNvcHksIHR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCisgICAgICogQHJldHVybiB0aGlzLCB0aGUge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IHNldFBhY2thZ2VEZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRQYWNrYWdlRGVjbGFyYXRpb24obmV3IFBhY2thZ2VEZWNsYXJhdGlvbihwYXJzZU5hbWUobmFtZSkpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGltcG9ydCB0byB0aGUgbGlzdCBvZiB7QGxpbmsgSW1wb3J0RGVjbGFyYXRpb259IG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdDxicj4KKyAgICAgKiBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkSW1wb3J0KFN0cmluZywgYm9vbGVhbiwgYm9vbGVhbil9IHdpdGggbmFtZSxmYWxzZSxmYWxzZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGltcG9ydCBuYW1lCisgICAgICogQHJldHVybiB0aGlzLCB0aGUge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFkZEltcG9ydChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYWRkSW1wb3J0KG5hbWUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGltcG9ydCB0byB0aGUgbGlzdCBvZiB7QGxpbmsgSW1wb3J0RGVjbGFyYXRpb259IG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdDxicj4KKyAgICAgKiBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkSW1wb3J0KFN0cmluZyl9IHdpdGggY2xhenouZ2V0TmFtZSgpCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIHRvIGltcG9ydAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIHtAbGluayBDb21waWxhdGlvblVuaXR9CisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGNsYXp6IGlzIGFuIGFub255bW91cyBvciBsb2NhbCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgYWRkSW1wb3J0KENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGlmIChDbGFzc1V0aWxzLmlzUHJpbWl0aXZlT3JXcmFwcGVyKGNsYXp6KSB8fCBjbGF6ei5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YS5sYW5nIikpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZWxzZSBpZiAoY2xhenouaXNNZW1iZXJDbGFzcygpKQorICAgICAgICAgICAgcmV0dXJuIGFkZEltcG9ydChjbGF6ei5nZXROYW1lKCkucmVwbGFjZSgiJCIsICIuIikpOworICAgICAgICBlbHNlIGlmIChjbGF6ei5pc0FycmF5KCkgJiYgIUNsYXNzVXRpbHMuaXNQcmltaXRpdmVPcldyYXBwZXIoY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpKSAmJiAhY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSkKKyAgICAgICAgICAgIHJldHVybiBhZGRJbXBvcnQoY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgIGVsc2UgaWYgKGNsYXp6LmlzQW5vbnltb3VzQ2xhc3MoKSB8fCBjbGF6ei5pc0xvY2FsQ2xhc3MoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNsYXp6LmdldE5hbWUoKSArICIgaXMgYW4gYW5vbnltb3VzIG9yIGxvY2FsIGNsYXNzIHRoZXJlZm9yZSBpdCBjYW4ndCBiZSBhZGRlZCB3aXRoIGFkZEltcG9ydCIpOworICAgICAgICByZXR1cm4gYWRkSW1wb3J0KGNsYXp6LmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGltcG9ydCB0byB0aGUgbGlzdCBvZiB7QGxpbmsgSW1wb3J0RGVjbGFyYXRpb259IG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdDxicj4KKyAgICAgKiA8Yj5UaGlzIG1ldGhvZCBjaGVjayBpZiBubyBpbXBvcnQgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIGxpc3Q8L2I+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgaW1wb3J0IG5hbWUKKyAgICAgKiBAcGFyYW0gaXNTdGF0aWMgaXMgaXQgYW4gImltcG9ydCBzdGF0aWMiCisgICAgICogQHBhcmFtIGlzQXN0ZXJpc2sgZG9lcyB0aGUgaW1wb3J0IGVuZCB3aXRoICIuKiIKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fQorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgYWRkSW1wb3J0KFN0cmluZyBuYW1lLCBib29sZWFuIGlzU3RhdGljLCBib29sZWFuIGlzQXN0ZXJpc2spIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBpID0gbmV3IFN0cmluZ0J1aWxkZXIoImltcG9ydCAiKTsKKyAgICAgICAgaWYgKGlzU3RhdGljKSB7CisgICAgICAgICAgICBpLmFwcGVuZCgic3RhdGljICIpOworICAgICAgICB9CisgICAgICAgIGkuYXBwZW5kKG5hbWUpOworICAgICAgICBpZiAoaXNBc3RlcmlzaykgeworICAgICAgICAgICAgaS5hcHBlbmQoIi4qIik7CisgICAgICAgIH0KKyAgICAgICAgaS5hcHBlbmQoIjsiKTsKKyAgICAgICAgSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gPSBKYXZhUGFyc2VyLnBhcnNlSW1wb3J0KGkudG9TdHJpbmcoKSk7CisgICAgICAgIGlmIChnZXRJbXBvcnRzKCkuc3RyZWFtKCkuYW55TWF0Y2goaW0gLT4gaW0udG9TdHJpbmcoKS5lcXVhbHMoaW1wb3J0RGVjbGFyYXRpb24udG9TdHJpbmcoKSkpKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ2V0SW1wb3J0cygpLmFkZChpbXBvcnREZWNsYXJhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHB1YmxpYyBjbGFzcyB0byB0aGUgdHlwZXMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgY2xhc3MgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGFkZENsYXNzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRDbGFzcyhuYW1lLCBNb2RpZmllci5QVUJMSUMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGNsYXNzIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBjbGFzcyBuYW1lCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIChsaWtlIE1vZGlmaWVyLlBVQkxJQykKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBhZGRDbGFzcyhTdHJpbmcgbmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpLCBmYWxzZSwgbmFtZSk7CisgICAgICAgIGdldFR5cGVzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbik7CisgICAgICAgIHJldHVybiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHVibGljIGludGVyZmFjZSBjbGFzcyB0byB0aGUgdHlwZXMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgaW50ZXJmYWNlIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBhZGRJbnRlcmZhY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEludGVyZmFjZShuYW1lLCBNb2RpZmllci5QVUJMSUMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbnRlcmZhY2UgdG8gdGhlIHR5cGVzIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGludGVyZmFjZSBuYW1lCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIChsaWtlIE1vZGlmaWVyLlBVQkxJQykKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBhZGRJbnRlcmZhY2UoU3RyaW5nIG5hbWUsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSwgdHJ1ZSwgbmFtZSk7CisgICAgICAgIGdldFR5cGVzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbik7CisgICAgICAgIHJldHVybiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHVibGljIGVudW0gdG8gdGhlIHR5cGVzIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGVudW0gbmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uIGFkZEVudW0oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEVudW0obmFtZSwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZW51bSB0byB0aGUgdHlwZXMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZW51bSBuYW1lCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIChsaWtlIE1vZGlmaWVyLlBVQkxJQykKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbiBhZGRFbnVtKFN0cmluZyBuYW1lLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiA9IG5ldyBFbnVtRGVjbGFyYXRpb24oQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSksIG5hbWUpOworICAgICAgICBnZXRUeXBlcygpLmFkZChlbnVtRGVjbGFyYXRpb24pOworICAgICAgICByZXR1cm4gZW51bURlY2xhcmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHB1YmxpYyBhbm5vdGF0aW9uIGRlY2xhcmF0aW9uIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhbm5vdGF0aW9uIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbiBhZGRBbm5vdGF0aW9uRGVjbGFyYXRpb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEFubm90YXRpb25EZWNsYXJhdGlvbihuYW1lLCBNb2RpZmllci5QVUJMSUMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhbm5vdGF0aW9uIGRlY2xhcmF0aW9uIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhbm5vdGF0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgKGxpa2UgTW9kaWZpZXIuUFVCTElDKQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFkZEFubm90YXRpb25EZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSBuZXcgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpLCBuYW1lKTsKKyAgICAgICAgZ2V0VHlwZXMoKS5hZGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25EZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZ2V0IGEgdG9wIGxldmVsIGNsYXNzIGRlY2xhcmF0aW9uIGJ5IGl0cyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIChjYXNlLXNlbnNpdGl2ZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiBnZXRDbGFzc0J5TmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKGNsYXNzTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiAhKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGUpLmlzSW50ZXJmYWNlKCkpLmZpbmRGaXJzdCgpLm1hcCh0IC0+IChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBnZXQgYSB0b3AgbGV2ZWwgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGJ5IGl0cyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSB0aGUgaW50ZXJmYWNlIG5hbWUgKGNhc2Utc2Vuc2l0aXZlKQorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+IGdldEludGVyZmFjZUJ5TmFtZShTdHJpbmcgaW50ZXJmYWNlTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWVBc1N0cmluZygpLmVxdWFscyhpbnRlcmZhY2VOYW1lKSAmJiB0eXBlIGluc3RhbmNlb2YgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uICYmICgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlKS5pc0ludGVyZmFjZSgpKS5maW5kRmlyc3QoKS5tYXAodCAtPiAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZ2V0IGEgdG9wIGxldmVsIGVudW0gZGVjbGFyYXRpb24gYnkgaXRzIG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnVtTmFtZSB0aGUgZW51bSBuYW1lIChjYXNlLXNlbnNpdGl2ZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8RW51bURlY2xhcmF0aW9uPiBnZXRFbnVtQnlOYW1lKFN0cmluZyBlbnVtTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWVBc1N0cmluZygpLmVxdWFscyhlbnVtTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikuZmluZEZpcnN0KCkubWFwKHQgLT4gKEVudW1EZWNsYXJhdGlvbikgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbmFtZSB0aGF0IHRoZSBwcmltYXJ5IHR5cGUgaW4gdGhpcyBmaWxlIHNob3VsZCBoYXZlLCBhY2NvcmRpbmcgdG8gdGhlIGZpbGVuYW1lIGluIHtAbGluayBTdG9yYWdlI2dldEZpbGVOYW1lKCl9LgorICAgICAqIEVtcHR5IGlmIG5vIGZpbGUgaW5mb3JtYXRpb24gaXMgcHJlc2VudCAod2hlbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2Fzbid0IHBhcnNlZCBmcm9tIGEgZmlsZS4pCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0UHJpbWFyeVR5cGVOYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0U3RvcmFnZSgpLm1hcChTdG9yYWdlOjpnZXRGaWxlTmFtZSkubWFwKFV0aWxzOjpyZW1vdmVGaWxlRXh0ZW5zaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIHdob3NlIG5hbWUgY29ycmVzcG9uZHMgdG8gdGhlIGZpbGUgbmFtZS4KKyAgICAgKiBFbXB0eSBpZiBubyBmaWxlIGluZm9ybWF0aW9uIGlzIHByZXNlbnQgKHdoZW4gdGhpcyBjb21waWxhdGlvbiB1bml0IHdhc24ndCBwYXJzZWQgZnJvbSBhIGZpbGUuKQorICAgICAqIElmIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uIHRoZXJlIGFyZSBtdWx0aXBsZSB0eXBlcyBvZiB0aGlzIG5hbWUsIHRoZSBmaXJzdCBvbmUgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbjw/Pj4gZ2V0UHJpbWFyeVR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRQcmltYXJ5VHlwZU5hbWUoKS5mbGF0TWFwKG5hbWUgLT4gZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodCAtPiB0LmdldE5hbWVBc1N0cmluZygpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBnZXQgYSB0b3AgbGV2ZWwgYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmF0aW9uIGJ5IGl0cyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIGFubm90YXRpb24gbmFtZSAoY2FzZS1zZW5zaXRpdmUpCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPEFubm90YXRpb25EZWNsYXJhdGlvbj4gZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWVBc1N0cmluZygpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIEFubm90YXRpb25EZWNsYXJhdGlvbikuZmluZEZpcnN0KCkubWFwKHQgLT4gKEFubm90YXRpb25EZWNsYXJhdGlvbikgdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGltcG9ydHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobW9kdWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IG1vZHVsZSkgeworICAgICAgICAgICAgICAgIHJlbW92ZU1vZHVsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwYWNrYWdlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gcGFja2FnZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlUGFja2FnZURlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHR5cGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdHlwZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IHJlbW92ZVBhY2thZ2VEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNldFBhY2thZ2VEZWNsYXJhdGlvbigoUGFja2FnZURlY2xhcmF0aW9uKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtb2R1bGUgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TW9kdWxlRGVjbGFyYXRpb24+IGdldE1vZHVsZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUobW9kdWxlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBzZXRNb2R1bGUoZmluYWwgTW9kdWxlRGVjbGFyYXRpb24gbW9kdWxlKSB7CisgICAgICAgIGlmIChtb2R1bGUgPT0gdGhpcy5tb2R1bGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ29tcGlsYXRpb25Vbml0KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5NT0RVTEUsIHRoaXMubW9kdWxlLCBtb2R1bGUpOworICAgICAgICBpZiAodGhpcy5tb2R1bGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubW9kdWxlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihtb2R1bGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgcmVtb3ZlTW9kdWxlKCkgeworICAgICAgICByZXR1cm4gc2V0TW9kdWxlKChNb2R1bGVEZWNsYXJhdGlvbikgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2FzIGxvYWRlZCBmcm9tLCBvciBlbXB0eSBpZiBpdCB3YXNuJ3QgbG9hZGVkIGZyb20gYSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxTdG9yYWdlPiBnZXRTdG9yYWdlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShzdG9yYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IHNldFN0b3JhZ2UoUGF0aCBwYXRoKSB7CisgICAgICAgIHRoaXMuc3RvcmFnZSA9IG5ldyBTdG9yYWdlKHRoaXMsIHBhdGgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2FzIGxvYWRlZCBmcm9tLgorICAgICAqIFRoaXMgY2xhc3Mgb25seSBzdG9yZXMgdGhlIGFic29sdXRlIGxvY2F0aW9uLgorICAgICAqIEZvciBtb3JlIGZsZXhpYmlsaXR5IHVzZSBTb3VyY2VSb290LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RvcmFnZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OworCisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0aCBwYXRoOworCisgICAgICAgIHByaXZhdGUgU3RvcmFnZShDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBQYXRoIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OworICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aC50b0Fic29sdXRlUGF0aCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBmb3IgdGhpcyBDb21waWxhdGlvblVuaXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQYXRoIGdldFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBDb21waWxhdGlvblVuaXQgdGhpcyBTdG9yYWdlIGlzIGFib3V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsYXRpb25Vbml0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSByb290IGRpcmVjdG9yeSwgY2FsY3VsYXRlZCBmcm9tIHRoZSBwYXRoIG9mIHRoaXMgY29tcGlhdGlvbiB1bml0LCBhbmQgdGhlIHBhY2thZ2UKKyAgICAgICAgICogZGVjbGFyYXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LiBJZiB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpcyBpbnZhbGlkICh3aGVuIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBlbmQKKyAgICAgICAgICogb2YgdGhlIHBhdGgpIGEgUnVudGltZUV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGF0aCBnZXRTb3VyY2VSb290KCkgeworICAgICAgICAgICAgZmluYWwgT3B0aW9uYWw8U3RyaW5nPiBwa2dBc1N0cmluZyA9IGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5tYXAoTm9kZVdpdGhOYW1lOjpnZXROYW1lQXNTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHBrZ0FzU3RyaW5nLm1hcChwIC0+IFBhdGhzLmdldChDb2RlR2VuZXJhdGlvblV0aWxzLnBhY2thZ2VUb1BhdGgocCkpKS5tYXAocGtnIC0+IHN1YnRyYWN0UGF0aHMoZ2V0RGlyZWN0b3J5KCksIHBrZykpLm9yRWxzZShnZXREaXJlY3RvcnkoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGguZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhdGggZ2V0RGlyZWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGguZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2F2ZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gaXRzIG9yaWdpbmFsIGxvY2F0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzYXZlKCkgeworICAgICAgICAgICAgc2F2ZShjdSAtPiBuZXcgUHJldHR5UHJpbnRlcigpLnByaW50KGN1KSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2F2ZXMgYSBjb21waWxhdGlvbiB1bml0IHRvIGl0cyBvcmlnaW5hbCBsb2NhdGlvbiB3aXRoIGZvcm1hdHRpbmcgYWNjb3JkaW5nIHRvIHRoZSBmdW5jdGlvbgorICAgICAgICAgKiBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtYWtlT3V0cHV0IGEgZnVuY3Rpb24gdGhhdCBmb3JtYXRzIHRoZSBjb21waWxhdGlvbiB1bml0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzYXZlKEZ1bmN0aW9uPENvbXBpbGF0aW9uVW5pdCwgU3RyaW5nPiBtYWtlT3V0cHV0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKHBhdGguZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb2RlID0gbWFrZU91dHB1dC5hcHBseShnZXRDb21waWxhdGlvblVuaXQoKSk7CisgICAgICAgICAgICAgICAgRmlsZXMud3JpdGUocGF0aCwgY29kZS5nZXRCeXRlcyhVVEY4KSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXBhcnNlKEphdmFQYXJzZXIgamF2YVBhcnNlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gamF2YVBhcnNlci5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGdldFBhdGgoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQ29tcGlsYXRpb25Vbml0KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5jb21waWxhdGlvblVuaXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGltcG9ydHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRzLnNldChpLCAoSW1wb3J0RGVjbGFyYXRpb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBtb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBzZXRNb2R1bGUoKE1vZHVsZURlY2xhcmF0aW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwYWNrYWdlRGVjbGFyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gcGFja2FnZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgc2V0UGFja2FnZURlY2xhcmF0aW9uKChQYWNrYWdlRGVjbGFyYXRpb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHR5cGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdHlwZXMuc2V0KGksIChUeXBlRGVjbGFyYXRpb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0RhdGFLZXkuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvRGF0YUtleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjExNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0RhdGFLZXkuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCisvKioKKyAqIEEga2V5IHRvIGEgcGllY2Ugb2YgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgTm9kZX0gYXQgcnVudGltZS4KKyAqIFRoZSBrZXkgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZQorICogdHlwZSBvZiBhbnkgdXNlciBkYXRhIHZhbHVlIGZvciB0aGUga2V5IHdoZW4gdGhlIHZhbHVlIGlzIHNldC4gRGF0YUtleSBpcyBhYnN0cmFjdCBpbiBvcmRlciB0bworICogZm9yY2UgdGhlIGNyZWF0aW9uIG9mIGEgc3VidHlwZS4gVGhhdCBzdWJ0eXBlIGlzIHVzZWQgdG8gdGVzdCBmb3IgaWRlbnRpdHkgd2hlbiBsb29raW5nIGZvciB0aGUKKyAqIHVzZXIgZGF0YSBiZWNhdXNlIGFjdHVhbCBvYmplY3QgaWRlbnRpdHkgd291bGQgc3VmZmVyIGZyb20gcHJvYmxlbXMgdW5kZXIgc2VyaWFsaXphdGlvbi4KKyAqIFNvLCB0aGUgY29ycmVjdCB3YXkgdG8gZGVjbGFyZSBhIERhdGFLZXkgaXMgbGlrZSB0aGlzOgorICogPHA+CisgKiA8cHJlPgorICogPGNvZGU+CisgKiBwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFLZXkmbHQ7Um9sZSZndDsgUk9MRSA9IG5ldyBEYXRhS2V5Jmx0O1JvbGUmZ3Q7KCkgeyB9OworICogPC9jb2RlPgorICogPC9wcmU+CisgKiA8cD4KKyAqIFRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3dpY2tldC5hcGFjaGUub3JnLyI+V2lja2V0IHByb2plY3Q8L2E+LgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCB3aGljaCBpcyBzdG9yZWQKKyAqIEBzZWUgTm9kZSNnZXREYXRhKERhdGFLZXkpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhS2V5PFQ+IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvSW1wb3J0RGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvSW1wb3J0RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGFiMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9JbXBvcnREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworCisvKioKKyAqIEFuIGltcG9ydCBkZWNsYXJhdGlvbi4KKyAqIDxici8+PGNvZGU+aW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOzwvY29kZT4KKyAqIDxici8+PGNvZGU+aW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci4qOzwvY29kZT4KKyAqIDxici8+PGNvZGU+aW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7IDwvY29kZT4KKyAqIDxici8+PGNvZGU+aW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci4qOzwvY29kZT4KKyAqIDxici8+PGNvZGU+aW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZTs8L2NvZGU+CisgKgorICogPHA+VGhlIG5hbWUgZG9lcyBub3QgaW5jbHVkZSB0aGUgYXN0ZXJpc2sgb3IgdGhlIHN0YXRpYyBrZXl3b3JkLjwvcD4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0RGVjbGFyYXRpb24gZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhOYW1lPEltcG9ydERlY2xhcmF0aW9uPiB7CisKKyAgICBwcml2YXRlIE5hbWUgbmFtZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0YXRpYzsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0FzdGVyaXNrOworCisgICAgcHJpdmF0ZSBJbXBvcnREZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZSgpLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc1N0YXRpYywgYm9vbGVhbiBpc0FzdGVyaXNrKSB7CisgICAgICAgIHRoaXMobnVsbCwgcGFyc2VOYW1lKG5hbWUpLCBpc1N0YXRpYywgaXNBc3Rlcmlzayk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEltcG9ydERlY2xhcmF0aW9uKE5hbWUgbmFtZSwgYm9vbGVhbiBpc1N0YXRpYywgYm9vbGVhbiBpc0FzdGVyaXNrKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmFtZSwgaXNTdGF0aWMsIGlzQXN0ZXJpc2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOYW1lIG5hbWUsIGJvb2xlYW4gaXNTdGF0aWMsIGJvb2xlYW4gaXNBc3RlcmlzaykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0U3RhdGljKGlzU3RhdGljKTsKKyAgICAgICAgc2V0QXN0ZXJpc2soaXNBc3Rlcmlzayk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIGltcG9ydCAoLiogaXMgbm90IGluY2x1ZGVkLikKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoZSBpbXBvcnQgZW5kcyB3aXRoICIqIi4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3RlcmlzaygpIHsKKyAgICAgICAgcmV0dXJuIGlzQXN0ZXJpc2s7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gaXNTdGF0aWM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBzZXRBc3RlcmlzayhmaW5hbCBib29sZWFuIGlzQXN0ZXJpc2spIHsKKyAgICAgICAgaWYgKGlzQXN0ZXJpc2sgPT0gdGhpcy5pc0FzdGVyaXNrKSB7CisgICAgICAgICAgICByZXR1cm4gKEltcG9ydERlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5BU1RFUklTSywgdGhpcy5pc0FzdGVyaXNrLCBpc0FzdGVyaXNrKTsKKyAgICAgICAgdGhpcy5pc0FzdGVyaXNrID0gaXNBc3RlcmlzazsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBzZXROYW1lKGZpbmFsIE5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoSW1wb3J0RGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBzZXRTdGF0aWMoZmluYWwgYm9vbGVhbiBpc1N0YXRpYykgeworICAgICAgICBpZiAoaXNTdGF0aWMgPT0gdGhpcy5pc1N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIChJbXBvcnREZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuU1RBVElDLCB0aGlzLmlzU3RhdGljLCBpc1N0YXRpYyk7CisgICAgICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChJbXBvcnREZWNsYXJhdGlvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5pbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Nb2RpZmllci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Nb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDAzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L01vZGlmaWVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7DQorDQorLyoqDQorICogT25lIG9mIHRoZSBtb2RpZmllcnMga25vd24gaW4gSmF2YS4NCisgKi8NCitwdWJsaWMgZW51bSBNb2RpZmllciB7DQorICAgIFBVQkxJQywNCisgICAgUFJPVEVDVEVELA0KKyAgICBQUklWQVRFLA0KKyAgICBBQlNUUkFDVCwNCisgICAgU1RBVElDLA0KKyAgICBGSU5BTCwNCisgICAgVFJBTlNJRU5ULA0KKyAgICBWT0xBVElMRSwNCisgICAgU1lOQ0hST05JWkVELA0KKyAgICBOQVRJVkUsDQorICAgIFNUUklDVEZQLA0KKyAgICBUUkFOU0lUSVZFLA0KKyAgICBERUZBVUxUOw0KKw0KKyAgICBmaW5hbCBTdHJpbmcgY29kZVJlcHJlc2VudGF0aW9uOw0KKw0KKyAgICBNb2RpZmllcigpIHsNCisgICAgICAgIHRoaXMuY29kZVJlcHJlc2VudGF0aW9uID0gbmFtZSgpLnRvTG93ZXJDYXNlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gdGhlIGtleXdvcmQgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2RpZmllci4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7DQorICAgICAgICByZXR1cm4gY29kZVJlcHJlc2VudGF0aW9uOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFbnVtU2V0PE1vZGlmaWVyPiB0b0VudW1TZXQoKSB7DQorICAgICAgICByZXR1cm4gRW51bVNldC5vZih0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc1NwZWNpZmllciBnZXRBY2Nlc3NTcGVjaWZpZXIoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7DQorICAgICAgICBpZiAobW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykpIHsNCisgICAgICAgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLlBVQkxJQzsNCisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBST1RFQ1RFRCkpIHsNCisgICAgICAgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLlBST1RFQ1RFRDsNCisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBSSVZBVEUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUklWQVRFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLkRFRkFVTFQ7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQwYmJjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlLmphdmEKQEAgLTAsMCArMSwxMDA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVG9rZW5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLkFzdE9ic2VydmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuUHJvcGFnYXRpbmdBc3RPYnNlcnZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5IYXNoQ29kZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuUHJldHR5UHJpbnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5QcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5TeW1ib2xSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuUGFyc2VkbmVzcy5QQVJTRUQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5UcmVlVHJhdmVyc2FsLlBSRU9SREVSOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLlNwbGl0ZXJhdG9yLkRJU1RJTkNUOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuU3BsaXRlcmF0b3IuTk9OTlVMTDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Ob2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgbm9kZXMgb2YgdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlLgorICogPGgyPkNvbnN0cnVjdGlvbjwvaDI+CisgKiA8cD5UaGUgdHJlZSBpcyBidWlsdCBieSBpbnN0YW50aWF0aW5nIHRoZSByZXF1aXJlZCBub2RlcywgdGhlbiBhZGRpbmcgdGhlbSB0byBvdGhlciBub2Rlcy4KKyAqIElmIGl0IGlzIHRoZSBwYXJzZXIgd2hvIGlzIGJ1aWxkaW5nIHRoZSB0cmVlLCBpdCB3aWxsIHVzZSB0aGUgbGFyZ2VzdCBjb25zdHJ1Y3RvciwKKyAqIHRoZSBvbmUgd2l0aCAicmFuZ2UiIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCisgKiBJZiB5b3Ugd2FudCB0byBtYW51YWxseSBpbnN0YW50aWF0ZSBub2Rlcywgd2Ugc3VnZ2VzdCB0by4uLgorICogPHVsPgorICogPGxpPnVzZSBhIGNvbnZlbmllbmNlIG1ldGhvZCwgbGlrZSAiYWRkU3RhdGVtZW50KC4uLikiLCBvciBpZiBub25lIGFyZSBhdmFpbGFibGUuLi48L2xpPgorICogPGxpPnVzZSBhIGNvbnZlbmllbnQgY29uc3RydWN0b3IsIGxpa2UgQ2xhc3NPckludGVyZmFjZVR5cGUoU3RyaW5nIG5hbWUpLCBvciBpZiBub25lIGFyZSBhdmFpbGFibGUuLi48L2xpPgorICogPGxpPnVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci48L2xpPgorICogPGxpPkFsdGVybmF0aXZlbHksIHVzZSBvbmUgb2YgdGhlIEphdmFQYXJzZXIucGFyc2Uoc25pcHBldCkgbWV0aG9kcy48L2xpPgorICogPC91bD4KKyAqIC4uLiBhbmQgdXNlIHRoZSB2YXJpb3VzIG1ldGhvZHMgb24gdGhlIG5vZGUgdG8gaW5pdGlhbGl6ZSBpdCBmdXJ0aGVyLCBpZiBuZWVkZWQuCisgKiA8aDI+UGFyZW50L2NoaWxkPC9oMj4KKyAqIDxwPlRoZSBwYXJlbnQgbm9kZSBmaWVsZCBpcyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgYW5kIGNhbiBiZSBzZWVuIGFzIHJlYWQgb25seS4KKyAqIE5vdGUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBwYXJlbnQsCisgKiBhbmQgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZSBub2RlIGluIHR3byBwbGFjZXMgd2lsbCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3VyLgorICogSXQgaXMgYWR2aXNlZCB0byBjbG9uZSgpIGEgbm9kZSBiZWZvcmUgbW92aW5nIGl0IGFyb3VuZC4KKyAqIDxoMj5Db21tZW50czwvaDI+CisgKiA8cD5FYWNoIE5vZGUgY2FuIGhhdmUgb25lIGFzc29jaWF0ZWQgY29tbWVudCB3aGljaCBkZXNjcmliZXMgaXQgYW5kCisgKiBhIG51bWJlciBvZiAib3JwaGFuIGNvbW1lbnRzIiB3aGljaCBpdCBjb250YWlucyBidXQgYXJlIG5vdCBzcGVjaWZpY2FsbHkKKyAqIGFzc29jaWF0ZWQgdG8gYW55IGNoaWxkLgorICogPGgyPlBvc2l0aW9uczwvaDI+CisgKiA8cD5XaGVuIHRoZSBwYXJzZXIgY3JlYXRlcyBub2RlcywgaXQgc2V0cyB0aGVpciBzb3VyY2UgY29kZSBwb3NpdGlvbiBpbiB0aGUgInJhbmdlIiBmaWVsZC4KKyAqIFdoZW4geW91IG1hbnVhbGx5IGluc3RhbnRpYXRlIG5vZGVzLCB0aGVpciByYW5nZSBpcyBub3Qgc2V0LgorICogVGhlIHRvcCBsZWZ0IGNoYXJhY3RlciBpcyBwb3NpdGlvbiAxLCAxLgorICogTm90ZSB0aGF0IHNpbmNlIHRoaXMgaXMgYW4gPGk+YWJzdHJhY3Q8L2k+IHN5bnRheCB0cmVlLAorICogaXQgbGVhdmVzIG91dCBhIGxvdCBvZiB0ZXh0IGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLAorICogbGlrZSB3aGVyZSBicmFjZXMgb3IgY29tbWEncyBhcmUgZXhhY3RseS4KKyAqIFRoZXJlZm9yZSB0aGVyZSBpcyBubyBwb3NpdGlvbiBpbmZvcm1hdGlvbiBvbiBldmVyeXRoaW5nIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4KKyAqIDxoMj5PYnNlcnZlcnM8L2gyPgorICogPHA+SXQgaXMgcG9zc2libGUgdG8gYWRkIG9ic2VydmVycyB0byB0aGUgdGhlIHRyZWUuCisgKiBBbnkgY2hhbmdlIGluIHRoZSB0cmVlIGlzIHNlbnQgYXMgYW4gZXZlbnQgdG8gYW55IG9ic2VydmVycyB3YXRjaGluZy4KKyAqIDxoMj5WaXNpdG9yczwvaDI+CisgKiA8cD5UaGUgbW9zdCBjb21mb3J0YWJsZSB3YXkgb2Ygd29ya2luZyB3aXRoIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGlzIHVzaW5nIHZpc2l0b3JzLgorICogWW91IGNhbiB1c2Ugb25lIG9mIHRoZSB2aXNpdG9ycyBpbiB0aGUgdmlzaXRvciBwYWNrYWdlLCBvciBleHRlbmQgb25lIG9mIHRoZW0uCisgKiBBIHZpc2l0b3IgY2FuIGJlICJydW4iIGJ5IGNhbGxpbmcgYWNjZXB0IG9uIGEgbm9kZToKKyAqIDxwcmU+bm9kZS5hY2NlcHQodmlzaXRvciwgYXJndW1lbnQpOzwvcHJlPgorICogd2hlcmUgYXJndW1lbnQgaXMgYW4gb2JqZWN0IG9mIHlvdXIgY2hvaWNlIChvZnRlbiBzaW1wbHkgbnVsbC4pCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBIYXNQYXJlbnROb2RlPE5vZGU+LCBWaXNpdGFibGUsIE5vZGVXaXRoUmFuZ2U8Tm9kZT4sIE5vZGVXaXRoVG9rZW5SYW5nZTxOb2RlPiB7CisKKyAgICAvKioKKyAgICAgKiBEaWZmZXJlbnQgcmVnaXN0cmF0aW9uIG1vZGUgZm9yIG9ic2VydmVycyBvbiBub2Rlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBPYnNlcnZlclJlZ2lzdHJhdGlvbk1vZGUgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZnkgZXhjbHVzaXZlbHkgZm9yIGNoYW5nZXMgaGFwcGVuaW5nIG9uIHRoaXMgbm9kZSBhbG9uZS4KKyAgICAgICAgICovCisgICAgICAgIEpVU1RfVEhJU19OT0RFLAorICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZ5IGZvciBjaGFuZ2VzIGhhcHBlbmluZyBvbiB0aGlzIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgZXhpc3RpbmcgYXQgdGhlIG1vbWVudCBpbgorICAgICAgICAgKiB3aGljaCB0aGUgb2JzZXJ2ZXIgd2FzIHJlZ2lzdGVyZWQuIE5vZGVzIGF0dGFjaGVkIGxhdGVyIHdpbGwgbm90IGJlIG9ic2VydmVkLgorICAgICAgICAgKi8KKyAgICAgICAgVEhJU19OT0RFX0FORF9FWElTVElOR19ERVNDRU5EQU5UUywKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdGlmeSBmb3IgY2hhbmdlcyBoYXBwZW5pbmcgb24gdGhpcyBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzLiBUaGUgZGVzY2VuZGFudHMgZXhpc3RpbmcgYXQgdGhlIG1vbWVudCBpbgorICAgICAgICAgKiB3aGljaCB0aGUgb2JzZXJ2ZXIgd2FzIHJlZ2lzdGVyZWQgd2lsbCBiZSBvYnNlcnZlZCBpbW1lZGlhdGVseS4gQXMgbmV3IG5vZGVzIGFyZSBhdHRhY2hlZCBsYXRlciB0aGV5IGFyZQorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgdG8gYmUgb2JzZXJ2ZWQuCisgICAgICAgICAqLworICAgICAgICBTRUxGX1BST1BBR0FUSU5HCisgICAgfQorCisgICAgcHVibGljIGVudW0gUGFyc2VkbmVzcyB7CisKKyAgICAgICAgUEFSU0VELCBVTlBBUlNBQkxFCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBzb3J0IG5vZGVzIG9uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvcjxOb2RlV2l0aFJhbmdlPD8+PiBOT0RFX0JZX0JFR0lOX1BPU0lUSU9OID0gKGEsIGIpIC0+IHsKKyAgICAgICAgaWYgKGEuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSAmJiBiLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBhLmdldFJhbmdlKCkuZ2V0KCkuYmVnaW4uY29tcGFyZVRvKGIuZ2V0UmFuZ2UoKS5nZXQoKS5iZWdpbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSB8fCBiLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChhLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJldHR5UHJpbnRlciB0b1N0cmluZ1ByaW50ZXIgPSBuZXcgUHJldHR5UHJpbnRlcihuZXcgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24oKSk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHByZXR0eVByaW50ZXJOb0NvbW1lbnRzQ29uZmlndXJhdGlvbiA9IG5ldyBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbigpLnNldFByaW50Q29tbWVudHMoZmFsc2UpOworCisgICAgQEludGVybmFsUHJvcGVydHkKKyAgICBwcml2YXRlIFJhbmdlIHJhbmdlOworCisgICAgQEludGVybmFsUHJvcGVydHkKKyAgICBwcml2YXRlIFRva2VuUmFuZ2UgdG9rZW5SYW5nZTsKKworICAgIEBJbnRlcm5hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBOb2RlIHBhcmVudE5vZGU7CisKKyAgICBASW50ZXJuYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgTGlzdDxOb2RlPiBjaGlsZE5vZGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgQEludGVybmFsUHJvcGVydHkKKyAgICBwcml2YXRlIExpc3Q8Q29tbWVudD4gb3JwaGFuQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBASW50ZXJuYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgSWRlbnRpdHlIYXNoTWFwPERhdGFLZXk8Pz4sIE9iamVjdD4gZGF0YSA9IG51bGw7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgQ29tbWVudCBjb21tZW50OworCisgICAgQEludGVybmFsUHJvcGVydHkKKyAgICBwcml2YXRlIExpc3Q8QXN0T2JzZXJ2ZXI+IG9ic2VydmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQEludGVybmFsUHJvcGVydHkKKyAgICBwcml2YXRlIFBhcnNlZG5lc3MgcGFyc2VkID0gUEFSU0VEOworCisgICAgcHJvdGVjdGVkIE5vZGUoVG9rZW5SYW5nZSB0b2tlblJhbmdlKSB7CisgICAgICAgIHNldFRva2VuUmFuZ2UodG9rZW5SYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGluIGV2ZXJ5IGNvbnN0cnVjdG9yIGZvciBub2RlIHNwZWNpZmljIGNvZGUuCisgICAgICogSXQgY2FuJ3QgYmUgd3JpdHRlbiBpbiB0aGUgY29uc3RydWN0b3IgaXRzZWxmIGJlY2F1c2UgaXQgd2lsbAorICAgICAqIGJlIG92ZXJ3cml0dGVuIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3VzdG9tSW5pdGlhbGl6YXRpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tbWVudCBwcm9wZXJ0eQorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q29tbWVudD4gZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoY29tbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgc291cmNlIGNvZGUgdGhhdCB0aGlzIG5vZGUgY292ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxSYW5nZT4gZ2V0UmFuZ2UoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByYW5nZSBvZiB0b2tlbnMgdGhhdCB0aGlzIG5vZGUgY292ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxUb2tlblJhbmdlPiBnZXRUb2tlblJhbmdlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSh0b2tlblJhbmdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZSBzZXRUb2tlblJhbmdlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSkgeworICAgICAgICB0aGlzLnRva2VuUmFuZ2UgPSB0b2tlblJhbmdlOworICAgICAgICBpZiAodG9rZW5SYW5nZSA9PSBudWxsIHx8ICEodG9rZW5SYW5nZS5nZXRCZWdpbigpLmdldFJhbmdlKCkuaXNQcmVzZW50KCkgJiYgdG9rZW5SYW5nZS5nZXRCZWdpbigpLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpKSB7CisgICAgICAgICAgICByYW5nZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZSh0b2tlblJhbmdlLmdldEJlZ2luKCkuZ2V0UmFuZ2UoKS5nZXQoKS5iZWdpbiwgdG9rZW5SYW5nZS5nZXRFbmQoKS5nZXRSYW5nZSgpLmdldCgpLmVuZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZSBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzb3VyY2UgY29kZSB0aGF0IHRoaXMgbm9kZSBjb3ZlcnMuIG51bGwgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdAorICAgICAqIG5vIHJhbmdlIGluZm9ybWF0aW9uIGlzIGtub3duLCBvciB0aGF0IGl0IGlzIG5vdCBvZiBpbnRlcmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZSBzZXRSYW5nZShSYW5nZSByYW5nZSkgeworICAgICAgICBpZiAodGhpcy5yYW5nZSA9PSByYW5nZSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlJBTkdFLCB0aGlzLnJhbmdlLCByYW5nZSk7CisgICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTm9kZSBzZXRDb21tZW50KGZpbmFsIENvbW1lbnQgY29tbWVudCkgeworICAgICAgICBpZiAodGhpcy5jb21tZW50ID09IGNvbW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwgJiYgKHRoaXMgaW5zdGFuY2VvZiBDb21tZW50KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkEgY29tbWVudCBjYW4gbm90IGJlIGNvbW1lbnRlZCIpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5DT01NRU5ULCB0aGlzLmNvbW1lbnQsIGNvbW1lbnQpOworICAgICAgICBpZiAodGhpcy5jb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudC5zZXRDb21tZW50ZWROb2RlKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudC5zZXRDb21tZW50ZWROb2RlKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIGZpbmFsIE5vZGUgc2V0TGluZUNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHNldENvbW1lbnQobmV3IExpbmVDb21tZW50KGNvbW1lbnQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyB0byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tZW50IHRvIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBOb2RlIHNldEJsb2NrQ29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICByZXR1cm4gc2V0Q29tbWVudChuZXcgQmxvY2tDb21tZW50KGNvbW1lbnQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nUHJpbnRlci5wcmludCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJldHR5UHJpbnRlcihwcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbikucHJpbnQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIEhhc2hDb2RlVmlzaXRvci5oYXNoQ29kZSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBOb2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBFcXVhbHNWaXNpdG9yLmVxdWFscyh0aGlzLCAoTm9kZSkgb2JqKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8Tm9kZT4gZ2V0UGFyZW50Tm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUocGFyZW50Tm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgYWxsIG5vZGVzIHRoYXQgaGF2ZSB0aGlzIG5vZGUgc2V0IGFzIHRoZWlyIHBhcmVudC4KKyAgICAgKiBZb3UgY2FuIGFkZCBhbmQgcmVtb3ZlIG5vZGVzIGZyb20gdGhpcyBsaXN0IGJ5IGFkZGluZyBvciByZW1vdmluZyBub2RlcyBmcm9tIHRoZSBmaWVsZHMgb2YgdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBhbGwgbm9kZXMgdGhhdCBoYXZlIHRoaXMgbm9kZSBhcyB0aGVpciBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIExpc3Q8Tm9kZT4gZ2V0Q2hpbGROb2RlcygpIHsKKyAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZUxpc3QoY2hpbGROb2Rlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT3JwaGFuQ29tbWVudChDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgb3JwaGFuQ29tbWVudHMuYWRkKGNvbW1lbnQpOworICAgICAgICBjb21tZW50LnNldFBhcmVudE5vZGUodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlT3JwaGFuQ29tbWVudChDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gb3JwaGFuQ29tbWVudHMucmVtb3ZlKGNvbW1lbnQpOworICAgICAgICBpZiAocmVtb3ZlZCkgeworICAgICAgICAgICAgY29tbWVudC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBsaXN0IG9mIENvbW1lbnQgd2hpY2ggYXJlIGluc2lkZSB0aGUgbm9kZSBhbmQgYXJlIG5vdCBhc3NvY2lhdGVkCisgICAgICogd2l0aCBhbnkgbWVhbmluZ2Z1bCBBU1QgTm9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgY29tbWVudHMgYXQgdGhlIGVuZCBvZiBtZXRob2RzIChpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHBhcmVudGhlc2lzKQorICAgICAqIG9yIGF0IHRoZSBlbmQgb2YgQ29tcGlsYXRpb25Vbml0IGFyZSBvcnBoYW4gY29tbWVudHMuCisgICAgICogPHA+CisgICAgICogV2hlbiBtb3JlIHRoYW4gb25lIGNvbW1lbnQgcHJlY2VlZHMgYSBzdGF0ZW1lbnQsIHRoZSBvbmUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGl0CisgICAgICogaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZW1lbnRzLCB3aGlsZSB0aGUgb3RoZXJzIGFyZSBvcnBoYW5zLgorICAgICAqIDxwPgorICAgICAqIENoYW5nZXMgdG8gdGhpcyBsaXN0IGFyZSBub3QgcGVyc2lzdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbGwgY29tbWVudHMgdGhhdCBjYW5ub3QgYmUgYXR0cmlidXRlZCB0byBhIGNvbmNlcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxDb21tZW50PiBnZXRPcnBoYW5Db21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRMaXN0PD4ob3JwaGFuQ29tbWVudHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGxpc3Qgb2YgQ29tbWVudCB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoZSBOb2RlIGVpdGhlciBiZWNhdXNlCisgICAgICogdGhleSBhcmUgcHJvcGVybHkgYXNzb2NpYXRlZCB0byBvbmUgb2YgaXRzIGNoaWxkcmVuIG9yIGJlY2F1c2UgdGhleSBhcmUgZmxvYXRpbmcKKyAgICAgKiBhcm91bmQgaW5zaWRlIHRoZSBOb2RlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCBDb21tZW50cyB3aXRoaW4gdGhlIG5vZGUgYXMgYSBsaXN0CisgICAgICovCisgICAgcHVibGljIExpc3Q8Q29tbWVudD4gZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKSB7CisgICAgICAgIExpc3Q8Q29tbWVudD4gY29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGNvbW1lbnRzLmFkZEFsbChnZXRPcnBoYW5Db21tZW50cygpKTsKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogZ2V0Q2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICBjaGlsZC5nZXRDb21tZW50KCkuaWZQcmVzZW50KGNvbW1lbnRzOjphZGQpOworICAgICAgICAgICAgY29tbWVudHMuYWRkQWxsKGNoaWxkLmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYSBuZXcgcGFyZW50IHRvIHRoaXMgbm9kZSwgcmVtb3ZpbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSBwcmV2aW91cyBwYXJlbnQsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdQYXJlbnROb2RlIG5vZGUgdG8gYmUgc2V0IGFzIHBhcmVudAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOb2RlIHNldFBhcmVudE5vZGUoTm9kZSBuZXdQYXJlbnROb2RlKSB7CisgICAgICAgIGlmIChuZXdQYXJlbnROb2RlID09IHBhcmVudE5vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKG8gLT4gby5wYXJlbnRDaGFuZ2UodGhpcywgcGFyZW50Tm9kZSwgbmV3UGFyZW50Tm9kZSkpOworICAgICAgICAvLyByZW1vdmUgZnJvbSBvbGQgcGFyZW50LCBpZiBhbnkKKyAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxOb2RlPiBwYXJlbnRDaGlsZE5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRDaGlsZE5vZGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudENoaWxkTm9kZXMuZ2V0KGkpID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2hpbGROb2Rlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBhcmVudE5vZGUgPSBuZXdQYXJlbnROb2RlOworICAgICAgICAvLyBhZGQgdG8gbmV3IHBhcmVudCwgaWYgYW55CisgICAgICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGROb2Rlcy5hZGQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QXNQYXJlbnROb2RlT2YoTm9kZSBjaGlsZE5vZGUpIHsKKyAgICAgICAgaWYgKGNoaWxkTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGlsZE5vZGUuc2V0UGFyZW50Tm9kZShnZXRQYXJlbnROb2RlRm9yQ2hpbGRyZW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNPTFVURV9CRUdJTl9MSU5FID0gLTE7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNPTFVURV9FTkRfTElORSA9IC0yOworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGdldENvbW1lbnQoKS5pc1ByZXNlbnQoKQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChDbGFzczw/PiBjbGF6eikgeworICAgICAgICBnZXRBbmNlc3Rvck9mVHlwZShDb21waWxhdGlvblVuaXQuY2xhc3MpLmlmUHJlc2VudChwIC0+IHAuYWRkSW1wb3J0KGNsYXp6KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlbHkgZmluZHMgYWxsIG5vZGVzIG9mIGEgY2VydGFpbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSB0eXBlIG9mIG5vZGUgdG8gZmluZC4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZmluZChDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgPE4gZXh0ZW5kcyBOb2RlPiBMaXN0PE4+IGdldENoaWxkTm9kZXNCeVR5cGUoQ2xhc3M8Tj4gY2xhenopIHsKKyAgICAgICAgTGlzdDxOPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBnZXRDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGF6ei5pc0luc3RhbmNlKGNoaWxkKSkgeworICAgICAgICAgICAgICAgIG5vZGVzLmFkZChjbGF6ei5jYXN0KGNoaWxkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2Rlcy5hZGRBbGwoY2hpbGQuZ2V0Q2hpbGROb2Rlc0J5VHlwZShjbGF6eikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZmluZEFsbChDbGFzcykKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyA8TiBleHRlbmRzIE5vZGU+IExpc3Q8Tj4gZ2V0Tm9kZXNCeVR5cGUoQ2xhc3M8Tj4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkTm9kZXNCeVR5cGUoY2xhenopOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgZGF0YSBmb3IgdGhpcyBub2RlIHVzaW5nIHRoZSBnaXZlbiBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPE0+IFRoZSB0eXBlIG9mIHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIG9yIG51bGwgb2Ygbm8gZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBAc2VlIERhdGFLZXkKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPE0+IE0gZ2V0RGF0YShmaW5hbCBEYXRhS2V5PE0+IGtleSkgeworICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE0pIGRhdGEuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkYXRhIGZvciB0aGlzIG5vZGUgdXNpbmcgdGhlIGdpdmVuIGtleS4KKyAgICAgKiBGb3IgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgRGF0YUtleSwgc2VlIHtAbGluayBEYXRhS2V5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8TT4gVGhlIHR5cGUgb2YgZGF0YQorICAgICAqIEBwYXJhbSBrZXkgVGhlIHNpbmdsZXRvbiBrZXkgZm9yIHRoZSBkYXRhCisgICAgICogQHBhcmFtIG9iamVjdCBUaGUgZGF0YSBvYmplY3QKKyAgICAgKiBAc2VlIERhdGFLZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgPE0+IHZvaWQgc2V0RGF0YShEYXRhS2V5PE0+IGtleSwgTSBvYmplY3QpIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YSA9IG5ldyBJZGVudGl0eUhhc2hNYXA8PigpOworICAgICAgICB9CisgICAgICAgIGRhdGEucHV0KGtleSwgb2JqZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGRvZXMgdGhpcyBub2RlIGhhdmUgZGF0YSBmb3IgdGhpcyBrZXk/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNEYXRhKERhdGFLZXk8Pz4ga2V5KSB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YS5nZXQoa2V5KSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byByZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIHBhcmVudAorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHJlbW92ZWQsIGZhbHNlIGlmIGl0IGlzIGEgcmVxdWlyZWQgcHJvcGVydHkgb2YgdGhlIHBhcmVudCwgb3IgaWYgdGhlIHBhcmVudCBpc24ndCBzZXQuCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzIGluIGFuIHVuZXhwZWN0ZWQgd2F5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKCkgeworICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmVudE5vZGUucmVtb3ZlKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byByZXBsYWNlIHRoaXMgbm9kZSBpbiB0aGUgcGFyZW50IHdpdGggdGhlIHN1cHBsaWVkIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhcmVudCBpc24ndCBzZXQuCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzIGluIGFuIHVuZXhwZWN0ZWQgd2F5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJlbnROb2RlLnJlcGxhY2UodGhpcywgbm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2libHkgcmVtb3ZlcyB0aGlzIG5vZGUgZnJvbSB0aGUgQVNULgorICAgICAqIElmIGl0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20gdGhlIHBhcmVudCB3aXRoIHJlbW92ZSgpLAorICAgICAqIGl0IHdpbGwgdHJ5IHRvIHJlbW92ZSBpdHMgcGFyZW50IGluc3RlYWQsCisgICAgICogdW50aWwgaXQgZmluZHMgYSBub2RlIHRoYXQgY2FuIGJlIHJlbW92ZWQsCisgICAgICogb3Igbm8gcGFyZW50IGNhbiBiZSBmb3VuZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTaW5jZSBldmVyeXRoaW5nIGF0IENvbXBpbGF0aW9uVW5pdCBsZXZlbCBpcyByZW1vdmFibGUsCisgICAgICogdGhpcyBtZXRob2Qgd2lsbCBvbmx5IChzaWxlbnRseSkgZmFpbCB3aGVuIHRoZSBub2RlIGlzIGluIGEgZGV0YWNoZWQgQVNUIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZvcmNlZCgpIHsKKyAgICAgICAgaWYgKCFyZW1vdmUoKSkgeworICAgICAgICAgICAgZ2V0UGFyZW50Tm9kZSgpLmlmUHJlc2VudChOb2RlOjpyZW1vdmUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZUZvckNoaWxkcmVuKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBc1BhcmVudE5vZGVPZihOb2RlTGlzdDw/IGV4dGVuZHMgTm9kZT4gbGlzdCkgeworICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0LnNldFBhcmVudE5vZGUoZ2V0UGFyZW50Tm9kZUZvckNoaWxkcmVuKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIDxQPiB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgUCBvbGRWYWx1ZSwgUCBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLm9ic2VydmVycy5mb3JFYWNoKG8gLT4gby5wcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcihBc3RPYnNlcnZlciBvYnNlcnZlcikgeworICAgICAgICB0aGlzLm9ic2VydmVycy5yZW1vdmUob2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEFzdE9ic2VydmVyIG9ic2VydmVyKSB7CisgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBuZXcgb2JzZXJ2ZXIgZm9yIHRoZSBnaXZlbiBub2RlLiBEZXBlbmRpbmcgb24gdGhlIG1vZGUgc3BlY2lmaWVkIGFsc28gZGVzY2VuZGFudHMsIGV4aXN0aW5nCisgICAgICogYW5kIG5ldywgY291bGQgYmUgb2JzZXJ2ZWQuIEZvciBtb3JlIGRldGFpbHMgc2VlIDxpPk9ic2VydmVyUmVnaXN0cmF0aW9uTW9kZTwvaT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIsIE9ic2VydmVyUmVnaXN0cmF0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZGUgc2hvdWxkIGJlIG5vdCBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSlVTVF9USElTX05PREU6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIob2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUSElTX05PREVfQU5EX0VYSVNUSU5HX0RFU0NFTkRBTlRTOgorICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yU3VidHJlZShvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFTEZfUFJPUEFHQVRJTkc6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JTdWJ0cmVlKFByb3BhZ2F0aW5nQXN0T2JzZXJ2ZXIudHJhbnNmb3JtSW5Qcm9wYWdhdGluZ09ic2VydmVyKG9ic2VydmVyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQ6ICIgKyBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBvYnNlcnZlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIHRoZSBjb250YWluZWQgbm9kZSBhbmQgbm9kZWxpc3RzLCByZWN1cnNpdmVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclN1YnRyZWUoQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKKyAgICAgICAgcmVnaXN0ZXIob2JzZXJ2ZXIpOworICAgICAgICB0aGlzLmdldENoaWxkTm9kZXMoKS5mb3JFYWNoKGMgLT4gYy5yZWdpc3RlckZvclN1YnRyZWUob2JzZXJ2ZXIpKTsKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBwcm9wZXJ0eSA6IGdldE1ldGFNb2RlbCgpLmdldEFsbFByb3BlcnR5TWV0YU1vZGVscygpKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuaXNOb2RlTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgTm9kZUxpc3Q8Pz4gbm9kZUxpc3QgPSAoTm9kZUxpc3Q8Pz4pIHByb3BlcnR5LmdldFZhbHVlKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChub2RlTGlzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBub2RlTGlzdC5yZWdpc3RlcihvYnNlcnZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmNvbnRhaW5zKG9ic2VydmVyKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gY29tbWVudCkgeworICAgICAgICAgICAgICAgIHJlbW92ZUNvbW1lbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZSByZW1vdmVDb21tZW50KCkgeworICAgICAgICByZXR1cm4gc2V0Q29tbWVudCgoQ29tbWVudCkgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE5vZGUpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gZ2V0IEphdmFQYXJzZXIgc3BlY2lmaWMgbm9kZSBpbnRyb3NwZWN0aW9uIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5ub2RlTWV0YU1vZGVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIG5vZGUgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgb3Igbm90LgorICAgICAqIElmIGl0IHdhcyBub3QsIG9ubHkgdGhlIHJhbmdlIGFuZCB0b2tlblJhbmdlIGZpZWxkcyB3aWxsIGJlIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZWRuZXNzIGdldFBhcnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHRoZSBwYXJzZXIgdG8gZmxhZyB1bnBhcnNhYmxlIG5vZGVzLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIHNldFBhcnNlZChQYXJzZWRuZXNzIHBhcnNlZCkgeworICAgICAgICB0aGlzLnBhcnNlZCA9IHBhcnNlZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGNvbW1lbnQpIHsKKyAgICAgICAgICAgICAgICBzZXRDb21tZW50KChDb21tZW50KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgQVNUIGJ5IGZpbmRpbmcgdGhlIHRvcG1vc3QgcGFyZW50LgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIGZpbmRSb290Tm9kZSgpIHsKKyAgICAgICAgTm9kZSBuID0gdGhpczsKKyAgICAgICAgd2hpbGUgKG4uZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuID0gbi5nZXRQYXJlbnROb2RlKCkuZ2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29udGFpbmluZyBDb21waWxhdGlvblVuaXQsIG9yIGVtcHR5IGlmIHRoaXMgbm9kZSBpcyBub3QgaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8Q29tcGlsYXRpb25Vbml0PiBmaW5kQ29tcGlsYXRpb25Vbml0KCkgeworICAgICAgICBOb2RlIHJvb3ROb2RlID0gZmluZFJvb3ROb2RlKCk7CisgICAgICAgIGlmIChyb290Tm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKChDb21waWxhdGlvblVuaXQpIHJvb3ROb2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3ltYm9sUmVzb2x2ZXIgZ2V0U3ltYm9sUmVzb2x2ZXIoKSB7CisgICAgICAgIHJldHVybiBmaW5kQ29tcGlsYXRpb25Vbml0KCkubWFwKGN1IC0+IHsKKyAgICAgICAgICAgIFN5bWJvbFJlc29sdmVyIHN5bWJvbFJlc29sdmVyID0gY3UuZ2V0RGF0YShTWU1CT0xfUkVTT0xWRVJfS0VZKTsKKyAgICAgICAgICAgIGlmIChzeW1ib2xSZXNvbHZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3ltYm9sIHJlc29sdXRpb24gbm90IGNvbmZpZ3VyZWQ6IHRvIGNvbmZpZ3VyZSBjb25zaWRlciBzZXR0aW5nIGEgU3ltYm9sUmVzb2x2ZXIgaW4gdGhlIFBhcnNlckNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzeW1ib2xSZXNvbHZlcjsKKyAgICAgICAgfSkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG5vZGUgaXMgbm90IGluc2VydGVkIGluIGEgQ29tcGlsYXRpb25Vbml0IikpOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gZXhwb3NlIGl0IGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRvIHVzZSBpdCB0byBpbmplY3QgdGhlIFN5bWJvbFNvbHZlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGF0YUtleTxTeW1ib2xSZXNvbHZlcj4gU1lNQk9MX1JFU09MVkVSX0tFWSA9IG5ldyBEYXRhS2V5PFN5bWJvbFJlc29sdmVyPigpIHsKKyAgICB9OworCisgICAgcHVibGljIGVudW0gVHJlZVRyYXZlcnNhbCB7CisKKyAgICAgICAgUFJFT1JERVIsIEJSRUFEVEhGSVJTVCwgUE9TVE9SREVSLCBQQVJFTlRTLCBESVJFQ1RfQ0hJTERSRU4KKyAgICB9CisKKyAgICBwcml2YXRlIEl0ZXJhdG9yPE5vZGU+IHRyZWVJdGVyYXRvcihUcmVlVHJhdmVyc2FsIHRyYXZlcnNhbCkgeworICAgICAgICBzd2l0Y2godHJhdmVyc2FsKSB7CisgICAgICAgICAgICBjYXNlIEJSRUFEVEhGSVJTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJyZWFkdGhGaXJzdEl0ZXJhdG9yKHRoaXMpOworICAgICAgICAgICAgY2FzZSBQT1NUT1JERVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0T3JkZXJJdGVyYXRvcih0aGlzKTsKKyAgICAgICAgICAgIGNhc2UgUFJFT1JERVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVPcmRlckl0ZXJhdG9yKHRoaXMpOworICAgICAgICAgICAgY2FzZSBESVJFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RDaGlsZHJlbkl0ZXJhdG9yKHRoaXMpOworICAgICAgICAgICAgY2FzZSBQQVJFTlRTOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50c1Zpc2l0b3IodGhpcyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHJhdmVyc2FsIGNob2ljZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSXRlcmFibGU8Tm9kZT4gdHJlZUl0ZXJhYmxlKFRyZWVUcmF2ZXJzYWwgdHJhdmVyc2FsKSB7CisgICAgICAgIHJldHVybiAoKSAtPiB0cmVlSXRlcmF0b3IodHJhdmVyc2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgc3RyZWFtIG9mIG5vZGVzIHVzaW5nIHRyYXZlcnNhbCBhbGdvcml0aG0gInRyYXZlcnNhbCIuCisgICAgICovCisgICAgcHVibGljIFN0cmVhbTxOb2RlPiBzdHJlYW0oVHJlZVRyYXZlcnNhbCB0cmF2ZXJzYWwpIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKFNwbGl0ZXJhdG9ycy5zcGxpdGVyYXRvclVua25vd25TaXplKHRyZWVJdGVyYXRvcih0cmF2ZXJzYWwpLCBOT05OVUxMIHwgRElTVElOQ1QpLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhIHN0cmVhbSBvZiBub2RlcyB1c2luZyBwcmUtb3JkZXIgdHJhdmVyc2FsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW08Tm9kZT4gc3RyZWFtKCkgeworICAgICAgICByZXR1cm4gU3RyZWFtU3VwcG9ydC5zdHJlYW0oU3BsaXRlcmF0b3JzLnNwbGl0ZXJhdG9yVW5rbm93blNpemUodHJlZUl0ZXJhdG9yKFBSRU9SREVSKSwgTk9OTlVMTCB8IERJU1RJTkNUKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGtzIHRoZSBBU1QsIGNhbGxpbmcgdGhlIGNvbnN1bWVyIGZvciBldmVyeSBub2RlLCB3aXRoIHRyYXZlcnNhbCBhbGdvcml0aG0gInRyYXZlcnNhbCIuCisgICAgICogPGJyLz5UaGlzIGlzIHRoZSBtb3N0IGdlbmVyYWwgd2FsayBtZXRob2QuIEFsbCBvdGhlciB3YWxrIGFuZCBmaW5kQWxsIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FsayhUcmVlVHJhdmVyc2FsIHRyYXZlcnNhbCwgQ29uc3VtZXI8Tm9kZT4gY29uc3VtZXIpIHsKKyAgICAgICAgLy8gQ291bGQgYmUgaW1wbGVtZW50ZWQgYXMgYSBjYWxsIHRvIHRoZSBhYm92ZSB3YWxrIG1ldGhvZCwgYnV0IHRoaXMgaXMgYSBsaXR0bGUgbW9yZSBlZmZpY2llbnQuCisgICAgICAgIGZvciAoTm9kZSBub2RlIDogdHJlZUl0ZXJhYmxlKHRyYXZlcnNhbCkpIHsKKyAgICAgICAgICAgIGNvbnN1bWVyLmFjY2VwdChub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGtzIHRoZSBBU1QsIGNhbGxpbmcgdGhlIGNvbnN1bWVyIGZvciBldmVyeSBub2RlIHdpdGggcHJlLW9yZGVyIHRyYXZlcnNhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3YWxrKENvbnN1bWVyPE5vZGU+IGNvbnN1bWVyKSB7CisgICAgICAgIHdhbGsoUFJFT1JERVIsIGNvbnN1bWVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrcyB0aGUgQVNUIHdpdGggcHJlLW9yZGVyIHRyYXZlcnNhbCwgY2FsbGluZyB0aGUgY29uc3VtZXIgZm9yIGV2ZXJ5IG5vZGUgb2YgdHlwZSAibm9kZVR5cGUiLgorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIE5vZGU+IHZvaWQgd2FsayhDbGFzczxUPiBub2RlVHlwZSwgQ29uc3VtZXI8VD4gY29uc3VtZXIpIHsKKyAgICAgICAgd2FsayhUcmVlVHJhdmVyc2FsLlBSRU9SREVSLCBub2RlIC0+IHsKKyAgICAgICAgICAgIGlmIChub2RlVHlwZS5pc0Fzc2lnbmFibGVGcm9tKG5vZGUuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQobm9kZVR5cGUuY2FzdChub2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGtzIHRoZSBBU1Qgd2l0aCBwcmUtb3JkZXIgdHJhdmVyc2FsLCByZXR1cm5pbmcgYWxsIG5vZGVzIG9mIHR5cGUgIm5vZGVUeXBlIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBOb2RlPiBMaXN0PFQ+IGZpbmRBbGwoQ2xhc3M8VD4gbm9kZVR5cGUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxUPiBmb3VuZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB3YWxrKG5vZGVUeXBlLCBmb3VuZDo6YWRkKTsKKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGtzIHRoZSBBU1Qgd2l0aCBwcmUtb3JkZXIgdHJhdmVyc2FsLCByZXR1cm5pbmcgYWxsIG5vZGVzIG9mIHR5cGUgIm5vZGVUeXBlIiB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuCisgICAgICovCisgICAgcHVibGljIDxUIGV4dGVuZHMgTm9kZT4gTGlzdDxUPiBmaW5kQWxsKENsYXNzPFQ+IG5vZGVUeXBlLCBQcmVkaWNhdGU8VD4gcHJlZGljYXRlKSB7CisgICAgICAgIGZpbmFsIExpc3Q8VD4gZm91bmQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgd2Fsayhub2RlVHlwZSwgbiAtPiB7CisgICAgICAgICAgICBpZiAocHJlZGljYXRlLnRlc3QobikpCisgICAgICAgICAgICAgICAgZm91bmQuYWRkKG4pOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGtzIHRoZSBBU1QsIGFwcGx5aW5nIHRoZSBmdW5jdGlvbiBmb3IgZXZlcnkgbm9kZSwgd2l0aCB0cmF2ZXJzYWwgYWxnb3JpdGhtICJ0cmF2ZXJzYWwiLiBJZiB0aGUgZnVuY3Rpb24KKyAgICAgKiByZXR1cm5zIHNvbWV0aGluZyBlbHNlIHRoYW4gbnVsbCwgdGhlIHRyYXZlcnNhbCBpcyBzdG9wcGVkIGFuZCB0aGUgZnVuY3Rpb24gcmVzdWx0IGlzIHJldHVybmVkLiA8YnIvPlRoaXMgaXMgdGhlCisgICAgICogbW9zdCBnZW5lcmFsIGZpbmRGaXJzdCBtZXRob2QuIEFsbCBvdGhlciBmaW5kRmlyc3QgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IE9wdGlvbmFsPFQ+IGZpbmRGaXJzdChUcmVlVHJhdmVyc2FsIHRyYXZlcnNhbCwgRnVuY3Rpb248Tm9kZSwgT3B0aW9uYWw8VD4+IGNvbnN1bWVyKSB7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogdHJlZUl0ZXJhYmxlKHRyYXZlcnNhbCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPFQ+IHJlc3VsdCA9IGNvbnN1bWVyLmFwcGx5KG5vZGUpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2Fsa3MgdGhlIEFTVCB3aXRoIHByZS1vcmRlciB0cmF2ZXJzYWwsIHJldHVybmluZyB0aGUgZmlyc3Qgbm9kZSBvZiB0eXBlICJub2RlVHlwZSIgb3IgZW1wdHkoKSBpZiBub25lIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyA8TiBleHRlbmRzIE5vZGU+IE9wdGlvbmFsPE4+IGZpbmRGaXJzdChDbGFzczxOPiBub2RlVHlwZSkgeworICAgICAgICByZXR1cm4gZmluZEZpcnN0KFRyZWVUcmF2ZXJzYWwuUFJFT1JERVIsIG5vZGUgLT4geworICAgICAgICAgICAgaWYgKG5vZGVUeXBlLmlzQXNzaWduYWJsZUZyb20obm9kZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihub2RlVHlwZS5jYXN0KG5vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrcyB0aGUgQVNUIHdpdGggcHJlLW9yZGVyIHRyYXZlcnNhbCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBub2RlIG9mIHR5cGUgIm5vZGVUeXBlIiB0aGF0IG1hdGNoZXMgInByZWRpY2F0ZSIgb3IgZW1wdHkoKSBpZiBub25lIGlzCisgICAgICogZm91bmQuCisgICAgICovCisgICAgcHVibGljIDxOIGV4dGVuZHMgTm9kZT4gT3B0aW9uYWw8Tj4gZmluZEZpcnN0KENsYXNzPE4+IG5vZGVUeXBlLCBQcmVkaWNhdGU8Tj4gcHJlZGljYXRlKSB7CisgICAgICAgIHJldHVybiBmaW5kRmlyc3QoVHJlZVRyYXZlcnNhbC5QUkVPUkRFUiwgbm9kZSAtPiB7CisgICAgICAgICAgICBpZiAobm9kZVR5cGUuaXNBc3NpZ25hYmxlRnJvbShub2RlLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTiBjYXN0Tm9kZSA9IG5vZGVUeXBlLmNhc3Qobm9kZSk7CisgICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS50ZXN0KGNhc3ROb2RlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoY2FzdE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrcyB0aGUgcGFyZW50cyBvZiB0aGlzIG5vZGUsIHJldHVybmluZyB0aGUgZmlyc3Qgbm9kZSBvZiB0eXBlICJub2RlVHlwZSIgb3IgZW1wdHkoKSBpZiBub25lIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyA8TiBleHRlbmRzIE5vZGU+IE9wdGlvbmFsPE4+IGZpbmRQYXJlbnQoQ2xhc3M8Tj4gbm9kZVR5cGUpIHsKKyAgICAgICAgTm9kZSBuID0gdGhpczsKKyAgICAgICAgd2hpbGUgKG4uZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuID0gbi5nZXRQYXJlbnROb2RlKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAobm9kZVR5cGUuaXNBc3NpZ25hYmxlRnJvbShuLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5vZGVUeXBlLmNhc3QobikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgYnJlYWR0aC1maXJzdCBub2RlIHRyYXZlcnNhbCBzdGFydGluZyB3aXRoIGEgZ2l2ZW4gbm9kZS4KKyAgICAgKgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnJlYWR0aC1maXJzdF9zZWFyY2giPkJyZWFkdGgtZmlyc3QgdHJhdmVyc2FsPC9hPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnJlYWR0aEZpcnN0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxOb2RlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxOb2RlPiBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBwdWJsaWMgQnJlYWR0aEZpcnN0SXRlcmF0b3IoTm9kZSBub2RlKSB7CisgICAgICAgICAgICBxdWV1ZS5hZGQobm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAhcXVldWUuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb2RlIG5leHQoKSB7CisgICAgICAgICAgICBOb2RlIG5leHQgPSBxdWV1ZS5yZW1vdmUoKTsKKyAgICAgICAgICAgIHF1ZXVlLmFkZEFsbChuZXh0LmdldENoaWxkTm9kZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgc2ltcGxlIHRyYXZlcnNhbCBvdmVyIGFsbCBub2RlcyB0aGF0IGhhdmUgdGhlIHBhc3NlZCBub2RlIGFzIHRoZWlyIHBhcmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpcmVjdENoaWxkcmVuSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxOb2RlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxOb2RlPiBjaGlsZHJlbkl0ZXJhdG9yOworCisgICAgICAgIHB1YmxpYyBEaXJlY3RDaGlsZHJlbkl0ZXJhdG9yKE5vZGUgbm9kZSkgeworICAgICAgICAgICAgY2hpbGRyZW5JdGVyYXRvciA9IG5ldyBBcnJheUxpc3Q8Pihub2RlLmdldENoaWxkTm9kZXMoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuSXRlcmF0b3IuaGFzTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb2RlIG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUsIHRoZW4gdGhlIHBhcmVudCdzIHBhcmVudCwgdGhlbiB0aGUgcGFyZW50J3MgcGFyZW50J3MgcGFyZW50LCB1bnRpbCBydW5uaW5nCisgICAgICogb3V0IG9mIHBhcmVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnRzVmlzaXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPE5vZGU+IHsKKworICAgICAgICBwcml2YXRlIE5vZGUgbm9kZTsKKworICAgICAgICBwdWJsaWMgUGFyZW50c1Zpc2l0b3IoTm9kZSBub2RlKSB7CisgICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5vZGUgbmV4dCgpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKS5vckVsc2UobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgcHJlLW9yZGVyIChvciBkZXB0aC1maXJzdCkgbm9kZSB0cmF2ZXJzYWwgc3RhcnRpbmcgd2l0aCBhIGdpdmVuIG5vZGUuCisgICAgICoKKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByZS1vcmRlciI+UHJlLW9yZGVyIHRyYXZlcnNhbDwvYT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZU9yZGVySXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxOb2RlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxOb2RlPiBzdGFjayA9IG5ldyBTdGFjazw+KCk7CisKKyAgICAgICAgcHVibGljIFByZU9yZGVySXRlcmF0b3IoTm9kZSBub2RlKSB7CisgICAgICAgICAgICBzdGFjay5hZGQobm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAhc3RhY2suaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb2RlIG5leHQoKSB7CisgICAgICAgICAgICBOb2RlIG5leHQgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGRyZW4gPSBuZXh0LmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjaGlsZHJlbi5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YWNrLmFkZChjaGlsZHJlbi5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHBvc3Qtb3JkZXIgKG9yIGxlYXZlcy1maXJzdCkgbm9kZSB0cmF2ZXJzYWwgc3RhcnRpbmcgd2l0aCBhIGdpdmVuIG5vZGUuCisgICAgICoKKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Bvc3Qtb3JkZXIiPlBvc3Qtb3JkZXIgdHJhdmVyc2FsPC9hPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zdE9yZGVySXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxOb2RlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxMaXN0PE5vZGU+PiBub2Rlc1N0YWNrID0gbmV3IFN0YWNrPD4oKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0YWNrPEludGVnZXI+IGN1cnNvclN0YWNrID0gbmV3IFN0YWNrPD4oKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE5vZGUgcm9vdDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmV4dCA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFBvc3RPcmRlckl0ZXJhdG9yKE5vZGUgcm9vdCkgeworICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICAgICAgICAgIGZpbGxTdGFja1RvTGVhZihyb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaWxsU3RhY2tUb0xlYWYoTm9kZSBub2RlKSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGROb2RlcyA9IG5ldyBBcnJheUxpc3Q8Pihub2RlLmdldENoaWxkTm9kZXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2Rlc1N0YWNrLnB1c2goY2hpbGROb2Rlcyk7CisgICAgICAgICAgICAgICAgY3Vyc29yU3RhY2sucHVzaCgwKTsKKyAgICAgICAgICAgICAgICBub2RlID0gY2hpbGROb2Rlcy5nZXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNOZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb2RlIG5leHQoKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PE5vZGU+IG5vZGVzID0gbm9kZXNTdGFjay5wZWVrKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3Vyc29yID0gY3Vyc29yU3RhY2sucGVlaygpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBsZXZlbEhhc05leHQgPSBjdXJzb3IgPCBub2Rlcy5zaXplKCk7CisgICAgICAgICAgICBpZiAobGV2ZWxIYXNOZXh0KSB7CisgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuZ2V0KGN1cnNvcik7CisgICAgICAgICAgICAgICAgZmlsbFN0YWNrVG9MZWFmKG5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0RnJvbUxldmVsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vZGVzU3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgY3Vyc29yU3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgaGFzTmV4dCA9ICFub2Rlc1N0YWNrLmVtcHR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGhhc05leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRGcm9tTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE5vZGUgbmV4dEZyb21MZXZlbCgpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Tm9kZT4gbm9kZXMgPSBub2Rlc1N0YWNrLnBlZWsoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJzb3IgPSBjdXJzb3JTdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGN1cnNvclN0YWNrLnB1c2goY3Vyc29yICsgMSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZXMuZ2V0KGN1cnNvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGVMaXN0LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGVMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3MGU5NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvTm9kZUxpc3QuamF2YQpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuQXN0T2JzZXJ2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkludGVybmFsUHJvcGVydHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKKy8qKgorICogQSBsaXN0IG9mIG5vZGVzLgorICogSXQgdXN1YWxseSBoYXMgYSBwYXJlbnQgbm9kZS4KKyAqIFVubGlrZSBub3JtYWwgTm9kZXMsIHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGl0IGlzIGEgY2hpbGQgb2YgdGhhdCBwYXJlbnQuCisgKiBJbnN0ZWFkLCB0aGlzIGxpc3Qgd2lsbCBtYWtlIGV2ZXJ5IG5vZGUgaXQgY29udGFpbnMgYSBjaGlsZCBvZiBpdHMgcGFyZW50LgorICogVGhpcyB3YXksIGEgTm9kZUxpc3QgZG9lcyBub3QgY3JlYXRlIGFuIGV4dHJhIGxldmVsIGluc2lkZSB0aGUgQVNULgorICoKKyAqIEBwYXJhbSA8Tj4gdGhlIHR5cGUgb2Ygbm9kZXMgY29udGFpbmVkLgorICovCitwdWJsaWMgY2xhc3MgTm9kZUxpc3Q8TiBleHRlbmRzIE5vZGU+IGltcGxlbWVudHMgTGlzdDxOPiwgSXRlcmFibGU8Tj4sIEhhc1BhcmVudE5vZGU8Tm9kZUxpc3Q8Tj4+LCBWaXNpdGFibGUsIE9ic2VydmFibGUgeworICAgIEBJbnRlcm5hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBMaXN0PE4+IGlubmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigwKTsKKworICAgIHByaXZhdGUgTm9kZSBwYXJlbnROb2RlOworCisgICAgcHJpdmF0ZSBMaXN0PEFzdE9ic2VydmVyPiBvYnNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBOb2RlTGlzdCgpIHsKKyAgICAgICAgcGFyZW50Tm9kZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIE5vZGVMaXN0KENvbGxlY3Rpb248Tj4gbikgeworICAgICAgICB0aGlzLmFkZEFsbChuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZUxpc3QoTi4uLiBuKSB7CisgICAgICAgIHRoaXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFkZChOIG5vZGUpIHsKKyAgICAgICAgbm90aWZ5RWxlbWVudEFkZGVkKGlubmVyTGlzdC5zaXplKCksIG5vZGUpOworICAgICAgICBvd24obm9kZSk7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QuYWRkKG5vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvd24oTiBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGludCBpbmRleCA9IGlubmVyTGlzdC5pbmRleE9mKG5vZGUpOworICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIG5vdGlmeUVsZW1lbnRSZW1vdmVkKGluZGV4LCBub2RlKTsKKyAgICAgICAgICAgIG5vZGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5uZXJMaXN0LnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTiByZW1vdmVGaXJzdCgpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZSgwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTiByZW1vdmVMYXN0KCkgeworICAgICAgICByZXR1cm4gcmVtb3ZlKGlubmVyTGlzdC5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBwdWJsaWMgc3RhdGljIDxYIGV4dGVuZHMgTm9kZT4gTm9kZUxpc3Q8WD4gbm9kZUxpc3QoWC4uLiBub2RlcykgeworICAgICAgICBmaW5hbCBOb2RlTGlzdDxYPiBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdDw+KCk7CisgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChub2RlTGlzdCwgbm9kZXMpOworICAgICAgICByZXR1cm4gbm9kZUxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8WCBleHRlbmRzIE5vZGU+IE5vZGVMaXN0PFg+IG5vZGVMaXN0KENvbGxlY3Rpb248WD4gbm9kZXMpIHsKKyAgICAgICAgZmluYWwgTm9kZUxpc3Q8WD4gbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICBub2RlTGlzdC5hZGRBbGwobm9kZXMpOworICAgICAgICByZXR1cm4gbm9kZUxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8WCBleHRlbmRzIE5vZGU+IE5vZGVMaXN0PFg+IG5vZGVMaXN0KE5vZGVMaXN0PFg+IG5vZGVzKSB7CisgICAgICAgIGZpbmFsIE5vZGVMaXN0PFg+IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICAgICAgbm9kZUxpc3QuYWRkQWxsKG5vZGVzKTsKKyAgICAgICAgcmV0dXJuIG5vZGVMaXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE4gbm9kZSkgeworICAgICAgICByZXR1cm4gaW5uZXJMaXN0LmNvbnRhaW5zKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5zaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE4gZ2V0KGludCBpKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QuZ2V0KGkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYXRvcjxOPiBpdGVyYXRvcigpIHsKKyAgICAgICAgLy8gVE9ETyB0YWtlIGNhcmUgb2YgIkl0ZXJhdG9yLnJlbW92ZSIKKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5pdGVyYXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOIHNldChpbnQgaW5kZXgsIE4gZWxlbWVudCkgeworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlubmVyTGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgaW5kZXguIFRoZSBpbmRleCBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAiICsgaW5uZXJMaXN0LnNpemUoKQorICAgICAgICAgICAgICAgICAgICArICIgZXhjbHVkZWQuIEl0IGlzIGluc3RlYWQgIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCA9PSBpbm5lckxpc3QuZ2V0KGluZGV4KSkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5RWxlbWVudFJlcGxhY2VkKGluZGV4LCBlbGVtZW50KTsKKyAgICAgICAgaW5uZXJMaXN0LmdldChpbmRleCkuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBpbm5lckxpc3Quc2V0KGluZGV4LCBlbGVtZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTiByZW1vdmUoaW50IGluZGV4KSB7CisgICAgICAgIG5vdGlmeUVsZW1lbnRSZW1vdmVkKGluZGV4LCBpbm5lckxpc3QuZ2V0KGluZGV4KSk7CisgICAgICAgIE4gcmVtb3ZlID0gaW5uZXJMaXN0LnJlbW92ZShpbmRleCk7CisgICAgICAgIGlmIChyZW1vdmUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlbW92ZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICByZXR1cm4gcmVtb3ZlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QuaXNFbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNvcnQoQ29tcGFyYXRvcjw/IHN1cGVyIE4+IGNvbXBhcmF0b3IpIHsKKyAgICAgICAgaW5uZXJMaXN0LnNvcnQoY29tcGFyYXRvcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQWxsKE5vZGVMaXN0PE4+IG90aGVyTGlzdCkgeworICAgICAgICBmb3IgKE4gbm9kZSA6IG90aGVyTGlzdCkgeworICAgICAgICAgICAgYWRkKG5vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgTiBub2RlKSB7CisgICAgICAgIG5vdGlmeUVsZW1lbnRBZGRlZChpbmRleCwgbm9kZSk7CisgICAgICAgIG93bihub2RlKTsKKyAgICAgICAgaW5uZXJMaXN0LmFkZChpbmRleCwgbm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyB0aGUgbm9kZSBiZWZvcmUgYWxsIG90aGVyIG5vZGVzLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlTGlzdDxOPiBhZGRGaXJzdChOIG5vZGUpIHsKKyAgICAgICAgYWRkKDAsIG5vZGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBub2RlIGFmdGVyIGFsbCBvdGhlciBub2Rlcy4gKFRoaXMgaXMgc2ltcGx5IGFuIGFsaWFzIGZvciBhZGQuKQorICAgICAqLworICAgIHB1YmxpYyBOb2RlTGlzdDxOPiBhZGRMYXN0KE4gbm9kZSkgeworICAgICAgICBhZGQobm9kZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIG5vZGUgYWZ0ZXIgYWZ0ZXJUaGlzTm9kZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gYWZ0ZXJUaGlzTm9kZSBpcyBub3QgaW4gdGhpcyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBOb2RlTGlzdDxOPiBhZGRBZnRlcihOIG5vZGUsIE4gYWZ0ZXJUaGlzTm9kZSkgeworICAgICAgICBpbnQgaSA9IGluZGV4T2YoYWZ0ZXJUaGlzTm9kZSk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBmaW5kIG5vZGUgdG8gaW5zZXJ0IGFmdGVyLiIpOworICAgICAgICB9CisgICAgICAgIGFkZChpICsgMSwgbm9kZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIG5vZGUgYmVmb3JlIGJlZm9yZVRoaXNOb2RlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBiZWZvcmVUaGlzTm9kZSBpcyBub3QgaW4gdGhpcyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBOb2RlTGlzdDxOPiBhZGRCZWZvcmUoTiBub2RlLCBOIGJlZm9yZVRoaXNOb2RlKSB7CisgICAgICAgIGludCBpID0gaW5kZXhPZihiZWZvcmVUaGlzTm9kZSk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBmaW5kIG5vZGUgdG8gaW5zZXJ0IGJlZm9yZS4iKTsKKyAgICAgICAgfQorICAgICAgICBhZGQoaSwgbm9kZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPE5vZGU+IGdldFBhcmVudE5vZGUoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHBhcmVudE5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhcmVudE5vZGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIHRoZSBwYXJlbnROb2RlCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgTm9kZUxpc3QKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTm9kZUxpc3Q8Tj4gc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKKyAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoaW5uZXJMaXN0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZUZvckNoaWxkcmVuKCkgeworICAgICAgICByZXR1cm4gcGFyZW50Tm9kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLmxhbmcuSXRlcmFibGUjZm9yRWFjaChqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXIpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yRWFjaChDb25zdW1lcjw/IHN1cGVyIE4+IGFjdGlvbikgeworICAgICAgICBpbm5lckxpc3QuZm9yRWFjaChhY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gaW5uZXJMaXN0LmNvbnRhaW5zKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjdG9BcnJheSgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QudG9BcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjdG9BcnJheShqYXZhLmxhbmcuT2JqZWN0W10pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgeworICAgICAgICByZXR1cm4gaW5uZXJMaXN0LnRvQXJyYXkoYSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gcmVtb3ZlKChOb2RlKSBvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QuY29udGFpbnNBbGwoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIE4+IGMpIHsKKyAgICAgICAgYy5mb3JFYWNoKHRoaXM6OmFkZCk7CisgICAgICAgIHJldHVybiAhYy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBOPiBjKSB7CisgICAgICAgIGZvciAoTiBlIDogYykgeworICAgICAgICAgICAgYWRkKGluZGV4KyssIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAhYy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChPYmplY3QgZSA6IGMpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSByZW1vdmUoZSkgfHwgY2hhbmdlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKE9iamVjdCBlIDogdGhpcy5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gIWMuY29udGFpbnMoaXQpKS50b0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICghYy5jb250YWlucyhlKSkgeworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSByZW1vdmUoZSkgfHwgY2hhbmdlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JlcGxhY2VBbGwoamF2YS51dGlsLmZ1bmN0aW9uLlVuYXJ5T3BlcmF0b3IpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUFsbChVbmFyeU9wZXJhdG9yPE4+IG9wZXJhdG9yKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc2V0KGksIG9wZXJhdG9yLmFwcGx5KHRoaXMuZ2V0KGkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUlmKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlSWYoUHJlZGljYXRlPD8gc3VwZXIgTj4gZmlsdGVyKSB7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKE9iamVjdCBlIDogdGhpcy5zdHJlYW0oKS5maWx0ZXIoZmlsdGVyKS50b0FycmF5KCkpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSByZW1vdmUoZSkgfHwgY2hhbmdlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I2NsZWFyKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgd2hpbGUgKCFpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZSgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QuZXF1YWxzKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjaGFzaENvZGUoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I2luZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5pbmRleE9mKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjbGFzdEluZGV4T2YoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QubGFzdEluZGV4T2Yobyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLnV0aWwuTGlzdCNsaXN0SXRlcmF0b3IoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8Tj4gbGlzdEl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gaW5uZXJMaXN0Lmxpc3RJdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkxpc3QjbGlzdEl0ZXJhdG9yKGludCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yPE4+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5saXN0SXRlcmF0b3IoaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcGFyYWxsZWxTdHJlYW0oKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJlYW08Tj4gcGFyYWxsZWxTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3QucGFyYWxsZWxTdHJlYW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I3N1Ykxpc3QoaW50LCBpbnQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Tj4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICByZXR1cm4gaW5uZXJMaXN0LnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NwbGl0ZXJhdG9yKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3BsaXRlcmF0b3I8Tj4gc3BsaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3Quc3BsaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5RWxlbWVudEFkZGVkKGludCBpbmRleCwgTm9kZSBub2RlQWRkZWRPclJlbW92ZWQpIHsKKyAgICAgICAgdGhpcy5vYnNlcnZlcnMuZm9yRWFjaChvIC0+IG8ubGlzdENoYW5nZSh0aGlzLCBBc3RPYnNlcnZlci5MaXN0Q2hhbmdlVHlwZS5BRERJVElPTiwgaW5kZXgsIG5vZGVBZGRlZE9yUmVtb3ZlZCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlFbGVtZW50UmVtb3ZlZChpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKSB7CisgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmZvckVhY2gobyAtPiBvLmxpc3RDaGFuZ2UodGhpcywgQXN0T2JzZXJ2ZXIuTGlzdENoYW5nZVR5cGUuUkVNT1ZBTCwgaW5kZXgsIG5vZGVBZGRlZE9yUmVtb3ZlZCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlFbGVtZW50UmVwbGFjZWQoaW50IGluZGV4LCBOb2RlIG5vZGVBZGRlZE9yUmVtb3ZlZCkgeworICAgICAgICB0aGlzLm9ic2VydmVycy5mb3JFYWNoKG8gLT4gby5saXN0UmVwbGFjZW1lbnQodGhpcywgaW5kZXgsIHRoaXMuZ2V0KGluZGV4KSwgbm9kZUFkZGVkT3JSZW1vdmVkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcihBc3RPYnNlcnZlciBvYnNlcnZlcikgeworICAgICAgICB0aGlzLm9ic2VydmVycy5yZW1vdmUob2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEFzdE9ic2VydmVyIG9ic2VydmVyKSB7CisgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKEFzdE9ic2VydmVyIG9ic2VydmVyKSB7CisgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5jb250YWlucyhvYnNlcnZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlIGZpcnN0IG5vZGUgdGhhdCBpcyBlcXVhbCB0byAib2xkIiB3aXRoICJyZXBsYWNlbWVudCIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSByZXBsYWNlbWVudCBoYXMgaGFwcGVuZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOIG9sZCwgTiByZXBsYWNlbWVudCkgeworICAgICAgICBpbnQgaSA9IGluZGV4T2Yob2xkKTsKKyAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzZXQoaSwgcmVwbGFjZW1lbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBvcHBvc2l0ZSBvZiBpc0VtcHR5KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vbkVtcHR5KCkgeworICAgICAgICByZXR1cm4gIWlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZk5vbkVtcHR5KENvbnN1bWVyPD8gc3VwZXIgTm9kZUxpc3Q8Tj4+IGNvbnN1bWVyKSB7CisgICAgICAgIGlmIChpc05vbkVtcHR5KCkpCisgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5vZGU+IENvbGxlY3RvcjxULCBOb2RlTGlzdDxUPiwgTm9kZUxpc3Q8VD4+IHRvTm9kZUxpc3QoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0b3Iub2YoTm9kZUxpc3Q6Om5ldywgTm9kZUxpc3Q6OmFkZCwgKGxlZnQsIHJpZ2h0KSAtPiB7CisgICAgICAgICAgICBsZWZ0LmFkZEFsbChyaWdodCk7CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFzUGFyZW50Tm9kZU9mKExpc3Q8PyBleHRlbmRzIE5vZGU+IGNoaWxkTm9kZXMpIHsKKyAgICAgICAgaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIYXNQYXJlbnROb2RlIGN1cnJlbnQgOiBjaGlsZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgY3VycmVudC5zZXRQYXJlbnROb2RlKGdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBc1BhcmVudE5vZGVPZihOb2RlIGNoaWxkTm9kZSkgeworICAgICAgICBpZiAoY2hpbGROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoaWxkTm9kZS5zZXRQYXJlbnROb2RlKGdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBpbm5lckxpc3Quc3RyZWFtKCkubWFwKE5vZGU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiLCAiWyIsICJdIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFja2FnZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTFjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKKworLyoqCisgKiBBIHBhY2thZ2UgZGVjbGFyYXRpb24uCisgKiA8YnIvPjxjb2RlPnBhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDs8L2NvZGU+CisgKiA8YnIvPjxjb2RlPkBXb25kZXJmdWwgcGFja2FnZSBhbnl0aGluZy5jYW4uYmUuYW5ub3RhdGVkLm5vd2FkYXlzOzwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhY2thZ2VEZWNsYXJhdGlvbiBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBOb2RlV2l0aEFubm90YXRpb25zPFBhY2thZ2VEZWNsYXJhdGlvbj4sIE5vZGVXaXRoTmFtZTxQYWNrYWdlRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbmV3IE5vZGVMaXN0PD4oKTsKKworICAgIHByaXZhdGUgTmFtZSBuYW1lOworCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uKE5hbWUgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIG5hbWUpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24oTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBOYW1lIG5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBhbm5vdGF0aW9ucywgbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGFubm90YXRpb25zIGRlY2xhcmVkIGJlZm9yZSB0aGUgcGFja2FnZQorICAgICAqIGRlY2xhcmF0aW9uLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGFubm90YXRpb25zIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZXhwcmVzc2lvbiBvZiB0aGUgcGFja2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIHRoZSBhbm5vdGF0aW9ucyB0byBzZXQKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbiBzZXRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSB0aGlzLmFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKFBhY2thZ2VEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQU5OT1RBVElPTlMsIHRoaXMuYW5ub3RhdGlvbnMsIGFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBwYWNrYWdlIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gc2V0CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gc2V0TmFtZShmaW5hbCBOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKFBhY2thZ2VEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSwgdGhpcy5uYW1lLCBuYW1lKTsKKyAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5uYW1lLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoUGFja2FnZURlY2xhcmF0aW9uKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5wYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzkzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFic3RyYWN0TW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQW5ub3RhdGlvbkRlY2xhcmF0aW9uTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlJlc29sdmFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQW4gYW5ub3RhdGlvbiB0eXBlIGRlY2xhcmF0aW9uLjxici8+PGNvZGU+QGludGVyZmFjZSBYIHsgLi4uIH08L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uRGVjbGFyYXRpb24gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb248QW5ub3RhdGlvbkRlY2xhcmF0aW9uPiBpbXBsZW1lbnRzIE5vZGVXaXRoQWJzdHJhY3RNb2RpZmllcjxBbm5vdGF0aW9uRGVjbGFyYXRpb24+LCBSZXNvbHZhYmxlPFJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uPiB7CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUoKSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgU2ltcGxlTmFtZShuYW1lKSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCBuYW1lLCBtZW1iZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCBuYW1lLCBtZW1iZXJzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEFubm90YXRpb25EZWNsYXJhdGlvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuYW5ub3RhdGlvbkRlY2xhcmF0aW9uTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uRGVjbGFyYXRpb24gYXNBbm5vdGF0aW9uRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkFubm90YXRpb25EZWNsYXJhdGlvbihDb25zdW1lcjxBbm5vdGF0aW9uRGVjbGFyYXRpb24+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZEFubm90YXRpb25EZWNsYXJhdGlvbiByZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS5yZXNvbHZlRGVjbGFyYXRpb24odGhpcywgUmVzb2x2ZWRBbm5vdGF0aW9uRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QW5ub3RhdGlvbkRlY2xhcmF0aW9uPiB0b0Fubm90YXRpb25EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI2ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2M7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFB1YmxpY01vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRoZSAiaW50IGlkKCk7IiBpbiA8Y29kZT5AaW50ZXJmYWNlIFggeyBpbnQgaWQoKTsgfTwvY29kZT4KKyAqIDxwPgorICogPGJyLz5BbGwgYW5ub3RhdGlvbnMgcHJlY2VkaW5nIHRoZSB0eXBlIHdpbGwgYmUgc2V0IG9uIHRoaXMgb2JqZWN0LCBub3Qgb24gdGhlIHR5cGUuIEphdmFQYXJzZXIgZG9lc24ndCBrbm93IGlmIGl0CisgKiB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBtZXRob2Qgb3IgdGhlIHR5cGUuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248QW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiBpbXBsZW1lbnRzIE5vZGVXaXRoSmF2YWRvYzxBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+LCBOb2RlV2l0aFNpbXBsZU5hbWU8QW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhUeXBlPEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiwgVHlwZT4sIE5vZGVXaXRoUHVibGljTW9kaWZpZXI8QW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyPEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbj4sIFJlc29sdmFibGU8UmVzb2x2ZWRBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIFNpbXBsZU5hbWUgbmFtZTsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZTsKKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoKSwgbmV3IFNpbXBsZU5hbWUoKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCB0eXBlLCBuZXcgU2ltcGxlTmFtZShuYW1lKSwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIFNpbXBsZU5hbWUgbmFtZSwgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCB0eXBlLCBuYW1lLCBkZWZhdWx0VmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFR5cGUgdHlwZSwgU2ltcGxlTmFtZSBuYW1lLCBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZ2V0RGVmYXVsdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShkZWZhdWx0VmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgbWVtYmVyIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gcmVtb3ZlRGVmYXVsdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gc2V0RGVmYXVsdFZhbHVlKChFeHByZXNzaW9uKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHNldERlZmF1bHRWYWx1ZShmaW5hbCBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IHRoaXMuZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuREVGQVVMVF9WQUxVRSwgdGhpcy5kZWZhdWx0VmFsdWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHNldE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2RpZmllcnMpOworICAgICAgICBpZiAobW9kaWZpZXJzID09IHRoaXMubW9kaWZpZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTU9ESUZJRVJTLCB0aGlzLm1vZGlmaWVycywgbW9kaWZpZXJzKTsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHNldE5hbWUoZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IHRoaXMubmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gc2V0VHlwZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSwgdGhpcy50eXBlLCB0eXBlKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEZWZhdWx0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgICAgIHNldERlZmF1bHRWYWx1ZSgoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKChTaW1wbGVOYW1lKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gdHlwZSkgeworICAgICAgICAgICAgc2V0VHlwZSgoVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBhc0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKENvbnN1bWVyPEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xSZXNvbHZlcigpLnJlc29sdmVEZWNsYXJhdGlvbih0aGlzLCBSZXNvbHZlZEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+IHRvQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0JvZHlEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0JvZHlEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODcxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQm9keURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFueSBkZWNsYXJhdGlvbiB0aGF0IGNhbiBhcHBlYXIgYmV0d2VlbiB0aGUgeyBhbmQgfSBvZiBhIGNsYXNzLCBpbnRlcmZhY2UsIG9yIGVudW0uCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb2R5RGVjbGFyYXRpb248VCBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbjw/Pj4gZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhBbm5vdGF0aW9uczxUPiB7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKworICAgIHB1YmxpYyBCb2R5RGVjbGFyYXRpb24oKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEJvZHlEZWNsYXJhdGlvbihOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb2R5RGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQm9keURlY2xhcmF0aW9uKFRva2VuUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgdGhpcyhyYW5nZSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0QW5ub3RhdGlvbnMoZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOworICAgICAgICBpZiAoYW5ub3RhdGlvbnMgPT0gdGhpcy5hbm5vdGF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgdGhpcy5hbm5vdGF0aW9ucywgYW5ub3RhdGlvbnMpOworICAgICAgICBpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEJvZHlEZWNsYXJhdGlvbjw/PiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChCb2R5RGVjbGFyYXRpb248Pz4pIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFzQW5ub3RhdGlvbkRlY2xhcmF0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBBbm5vdGF0aW9uRGVjbGFyYXRpb24iLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gYXNBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNDYWxsYWJsZURlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYWxsYWJsZURlY2xhcmF0aW9uIGFzQ2FsbGFibGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQ2FsbGFibGVEZWNsYXJhdGlvbiIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBhc0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gYXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW1Db25zdGFudERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBhc0VudW1Db25zdGFudERlY2xhcmF0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNFbnVtRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbiBhc0VudW1EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gRW51bURlY2xhcmF0aW9uIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gYXNGaWVsZERlY2xhcmF0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBGaWVsZERlY2xhcmF0aW9uIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24gYXNJbml0aWFsaXplckRlY2xhcmF0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBJbml0aWFsaXplckRlY2xhcmF0aW9uIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01ldGhvZERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBhc01ldGhvZERlY2xhcmF0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBNZXRob2REZWNsYXJhdGlvbiIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVEZWNsYXJhdGlvbiBhc1R5cGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gVHlwZURlY2xhcmF0aW9uIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkFubm90YXRpb25EZWNsYXJhdGlvbihDb25zdW1lcjxBbm5vdGF0aW9uRGVjbGFyYXRpb24+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihDb25zdW1lcjxBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNhbGxhYmxlRGVjbGFyYXRpb24oQ29uc3VtZXI8Q2FsbGFibGVEZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKENvbnN1bWVyPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQ29uc3RydWN0b3JEZWNsYXJhdGlvbihDb25zdW1lcjxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihDb25zdW1lcjxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRW51bURlY2xhcmF0aW9uKENvbnN1bWVyPEVudW1EZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRmllbGREZWNsYXJhdGlvbihDb25zdW1lcjxGaWVsZERlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZJbml0aWFsaXplckRlY2xhcmF0aW9uKENvbnN1bWVyPEluaXRpYWxpemVyRGVjbGFyYXRpb24+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk1ldGhvZERlY2xhcmF0aW9uKENvbnN1bWVyPE1ldGhvZERlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZUeXBlRGVjbGFyYXRpb24oQ29uc3VtZXI8VHlwZURlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEFubm90YXRpb25EZWNsYXJhdGlvbj4gdG9Bbm5vdGF0aW9uRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiB0b0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxDYWxsYWJsZURlY2xhcmF0aW9uPiB0b0NhbGxhYmxlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiB0b0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiB0b0NvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IHRvRW51bUNvbnN0YW50RGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RW51bURlY2xhcmF0aW9uPiB0b0VudW1EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxGaWVsZERlY2xhcmF0aW9uPiB0b0ZpZWxkRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8SW5pdGlhbGl6ZXJEZWNsYXJhdGlvbj4gdG9Jbml0aWFsaXplckRlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE1ldGhvZERlY2xhcmF0aW9uPiB0b01ldGhvZERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbj4gdG9UeXBlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9DYWxsYWJsZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2FsbGFibGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTQxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2FsbGFibGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNyBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5qb2luaW5nOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGRlY2xhcmF0aW9uIHdoaWNoIGlzIGNhbGxhYmxlIGVnLiBhIG1ldGhvZCBvciBhIGNvbnN0cnVjdG9yLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGFibGVEZWNsYXJhdGlvbjxUIGV4dGVuZHMgQ2FsbGFibGVEZWNsYXJhdGlvbjw/Pj4gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248VD4gaW1wbGVtZW50cyBOb2RlV2l0aEFjY2Vzc01vZGlmaWVyczxUPiwgTm9kZVdpdGhEZWNsYXJhdGlvbiwgTm9kZVdpdGhTaW1wbGVOYW1lPFQ+LCBOb2RlV2l0aFBhcmFtZXRlcnM8VD4sIE5vZGVXaXRoVGhyb3duRXhjZXB0aW9uczxUPiwgTm9kZVdpdGhUeXBlUGFyYW1ldGVyczxUPiwgTm9kZVdpdGhKYXZhZG9jPFQ+LCBOb2RlV2l0aEFic3RyYWN0TW9kaWZpZXI8VD4sIE5vZGVXaXRoU3RhdGljTW9kaWZpZXI8VD4sIE5vZGVXaXRoRmluYWxNb2RpZmllcjxUPiwgTm9kZVdpdGhTdHJpY3RmcE1vZGlmaWVyPFQ+IHsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKKworICAgIHByaXZhdGUgU2ltcGxlTmFtZSBuYW1lOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93bkV4Y2VwdGlvbnM7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgUmVjZWl2ZXJQYXJhbWV0ZXIgcmVjZWl2ZXJQYXJhbWV0ZXI7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBDYWxsYWJsZURlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBOb2RlTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93bkV4Y2VwdGlvbnMsIFJlY2VpdmVyUGFyYW1ldGVyIHJlY2VpdmVyUGFyYW1ldGVyKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIG5hbWUsIHBhcmFtZXRlcnMsIHRocm93bkV4Y2VwdGlvbnMsIHJlY2VpdmVyUGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENhbGxhYmxlRGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIFNpbXBsZU5hbWUgbmFtZSwgTm9kZUxpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zLCBSZWNlaXZlclBhcmFtZXRlciByZWNlaXZlclBhcmFtZXRlcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIHNldFRocm93bkV4Y2VwdGlvbnModGhyb3duRXhjZXB0aW9ucyk7CisgICAgICAgIHNldFJlY2VpdmVyUGFyYW1ldGVyKHJlY2VpdmVyUGFyYW1ldGVyKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIG1lbWJlciBkZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgVCBzZXRNb2RpZmllcnMoZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobW9kaWZpZXJzKTsKKyAgICAgICAgaWYgKG1vZGlmaWVycyA9PSB0aGlzLm1vZGlmaWVycykgeworICAgICAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5NT0RJRklFUlMsIHRoaXMubW9kaWZpZXJzLCBtb2RpZmllcnMpOworICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0TmFtZShmaW5hbCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0UGFyYW1ldGVycyhmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gdGhpcy5wYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlBBUkFNRVRFUlMsIHRoaXMucGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0aGlzLnBhcmFtZXRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihwYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZ2V0VGhyb3duRXhjZXB0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHRocm93bkV4Y2VwdGlvbnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBUIHNldFRocm93bkV4Y2VwdGlvbnMoZmluYWwgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3duRXhjZXB0aW9ucykgeworICAgICAgICBhc3NlcnROb3ROdWxsKHRocm93bkV4Y2VwdGlvbnMpOworICAgICAgICBpZiAodGhyb3duRXhjZXB0aW9ucyA9PSB0aGlzLnRocm93bkV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVEhST1dOX0VYQ0VQVElPTlMsIHRoaXMudGhyb3duRXhjZXB0aW9ucywgdGhyb3duRXhjZXB0aW9ucyk7CisgICAgICAgIGlmICh0aGlzLnRocm93bkV4Y2VwdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudGhyb3duRXhjZXB0aW9ucy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnRocm93bkV4Y2VwdGlvbnMgPSB0aHJvd25FeGNlcHRpb25zOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aHJvd25FeGNlcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0VHlwZVBhcmFtZXRlcnMoZmluYWwgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0eXBlUGFyYW1ldGVycyA9PSB0aGlzLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEVfUEFSQU1FVEVSUywgdGhpcy50eXBlUGFyYW1ldGVycywgdHlwZVBhcmFtZXRlcnMpOworICAgICAgICBpZiAodGhpcy50eXBlUGFyYW1ldGVycyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlUGFyYW1ldGVycy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuIGluY2x1ZGluZ01vZGlmaWVycywgYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MpIHsKKyAgICAgICAgcmV0dXJuIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoaW5jbHVkaW5nTW9kaWZpZXJzLCBpbmNsdWRpbmdUaHJvd3MsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldERlY2xhcmF0aW9uQXNTdHJpbmcodHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4gaW5jbHVkaW5nTW9kaWZpZXJzLCBib29sZWFuIGluY2x1ZGluZ1Rocm93cywgYm9vbGVhbiBpbmNsdWRpbmdQYXJhbWV0ZXJOYW1lKTsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgYXBwZW5kVGhyb3dzSWZSZXF1ZXN0ZWQoYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChpbmNsdWRpbmdUaHJvd3MpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RUaHJvdyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZVR5cGUgdGhyIDogZ2V0VGhyb3duRXhjZXB0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0VGhyb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RUaHJvdyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiB0aHJvd3MgIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodGhyLnRvU3RyaW5nKHByZXR0eVByaW50ZXJOb0NvbW1lbnRzQ29uZmlndXJhdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY2VpdmVyUGFyYW1ldGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHJlY2VpdmVyUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXJQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocm93bkV4Y2VwdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0aHJvd25FeGNlcHRpb25zLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdGhyb3duRXhjZXB0aW9ucy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtZXRob2Qgb3IgY29uc3RydWN0b3Igc2lnbmF0dXJlLgorICAgICAqIDxwLz5Ob3RlIHRoYXQgc2luY2UgSmF2YVBhcnNlciBoYXMgbm8gcmVhbCBrbm93bGVkZ2Ugb2YgdHlwZXMgLSBvbmx5IHRoZSB0ZXh0IGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSAtIHVzaW5nCisgICAgICogdGhpcyB3aWxsIGZhaWwgaW4gc29tZSBjYXNlcy4gKGphdmEudXRpbC5TdHJpbmcgIT0gU3RyaW5nIGZvciBleGFtcGxlLCBhbmQgZ2VuZXJpY3MgYXJlIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2lnbmF0dXJlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUeXBlPiBwYXJhbWV0ZXJUeXBlczsKKworICAgICAgICBwcml2YXRlIFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgTGlzdDxUeXBlPiBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyVHlwZXMgPSBwYXJhbWV0ZXJUeXBlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8VHlwZT4gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyVHlwZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBTaWduYXR1cmUgc2lnbmF0dXJlID0gKFNpZ25hdHVyZSkgbzsKKyAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHMoc2lnbmF0dXJlLm5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICghcGFyYW1ldGVyVHlwZXMuZXF1YWxzKHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHBhcmFtZXRlclR5cGVzLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlcy5zdHJlYW0oKS5tYXAoVHlwZTo6YXNTdHJpbmcpLmNvbGxlY3Qoam9pbmluZygiLCAiLCBuYW1lICsgIigiLCAiKSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGFzU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2lnbmF0dXJlIGdldFNpZ25hdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSwgZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCh0aGlzOjpnZXRUeXBlV2l0aFZhcmFyZ3NBc0FycmF5KS5tYXAodGhpczo6c3RyaXBHZW5lcmljcykubWFwKHRoaXM6OnN0cmlwQW5ub3RhdGlvbnMpLmNvbGxlY3QodG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGUgc3RyaXBBbm5vdGF0aW9ucyhUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBOb2RlV2l0aEFubm90YXRpb25zKSB7CisgICAgICAgICAgICAoKE5vZGVXaXRoQW5ub3RhdGlvbnMpIHR5cGUpLnNldEFubm90YXRpb25zKG5ldyBOb2RlTGlzdDw+KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHByaXZhdGUgVHlwZSBzdHJpcEdlbmVyaWNzKFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIE5vZGVXaXRoVHlwZUFyZ3VtZW50cykgeworICAgICAgICAgICAgKChOb2RlV2l0aFR5cGVBcmd1bWVudHMpIHR5cGUpLnNldFR5cGVBcmd1bWVudHMoKE5vZGVMaXN0PFR5cGU+KSBudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGUgZ2V0VHlwZVdpdGhWYXJhcmdzQXNBcnJheShQYXJhbWV0ZXIgcCkgeworICAgICAgICAvKiBBIHNpZ25hdHVyZSBpbmNsdWRlcyB0aGUgdmFyYXJncyBlbGxpcHNpcy4KKyAgICAgICAgIFRoaXMgaXMgYSBmaWVsZCBvbiBwYXJhbWV0ZXIgd2hpY2ggd2UgbG9zZSB3aGVuIHdlIG9ubHkgZ2V0IHRoZSB0eXBlLAorICAgICAgICAgc28gd2UgcmVwcmVzZW50IGl0IGFzIGFuIGFkZGl0aW9uYWwgW10gb24gdGhlIHR5cGUuICovCisgICAgICAgIFR5cGUgdCA9IHAuZ2V0VHlwZSgpLmNsb25lKCk7CisgICAgICAgIGlmIChwLmlzVmFyQXJncygpKSB7CisgICAgICAgICAgICB0ID0gbmV3IEFycmF5VHlwZSh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIENhbGxhYmxlRGVjbGFyYXRpb248Pz4gY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQ2FsbGFibGVEZWNsYXJhdGlvbjw/PikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IG5hbWUpIHsKKyAgICAgICAgICAgIHNldE5hbWUoKFNpbXBsZU5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXQoaSwgKFBhcmFtZXRlcikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVjZWl2ZXJQYXJhbWV0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gcmVjZWl2ZXJQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAgICBzZXRSZWNlaXZlclBhcmFtZXRlcigoUmVjZWl2ZXJQYXJhbWV0ZXIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd25FeGNlcHRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhyb3duRXhjZXB0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbnMuc2V0KGksIChSZWZlcmVuY2VUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLnNldChpLCAoVHlwZVBhcmFtZXRlcikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbGxhYmxlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2FsbGFibGVEZWNsYXJhdGlvbiBhc0NhbGxhYmxlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNhbGxhYmxlRGVjbGFyYXRpb24oQ29uc3VtZXI8Q2FsbGFibGVEZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxSZWNlaXZlclBhcmFtZXRlcj4gZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHJlY2VpdmVyUGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0UmVjZWl2ZXJQYXJhbWV0ZXIoZmluYWwgUmVjZWl2ZXJQYXJhbWV0ZXIgcmVjZWl2ZXJQYXJhbWV0ZXIpIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyUGFyYW1ldGVyID09IHRoaXMucmVjZWl2ZXJQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuUkVDRUlWRVJfUEFSQU1FVEVSLCB0aGlzLnJlY2VpdmVyUGFyYW1ldGVyLCByZWNlaXZlclBhcmFtZXRlcik7CisgICAgICAgIGlmICh0aGlzLnJlY2VpdmVyUGFyYW1ldGVyICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnJlY2VpdmVyUGFyYW1ldGVyLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMucmVjZWl2ZXJQYXJhbWV0ZXIgPSByZWNlaXZlclBhcmFtZXRlcjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YocmVjZWl2ZXJQYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2FsbGFibGVEZWNsYXJhdGlvbiByZW1vdmVSZWNlaXZlclBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHNldFJlY2VpdmVyUGFyYW1ldGVyKChSZWNlaXZlclBhcmFtZXRlcikgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxDYWxsYWJsZURlY2xhcmF0aW9uPiB0b0NhbGxhYmxlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NTA2NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhDb25zdHJ1Y3RvcnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFeHRlbmRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSW1wbGVtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFic3RyYWN0TW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoRmluYWxNb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBkZWZpbml0aW9uIG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLjxici8+PGNvZGU+Y2xhc3MgWCB7IC4uLiB9PC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gaW1wbGVtZW50cyBOb2RlV2l0aEltcGxlbWVudHM8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiwgTm9kZVdpdGhFeHRlbmRzPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4sIE5vZGVXaXRoVHlwZVBhcmFtZXRlcnM8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiwgTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4sIE5vZGVXaXRoRmluYWxNb2RpZmllcjxDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+LCBOb2RlV2l0aENvbnN0cnVjdG9yczxDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+LCBSZXNvbHZhYmxlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnRlcmZhY2U7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOworCisgICAgLy8gQ2FuIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpdGVtIGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kZWRUeXBlczsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkVHlwZXM7CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgZmFsc2UsIG5ldyBTaW1wbGVOYW1lKCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgbmV3IE5vZGVMaXN0PD4oKSwgaXNJbnRlcmZhY2UsIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlLCBmaW5hbCBTaW1wbGVOYW1lIG5hbWUsIGZpbmFsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBmaW5hbCBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kZWRUeXBlcywgZmluYWwgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkVHlwZXMsIGZpbmFsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIGlzSW50ZXJmYWNlLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgZXh0ZW5kZWRUeXBlcywgaW1wbGVtZW50ZWRUeXBlcywgbWVtYmVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgYm9vbGVhbiBpc0ludGVyZmFjZSwgU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dGVuZGVkVHlwZXMsIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRlZFR5cGVzLCBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgbmFtZSwgbWVtYmVycyk7CisgICAgICAgIHNldEludGVyZmFjZShpc0ludGVyZmFjZSk7CisgICAgICAgIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0RXh0ZW5kZWRUeXBlcyhleHRlbmRlZFR5cGVzKTsKKyAgICAgICAgc2V0SW1wbGVtZW50ZWRUeXBlcyhpbXBsZW1lbnRlZFR5cGVzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldEV4dGVuZGVkVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBleHRlbmRlZFR5cGVzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldEltcGxlbWVudGVkVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRlZFR5cGVzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBpc0ludGVyZmFjZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBzZXRFeHRlbmRlZFR5cGVzKGZpbmFsIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRlbmRlZFR5cGVzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoZXh0ZW5kZWRUeXBlcyk7CisgICAgICAgIGlmIChleHRlbmRlZFR5cGVzID09IHRoaXMuZXh0ZW5kZWRUeXBlcykgeworICAgICAgICAgICAgcmV0dXJuIChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVYVEVOREVEX1RZUEVTLCB0aGlzLmV4dGVuZGVkVHlwZXMsIGV4dGVuZGVkVHlwZXMpOworICAgICAgICBpZiAodGhpcy5leHRlbmRlZFR5cGVzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmV4dGVuZGVkVHlwZXMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5leHRlbmRlZFR5cGVzID0gZXh0ZW5kZWRUeXBlczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZXh0ZW5kZWRUeXBlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHNldEltcGxlbWVudGVkVHlwZXMoZmluYWwgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkVHlwZXMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbXBsZW1lbnRlZFR5cGVzKTsKKyAgICAgICAgaWYgKGltcGxlbWVudGVkVHlwZXMgPT0gdGhpcy5pbXBsZW1lbnRlZFR5cGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuSU1QTEVNRU5URURfVFlQRVMsIHRoaXMuaW1wbGVtZW50ZWRUeXBlcywgaW1wbGVtZW50ZWRUeXBlcyk7CisgICAgICAgIGlmICh0aGlzLmltcGxlbWVudGVkVHlwZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50ZWRUeXBlcy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmltcGxlbWVudGVkVHlwZXMgPSBpbXBsZW1lbnRlZFR5cGVzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihpbXBsZW1lbnRlZFR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gc2V0SW50ZXJmYWNlKGZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKKyAgICAgICAgaWYgKGlzSW50ZXJmYWNlID09IHRoaXMuaXNJbnRlcmZhY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5JTlRFUkZBQ0UsIHRoaXMuaXNJbnRlcmZhY2UsIGlzSW50ZXJmYWNlKTsKKyAgICAgICAgdGhpcy5pc0ludGVyZmFjZSA9IGlzSW50ZXJmYWNlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBzZXRUeXBlUGFyYW1ldGVycyhmaW5hbCBOb2RlTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgeworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzID09IHRoaXMudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFX1BBUkFNRVRFUlMsIHRoaXMudHlwZVBhcmFtZXRlcnMsIHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkVHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChleHRlbmRlZFR5cGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgZXh0ZW5kZWRUeXBlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZFR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGltcGxlbWVudGVkVHlwZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaXMgdGhpcyBjbGFzcydzIHBhcmVudCBhIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYWxDbGFzc0RlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50Tm9kZSgpLm1hcChwIC0+IHAgaW5zdGFuY2VvZiBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10KS5vckVsc2UoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaXMgdGhpcyBhbiBpbm5lciBjbGFzcz8KKyAgICAgKiBOT1RFOiBtYW55IHBlb3BsZSBhcmUgY29uZnVzZWQgb3ZlciB0ZXJtaW5vbG9neS4gUmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3R1dG9yaWFsL2phdmEvamF2YU9PL25lc3RlZC5odG1sIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lubmVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBpc05lc3RlZFR5cGUoKSAmJiAhaXNJbnRlcmZhY2UgJiYgIWlzU3RhdGljKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5jbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZWRUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGV4dGVuZGVkVHlwZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBleHRlbmRlZFR5cGVzLnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZFR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGltcGxlbWVudGVkVHlwZXMuc2V0KGksIChDbGFzc09ySW50ZXJmYWNlVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodHlwZVBhcmFtZXRlcnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGFzQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oQ29uc3VtZXI8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkucmVzb2x2ZURlY2xhcmF0aW9uKHRoaXMsIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gdG9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjFkYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTcgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFjY2Vzc01vZGlmaWVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQ29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uUmVzb2x2YWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbjogPGNvZGU+Y2xhc3MgWCB7IFgoKSB7IH0gfTwvY29kZT4gd2hlcmUgWCgpe30gaXMgdGhlIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLgorICoKKyAqIDxici8+QWxsIGFubm90YXRpb25zIHByZWNlZGluZyB0aGUgbmFtZSB3aWxsIGJlIHNldCBvbiB0aGlzIG9iamVjdCwgbm90IG9uIHRoZSBjbGFzcy4KKyAqIEphdmFQYXJzZXIgZG9lc24ndCBrbm93IGlmIGl0IHRoZXkgYXJlIGFwcGxpY2FibGUgdG8gdGhlIG1ldGhvZCBvciB0aGUgY2xhc3MuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGV4dGVuZHMgQ2FsbGFibGVEZWNsYXJhdGlvbjxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBpbXBsZW1lbnRzIE5vZGVXaXRoQmxvY2tTdG10PENvbnN0cnVjdG9yRGVjbGFyYXRpb24+LCBOb2RlV2l0aEFjY2Vzc01vZGlmaWVyczxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhKYXZhZG9jPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+LCBOb2RlV2l0aFNpbXBsZU5hbWU8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIE5vZGVXaXRoUGFyYW1ldGVyczxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+LCBOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+LCBSZXNvbHZhYmxlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBCbG9ja1N0bXQgYm9keTsKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUoKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IEJsb2NrU3RtdCgpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUobmFtZSksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBCbG9ja1N0bXQoKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUobmFtZSksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBCbG9ja1N0bXQoKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3duRXhjZXB0aW9ucywgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgdGhpcyhudWxsLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCB0eXBlUGFyYW1ldGVycywgbmFtZSwgcGFyYW1ldGVycywgdGhyb3duRXhjZXB0aW9ucywgYm9keSwgbnVsbCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3duRXhjZXB0aW9ucywgQmxvY2tTdG10IGJvZHksIFJlY2VpdmVyUGFyYW1ldGVyIHJlY2VpdmVyUGFyYW1ldGVyKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIG5hbWUsIHBhcmFtZXRlcnMsIHRocm93bkV4Y2VwdGlvbnMsIGJvZHksIHJlY2VpdmVyUGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIFNpbXBsZU5hbWUgbmFtZSwgTm9kZUxpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zLCBCbG9ja1N0bXQgYm9keSwgUmVjZWl2ZXJQYXJhbWV0ZXIgcmVjZWl2ZXJQYXJhbWV0ZXIpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIG5hbWUsIHBhcmFtZXRlcnMsIHRocm93bkV4Y2VwdGlvbnMsIHJlY2VpdmVyUGFyYW1ldGVyKTsKKyAgICAgICAgc2V0Qm9keShib2R5KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tTdG10IGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiBib2R5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJvZHkKKyAgICAgKgorICAgICAqIEBwYXJhbSBib2R5IHRoZSBib2R5LCBjYW4gbm90IGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHNldEJvZHkoZmluYWwgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChib2R5KTsKKyAgICAgICAgaWYgKGJvZHkgPT0gdGhpcy5ib2R5KSB7CisgICAgICAgICAgICByZXR1cm4gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFksIHRoaXMuYm9keSwgYm9keSk7CisgICAgICAgIGlmICh0aGlzLmJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYm9keS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gc2V0TW9kaWZpZXJzKGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycykgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gc2V0TmFtZShmaW5hbCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gc2V0UGFyYW1ldGVycyhmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gc2V0VGhyb3duRXhjZXB0aW9ucyhmaW5hbCBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zKSB7CisgICAgICAgIHJldHVybiBzdXBlci5zZXRUaHJvd25FeGNlcHRpb25zKHRocm93bkV4Y2VwdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHNldFR5cGVQYXJhbWV0ZXJzKGZpbmFsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBzdXBlci5zZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlY2xhcmF0aW9uIHJldHVybmVkIGhhcyB0aGlzIHNjaGVtYToKKyAgICAgKiA8cD4KKyAgICAgKiBbYWNjZXNzU3BlY2lmaWVyXSBjbGFzc05hbWUgKFtwYXJhbVR5cGUgW3BhcmFtTmFtZV1dKQorICAgICAqIFt0aHJvd3MgZXhjZXB0aW9uc0xpc3RdCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4gaW5jbHVkaW5nTW9kaWZpZXJzLCBib29sZWFuIGluY2x1ZGluZ1Rocm93cywgYm9vbGVhbiBpbmNsdWRpbmdQYXJhbWV0ZXJOYW1lKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoaW5jbHVkaW5nTW9kaWZpZXJzKSB7CisgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyID0gTW9kaWZpZXIuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIuYXNTdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyID09IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUID8gIiIgOiAiICIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIigiKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdFBhcmFtID0gdHJ1ZTsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBnZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdFBhcmFtKSB7CisgICAgICAgICAgICAgICAgZmlyc3RQYXJhbSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbS50b1N0cmluZyhwcmV0dHlQcmludGVyTm9Db21tZW50c0NvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtLmdldFR5cGUoKS50b1N0cmluZyhwcmV0dHlQcmludGVyTm9Db21tZW50c0NvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgc2IuYXBwZW5kKGFwcGVuZFRocm93c0lmUmVxdWVzdGVkKGluY2x1ZGluZ1Rocm93cykpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmNvbnN0cnVjdG9yRGVjbGFyYXRpb25NZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGJvZHkpIHsKKyAgICAgICAgICAgIHNldEJvZHkoKEJsb2NrU3RtdCkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFzQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQ29uc3RydWN0b3JEZWNsYXJhdGlvbihDb25zdW1lcjxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xSZXNvbHZlcigpLnJlc29sdmVEZWNsYXJhdGlvbih0aGlzLCBSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gdG9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTMzMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBPbmUgb2YgdGhlIHZhbHVlcyBhbiBlbnVtIGNhbiB0YWtlLiBBKDEpIGFuZCBCKDIpIGluIHRoaXMgZXhhbXBsZTogPGNvZGU+ZW51bSBYIHsgQSgxKSwgQigyKSB9PC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGltcGxlbWVudHMgTm9kZVdpdGhKYXZhZG9jPEVudW1Db25zdGFudERlY2xhcmF0aW9uPiwgTm9kZVdpdGhTaW1wbGVOYW1lPEVudW1Db25zdGFudERlY2xhcmF0aW9uPiwgTm9kZVdpdGhBcmd1bWVudHM8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+LCBSZXNvbHZhYmxlPFJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgU2ltcGxlTmFtZSBuYW1lOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHM7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gY2xhc3NCb2R5OworCisgICAgcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBTaW1wbGVOYW1lKCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24oTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cywgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBjbGFzc0JvZHkpIHsKKyAgICAgICAgdGhpcyhudWxsLCBhbm5vdGF0aW9ucywgbmFtZSwgYXJndW1lbnRzLCBjbGFzc0JvZHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFNpbXBsZU5hbWUgbmFtZSwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzLCBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGNsYXNzQm9keSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICBzZXRDbGFzc0JvZHkoY2xhc3NCb2R5KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gYXJndW1lbnRzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBnZXRDbGFzc0JvZHkoKSB7CisgICAgICAgIHJldHVybiBjbGFzc0JvZHk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gc2V0QXJndW1lbnRzKGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgeworICAgICAgICBhc3NlcnROb3ROdWxsKGFyZ3VtZW50cyk7CisgICAgICAgIGlmIChhcmd1bWVudHMgPT0gdGhpcy5hcmd1bWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkFSR1VNRU5UUywgdGhpcy5hcmd1bWVudHMsIGFyZ3VtZW50cyk7CisgICAgICAgIGlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gc2V0Q2xhc3NCb2R5KGZpbmFsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gY2xhc3NCb2R5KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2xhc3NCb2R5KTsKKyAgICAgICAgaWYgKGNsYXNzQm9keSA9PSB0aGlzLmNsYXNzQm9keSkgeworICAgICAgICAgICAgcmV0dXJuIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQ0xBU1NfQk9EWSwgdGhpcy5jbGFzc0JvZHksIGNsYXNzQm9keSk7CisgICAgICAgIGlmICh0aGlzLmNsYXNzQm9keSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5jbGFzc0JvZHkuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5jbGFzc0JvZHkgPSBjbGFzc0JvZHk7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGNsYXNzQm9keSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gc2V0TmFtZShmaW5hbCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKEVudW1Db25zdGFudERlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0JvZHkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjbGFzc0JvZHkuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBjbGFzc0JvZHkucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5lbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMuc2V0KGksIChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NCb2R5LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NCb2R5LmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgY2xhc3NCb2R5LnNldChpLCAoQm9keURlY2xhcmF0aW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IG5hbWUpIHsKKyAgICAgICAgICAgIHNldE5hbWUoKFNpbXBsZU5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW1Db25zdGFudERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGFzRW51bUNvbnN0YW50RGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkVudW1Db25zdGFudERlY2xhcmF0aW9uKENvbnN1bWVyPEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiByZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS5yZXNvbHZlRGVjbGFyYXRpb24odGhpcywgUmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gdG9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGZiMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1EZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aENvbnN0cnVjdG9yczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEltcGxlbWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uUmVzb2x2YWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb25FbXB0eTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGUgZGVjbGFyYXRpb24gb2YgYW4gZW51bS48YnIvPjxjb2RlPmVudW0gWCB7IC4uLiB9PC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW51bURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uPEVudW1EZWNsYXJhdGlvbj4gaW1wbGVtZW50cyBOb2RlV2l0aEltcGxlbWVudHM8RW51bURlY2xhcmF0aW9uPiwgTm9kZVdpdGhDb25zdHJ1Y3RvcnM8RW51bURlY2xhcmF0aW9uPiwgUmVzb2x2YWJsZTxSZXNvbHZlZEVudW1EZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50ZWRUeXBlczsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXM7CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUoKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgU2ltcGxlTmFtZShuYW1lKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50ZWRUeXBlcywgTm9kZUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXMsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIG5hbWUsIGltcGxlbWVudGVkVHlwZXMsIGVudHJpZXMsIG1lbWJlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFNpbXBsZU5hbWUgbmFtZSwgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkVHlwZXMsIE5vZGVMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnRyaWVzLCBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgbmFtZSwgbWVtYmVycyk7CisgICAgICAgIHNldEltcGxlbWVudGVkVHlwZXMoaW1wbGVtZW50ZWRUeXBlcyk7CisgICAgICAgIHNldEVudHJpZXMoZW50cmllcyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBnZXRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gZW50cmllczsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZ2V0RW50cnkoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGdldEVudHJpZXMoKS5nZXQoaSk7CisgICAgfQorCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbiBzZXRFbnRyeShpbnQgaSwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZWxlbWVudCkgeworICAgICAgICBnZXRFbnRyaWVzKCkuc2V0KGksIGVsZW1lbnQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uIGFkZEVudHJ5KEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVsZW1lbnQpIHsKKyAgICAgICAgZ2V0RW50cmllcygpLmFkZChlbGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0SW1wbGVtZW50ZWRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGltcGxlbWVudGVkVHlwZXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbnVtRGVjbGFyYXRpb24gc2V0RW50cmllcyhmaW5hbCBOb2RlTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcykgeworICAgICAgICBhc3NlcnROb3ROdWxsKGVudHJpZXMpOworICAgICAgICBpZiAoZW50cmllcyA9PSB0aGlzLmVudHJpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoRW51bURlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5FTlRSSUVTLCB0aGlzLmVudHJpZXMsIGVudHJpZXMpOworICAgICAgICBpZiAodGhpcy5lbnRyaWVzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5lbnRyaWVzID0gZW50cmllczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZW50cmllcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uIHNldEltcGxlbWVudGVkVHlwZXMoZmluYWwgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkVHlwZXMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbXBsZW1lbnRlZFR5cGVzKTsKKyAgICAgICAgaWYgKGltcGxlbWVudGVkVHlwZXMgPT0gdGhpcy5pbXBsZW1lbnRlZFR5cGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuSU1QTEVNRU5URURfVFlQRVMsIHRoaXMuaW1wbGVtZW50ZWRUeXBlcywgaW1wbGVtZW50ZWRUeXBlcyk7CisgICAgICAgIGlmICh0aGlzLmltcGxlbWVudGVkVHlwZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50ZWRUeXBlcy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmltcGxlbWVudGVkVHlwZXMgPSBpbXBsZW1lbnRlZFR5cGVzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihpbXBsZW1lbnRlZFR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGFkZEVudW1Db25zdGFudChTdHJpbmcgbmFtZSkgeworICAgICAgICBhc3NlcnROb25FbXB0eShuYW1lKTsKKyAgICAgICAgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50ID0gbmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uKG5hbWUpOworICAgICAgICBnZXRFbnRyaWVzKCkuYWRkKGVudW1Db25zdGFudCk7CisgICAgICAgIHJldHVybiBlbnVtQ29uc3RhbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJpZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBlbnRyaWVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcGxlbWVudGVkVHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbXBsZW1lbnRlZFR5cGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWRUeXBlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW50cmllcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGVudHJpZXMuc2V0KGksIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcGxlbWVudGVkVHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbXBsZW1lbnRlZFR5cGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWRUeXBlcy5zZXQoaSwgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzRW51bURlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbiBhc0VudW1EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRW51bURlY2xhcmF0aW9uKENvbnN1bWVyPEVudW1EZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkRW51bURlY2xhcmF0aW9uIHJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xSZXNvbHZlcigpLnJlc29sdmVEZWNsYXJhdGlvbih0aGlzLCBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFbnVtRGVjbGFyYXRpb24+IHRvRW51bURlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9GaWVsZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9GaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLk9wZXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2M7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhWYXJpYWJsZXM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoQWNjZXNzTW9kaWZpZXJzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RhdGljTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Ob25FbXB0eVByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Qubm9kZUxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlJlc29sdmFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBUaGUgZGVjbGFyYXRpb24gb2YgYSBmaWVsZCBpbiBhIGNsYXNzLiAicHJpdmF0ZSBzdGF0aWMgaW50IGE9MTUqMTU7IiBpbiB0aGlzIGV4YW1wbGU6IDxjb2RlPmNsYXNzIFggeyBwcml2YXRlIHN0YXRpYworICogaW50IGE9MTUqMTU7IH08L2NvZGU+CisgKgorICogPGJyLz5BbGwgYW5ub3RhdGlvbnMgcHJlY2VkaW5nIHRoZSB0eXBlIHdpbGwgYmUgc2V0IG9uIHRoaXMgb2JqZWN0LCBub3Qgb24gdGhlIHR5cGUuCisgKiBKYXZhUGFyc2VyIGRvZXNuJ3Qga25vdyBpZiBpdCB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBtZXRob2Qgb3IgdGhlIHR5cGUuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uPEZpZWxkRGVjbGFyYXRpb24+IGltcGxlbWVudHMgTm9kZVdpdGhKYXZhZG9jPEZpZWxkRGVjbGFyYXRpb24+LCBOb2RlV2l0aFZhcmlhYmxlczxGaWVsZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnM8RmllbGREZWNsYXJhdGlvbj4sIE5vZGVXaXRoU3RhdGljTW9kaWZpZXI8RmllbGREZWNsYXJhdGlvbj4sIE5vZGVXaXRoRmluYWxNb2RpZmllcjxGaWVsZERlY2xhcmF0aW9uPiwgUmVzb2x2YWJsZTxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworCisgICAgQE5vbkVtcHR5UHJvcGVydHkKKyAgICBwcml2YXRlIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzOworCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSkgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgbmV3IE5vZGVMaXN0PD4oKSwgbm9kZUxpc3QodmFyaWFibGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCB2YXJpYWJsZXMpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcykgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIHZhcmlhYmxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UsIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIG1vZGlmaWVycworICAgICAqIEBwYXJhbSB0eXBlIHR5cGUKKyAgICAgKiBAcGFyYW0gbmFtZSBmaWVsZCBuYW1lCisgICAgICovCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBUeXBlIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMoYXNzZXJ0Tm90TnVsbChtb2RpZmllcnMpLCBuZXcgVmFyaWFibGVEZWNsYXJhdG9yKHR5cGUsIGFzc2VydE5vdE51bGwobmFtZSkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgbWVtYmVyIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IGdldFZhcmlhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gc2V0TW9kaWZpZXJzKGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycykgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1vZGlmaWVycyk7CisgICAgICAgIGlmIChtb2RpZmllcnMgPT0gdGhpcy5tb2RpZmllcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoRmllbGREZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTU9ESUZJRVJTLCB0aGlzLm1vZGlmaWVycywgbW9kaWZpZXJzKTsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBzZXRWYXJpYWJsZXMoZmluYWwgTm9kZUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYWJsZXMpOworICAgICAgICBpZiAodmFyaWFibGVzID09IHRoaXMudmFyaWFibGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKEZpZWxkRGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlZBUklBQkxFUywgdGhpcy52YXJpYWJsZXMsIHZhcmlhYmxlcyk7CisgICAgICAgIGlmICh0aGlzLnZhcmlhYmxlcyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHZhcmlhYmxlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdldHRlciBmb3IgdGhpcyBmaWVsZCwgPGI+d2lsbCBvbmx5IHdvcmsgaWYgdGhpcyBmaWVsZCBkZWNsYXJlcyBvbmx5IDEgaWRlbnRpZmllciBhbmQgaWYgdGhpcyBmaWVsZCBpcworICAgICAqIGFscmVhZHkgYWRkZWQgdG8gYSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb248L2I+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSB2YXJpYWJsZSBpZGVudGlmaWVyIG9yIGlmIHRoaXMgZmllbGQgaXNuJ3QgYXR0YWNoZWQgdG8gYQorICAgICAqIGNsYXNzIG9yIGVudW0KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gY3JlYXRlR2V0dGVyKCkgeworICAgICAgICBpZiAoZ2V0VmFyaWFibGVzKCkuc2l6ZSgpICE9IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgY2FuIHVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZmllbGQgZGVjbGFyZXMgb25seSAxIHZhcmlhYmxlIG5hbWUiKTsKKyAgICAgICAgT3B0aW9uYWw8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiBwYXJlbnRDbGFzcyA9IGdldEFuY2VzdG9yT2ZUeXBlKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIE9wdGlvbmFsPEVudW1EZWNsYXJhdGlvbj4gcGFyZW50RW51bSA9IGdldEFuY2VzdG9yT2ZUeXBlKEVudW1EZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGlmICghKHBhcmVudENsYXNzLmlzUHJlc2VudCgpIHx8IHBhcmVudEVudW0uaXNQcmVzZW50KCkpIHx8IChwYXJlbnRDbGFzcy5pc1ByZXNlbnQoKSAmJiBwYXJlbnRDbGFzcy5nZXQoKS5pc0ludGVyZmFjZSgpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIllvdSBjYW4gdXNlIHRoaXMgb25seSB3aGVuIHRoZSBmaWVsZCBpcyBhdHRhY2hlZCB0byBhIGNsYXNzIG9yIGFuIGVudW0iKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlID0gZ2V0VmFyaWFibGUoMCk7CisgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSB2YXJpYWJsZS5nZXROYW1lQXNTdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIGZpZWxkTmFtZVVwcGVyID0gZmllbGROYW1lLnRvVXBwZXJDYXNlKCkuc3Vic3RyaW5nKDAsIDEpICsgZmllbGROYW1lLnN1YnN0cmluZygxLCBmaWVsZE5hbWUubGVuZ3RoKCkpOworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBnZXR0ZXI7CisgICAgICAgIGdldHRlciA9IHBhcmVudENsYXNzLm1hcChjbGF6eiAtPiBjbGF6ei5hZGRNZXRob2QoImdldCIgKyBmaWVsZE5hbWVVcHBlciwgUFVCTElDKSkub3JFbHNlR2V0KCgpIC0+IHBhcmVudEVudW0uZ2V0KCkuYWRkTWV0aG9kKCJnZXQiICsgZmllbGROYW1lVXBwZXIsIFBVQkxJQykpOworICAgICAgICBnZXR0ZXIuc2V0VHlwZSh2YXJpYWJsZS5nZXRUeXBlKCkpOworICAgICAgICBCbG9ja1N0bXQgYmxvY2tTdG10ID0gbmV3IEJsb2NrU3RtdCgpOworICAgICAgICBnZXR0ZXIuc2V0Qm9keShibG9ja1N0bXQpOworICAgICAgICBibG9ja1N0bXQuYWRkU3RhdGVtZW50KG5ldyBSZXR1cm5TdG10KGZpZWxkTmFtZSkpOworICAgICAgICByZXR1cm4gZ2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNldHRlciBmb3IgdGhpcyBmaWVsZCwgPGI+d2lsbCBvbmx5IHdvcmsgaWYgdGhpcyBmaWVsZCBkZWNsYXJlcyBvbmx5IDEgaWRlbnRpZmllciBhbmQgaWYgdGhpcyBmaWVsZCBpcworICAgICAqIGFscmVhZHkgYWRkZWQgdG8gYSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb248L2I+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSB2YXJpYWJsZSBpZGVudGlmaWVyIG9yIGlmIHRoaXMgZmllbGQgaXNuJ3QgYXR0YWNoZWQgdG8gYQorICAgICAqIGNsYXNzIG9yIGVudW0KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gY3JlYXRlU2V0dGVyKCkgeworICAgICAgICBpZiAoZ2V0VmFyaWFibGVzKCkuc2l6ZSgpICE9IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgY2FuIHVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZmllbGQgZGVjbGFyZXMgb25seSAxIHZhcmlhYmxlIG5hbWUiKTsKKyAgICAgICAgT3B0aW9uYWw8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiBwYXJlbnRDbGFzcyA9IGdldEFuY2VzdG9yT2ZUeXBlKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIE9wdGlvbmFsPEVudW1EZWNsYXJhdGlvbj4gcGFyZW50RW51bSA9IGdldEFuY2VzdG9yT2ZUeXBlKEVudW1EZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGlmICghKHBhcmVudENsYXNzLmlzUHJlc2VudCgpIHx8IHBhcmVudEVudW0uaXNQcmVzZW50KCkpIHx8IChwYXJlbnRDbGFzcy5pc1ByZXNlbnQoKSAmJiBwYXJlbnRDbGFzcy5nZXQoKS5pc0ludGVyZmFjZSgpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIllvdSBjYW4gdXNlIHRoaXMgb25seSB3aGVuIHRoZSBmaWVsZCBpcyBhdHRhY2hlZCB0byBhIGNsYXNzIG9yIGFuIGVudW0iKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlID0gZ2V0VmFyaWFibGUoMCk7CisgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSB2YXJpYWJsZS5nZXROYW1lQXNTdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIGZpZWxkTmFtZVVwcGVyID0gZmllbGROYW1lLnRvVXBwZXJDYXNlKCkuc3Vic3RyaW5nKDAsIDEpICsgZmllbGROYW1lLnN1YnN0cmluZygxLCBmaWVsZE5hbWUubGVuZ3RoKCkpOworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXI7CisgICAgICAgIHNldHRlciA9IHBhcmVudENsYXNzLm1hcChjbGF6eiAtPiBjbGF6ei5hZGRNZXRob2QoInNldCIgKyBmaWVsZE5hbWVVcHBlciwgUFVCTElDKSkub3JFbHNlR2V0KCgpIC0+IHBhcmVudEVudW0uZ2V0KCkuYWRkTWV0aG9kKCJzZXQiICsgZmllbGROYW1lVXBwZXIsIFBVQkxJQykpOworICAgICAgICBzZXR0ZXIuc2V0VHlwZShuZXcgVm9pZFR5cGUoKSk7CisgICAgICAgIHNldHRlci5nZXRQYXJhbWV0ZXJzKCkuYWRkKG5ldyBQYXJhbWV0ZXIodmFyaWFibGUuZ2V0VHlwZSgpLCBmaWVsZE5hbWUpKTsKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrU3RtdDIgPSBuZXcgQmxvY2tTdG10KCk7CisgICAgICAgIHNldHRlci5zZXRCb2R5KGJsb2NrU3RtdDIpOworICAgICAgICBibG9ja1N0bXQyLmFkZFN0YXRlbWVudChuZXcgQXNzaWduRXhwcihuZXcgTmFtZUV4cHIoInRoaXMuIiArIGZpZWxkTmFtZSksIG5ldyBOYW1lRXhwcihmaWVsZE5hbWUpLCBPcGVyYXRvci5BU1NJR04pKTsKKyAgICAgICAgcmV0dXJuIHNldHRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKFRSQU5TSUVOVCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2xhdGlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKFZPTEFUSUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBzZXRUcmFuc2llbnQoYm9vbGVhbiBzZXQpIHsKKyAgICAgICAgcmV0dXJuIHNldE1vZGlmaWVyKFRSQU5TSUVOVCwgc2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBzZXRWb2xhdGlsZShib29sZWFuIHNldCkgeworICAgICAgICByZXR1cm4gc2V0TW9kaWZpZXIoVk9MQVRJTEUsIHNldCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodmFyaWFibGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZERlY2xhcmF0aW9uKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZXMuc2V0KGksIChWYXJpYWJsZURlY2xhcmF0b3IpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gYXNGaWVsZERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZGaWVsZERlY2xhcmF0aW9uKENvbnN1bWVyPEZpZWxkRGVjbGFyYXRpb24+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkucmVzb2x2ZURlY2xhcmF0aW9uKHRoaXMsIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxGaWVsZERlY2xhcmF0aW9uPiB0b0ZpZWxkRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0luaXRpYWxpemVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZlNzhlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0luaXRpYWxpemVyRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2M7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIChwb3NzaWJseSBzdGF0aWMpIGluaXRpYWxpemVyIGJvZHkuICJzdGF0aWMgeyBhPTM7IH0iIGluIHRoaXMgZXhhbXBsZTogPGNvZGU+Y2xhc3MgWCB7IHN0YXRpYyB7IGE9MzsgfSAgfSA8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbml0aWFsaXplckRlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uPEluaXRpYWxpemVyRGVjbGFyYXRpb24+IGltcGxlbWVudHMgTm9kZVdpdGhKYXZhZG9jPEluaXRpYWxpemVyRGVjbGFyYXRpb24+LCBOb2RlV2l0aEJsb2NrU3RtdDxJbml0aWFsaXplckRlY2xhcmF0aW9uPiB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWM7CisKKyAgICBwcml2YXRlIEJsb2NrU3RtdCBib2R5OworCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHRoaXMobnVsbCwgZmFsc2UsIG5ldyBCbG9ja1N0bXQoKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24oYm9vbGVhbiBpc1N0YXRpYywgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgdGhpcyhudWxsLCBpc1N0YXRpYywgYm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbml0aWFsaXplckRlY2xhcmF0aW9uKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgYm9vbGVhbiBpc1N0YXRpYywgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFN0YXRpYyhpc1N0YXRpYyk7CisgICAgICAgIHNldEJvZHkoYm9keSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrU3RtdCBnZXRCb2R5KCkgeworICAgICAgICByZXR1cm4gYm9keTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBpc1N0YXRpYzsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24gc2V0Qm9keShmaW5hbCBCbG9ja1N0bXQgYm9keSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGJvZHkpOworICAgICAgICBpZiAoYm9keSA9PSB0aGlzLmJvZHkpIHsKKyAgICAgICAgICAgIHJldHVybiAoSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSwgdGhpcy5ib2R5LCBib2R5KTsKKyAgICAgICAgaWYgKHRoaXMuYm9keSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5ib2R5LnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGJvZHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24gc2V0U3RhdGljKGZpbmFsIGJvb2xlYW4gaXNTdGF0aWMpIHsKKyAgICAgICAgaWYgKGlzU3RhdGljID09IHRoaXMuaXNTdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiAoSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuU1RBVElDLCB0aGlzLmlzU3RhdGljLCBpc1N0YXRpYyk7CisgICAgICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbml0aWFsaXplckRlY2xhcmF0aW9uIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEluaXRpYWxpemVyRGVjbGFyYXRpb24pIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5pbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBib2R5KSB7CisgICAgICAgICAgICBzZXRCb2R5KChCbG9ja1N0bXQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBhc0luaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkluaXRpYWxpemVyRGVjbGFyYXRpb24oQ29uc3VtZXI8SW5pdGlhbGl6ZXJEZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJbml0aWFsaXplckRlY2xhcmF0aW9uPiB0b0luaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NZXRob2REZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjRjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvTWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTcgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBBIG1ldGhvZCBkZWNsYXJhdGlvbi4gInB1YmxpYyBpbnQgYWJjKCkge3JldHVybiAxO30iIGluIHRoaXMgZXhhbXBsZTogPGNvZGU+Y2xhc3MgWCB7IHB1YmxpYyBpbnQgYWJjKCkge3JldHVybiAxO30KKyAqIH08L2NvZGU+CisgKgorICogPGJyLz5BbGwgYW5ub3RhdGlvbnMgcHJlY2VkaW5nIHRoZSByZXR1cm4gdHlwZSB3aWxsIGJlIHNldCBvbiB0aGlzIG9iamVjdCwgbm90IG9uIHRoZSByZXR1cm4gdHlwZS4KKyAqIEphdmFQYXJzZXIgZG9lc24ndCBrbm93IGlmIGl0IHRoZXkgYXJlIGFwcGxpY2FibGUgdG8gdGhlIG1ldGhvZCBvciB0aGUgdHlwZS4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZERlY2xhcmF0aW9uIGV4dGVuZHMgQ2FsbGFibGVEZWNsYXJhdGlvbjxNZXRob2REZWNsYXJhdGlvbj4gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGU8TWV0aG9kRGVjbGFyYXRpb24sIFR5cGU+LCBOb2RlV2l0aE9wdGlvbmFsQmxvY2tTdG10PE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhKYXZhZG9jPE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhEZWNsYXJhdGlvbiwgTm9kZVdpdGhTaW1wbGVOYW1lPE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhQYXJhbWV0ZXJzPE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zPE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhUeXBlUGFyYW1ldGVyczxNZXRob2REZWNsYXJhdGlvbj4sIE5vZGVXaXRoQWNjZXNzTW9kaWZpZXJzPE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyPE1ldGhvZERlY2xhcmF0aW9uPiwgTm9kZVdpdGhTdGF0aWNNb2RpZmllcjxNZXRob2REZWNsYXJhdGlvbj4sIE5vZGVXaXRoRmluYWxNb2RpZmllcjxNZXRob2REZWNsYXJhdGlvbj4sIE5vZGVXaXRoU3RyaWN0ZnBNb2RpZmllcjxNZXRob2REZWNsYXJhdGlvbj4sIFJlc29sdmFibGU8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgQmxvY2tTdG10IGJvZHk7CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoKSwgbmV3IFNpbXBsZU5hbWUoKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IEJsb2NrU3RtdCgpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpLCB0eXBlLCBuZXcgU2ltcGxlTmFtZShuYW1lKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IEJsb2NrU3RtdCgpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBtb2RpZmllcnMsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBOb2RlTGlzdDw+KCksIHR5cGUsIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBwYXJhbWV0ZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgQmxvY2tTdG10KCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbihmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgZmluYWwgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgU2ltcGxlTmFtZSBuYW1lLCBmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIGZpbmFsIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93bkV4Y2VwdGlvbnMsIGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIHR5cGUsIG5hbWUsIHBhcmFtZXRlcnMsIHRocm93bkV4Y2VwdGlvbnMsIGJvZHksIG51bGwpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbihmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgZmluYWwgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgU2ltcGxlTmFtZSBuYW1lLCBmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIGZpbmFsIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93bkV4Y2VwdGlvbnMsIGZpbmFsIEJsb2NrU3RtdCBib2R5LCBSZWNlaXZlclBhcmFtZXRlciByZWNlaXZlclBhcmFtZXRlcikgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlLCBuYW1lLCBwYXJhbWV0ZXJzLCB0aHJvd25FeGNlcHRpb25zLCBib2R5LCByZWNlaXZlclBhcmFtZXRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgeW91IHRvIHNldCAiaXNEZWZhdWx0IiwgYnV0IHRoaXMgaXMgbm8gbG9uZ2VyIGEgZmllbGQgb2YgdGhpcyBub2RlLCBidXQgc2ltcGx5IG9uZSBvZiB0aGUgbW9kaWZpZXJzLiBVc2Ugc2V0RGVmYXVsdChib29sZWFuKSBvciBhZGQgREVGQVVMVCB0byB0aGUgbW9kaWZpZXJzIHNldC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbihmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgZmluYWwgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgU2ltcGxlTmFtZSBuYW1lLCBmaW5hbCBib29sZWFuIGlzRGVmYXVsdCwgZmluYWwgTm9kZUxpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBmaW5hbCBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zLCBmaW5hbCBCbG9ja1N0bXQgYm9keSkgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlLCBuYW1lLCBwYXJhbWV0ZXJzLCB0aHJvd25FeGNlcHRpb25zLCBib2R5LCBudWxsKTsKKyAgICAgICAgc2V0RGVmYXVsdChpc0RlZmF1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIFR5cGUgdHlwZSwgU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93bkV4Y2VwdGlvbnMsIEJsb2NrU3RtdCBib2R5LCBSZWNlaXZlclBhcmFtZXRlciByZWNlaXZlclBhcmFtZXRlcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCB0eXBlUGFyYW1ldGVycywgbmFtZSwgcGFyYW1ldGVycywgdGhyb3duRXhjZXB0aW9ucywgcmVjZWl2ZXJQYXJhbWV0ZXIpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXRCb2R5KGJvZHkpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxCbG9ja1N0bXQ+IGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGJvZHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJvZHkKKyAgICAgKgorICAgICAqIEBwYXJhbSBib2R5IHRoZSBib2R5LCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIE1ldGhvZERlY2xhcmF0aW9uCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXRCb2R5KGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIGlmIChib2R5ID09IHRoaXMuYm9keSkgeworICAgICAgICAgICAgcmV0dXJuIChNZXRob2REZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSwgdGhpcy5ib2R5LCBib2R5KTsKKyAgICAgICAgaWYgKHRoaXMuYm9keSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5ib2R5LnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGJvZHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXRUeXBlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOworICAgICAgICBpZiAodHlwZSA9PSB0aGlzLnR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0aG9kRGVjbGFyYXRpb24pIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUsIHRoaXMudHlwZSwgdHlwZSk7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIHNldE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXROYW1lKGZpbmFsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0UGFyYW1ldGVycyhmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIHNldFRocm93bkV4Y2VwdGlvbnMoZmluYWwgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3duRXhjZXB0aW9ucykgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0VGhyb3duRXhjZXB0aW9ucyh0aHJvd25FeGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0VHlwZVBhcmFtZXRlcnMoZmluYWwgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVjbGFyYXRpb24gcmV0dXJuZWQgaGFzIHRoaXMgc2NoZW1hOgorICAgICAqIDxwPgorICAgICAqIFthY2Nlc3NTcGVjaWZpZXJdIFtzdGF0aWNdIFthYnN0cmFjdF0gW2ZpbmFsXSBbbmF0aXZlXQorICAgICAqIFtzeW5jaHJvbml6ZWRdIHJldHVyblR5cGUgbWV0aG9kTmFtZSAoW3BhcmFtVHlwZSBbcGFyYW1OYW1lXV0pCisgICAgICogW3Rocm93cyBleGNlcHRpb25zTGlzdF0KKyAgICAgKgorICAgICAqIEByZXR1cm4gbWV0aG9kIGRlY2xhcmF0aW9uIGFzIFN0cmluZworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuIGluY2x1ZGluZ01vZGlmaWVycywgYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MsIGJvb2xlYW4gaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGluY2x1ZGluZ01vZGlmaWVycykgeworICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllciA9IGdldEFjY2Vzc1NwZWNpZmllcihnZXRNb2RpZmllcnMoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyLmFzU3RyaW5nKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKGFjY2Vzc1NwZWNpZmllciA9PSBBY2Nlc3NTcGVjaWZpZXIuREVGQVVMVCA/ICIiIDogIiAiKTsKKyAgICAgICAgICAgIGlmIChnZXRNb2RpZmllcnMoKS5jb250YWlucyhTVEFUSUMpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJzdGF0aWMgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoQUJTVFJBQ1QpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJhYnN0cmFjdCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRNb2RpZmllcnMoKS5jb250YWlucyhGSU5BTCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoImZpbmFsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE5BVElWRSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm5hdGl2ZSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRNb2RpZmllcnMoKS5jb250YWlucyhTWU5DSFJPTklaRUQpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKGdldFR5cGUoKS50b1N0cmluZyhwcmV0dHlQcmludGVyTm9Db21tZW50c0NvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIigiKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdFBhcmFtID0gdHJ1ZTsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBnZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdFBhcmFtKSB7CisgICAgICAgICAgICAgICAgZmlyc3RQYXJhbSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbS50b1N0cmluZyhwcmV0dHlQcmludGVyTm9Db21tZW50c0NvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtLmdldFR5cGUoKS50b1N0cmluZyhwcmV0dHlQcmludGVyTm9Db21tZW50c0NvbmZpZ3VyYXRpb24pKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uaXNWYXJBcmdzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIuLi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHNiLmFwcGVuZChhcHBlbmRUaHJvd3NJZlJlcXVlc3RlZChpbmNsdWRpbmdUaHJvd3MpKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOYXRpdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnMoKS5jb250YWlucyhOQVRJVkUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoU1lOQ0hST05JWkVEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnMoKS5jb250YWlucyhERUZBVUxUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0TmF0aXZlKGJvb2xlYW4gc2V0KSB7CisgICAgICAgIHJldHVybiBzZXRNb2RpZmllcihOQVRJVkUsIHNldCk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIHNldFN5bmNocm9uaXplZChib29sZWFuIHNldCkgeworICAgICAgICByZXR1cm4gc2V0TW9kaWZpZXIoU1lOQ0hST05JWkVELCBzZXQpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXREZWZhdWx0KGJvb2xlYW4gc2V0KSB7CisgICAgICAgIHJldHVybiBzZXRNb2RpZmllcihERUZBVUxULCBzZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBib2R5KSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQm9keSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gcmVtb3ZlQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIHNldEJvZHkoKEJsb2NrU3RtdCkgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZXRob2REZWNsYXJhdGlvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5tZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gYm9keSkgeworICAgICAgICAgICAgICAgIHNldEJvZHkoKEJsb2NrU3RtdCkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBzZXRUeXBlKChUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2REZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBhc01ldGhvZERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNZXRob2REZWNsYXJhdGlvbihDb25zdW1lcjxNZXRob2REZWNsYXJhdGlvbj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkucmVzb2x2ZURlY2xhcmF0aW9uKHRoaXMsIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TWV0aG9kRGVjbGFyYXRpb24+IHRvTWV0aG9kRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvUGFyYW1ldGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjZjM1NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5QYXJhbWV0ZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlJlc29sdmFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb247CisKKy8qKgorICogVGhlIHBhcmFtZXRlcnMgdG8gYSBtZXRob2Qgb3IgbGFtYmRhLiBMYW1iZGEgcGFyYW1ldGVycyBtYXkgaGF2ZSBpbmZlcnJlZCB0eXBlcywgaW4gdGhhdCBjYXNlICJ0eXBlIiBpcyBVbmtub3duVHlwZS4KKyAqIDxici8+Tm90ZSB0aGF0IDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhcmFtZXRlcl8oY29tcHV0ZXJfcHJvZ3JhbW1pbmcpI1BhcmFtZXRlcnNfYW5kX2FyZ3VtZW50cyI+cGFyYW1ldGVycworICogYXJlIGRpZmZlcmVudCBmcm9tIGFyZ3VtZW50cy48L2E+IDxici8+IlN0cmluZyB4IiBhbmQgImZsb2F0IHkiIGFyZSB0aGUgcGFyYW1ldGVycyBpbiA8Y29kZT5pbnQgYWJjKFN0cmluZyB4LCBmbG9hdAorICogeSkgey4uLn08L2NvZGU+CisgKgorICogPGJyLz5BbGwgYW5ub3RhdGlvbnMgcHJlY2VkaW5nIHRoZSB0eXBlIHdpbGwgYmUgc2V0IG9uIHRoaXMgb2JqZWN0LCBub3Qgb24gdGhlIHR5cGUuCisgKiBKYXZhUGFyc2VyIGRvZXNuJ3Qga25vdyBpZiBpdCB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBwYXJhbWV0ZXIgb3IgdGhlIHR5cGUuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhUeXBlPFBhcmFtZXRlciwgVHlwZT4sIE5vZGVXaXRoQW5ub3RhdGlvbnM8UGFyYW1ldGVyPiwgTm9kZVdpdGhTaW1wbGVOYW1lPFBhcmFtZXRlcj4sIE5vZGVXaXRoRmluYWxNb2RpZmllcjxQYXJhbWV0ZXI+LCBSZXNvbHZhYmxlPFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFyQXJnczsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IHZhckFyZ3NBbm5vdGF0aW9uczsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICBwcml2YXRlIFNpbXBsZU5hbWUgbmFtZTsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoKSwgZmFsc2UsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoVHlwZSB0eXBlLCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIG5ldyBOb2RlTGlzdDw+KCksIHR5cGUsIGZhbHNlLCBuZXcgTm9kZUxpc3Q8PigpLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQYXJhbWV0ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlcihUeXBlIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCB0eXBlLCBmYWxzZSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUobmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBUeXBlIHR5cGUsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgbmV3IE5vZGVMaXN0PD4oKSwgdHlwZSwgZmFsc2UsIG5ldyBOb2RlTGlzdDw+KCksIG5hbWUpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBQYXJhbWV0ZXIoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFR5cGUgdHlwZSwgYm9vbGVhbiBpc1ZhckFyZ3MsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiB2YXJBcmdzQW5ub3RhdGlvbnMsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIHR5cGUsIGlzVmFyQXJncywgdmFyQXJnc0Fubm90YXRpb25zLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFBhcmFtZXRlcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIGJvb2xlYW4gaXNWYXJBcmdzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gdmFyQXJnc0Fubm90YXRpb25zLCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldFZhckFyZ3MoaXNWYXJBcmdzKTsKKyAgICAgICAgc2V0VmFyQXJnc0Fubm90YXRpb25zKHZhckFyZ3NBbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVmFyQXJncygpIHsKKyAgICAgICAgcmV0dXJuIGlzVmFyQXJnczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFBhcmFtZXRlciBzZXRUeXBlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOworICAgICAgICBpZiAodHlwZSA9PSB0aGlzLnR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoUGFyYW1ldGVyKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFLCB0aGlzLnR5cGUsIHR5cGUpOworICAgICAgICBpZiAodGhpcy50eXBlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldFZhckFyZ3MoZmluYWwgYm9vbGVhbiBpc1ZhckFyZ3MpIHsKKyAgICAgICAgaWYgKGlzVmFyQXJncyA9PSB0aGlzLmlzVmFyQXJncykgeworICAgICAgICAgICAgcmV0dXJuIChQYXJhbWV0ZXIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlZBUl9BUkdTLCB0aGlzLmlzVmFyQXJncywgaXNWYXJBcmdzKTsKKyAgICAgICAgdGhpcy5pc1ZhckFyZ3MgPSBpc1ZhckFyZ3M7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3QgcmV0dXJuZWQgY291bGQgYmUgaW1tdXRhYmxlIChpbiB0aGF0IGNhc2UgaXQgd2lsbCBiZSBlbXB0eSkKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhIG51bGwgdmFsdWUgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgYW4gZW1wdHkgbGlzdC4gVGhpcyBiZWhhdmlvciBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAgICAgKiBzbyBwbGVhc2UgYXZvaWQgcGFzc2luZyBudWxsCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYXJhbWV0ZXIgc2V0QW5ub3RhdGlvbnMoZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOworICAgICAgICBpZiAoYW5ub3RhdGlvbnMgPT0gdGhpcy5hbm5vdGF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIChQYXJhbWV0ZXIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkFOTk9UQVRJT05TLCB0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmFubm90YXRpb25zLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFBhcmFtZXRlciBzZXROYW1lKGZpbmFsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoUGFyYW1ldGVyKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2RpZmllcnMpOworICAgICAgICBpZiAobW9kaWZpZXJzID09IHRoaXMubW9kaWZpZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKFBhcmFtZXRlcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTU9ESUZJRVJTLCB0aGlzLm1vZGlmaWVycywgbW9kaWZpZXJzKTsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJBcmdzQW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YXJBcmdzQW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB2YXJBcmdzQW5ub3RhdGlvbnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0VmFyQXJnc0Fubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gdmFyQXJnc0Fubm90YXRpb25zOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldFZhckFyZ3NBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gdmFyQXJnc0Fubm90YXRpb25zKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyQXJnc0Fubm90YXRpb25zKTsKKyAgICAgICAgaWYgKHZhckFyZ3NBbm5vdGF0aW9ucyA9PSB0aGlzLnZhckFyZ3NBbm5vdGF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIChQYXJhbWV0ZXIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlZBUl9BUkdTX0FOTk9UQVRJT05TLCB0aGlzLnZhckFyZ3NBbm5vdGF0aW9ucywgdmFyQXJnc0Fubm90YXRpb25zKTsKKyAgICAgICAgaWYgKHRoaXMudmFyQXJnc0Fubm90YXRpb25zICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnZhckFyZ3NBbm5vdGF0aW9ucy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnZhckFyZ3NBbm5vdGF0aW9ucyA9IHZhckFyZ3NBbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodmFyQXJnc0Fubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYXJhbWV0ZXIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoUGFyYW1ldGVyKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQYXJhbWV0ZXJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5wYXJhbWV0ZXJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoU2ltcGxlTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IHR5cGUpIHsKKyAgICAgICAgICAgIHNldFR5cGUoKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhckFyZ3NBbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhckFyZ3NBbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHZhckFyZ3NBbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24gcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkucmVzb2x2ZURlY2xhcmF0aW9uKHRoaXMsIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9SZWNlaXZlclBhcmFtZXRlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L1JlY2VpdmVyUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwMzhlMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9SZWNlaXZlclBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5QYXJhbWV0ZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWw7CisKKy8qKgorICogVGhlIHJhdGhlciBvYnNjdXJlIDxhIGhyZWY9Imh0dHA6Ly9ibG9nLmpvZGEub3JnLzIwMTUvMTIvZXhwbGljaXQtcmVjZWl2ZXItcGFyYW1ldGVycy5odG1sIj4icmVjZWl2ZXIgcGFyYW1ldGVyIiBmZWF0dXJlIG9mIEphdmE8L2E+LgorICoKKyAqIDxici8+QWxsIGFubm90YXRpb25zIHByZWNlZGluZyB0aGUgdHlwZSB3aWxsIGJlIHNldCBvbiB0aGlzIG9iamVjdCwgbm90IG9uIHRoZSB0eXBlLgorICogSmF2YVBhcnNlciBkb2Vzbid0IGtub3cgaWYgaXQgdGhleSBhcmUgYXBwbGljYWJsZSB0byB0aGUgcmVjZWl2ZXIgcGFyYW1ldGVyIG9yIHRoZSB0eXBlLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVjZWl2ZXJQYXJhbWV0ZXIgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhUeXBlPFJlY2VpdmVyUGFyYW1ldGVyLCBUeXBlPiwgTm9kZVdpdGhBbm5vdGF0aW9uczxSZWNlaXZlclBhcmFtZXRlcj4sIE5vZGVXaXRoTmFtZTxSZWNlaXZlclBhcmFtZXRlcj4geworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKworICAgIHByaXZhdGUgTmFtZSBuYW1lOworCisgICAgcHVibGljIFJlY2VpdmVyUGFyYW1ldGVyKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpLCBuZXcgTmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjZWl2ZXJQYXJhbWV0ZXIoVHlwZSB0eXBlLCBOYW1lIG5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCB0eXBlLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBSZWNlaXZlclBhcmFtZXRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVjZWl2ZXJQYXJhbWV0ZXIoVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIHR5cGUsIG5ldyBOYW1lKG5hbWUpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgUmVjZWl2ZXJQYXJhbWV0ZXIoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIE5hbWUgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIGFubm90YXRpb25zLCB0eXBlLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFJlY2VpdmVyUGFyYW1ldGVyKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIE5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmVjZWl2ZXJQYXJhbWV0ZXIgc2V0VHlwZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlY2VpdmVyUGFyYW1ldGVyKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFLCB0aGlzLnR5cGUsIHR5cGUpOworICAgICAgICBpZiAodGhpcy50eXBlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3QgcmV0dXJuZWQgY291bGQgYmUgaW1tdXRhYmxlIChpbiB0aGF0IGNhc2UgaXQgd2lsbCBiZSBlbXB0eSkKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhIG51bGwgdmFsdWUgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgYW4gZW1wdHkgbGlzdC4gVGhpcyBiZWhhdmlvciBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAgICAgKiBzbyBwbGVhc2UgYXZvaWQgcGFzc2luZyBudWxsCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZWNlaXZlclBhcmFtZXRlciBzZXRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSB0aGlzLmFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlY2VpdmVyUGFyYW1ldGVyKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgdGhpcy5hbm5vdGF0aW9ucywgYW5ub3RhdGlvbnMpOworICAgICAgICBpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZWNlaXZlclBhcmFtZXRlciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChSZWNlaXZlclBhcmFtZXRlcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5yZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZWNlaXZlclBhcmFtZXRlciBzZXROYW1lKGZpbmFsIE5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVjZWl2ZXJQYXJhbWV0ZXIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IG5hbWUpIHsKKyAgICAgICAgICAgIHNldE5hbWUoKE5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBzZXRUeXBlKChUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmOTc1MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhZG9jOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoQWNjZXNzTW9kaWZpZXJzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFN0YXRpY01vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFN0cmljdGZwTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5UeXBlRGVjbGFyYXRpb25NZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIHR5cGVzIG9mIHR5cGUgZGVjbGFyYXRpb25zLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZURlY2xhcmF0aW9uPFQgZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb248Pz4+IGV4dGVuZHMgQm9keURlY2xhcmF0aW9uPFQ+IGltcGxlbWVudHMgTm9kZVdpdGhTaW1wbGVOYW1lPFQ+LCBOb2RlV2l0aEphdmFkb2M8VD4sIE5vZGVXaXRoTWVtYmVyczxUPiwgTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnM8VD4sIE5vZGVXaXRoU3RhdGljTW9kaWZpZXI8VD4sIE5vZGVXaXRoU3RyaWN0ZnBNb2RpZmllcjxUPiB7CisKKyAgICBwcml2YXRlIFNpbXBsZU5hbWUgbmFtZTsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnM7CisKKyAgICBwdWJsaWMgVHlwZURlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUoKSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIFR5cGVEZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgU2ltcGxlTmFtZShuYW1lKSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFR5cGVEZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCBuYW1lLCBtZW1iZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVEZWNsYXJhdGlvbihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRNZW1iZXJzKG1lbWJlcnMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNsIG1lbWJlciBkZWNsYXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBUIGFkZE1lbWJlcihCb2R5RGVjbGFyYXRpb248Pz4gZGVjbCkgeworICAgICAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7CisgICAgICAgIG1lbWJlcnMuYWRkKGRlY2wpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGdldE1lbWJlcnMoKSB7CisgICAgICAgIHJldHVybiBtZW1iZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgdHlwZSBkZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgVCBzZXRNZW1iZXJzKGZpbmFsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICBhc3NlcnROb3ROdWxsKG1lbWJlcnMpOworICAgICAgICBpZiAobWVtYmVycyA9PSB0aGlzLm1lbWJlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTUVNQkVSUywgdGhpcy5tZW1iZXJzLCBtZW1iZXJzKTsKKyAgICAgICAgaWYgKHRoaXMubWVtYmVycyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5tZW1iZXJzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG1lbWJlcnMpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBUIHNldE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2RpZmllcnMpOworICAgICAgICBpZiAobW9kaWZpZXJzID09IHRoaXMubW9kaWZpZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk1PRElGSUVSUywgdGhpcy5tb2RpZmllcnMsIG1vZGlmaWVycyk7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBUIHNldE5hbWUoZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IHRoaXMubmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFNpbXBsZU5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1lbWJlcnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaXMgdGhpcyB0eXBlJ3MgcGFyZW50IGEgQ29tcGlsYXRpb25Vbml0PworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVG9wTGV2ZWxUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50Tm9kZSgpLm1hcChwIC0+IHAgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpLm9yRWxzZShmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBtZXRob2RzIG9yIGNvbnN0cnVjdG9ycyB3aG9zZSBzaWduYXR1cmVzIG1hdGNoIHRoZSBwYXNzZWQgc2lnbmF0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENhbGxhYmxlRGVjbGFyYXRpb248Pz4+IGdldENhbGxhYmxlc1dpdGhTaWduYXR1cmUoQ2FsbGFibGVEZWNsYXJhdGlvbi5TaWduYXR1cmUgc2lnbmF0dXJlKSB7CisgICAgICAgIHJldHVybiBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIENhbGxhYmxlRGVjbGFyYXRpb24pLm1hcChtIC0+ICgoQ2FsbGFibGVEZWNsYXJhdGlvbjw/PikgbSkpLmZpbHRlcihtIC0+IG0uZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKHNpZ25hdHVyZSkpLmNvbGxlY3QodG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaXMgdGhpcyB0eXBlJ3MgcGFyZW50IGEgVHlwZURlY2xhcmF0aW9uPworICAgICAqIE5PVEU6IG1hbnkgcGVvcGxlIGFyZSBjb25mdXNlZCBvdmVyIHRlcm1pbm9sb2d5LiBSZWZlciB0byBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvdHV0b3JpYWwvamF2YS9qYXZhT08vbmVzdGVkLmh0bWwgLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmVzdGVkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudE5vZGUoKS5tYXAocCAtPiBwIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKS5vckVsc2UoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZURlY2xhcmF0aW9uPD8+IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFR5cGVEZWNsYXJhdGlvbjw/PikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwudHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgbWVtYmVycy5zZXQoaSwgKEJvZHlEZWNsYXJhdGlvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKChTaW1wbGVOYW1lKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGFzVHlwZURlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZUeXBlRGVjbGFyYXRpb24oQ29uc3VtZXI8VHlwZURlY2xhcmF0aW9uPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbj4gdG9UeXBlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzNDJhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9WYXJpYWJsZURlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVmFyaWFibGVzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuQXN0T2JzZXJ2ZXJBZGFwdGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTm9uRW1wdHlQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk9wdGlvbmFsUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5WYXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWw7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm9uRW1wdHk7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlJlc29sdmFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkRmllbGREZWNsYXJhdGlvbjsKKworLyoqCisgKiBUaGUgZGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZS48YnIvPkluIDxjb2RlPmludCB4ID0gMTQsIHkgPSAzOzwvY29kZT4gImludCB4ID0gMTQiICBhbmQgImludCB5ID0gMyIgIGFyZQorICogVmFyaWFibGVEZWNsYXJhdG9ycy4KKyAqIDxwLz5UaGUgdHlwZSBpcyBvbiBhbGwgb2YgdGhlIHZhcmlhYmxlIGRlY2xhcmF0b3JzIGJlY2F1c2UsIHRoYW5rcyB0byBhcnJheSBicmFja2V0cywgZWFjaCB2YXJpYWJsZSBjYW4gaGF2ZSBhIGRpZmZlcmVudCB0eXBlLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmFyaWFibGVEZWNsYXJhdG9yIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZTxWYXJpYWJsZURlY2xhcmF0b3IsIFR5cGU+LCBOb2RlV2l0aFNpbXBsZU5hbWU8VmFyaWFibGVEZWNsYXJhdG9yPiwgUmVzb2x2YWJsZTxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgU2ltcGxlTmFtZSBuYW1lOworCisgICAgQE9wdGlvbmFsUHJvcGVydHkKKyAgICBATm9uRW1wdHlQcm9wZXJ0eQorICAgIHByaXZhdGUgRXhwcmVzc2lvbiBpbml0aWFsaXplcjsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoKSwgbmV3IFNpbXBsZU5hbWUoKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihUeXBlIHR5cGUsIFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCB0eXBlLCBuZXcgU2ltcGxlTmFtZSh2YXJpYWJsZU5hbWUpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yKFR5cGUgdHlwZSwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgdHlwZSwgbmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihUeXBlIHR5cGUsIFN0cmluZyB2YXJpYWJsZU5hbWUsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgdGhpcyhudWxsLCB0eXBlLCBuZXcgU2ltcGxlTmFtZSh2YXJpYWJsZU5hbWUpLCBpbml0aWFsaXplcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgZGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHZhcmlhYmxlLiBJRS4gVGhlIHZhcmlhYmxlcyBuYW1lLgorICAgICAqIEBwYXJhbSBpbml0aWFsaXplciBXaGF0IHRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvLiBBbiB7QGxpbmsgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHJ9CisgICAgICogaXMgdW5uZWNlc3NhcnkgYXMgdGhlIDxjb2RlPj08L2NvZGU+IG9wZXJhdG9yIGlzIGFscmVhZHkgYWRkZWQuCisgICAgICovCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihUeXBlIHR5cGUsIFNpbXBsZU5hbWUgbmFtZSwgRXhwcmVzc2lvbiBpbml0aWFsaXplcikgeworICAgICAgICB0aGlzKG51bGwsIHR5cGUsIG5hbWUsIGluaXRpYWxpemVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFR5cGUgdHlwZSwgU2ltcGxlTmFtZSBuYW1lLCBFeHByZXNzaW9uIGluaXRpYWxpemVyKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRJbml0aWFsaXplcihpbml0aWFsaXplcik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3VzdG9tSW5pdGlhbGl6YXRpb24oKSB7CisgICAgICAgIC8vIFdlIHJlZ2lzdGVyIGFuIG9ic2VydmVyIG9uIHRoZSB0eXBlIHByb3BlcnR5LiBXaGVuIGl0IGlzIGNoYW5nZWQgdGhlIE1heGltdW1Db21tb25UeXBlIGlzIGNoYW5nZXMgYXMgd2VsbCwKKyAgICAgICAgLy8gYmVjYXVzZSBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlcyBpdCBjb250YWlucywgZm9yIHRoaXMgcmVhc29uIHdlIG5vdGlmeSBhYm91dCB0aGUgY2hhbmdlCisgICAgICAgIHJlZ2lzdGVyKG5ldyBBc3RPYnNlcnZlckFkYXB0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoTm9kZSBvYnNlcnZlZE5vZGUsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZkID0gVmFyaWFibGVEZWNsYXJhdG9yLnRoaXM7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZC5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkgJiYgdmQuZ2V0UGFyZW50Tm9kZSgpLmdldCgpIGluc3RhbmNlb2YgTm9kZVdpdGhWYXJpYWJsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVXaXRoVmFyaWFibGVzIG5vZGVXaXRoVmFyaWFibGVzID0gKE5vZGVXaXRoVmFyaWFibGVzKSB2ZC5nZXRQYXJlbnROb2RlKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYWxjdWxhdGUgdGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSB3aWxsIGFzc3VtZSBhZnRlciB0aGUgY2hhbmdlIHdpbGwgYmUgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxUeXBlPiBjdXJyZW50TWF4Q29tbW9uVHlwZSA9IG5vZGVXaXRoVmFyaWFibGVzLmdldE1heGltdW1Db21tb25UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbm9kZVdpdGhWYXJpYWJsZXMuZ2V0VmFyaWFibGVzKCkuaW5kZXhPZih2ZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVXaXRoVmFyaWFibGVzLmdldFZhcmlhYmxlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKChUeXBlKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKG5vZGVXaXRoVmFyaWFibGVzLmdldFZhcmlhYmxlKGkpLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8VHlwZT4gbmV3TWF4Q29tbW9uVHlwZSA9IE5vZGVXaXRoVmFyaWFibGVzLmNhbGN1bGF0ZU1heGltdW1Db21tb25UeXBlKHR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoTm9kZSkgbm9kZVdpdGhWYXJpYWJsZXMpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5NQVhJTVVNX0NPTU1PTl9UWVBFLCBjdXJyZW50TWF4Q29tbW9uVHlwZS5vckVsc2UobnVsbCksIG5ld01heENvbW1vblR5cGUub3JFbHNlKG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cHJlc3Npb24+IGdldEluaXRpYWxpemVyKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShpbml0aWFsaXplcik7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yIHNldE5hbWUoZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IHRoaXMubmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChWYXJpYWJsZURlY2xhcmF0b3IpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxpemVyIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIFZhcmlhYmxlRGVjbGFyYXRvcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yIHNldEluaXRpYWxpemVyKGZpbmFsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVyID09IHRoaXMuaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoVmFyaWFibGVEZWNsYXJhdG9yKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5JTklUSUFMSVpFUiwgdGhpcy5pbml0aWFsaXplciwgaW5pdGlhbGl6ZXIpOworICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplci5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGluaXRpYWxpemVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2lsbCBjcmVhdGUgYSB7QGxpbmsgTmFtZUV4cHJ9IHdpdGggdGhlIGluaXRpYWxpemVyIHBhcmFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdCB0aGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBWYXJpYWJsZURlY2xhcmF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yIHNldEluaXRpYWxpemVyKFN0cmluZyBpbml0KSB7CisgICAgICAgIHJldHVybiBzZXRJbml0aWFsaXplcihuZXcgTmFtZUV4cHIoYXNzZXJ0Tm9uRW1wdHkoaW5pdCkpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3Igc2V0VHlwZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKFZhcmlhYmxlRGVjbGFyYXRvcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSwgdGhpcy50eXBlLCB0eXBlKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGluaXRpYWxpemVyKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlSW5pdGlhbGl6ZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvciByZW1vdmVJbml0aWFsaXplcigpIHsKKyAgICAgICAgcmV0dXJuIHNldEluaXRpYWxpemVyKChFeHByZXNzaW9uKSBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChWYXJpYWJsZURlY2xhcmF0b3IpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLnZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGluaXRpYWxpemVyKSB7CisgICAgICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZXIoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoU2ltcGxlTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IHR5cGUpIHsKKyAgICAgICAgICAgIHNldFR5cGUoKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkucmVzb2x2ZURlY2xhcmF0aW9uKHRoaXMsIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9CbG9ja0NvbW1lbnQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQmxvY2tDb21tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzMGIyOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQmxvY2tDb21tZW50LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQmxvY2tDb21tZW50TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIDxwPgorICogQVNUIG5vZGUgdGhhdCByZXByZXNlbnQgYmxvY2sgY29tbWVudHMuCisgKiA8L3A+CisgKiBCbG9jayBjb21tZW50cyBjYW4gaGFzIG11bHRpIGxpbmVzIGFuZCBhcmUgZGVsaW1pdGVkIGJ5ICIvJiM0MjsiIGFuZAorICogIiYjNDI7LyIuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbG9ja0NvbW1lbnQgZXh0ZW5kcyBDb21tZW50IHsKKworICAgIHB1YmxpYyBCbG9ja0NvbW1lbnQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgImVtcHR5Iik7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEJsb2NrQ29tbWVudChTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzKG51bGwsIGNvbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tDb21tZW50KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgY29udGVudCk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrQ29tbWVudCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChCbG9ja0NvbW1lbnQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrQ29tbWVudE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmJsb2NrQ29tbWVudE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0NvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tDb21tZW50IGFzQmxvY2tDb21tZW50KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZCbG9ja0NvbW1lbnQoQ29uc3VtZXI8QmxvY2tDb21tZW50PiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEJsb2NrQ29tbWVudD4gdG9CbG9ja0NvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQ29tbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWY2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnQuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Db21tZW50TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSW50ZXJuYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IGNvbW1lbnRzLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICogQHNlZSBCbG9ja0NvbW1lbnQKKyAqIEBzZWUgTGluZUNvbW1lbnQKKyAqIEBzZWUgSmF2YWRvY0NvbW1lbnQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOb2RlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnQ7CisKKyAgICBASW50ZXJuYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgTm9kZSBjb21tZW50ZWROb2RlOworCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIENvbW1lbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBjb250ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENvbW1lbnQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0Q29udGVudChjb250ZW50KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2YgdGhlIGNvbW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRleHQgb2YgdGhlIGNvbW1lbnQKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgeworICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBjb21tZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnQgdGhlIHRleHQgb2YgdGhlIGNvbW1lbnQgdG8gc2V0CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb21tZW50IHNldENvbnRlbnQoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50KTsKKyAgICAgICAgaWYgKGNvbnRlbnQgPT0gdGhpcy5jb250ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gKENvbW1lbnQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkNPTlRFTlQsIHRoaXMuY29udGVudCwgY29udGVudCk7CisgICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmVDb21tZW50KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaW5lQ29tbWVudCBhc0xpbmVDb21tZW50KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBMaW5lQ29tbWVudCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8Tm9kZT4gZ2V0Q29tbWVudGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUodGhpcy5jb21tZW50ZWROb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21tZW50ZWROb2RlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudGVkTm9kZSB0aGUgY29tbWVudGVkTm9kZSwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBDb21tZW50CisgICAgICovCisgICAgcHVibGljIENvbW1lbnQgc2V0Q29tbWVudGVkTm9kZShOb2RlIGNvbW1lbnRlZE5vZGUpIHsKKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkNPTU1FTlRFRF9OT0RFLCB0aGlzLmNvbW1lbnRlZE5vZGUsIGNvbW1lbnRlZE5vZGUpOworICAgICAgICBpZiAoY29tbWVudGVkTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1lbnRlZE5vZGUgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1lbnRlZE5vZGUgPT0gdGhpcykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tZW50ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29tbWVudGVkTm9kZSA9IGNvbW1lbnRlZE5vZGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3JwaGFuKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50ZWROb2RlID09IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKCkgeworICAgICAgICAvLyB0aGUgb3RoZXIgYXJlIG9ycGhhbiBjb21tZW50cyBhbmQgcmVtb3ZlIHNob3VsZCB3b3JrIHdpdGggdGhlbQorICAgICAgICBpZiAodGhpcy5jb21tZW50ZWROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudGVkTm9kZS5zZXRDb21tZW50KG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudE5vZGUoKS5nZXQoKS5yZW1vdmVPcnBoYW5Db21tZW50KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb21tZW50IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKENvbW1lbnQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIENvbW1lbnRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5jb21tZW50TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tDb21tZW50IGFzQmxvY2tDb21tZW50KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBCbG9ja0NvbW1lbnQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzSmF2YWRvY0NvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEphdmFkb2NDb21tZW50IGFzSmF2YWRvY0NvbW1lbnQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEphdmFkb2NDb21tZW50IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkJsb2NrQ29tbWVudChDb25zdW1lcjxCbG9ja0NvbW1lbnQ+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkphdmFkb2NDb21tZW50KENvbnN1bWVyPEphdmFkb2NDb21tZW50PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZMaW5lQ29tbWVudChDb25zdW1lcjxMaW5lQ29tbWVudD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxCbG9ja0NvbW1lbnQ+IHRvQmxvY2tDb21tZW50KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEphdmFkb2NDb21tZW50PiB0b0phdmFkb2NDb21tZW50KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPExpbmVDb21tZW50PiB0b0xpbmVDb21tZW50KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnRzQ29sbGVjdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2YyNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5OT0RFX0JZX0JFR0lOX1BPU0lUSU9OOworCisvKioKKyAqIFRoZSBjb21tZW50cyBjb250YWluZWQgaW4gYSBjZXJ0YWluIHBhcnNlZCBwaWVjZSBvZiBzb3VyY2UgY29kZS4KKyAqLworcHVibGljIGNsYXNzIENvbW1lbnRzQ29sbGVjdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBUcmVlU2V0PENvbW1lbnQ+IGNvbW1lbnRzID0gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKTsKKworICAgIHB1YmxpYyBDb21tZW50c0NvbGxlY3Rpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbihDb2xsZWN0aW9uPENvbW1lbnQ+IGNvbW1lbnRzVG9Db3B5KSB7CisgICAgICAgIGNvbW1lbnRzLmFkZEFsbChjb21tZW50c1RvQ29weSk7CisgICAgfQorCisgICAgcHVibGljIFNldDxMaW5lQ29tbWVudD4gZ2V0TGluZUNvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIExpbmVDb21tZW50KQorICAgICAgICAgICAgICAgIC5tYXAoY29tbWVudCAtPiAoTGluZUNvbW1lbnQpIGNvbW1lbnQpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKSkpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8QmxvY2tDb21tZW50PiBnZXRCbG9ja0NvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIEJsb2NrQ29tbWVudCkKKyAgICAgICAgICAgICAgICAubWFwKGNvbW1lbnQgLT4gKEJsb2NrQ29tbWVudCkgY29tbWVudCkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBuZXcgVHJlZVNldDw+KE5PREVfQllfQkVHSU5fUE9TSVRJT04pKSk7CisgICAgfQorCisgICAgcHVibGljIFNldDxKYXZhZG9jQ29tbWVudD4gZ2V0SmF2YWRvY0NvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50KQorICAgICAgICAgICAgICAgIC5tYXAoY29tbWVudCAtPiAoSmF2YWRvY0NvbW1lbnQpIGNvbW1lbnQpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbW1lbnQoQ29tbWVudCBjb21tZW50KSB7CisgICAgICAgIGNvbW1lbnRzLmFkZChjb21tZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgaWYgKCFjb21tZW50LmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBSYW5nZSBjb21tZW50UmFuZ2UgPSBjb21tZW50LmdldFJhbmdlKCkuZ2V0KCk7CisgICAgICAgIGZvciAoQ29tbWVudCBjIDogZ2V0Q29tbWVudHMoKSkgeworICAgICAgICAgICAgaWYgKCFjLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSYW5nZSBjUmFuZ2UgPSBjLmdldFJhbmdlKCkuZ2V0KCk7CisgICAgICAgICAgICAvLyB3ZSB0b2xlcmF0ZSBhIGRpZmZlcmVuY2Ugb2Ygb25lIGVsZW1lbnQgaW4gdGhlIGVuZCBjb2x1bW46CisgICAgICAgICAgICAvLyBpdCBkZXBlbmRzIGhvdyBcciBhbmQgXG4gYXJlIGNhbGN1bGF0ZWQuLi4KKyAgICAgICAgICAgIGlmIChjUmFuZ2UuYmVnaW4uZXF1YWxzKGNvbW1lbnRSYW5nZS5iZWdpbikgJiYKKyAgICAgICAgICAgICAgICAgICAgY1JhbmdlLmVuZC5saW5lID09IGNvbW1lbnRSYW5nZS5lbmQubGluZSAmJgorICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhjUmFuZ2UuZW5kLmNvbHVtbiAtIGNvbW1lbnRSYW5nZS5lbmQuY29sdW1uKSA8IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFRyZWVTZXQ8Q29tbWVudD4gZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50cy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbiBtaW51cyhDb21tZW50c0NvbGxlY3Rpb24gb3RoZXIpIHsKKyAgICAgICAgQ29tbWVudHNDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBDb21tZW50c0NvbGxlY3Rpb24oKTsKKyAgICAgICAgcmVzdWx0LmNvbW1lbnRzLmFkZEFsbCgKKyAgICAgICAgICAgICAgICBjb21tZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjb21tZW50IC0+ICFvdGhlci5jb250YWlucyhjb21tZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tbWVudHNDb2xsZWN0aW9uIGNvcHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tbWVudHNDb2xsZWN0aW9uKGNvbW1lbnRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0phdmFkb2NDb21tZW50LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0phdmFkb2NDb21tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5NTk5NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvSmF2YWRvY0NvbW1lbnQuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuSmF2YWRvYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFkb2NDb21tZW50TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgSmF2YWRvYyBjb21tZW50LiA8Y29kZT4vJiM0MjsmIzQyOyBhIGNvbW1lbnQgJiM0MjsvPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmF2YWRvY0NvbW1lbnQgZXh0ZW5kcyBDb21tZW50IHsKKworICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCAiZW1wdHkiKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBjb250ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIEphdmFkb2NDb21tZW50KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgY29udGVudCk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWRvYyBwYXJzZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXIucGFyc2VKYXZhZG9jKGdldENvbnRlbnQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChKYXZhZG9jQ29tbWVudCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5qYXZhZG9jQ29tbWVudE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNKYXZhZG9jQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBhc0phdmFkb2NDb21tZW50KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZKYXZhZG9jQ29tbWVudChDb25zdW1lcjxKYXZhZG9jQ29tbWVudD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxKYXZhZG9jQ29tbWVudD4gdG9KYXZhZG9jQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvTGluZUNvbW1lbnQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvTGluZUNvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJjZTgwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9MaW5lQ29tbWVudC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkxpbmVDb21tZW50TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIDxwPgorICogQVNUIG5vZGUgdGhhdCByZXByZXNlbnQgbGluZSBjb21tZW50cy4KKyAqIDwvcD4KKyAqIExpbmUgY29tbWVudHMgc3RhcnQgd2l0aCAiLy8iIGFuZCBmaW5pc2ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAoIlxuIikuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMaW5lQ29tbWVudCBleHRlbmRzIENvbW1lbnQgeworCisgICAgcHVibGljIExpbmVDb21tZW50KCkgeworICAgICAgICB0aGlzKG51bGwsICJlbXB0eSIpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBMaW5lQ29tbWVudChTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzKG51bGwsIGNvbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGluZUNvbW1lbnQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBjb250ZW50KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmVDb21tZW50KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIExpbmVDb21tZW50IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKExpbmVDb21tZW50KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaW5lQ29tbWVudE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmxpbmVDb21tZW50TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGluZUNvbW1lbnQgYXNMaW5lQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTGluZUNvbW1lbnQoQ29uc3VtZXI8TGluZUNvbW1lbnQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TGluZUNvbW1lbnQ+IHRvTGluZUNvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQW5ub3RhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Bbm5vdGF0aW9uRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzcwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQW5ub3RhdGlvbkV4cHIuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkFubm90YXRpb25FeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBhbm5vdGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25FeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoTmFtZTxBbm5vdGF0aW9uRXhwcj4geworCisgICAgcHJvdGVjdGVkIE5hbWUgbmFtZTsKKworICAgIHB1YmxpYyBBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZSgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkV4cHIoTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWUgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uRXhwciBzZXROYW1lKGZpbmFsIE5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoQW5ub3RhdGlvbkV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBbm5vdGF0aW9uRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5hbm5vdGF0aW9uRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkV4cHIgYXNBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQW5ub3RhdGlvbkV4cHIoQ29uc3VtZXI8QW5ub3RhdGlvbkV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QW5ub3RhdGlvbkV4cHI+IHRvQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlBY2Nlc3NFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlBY2Nlc3NFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0NWRkOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUFjY2Vzc0V4cHIuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5BcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQXJyYXkgYnJhY2tldHMgW10gYmVpbmcgdXNlZCB0byBnZXQgYSB2YWx1ZSBmcm9tIGFuIGFycmF5LgorICogSW4gPGJyLz48Y29kZT5nZXROYW1lcygpWzE1KjE1XTwvY29kZT4gdGhlIG5hbWUgZXhwcmVzc2lvbiBpcyBnZXROYW1lcygpIGFuZCB0aGUgaW5kZXggZXhwcmVzc2lvbiBpcyAxNSoxNS4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFycmF5QWNjZXNzRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIG5hbWU7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gaW5kZXg7CisKKyAgICBwdWJsaWMgQXJyYXlBY2Nlc3NFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOYW1lRXhwcigpLCBuZXcgSW50ZWdlckxpdGVyYWxFeHByKCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBBcnJheUFjY2Vzc0V4cHIoRXhwcmVzc2lvbiBuYW1lLCBFeHByZXNzaW9uIGluZGV4KSB7CisgICAgICAgIHRoaXMobnVsbCwgbmFtZSwgaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlBY2Nlc3NFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBuYW1lLCBFeHByZXNzaW9uIGluZGV4KSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRJbmRleChpbmRleCk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUFjY2Vzc0V4cHIgc2V0SW5kZXgoZmluYWwgRXhwcmVzc2lvbiBpbmRleCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGluZGV4KTsKKyAgICAgICAgaWYgKGluZGV4ID09IHRoaXMuaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoQXJyYXlBY2Nlc3NFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5JTkRFWCwgdGhpcy5pbmRleCwgaW5kZXgpOworICAgICAgICBpZiAodGhpcy5pbmRleCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5pbmRleC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGluZGV4KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUFjY2Vzc0V4cHIgc2V0TmFtZShmaW5hbCBFeHByZXNzaW9uIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKEFycmF5QWNjZXNzRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSwgdGhpcy5uYW1lLCBuYW1lKTsKKyAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5uYW1lLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5QWNjZXNzRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChBcnJheUFjY2Vzc0V4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5QWNjZXNzRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmFycmF5QWNjZXNzRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgIHNldEluZGV4KChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXlBY2Nlc3NFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5QWNjZXNzRXhwciBhc0FycmF5QWNjZXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXJyYXlBY2Nlc3NFeHByKENvbnN1bWVyPEFycmF5QWNjZXNzRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxBcnJheUFjY2Vzc0V4cHI+IHRvQXJyYXlBY2Nlc3NFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5Q3JlYXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlDcmVhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk5MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5Q3JlYXRpb25FeHByLmphdmEKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlVHlwZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogPGNvZGU+bmV3IGludFs1XVs0XVtdW108L2NvZGU+IG9yIDxjb2RlPm5ldyBpbnRbXVtde3sxfSx7MiwzfX08L2NvZGU+LgorICoKKyAqIDxici8+ImludCIgaXMgdGhlIGVsZW1lbnQgdHlwZS4KKyAqIDxici8+QWxsIHRoZSBicmFja2V0cyBhcmUgc3RvcmVkIGluIHRoZSBsZXZlbHMgZmllbGQsIGZyb20gbGVmdCB0byByaWdodC4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFycmF5Q3JlYXRpb25FeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBATm9uRW1wdHlQcm9wZXJ0eQorICAgIHByaXZhdGUgTm9kZUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBsZXZlbHM7CisKKyAgICBwcml2YXRlIFR5cGUgZWxlbWVudFR5cGU7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgQXJyYXlJbml0aWFsaXplckV4cHIgaW5pdGlhbGl6ZXI7CisKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBBcnJheUluaXRpYWxpemVyRXhwcigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIoVHlwZSBlbGVtZW50VHlwZSwgTm9kZUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBsZXZlbHMsIEFycmF5SW5pdGlhbGl6ZXJFeHByIGluaXRpYWxpemVyKSB7CisgICAgICAgIHRoaXMobnVsbCwgZWxlbWVudFR5cGUsIGxldmVscywgaW5pdGlhbGl6ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwcihUeXBlIGVsZW1lbnRUeXBlKSB7CisgICAgICAgIHRoaXMobnVsbCwgZWxlbWVudFR5cGUsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBBcnJheUluaXRpYWxpemVyRXhwcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCByYW5nZSBzaG91bGRuJ3QgYmUgaW4gdXRpbGl0eSBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIoUmFuZ2UgcmFuZ2UsIFR5cGUgZWxlbWVudFR5cGUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBlbGVtZW50VHlwZSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IEFycmF5SW5pdGlhbGl6ZXJFeHByKCkpOworICAgICAgICBzZXRSYW5nZShyYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFR5cGUgZWxlbWVudFR5cGUsIE5vZGVMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gbGV2ZWxzLCBBcnJheUluaXRpYWxpemVyRXhwciBpbml0aWFsaXplcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgICAgICBzZXRMZXZlbHMobGV2ZWxzKTsKKyAgICAgICAgc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxBcnJheUluaXRpYWxpemVyRXhwcj4gZ2V0SW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGluaXRpYWxpemVyKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0RWxlbWVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50VHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbml0aWFsaXplcgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxpemVyIHRoZSBpbml0aWFsaXplciwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBBcnJheUNyZWF0aW9uRXhwcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIgc2V0SW5pdGlhbGl6ZXIoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVyID09IHRoaXMuaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoQXJyYXlDcmVhdGlvbkV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LklOSVRJQUxJWkVSLCB0aGlzLmluaXRpYWxpemVyLCBpbml0aWFsaXplcik7CisgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVyICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVyLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoaW5pdGlhbGl6ZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByIHNldEVsZW1lbnRUeXBlKGZpbmFsIFR5cGUgZWxlbWVudFR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtZW50VHlwZSk7CisgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSB0aGlzLmVsZW1lbnRUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKEFycmF5Q3JlYXRpb25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5FTEVNRU5UX1RZUEUsIHRoaXMuZWxlbWVudFR5cGUsIGVsZW1lbnRUeXBlKTsKKyAgICAgICAgaWYgKHRoaXMuZWxlbWVudFR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihlbGVtZW50VHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBnZXRMZXZlbHMoKSB7CisgICAgICAgIHJldHVybiBsZXZlbHM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwciBzZXRMZXZlbHMoZmluYWwgTm9kZUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBsZXZlbHMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsZXZlbHMpOworICAgICAgICBpZiAobGV2ZWxzID09IHRoaXMubGV2ZWxzKSB7CisgICAgICAgICAgICByZXR1cm4gKEFycmF5Q3JlYXRpb25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5MRVZFTFMsIHRoaXMubGV2ZWxzLCBsZXZlbHMpOworICAgICAgICBpZiAodGhpcy5sZXZlbHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubGV2ZWxzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubGV2ZWxzID0gbGV2ZWxzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihsZXZlbHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyB0aGUgZWxlbWVudCB0eXBlIGFuZCB3cmFwcyBpdCBpbiBhbiBBcnJheVR5cGUgZm9yIGV2ZXJ5IGFycmF5IGNyZWF0aW9uIGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlIGNyZWF0ZWRUeXBlKCkgeworICAgICAgICBUeXBlIHJlc3VsdCA9IGVsZW1lbnRUeXBlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5VHlwZShyZXN1bHQsIEFycmF5VHlwZS5PcmlnaW4uVFlQRSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdHlwZSB0byB0aGlzIGNsYXNzIGFuZCB0cnkgdG8gaW1wb3J0IGl0IHRvIHRoZSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSBpZiBuZWVkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlQ2xhc3MgdGhlIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIgc2V0RWxlbWVudFR5cGUoQ2xhc3M8Pz4gdHlwZUNsYXNzKSB7CisgICAgICAgIHRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KHR5cGVDbGFzcyk7CisgICAgICAgIHJldHVybiBzZXRFbGVtZW50VHlwZShwYXJzZVR5cGUodHlwZUNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwciBzZXRFbGVtZW50VHlwZShmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICByZXR1cm4gc2V0RWxlbWVudFR5cGUocGFyc2VUeXBlKHR5cGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGluaXRpYWxpemVyKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlSW5pdGlhbGl6ZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGxldmVscy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGxldmVscy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwciByZW1vdmVJbml0aWFsaXplcigpIHsKKyAgICAgICAgcmV0dXJuIHNldEluaXRpYWxpemVyKChBcnJheUluaXRpYWxpemVyRXhwcikgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChBcnJheUNyZWF0aW9uRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5hcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gZWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgIHNldEVsZW1lbnRUeXBlKChUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluaXRpYWxpemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGluaXRpYWxpemVyKSB7CisgICAgICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXJFeHByKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobGV2ZWxzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgbGV2ZWxzLnNldChpLCAoQXJyYXlDcmVhdGlvbkxldmVsKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIgYXNBcnJheUNyZWF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXJyYXlDcmVhdGlvbkV4cHIoQ29uc3VtZXI8QXJyYXlDcmVhdGlvbkV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXJyYXlDcmVhdGlvbkV4cHI+IHRvQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlJbml0aWFsaXplckV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUluaXRpYWxpemVyRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODVhMTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlJbml0aWFsaXplckV4cHIuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogVGhlIGluaXRpYWxpemF0aW9uIG9mIGFuIGFycmF5LiBJbiB0aGUgZm9sbG93aW5nIHNhbXBsZSwgdGhlIG91dGVyIHsgfSBpcyBhbiBBcnJheUluaXRpYWxpemVyRXhwci4KKyAqIEl0IGhhcyB0d28gZXhwcmVzc2lvbnMgaW5zaWRlOiB0d28gQXJyYXlJbml0aWFsaXplckV4cHJzLgorICogVGhlc2UgaGF2ZSB0d28gZXhwcmVzc2lvbnMgZWFjaCwgb25lIGhhcyAxIGFuZCAxLCB0aGUgb3RoZXIgdHdvIGFuZCB0d28uCisgKiA8YnIvPjxjb2RlPm5ldyBpbnRbXVtde3sxLCAxfSwgezIsIDJ9fTs8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBcnJheUluaXRpYWxpemVyRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxFeHByZXNzaW9uPiB2YWx1ZXM7CisKKyAgICBwdWJsaWMgQXJyYXlJbml0aWFsaXplckV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEFycmF5SW5pdGlhbGl6ZXJFeHByKE5vZGVMaXN0PEV4cHJlc3Npb24+IHZhbHVlcykgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5vZGVMaXN0PEV4cHJlc3Npb24+IHZhbHVlcykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PEV4cHJlc3Npb24+IGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5SW5pdGlhbGl6ZXJFeHByIHNldFZhbHVlcyhmaW5hbCBOb2RlTGlzdDxFeHByZXNzaW9uPiB2YWx1ZXMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZXMpOworICAgICAgICBpZiAodmFsdWVzID09IHRoaXMudmFsdWVzKSB7CisgICAgICAgICAgICByZXR1cm4gKEFycmF5SW5pdGlhbGl6ZXJFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5WQUxVRVMsIHRoaXMudmFsdWVzLCB2YWx1ZXMpOworICAgICAgICBpZiAodGhpcy52YWx1ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih2YWx1ZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChBcnJheUluaXRpYWxpemVyRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5hcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KGksIChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXlJbml0aWFsaXplckV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlJbml0aWFsaXplckV4cHIgYXNBcnJheUluaXRpYWxpemVyRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXJyYXlJbml0aWFsaXplckV4cHIoQ29uc3VtZXI8QXJyYXlJbml0aWFsaXplckV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXJyYXlJbml0aWFsaXplckV4cHI+IHRvQXJyYXlJbml0aWFsaXplckV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fzc2lnbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI0Njg3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fzc2lnbkV4cHIuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Bc3NpZ25FeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5QcmludGFibGU7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uIEl0IHN1cHBvcnRzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgZm91bmQgdGhlIHRoZSBBc3NpZ25FeHByLk9wZXJhdG9yIGVudW0uCisgKiA8YnIvPjxjb2RlPmE9NTwvY29kZT4KKyAqIDxici8+PGNvZGU+dGltZSs9NTAwPC9jb2RlPgorICogPGJyLz48Y29kZT53YXRjaC50aW1lKz01MDA8L2NvZGU+CisgKiA8YnIvPjxjb2RlPigoKHRpbWUpKSk9MTAwKjYwPC9jb2RlPgorICogPGJyLz48Y29kZT5wZWFudXRbYV09dHJ1ZTwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFzc2lnbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHB1YmxpYyBlbnVtIE9wZXJhdG9yIGltcGxlbWVudHMgUHJpbnRhYmxlIHsKKworICAgICAgICBBU1NJR04oIj0iKSwKKyAgICAgICAgUExVUygiKz0iKSwKKyAgICAgICAgTUlOVVMoIi09IiksCisgICAgICAgIE1VTFRJUExZKCIqPSIpLAorICAgICAgICBESVZJREUoIi89IiksCisgICAgICAgIEJJTkFSWV9BTkQoIiY9IiksCisgICAgICAgIEJJTkFSWV9PUigifD0iKSwKKyAgICAgICAgWE9SKCJePSIpLAorICAgICAgICBSRU1BSU5ERVIoIiU9IiksCisgICAgICAgIExFRlRfU0hJRlQoIjw8PSIpLAorICAgICAgICBTSUdORURfUklHSFRfU0hJRlQoIj4+PSIpLAorICAgICAgICBVTlNJR05FRF9SSUdIVF9TSElGVCgiPj4+PSIpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvZGVSZXByZXNlbnRhdGlvbjsKKworICAgICAgICBPcGVyYXRvcihTdHJpbmcgY29kZVJlcHJlc2VudGF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmNvZGVSZXByZXNlbnRhdGlvbiA9IGNvZGVSZXByZXNlbnRhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gY29kZVJlcHJlc2VudGF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9wdGlvbmFsPEJpbmFyeUV4cHIuT3BlcmF0b3I+IHRvQmluYXJ5T3BlcmF0b3IoKSB7CisgICAgICAgICAgICBzd2l0Y2godGhpcykgeworICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEJpbmFyeUV4cHIuT3BlcmF0b3IuUExVUyk7CisgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEJpbmFyeUV4cHIuT3BlcmF0b3IuTUlOVVMpOworICAgICAgICAgICAgICAgIGNhc2UgTVVMVElQTFk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihCaW5hcnlFeHByLk9wZXJhdG9yLk1VTFRJUExZKTsKKyAgICAgICAgICAgICAgICBjYXNlIERJVklERToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEJpbmFyeUV4cHIuT3BlcmF0b3IuRElWSURFKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihCaW5hcnlFeHByLk9wZXJhdG9yLkJJTkFSWV9BTkQpOworICAgICAgICAgICAgICAgIGNhc2UgQklOQVJZX09SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoQmluYXJ5RXhwci5PcGVyYXRvci5CSU5BUllfT1IpOworICAgICAgICAgICAgICAgIGNhc2UgWE9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoQmluYXJ5RXhwci5PcGVyYXRvci5YT1IpOworICAgICAgICAgICAgICAgIGNhc2UgUkVNQUlOREVSOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoQmluYXJ5RXhwci5PcGVyYXRvci5SRU1BSU5ERVIpOworICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9TSElGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEJpbmFyeUV4cHIuT3BlcmF0b3IuTEVGVF9TSElGVCk7CisgICAgICAgICAgICAgICAgY2FzZSBTSUdORURfUklHSFRfU0hJRlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihCaW5hcnlFeHByLk9wZXJhdG9yLlNJR05FRF9SSUdIVF9TSElGVCk7CisgICAgICAgICAgICAgICAgY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEJpbmFyeUV4cHIuT3BlcmF0b3IuVU5TSUdORURfUklHSFRfU0hJRlQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRhcmdldDsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZTsKKworICAgIHByaXZhdGUgT3BlcmF0b3Igb3BlcmF0b3I7CisKKyAgICBwdWJsaWMgQXNzaWduRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZUV4cHIoKSwgbmV3IFN0cmluZ0xpdGVyYWxFeHByKCksIE9wZXJhdG9yLkFTU0lHTik7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEFzc2lnbkV4cHIoRXhwcmVzc2lvbiB0YXJnZXQsIEV4cHJlc3Npb24gdmFsdWUsIE9wZXJhdG9yIG9wZXJhdG9yKSB7CisgICAgICAgIHRoaXMobnVsbCwgdGFyZ2V0LCB2YWx1ZSwgb3BlcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzaWduRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEV4cHJlc3Npb24gdGFyZ2V0LCBFeHByZXNzaW9uIHZhbHVlLCBPcGVyYXRvciBvcGVyYXRvcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgc2V0T3BlcmF0b3Iob3BlcmF0b3IpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBc3NpZ25FeHByIHNldE9wZXJhdG9yKGZpbmFsIE9wZXJhdG9yIG9wZXJhdG9yKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0b3IpOworICAgICAgICBpZiAob3BlcmF0b3IgPT0gdGhpcy5vcGVyYXRvcikgeworICAgICAgICAgICAgcmV0dXJuIChBc3NpZ25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5PUEVSQVRPUiwgdGhpcy5vcGVyYXRvciwgb3BlcmF0b3IpOworICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzaWduRXhwciBzZXRUYXJnZXQoZmluYWwgRXhwcmVzc2lvbiB0YXJnZXQpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0YXJnZXQpOworICAgICAgICBpZiAodGFyZ2V0ID09IHRoaXMudGFyZ2V0KSB7CisgICAgICAgICAgICByZXR1cm4gKEFzc2lnbkV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRBUkdFVCwgdGhpcy50YXJnZXQsIHRhcmdldCk7CisgICAgICAgIGlmICh0aGlzLnRhcmdldCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50YXJnZXQuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRhcmdldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzaWduRXhwciBzZXRWYWx1ZShmaW5hbCBFeHByZXNzaW9uIHZhbHVlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOworICAgICAgICBpZiAodmFsdWUgPT0gdGhpcy52YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIChBc3NpZ25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5WQUxVRSwgdGhpcy52YWx1ZSwgdmFsdWUpOworICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBc3NpZ25FeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEFzc2lnbkV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEFzc2lnbkV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5hc3NpZ25FeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXQpIHsKKyAgICAgICAgICAgIHNldFRhcmdldCgoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IHZhbHVlKSB7CisgICAgICAgICAgICBzZXRWYWx1ZSgoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBc3NpZ25FeHByIGFzQXNzaWduRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXNzaWduRXhwcihDb25zdW1lcjxBc3NpZ25FeHByPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEFzc2lnbkV4cHI+IHRvQXNzaWduRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQmluYXJ5RXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzc5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQmluYXJ5RXhwci5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkJpbmFyeUV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlByaW50YWJsZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFuIGV4cHJlc3Npb24gd2l0aCBhbiBleHByZXNzaW9uIG9uIHRoZSBsZWZ0LCBhbiBleHByZXNzaW9uIG9uIHRoZSByaWdodCwgYW5kIGFuIG9wZXJhdG9yIGluIHRoZSBtaWRkbGUuCisgKiBJdCBzdXBwb3J0cyB0aGUgb3BlcmF0b3JzIHRoYXQgYXJlIGZvdW5kIHRoZSB0aGUgQmluYXJ5RXhwci5PcGVyYXRvciBlbnVtLgorICogPGJyLz48Y29kZT5hICYmIGI8L2NvZGU+CisgKiA8YnIvPjxjb2RlPjE1NSAqIDMzPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHVibGljIGVudW0gT3BlcmF0b3IgaW1wbGVtZW50cyBQcmludGFibGUgeworCisgICAgICAgIE9SKCJ8fCIpLAorICAgICAgICBBTkQoIiYmIiksCisgICAgICAgIEJJTkFSWV9PUigifCIpLAorICAgICAgICBCSU5BUllfQU5EKCImIiksCisgICAgICAgIFhPUigiXiIpLAorICAgICAgICBFUVVBTFMoIj09IiksCisgICAgICAgIE5PVF9FUVVBTFMoIiE9IiksCisgICAgICAgIExFU1MoIjwiKSwKKyAgICAgICAgR1JFQVRFUigiPiIpLAorICAgICAgICBMRVNTX0VRVUFMUygiPD0iKSwKKyAgICAgICAgR1JFQVRFUl9FUVVBTFMoIj49IiksCisgICAgICAgIExFRlRfU0hJRlQoIjw8IiksCisgICAgICAgIFNJR05FRF9SSUdIVF9TSElGVCgiPj4iKSwKKyAgICAgICAgVU5TSUdORURfUklHSFRfU0hJRlQoIj4+PiIpLAorICAgICAgICBQTFVTKCIrIiksCisgICAgICAgIE1JTlVTKCItIiksCisgICAgICAgIE1VTFRJUExZKCIqIiksCisgICAgICAgIERJVklERSgiLyIpLAorICAgICAgICBSRU1BSU5ERVIoIiUiKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb2RlUmVwcmVzZW50YXRpb247CisKKyAgICAgICAgT3BlcmF0b3IoU3RyaW5nIGNvZGVSZXByZXNlbnRhdGlvbikgeworICAgICAgICAgICAgdGhpcy5jb2RlUmVwcmVzZW50YXRpb24gPSBjb2RlUmVwcmVzZW50YXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvZGVSZXByZXNlbnRhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcHRpb25hbDxBc3NpZ25FeHByLk9wZXJhdG9yPiB0b0Fzc2lnbk9wZXJhdG9yKCkgeworICAgICAgICAgICAgc3dpdGNoKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJJTkFSWV9PUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuQklOQVJZX09SKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihBc3NpZ25FeHByLk9wZXJhdG9yLkJJTkFSWV9BTkQpOworICAgICAgICAgICAgICAgIGNhc2UgWE9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoQXNzaWduRXhwci5PcGVyYXRvci5YT1IpOworICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9TSElGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuTEVGVF9TSElGVCk7CisgICAgICAgICAgICAgICAgY2FzZSBTSUdORURfUklHSFRfU0hJRlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihBc3NpZ25FeHByLk9wZXJhdG9yLlNJR05FRF9SSUdIVF9TSElGVCk7CisgICAgICAgICAgICAgICAgY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuVU5TSUdORURfUklHSFRfU0hJRlQpOworICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuUExVUyk7CisgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuTUlOVVMpOworICAgICAgICAgICAgICAgIGNhc2UgTVVMVElQTFk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihBc3NpZ25FeHByLk9wZXJhdG9yLk1VTFRJUExZKTsKKyAgICAgICAgICAgICAgICBjYXNlIERJVklERToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuRElWSURFKTsKKyAgICAgICAgICAgICAgICBjYXNlIFJFTUFJTkRFUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKEFzc2lnbkV4cHIuT3BlcmF0b3IuUkVNQUlOREVSKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBsZWZ0OworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHJpZ2h0OworCisgICAgcHJpdmF0ZSBPcGVyYXRvciBvcGVyYXRvcjsKKworICAgIHB1YmxpYyBCaW5hcnlFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBCb29sZWFuTGl0ZXJhbEV4cHIoKSwgbmV3IEJvb2xlYW5MaXRlcmFsRXhwcigpLCBPcGVyYXRvci5FUVVBTFMpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBCaW5hcnlFeHByKEV4cHJlc3Npb24gbGVmdCwgRXhwcmVzc2lvbiByaWdodCwgT3BlcmF0b3Igb3BlcmF0b3IpIHsKKyAgICAgICAgdGhpcyhudWxsLCBsZWZ0LCByaWdodCwgb3BlcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmluYXJ5RXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEV4cHJlc3Npb24gbGVmdCwgRXhwcmVzc2lvbiByaWdodCwgT3BlcmF0b3Igb3BlcmF0b3IpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldExlZnQobGVmdCk7CisgICAgICAgIHNldFJpZ2h0KHJpZ2h0KTsKKyAgICAgICAgc2V0T3BlcmF0b3Iob3BlcmF0b3IpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldExlZnQoKSB7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBvcGVyYXRvcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0UmlnaHQoKSB7CisgICAgICAgIHJldHVybiByaWdodDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEJpbmFyeUV4cHIgc2V0TGVmdChmaW5hbCBFeHByZXNzaW9uIGxlZnQpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsZWZ0KTsKKyAgICAgICAgaWYgKGxlZnQgPT0gdGhpcy5sZWZ0KSB7CisgICAgICAgICAgICByZXR1cm4gKEJpbmFyeUV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkxFRlQsIHRoaXMubGVmdCwgbGVmdCk7CisgICAgICAgIGlmICh0aGlzLmxlZnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubGVmdC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihsZWZ0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCaW5hcnlFeHByIHNldE9wZXJhdG9yKGZpbmFsIE9wZXJhdG9yIG9wZXJhdG9yKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0b3IpOworICAgICAgICBpZiAob3BlcmF0b3IgPT0gdGhpcy5vcGVyYXRvcikgeworICAgICAgICAgICAgcmV0dXJuIChCaW5hcnlFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5PUEVSQVRPUiwgdGhpcy5vcGVyYXRvciwgb3BlcmF0b3IpOworICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmluYXJ5RXhwciBzZXRSaWdodChmaW5hbCBFeHByZXNzaW9uIHJpZ2h0KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwocmlnaHQpOworICAgICAgICBpZiAocmlnaHQgPT0gdGhpcy5yaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIChCaW5hcnlFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5SSUdIVCwgdGhpcy5yaWdodCwgcmlnaHQpOworICAgICAgICBpZiAodGhpcy5yaWdodCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5yaWdodC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCaW5hcnlFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEJpbmFyeUV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEJpbmFyeUV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5iaW5hcnlFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBsZWZ0KSB7CisgICAgICAgICAgICBzZXRMZWZ0KChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gcmlnaHQpIHsKKyAgICAgICAgICAgIHNldFJpZ2h0KChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNCaW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEJpbmFyeUV4cHIgYXNCaW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZCaW5hcnlFeHByKENvbnN1bWVyPEJpbmFyeUV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QmluYXJ5RXhwcj4gdG9CaW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Jvb2xlYW5MaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Jvb2xlYW5MaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTQzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQm9vbGVhbkxpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Cb29sZWFuTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogVGhlIGJvb2xlYW4gbGl0ZXJhbHMuCisgKiA8YnIvPjxjb2RlPnRydWU8L2NvZGU+CisgKiA8YnIvPjxjb2RlPmZhbHNlPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhbkxpdGVyYWxFeHByIGV4dGVuZHMgTGl0ZXJhbEV4cHIgeworCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbHVlOworCisgICAgcHVibGljIEJvb2xlYW5MaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEJvb2xlYW5MaXRlcmFsRXhwcihib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRoaXMobnVsbCwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbkxpdGVyYWxFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuTGl0ZXJhbEV4cHIgc2V0VmFsdWUoZmluYWwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gdGhpcy52YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuTGl0ZXJhbEV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlZBTFVFLCB0aGlzLnZhbHVlLCB2YWx1ZSk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuTGl0ZXJhbEV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQm9vbGVhbkxpdGVyYWxFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5ib29sZWFuTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQm9vbGVhbkxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW5MaXRlcmFsRXhwciBhc0Jvb2xlYW5MaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQm9vbGVhbkxpdGVyYWxFeHByKENvbnN1bWVyPEJvb2xlYW5MaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxCb29sZWFuTGl0ZXJhbEV4cHI+IHRvQm9vbGVhbkxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2FzdEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzRkMjRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQ2FzdEV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSB0eXBlY2FzdC4gVGhlIChsb25nKSBpbiA8Y29kZT4obG9uZykxNTwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENhc3RFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZTxDYXN0RXhwciwgVHlwZT4sIE5vZGVXaXRoRXhwcmVzc2lvbjxDYXN0RXhwcj4geworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKworICAgIHB1YmxpYyBDYXN0RXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoKSwgbmV3IE5hbWVFeHByKCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBDYXN0RXhwcihUeXBlIHR5cGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzKG51bGwsIHR5cGUsIGV4cHJlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2FzdEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBUeXBlIHR5cGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYXN0RXhwciBzZXRFeHByZXNzaW9uKGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGV4cHJlc3Npb24pOworICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSB0aGlzLmV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2FzdEV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVYUFJFU1NJT04sIHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CisgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihleHByZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYXN0RXhwciBzZXRUeXBlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOworICAgICAgICBpZiAodHlwZSA9PSB0aGlzLnR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2FzdEV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUsIHRoaXMudHlwZSwgdHlwZSk7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYXN0RXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChDYXN0RXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2FzdEV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5jYXN0RXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gZXhwcmVzc2lvbikgeworICAgICAgICAgICAgc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IHR5cGUpIHsKKyAgICAgICAgICAgIHNldFR5cGUoKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc3RFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIENhc3RFeHByIGFzQ2FzdEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNhc3RFeHByKENvbnN1bWVyPENhc3RFeHByPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPENhc3RFeHByPiB0b0Nhc3RFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NoYXJMaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NoYXJMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmRiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2hhckxpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5DaGFyTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5TdHJpbmdFc2NhcGVVdGlsczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIGxpdGVyYWwgY2hhcmFjdGVyLgorICogPGJyLz48Y29kZT4nYSc8L2NvZGU+CisgKiA8YnIvPjxjb2RlPidcdCc8L2NvZGU+CisgKiA8YnIvPjxjb2RlPifOqSc8L2NvZGU+CisgKiA8YnIvPjxjb2RlPidcMTc3JzwvY29kZT4KKyAqIDxici8+PGNvZGU+J/CfkqknPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2hhckxpdGVyYWxFeHByIGV4dGVuZHMgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwciB7CisKKyAgICBwdWJsaWMgQ2hhckxpdGVyYWxFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsICI/Iik7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIENoYXJMaXRlcmFsRXhwcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIENoYXJMaXRlcmFsRXhwciB3aXRoIGdpdmVuIGVzY2FwZWQgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGEgY2hhcgorICAgICAqLworICAgIHB1YmxpYyBDaGFyTGl0ZXJhbEV4cHIoY2hhciB2YWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUphdmEoU3RyaW5nLnZhbHVlT2YodmFsdWUpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDaGFyTGl0ZXJhbEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgdmFsdWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBTdHJpbmdMaXRlcmFsRXhwci4gRXNjYXBlcyBFT0wgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJMaXRlcmFsRXhwciBlc2NhcGUoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gbmV3IENoYXJMaXRlcmFsRXhwcihVdGlscy5lc2NhcGVFbmRPZkxpbmVzKHN0cmluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5lc2NhcGVkIHZhbHVlIGNoYXJhY3RlciBvZiB0aGlzIGxpdGVyYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgY2hhciBhc0NoYXIoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmdFc2NhcGVVdGlscy51bmVzY2FwZUphdmEodmFsdWUpLmNoYXJBdCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBnaXZlbiBjaGFyIGFzIHRoZSBsaXRlcmFsIHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgYSBjaGFyCisgICAgICogQHJldHVybiB0aGlzIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhckxpdGVyYWxFeHByIHNldENoYXIoY2hhciB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIENoYXJMaXRlcmFsRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChDaGFyTGl0ZXJhbEV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIENoYXJMaXRlcmFsRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmNoYXJMaXRlcmFsRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFyTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2hhckxpdGVyYWxFeHByIGFzQ2hhckxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZDaGFyTGl0ZXJhbEV4cHIoQ29uc3VtZXI8Q2hhckxpdGVyYWxFeHByPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPENoYXJMaXRlcmFsRXhwcj4gdG9DaGFyTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2xhc3NFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2xhc3NFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DbGFzc0V4cHIuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkNsYXNzRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBEZWZpbmVzIGFuIGV4cHJlc3Npb24gdGhhdCBhY2Nlc3NlcyB0aGUgY2xhc3Mgb2YgYSB0eXBlLgorICogPGJyLz48Y29kZT5PYmplY3QuY2xhc3M8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc0V4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgTm9kZVdpdGhUeXBlPENsYXNzRXhwciwgVHlwZT4geworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwdWJsaWMgQ2xhc3NFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQ2xhc3NFeHByKFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzKG51bGwsIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgVHlwZSB0eXBlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NFeHByIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZSk7CisgICAgICAgIGlmICh0eXBlID09IHRoaXMudHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIChDbGFzc0V4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUsIHRoaXMudHlwZSwgdHlwZSk7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc0V4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc0V4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5jbGFzc0V4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IHR5cGUpIHsKKyAgICAgICAgICAgIHNldFR5cGUoKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc0V4cHIgYXNDbGFzc0V4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNsYXNzRXhwcihDb25zdW1lcjxDbGFzc0V4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q2xhc3NFeHByPiB0b0NsYXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Db25kaXRpb25hbEV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Db25kaXRpb25hbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM1MGEwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NvbmRpdGlvbmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aENvbmRpdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGUgdGVybmFyeSBjb25kaXRpb25hbCBleHByZXNzaW9uLgorICogSW4gPGNvZGU+Yj09MD94Onk8L2NvZGU+LCBiPT0wIGlzIHRoZSBjb25kaXRpb24sIHggaXMgdGhlbkV4cHIsIGFuZCB5IGlzIGVsc2VFeHByLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uZGl0aW9uYWxFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoQ29uZGl0aW9uPENvbmRpdGlvbmFsRXhwcj4geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNvbmRpdGlvbjsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiB0aGVuRXhwcjsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBlbHNlRXhwcjsKKworICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IEJvb2xlYW5MaXRlcmFsRXhwcigpLCBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoKSwgbmV3IFN0cmluZ0xpdGVyYWxFeHByKCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIoRXhwcmVzc2lvbiBjb25kaXRpb24sIEV4cHJlc3Npb24gdGhlbkV4cHIsIEV4cHJlc3Npb24gZWxzZUV4cHIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBjb25kaXRpb24sIHRoZW5FeHByLCBlbHNlRXhwcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgRXhwcmVzc2lvbiB0aGVuRXhwciwgRXhwcmVzc2lvbiBlbHNlRXhwcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisgICAgICAgIHNldFRoZW5FeHByKHRoZW5FeHByKTsKKyAgICAgICAgc2V0RWxzZUV4cHIoZWxzZUV4cHIpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RWxzZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBlbHNlRXhwcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0VGhlbkV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGVuRXhwcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENvbmRpdGlvbmFsRXhwciBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25kaXRpb24pOworICAgICAgICBpZiAoY29uZGl0aW9uID09IHRoaXMuY29uZGl0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKENvbmRpdGlvbmFsRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQ09ORElUSU9OLCB0aGlzLmNvbmRpdGlvbiwgY29uZGl0aW9uKTsKKyAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoY29uZGl0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIgc2V0RWxzZUV4cHIoZmluYWwgRXhwcmVzc2lvbiBlbHNlRXhwcikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGVsc2VFeHByKTsKKyAgICAgICAgaWYgKGVsc2VFeHByID09IHRoaXMuZWxzZUV4cHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ29uZGl0aW9uYWxFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5FTFNFX0VYUFIsIHRoaXMuZWxzZUV4cHIsIGVsc2VFeHByKTsKKyAgICAgICAgaWYgKHRoaXMuZWxzZUV4cHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZWxzZUV4cHIuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5lbHNlRXhwciA9IGVsc2VFeHByOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihlbHNlRXhwcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29uZGl0aW9uYWxFeHByIHNldFRoZW5FeHByKGZpbmFsIEV4cHJlc3Npb24gdGhlbkV4cHIpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGVuRXhwcik7CisgICAgICAgIGlmICh0aGVuRXhwciA9PSB0aGlzLnRoZW5FeHByKSB7CisgICAgICAgICAgICByZXR1cm4gKENvbmRpdGlvbmFsRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVEhFTl9FWFBSLCB0aGlzLnRoZW5FeHByLCB0aGVuRXhwcik7CisgICAgICAgIGlmICh0aGlzLnRoZW5FeHByICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnRoZW5FeHByLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudGhlbkV4cHIgPSB0aGVuRXhwcjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhlbkV4cHIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIENvbmRpdGlvbmFsRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChDb25kaXRpb25hbEV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIENvbmRpdGlvbmFsRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gY29uZGl0aW9uKSB7CisgICAgICAgICAgICBzZXRDb25kaXRpb24oKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBlbHNlRXhwcikgeworICAgICAgICAgICAgc2V0RWxzZUV4cHIoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSB0aGVuRXhwcikgeworICAgICAgICAgICAgc2V0VGhlbkV4cHIoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbmRpdGlvbmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIgYXNDb25kaXRpb25hbEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNvbmRpdGlvbmFsRXhwcihDb25zdW1lcjxDb25kaXRpb25hbEV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q29uZGl0aW9uYWxFeHByPiB0b0NvbmRpdGlvbmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Eb3VibGVMaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0RvdWJsZUxpdGVyYWxFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3ZmRmMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Eb3VibGVMaXRlcmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRG91YmxlTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBmbG9hdCBvciBhIGRvdWJsZSBjb25zdGFudC4gVGhpcyB2YWx1ZSBpcyBzdG9yZWQgZXhhY3RseSBhcyBmb3VuZCBpbiB0aGUgc291cmNlLgorICogPGJyLz48Y29kZT4xMDAuMWY8L2NvZGU+CisgKiA8YnIvPjxjb2RlPjIzOTU4RDwvY29kZT4KKyAqIDxici8+PGNvZGU+MHg0LjVwMWY8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEb3VibGVMaXRlcmFsRXhwciBleHRlbmRzIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHIgeworCisgICAgcHVibGljIERvdWJsZUxpdGVyYWxFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsICIwIik7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIERvdWJsZUxpdGVyYWxFeHByKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIERvdWJsZUxpdGVyYWxFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UsIHZhbHVlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRG91YmxlTGl0ZXJhbEV4cHIoZmluYWwgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIHRoaXMobnVsbCwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUgYXMgYSBkb3VibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGFzRG91YmxlKCkgeworICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRG91YmxlTGl0ZXJhbEV4cHIgc2V0RG91YmxlKGRvdWJsZSB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIERvdWJsZUxpdGVyYWxFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKERvdWJsZUxpdGVyYWxFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBEb3VibGVMaXRlcmFsRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmRvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZUxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIERvdWJsZUxpdGVyYWxFeHByIGFzRG91YmxlTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkRvdWJsZUxpdGVyYWxFeHByKENvbnN1bWVyPERvdWJsZUxpdGVyYWxFeHByPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPERvdWJsZUxpdGVyYWxFeHByPiB0b0RvdWJsZUxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0VuY2xvc2VkRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0VuY2xvc2VkRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDU2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRW5jbG9zZWRFeHByLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRW5jbG9zZWRFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIEFuIGV4cHJlc3Npb24gYmV0d2VlbiAoICkuCisgKiA8YnIvPjxjb2RlPigxKzEpPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW5jbG9zZWRFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gaW5uZXI7CisKKyAgICBwdWJsaWMgRW5jbG9zZWRFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTdHJpbmdMaXRlcmFsRXhwcigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgRW5jbG9zZWRFeHByKGZpbmFsIEV4cHJlc3Npb24gaW5uZXIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBpbm5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbmNsb3NlZEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIGlubmVyKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRJbm5lcihpbm5lcik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0SW5uZXIoKSB7CisgICAgICAgIHJldHVybiBpbm5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbm5lciBleHByZXNzaW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5uZXIgdGhlIGlubmVyIGV4cHJlc3Npb24sIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgRW5jbG9zZWRFeHByCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbmNsb3NlZEV4cHIgc2V0SW5uZXIoZmluYWwgRXhwcmVzc2lvbiBpbm5lcikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGlubmVyKTsKKyAgICAgICAgaWYgKGlubmVyID09IHRoaXMuaW5uZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoRW5jbG9zZWRFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5JTk5FUiwgdGhpcy5pbm5lciwgaW5uZXIpOworICAgICAgICBpZiAodGhpcy5pbm5lciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5pbm5lci5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGlubmVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW5jbG9zZWRFeHByIHJlbW92ZUlubmVyKCkgeworICAgICAgICByZXR1cm4gc2V0SW5uZXIoKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW5jbG9zZWRFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEVuY2xvc2VkRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW5jbG9zZWRFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuZW5jbG9zZWRFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBpbm5lcikgeworICAgICAgICAgICAgc2V0SW5uZXIoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY2xvc2VkRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbmNsb3NlZEV4cHIgYXNFbmNsb3NlZEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkVuY2xvc2VkRXhwcihDb25zdW1lcjxFbmNsb3NlZEV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RW5jbG9zZWRFeHByPiB0b0VuY2xvc2VkRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9FeHByZXNzaW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWU1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkV4cHJlc3Npb25NZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIGV4cHJlc3Npb25zLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIE5vZGUgeworCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEV4cHJlc3Npb24oKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoRXhwcmVzc2lvbikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbk1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmV4cHJlc3Npb25NZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEFubm90YXRpb25FeHByIGFzQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEFubm90YXRpb25FeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5QWNjZXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlBY2Nlc3NFeHByIGFzQXJyYXlBY2Nlc3NFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBBcnJheUFjY2Vzc0V4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByIGFzQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEFycmF5Q3JlYXRpb25FeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5SW5pdGlhbGl6ZXJFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwciBhc0FycmF5SW5pdGlhbGl6ZXJFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBBcnJheUluaXRpYWxpemVyRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25FeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBc3NpZ25FeHByIGFzQXNzaWduRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQXNzaWduRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNCaW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCaW5hcnlFeHByIGFzQmluYXJ5RXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQmluYXJ5RXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNCb29sZWFuTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW5MaXRlcmFsRXhwciBhc0Jvb2xlYW5MaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQm9vbGVhbkxpdGVyYWxFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc3RFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYXN0RXhwciBhc0Nhc3RFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBDYXN0RXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFyTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIENoYXJMaXRlcmFsRXhwciBhc0NoYXJMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQ2hhckxpdGVyYWxFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NFeHByIGFzQ2xhc3NFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBDbGFzc0V4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZGl0aW9uYWxFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIgYXNDb25kaXRpb25hbEV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIENvbmRpdGlvbmFsRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNEb3VibGVMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRG91YmxlTGl0ZXJhbEV4cHIgYXNEb3VibGVMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gRG91YmxlTGl0ZXJhbEV4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5jbG9zZWRFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbmNsb3NlZEV4cHIgYXNFbmNsb3NlZEV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEVuY2xvc2VkRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZEFjY2Vzc0V4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwciBhc0ZpZWxkQWNjZXNzRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gRmllbGRBY2Nlc3NFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlT2ZFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnN0YW5jZU9mRXhwciBhc0luc3RhbmNlT2ZFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBJbnN0YW5jZU9mRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnRlZ2VyTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXJMaXRlcmFsRXhwciBhc0ludGVnZXJMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gSW50ZWdlckxpdGVyYWxFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhbWJkYUV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIExhbWJkYUV4cHIgYXNMYW1iZGFFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBMYW1iZGFFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXRlcmFsRXhwciBhc0xpdGVyYWxFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBMaXRlcmFsRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNMaXRlcmFsU3RyaW5nVmFsdWVFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXRlcmFsU3RyaW5nVmFsdWVFeHByIGFzTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIExvbmdMaXRlcmFsRXhwciBhc0xvbmdMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTG9uZ0xpdGVyYWxFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hcmtlckFubm90YXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uRXhwciBhc01hcmtlckFubm90YXRpb25FeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBNYXJrZXJBbm5vdGF0aW9uRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RDYWxsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHIgYXNNZXRob2RDYWxsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTWV0aG9kQ2FsbEV4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kUmVmZXJlbmNlRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kUmVmZXJlbmNlRXhwciBhc01ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIE1ldGhvZFJlZmVyZW5jZUV4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWVFeHByIGFzTmFtZUV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIE5hbWVFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vcm1hbEFubm90YXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBhc05vcm1hbEFubm90YXRpb25FeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBOb3JtYWxBbm5vdGF0aW9uRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE51bGxMaXRlcmFsRXhwciBhc051bGxMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTnVsbExpdGVyYWxFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdENyZWF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIGFzT2JqZWN0Q3JlYXRpb25FeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBPYmplY3RDcmVhdGlvbkV4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIGFzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmluZ0xpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdHJpbmdMaXRlcmFsRXhwciBhc1N0cmluZ0xpdGVyYWxFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBTdHJpbmdMaXRlcmFsRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNTdXBlckV4cHIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN1cGVyRXhwciBhc1N1cGVyRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gU3VwZXJFeHByIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RoaXNFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUaGlzRXhwciBhc1RoaXNFeHByKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBUaGlzRXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZUV4cHIgYXNUeXBlRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gVHlwZUV4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBVbmFyeUV4cHIgYXNVbmFyeUV4cHIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFVuYXJ5RXhwciIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgYXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQW5ub3RhdGlvbkV4cHIoQ29uc3VtZXI8QW5ub3RhdGlvbkV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkFycmF5QWNjZXNzRXhwcihDb25zdW1lcjxBcnJheUFjY2Vzc0V4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkFycmF5Q3JlYXRpb25FeHByKENvbnN1bWVyPEFycmF5Q3JlYXRpb25FeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZBcnJheUluaXRpYWxpemVyRXhwcihDb25zdW1lcjxBcnJheUluaXRpYWxpemVyRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXNzaWduRXhwcihDb25zdW1lcjxBc3NpZ25FeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZCaW5hcnlFeHByKENvbnN1bWVyPEJpbmFyeUV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkJvb2xlYW5MaXRlcmFsRXhwcihDb25zdW1lcjxCb29sZWFuTGl0ZXJhbEV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNhc3RFeHByKENvbnN1bWVyPENhc3RFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZDaGFyTGl0ZXJhbEV4cHIoQ29uc3VtZXI8Q2hhckxpdGVyYWxFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZDbGFzc0V4cHIoQ29uc3VtZXI8Q2xhc3NFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZDb25kaXRpb25hbEV4cHIoQ29uc3VtZXI8Q29uZGl0aW9uYWxFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZEb3VibGVMaXRlcmFsRXhwcihDb25zdW1lcjxEb3VibGVMaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRW5jbG9zZWRFeHByKENvbnN1bWVyPEVuY2xvc2VkRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRmllbGRBY2Nlc3NFeHByKENvbnN1bWVyPEZpZWxkQWNjZXNzRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmSW5zdGFuY2VPZkV4cHIoQ29uc3VtZXI8SW5zdGFuY2VPZkV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkludGVnZXJMaXRlcmFsRXhwcihDb25zdW1lcjxJbnRlZ2VyTGl0ZXJhbEV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkxhbWJkYUV4cHIoQ29uc3VtZXI8TGFtYmRhRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTGl0ZXJhbEV4cHIoQ29uc3VtZXI8TGl0ZXJhbEV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkxpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoQ29uc3VtZXI8TGl0ZXJhbFN0cmluZ1ZhbHVlRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTG9uZ0xpdGVyYWxFeHByKENvbnN1bWVyPExvbmdMaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTWFya2VyQW5ub3RhdGlvbkV4cHIoQ29uc3VtZXI8TWFya2VyQW5ub3RhdGlvbkV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk1ldGhvZENhbGxFeHByKENvbnN1bWVyPE1ldGhvZENhbGxFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNZXRob2RSZWZlcmVuY2VFeHByKENvbnN1bWVyPE1ldGhvZFJlZmVyZW5jZUV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk5hbWVFeHByKENvbnN1bWVyPE5hbWVFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZOb3JtYWxBbm5vdGF0aW9uRXhwcihDb25zdW1lcjxOb3JtYWxBbm5vdGF0aW9uRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTnVsbExpdGVyYWxFeHByKENvbnN1bWVyPE51bGxMaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmT2JqZWN0Q3JlYXRpb25FeHByKENvbnN1bWVyPE9iamVjdENyZWF0aW9uRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoQ29uc3VtZXI8U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlN0cmluZ0xpdGVyYWxFeHByKENvbnN1bWVyPFN0cmluZ0xpdGVyYWxFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZTdXBlckV4cHIoQ29uc3VtZXI8U3VwZXJFeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZUaGlzRXhwcihDb25zdW1lcjxUaGlzRXhwcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVHlwZUV4cHIoQ29uc3VtZXI8VHlwZUV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlVuYXJ5RXhwcihDb25zdW1lcjxVbmFyeUV4cHI+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlZhcmlhYmxlRGVjbGFyYXRpb25FeHByKENvbnN1bWVyPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGNhbGN1bGF0ZVJlc29sdmVkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkuY2FsY3VsYXRlVHlwZSh0aGlzKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEFubm90YXRpb25FeHByPiB0b0Fubm90YXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEFycmF5QWNjZXNzRXhwcj4gdG9BcnJheUFjY2Vzc0V4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXJyYXlDcmVhdGlvbkV4cHI+IHRvQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXJyYXlJbml0aWFsaXplckV4cHI+IHRvQXJyYXlJbml0aWFsaXplckV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXNzaWduRXhwcj4gdG9Bc3NpZ25FeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEJpbmFyeUV4cHI+IHRvQmluYXJ5RXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxCb29sZWFuTGl0ZXJhbEV4cHI+IHRvQm9vbGVhbkxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPENhc3RFeHByPiB0b0Nhc3RFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPENoYXJMaXRlcmFsRXhwcj4gdG9DaGFyTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q2xhc3NFeHByPiB0b0NsYXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxDb25kaXRpb25hbEV4cHI+IHRvQ29uZGl0aW9uYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPERvdWJsZUxpdGVyYWxFeHByPiB0b0RvdWJsZUxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEVuY2xvc2VkRXhwcj4gdG9FbmNsb3NlZEV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RmllbGRBY2Nlc3NFeHByPiB0b0ZpZWxkQWNjZXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJbnN0YW5jZU9mRXhwcj4gdG9JbnN0YW5jZU9mRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJbnRlZ2VyTGl0ZXJhbEV4cHI+IHRvSW50ZWdlckxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPExhbWJkYUV4cHI+IHRvTGFtYmRhRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxMaXRlcmFsRXhwcj4gdG9MaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxMaXRlcmFsU3RyaW5nVmFsdWVFeHByPiB0b0xpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TG9uZ0xpdGVyYWxFeHByPiB0b0xvbmdMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNYXJrZXJBbm5vdGF0aW9uRXhwcj4gdG9NYXJrZXJBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RDYWxsRXhwcj4gdG9NZXRob2RDYWxsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RSZWZlcmVuY2VFeHByPiB0b01ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TmFtZUV4cHI+IHRvTmFtZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Tm9ybWFsQW5ub3RhdGlvbkV4cHI+IHRvTm9ybWFsQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TnVsbExpdGVyYWxFeHByPiB0b051bGxMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxPYmplY3RDcmVhdGlvbkV4cHI+IHRvT2JqZWN0Q3JlYXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByPiB0b1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFN0cmluZ0xpdGVyYWxFeHByPiB0b1N0cmluZ0xpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFN1cGVyRXhwcj4gdG9TdXBlckV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VGhpc0V4cHI+IHRvVGhpc0V4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VHlwZUV4cHI+IHRvVHlwZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VW5hcnlFeHByPiB0b1VuYXJ5RXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gdG9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ZpZWxkQWNjZXNzRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ZpZWxkQWNjZXNzRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjllMGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRmllbGRBY2Nlc3NFeHByLmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTY29wZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBBY2Nlc3Mgb2YgYSBmaWVsZCBvZiBhbiBvYmplY3QuCisgKiA8YnIvPkluIDxjb2RlPnBlcnNvbi5uYW1lPC9jb2RlPiAibmFtZSIgaXMgdGhlIG5hbWUgYW5kICJwZXJzb24iIGlzIHRoZSBzY29wZS4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpZWxkQWNjZXNzRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFNpbXBsZU5hbWU8RmllbGRBY2Nlc3NFeHByPiwgTm9kZVdpdGhUeXBlQXJndW1lbnRzPEZpZWxkQWNjZXNzRXhwcj4sIE5vZGVXaXRoU2NvcGU8RmllbGRBY2Nlc3NFeHByPiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gc2NvcGU7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50czsKKworICAgIHByaXZhdGUgU2ltcGxlTmFtZSBuYW1lOworCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgVGhpc0V4cHIoKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgU2ltcGxlTmFtZShuYW1lKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBmaW5hbCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBzY29wZSwgdHlwZUFyZ3VtZW50cywgbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIHNjb3BlLCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwciBzZXROYW1lKGZpbmFsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoRmllbGRBY2Nlc3NFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB7QGxpbmsgI2dldE5hbWV9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHtAbGluayAjc2V0TmFtZX0gd2l0aCBuZXcgU2ltcGxlTmFtZShmaWVsZCkgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIgc2V0RmllbGQoZmluYWwgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHNldE5hbWUobmV3IFNpbXBsZU5hbWUoZmllbGQpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHtAbGluayAjc2V0TmFtZX0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIgc2V0RmllbGRFeHByKFNpbXBsZU5hbWUgaW5uZXIpIHsKKyAgICAgICAgcmV0dXJuIHNldE5hbWUoaW5uZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNjb3BlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlLCBjYW4gbm90IGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBGaWVsZEFjY2Vzc0V4cHIKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwciBzZXRTY29wZShmaW5hbCBFeHByZXNzaW9uIHNjb3BlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2NvcGUpOworICAgICAgICBpZiAoc2NvcGUgPT0gdGhpcy5zY29wZSkgeworICAgICAgICAgICAgcmV0dXJuIChGaWVsZEFjY2Vzc0V4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlNDT1BFLCB0aGlzLnNjb3BlLCBzY29wZSk7CisgICAgICAgIGlmICh0aGlzLnNjb3BlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnNjb3BlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2Yoc2NvcGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE5vZGVMaXN0PFR5cGU+PiBnZXRUeXBlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0eXBlIGFyZ3VtZW50cworICAgICAqCisgICAgICogQHBhcmFtIHR5cGVBcmd1bWVudHMgdGhlIHR5cGUgYXJndW1lbnRzLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIEZpZWxkQWNjZXNzRXhwcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRmllbGRBY2Nlc3NFeHByIHNldFR5cGVBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSB0aGlzLnR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoRmllbGRBY2Nlc3NFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFX0FSR1VNRU5UUywgdGhpcy50eXBlQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlQXJndW1lbnRzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVBcmd1bWVudHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChGaWVsZEFjY2Vzc0V4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKChTaW1wbGVOYW1lKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gc2NvcGUpIHsKKyAgICAgICAgICAgIHNldFNjb3BlKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkQWNjZXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIgYXNGaWVsZEFjY2Vzc0V4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkZpZWxkQWNjZXNzRXhwcihDb25zdW1lcjxGaWVsZEFjY2Vzc0V4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RmllbGRBY2Nlc3NFeHByPiB0b0ZpZWxkQWNjZXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0luc3RhbmNlT2ZFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhNTA1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwci5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkluc3RhbmNlT2ZFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFVzYWdlIG9mIHRoZSBpbnN0YW5jZW9mIG9wZXJhdG9yLgorICogPGJyLz48Y29kZT50b29sIGluc3RhbmNlb2YgRHJpbGw8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZU9mRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGU8SW5zdGFuY2VPZkV4cHIsIFJlZmVyZW5jZVR5cGU+LCBOb2RlV2l0aEV4cHJlc3Npb248SW5zdGFuY2VPZkV4cHI+IHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlIHR5cGU7CisKKyAgICBwdWJsaWMgSW5zdGFuY2VPZkV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5hbWVFeHByKCksIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgSW5zdGFuY2VPZkV4cHIoZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBmaW5hbCBSZWZlcmVuY2VUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBleHByZXNzaW9uLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIEluc3RhbmNlT2ZFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBSZWZlcmVuY2VUeXBlIHR5cGUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZWZlcmVuY2VUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW5zdGFuY2VPZkV4cHIgc2V0RXhwcmVzc2lvbihmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChleHByZXNzaW9uKTsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gdGhpcy5leHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKEluc3RhbmNlT2ZFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5FWFBSRVNTSU9OLCB0aGlzLmV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24uc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZXhwcmVzc2lvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW5zdGFuY2VPZkV4cHIgc2V0VHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKEluc3RhbmNlT2ZFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFLCB0aGlzLnR5cGUsIHR5cGUpOworICAgICAgICBpZiAodGhpcy50eXBlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW5zdGFuY2VPZkV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoSW5zdGFuY2VPZkV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEluc3RhbmNlT2ZFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBzZXRUeXBlKChSZWZlcmVuY2VUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnN0YW5jZU9mRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnN0YW5jZU9mRXhwciBhc0luc3RhbmNlT2ZFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZJbnN0YW5jZU9mRXhwcihDb25zdW1lcjxJbnN0YW5jZU9mRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJbnN0YW5jZU9mRXhwcj4gdG9JbnN0YW5jZU9mRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQzOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ludGVnZXJMaXRlcmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFsbCB3YXlzIHRvIHNwZWNpZnkgYW4gaW50IGxpdGVyYWwuCisgKiA8YnIvPjxjb2RlPjg5MzQ8L2NvZGU+CisgKiA8YnIvPjxjb2RlPjB4MDE8L2NvZGU+CisgKiA8YnIvPjxjb2RlPjAyMjwvY29kZT4KKyAqIDxici8+PGNvZGU+MEIxMDEwMTAxMDwvY29kZT4KKyAqIDxici8+PGNvZGU+OTk5OTk5OTlMPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW50ZWdlckxpdGVyYWxFeHByIGV4dGVuZHMgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwciB7CisKKyAgICBwdWJsaWMgSW50ZWdlckxpdGVyYWxFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsICIwIik7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEludGVnZXJMaXRlcmFsRXhwcihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgdmFsdWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHIoZmluYWwgaW50IHZhbHVlKSB7CisgICAgICAgIHRoaXMobnVsbCwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUgYXMgYW4gaW50ZWdlciB3aGlsZSByZXNwZWN0aW5nIGRpZmZlcmVudCBudW1iZXIgcmVwcmVzZW50YXRpb25zCisgICAgICovCisgICAgcHVibGljIGludCBhc0ludCgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHZhbHVlLnJlcGxhY2VBbGwoIl8iLCAiIik7CisgICAgICAgIGlmIChyZXN1bHQuc3RhcnRzV2l0aCgiMHgiKSB8fCByZXN1bHQuc3RhcnRzV2l0aCgiMFgiKSkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VVbnNpZ25lZEludChyZXN1bHQuc3Vic3RyaW5nKDIpLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdC5zdGFydHNXaXRoKCIwYiIpIHx8IHJlc3VsdC5zdGFydHNXaXRoKCIwQiIpKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZVVuc2lnbmVkSW50KHJlc3VsdC5zdWJzdHJpbmcoMiksIDIpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAxICYmIHJlc3VsdC5zdGFydHNXaXRoKCIwIikpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlVW5zaWduZWRJbnQocmVzdWx0LnN1YnN0cmluZygxKSwgOCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlckxpdGVyYWxFeHByIHNldEludChpbnQgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoSW50ZWdlckxpdGVyYWxFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5pbnRlZ2VyTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZWdlckxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXJMaXRlcmFsRXhwciBhc0ludGVnZXJMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmSW50ZWdlckxpdGVyYWxFeHByKENvbnN1bWVyPEludGVnZXJMaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJbnRlZ2VyTGl0ZXJhbEV4cHI+IHRvSW50ZWdlckxpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xhbWJkYUV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MYW1iZGFFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5MTc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MYW1iZGFFeHByLmphdmEKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRGVyaXZlZFByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTGFtYmRhRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIDxoMT5BIGxhbWJkYSBleHByZXNzaW9uPC9oMT4KKyAqIDxoMj5KYXZhIDEtNzwvaDI+CisgKiBEb2VzIG5vdCBleGlzdC4KKyAqIDxoMj5KYXZhIDgrPC9oMj4KKyAqIDxjb2RlPihhLCBiKSAtPiBhICsgYjwvY29kZT4KKyAqIDxici8+PGNvZGU+YSAtPiAuLi48L2NvZGU+CisgKiA8YnIvPjxjb2RlPihMb25nIGEpIC0+IHsgcHJpbnRsbihhKTsgfTwvY29kZT4KKyAqIDxwLz5UaGUgcGFyYW1ldGVycyBhcmUgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgLT4uCisgKiBJZiBhIHBhcmFtZXRlciB1c2VzIHR5cGUgaW5mZXJlbmNlIChpdCBoYXMgbm8gdHlwZSBzcGVjaWZpZWQpIHRoZW4gaXRzIHR5cGUgaXMgc2V0IHRvIDxjb2RlPlVua25vd25UeXBlPC9jb2RlPi4KKyAqIElmIHRoZXkgYXJlIGluICggKSwgImlzRW5jbG9zaW5nUGFyYW1ldGVycyIgaXMgdHJ1ZS4KKyAqIDxici8+VGhlIGJvZHkgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSAtPi4KKyAqIFRoZSBib2R5IGlzIGVpdGhlciBhIEJsb2NrU3RhdGVtZW50IHdoZW4gaXQgaXMgaW4geyB9IGJyYWNlcywgb3IgYW4gRXhwcmVzc2lvblN0YXRlbWVudCB3aGVuIGl0IGlzIG5vdCBpbiBicmFjZXMuCisgKgorICogQGF1dGhvciBSYXF1ZWwgUGF1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMYW1iZGFFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoUGFyYW1ldGVyczxMYW1iZGFFeHByPiB7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVyczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuY2xvc2luZ1BhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIFN0YXRlbWVudCBib2R5OworCisgICAgcHVibGljIExhbWJkYUV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFJldHVyblN0bXQoKSwgZmFsc2UpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBMYW1iZGFFeHByKE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgU3RhdGVtZW50IGJvZHksIGJvb2xlYW4gaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKSB7CisgICAgICAgIHRoaXMobnVsbCwgcGFyYW1ldGVycywgYm9keSwgaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIExhbWJkYUV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIFN0YXRlbWVudCBib2R5LCBib29sZWFuIGlzRW5jbG9zaW5nUGFyYW1ldGVycykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0Qm9keShib2R5KTsKKyAgICAgICAgc2V0RW5jbG9zaW5nUGFyYW1ldGVycyhpc0VuY2xvc2luZ1BhcmFtZXRlcnMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIExhbWJkYUV4cHIgc2V0UGFyYW1ldGVycyhmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gdGhpcy5wYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKExhbWJkYUV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlBBUkFNRVRFUlMsIHRoaXMucGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0aGlzLnBhcmFtZXRlcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihwYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIEJsb2NrU3RhdGVtZW50IG9yIGFuIEV4cHJlc3Npb25TdGF0ZW1lbnQuIFNlZSBjbGFzcyBKYXZhZG9jLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiBib2R5OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGFtYmRhRXhwciBzZXRCb2R5KGZpbmFsIFN0YXRlbWVudCBib2R5KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYm9keSk7CisgICAgICAgIGlmIChib2R5ID09IHRoaXMuYm9keSkgeworICAgICAgICAgICAgcmV0dXJuIChMYW1iZGFFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5CT0RZLCB0aGlzLmJvZHksIGJvZHkpOworICAgICAgICBpZiAodGhpcy5ib2R5ICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmJvZHkuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYm9keSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5jbG9zaW5nUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIGlzRW5jbG9zaW5nUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIExhbWJkYUV4cHIgc2V0RW5jbG9zaW5nUGFyYW1ldGVycyhmaW5hbCBib29sZWFuIGlzRW5jbG9zaW5nUGFyYW1ldGVycykgeworICAgICAgICBpZiAoaXNFbmNsb3NpbmdQYXJhbWV0ZXJzID09IHRoaXMuaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKExhbWJkYUV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVOQ0xPU0lOR19QQVJBTUVURVJTLCB0aGlzLmlzRW5jbG9zaW5nUGFyYW1ldGVycywgaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5pc0VuY2xvc2luZ1BhcmFtZXRlcnMgPSBpc0VuY2xvc2luZ1BhcmFtZXRlcnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSBib2R5IG9mIHRoaXMgbGFtYmRhIGlzIGEgc2ltcGxlIGV4cHJlc3Npb24sIHJldHVybiB0aGF0IGV4cHJlc3Npb24uCisgICAgICogT3RoZXJ3aXNlICh3aGVuIHRoZSBib2R5IGlzIGEgYmxvY2spIHJldHVybiBPcHRpb25hbC5lbXB0eSgpLgorICAgICAqLworICAgIEBEZXJpdmVkUHJvcGVydHkKKyAgICBwdWJsaWMgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZ2V0RXhwcmVzc2lvbkJvZHkoKSB7CisgICAgICAgIGlmIChib2R5LmlzRXhwcmVzc2lvblN0bXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGJvZHkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGFtYmRhRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChMYW1iZGFFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMYW1iZGFFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwubGFtYmRhRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gYm9keSkgeworICAgICAgICAgICAgc2V0Qm9keSgoU3RhdGVtZW50KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0KGksIChQYXJhbWV0ZXIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNMYW1iZGFFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIExhbWJkYUV4cHIgYXNMYW1iZGFFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZMYW1iZGFFeHByKENvbnN1bWVyPExhbWJkYUV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TGFtYmRhRXhwcj4gdG9MYW1iZGFFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzgxNTYwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkxpdGVyYWxFeHByTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciBhbGwgbGl0ZXJhbCBleHByZXNzaW9ucy4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIExpdGVyYWxFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXRlcmFsRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXRlcmFsRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChMaXRlcmFsRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5saXRlcmFsRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXRlcmFsRXhwciBhc0xpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZMaXRlcmFsRXhwcihDb25zdW1lcjxMaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxMaXRlcmFsRXhwcj4gdG9MaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MaXRlcmFsU3RyaW5nVmFsdWVFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTYxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5MaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFueSBsaXRlcmFsIHZhbHVlIHRoYXQgaXMgc3RvcmVkIGludGVybmFsbHkgYXMgYSBTdHJpbmcuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXRlcmFsU3RyaW5nVmFsdWVFeHByIGV4dGVuZHMgTGl0ZXJhbEV4cHIgeworCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBMaXRlcmFsU3RyaW5nVmFsdWVFeHByKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwciBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLnZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gKExpdGVyYWxTdHJpbmdWYWx1ZUV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlZBTFVFLCB0aGlzLnZhbHVlLCB2YWx1ZSk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXRlcmFsU3RyaW5nVmFsdWVFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKExpdGVyYWxTdHJpbmdWYWx1ZUV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5saXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwciBhc0xpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkxpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoQ29uc3VtZXI8TGl0ZXJhbFN0cmluZ1ZhbHVlRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxMaXRlcmFsU3RyaW5nVmFsdWVFeHByPiB0b0xpdGVyYWxTdHJpbmdWYWx1ZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTG9uZ0xpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTG9uZ0xpdGVyYWxFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1NDQyZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Mb25nTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Mb25nTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBbGwgd2F5cyB0byBzcGVjaWZ5IGEgbG9uZyBsaXRlcmFsLgorICogPGJyLz48Y29kZT44OTM0bDwvY29kZT4KKyAqIDxici8+PGNvZGU+MHgwMUw8L2NvZGU+CisgKiA8YnIvPjxjb2RlPjAyMmw8L2NvZGU+CisgKiA8YnIvPjxjb2RlPjBCMTAxMDEwMTBMPC9jb2RlPgorICogPGJyLz48Y29kZT45OTk5OTk5OUw8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMb25nTGl0ZXJhbEV4cHIgZXh0ZW5kcyBMaXRlcmFsU3RyaW5nVmFsdWVFeHByIHsKKworICAgIHB1YmxpYyBMb25nTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgIjAiKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTG9uZ0xpdGVyYWxFeHByKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIExvbmdMaXRlcmFsRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCB2YWx1ZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIExvbmdMaXRlcmFsRXhwcihmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgICAgIHRoaXMobnVsbCwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUgYXMgYW4gbG9uZyB3aGlsZSByZXNwZWN0aW5nIGRpZmZlcmVudCBudW1iZXIgcmVwcmVzZW50YXRpb25zCisgICAgICovCisgICAgcHVibGljIGxvbmcgYXNMb25nKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdmFsdWUucmVwbGFjZUFsbCgiXyIsICIiKTsKKyAgICAgICAgY2hhciBsYXN0Q2hhciA9IHJlc3VsdC5jaGFyQXQocmVzdWx0Lmxlbmd0aCgpIC0gMSk7CisgICAgICAgIGlmIChsYXN0Q2hhciA9PSAnbCcgfHwgbGFzdENoYXIgPT0gJ0wnKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuc3RhcnRzV2l0aCgiMHgiKSB8fCByZXN1bHQuc3RhcnRzV2l0aCgiMFgiKSkgeworICAgICAgICAgICAgcmV0dXJuIExvbmcucGFyc2VVbnNpZ25lZExvbmcocmVzdWx0LnN1YnN0cmluZygyKSwgMTYpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuc3RhcnRzV2l0aCgiMGIiKSB8fCByZXN1bHQuc3RhcnRzV2l0aCgiMEIiKSkgeworICAgICAgICAgICAgcmV0dXJuIExvbmcucGFyc2VVbnNpZ25lZExvbmcocmVzdWx0LnN1YnN0cmluZygyKSwgMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDEgJiYgcmVzdWx0LnN0YXJ0c1dpdGgoIjAiKSkgeworICAgICAgICAgICAgcmV0dXJuIExvbmcucGFyc2VVbnNpZ25lZExvbmcocmVzdWx0LnN1YnN0cmluZygxKSwgOCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIExvbmdMaXRlcmFsRXhwciBzZXRMb25nKGxvbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMb25nTGl0ZXJhbEV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoTG9uZ0xpdGVyYWxFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMb25nTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5sb25nTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZ0xpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIExvbmdMaXRlcmFsRXhwciBhc0xvbmdMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTG9uZ0xpdGVyYWxFeHByKENvbnN1bWVyPExvbmdMaXRlcmFsRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxMb25nTGl0ZXJhbEV4cHI+IHRvTG9uZ0xpdGVyYWxFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01hcmtlckFubm90YXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWFya2VyQW5ub3RhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWFiODk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01hcmtlckFubm90YXRpb25FeHByLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5NYXJrZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlTmFtZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFuIGFubm90YXRpb24gdGhhdCB1c2VzIG9ubHkgdGhlIGFubm90YXRpb24gdHlwZSBuYW1lLgorICogPGJyLz48Y29kZT5AT3ZlcnJpZGU8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNYXJrZXJBbm5vdGF0aW9uRXhwciBleHRlbmRzIEFubm90YXRpb25FeHByIHsKKworICAgIHB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uRXhwcihmaW5hbCBOYW1lIG5hbWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIE1hcmtlckFubm90YXRpb25FeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgTmFtZSBuYW1lKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UsIG5hbWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNYXJrZXJBbm5vdGF0aW9uRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5tYXJrZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXJrZXJBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uRXhwciBhc01hcmtlckFubm90YXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNYXJrZXJBbm5vdGF0aW9uRXhwcihDb25zdW1lcjxNYXJrZXJBbm5vdGF0aW9uRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNYXJrZXJBbm5vdGF0aW9uRXhwcj4gdG9NYXJrZXJBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZW1iZXJWYWx1ZVBhaXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZW1iZXJWYWx1ZVBhaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNjYjdiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01lbWJlclZhbHVlUGFpci5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5NZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworCisvKioKKyAqIEEgdmFsdWUgZm9yIGEgbWVtYmVyIG9mIGFuIGFubm90YXRpb24uCisgKiBJbiA8Y29kZT5AQ291bnRlcnMoYT0xNSk8L2NvZGU+IGE9MTUgaXMgYSBNZW1iZXJWYWx1ZVBhaXIuIEl0cyBuYW1lIGlzIGEsIGFuZCBpdHMgdmFsdWUgaXMgMTUuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZW1iZXJWYWx1ZVBhaXIgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhTaW1wbGVOYW1lPE1lbWJlclZhbHVlUGFpcj4geworCisgICAgcHJpdmF0ZSBTaW1wbGVOYW1lIG5hbWU7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWU7CisKKyAgICBwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTaW1wbGVOYW1lKCksIG5ldyBTdHJpbmdMaXRlcmFsRXhwcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBFeHByZXNzaW9uIHZhbHVlKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IFNpbXBsZU5hbWUobmFtZSksIHZhbHVlKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKGZpbmFsIFNpbXBsZU5hbWUgbmFtZSwgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIE1lbWJlclZhbHVlUGFpcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFNpbXBsZU5hbWUgbmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWVtYmVyVmFsdWVQYWlyIHNldE5hbWUoZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IHRoaXMubmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChNZW1iZXJWYWx1ZVBhaXIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZW1iZXJWYWx1ZVBhaXIgc2V0VmFsdWUoZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHZhbHVlKTsKKyAgICAgICAgaWYgKHZhbHVlID09IHRoaXMudmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWVtYmVyVmFsdWVQYWlyKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5WQUxVRSwgdGhpcy52YWx1ZSwgdmFsdWUpOworICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZW1iZXJWYWx1ZVBhaXIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoTWVtYmVyVmFsdWVQYWlyKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5tZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IG5hbWUpIHsKKyAgICAgICAgICAgIHNldE5hbWUoKFNpbXBsZU5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgc2V0VmFsdWUoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZENhbGxFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5MTRjOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwci5qYXZhCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoT3B0aW9uYWxTY29wZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk1ldGhvZENhbGxFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk9wdGlvbmFsUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uU3ltYm9sUmVzb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIEEgbWV0aG9kIGNhbGwgb24gYW4gb2JqZWN0LiA8YnIvPjxjb2RlPmNpcmNsZS5jaXJjdW1mZXJlbmNlKCk8L2NvZGU+IDxici8+SW4gPGNvZGU+YS4mbHQ7U3RyaW5nJmd0O2JiKDE1KTs8L2NvZGU+IGEKKyAqIGlzIHRoZSBzY29wZSwgU3RyaW5nIGlzIGEgdHlwZSBhcmd1bWVudCwgYmIgaXMgdGhlIG5hbWUgYW5kIDE1IGlzIGFuIGFyZ3VtZW50LgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kQ2FsbEV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgTm9kZVdpdGhUeXBlQXJndW1lbnRzPE1ldGhvZENhbGxFeHByPiwgTm9kZVdpdGhBcmd1bWVudHM8TWV0aG9kQ2FsbEV4cHI+LCBOb2RlV2l0aFNpbXBsZU5hbWU8TWV0aG9kQ2FsbEV4cHI+LCBOb2RlV2l0aE9wdGlvbmFsU2NvcGU8TWV0aG9kQ2FsbEV4cHI+IHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHNjb3BlOworCisgICAgQE9wdGlvbmFsUHJvcGVydHkKKyAgICBwcml2YXRlIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHM7CisKKyAgICBwcml2YXRlIFNpbXBsZU5hbWUgbmFtZTsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzOworCisgICAgcHVibGljIE1ldGhvZENhbGxFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBTaW1wbGVOYW1lKCksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcihTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbi4uLiBhcmd1bWVudHMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgU2ltcGxlTmFtZShuYW1lKSwgbmV3IE5vZGVMaXN0PD4oYXJndW1lbnRzKSk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZENhbGxFeHByKGZpbmFsIEV4cHJlc3Npb24gc2NvcGUsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgc2NvcGUsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHIoZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgc2NvcGUsIG5ldyBOb2RlTGlzdDw+KCksIG5hbWUsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CisgICAgICAgIHRoaXMobnVsbCwgc2NvcGUsIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTaW1wbGVOYW1lIG5hbWUsIGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCBuZXcgTm9kZUxpc3Q8PigpLCBuYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBmaW5hbCBTaW1wbGVOYW1lIG5hbWUsIGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCB0eXBlQXJndW1lbnRzLCBuYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIHNjb3BlLCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBzZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRBcmd1bWVudHMoYXJndW1lbnRzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gYXJndW1lbnRzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cHJlc3Npb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShzY29wZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXRBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSB0aGlzLmFyZ3VtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIChNZXRob2RDYWxsRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQVJHVU1FTlRTLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmFyZ3VtZW50cy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXROYW1lKGZpbmFsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0aG9kQ2FsbEV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXRTY29wZShmaW5hbCBFeHByZXNzaW9uIHNjb3BlKSB7CisgICAgICAgIGlmIChzY29wZSA9PSB0aGlzLnNjb3BlKSB7CisgICAgICAgICAgICByZXR1cm4gKE1ldGhvZENhbGxFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5TQ09QRSwgdGhpcy5zY29wZSwgc2NvcGUpOworICAgICAgICBpZiAodGhpcy5zY29wZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5zY29wZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHNjb3BlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxOb2RlTGlzdDxUeXBlPj4gZ2V0VHlwZUFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUodHlwZUFyZ3VtZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdHlwZUFyZ3VtZW50cworICAgICAqCisgICAgICogQHBhcmFtIHR5cGVBcmd1bWVudHMgdGhlIHR5cGVBcmd1bWVudHMsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgTWV0aG9kQ2FsbEV4cHIKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE1ldGhvZENhbGxFeHByIHNldFR5cGVBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSB0aGlzLnR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0aG9kQ2FsbEV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEVfQVJHVU1FTlRTLCB0aGlzLnR5cGVBcmd1bWVudHMsIHR5cGVBcmd1bWVudHMpOworICAgICAgICBpZiAodGhpcy50eXBlQXJndW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnR5cGVBcmd1bWVudHMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy50eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHNjb3BlKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlU2NvcGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHIgcmVtb3ZlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzZXRTY29wZSgoRXhwcmVzc2lvbikgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZXRob2RDYWxsRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5tZXRob2RDYWxsRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMuc2V0KGksIChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IG5hbWUpIHsKKyAgICAgICAgICAgIHNldE5hbWUoKFNpbXBsZU5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gc2NvcGUpIHsKKyAgICAgICAgICAgICAgICBzZXRTY29wZSgoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnNldChpLCAoVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kQ2FsbEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHIgYXNNZXRob2RDYWxsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTWV0aG9kQ2FsbEV4cHIoQ29uc3VtZXI8TWV0aG9kQ2FsbEV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIHJlc29sdmVJbnZva2VkTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS5yZXNvbHZlRGVjbGFyYXRpb24odGhpcywgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RDYWxsRXhwcj4gdG9NZXRob2RDYWxsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RSZWZlcmVuY2VFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kUmVmZXJlbmNlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGFhYzAwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHIuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb25FbXB0eTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5NZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBNZXRob2QgcmVmZXJlbmNlIGV4cHJlc3Npb25zIGludHJvZHVjZWQgaW4gSmF2YSA4IHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzaW1wbGlmeSBsYW1iZGEgRXhwcmVzc2lvbnMuCisgKiBOb3RlIHRoYXQgdGhlIGZpZWxkICJpZGVudGlmaWVyIiwgaW5kaWNhdGluZyB0aGUgd29yZCB0byB0aGUgcmlnaHQgb2YgdGhlIDo6LCBpcyBub3QgYWx3YXlzIGEgbWV0aG9kIG5hbWUsCisgKiBpdCBjYW4gYmUgIm5ldyIuCisgKiA8YnIvPkluIDxjb2RlPlN5c3RlbS5vdXQ6OnByaW50bG47PC9jb2RlPiB0aGUgc2NvcGUgaXMgU3lzdGVtLm91dCBhbmQgdGhlIGlkZW50aWZpZXIgaXMgInByaW50bG4iCisgKiA8YnIvPjxjb2RlPih0ZXN0ID8gc3RyZWFtLm1hcChTdHJpbmc6OnRyaW0pIDogc3RyZWFtKTo6dG9BcnJheTs8L2NvZGU+CisgKiA8YnIvPkluIDxjb2RlPkJhciZsdDtTdHJpbmc+OjombHQ7SW50ZWdlcj5uZXc8L2NvZGU+IHRoZSBTdHJpbmcgdHlwZSBhcmd1bWVudCBpcyBvbiB0aGUgc2NvcGUsCisgKiBhbmQgdGhlIEludGVnZXIgdHlwZSBhcmd1bWVudCBpcyBvbiB0aGlzIE1ldGhvZFJlZmVyZW5jZUV4cHIuCisgKgorICogQGF1dGhvciBSYXF1ZWwgUGF1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RSZWZlcmVuY2VFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZUFyZ3VtZW50czxNZXRob2RSZWZlcmVuY2VFeHByPiwgTm9kZVdpdGhJZGVudGlmaWVyPE1ldGhvZFJlZmVyZW5jZUV4cHI+IHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBzY29wZTsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzOworCisgICAgQE5vbkVtcHR5UHJvcGVydHkKKyAgICBwcml2YXRlIFN0cmluZyBpZGVudGlmaWVyOworCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IENsYXNzRXhwcigpLCBudWxsLCAiZW1wdHkiKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTWV0aG9kUmVmZXJlbmNlRXhwcihFeHByZXNzaW9uIHNjb3BlLCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCB0eXBlQXJndW1lbnRzLCBpZGVudGlmaWVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIHNjb3BlLCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBzZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworICAgICAgICBzZXRJZGVudGlmaWVyKGlkZW50aWZpZXIpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RSZWZlcmVuY2VFeHByIHNldFNjb3BlKGZpbmFsIEV4cHJlc3Npb24gc2NvcGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzY29wZSk7CisgICAgICAgIGlmIChzY29wZSA9PSB0aGlzLnNjb3BlKSB7CisgICAgICAgICAgICByZXR1cm4gKE1ldGhvZFJlZmVyZW5jZUV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlNDT1BFLCB0aGlzLnNjb3BlLCBzY29wZSk7CisgICAgICAgIGlmICh0aGlzLnNjb3BlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnNjb3BlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2Yoc2NvcGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE5vZGVMaXN0PFR5cGU+PiBnZXRUeXBlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0eXBlQXJndW1lbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyB0aGUgdHlwZUFyZ3VtZW50cywgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBNZXRob2RSZWZlcmVuY2VFeHByCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RSZWZlcmVuY2VFeHByIHNldFR5cGVBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSB0aGlzLnR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0aG9kUmVmZXJlbmNlRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRV9BUkdVTUVOVFMsIHRoaXMudHlwZUFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZUFyZ3VtZW50cy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RSZWZlcmVuY2VFeHByIHNldElkZW50aWZpZXIoZmluYWwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKyAgICAgICAgYXNzZXJ0Tm9uRW1wdHkoaWRlbnRpZmllcik7CisgICAgICAgIGlmIChpZGVudGlmaWVyID09IHRoaXMuaWRlbnRpZmllcikgeworICAgICAgICAgICAgcmV0dXJuIChNZXRob2RSZWZlcmVuY2VFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5JREVOVElGSUVSLCB0aGlzLmlkZW50aWZpZXIsIGlkZW50aWZpZXIpOworICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kUmVmZXJlbmNlRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZXRob2RSZWZlcmVuY2VFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwubWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gc2NvcGUpIHsKKyAgICAgICAgICAgIHNldFNjb3BlKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTWV0aG9kUmVmZXJlbmNlRXhwciBhc01ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk1ldGhvZFJlZmVyZW5jZUV4cHIoQ29uc3VtZXI8TWV0aG9kUmVmZXJlbmNlRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RSZWZlcmVuY2VFeHByPiB0b01ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWVhYmQzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05hbWUuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5hbWVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Ob25FbXB0eVByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm9uRW1wdHk7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKKworLyoqCisgKiBBIG5hbWUgdGhhdCBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBpZGVudGlmaWVycy4KKyAqIEluIG90aGVyIHdvcmRzOiBpdC5tYXkuY29udGFpbi5kb3RzLgorICogPHA+CisgKiBUaGUgcmlnaHRtb3N0IGlkZW50aWZpZXIgaXMgImlkZW50aWZpZXIiLAorICogVGhlIG9uZSB0byB0aGUgbGVmdCBvZiBpdCBpcyAicXVhbGlmaWVyLmlkZW50aWZpZXIiLCBldGMuCisgKiA8cD4KKyAqIFlvdSBjYW4gY29uc3RydWN0IG9uZSBmcm9tIGEgU3RyaW5nIHdpdGggdGhlIG5hbWUoLi4uKSBtZXRob2QuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKiBAc2VlIFNpbXBsZU5hbWUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5hbWUgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhJZGVudGlmaWVyPE5hbWU+LCBOb2RlV2l0aEFubm90YXRpb25zPE5hbWU+IHsKKworICAgIEBOb25FbXB0eVByb3BlcnR5CisgICAgcHJpdmF0ZSBTdHJpbmcgaWRlbnRpZmllcjsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBOYW1lIHF1YWxpZmllcjsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHVibGljIE5hbWUoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgImVtcHR5IiwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIE5hbWUoZmluYWwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBpZGVudGlmaWVyLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZShOYW1lIHF1YWxpZmllciwgZmluYWwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBxdWFsaWZpZXIsIGlkZW50aWZpZXIsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBOYW1lKE5hbWUgcXVhbGlmaWVyLCBmaW5hbCBTdHJpbmcgaWRlbnRpZmllciwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMobnVsbCwgcXVhbGlmaWVyLCBpZGVudGlmaWVyLCBhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgTmFtZSBxdWFsaWZpZXIsIFN0cmluZyBpZGVudGlmaWVyLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFF1YWxpZmllcihxdWFsaWZpZXIpOworICAgICAgICBzZXRJZGVudGlmaWVyKGlkZW50aWZpZXIpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWUgc2V0SWRlbnRpZmllcihmaW5hbCBTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICBhc3NlcnROb25FbXB0eShpZGVudGlmaWVyKTsKKyAgICAgICAgaWYgKGlkZW50aWZpZXIgPT0gdGhpcy5pZGVudGlmaWVyKSB7CisgICAgICAgICAgICByZXR1cm4gKE5hbWUpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LklERU5USUZJRVIsIHRoaXMuaWRlbnRpZmllciwgaWRlbnRpZmllcik7CisgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE5hbWV9IGZyb20gYSBxdWFsaWZpZWQgbmFtZS48YnI+CisgICAgICogVGhlIHF1YWxpZmllZCBuYW1lIGNhbiBjb250YWlucyAiLiIgKGRvdCkgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIHF1YWxpZmllZCBuYW1lCisgICAgICogQHJldHVybiBpbnN0YW5jZW9mIHtAbGluayBOYW1lfQorICAgICAqIEBkZXByZWNhdGVkIHVzZSBKYXZhUGFyc2VyLnBhcnNlTmFtZSBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIE5hbWUgcGFyc2UoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm9uRW1wdHkocXVhbGlmaWVkTmFtZSk7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlTmFtZShxdWFsaWZpZWROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSBxdWFsaWZpZWQgbmFtZS4gT25seSB0aGUgaWRlbnRpZmllcnMgYW5kIHRoZSBkb3RzLCBzbyBubyBjb21tZW50cyBvciB3aGl0ZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgIGlmIChxdWFsaWZpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllci5hc1N0cmluZygpICsgIi4iICsgaWRlbnRpZmllcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE5hbWU+IGdldFF1YWxpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUocXVhbGlmaWVyKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWUgc2V0UXVhbGlmaWVyKGZpbmFsIE5hbWUgcXVhbGlmaWVyKSB7CisgICAgICAgIGlmIChxdWFsaWZpZXIgPT0gdGhpcy5xdWFsaWZpZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoTmFtZSkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuUVVBTElGSUVSLCB0aGlzLnF1YWxpZmllciwgcXVhbGlmaWVyKTsKKyAgICAgICAgaWYgKHRoaXMucXVhbGlmaWVyICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnF1YWxpZmllci5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YocXVhbGlmaWVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHF1YWxpZmllcikgeworICAgICAgICAgICAgICAgIHJlbW92ZVF1YWxpZmllcigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTmFtZSByZW1vdmVRdWFsaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBzZXRRdWFsaWZpZXIoKE5hbWUpIG51bGwpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lIHNldEFubm90YXRpb25zKGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKGFubm90YXRpb25zID09IHRoaXMuYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoTmFtZSkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQU5OT1RBVElPTlMsIHRoaXMuYW5ub3RhdGlvbnMsIGFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTmFtZSBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChOYW1lKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwubmFtZU1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHF1YWxpZmllcikgeworICAgICAgICAgICAgICAgIHNldFF1YWxpZmllcigoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OYW1lRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05hbWVFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3MTU4OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OYW1lRXhwci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5OYW1lRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uUmVzb2x2YWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVW5pb25UeXBlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogV2hlbmV2ZXIgYSBTaW1wbGVOYW1lIGlzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbiwgaXQgaXMgd3JhcHBlZCBpbiBOYW1lRXhwci4KKyAqIDxici8+SW4gPGNvZGU+aW50IHggPSBhICsgMzs8L2NvZGU+IGEgaXMgYSBTaW1wbGVOYW1lIGluc2lkZSBhIE5hbWVFeHByLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmFtZUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgTm9kZVdpdGhTaW1wbGVOYW1lPE5hbWVFeHByPiwgUmVzb2x2YWJsZTxSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgU2ltcGxlTmFtZSBuYW1lOworCisgICAgcHVibGljIE5hbWVFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lRXhwcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTaW1wbGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTmFtZUV4cHIoZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMobmFtZS5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuYW1lKTsKKyAgICAgICAgc2V0UmFuZ2UobmFtZS5nZXRSYW5nZSgpLm9yRWxzZShudWxsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWVFeHByIHNldE5hbWUoZmluYWwgU2ltcGxlTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IHRoaXMubmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChOYW1lRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSwgdGhpcy5uYW1lLCBuYW1lKTsKKyAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5uYW1lLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIE5hbWVFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE5hbWVFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLm5hbWVFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKChTaW1wbGVOYW1lKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lRXhwciBhc05hbWVFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZOYW1lRXhwcihDb25zdW1lcjxOYW1lRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbiByZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS5yZXNvbHZlRGVjbGFyYXRpb24odGhpcywgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE5hbWVFeHByPiB0b05hbWVFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTm9ybWFsQW5ub3RhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDBmY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFuIGFubm90YXRpb24gdGhhdCBoYXMgemVybyBvciBtb3JlIGtleS12YWx1ZSBwYWlycy48YnIvPjxjb2RlPkBNYXBwaW5nKGE9NSwgZD0xMCk8L2NvZGU+CisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5vcm1hbEFubm90YXRpb25FeHByIGV4dGVuZHMgQW5ub3RhdGlvbkV4cHIgeworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzOworCisgICAgcHVibGljIE5vcm1hbEFubm90YXRpb25FeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOYW1lKCksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwcihmaW5hbCBOYW1lIG5hbWUsIGZpbmFsIE5vZGVMaXN0PE1lbWJlclZhbHVlUGFpcj4gcGFpcnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuYW1lLCBwYWlycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5hbWUgbmFtZSwgTm9kZUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBuYW1lKTsKKyAgICAgICAgc2V0UGFpcnMocGFpcnMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldFBhaXJzKCkgeworICAgICAgICByZXR1cm4gcGFpcnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBzZXRQYWlycyhmaW5hbCBOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFpcnMpOworICAgICAgICBpZiAocGFpcnMgPT0gdGhpcy5wYWlycykgeworICAgICAgICAgICAgcmV0dXJuIChOb3JtYWxBbm5vdGF0aW9uRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuUEFJUlMsIHRoaXMucGFpcnMsIHBhaXJzKTsKKyAgICAgICAgaWYgKHRoaXMucGFpcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMucGFpcnMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5wYWlycyA9IHBhaXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihwYWlycyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZHMgYSBwYWlyIHRvIHRoaXMgYW5ub3RhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzLCB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb25FeHByfQorICAgICAqLworICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBhZGRQYWlyKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gYWRkUGFpcihrZXksIG5ldyBOYW1lRXhwcih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZHMgYSBwYWlyIHRvIHRoaXMgYW5ub3RhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzLCB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb25FeHByfQorICAgICAqLworICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBhZGRQYWlyKFN0cmluZyBrZXksIE5hbWVFeHByIHZhbHVlKSB7CisgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKGtleSwgdmFsdWUpOworICAgICAgICBnZXRQYWlycygpLmFkZChtZW1iZXJWYWx1ZVBhaXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWlycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhaXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgcGFpcnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChOb3JtYWxBbm5vdGF0aW9uRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5ub3JtYWxBbm5vdGF0aW9uRXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWlycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhaXJzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgcGFpcnMuc2V0KGksIChNZW1iZXJWYWx1ZVBhaXIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNOb3JtYWxBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBhc05vcm1hbEFubm90YXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZOb3JtYWxBbm5vdGF0aW9uRXhwcihDb25zdW1lcjxOb3JtYWxBbm5vdGF0aW9uRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxOb3JtYWxBbm5vdGF0aW9uRXhwcj4gdG9Ob3JtYWxBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OdWxsTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OdWxsTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzFlZDViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL051bGxMaXRlcmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTnVsbExpdGVyYWxFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgbGl0ZXJhbCAibnVsbCIuCisgKiA8YnIvPjxjb2RlPm51bGw8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGl0ZXJhbEV4cHIgZXh0ZW5kcyBMaXRlcmFsRXhwciB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTnVsbExpdGVyYWxFeHByKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTnVsbExpdGVyYWxFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTnVsbExpdGVyYWxFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE51bGxMaXRlcmFsRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTnVsbExpdGVyYWxFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwubnVsbExpdGVyYWxFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc051bGxMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOdWxsTGl0ZXJhbEV4cHIgYXNOdWxsTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk51bGxMaXRlcmFsRXhwcihDb25zdW1lcjxOdWxsTGl0ZXJhbEV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TnVsbExpdGVyYWxFeHByPiB0b051bGxMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9PYmplY3RDcmVhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9PYmplY3RDcmVhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZlMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL09iamVjdENyZWF0aW9uRXhwci5qYXZhCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBcmd1bWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhPcHRpb25hbFNjb3BlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVBcmd1bWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIEEgY29uc3RydWN0b3IgY2FsbC4KKyAqIDxici8+SW4gPGNvZGU+bmV3IEhhc2hNYXAuRW50cnkmbHQ7U3RyaW5nLCBMb25nPigxNSkge3B1YmxpYyBTdHJpbmcgZ2V0S2V5KCkge3JldHVybiBudWxsO319OzwvY29kZT4KKyAqIEhhc2hNYXAuRW50cnkgaXMgdGhlIHR5cGUsIFN0cmluZyBhbmQgTG9uZyBhcmUgdHlwZSBhcmd1bWVudHMsIDE1IGlzIGFuIGFyZ3VtZW50LCBhbmQgZXZlcnl0aGluZyBpbiB7IH0KKyAqIGlzIHRoZSBhbm9ueW1vdXMgY2xhc3MgYm9keS4KKyAqIDxwLz5JbiA8Y29kZT5jbGFzcyBCIHsgY2xhc3MgQyB7IHB1YmxpYyB2b2lkIGEoKSB7IG5ldyBCKCkubmV3IEMoKTsgfSB9IH08L2NvZGU+IHRoZSBzY29wZSBpcyA8Y29kZT5uZXcgQigpPC9jb2RlPgorICogb2YgT2JqZWN0Q3JlYXRpb25FeHByIDxjb2RlPm5ldyBCKCkubmV3IEMoKTwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdENyZWF0aW9uRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGVBcmd1bWVudHM8T2JqZWN0Q3JlYXRpb25FeHByPiwgTm9kZVdpdGhUeXBlPE9iamVjdENyZWF0aW9uRXhwciwgQ2xhc3NPckludGVyZmFjZVR5cGU+LCBOb2RlV2l0aEFyZ3VtZW50czxPYmplY3RDcmVhdGlvbkV4cHI+LCBOb2RlV2l0aE9wdGlvbmFsU2NvcGU8T2JqZWN0Q3JlYXRpb25FeHByPiB7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgRXhwcmVzc2lvbiBzY29wZTsKKworICAgIHByaXZhdGUgQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZTsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHM7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBhbm9ueW1vdXNDbGFzc0JvZHk7CisKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGEgY2FsbCB0byBhIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNjb3BlIG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIHR5cGUgdGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgYmVpbmcgY2FsbGVkIGZvci4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIEFueSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByKGZpbmFsIEV4cHJlc3Npb24gc2NvcGUsIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIHR5cGUsIGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cykgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCB0eXBlLCBuZXcgTm9kZUxpc3Q8PigpLCBhcmd1bWVudHMsIG51bGwpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBPYmplY3RDcmVhdGlvbkV4cHIoZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZSwgZmluYWwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cywgZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzLCBmaW5hbCBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGFub255bW91c0NsYXNzQm9keSkgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCB0eXBlLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudHMsIGFub255bW91c0NsYXNzQm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPYmplY3RDcmVhdGlvbkV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIHNjb3BlLCBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlLCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gYW5vbnltb3VzQ2xhc3NCb2R5KSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRTY29wZShzY29wZSk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHNldEFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICBzZXRBbm9ueW1vdXNDbGFzc0JvZHkoYW5vbnltb3VzQ2xhc3NCb2R5KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Tm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+Pj4gZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShhbm9ueW1vdXNDbGFzc0JvZHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFub255bW91c0NsYXNzQm9keShCb2R5RGVjbGFyYXRpb248Pz4gYm9keSkgeworICAgICAgICBpZiAoYW5vbnltb3VzQ2xhc3NCb2R5ID09IG51bGwpCisgICAgICAgICAgICBhbm9ueW1vdXNDbGFzc0JvZHkgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICBhbm9ueW1vdXNDbGFzc0JvZHkuYWRkKGJvZHkpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gYXJndW1lbnRzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHNjb3BlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFub255bW91c0NsYXNzQm9keTxicj4KKyAgICAgKiBOdWxsIG1lYW5zIG5vIGNsYXNzIGJvZHk8YnI+CisgICAgICogRW1wdHkgTm9kZUxpc3QgbWVhbnMgbmV3IENsYXNzTmFtZSgpeyB9CisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5vbnltb3VzQ2xhc3NCb2R5IHRoZSBhbm9ueW1vdXNDbGFzc0JvZHksIGNhbiBiZSBudWxsIG9yIGVtcHR5CisgICAgICogQHJldHVybiB0aGlzLCB0aGUgT2JqZWN0Q3JlYXRpb25FeHByCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPYmplY3RDcmVhdGlvbkV4cHIgc2V0QW5vbnltb3VzQ2xhc3NCb2R5KGZpbmFsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gYW5vbnltb3VzQ2xhc3NCb2R5KSB7CisgICAgICAgIGlmIChhbm9ueW1vdXNDbGFzc0JvZHkgPT0gdGhpcy5hbm9ueW1vdXNDbGFzc0JvZHkpIHsKKyAgICAgICAgICAgIHJldHVybiAoT2JqZWN0Q3JlYXRpb25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5BTk9OWU1PVVNfQ0xBU1NfQk9EWSwgdGhpcy5hbm9ueW1vdXNDbGFzc0JvZHksIGFub255bW91c0NsYXNzQm9keSk7CisgICAgICAgIGlmICh0aGlzLmFub255bW91c0NsYXNzQm9keSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5hbm9ueW1vdXNDbGFzc0JvZHkuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5hbm9ueW1vdXNDbGFzc0JvZHkgPSBhbm9ueW1vdXNDbGFzc0JvZHk7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFub255bW91c0NsYXNzQm9keSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIHNldEFyZ3VtZW50cyhmaW5hbCBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhcmd1bWVudHMpOworICAgICAgICBpZiAoYXJndW1lbnRzID09IHRoaXMuYXJndW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKE9iamVjdENyZWF0aW9uRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQVJHVU1FTlRTLCB0aGlzLmFyZ3VtZW50cywgYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKHRoaXMuYXJndW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmFyZ3VtZW50cy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2NvcGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgT2JqZWN0Q3JlYXRpb25FeHByCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPYmplY3RDcmVhdGlvbkV4cHIgc2V0U2NvcGUoZmluYWwgRXhwcmVzc2lvbiBzY29wZSkgeworICAgICAgICBpZiAoc2NvcGUgPT0gdGhpcy5zY29wZSkgeworICAgICAgICAgICAgcmV0dXJuIChPYmplY3RDcmVhdGlvbkV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlNDT1BFLCB0aGlzLnNjb3BlLCBzY29wZSk7CisgICAgICAgIGlmICh0aGlzLnNjb3BlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnNjb3BlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2Yoc2NvcGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9iamVjdENyZWF0aW9uRXhwciBzZXRUeXBlKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKE9iamVjdENyZWF0aW9uRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSwgdGhpcy50eXBlLCB0eXBlKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE5vZGVMaXN0PFR5cGU+PiBnZXRUeXBlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0eXBlQXJndW1lbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyB0aGUgdHlwZUFyZ3VtZW50cywgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBPYmplY3RDcmVhdGlvbkV4cHIKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9iamVjdENyZWF0aW9uRXhwciBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gdGhpcy50eXBlQXJndW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKE9iamVjdENyZWF0aW9uRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRV9BUkdVTUVOVFMsIHRoaXMudHlwZUFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZUFyZ3VtZW50cy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChhbm9ueW1vdXNDbGFzc0JvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9ueW1vdXNDbGFzc0JvZHkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5vbnltb3VzQ2xhc3NCb2R5LmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGFub255bW91c0NsYXNzQm9keS5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHNjb3BlKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlU2NvcGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIHJlbW92ZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2V0U2NvcGUoKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE9iamVjdENyZWF0aW9uRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwub2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoYW5vbnltb3VzQ2xhc3NCb2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5vbnltb3VzQ2xhc3NCb2R5LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFub255bW91c0NsYXNzQm9keS5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXNDbGFzc0JvZHkuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5zZXQoaSwgKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHNjb3BlKSB7CisgICAgICAgICAgICAgICAgc2V0U2NvcGUoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gdHlwZSkgeworICAgICAgICAgICAgc2V0VHlwZSgoQ2xhc3NPckludGVyZmFjZVR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnNldChpLCAoVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0Q3JlYXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9iamVjdENyZWF0aW9uRXhwciBhc09iamVjdENyZWF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmT2JqZWN0Q3JlYXRpb25FeHByKENvbnN1bWVyPE9iamVjdENyZWF0aW9uRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiByZXNvbHZlSW52b2tlZENvbnN0cnVjdG9yKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS5yZXNvbHZlRGVjbGFyYXRpb24odGhpcywgUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE9iamVjdENyZWF0aW9uRXhwcj4gdG9PYmplY3RDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2ltcGxlTmFtZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1NpbXBsZU5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFhNTQxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1NpbXBsZU5hbWUuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm9uRW1wdHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5TaW1wbGVOYW1lTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKKworLyoqCisgKiBBIG5hbWUgdGhhdCBjb25zaXN0cyBvZiBhIHNpbmdsZSBpZGVudGlmaWVyLgorICogSW4gb3RoZXIgd29yZHM6IGl0LmRvZXMuTk9ULmNvbnRhaW4uZG90cy4KKyAqCisgKiBAc2VlIE5hbWUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZU5hbWUgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhJZGVudGlmaWVyPFNpbXBsZU5hbWU+IHsKKworICAgIEBOb25FbXB0eVByb3BlcnR5CisgICAgcHJpdmF0ZSBTdHJpbmcgaWRlbnRpZmllcjsKKworICAgIHB1YmxpYyBTaW1wbGVOYW1lKCkgeworICAgICAgICB0aGlzKG51bGwsICJlbXB0eSIpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBTaW1wbGVOYW1lKGZpbmFsIFN0cmluZyBpZGVudGlmaWVyKSB7CisgICAgICAgIHRoaXMobnVsbCwgaWRlbnRpZmllcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldElkZW50aWZpZXIoaWRlbnRpZmllcik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFNpbXBsZU5hbWUgc2V0SWRlbnRpZmllcihmaW5hbCBTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICBhc3NlcnROb25FbXB0eShpZGVudGlmaWVyKTsKKyAgICAgICAgaWYgKGlkZW50aWZpZXIgPT0gdGhpcy5pZGVudGlmaWVyKSB7CisgICAgICAgICAgICByZXR1cm4gKFNpbXBsZU5hbWUpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LklERU5USUZJRVIsIHRoaXMuaWRlbnRpZmllciwgaWRlbnRpZmllcik7CisgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBpZGVudGlmaWVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChTaW1wbGVOYW1lKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuc2ltcGxlTmFtZU1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWM3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBbiBhbm5vdGF0aW9uIHRoYXQgaGFzIGEgc2luZ2xlIHZhbHVlLiA8YnIvPjxjb2RlPkBDb3VudCgxNSk8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBleHRlbmRzIEFubm90YXRpb25FeHByIHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZTsKKworICAgIHB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZSgpLCBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKGZpbmFsIE5hbWUgbmFtZSwgZmluYWwgRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIG5hbWUsIG1lbWJlclZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgTmFtZSBuYW1lLCBFeHByZXNzaW9uIG1lbWJlclZhbHVlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UsIG5hbWUpOworICAgICAgICBzZXRNZW1iZXJWYWx1ZShtZW1iZXJWYWx1ZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0TWVtYmVyVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIHNldE1lbWJlclZhbHVlKGZpbmFsIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1iZXJWYWx1ZSk7CisgICAgICAgIGlmIChtZW1iZXJWYWx1ZSA9PSB0aGlzLm1lbWJlclZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gKFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5NRU1CRVJfVkFMVUUsIHRoaXMubWVtYmVyVmFsdWUsIG1lbWJlclZhbHVlKTsKKyAgICAgICAgaWYgKHRoaXMubWVtYmVyVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubWVtYmVyVmFsdWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5tZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihtZW1iZXJWYWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuc2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IG1lbWJlclZhbHVlKSB7CisgICAgICAgICAgICBzZXRNZW1iZXJWYWx1ZSgoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgYXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoQ29uc3VtZXI8U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHI+IHRvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3RyaW5nTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TdHJpbmdMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjRkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3RyaW5nTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5TdHJpbmdMaXRlcmFsRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBsaXRlcmFsIHN0cmluZy4KKyAqIDxici8+PGNvZGU+IkhlbGxvIFdvcmxkISI8L2NvZGU+CisgKiA8YnIvPjxjb2RlPiJcIlxuIjwvY29kZT4KKyAqIDxici8+PGNvZGU+Ilx1MjEyMiI8L2NvZGU+CisgKiA8YnIvPjxjb2RlPiLihKIiPC9jb2RlPgorICogPGJyLz48Y29kZT4i8J+SqSI8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdMaXRlcmFsRXhwciBleHRlbmRzIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHIgeworCisgICAgcHVibGljIFN0cmluZ0xpdGVyYWxFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsICJlbXB0eSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgbGl0ZXJhbCBleHByZXNzaW9uIGZyb20gZ2l2ZW4gc3RyaW5nLiBFc2NhcGVzIEVPTCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbAorICAgICAqLworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBTdHJpbmdMaXRlcmFsRXhwcihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhudWxsLCBVdGlscy5lc2NhcGVFbmRPZkxpbmVzKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFN0cmluZ0xpdGVyYWxFeHByLiBFc2NhcGVzIEVPTCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjU3RyaW5nTGl0ZXJhbEV4cHIoU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nTGl0ZXJhbEV4cHIgZXNjYXBlKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsRXhwcihVdGlscy5lc2NhcGVFbmRPZkxpbmVzKHN0cmluZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSwgdmFsdWUpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGlzIGV4cHJlc3Npb25zIHRvIGdpdmVuIHZhbHVlLiBFc2NhcGVzIEVPTCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgbGl0ZXJhbCB2YWx1ZQorICAgICAqIEByZXR1cm4gc2VsZgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdMaXRlcmFsRXhwciBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSBVdGlscy5lc2NhcGVFbmRPZkxpbmVzKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5lc2NhcGVkIGxpdGVyYWwgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nRXNjYXBlVXRpbHMudW5lc2NhcGVKYXZhKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgZnJvbSBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIHVzZXMgaXQgYXMgdGhlIGxpdGVyYWwgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdW5lc2NhcGVkIHN0cmluZworICAgICAqIEByZXR1cm4gdGhpcyBsaXRlcmFsIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIgc2V0U3RyaW5nKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSmF2YSh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nTGl0ZXJhbEV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFN0cmluZ0xpdGVyYWxFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuc3RyaW5nTGl0ZXJhbEV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIgYXNTdHJpbmdMaXRlcmFsRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmU3RyaW5nTGl0ZXJhbEV4cHIoQ29uc3VtZXI8U3RyaW5nTGl0ZXJhbEV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U3RyaW5nTGl0ZXJhbEV4cHI+IHRvU3RyaW5nTGl0ZXJhbEV4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3VwZXJFeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3VwZXJFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlMzdmYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TdXBlckV4cHIuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuU3VwZXJFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogQW4gb2NjdXJyZW5jZSBvZiB0aGUgInN1cGVyIiBrZXl3b3JkLiA8YnIvPjxjb2RlPldvcmxkLnN1cGVyLmdyZWV0KCk8L2NvZGU+IGlzIGEgTWV0aG9kQ2FsbEV4cHIgb2YgbWV0aG9kIG5hbWUgZ3JlZXQsCisgKiBhbmQgc2NvcGUgIldvcmxkLnN1cGVyIiB3aGljaCBpcyBhIFN1cGVyRXhwciB3aXRoIGNsYXNzRXhwciAiV29ybGQiLiA8YnIvPjxjb2RlPnN1cGVyLm5hbWU8L2NvZGU+IGlzIGEKKyAqIEZpZWxkQWNjZXNzRXhwciBvZiBmaWVsZCBncmVldCwgYW5kIGEgU3VwZXJFeHByIGFzIGl0cyBzY29wZS4gVGhlIFN1cGVyRXhwciBoYXMgbm8gY2xhc3NFeHByLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICogQHNlZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10CisgKiBAc2VlIFRoaXNFeHByCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdXBlckV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNsYXNzRXhwcjsKKworICAgIHB1YmxpYyBTdXBlckV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFN1cGVyRXhwcihmaW5hbCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworICAgICAgICB0aGlzKG51bGwsIGNsYXNzRXhwcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdXBlckV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0Q2xhc3NFeHByKGNsYXNzRXhwcik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cHJlc3Npb24+IGdldENsYXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoY2xhc3NFeHByKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzc0V4cHIKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0V4cHIgdGhlIGNsYXNzRXhwciwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBTdXBlckV4cHIKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN1cGVyRXhwciBzZXRDbGFzc0V4cHIoZmluYWwgRXhwcmVzc2lvbiBjbGFzc0V4cHIpIHsKKyAgICAgICAgaWYgKGNsYXNzRXhwciA9PSB0aGlzLmNsYXNzRXhwcikgeworICAgICAgICAgICAgcmV0dXJuIChTdXBlckV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkNMQVNTX0VYUFIsIHRoaXMuY2xhc3NFeHByLCBjbGFzc0V4cHIpOworICAgICAgICBpZiAodGhpcy5jbGFzc0V4cHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuY2xhc3NFeHByLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuY2xhc3NFeHByID0gY2xhc3NFeHByOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihjbGFzc0V4cHIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGNsYXNzRXhwciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBjbGFzc0V4cHIpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVDbGFzc0V4cHIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIFN1cGVyRXhwciByZW1vdmVDbGFzc0V4cHIoKSB7CisgICAgICAgIHJldHVybiBzZXRDbGFzc0V4cHIoKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3VwZXJFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFN1cGVyRXhwcikgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3VwZXJFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuc3VwZXJFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY2xhc3NFeHByICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGNsYXNzRXhwcikgeworICAgICAgICAgICAgICAgIHNldENsYXNzRXhwcigoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cGVyRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdXBlckV4cHIgYXNTdXBlckV4cHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlN1cGVyRXhwcihDb25zdW1lcjxTdXBlckV4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U3VwZXJFeHByPiB0b1N1cGVyRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UaGlzRXhwci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1RoaXNFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5OTgxZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UaGlzRXhwci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlRoaXNFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBBbiBvY2N1cnJlbmNlIG9mIHRoZSAidGhpcyIga2V5d29yZC4gPGJyLz48Y29kZT5Xb3JsZC50aGlzLmdyZWV0KCk8L2NvZGU+IGlzIGEgTWV0aG9kQ2FsbEV4cHIgb2YgbWV0aG9kIG5hbWUgZ3JlZXQsCisgKiBhbmQgc2NvcGUgIldvcmxkLnN1cGVyIiB3aGljaCBpcyBhIFRoaXNFeHByIHdpdGggY2xhc3NFeHByICJXb3JsZCIuIDxici8+PGNvZGU+dGhpcy5uYW1lPC9jb2RlPiBpcyBhCisgKiBGaWVsZEFjY2Vzc0V4cHIgb2YgZmllbGQgZ3JlZXQsIGFuZCBhIFRoaXNFeHByIGFzIGl0cyBzY29wZS4gVGhlIFRoaXNFeHByIGhhcyBubyBjbGFzc0V4cHIuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKiBAc2VlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQKKyAqIEBzZWUgVGhpc0V4cHIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRoaXNFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFJlc29sdmFibGU8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNsYXNzRXhwcjsKKworICAgIHB1YmxpYyBUaGlzRXhwcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgVGhpc0V4cHIoZmluYWwgRXhwcmVzc2lvbiBjbGFzc0V4cHIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBjbGFzc0V4cHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVGhpc0V4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0Q2xhc3NFeHByKGNsYXNzRXhwcik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cHJlc3Npb24+IGdldENsYXNzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoY2xhc3NFeHByKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFRoaXNFeHByIHNldENsYXNzRXhwcihmaW5hbCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworICAgICAgICBpZiAoY2xhc3NFeHByID09IHRoaXMuY2xhc3NFeHByKSB7CisgICAgICAgICAgICByZXR1cm4gKFRoaXNFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5DTEFTU19FWFBSLCB0aGlzLmNsYXNzRXhwciwgY2xhc3NFeHByKTsKKyAgICAgICAgaWYgKHRoaXMuY2xhc3NFeHByICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNsYXNzRXhwci5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNsYXNzRXhwciA9IGNsYXNzRXhwcjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoY2xhc3NFeHByKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjbGFzc0V4cHIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gY2xhc3NFeHByKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NFeHByKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUaGlzRXhwciByZW1vdmVDbGFzc0V4cHIoKSB7CisgICAgICAgIHJldHVybiBzZXRDbGFzc0V4cHIoKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVGhpc0V4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoVGhpc0V4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFRoaXNFeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwudGhpc0V4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjbGFzc0V4cHIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gY2xhc3NFeHByKSB7CisgICAgICAgICAgICAgICAgc2V0Q2xhc3NFeHByKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVGhpc0V4cHIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVGhpc0V4cHIgYXNUaGlzRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVGhpc0V4cHIoQ29uc3VtZXI8VGhpc0V4cHI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiByZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS5yZXNvbHZlRGVjbGFyYXRpb24odGhpcywgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VGhpc0V4cHI+IHRvVGhpc0V4cHIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UeXBlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzRiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlR5cGVFeHByTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMganVzdCBpbnN0YW50aWF0ZWQgYXMgc2NvcGVzIGZvciBNZXRob2RSZWZlcmVuY2VFeHByIG5vZGVzIHRvIGVuY2Fwc3VsYXRlIFR5cGVzLgorICogPGJyLz5JbiA8Y29kZT5Xb3JsZDo6Z3JlZXQ8L2NvZGU+IHRoZSBDbGFzc09ySW50ZXJmYWNlVHlwZSAiV29ybGQiIGlzIHdyYXBwZWQgaW4gYSBUeXBlRXhwcgorICogYmVmb3JlIGl0IGlzIHNldCBhcyB0aGUgc2NvcGUgb2YgdGhlIE1ldGhvZFJlZmVyZW5jZUV4cHIuCisgKgorICogQGF1dGhvciBSYXF1ZWwgUGF1CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUeXBlRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGU8VHlwZUV4cHIsIFR5cGU+IHsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHVibGljIFR5cGVFeHByKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgVHlwZUV4cHIoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMobnVsbCwgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlRXhwcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFR5cGUgdHlwZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVFeHByIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwodHlwZSk7CisgICAgICAgIGlmICh0eXBlID09IHRoaXMudHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIChUeXBlRXhwcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSwgdGhpcy50eXBlLCB0eXBlKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVFeHByIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFR5cGVFeHByKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlRXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLnR5cGVFeHByTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBzZXRUeXBlKChUeXBlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlRXhwciBhc1R5cGVFeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZUeXBlRXhwcihDb25zdW1lcjxUeXBlRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxUeXBlRXhwcj4gdG9UeXBlRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9VbmFyeUV4cHIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9VbmFyeUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA4NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwci5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5EZXJpdmVkUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5VbmFyeUV4cHJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlByaW50YWJsZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFuIGV4cHJlc3Npb24gd2hlcmUgYW4gb3BlcmF0b3IgaXMgYXBwbGllZCB0byBhIHNpbmdsZSBleHByZXNzaW9uLgorICogSXQgc3VwcG9ydHMgdGhlIG9wZXJhdG9ycyB0aGF0IGFyZSBmb3VuZCB0aGUgdGhlIFVuYXJ5RXhwci5PcGVyYXRvciBlbnVtLgorICogPGJyLz48Y29kZT4xMSsrPC9jb2RlPgorICogPGJyLz48Y29kZT4rKzExPC9jb2RlPgorICogPGJyLz48Y29kZT5+MTwvY29kZT4KKyAqIDxici8+PGNvZGU+LTMzMzwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVuYXJ5RXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aEV4cHJlc3Npb248VW5hcnlFeHByPiB7CisKKyAgICBwdWJsaWMgZW51bSBPcGVyYXRvciBpbXBsZW1lbnRzIFByaW50YWJsZSB7CisKKyAgICAgICAgUExVUygiKyIsIGZhbHNlKSwKKyAgICAgICAgTUlOVVMoIi0iLCBmYWxzZSksCisgICAgICAgIFBSRUZJWF9JTkNSRU1FTlQoIisrIiwgZmFsc2UpLAorICAgICAgICBQUkVGSVhfREVDUkVNRU5UKCItLSIsIGZhbHNlKSwKKyAgICAgICAgTE9HSUNBTF9DT01QTEVNRU5UKCIhIiwgZmFsc2UpLAorICAgICAgICBCSVRXSVNFX0NPTVBMRU1FTlQoIn4iLCBmYWxzZSksCisgICAgICAgIFBPU1RGSVhfSU5DUkVNRU5UKCIrKyIsIHRydWUpLAorICAgICAgICBQT1NURklYX0RFQ1JFTUVOVCgiLS0iLCB0cnVlKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb2RlUmVwcmVzZW50YXRpb247CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUG9zdGZpeDsKKworICAgICAgICBPcGVyYXRvcihTdHJpbmcgY29kZVJlcHJlc2VudGF0aW9uLCBib29sZWFuIGlzUG9zdGZpeCkgeworICAgICAgICAgICAgdGhpcy5jb2RlUmVwcmVzZW50YXRpb24gPSBjb2RlUmVwcmVzZW50YXRpb247CisgICAgICAgICAgICB0aGlzLmlzUG9zdGZpeCA9IGlzUG9zdGZpeDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gY29kZVJlcHJlc2VudGF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQb3N0Zml4KCkgeworICAgICAgICAgICAgcmV0dXJuIGlzUG9zdGZpeDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuICFpc1Bvc3RmaXgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCisgICAgcHJpdmF0ZSBPcGVyYXRvciBvcGVyYXRvcjsKKworICAgIHB1YmxpYyBVbmFyeUV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IEludGVnZXJMaXRlcmFsRXhwcigpLCBPcGVyYXRvci5QT1NURklYX0lOQ1JFTUVOVCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFVuYXJ5RXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGZpbmFsIE9wZXJhdG9yIG9wZXJhdG9yKSB7CisgICAgICAgIHRoaXMobnVsbCwgZXhwcmVzc2lvbiwgb3BlcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5hcnlFeHByKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBPcGVyYXRvciBvcGVyYXRvcikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgc2V0T3BlcmF0b3Iob3BlcmF0b3IpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBvcGVyYXRvcjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFVuYXJ5RXhwciBzZXRFeHByZXNzaW9uKGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGV4cHJlc3Npb24pOworICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSB0aGlzLmV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoVW5hcnlFeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5FWFBSRVNTSU9OLCB0aGlzLmV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24uc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZXhwcmVzc2lvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5hcnlFeHByIHNldE9wZXJhdG9yKGZpbmFsIE9wZXJhdG9yIG9wZXJhdG9yKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0b3IpOworICAgICAgICBpZiAob3BlcmF0b3IgPT0gdGhpcy5vcGVyYXRvcikgeworICAgICAgICAgICAgcmV0dXJuIChVbmFyeUV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk9QRVJBVE9SLCB0aGlzLm9wZXJhdG9yLCBvcGVyYXRvcik7CisgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQERlcml2ZWRQcm9wZXJ0eQorICAgIHB1YmxpYyBib29sZWFuIGlzUG9zdGZpeCgpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yLmlzUG9zdGZpeCgpOworICAgIH0KKworICAgIEBEZXJpdmVkUHJvcGVydHkKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuICFpc1Bvc3RmaXgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIFVuYXJ5RXhwciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChVbmFyeUV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFVuYXJ5RXhwck1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLnVuYXJ5RXhwck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gZXhwcmVzc2lvbikgeworICAgICAgICAgICAgc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFVuYXJ5RXhwciBhc1VuYXJ5RXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVW5hcnlFeHByKENvbnN1bWVyPFVuYXJ5RXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxVbmFyeUV4cHI+IHRvVW5hcnlFeHByKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ1Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVmFyaWFibGVzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5WYXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5ub2RlTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcy4KKyAqIEl0IGlzIGFuIGV4cHJlc3Npb24sIHNvIGl0IGNhbiBiZSBwdXQgaW4gcGxhY2VzIGxpa2UgdGhlIGluaXRpYWxpemVyIG9mIGEgZm9yIGxvb3AsCisgKiBvciB0aGUgcmVzb3VyY2VzIHBhcnQgb2YgdGhlIHRyeSBzdGF0ZW1lbnQuCisgKiA8YnIvPjxjb2RlPmZpbmFsIGludCB4PTMsIHk9NTU8L2NvZGU+CisgKgorICogPGJyLz5BbGwgYW5ub3RhdGlvbnMgcHJlY2VkaW5nIHRoZSB0eXBlIHdpbGwgYmUgc2V0IG9uIHRoaXMgb2JqZWN0LCBub3Qgb24gdGhlIHR5cGUuCisgKiBKYXZhUGFyc2VyIGRvZXNuJ3Qga25vdyBpZiBpdCB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBtZXRob2Qgb3IgdGhlIHR5cGUuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aEZpbmFsTW9kaWZpZXI8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+LCBOb2RlV2l0aEFubm90YXRpb25zPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiwgTm9kZVdpdGhWYXJpYWJsZXM8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IHsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICBATm9uRW1wdHlQcm9wZXJ0eQorICAgIHByaXZhdGUgTm9kZUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXM7CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoZmluYWwgVHlwZSB0eXBlLCBTdHJpbmcgdmFyaWFibGVOYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCBub2RlTGlzdChuZXcgVmFyaWFibGVEZWNsYXJhdG9yKHR5cGUsIHZhcmlhYmxlTmFtZSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoVmFyaWFibGVEZWNsYXJhdG9yIHZhcikgeworICAgICAgICB0aGlzKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgbm9kZUxpc3QodmFyKSk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKGZpbmFsIFR5cGUgdHlwZSwgU3RyaW5nIHZhcmlhYmxlTmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMobnVsbCwgQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSksIG5ldyBOb2RlTGlzdDw+KCksIG5vZGVMaXN0KG5ldyBWYXJpYWJsZURlY2xhcmF0b3IodHlwZSwgdmFyaWFibGVOYW1lKSkpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihWYXJpYWJsZURlY2xhcmF0b3IgdmFyLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSwgbmV3IE5vZGVMaXN0PD4oKSwgbm9kZUxpc3QodmFyKSk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKGZpbmFsIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTm9kZUxpc3Q8PigpLCB2YXJpYWJsZXMpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIGZpbmFsIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuZXcgTm9kZUxpc3Q8PigpLCB2YXJpYWJsZXMpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgZmluYWwgTm9kZUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBtb2RpZmllcnMsIGFubm90YXRpb25zLCB2YXJpYWJsZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTm9kZUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IGdldFZhcmlhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHNldEFubm90YXRpb25zKGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKGFubm90YXRpb25zID09IHRoaXMuYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkFOTk9UQVRJT05TLCB0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmFubm90YXRpb25zLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHNldE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2RpZmllcnMpOworICAgICAgICBpZiAobW9kaWZpZXJzID09IHRoaXMubW9kaWZpZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5NT0RJRklFUlMsIHRoaXMubW9kaWZpZXJzLCBtb2RpZmllcnMpOworICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBzZXRWYXJpYWJsZXMoZmluYWwgTm9kZUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYWJsZXMpOworICAgICAgICBpZiAodmFyaWFibGVzID09IHRoaXMudmFyaWFibGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5WQVJJQUJMRVMsIHRoaXMudmFyaWFibGVzLCB2YXJpYWJsZXMpOworICAgICAgICBpZiAodGhpcy52YXJpYWJsZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih2YXJpYWJsZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodmFyaWFibGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwudmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZXMuc2V0KGksIChWYXJpYWJsZURlY2xhcmF0b3IpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBhc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihDb25zdW1lcjxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gdG9WYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9tb2R1bGVzL01vZHVsZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3YzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Nb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKKworLyoqCisgKiBBIEphdmEgOSBKaWdzYXcgbW9kdWxlIGRlY2xhcmF0aW9uLiA8Y29kZT5ARm9vIG1vZHVsZSBjb20uZ2l0aHViLmFiYyB7IHJlcXVpcmVzIGEuQjsgfTwvY29kZT4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vZHVsZURlY2xhcmF0aW9uIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5vZGVXaXRoTmFtZTxNb2R1bGVEZWNsYXJhdGlvbj4sIE5vZGVXaXRoQW5ub3RhdGlvbnM8TW9kdWxlRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgTmFtZSBuYW1lOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPcGVuOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxNb2R1bGVTdG10PiBtb2R1bGVTdG10czsKKworICAgIHB1YmxpYyBNb2R1bGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTmFtZSgpLCBmYWxzZSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIE1vZHVsZURlY2xhcmF0aW9uKE5hbWUgbmFtZSwgYm9vbGVhbiBpc09wZW4pIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBuYW1lLCBpc09wZW4sIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBNb2R1bGVEZWNsYXJhdGlvbihOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5hbWUgbmFtZSwgYm9vbGVhbiBpc09wZW4sIE5vZGVMaXN0PE1vZHVsZVN0bXQ+IG1vZHVsZVN0bXRzKSB7CisgICAgICAgIHRoaXMobnVsbCwgYW5ub3RhdGlvbnMsIG5hbWUsIGlzT3BlbiwgbW9kdWxlU3RtdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRGVjbGFyYXRpb24oVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5hbWUgbmFtZSwgYm9vbGVhbiBpc09wZW4sIE5vZGVMaXN0PE1vZHVsZVN0bXQ+IG1vZHVsZVN0bXRzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldE9wZW4oaXNPcGVuKTsKKyAgICAgICAgc2V0TW9kdWxlU3RtdHMobW9kdWxlU3RtdHMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRGVjbGFyYXRpb24gc2V0TmFtZShmaW5hbCBOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKE1vZHVsZURlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVEZWNsYXJhdGlvbiBzZXRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSB0aGlzLmFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKE1vZHVsZURlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgdGhpcy5hbm5vdGF0aW9ucywgYW5ub3RhdGlvbnMpOworICAgICAgICBpZiAodGhpcy5hbm5vdGF0aW9ucyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVN0bXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobW9kdWxlU3RtdHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVTdG10cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gaXNPcGVuOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRGVjbGFyYXRpb24gc2V0T3BlbihmaW5hbCBib29sZWFuIGlzT3BlbikgeworICAgICAgICBpZiAoaXNPcGVuID09IHRoaXMuaXNPcGVuKSB7CisgICAgICAgICAgICByZXR1cm4gKE1vZHVsZURlY2xhcmF0aW9uKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5PUEVOLCB0aGlzLmlzT3BlbiwgaXNPcGVuKTsKKyAgICAgICAgdGhpcy5pc09wZW4gPSBpc09wZW47CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8TW9kdWxlU3RtdD4gZ2V0TW9kdWxlU3RtdHMoKSB7CisgICAgICAgIHJldHVybiBtb2R1bGVTdG10czsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZURlY2xhcmF0aW9uIHNldE1vZHVsZVN0bXRzKGZpbmFsIE5vZGVMaXN0PE1vZHVsZVN0bXQ+IG1vZHVsZVN0bXRzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlU3RtdHMpOworICAgICAgICBpZiAobW9kdWxlU3RtdHMgPT0gdGhpcy5tb2R1bGVTdG10cykgeworICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVEZWNsYXJhdGlvbikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTU9EVUxFX1NUTVRTLCB0aGlzLm1vZHVsZVN0bXRzLCBtb2R1bGVTdG10cyk7CisgICAgICAgIGlmICh0aGlzLm1vZHVsZVN0bXRzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm1vZHVsZVN0bXRzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubW9kdWxlU3RtdHMgPSBtb2R1bGVTdG10czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobW9kdWxlU3RtdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZURlY2xhcmF0aW9uIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE1vZHVsZURlY2xhcmF0aW9uKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLm1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlU3RtdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtb2R1bGVTdG10cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIG1vZHVsZVN0bXRzLnNldChpLCAoTW9kdWxlU3RtdCkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKChOYW1lKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlRXhwb3J0c1N0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVFeHBvcnRzU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDQwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlRXhwb3J0c1N0bXQuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGZpbmFsIGNsYXNzIE1vZHVsZUV4cG9ydHNTdG10IGV4dGVuZHMgTW9kdWxlU3RtdCBpbXBsZW1lbnRzIE5vZGVXaXRoTmFtZTxNb2R1bGVFeHBvcnRzU3RtdD4geworCisgICAgcHJpdmF0ZSBOYW1lIG5hbWU7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzOworCisgICAgcHVibGljIE1vZHVsZUV4cG9ydHNTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOYW1lKCksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBNb2R1bGVFeHBvcnRzU3RtdChOYW1lIG5hbWUsIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmFtZSwgbW9kdWxlTmFtZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRXhwb3J0c1N0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOYW1lIG5hbWUsIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRNb2R1bGVOYW1lcyhtb2R1bGVOYW1lcyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVOYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlTmFtZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRXhwb3J0c1N0bXQgc2V0TmFtZShmaW5hbCBOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKE1vZHVsZUV4cG9ydHNTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8TmFtZT4gZ2V0TW9kdWxlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBtb2R1bGVOYW1lczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZUV4cG9ydHNTdG10IHNldE1vZHVsZU5hbWVzKGZpbmFsIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlTmFtZXMpOworICAgICAgICBpZiAobW9kdWxlTmFtZXMgPT0gdGhpcy5tb2R1bGVOYW1lcykgeworICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVFeHBvcnRzU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTU9EVUxFX05BTUVTLCB0aGlzLm1vZHVsZU5hbWVzLCBtb2R1bGVOYW1lcyk7CisgICAgICAgIGlmICh0aGlzLm1vZHVsZU5hbWVzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm1vZHVsZU5hbWVzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubW9kdWxlTmFtZXMgPSBtb2R1bGVOYW1lczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobW9kdWxlTmFtZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZUV4cG9ydHNTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKE1vZHVsZUV4cG9ydHNTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLm1vZHVsZUV4cG9ydHNTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZU5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobW9kdWxlTmFtZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVOYW1lcy5zZXQoaSwgKE5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTW9kdWxlRXhwb3J0c1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRXhwb3J0c1N0bXQgYXNNb2R1bGVFeHBvcnRzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTW9kdWxlRXhwb3J0c1N0bXQoQ29uc3VtZXI8TW9kdWxlRXhwb3J0c1N0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TW9kdWxlRXhwb3J0c1N0bXQ+IHRvTW9kdWxlRXhwb3J0c1N0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlT3BlbnNTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlT3BlbnNTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1NjVkYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVPcGVuc1N0bXQuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNb2R1bGVPcGVuc1N0bXQgZXh0ZW5kcyBNb2R1bGVTdG10IGltcGxlbWVudHMgTm9kZVdpdGhOYW1lPE1vZHVsZU9wZW5zU3RtdD4geworCisgICAgcHJpdmF0ZSBOYW1lIG5hbWU7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzOworCisgICAgcHVibGljIE1vZHVsZU9wZW5zU3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZSgpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTW9kdWxlT3BlbnNTdG10KE5hbWUgbmFtZSwgTm9kZUxpc3Q8TmFtZT4gbW9kdWxlTmFtZXMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuYW1lLCBtb2R1bGVOYW1lcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVPcGVuc1N0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOYW1lIG5hbWUsIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRNb2R1bGVOYW1lcyhtb2R1bGVOYW1lcyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVOYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlTmFtZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlT3BlbnNTdG10IHNldE5hbWUoZmluYWwgTmFtZSBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IHRoaXMubmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVPcGVuc1N0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsIHRoaXMubmFtZSwgbmFtZSk7CisgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxOYW1lPiBnZXRNb2R1bGVOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWVzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlT3BlbnNTdG10IHNldE1vZHVsZU5hbWVzKGZpbmFsIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlTmFtZXMpOworICAgICAgICBpZiAobW9kdWxlTmFtZXMgPT0gdGhpcy5tb2R1bGVOYW1lcykgeworICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVPcGVuc1N0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5Lk1PRFVMRV9OQU1FUywgdGhpcy5tb2R1bGVOYW1lcywgbW9kdWxlTmFtZXMpOworICAgICAgICBpZiAodGhpcy5tb2R1bGVOYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5tb2R1bGVOYW1lcy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLm1vZHVsZU5hbWVzID0gbW9kdWxlTmFtZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG1vZHVsZU5hbWVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVPcGVuc1N0bXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoTW9kdWxlT3BlbnNTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5tb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVzLnNldChpLCAoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKChOYW1lKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNNb2R1bGVPcGVuc1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlT3BlbnNTdG10IGFzTW9kdWxlT3BlbnNTdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNb2R1bGVPcGVuc1N0bXQoQ29uc3VtZXI8TW9kdWxlT3BlbnNTdG10PiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE1vZHVsZU9wZW5zU3RtdD4gdG9Nb2R1bGVPcGVuc1N0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlUHJvdmlkZXNTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlUHJvdmlkZXNTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkYmNlZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVQcm92aWRlc1N0bXQuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgZmluYWwgY2xhc3MgTW9kdWxlUHJvdmlkZXNTdG10IGV4dGVuZHMgTW9kdWxlU3RtdCBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZTxNb2R1bGVQcm92aWRlc1N0bXQsIFR5cGU+IHsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxUeXBlPiB3aXRoVHlwZXM7CisKKyAgICBwdWJsaWMgTW9kdWxlUHJvdmlkZXNTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTW9kdWxlUHJvdmlkZXNTdG10KFR5cGUgdHlwZSwgTm9kZUxpc3Q8VHlwZT4gd2l0aFR5cGVzKSB7CisgICAgICAgIHRoaXMobnVsbCwgdHlwZSwgd2l0aFR5cGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVByb3ZpZGVzU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFR5cGUgdHlwZSwgTm9kZUxpc3Q8VHlwZT4gd2l0aFR5cGVzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXRXaXRoVHlwZXMod2l0aFR5cGVzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHdpdGhUeXBlcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHdpdGhUeXBlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVQcm92aWRlc1N0bXQgc2V0VHlwZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVByb3ZpZGVzU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSwgdGhpcy50eXBlLCB0eXBlKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PFR5cGU+IGdldFdpdGhUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIHdpdGhUeXBlczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVByb3ZpZGVzU3RtdCBzZXRXaXRoVHlwZXMoZmluYWwgTm9kZUxpc3Q8VHlwZT4gd2l0aFR5cGVzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwod2l0aFR5cGVzKTsKKyAgICAgICAgaWYgKHdpdGhUeXBlcyA9PSB0aGlzLndpdGhUeXBlcykgeworICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVQcm92aWRlc1N0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LldJVEhfVFlQRVMsIHRoaXMud2l0aFR5cGVzLCB3aXRoVHlwZXMpOworICAgICAgICBpZiAodGhpcy53aXRoVHlwZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMud2l0aFR5cGVzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMud2l0aFR5cGVzID0gd2l0aFR5cGVzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih3aXRoVHlwZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVByb3ZpZGVzU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNb2R1bGVQcm92aWRlc1N0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLm1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gdHlwZSkgeworICAgICAgICAgICAgc2V0VHlwZSgoVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aFR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAod2l0aFR5cGVzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgd2l0aFR5cGVzLnNldChpLCAoVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZHVsZVByb3ZpZGVzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVQcm92aWRlc1N0bXQgYXNNb2R1bGVQcm92aWRlc1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk1vZHVsZVByb3ZpZGVzU3RtdChDb25zdW1lcjxNb2R1bGVQcm92aWRlc1N0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TW9kdWxlUHJvdmlkZXNTdG10PiB0b01vZHVsZVByb3ZpZGVzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVSZXF1aXJlc1N0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVSZXF1aXJlc1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWRlODFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9tb2R1bGVzL01vZHVsZVJlcXVpcmVzU3RtdC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFN0YXRpY01vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Nb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWw7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuVFJBTlNJVElWRTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIHJlcXVpcmUgc3RhdGVtZW50IGluIG1vZHVsZS1pbmZvLmphdmEuIDxjb2RlPnJlcXVpcmUgYS5iLkM7PC9jb2RlPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9kdWxlUmVxdWlyZXNTdG10IGV4dGVuZHMgTW9kdWxlU3RtdCBpbXBsZW1lbnRzIE5vZGVXaXRoU3RhdGljTW9kaWZpZXI8TW9kdWxlUmVxdWlyZXNTdG10PiwgTm9kZVdpdGhOYW1lPE1vZHVsZVJlcXVpcmVzU3RtdD4geworCisgICAgcHJpdmF0ZSBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnM7CisKKyAgICBwcml2YXRlIE5hbWUgbmFtZTsKKworICAgIHB1YmxpYyBNb2R1bGVSZXF1aXJlc1N0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBuZXcgTmFtZSgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTW9kdWxlUmVxdWlyZXNTdG10KEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTmFtZSBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgbW9kaWZpZXJzLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVJlcXVpcmVzU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTmFtZSBuYW1lKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlUmVxdWlyZXNTdG10IHNldE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2RpZmllcnMpOworICAgICAgICBpZiAobW9kaWZpZXJzID09IHRoaXMubW9kaWZpZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVJlcXVpcmVzU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTU9ESUZJRVJTLCB0aGlzLm1vZGlmaWVycywgbW9kaWZpZXJzKTsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVJlcXVpcmVzU3RtdCBzZXROYW1lKGZpbmFsIE5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTW9kdWxlUmVxdWlyZXNTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKFRSQU5TSVRJVkUpOworICAgIH0KKworICAgIHB1YmxpYyBNb2R1bGVSZXF1aXJlc1N0bXQgc2V0VHJhbnNpdGl2ZShib29sZWFuIHNldCkgeworICAgICAgICByZXR1cm4gc2V0TW9kaWZpZXIoVFJBTlNJVElWRSwgc2V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVJlcXVpcmVzU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNb2R1bGVSZXF1aXJlc1N0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLm1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTW9kdWxlUmVxdWlyZXNTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVJlcXVpcmVzU3RtdCBhc01vZHVsZVJlcXVpcmVzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTW9kdWxlUmVxdWlyZXNTdG10KENvbnN1bWVyPE1vZHVsZVJlcXVpcmVzU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNb2R1bGVSZXF1aXJlc1N0bXQ+IHRvTW9kdWxlUmVxdWlyZXNTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9tb2R1bGVzL01vZHVsZVN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2Yzc5MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvbW9kdWxlcy9Nb2R1bGVTdG10LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Nb2R1bGVTdG10TWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVTdG10IGV4dGVuZHMgTm9kZSB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgTW9kdWxlU3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVN0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNb2R1bGVTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwubW9kdWxlU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNNb2R1bGVFeHBvcnRzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlRXhwb3J0c1N0bXQgYXNNb2R1bGVFeHBvcnRzU3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTW9kdWxlRXhwb3J0c1N0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTW9kdWxlT3BlbnNTdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVPcGVuc1N0bXQgYXNNb2R1bGVPcGVuc1N0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIE1vZHVsZU9wZW5zU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNNb2R1bGVQcm92aWRlc1N0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVByb3ZpZGVzU3RtdCBhc01vZHVsZVByb3ZpZGVzU3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTW9kdWxlUHJvdmlkZXNTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZHVsZVJlcXVpcmVzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlUmVxdWlyZXNTdG10IGFzTW9kdWxlUmVxdWlyZXNTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBNb2R1bGVSZXF1aXJlc1N0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTW9kdWxlVXNlc1N0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE1vZHVsZVVzZXNTdG10IGFzTW9kdWxlVXNlc1N0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIE1vZHVsZVVzZXNTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZk1vZHVsZUV4cG9ydHNTdG10KENvbnN1bWVyPE1vZHVsZUV4cG9ydHNTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNb2R1bGVPcGVuc1N0bXQoQ29uc3VtZXI8TW9kdWxlT3BlbnNTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNb2R1bGVQcm92aWRlc1N0bXQoQ29uc3VtZXI8TW9kdWxlUHJvdmlkZXNTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNb2R1bGVSZXF1aXJlc1N0bXQoQ29uc3VtZXI8TW9kdWxlUmVxdWlyZXNTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZNb2R1bGVVc2VzU3RtdChDb25zdW1lcjxNb2R1bGVVc2VzU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNb2R1bGVFeHBvcnRzU3RtdD4gdG9Nb2R1bGVFeHBvcnRzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNb2R1bGVPcGVuc1N0bXQ+IHRvTW9kdWxlT3BlbnNTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE1vZHVsZVByb3ZpZGVzU3RtdD4gdG9Nb2R1bGVQcm92aWRlc1N0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TW9kdWxlUmVxdWlyZXNTdG10PiB0b01vZHVsZVJlcXVpcmVzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxNb2R1bGVVc2VzU3RtdD4gdG9Nb2R1bGVVc2VzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9tb2R1bGVzL01vZHVsZVVzZXNTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L21vZHVsZXMvTW9kdWxlVXNlc1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmY5ODU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9tb2R1bGVzL01vZHVsZVVzZXNTdG10LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Nb2R1bGVVc2VzU3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGZpbmFsIGNsYXNzIE1vZHVsZVVzZXNTdG10IGV4dGVuZHMgTW9kdWxlU3RtdCBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZTxNb2R1bGVVc2VzU3RtdCwgVHlwZT4geworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwdWJsaWMgTW9kdWxlVXNlc1N0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIE1vZHVsZVVzZXNTdG10KFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzKG51bGwsIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlVXNlc1N0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBUeXBlIHR5cGUpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVVc2VzU3RtdCBzZXRUeXBlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOworICAgICAgICBpZiAodHlwZSA9PSB0aGlzLnR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoTW9kdWxlVXNlc1N0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUsIHRoaXMudHlwZSwgdHlwZSk7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBNb2R1bGVVc2VzU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChNb2R1bGVVc2VzU3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5tb2R1bGVVc2VzU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gdHlwZSkgeworICAgICAgICAgICAgc2V0VHlwZSgoVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzTW9kdWxlVXNlc1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTW9kdWxlVXNlc1N0bXQgYXNNb2R1bGVVc2VzU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTW9kdWxlVXNlc1N0bXQoQ29uc3VtZXI8TW9kdWxlVXNlc1N0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TW9kdWxlVXNlc1N0bXQ+IHRvTW9kdWxlVXNlc1N0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEFubm90YXRpb25zLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEFubm90YXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwNjBjNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQW5ub3RhdGlvbnMuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VOYW1lOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBiZSBhbm5vdGF0ZWQuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKiBAc2luY2UgSnVseSAyMDE0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhBbm5vdGF0aW9uczxOIGV4dGVuZHMgTm9kZT4geworICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpOworCisgICAgTiBzZXRBbm5vdGF0aW9ucyhOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpOworCisgICAgdm9pZCB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChDbGFzczw/PiBjbGF6eik7CisKKyAgICBkZWZhdWx0IEFubm90YXRpb25FeHByIGdldEFubm90YXRpb24oaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zKCkuZ2V0KGkpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBzZXRBbm5vdGF0aW9uKGludCBpLCBBbm5vdGF0aW9uRXhwciBlbGVtZW50KSB7CisgICAgICAgIGdldEFubm90YXRpb25zKCkuc2V0KGksIGVsZW1lbnQpOworICAgICAgICByZXR1cm4gKE4pIHRoaXM7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbkV4cHIgZWxlbWVudCkgeworICAgICAgICBnZXRBbm5vdGF0aW9ucygpLmFkZChlbGVtZW50KTsKKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBhZGRBbm5vdGF0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE5vcm1hbEFubm90YXRpb25FeHByIGFubm90YXRpb24gPSBuZXcgTm9ybWFsQW5ub3RhdGlvbkV4cHIoCisgICAgICAgICAgICAgICAgcGFyc2VOYW1lKG5hbWUpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKS5hZGQoYW5ub3RhdGlvbik7CisgICAgICAgIHJldHVybiAoTikgdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0ZXMgdGhpcworICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbkV4cHJ9IGFkZGVkCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOb3JtYWxBbm5vdGF0aW9uRXhwciBhZGRBbmRHZXRBbm5vdGF0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE5vcm1hbEFubm90YXRpb25FeHByIGFubm90YXRpb24gPSBuZXcgTm9ybWFsQW5ub3RhdGlvbkV4cHIoCisgICAgICAgICAgICAgICAgcGFyc2VOYW1lKG5hbWUpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKS5hZGQoYW5ub3RhdGlvbik7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIG5vZGUgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBkZWZhdWx0IE4gYWRkQW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gY2xhenopIHsKKyAgICAgICAgdHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoY2xhenopOworICAgICAgICByZXR1cm4gYWRkQW5ub3RhdGlvbihjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIG5vZGUgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbkV4cHJ9IGFkZGVkCisgICAgICovCisgICAgZGVmYXVsdCBOb3JtYWxBbm5vdGF0aW9uRXhwciBhZGRBbmRHZXRBbm5vdGF0aW9uKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBjbGF6eikgeworICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7CisgICAgICAgIHJldHVybiBhZGRBbmRHZXRBbm5vdGF0aW9uKGNsYXp6LmdldFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5ub3RhdGVzIHRoaXMgd2l0aCBhIG1hcmtlciBhbm5vdGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBhZGRNYXJrZXJBbm5vdGF0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE1hcmtlckFubm90YXRpb25FeHByIG1hcmtlckFubm90YXRpb25FeHByID0gbmV3IE1hcmtlckFubm90YXRpb25FeHByKAorICAgICAgICAgICAgICAgIHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGdldEFubm90YXRpb25zKCkuYWRkKG1hcmtlckFubm90YXRpb25FeHByKTsKKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIHdpdGggYSBtYXJrZXIgYW5ub3RhdGlvbiBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydAorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIGRlZmF1bHQgTiBhZGRNYXJrZXJBbm5vdGF0aW9uKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBjbGF6eikgeworICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7CisgICAgICAgIHJldHVybiBhZGRNYXJrZXJBbm5vdGF0aW9uKGNsYXp6LmdldFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5ub3RhdGVzIHRoaXMgd2l0aCBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgcGFydCBiZXR3ZWVuICgpCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIGFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcigKKyAgICAgICAgICAgICAgICBwYXJzZU5hbWUobmFtZSksIGV4cHJlc3Npb24pOworICAgICAgICBnZXRBbm5vdGF0aW9ucygpLmFkZChzaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcik7CisgICAgICAgIHJldHVybiAoTikgdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0ZXMgdGhpcyB3aXRoIGEgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUsIGRvbid0IGZvcmdldCB0byBhZGQgXCJcIiBmb3IgYSBzdHJpbmcgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBkZWZhdWx0IE4gYWRkU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBhZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG5hbWUsIHBhcnNlRXhwcmVzc2lvbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIHdpdGggYSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLCBkb24ndCBmb3JnZXQgdG8gYWRkIFwiXCIgZm9yIGEgc3RyaW5nIHZhbHVlCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgZGVmYXVsdCBOIGFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7CisgICAgICAgIHJldHVybiBhZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGNsYXp6LmdldFNpbXBsZU5hbWUoKSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgYW4gYW5ub3RhdGlvbiB3aXRoIHRoaXMgbmFtZSBpcyBwcmVzZW50IG9uIHRoaXMgZWxlbWVudAorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QKKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zKCkuc3RyZWFtKCkuYW55TWF0Y2goYSAtPiBhLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciBhbiBhbm5vdGF0aW9uIHdpdGggdGhpcyBjbGFzcyBpcyBwcmVzZW50IG9uIHRoaXMgZWxlbWVudAorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQsIGZhbHNlIGlmIG5vdAorICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGZpbmQgYW4gYW5ub3RhdGlvbiBieSBpdHMgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uCisgICAgICovCisgICAgZGVmYXVsdCBPcHRpb25hbDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbkJ5TmFtZShTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zKCkuc3RyZWFtKCkuZmlsdGVyKGEgLT4gYS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpLmZpbmRGaXJzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGFuIGFubm90YXRpb24gYnkgaXRzIGNsYXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzIHRoZSBjbGFzcyBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqLworICAgIGRlZmF1bHQgT3B0aW9uYWw8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25CeUNsYXNzKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25CeU5hbWUoYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhBcmd1bWVudHMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQXJndW1lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyNzA3YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQXJndW1lbnRzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb247CisKKy8qKgorICogQSBub2RlIHdpdGggYXJndW1lbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoQXJndW1lbnRzPE4gZXh0ZW5kcyBOb2RlPiB7CisgICAgTiBzZXRBcmd1bWVudHMoTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKTsKKworICAgIE5vZGVMaXN0PEV4cHJlc3Npb24+IGdldEFyZ3VtZW50cygpOworCisgICAgZGVmYXVsdCBFeHByZXNzaW9uIGdldEFyZ3VtZW50KGludCBpKSB7CisgICAgICAgIHJldHVybiBnZXRBcmd1bWVudHMoKS5nZXQoaSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIGFkZEFyZ3VtZW50KFN0cmluZyBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGFkZEFyZ3VtZW50KHBhcnNlRXhwcmVzc2lvbihhcmcpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gYWRkQXJndW1lbnQoRXhwcmVzc2lvbiBhcmcpIHsKKyAgICAgICAgZ2V0QXJndW1lbnRzKCkuYWRkKGFyZyk7CisgICAgICAgIHJldHVybiAoTikgdGhpczsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gc2V0QXJndW1lbnQoaW50IGksIEV4cHJlc3Npb24gYXJnKSB7CisgICAgICAgIGdldEFyZ3VtZW50cygpLnNldChpLCBhcmcpOworICAgICAgICByZXR1cm4gKE4pIHRoaXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEJsb2NrU3RtdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhCbG9ja1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNlM2UyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhCbG9ja1N0bXQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10Ow0KKw0KKy8qKg0KKyAqIEEgbm9kZSB3aXRoIGEgYm9keSB0aGF0IGlzIGEgQmxvY2tTdG10Lg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhCbG9ja1N0bXQ8TiBleHRlbmRzIE5vZGU+IHsNCisgICAgQmxvY2tTdG10IGdldEJvZHkoKTsNCisNCisgICAgTiBzZXRCb2R5KEJsb2NrU3RtdCBibG9jayk7DQorDQorICAgIGRlZmF1bHQgQmxvY2tTdG10IGNyZWF0ZUJvZHkoKSB7DQorICAgICAgICBCbG9ja1N0bXQgYmxvY2sgPSBuZXcgQmxvY2tTdG10KCk7DQorICAgICAgICBzZXRCb2R5KGJsb2NrKTsNCisgICAgICAgIHJldHVybiBibG9jazsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEJvZHkuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQm9keS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODg4MjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEJvZHkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10Ow0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50Ow0KKw0KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhCb2R5PE4gZXh0ZW5kcyBOb2RlPiB7DQorICAgIFN0YXRlbWVudCBnZXRCb2R5KCk7DQorDQorICAgIE4gc2V0Qm9keShmaW5hbCBTdGF0ZW1lbnQgYm9keSk7DQorDQorICAgIGRlZmF1bHQgQmxvY2tTdG10IGNyZWF0ZUJsb2NrU3RhdGVtZW50QXNCb2R5KCkgew0KKyAgICAgICAgQmxvY2tTdG10IGIgPSBuZXcgQmxvY2tTdG10KCk7DQorICAgICAgICBzZXRCb2R5KGIpOw0KKyAgICAgICAgcmV0dXJuIGI7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhDb25kaXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQ29uZGl0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExM2Y4YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQ29uZGl0aW9uLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aENvbmRpdGlvbjxOIGV4dGVuZHMgTm9kZT4geworICAgIEV4cHJlc3Npb24gZ2V0Q29uZGl0aW9uKCk7CisKKyAgICBOIHNldENvbmRpdGlvbihFeHByZXNzaW9uIGNvbmRpdGlvbik7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aENvbnN0cnVjdG9ycy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhDb25zdHJ1Y3RvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmYyNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhDb25zdHJ1Y3RvcnMuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvQ29sbGVjdGlvbjsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKKworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aENvbnN0cnVjdG9yczxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBOb2RlV2l0aFNpbXBsZU5hbWU8Tj4sIE5vZGVXaXRoTWVtYmVyczxOPiB7CisgICAgLyoqCisgICAgICogVHJ5IHRvIGZpbmQgYSB7QGxpbmsgQ29uc3RydWN0b3JEZWNsYXJhdGlvbn0gd2l0aCBubyBwYXJhbWV0ZXJzIGJ5IGl0cyBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RvcnMgZm91bmQgKG11bHRpcGxlIGluIGNhc2Ugb2YgcG9seW1vcnBoaXNtKQorICAgICAqLworICAgIGRlZmF1bHQgT3B0aW9uYWw8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZ2V0RGVmYXVsdENvbnN0cnVjdG9yKCkgeworICAgICAgICByZXR1cm4gZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihiZCAtPiBiZCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pLm1hcChiZCAtPiAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYmQpLmZpbHRlcihjZCAtPiBjZC5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKS5maW5kRmlyc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY29uc3RydWN0b3IgdG8gdGhpcworICAgICAqCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIGxpa2Uge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgZGVmYXVsdCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFkZENvbnN0cnVjdG9yKE1vZGlmaWVyLi4uIG1vZGlmaWVycykgeworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdCh0b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE5hbWUoZ2V0TmFtZSgpKTsKKyAgICAgICAgZ2V0TWVtYmVycygpLmFkZChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhbGwgY29uc3RydWN0b3JzIGZvciB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3JzIGZvdW5kLiBUaGlzIGxpc3QgaXMgaW1tdXRhYmxlLgorICAgICAqLworICAgIGRlZmF1bHQgTGlzdDxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBnZXRDb25zdHJ1Y3RvcnMoKSB7CisgICAgICAgIHJldHVybiB1bm1vZGlmaWFibGVMaXN0KGdldE1lbWJlcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikubWFwKG0gLT4gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG0pLmNvbGxlY3QodG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZmluZCBhIHtAbGluayBDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBieSBpdHMgcGFyYW1ldGVycyB0eXBlcworICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtVHlwZXMgdGhlIHR5cGVzIG9mIHBhcmFtZXRlcnMgbGlrZSAiTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyIsImludCIgdG8gbWF0Y2g8YnI+IHZvaWQKKyAgICAgKiBmb28oTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyBteU1hcCxpbnQgbnVtYmVyKQorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvdW5kIChtdWx0aXBsZSBpbiBjYXNlIG9mIG92ZXJsb2FkaW5nKQorICAgICAqLworICAgIGRlZmF1bHQgT3B0aW9uYWw8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZ2V0Q29uc3RydWN0b3JCeVBhcmFtZXRlclR5cGVzKFN0cmluZy4uLiBwYXJhbVR5cGVzKSB7CisgICAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3RvcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmhhc1BhcmFtZXRlcnNPZlR5cGUocGFyYW1UeXBlcykpLmZpbmRGaXJzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIENvbnN0cnVjdG9yRGVjbGFyYXRpb259IGJ5IGl0cyBwYXJhbWV0ZXJzIHR5cGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyB0aGUgdHlwZXMgb2YgcGFyYW1ldGVycyBsaWtlICJNYXAmbHQ7SW50ZWdlcixTdHJpbmcmZ3Q7IiwiaW50IiB0byBtYXRjaDxicj4gdm9pZAorICAgICAqIGZvbyhNYXAmbHQ7SW50ZWdlcixTdHJpbmcmZ3Q7IG15TWFwLGludCBudW1iZXIpCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0b3JzIGZvdW5kIChtdWx0aXBsZSBpbiBjYXNlIG9mIG92ZXJsb2FkaW5nKQorICAgICAqLworICAgIGRlZmF1bHQgT3B0aW9uYWw8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZ2V0Q29uc3RydWN0b3JCeVBhcmFtZXRlclR5cGVzKENsYXNzPD8+Li4uIHBhcmFtVHlwZXMpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbnN0cnVjdG9ycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0uaGFzUGFyYW1ldGVyc09mVHlwZShwYXJhbVR5cGVzKSkuZmluZEZpcnN0KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5MGVkMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworLyoqCisgKiBOb2RlIHdpdGggYSBkZWNsYXJhdGlvbiByZXByZXNlbnRhYmxlIGFzIGEgU3RyaW5nLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICogQHNpbmNlIEp1bHkgMjAxNAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoRGVjbGFyYXRpb24geworCisgICAgLyoqCisgICAgICogQXMge0BsaW5rIE5vZGVXaXRoRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuLCBib29sZWFuKX0gaW5jbHVkaW5nCisgICAgICogdGhlIG1vZGlmaWVycywgdGhlIHRocm93cyBjbGF1c2UgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpdGggYm90aCB0eXBlIGFuZCBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZygpOworCisgICAgLyoqCisgICAgICogQXMge0BsaW5rIE5vZGVXaXRoRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuLCBib29sZWFuKX0gaW5jbHVkaW5nCisgICAgICogdGhlIHBhcmFtZXRlcnMgd2l0aCBib3RoIHR5cGUgYW5kIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkaW5nTW9kaWZpZXJzIGZsYWcgdG8gaW5jbHVkZSB0aGUgbW9kaWZpZXJzIChpZiBwcmVzZW50KSBpbiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHBhcmFtIGluY2x1ZGluZ1Rocm93cyBmbGFnIHRvIGluY2x1ZGUgdGhlIHRocm93cyBjbGF1c2UgKGlmIHByZXNlbnQpIGluIHRoZSBzdHJpbmcgcHJvZHVjZWQKKyAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkZWNsYXJhdGlvbiBiYXNlZCBvbiBwYXJhbWV0ZXIgZmxhZ3MKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuIGluY2x1ZGluZ01vZGlmaWVycywgYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MpOworCisgICAgLyoqCisgICAgICogQSBzaW1wbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24uCisgICAgICogSXQgc2hvdWxkIGZpdCBvbmUgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGluZ01vZGlmaWVycyBmbGFnIHRvIGluY2x1ZGUgdGhlIG1vZGlmaWVycyAoaWYgcHJlc2VudCkgaW4gdGhlIHN0cmluZyBwcm9kdWNlZAorICAgICAqIEBwYXJhbSBpbmNsdWRpbmdUaHJvd3MgZmxhZyB0byBpbmNsdWRlIHRoZSB0aHJvd3MgY2xhdXNlIChpZiBwcmVzZW50KSBpbiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHBhcmFtIGluY2x1ZGluZ1BhcmFtZXRlck5hbWUgZmxhZyB0byBpbmNsdWRlIHRoZSBwYXJhbWV0ZXIgbmFtZSAod2hpbGUgdGhlIHBhcmFtZXRlciB0eXBlIGlzIGFsd2F5cyBpbmNsdWRlZCkgaW4KKyAgICAgKiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGVjbGFyYXRpb24gYmFzZWQgb24gcGFyYW1ldGVyIGZsYWdzCisgICAgICovCisgICAgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzLCBib29sZWFuIGluY2x1ZGluZ1BhcmFtZXRlck5hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFeHByZXNzaW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTFkZDcxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGhhcyBhbiBleHByZXNzaW9uIGluIGl0LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoRXhwcmVzc2lvbjxOIGV4dGVuZHMgTm9kZT4geworICAgIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpOworCisgICAgTiBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICBkZWZhdWx0IE4gc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICByZXR1cm4gc2V0RXhwcmVzc2lvbihwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoRXh0ZW5kcy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFeHRlbmRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0YWRmOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoRXh0ZW5kcy5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOw0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsNCisNCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGU7DQorDQorLyoqDQorICogQSBub2RlIHRoYXQgZXh0ZW5kcyBvdGhlciB0eXBlcy4NCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoRXh0ZW5kczxOIGV4dGVuZHMgTm9kZT4gew0KKyAgICBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0RXh0ZW5kZWRUeXBlcygpOw0KKw0KKyAgICB2b2lkIHRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KENsYXNzPD8+IGNsYXp6KTsNCisNCisgICAgZGVmYXVsdCBDbGFzc09ySW50ZXJmYWNlVHlwZSBnZXRFeHRlbmRlZFR5cGVzKGludCBpKSB7DQorICAgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRUeXBlcygpLmdldChpKTsNCisgICAgfQ0KKw0KKyAgICBOIHNldEV4dGVuZGVkVHlwZXMoTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dGVuZHNMaXN0KTsNCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIGRlZmF1bHQgTiBzZXRFeHRlbmRlZFR5cGUoaW50IGksIENsYXNzT3JJbnRlcmZhY2VUeXBlIGV4dGVuZCkgew0KKyAgICAgICAgZ2V0RXh0ZW5kZWRUeXBlcygpLnNldChpLCBleHRlbmQpOw0KKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gYWRkRXh0ZW5kZWRUeXBlKENsYXNzT3JJbnRlcmZhY2VUeXBlIGV4dGVuZCkgew0KKyAgICAgICAgZ2V0RXh0ZW5kZWRUeXBlcygpLmFkZChleHRlbmQpOw0KKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYWRkRXh0ZW5kZWRUeXBlDQorICAgICAqLw0KKyAgICBkZWZhdWx0IE4gYWRkRXh0ZW5kcyhDbGFzczw/PiBjbGF6eikgew0KKyAgICAgICAgcmV0dXJuIGFkZEV4dGVuZGVkVHlwZShjbGF6eik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBkZXByZWNhdGVkIHVzZSBhZGRFeHRlbmRlZFR5cGUNCisgICAgICovDQorICAgIGRlZmF1bHQgTiBhZGRFeHRlbmRzKFN0cmluZyBuYW1lKSB7DQorICAgICAgICByZXR1cm4gYWRkRXh0ZW5kZWRUeXBlKG5hbWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYW4gImV4dGVuZHMiIHRvIHRoaXMgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQNCisgICAgICoNCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyB0byBleHRhbmQgZnJvbQ0KKyAgICAgKiBAcmV0dXJuIHRoaXMNCisgICAgICovDQorICAgIGRlZmF1bHQgTiBhZGRFeHRlbmRlZFR5cGUoQ2xhc3M8Pz4gY2xhenopIHsNCisgICAgICAgIHRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KTsNCisgICAgICAgIHJldHVybiBhZGRFeHRlbmRlZFR5cGUoY2xhenouZ2V0U2ltcGxlTmFtZSgpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGFuICJleHRlbmRzIiB0byB0aGlzDQorICAgICAqDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGV4dGVuZHMgZnJvbQ0KKyAgICAgKiBAcmV0dXJuIHRoaXMNCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gYWRkRXh0ZW5kZWRUeXBlKFN0cmluZyBuYW1lKSB7DQorICAgICAgICBnZXRFeHRlbmRlZFR5cGVzKCkuYWRkKHBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGUobmFtZSkpOw0KKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoSWRlbnRpZmllci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhJZGVudGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNTgzYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoSWRlbnRpZmllci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb25FbXB0eTsKKworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aElkZW50aWZpZXI8TiBleHRlbmRzIE5vZGU+IHsKKyAgICBTdHJpbmcgZ2V0SWRlbnRpZmllcigpOworCisgICAgTiBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKKworICAgIGRlZmF1bHQgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gZ2V0SWRlbnRpZmllcigpOworICAgIH0KKworICAgIGRlZmF1bHQgTiBzZXRJZChTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICBhc3NlcnROb25FbXB0eShpZGVudGlmaWVyKTsKKyAgICAgICAgcmV0dXJuIHNldElkZW50aWZpZXIoaWRlbnRpZmllcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhJbXBsZW1lbnRzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEltcGxlbWVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGNlZTRkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhJbXBsZW1lbnRzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOw0KKw0KK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZTsNCisNCisvKioNCisgKiBBIG5vZGUgdGhhdCBpbXBsZW1lbnRzIG90aGVyIHR5cGVzLg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhJbXBsZW1lbnRzPE4gZXh0ZW5kcyBOb2RlPiB7DQorICAgIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBnZXRJbXBsZW1lbnRlZFR5cGVzKCk7DQorDQorICAgIGRlZmF1bHQgQ2xhc3NPckludGVyZmFjZVR5cGUgZ2V0SW1wbGVtZW50ZWRUeXBlcyhpbnQgaSkgew0KKyAgICAgICAgcmV0dXJuIGdldEltcGxlbWVudGVkVHlwZXMoKS5nZXQoaSk7DQorICAgIH0NCisNCisgICAgTiBzZXRJbXBsZW1lbnRlZFR5cGVzKE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdCk7DQorICAgIA0KKyAgICB2b2lkIHRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KENsYXNzPD8+IGNsYXp6KTsNCisgICAgDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gc2V0SW1wbGVtZW50ZWRUeXBlKGludCBpLCBDbGFzc09ySW50ZXJmYWNlVHlwZSBpbXBsZW1lbnQpIHsNCisgICAgICAgIGdldEltcGxlbWVudGVkVHlwZXMoKS5zZXQoaSwgaW1wbGVtZW50KTsNCisgICAgICAgIHJldHVybiAoTikgdGhpczsNCisgICAgfQ0KKw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgZGVmYXVsdCBOIGFkZEltcGxlbWVudGVkVHlwZShDbGFzc09ySW50ZXJmYWNlVHlwZSBpbXBsZW1lbnQpIHsNCisgICAgICAgIGdldEltcGxlbWVudGVkVHlwZXMoKS5hZGQoaW1wbGVtZW50KTsNCisgICAgICAgIHJldHVybiAoTikgdGhpczsNCisgICAgfQ0KKw0KKyAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGFkZEltcGxlbWVudGVkVHlwZSBpbnN0ZWFkICovDQorICAgIGRlZmF1bHQgTiBhZGRJbXBsZW1lbnRzKFN0cmluZyBuYW1lKSB7DQorICAgICAgICByZXR1cm4gYWRkSW1wbGVtZW50ZWRUeXBlKG5hbWUpOw0KKyAgICB9DQorDQorICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgYWRkSW1wbGVtZW50ZWRUeXBlIGluc3RlYWQgKi8NCisgICAgZGVmYXVsdCBOIGFkZEltcGxlbWVudHMoQ2xhc3M8Pz4gY2xhenopIHsNCisgICAgICAgIHJldHVybiBhZGRJbXBsZW1lbnRlZFR5cGUoY2xhenopOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYW4gaW1wbGVtZW50cyB0byB0aGlzDQorICAgICAqDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGV4dGVuZHMgZnJvbQ0KKyAgICAgKiBAcmV0dXJuIHRoaXMNCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gYWRkSW1wbGVtZW50ZWRUeXBlKFN0cmluZyBuYW1lKSB7DQorICAgICAgICBnZXRJbXBsZW1lbnRlZFR5cGVzKCkuYWRkKHBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGUobmFtZSkpOw0KKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYW4gaW1wbGVtZW50cyB0byB0aGlzIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0DQorICAgICAqDQorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgdHlwZSB0byBpbXBsZW1lbnRzIGZyb20NCisgICAgICogQHJldHVybiB0aGlzDQorICAgICAqLw0KKyAgICBkZWZhdWx0IE4gYWRkSW1wbGVtZW50ZWRUeXBlKENsYXNzPD8+IGNsYXp6KSB7DQorICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7DQorICAgICAgICByZXR1cm4gYWRkSW1wbGVtZW50ZWRUeXBlKGNsYXp6LmdldFNpbXBsZU5hbWUoKSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhKYXZhZG9jLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEphdmFkb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTI5NDdlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhKYXZhZG9jLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuSmF2YWRvYzsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIG5vZGUgdGhhdCBjYW4gYmUgZG9jdW1lbnRlZCB3aXRoIGEgSmF2YWRvYyBjb21tZW50LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoSmF2YWRvYzxOIGV4dGVuZHMgTm9kZT4geworICAgIE9wdGlvbmFsPENvbW1lbnQ+IGdldENvbW1lbnQoKTsKKworICAgIE5vZGUgc2V0Q29tbWVudChDb21tZW50IGNvbW1lbnQpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgSmF2YWRvY0NvbW1lbnQgZm9yIHRoaXMgbm9kZS4gWW91IGNhbiBzZXQgdGhlIEphdmFkb2NDb21tZW50IGJ5IGNhbGxpbmcgc2V0SmF2YWRvY0NvbW1lbnQgcGFzc2luZyBhCisgICAgICogSmF2YWRvY0NvbW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBKYXZhZG9jQ29tbWVudCBmb3IgdGhpcyBub2RlIHdyYXBwZWQgaW4gYW4gb3B0aW9uYWwgYXMgaXQgbWF5IGJlIGFic2VudC4KKyAgICAgKi8KKyAgICBkZWZhdWx0IE9wdGlvbmFsPEphdmFkb2NDb21tZW50PiBnZXRKYXZhZG9jQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1lbnQoKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoY29tbWVudCAtPiBjb21tZW50IGluc3RhbmNlb2YgSmF2YWRvY0NvbW1lbnQpCisgICAgICAgICAgICAgICAgLm1hcChjb21tZW50IC0+IChKYXZhZG9jQ29tbWVudCkgY29tbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgSmF2YWRvYyBmb3IgdGhpcyBub2RlLiBZb3UgY2FuIHNldCB0aGUgSmF2YWRvYyBieSBjYWxsaW5nIHNldEphdmFkb2NDb21tZW50IHBhc3NpbmcgYSBKYXZhZG9jLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgSmF2YWRvYyBmb3IgdGhpcyBub2RlIHdyYXBwZWQgaW4gYW4gb3B0aW9uYWwgYXMgaXQgbWF5IGJlIGFic2VudC4KKyAgICAgKi8KKyAgICBkZWZhdWx0IE9wdGlvbmFsPEphdmFkb2M+IGdldEphdmFkb2MoKSB7CisgICAgICAgIHJldHVybiBnZXRKYXZhZG9jQ29tbWVudCgpLm1hcChKYXZhZG9jQ29tbWVudDo6cGFyc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdG8gYmUgc2V0CisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIHNldEphdmFkb2NDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHJldHVybiBzZXRKYXZhZG9jQ29tbWVudChuZXcgSmF2YWRvY0NvbW1lbnQoIiAiICsgY29tbWVudCkpOworICAgIH0KKworICAgIGRlZmF1bHQgTiBzZXRKYXZhZG9jQ29tbWVudChKYXZhZG9jQ29tbWVudCBjb21tZW50KSB7CisgICAgICAgIHNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiAoTikgdGhpczsKKyAgICB9CisKKyAgICBkZWZhdWx0IE4gc2V0SmF2YWRvY0NvbW1lbnQoU3RyaW5nIGluZGVudGF0aW9uLCBKYXZhZG9jIGphdmFkb2MpIHsKKyAgICAgICAgcmV0dXJuIHNldEphdmFkb2NDb21tZW50KGphdmFkb2MudG9Db21tZW50KGluZGVudGF0aW9uKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBOIHNldEphdmFkb2NDb21tZW50KEphdmFkb2MgamF2YWRvYykgeworICAgICAgICByZXR1cm4gc2V0SmF2YWRvY0NvbW1lbnQoamF2YWRvYy50b0NvbW1lbnQoKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBib29sZWFuIHJlbW92ZUphdmFEb2NDb21tZW50KCkgeworICAgICAgICByZXR1cm4gaGFzSmF2YURvY0NvbW1lbnQoKSAmJiBnZXRDb21tZW50KCkuZ2V0KCkucmVtb3ZlKCk7CisgICAgfQorCisgICAgZGVmYXVsdCBib29sZWFuIGhhc0phdmFEb2NDb21tZW50KCkgeworICAgICAgICByZXR1cm4gZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpICYmIGdldENvbW1lbnQoKS5nZXQoKSBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNZW1iZXJzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE1lbWJlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDVmMGMzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNZW1iZXJzLmphdmEKQEAgLTAsMCArMSwzMjggQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOw0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZTsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7DQorDQoraW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZVR5cGU7DQoraW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdDsNCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb247DQoraW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0Ow0KKw0KKy8qKg0KKyAqIEEgbm9kZSBoYXZpbmcgbWVtYmVycy4NCisgKiA8cD4NCisgKiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgaW50ZXJmYWNlIGlzIHRvIHBlcm1pdCB1c2VycyB0byBtYW5pcHVsYXRlIGhvbW9nZW5lb3VzbHkgYWxsIG5vZGVzIHdpdGggYSBnZXRNZW1iZXJzDQorICogbWV0aG9kLg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhNZW1iZXJzPE4gZXh0ZW5kcyBOb2RlPiB7DQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIGFsbCBtZW1iZXJzIGluc2lkZSB0aGUgYnJhY2VzIG9mIHRoaXMgbm9kZSwNCisgICAgICogbGlrZSBmaWVsZHMsIG1ldGhvZHMsIG5lc3RlZCB0eXBlcywgZXRjLg0KKyAgICAgKi8NCisgICAgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBnZXRNZW1iZXJzKCk7DQorDQorICAgIHZvaWQgdHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoQ2xhc3M8Pz4gY2xhenopOw0KKw0KKyAgICBkZWZhdWx0IEJvZHlEZWNsYXJhdGlvbjw/PiBnZXRNZW1iZXIoaW50IGkpIHsNCisgICAgICAgIHJldHVybiBnZXRNZW1iZXJzKCkuZ2V0KGkpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gc2V0TWVtYmVyKGludCBpLCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyKSB7DQorICAgICAgICBnZXRNZW1iZXJzKCkuc2V0KGksIG1lbWJlcik7DQorICAgICAgICByZXR1cm4gKE4pIHRoaXM7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIGRlZmF1bHQgTiBhZGRNZW1iZXIoQm9keURlY2xhcmF0aW9uPD8+IG1lbWJlcikgew0KKyAgICAgICAgZ2V0TWVtYmVycygpLmFkZChtZW1iZXIpOw0KKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOw0KKyAgICB9DQorDQorICAgIE4gc2V0TWVtYmVycyhOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpOw0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgZmllbGQgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydCBvZiB0aGUgdHlwZSBpZiBuZWVkZWQNCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGVDbGFzcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQNCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkDQorICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVycyBsaWtlIHtAbGluayBNb2RpZmllciNQVUJMSUN9DQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkDQorICAgICAqLw0KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkRmllbGQoQ2xhc3M8Pz4gdHlwZUNsYXNzLCBTdHJpbmcgbmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7DQorICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdCh0eXBlQ2xhc3MpOw0KKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHR5cGVDbGFzcy5nZXRTaW1wbGVOYW1lKCksIG5hbWUsIG1vZGlmaWVycyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIGZpZWxkIHRvIHRoaXMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmllbGQNCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIGxpa2Uge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30NCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQNCisgICAgICovDQorICAgIGRlZmF1bHQgRmllbGREZWNsYXJhdGlvbiBhZGRGaWVsZChTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgew0KKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHBhcnNlVHlwZSh0eXBlKSwgbmFtZSwgbW9kaWZpZXJzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgZmllbGQgdG8gdGhpcy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfQ0KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0gY3JlYXRlZA0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZEZpZWxkKFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgew0KKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gbmV3IEZpZWxkRGVjbGFyYXRpb24oKTsNCisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3IodHlwZSwgbmFtZSk7DQorICAgICAgICBmaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpLmFkZCh2YXJpYWJsZSk7DQorICAgICAgICBmaWVsZERlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhBcnJheXMuc3RyZWFtKG1vZGlmaWVycykNCisgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKTsNCisgICAgICAgIGdldE1lbWJlcnMoKS5hZGQoZmllbGREZWNsYXJhdGlvbik7DQorICAgICAgICByZXR1cm4gZmllbGREZWNsYXJhdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgZmllbGQgdG8gdGhpcy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgdGhlIGluaXRpYWxpemVyIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfQ0KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0gY3JlYXRlZA0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZEZpZWxkV2l0aEluaXRpYWxpemVyKFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgew0KKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGFkZEZpZWxkKHR5cGUsIG5hbWUsIG1vZGlmaWVycyk7DQorICAgICAgICBkZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5zZXRJbml0aWFsaXplcihpbml0aWFsaXplcik7DQorICAgICAgICByZXR1cm4gZGVjbGFyYXRpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIHByaXZhdGUgZmllbGQgdG8gdGhpcy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGVDbGFzcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQNCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkDQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkDQorICAgICAqLw0KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHJpdmF0ZUZpZWxkKENsYXNzPD8+IHR5cGVDbGFzcywgU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHJldHVybiBhZGRGaWVsZCh0eXBlQ2xhc3MsIG5hbWUsIE1vZGlmaWVyLlBSSVZBVEUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYSBwcml2YXRlIGZpZWxkIHRvIHRoaXMgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQgb2YgdGhlIHR5cGUgaWYNCisgICAgICogbmVlZGVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZmllbGQNCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkDQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkDQorICAgICAqLw0KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHJpdmF0ZUZpZWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHR5cGUsIG5hbWUsIE1vZGlmaWVyLlBSSVZBVEUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYSBwdWJsaWMgZmllbGQgdG8gdGhpcy4NCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGVDbGFzcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQNCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkDQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkDQorICAgICAqLw0KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHVibGljRmllbGQoQ2xhc3M8Pz4gdHlwZUNsYXNzLCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHR5cGVDbGFzcywgbmFtZSwgTW9kaWZpZXIuUFVCTElDKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgcHVibGljIGZpZWxkIHRvIHRoaXMgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQgb2YgdGhlIHR5cGUgaWYNCisgICAgICogbmVlZGVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZmllbGQNCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkDQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkDQorICAgICAqLw0KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHVibGljRmllbGQoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKSB7DQorICAgICAgICByZXR1cm4gYWRkRmllbGQodHlwZSwgbmFtZSwgTW9kaWZpZXIuUFVCTElDKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgcHJvdGVjdGVkIGZpZWxkIHRvIHRoaXMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0eXBlQ2xhc3MgdGhlIHR5cGUgb2YgdGhlIGZpZWxkDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0gY3JlYXRlZA0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZFByb3RlY3RlZEZpZWxkKENsYXNzPD8+IHR5cGVDbGFzcywgU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHJldHVybiBhZGRGaWVsZCh0eXBlQ2xhc3MsIG5hbWUsIE1vZGlmaWVyLlBST1RFQ1RFRCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIHByb3RlY3RlZCBmaWVsZCB0byB0aGlzIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0IG9mIHRoZSB0eXBlDQorICAgICAqIGlmIG5lZWRlZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0gY3JlYXRlZA0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZFByb3RlY3RlZEZpZWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHR5cGUsIG5hbWUsIE1vZGlmaWVyLlBST1RFQ1RFRCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZHMgYSBtZXRob2RzIHdpdGggdm9pZCByZXR1cm4gYnkgZGVmYXVsdCB0byB0aGlzLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIG5hbWUNCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIGxpa2Uge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30NCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBjcmVhdGVkDQorICAgICAqLw0KKyAgICBkZWZhdWx0IE1ldGhvZERlY2xhcmF0aW9uIGFkZE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7DQorICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG5ldyBNZXRob2REZWNsYXJhdGlvbigpOw0KKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uc2V0TmFtZShtZXRob2ROYW1lKTsNCisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLnNldFR5cGUobmV3IFZvaWRUeXBlKCkpOw0KKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKQ0KKyAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkpOw0KKyAgICAgICAgZ2V0TWVtYmVycygpLmFkZChtZXRob2REZWNsYXJhdGlvbik7DQorICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhbiBpbml0aWFsaXplciBibG9jayAoe0BsaW5rIEluaXRpYWxpemVyRGVjbGFyYXRpb259KSB0byB0aGlzLg0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBCbG9ja1N0bXQgYWRkSW5pdGlhbGl6ZXIoKSB7DQorICAgICAgICBCbG9ja1N0bXQgYmxvY2sgPSBuZXcgQmxvY2tTdG10KCk7DQorICAgICAgICBJbml0aWFsaXplckRlY2xhcmF0aW9uIGluaXRpYWxpemVyRGVjbGFyYXRpb24gPSBuZXcgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbihmYWxzZSwgYmxvY2spOw0KKyAgICAgICAgZ2V0TWVtYmVycygpLmFkZChpbml0aWFsaXplckRlY2xhcmF0aW9uKTsNCisgICAgICAgIHJldHVybiBibG9jazsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgc3RhdGljIGluaXRpYWxpemVyIGJsb2NrICh7QGxpbmsgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbn0pIHRvIHRoaXMuDQorICAgICAqLw0KKyAgICBkZWZhdWx0IEJsb2NrU3RtdCBhZGRTdGF0aWNJbml0aWFsaXplcigpIHsNCisgICAgICAgIEJsb2NrU3RtdCBibG9jayA9IG5ldyBCbG9ja1N0bXQoKTsNCisgICAgICAgIEluaXRpYWxpemVyRGVjbGFyYXRpb24gaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiA9IG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKHRydWUsIGJsb2NrKTsNCisgICAgICAgIGdldE1lbWJlcnMoKS5hZGQoaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbik7DQorICAgICAgICByZXR1cm4gYmxvY2s7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBieSBpdHMgbmFtZQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kDQorICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZHMgZm91bmQgKG11bHRpcGxlIGluIGNhc2Ugb2Ygb3ZlcmxvYWRpbmcpDQorICAgICAqLw0KKyAgICBkZWZhdWx0IExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGdldE1ldGhvZHNCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHJldHVybiB1bm1vZGlmaWFibGVMaXN0KGdldE1ldGhvZHMoKS5zdHJlYW0oKQ0KKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbS5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMobmFtZSkpDQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEZpbmQgYWxsIG1ldGhvZHMgaW4gdGhlIG1lbWJlcnMgb2YgdGhpcyBub2RlLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2RzIGZvdW5kLiBUaGlzIGxpc3QgaXMgaW1tdXRhYmxlLg0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2RzKCkgew0KKyAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZUxpc3QoZ2V0TWVtYmVycygpLnN0cmVhbSgpDQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pDQorICAgICAgICAgICAgICAgIC5tYXAobSAtPiAoTWV0aG9kRGVjbGFyYXRpb24pIG0pDQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBieSBpdHMgcGFyYW1ldGVycyB0eXBlcw0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyB0aGUgdHlwZXMgb2YgcGFyYW1ldGVycyBsaWtlICJNYXAmbHQ7SW50ZWdlcixTdHJpbmcmZ3Q7IiwiaW50IiB0byBtYXRjaDxicj4gdm9pZA0KKyAgICAgKiBmb28oTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyBteU1hcCxpbnQgbnVtYmVyKQ0KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2RzIGZvdW5kIChtdWx0aXBsZSBpbiBjYXNlIG9mIG92ZXJsb2FkaW5nKQ0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2RzQnlQYXJhbWV0ZXJUeXBlcyhTdHJpbmcuLi4gcGFyYW1UeXBlcykgew0KKyAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZUxpc3QoZ2V0TWV0aG9kcygpLnN0cmVhbSgpDQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtLmhhc1BhcmFtZXRlcnNPZlR5cGUocGFyYW1UeXBlcykpDQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyeSB0byBmaW5kIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn1zIGJ5IHRoZWlyIG5hbWUgYW5kIHBhcmFtZXRlcnMgdHlwZXMNCisgICAgICoNCisgICAgICogQHBhcmFtIHBhcmFtVHlwZXMgdGhlIHR5cGVzIG9mIHBhcmFtZXRlcnMgbGlrZSAiTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyIsImludCIgdG8gbWF0Y2g8YnI+IHZvaWQNCisgICAgICogZm9vKE1hcCZsdDtJbnRlZ2VyLFN0cmluZyZndDsgbXlNYXAsaW50IG51bWJlcikNCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kcyBmb3VuZCAobXVsdGlwbGUgaW4gY2FzZSBvZiBvdmVybG9hZGluZykNCisgICAgICovDQorICAgIGRlZmF1bHQgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gZ2V0TWV0aG9kc0J5U2lnbmF0dXJlKFN0cmluZyBuYW1lLCBTdHJpbmcuLi4gcGFyYW1UeXBlcykgew0KKyAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZUxpc3QoZ2V0TWV0aG9kc0J5TmFtZShuYW1lKS5zdHJlYW0oKQ0KKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbS5oYXNQYXJhbWV0ZXJzT2ZUeXBlKHBhcmFtVHlwZXMpKQ0KKyAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0xpc3QoKSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUcnkgdG8gZmluZCBhIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gYnkgaXRzIHBhcmFtZXRlcnMgdHlwZXMNCisgICAgICoNCisgICAgICogQHBhcmFtIHBhcmFtVHlwZXMgdGhlIHR5cGVzIG9mIHBhcmFtZXRlcnMgbGlrZSAiTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyIsImludCIgdG8gbWF0Y2g8YnI+IHZvaWQNCisgICAgICogZm9vKE1hcCZsdDtJbnRlZ2VyLFN0cmluZyZndDsgbXlNYXAsaW50IG51bWJlcikNCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kcyBmb3VuZCAobXVsdGlwbGUgaW4gY2FzZSBvZiBvdmVybG9hZGluZykNCisgICAgICovDQorICAgIGRlZmF1bHQgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gZ2V0TWV0aG9kc0J5UGFyYW1ldGVyVHlwZXMoQ2xhc3M8Pz4uLi4gcGFyYW1UeXBlcykgew0KKyAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZUxpc3QoZ2V0TWV0aG9kcygpLnN0cmVhbSgpDQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtLmhhc1BhcmFtZXRlcnNPZlR5cGUocGFyYW1UeXBlcykpDQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGJ5IGl0cyBuYW1lDQorICAgICAqDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLCB0aGUgRmllbGREZWNsYXJhdGlvbiBvdGhlcndpc2UNCisgICAgICovDQorICAgIGRlZmF1bHQgT3B0aW9uYWw8RmllbGREZWNsYXJhdGlvbj4gZ2V0RmllbGRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHJldHVybiBnZXRNZW1iZXJzKCkuc3RyZWFtKCkNCisgICAgICAgICAgICAgICAgLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKQ0KKyAgICAgICAgICAgICAgICAubWFwKGYgLT4gKEZpZWxkRGVjbGFyYXRpb24pIGYpDQorICAgICAgICAgICAgICAgIC5maWx0ZXIoZiAtPiBmLmdldFZhcmlhYmxlcygpLnN0cmVhbSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKHZhciAtPiB2YXIuZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSkNCisgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGaW5kIGFsbCBmaWVsZHMgaW4gdGhlIG1lbWJlcnMgb2YgdGhpcyBub2RlLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZHMgZm91bmQuIFRoaXMgbGlzdCBpcyBpbW11dGFibGUuDQorICAgICAqLw0KKyAgICBkZWZhdWx0IExpc3Q8RmllbGREZWNsYXJhdGlvbj4gZ2V0RmllbGRzKCkgew0KKyAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZUxpc3QoZ2V0TWVtYmVycygpLnN0cmVhbSgpDQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikNCisgICAgICAgICAgICAgICAgLm1hcChtIC0+IChGaWVsZERlY2xhcmF0aW9uKSBtKQ0KKyAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0xpc3QoKSkpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTW9kaWZpZXJzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE1vZGlmaWVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDk5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE1vZGlmaWVycy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBBIE5vZGUgd2l0aCBNb2RpZmllcnMuCisgKiBOb3RlIHRoYXQgbm90IGFsbCBtb2RpZmllcnMgbWF5IGJlIHZhbGlkIGZvciB0aGlzIG5vZGUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhNb2RpZmllcnM8TiBleHRlbmRzIE5vZGU+IHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICAqIFdhcm5pbmc6IG1vZGlmeWluZyB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgbm90IHRyaWdnZXIgb2JzZXJ2ZXJzLAorICAgICAqIHlvdSBoYXZlIHRvIHVzZSBzZXRNb2RpZmllcnMgZm9yIHRoYXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1vZGlmaWVycworICAgICAqIEBzZWUgTW9kaWZpZXIKKyAgICAgKi8KKyAgICBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKTsKKworICAgIE4gc2V0TW9kaWZpZXJzKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyk7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gYWRkTW9kaWZpZXIoTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIEVudW1TZXQ8TW9kaWZpZXI+IG5ld01vZGlmaWVycyA9IGdldE1vZGlmaWVycygpLmNsb25lKCk7CisgICAgICAgIG5ld01vZGlmaWVycy5hZGRBbGwoQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkpOworICAgICAgICBzZXRNb2RpZmllcnMobmV3TW9kaWZpZXJzKTsKKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiByZW1vdmVNb2RpZmllcihNb2RpZmllci4uLiBtKSB7CisgICAgICAgIEVudW1TZXQ8TW9kaWZpZXI+IG5ld01vZGlmaWVycyA9IGdldE1vZGlmaWVycygpLmNsb25lKCk7CisgICAgICAgIG5ld01vZGlmaWVycy5yZW1vdmVBbGwoQXJyYXlzLnN0cmVhbShtKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG5ld01vZGlmaWVycyk7CisgICAgICAgIHJldHVybiAoTikgdGhpczsKKyAgICB9CisgICAgZGVmYXVsdCBOIHNldE1vZGlmaWVyKE1vZGlmaWVyIG0sIGJvb2xlYW4gc2V0KSB7CisgICAgICAgIGlmIChzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRNb2RpZmllcihtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVNb2RpZmllcihtKTsKKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTmFtZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNWNhZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTmFtZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlTmFtZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vbkVtcHR5OworCisvKioKKyAqIEEgbm9kZSB3aXRoIGEgKHF1YWxpZmllZCkgbmFtZS4KKyAqIDxwPgorICogVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGludGVyZmFjZSBpcyB0byBwZXJtaXQgdXNlcnMgdG8gbWFuaXB1bGF0ZSBob21vZ2VuZW91c2x5IGFsbCBub2RlcyB3aXRoIGEgZ2V0TmFtZSBtZXRob2QuCisgKgorICogQHNpbmNlIDIuMC4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhOYW1lPE4gZXh0ZW5kcyBOb2RlPiB7CisgICAgTmFtZSBnZXROYW1lKCk7CisKKyAgICBOIHNldE5hbWUoTmFtZSBuYW1lKTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vbkVtcHR5KG5hbWUpOworICAgICAgICByZXR1cm4gc2V0TmFtZShwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworICAgIGRlZmF1bHQgU3RyaW5nIGdldE5hbWVBc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5hc1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoT3B0aW9uYWxCbG9ja1N0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoT3B0aW9uYWxCbG9ja1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY4OWE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhPcHRpb25hbEJsb2NrU3RtdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOw0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsNCisNCisvKioNCisgKiBBIG5vZGUgd2l0aCBhIGJvZHkgdGhhdCBpcyBhIEJsb2NrU3RtdCwgd2hpY2ggaXMgb3B0aW9uYWwuDQorICovDQorcHVibGljIGludGVyZmFjZSBOb2RlV2l0aE9wdGlvbmFsQmxvY2tTdG10PE4gZXh0ZW5kcyBOb2RlPiB7DQorICAgIE9wdGlvbmFsPEJsb2NrU3RtdD4gZ2V0Qm9keSgpOw0KKw0KKyAgICBOIHNldEJvZHkoQmxvY2tTdG10IGJsb2NrKTsNCisNCisgICAgTiByZW1vdmVCb2R5KCk7DQorDQorICAgIGRlZmF1bHQgQmxvY2tTdG10IGNyZWF0ZUJvZHkoKSB7DQorICAgICAgICBCbG9ja1N0bXQgYmxvY2sgPSBuZXcgQmxvY2tTdG10KCk7DQorICAgICAgICBzZXRCb2R5KGJsb2NrKTsNCisgICAgICAgIHJldHVybiBibG9jazsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE9wdGlvbmFsTGFiZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoT3B0aW9uYWxMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWIxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE9wdGlvbmFsTGFiZWwuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb25FbXB0eTsKKworLyoqCisgKiBBIG5vZGUgdGhhdCBoYXMgYW4gb3B0aW9uYWwgbGFiZWwuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhPcHRpb25hbExhYmVsPFQgZXh0ZW5kcyBOb2RlPiB7CisgICAgT3B0aW9uYWw8U2ltcGxlTmFtZT4gZ2V0TGFiZWwoKTsKKworICAgIFQgc2V0TGFiZWwoU2ltcGxlTmFtZSBsYWJlbCk7CisgICAgCisgICAgVCByZW1vdmVMYWJlbCgpOworCisgICAgZGVmYXVsdCBUIHNldExhYmVsKFN0cmluZyBsYWJlbCkgeworICAgICAgICBhc3NlcnROb25FbXB0eShsYWJlbCk7CisgICAgICAgIHJldHVybiBzZXRMYWJlbChuZXcgU2ltcGxlTmFtZShsYWJlbCkpOworICAgIH0KKworICAgIGRlZmF1bHQgT3B0aW9uYWw8U3RyaW5nPiBnZXRMYWJlbEFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0TGFiZWwoKS5mbGF0TWFwKGwgLT4gT3B0aW9uYWwub2YobC5nZXRJZGVudGlmaWVyKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE9wdGlvbmFsU2NvcGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoT3B0aW9uYWxTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmQ1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE9wdGlvbmFsU2NvcGUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNyBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbm9kZSB3aGljaCBoYXMgYW4gb3B0aW9uYWwgc2NvcGUgZXhwcmVzc2lvbiBlZy4gbWV0aG9kIGNhbGxzIChvYmplY3QubWV0aG9kKCkpLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoT3B0aW9uYWxTY29wZTxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBOb2RlV2l0aFRyYXZlcnNhYmxlU2NvcGUgeworCisgICAgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZ2V0U2NvcGUoKTsKKworICAgIE4gc2V0U2NvcGUoRXhwcmVzc2lvbiBzY29wZSk7CisgICAgCisgICAgTiByZW1vdmVTY29wZSgpOworCisgICAgZGVmYXVsdCBPcHRpb25hbDxFeHByZXNzaW9uPiB0cmF2ZXJzZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gZ2V0U2NvcGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFBhcmFtZXRlcnMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoUGFyYW1ldGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxN2Q4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFBhcmFtZXRlcnMuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7DQorDQoraW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsNCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07DQorDQoraW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZVR5cGU7DQoraW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9TZXQ7DQorDQorcHVibGljIGludGVyZmFjZSBOb2RlV2l0aFBhcmFtZXRlcnM8TiBleHRlbmRzIE5vZGU+IHsNCisgICAgTm9kZUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCk7DQorDQorICAgIGRlZmF1bHQgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihpbnQgaSkgew0KKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoKS5nZXQoaSk7DQorICAgIH0NCisNCisgICAgdm9pZCB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChDbGFzczw/PiBjbGF6eik7DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gc2V0UGFyYW1ldGVyKGludCBpLCBQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7DQorICAgICAgICBnZXRQYXJhbWV0ZXJzKCkuc2V0KGksIHBhcmFtZXRlcik7DQorICAgICAgICByZXR1cm4gKE4pIHRoaXM7DQorICAgIH0NCisNCisgICAgTiBzZXRQYXJhbWV0ZXJzKE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyk7DQorDQorICAgIGRlZmF1bHQgTiBhZGRQYXJhbWV0ZXIoVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKHR5cGUsIG5hbWUpKTsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IE4gYWRkUGFyYW1ldGVyKENsYXNzPD8+IHBhcmFtQ2xhc3MsIFN0cmluZyBuYW1lKSB7DQorICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChwYXJhbUNsYXNzKTsNCisgICAgICAgIHJldHVybiBhZGRQYXJhbWV0ZXIocGFyc2VUeXBlKHBhcmFtQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSwgbmFtZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlbWVtYmVyIHRvIGltcG9ydCB0aGUgY2xhc3MgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgeW91cnNlbGYNCisgICAgICoNCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MsIGV4IDogb3JnLnRlc3QuRm9vIG9yIEZvbyBpZiB5b3UgYWRkZWQgbWFudWFsbHkgdGhlIGltcG9ydA0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyDQorICAgICAqLw0KKyAgICBkZWZhdWx0IE4gYWRkUGFyYW1ldGVyKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBuYW1lKSB7DQorICAgICAgICByZXR1cm4gYWRkUGFyYW1ldGVyKHBhcnNlVHlwZShjbGFzc05hbWUpLCBuYW1lKTsNCisgICAgfQ0KKw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgZGVmYXVsdCBOIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7DQorICAgICAgICBnZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlcik7DQorICAgICAgICByZXR1cm4gKE4pIHRoaXM7DQorICAgIH0NCisNCisgICAgZGVmYXVsdCBQYXJhbWV0ZXIgYWRkQW5kR2V0UGFyYW1ldGVyKFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHJldHVybiBhZGRBbmRHZXRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcih0eXBlLCBuYW1lKSk7DQorICAgIH0NCisNCisgICAgZGVmYXVsdCBQYXJhbWV0ZXIgYWRkQW5kR2V0UGFyYW1ldGVyKENsYXNzPD8+IHBhcmFtQ2xhc3MsIFN0cmluZyBuYW1lKSB7DQorICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChwYXJhbUNsYXNzKTsNCisgICAgICAgIHJldHVybiBhZGRBbmRHZXRQYXJhbWV0ZXIocGFyc2VUeXBlKHBhcmFtQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSwgbmFtZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlbWVtYmVyIHRvIGltcG9ydCB0aGUgY2xhc3MgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgeW91cnNlbGYNCisgICAgICoNCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MsIGV4IDogb3JnLnRlc3QuRm9vIG9yIEZvbyBpZiB5b3UgYWRkZWQgbWFudWFsbHkgdGhlIGltcG9ydA0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyDQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBQYXJhbWV0ZXJ9IGNyZWF0ZWQNCisgICAgICovDQorICAgIGRlZmF1bHQgUGFyYW1ldGVyIGFkZEFuZEdldFBhcmFtZXRlcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGFkZEFuZEdldFBhcmFtZXRlcihwYXJzZVR5cGUoY2xhc3NOYW1lKSwgbmFtZSk7DQorICAgIH0NCisNCisgICAgZGVmYXVsdCBQYXJhbWV0ZXIgYWRkQW5kR2V0UGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsNCisgICAgICAgIGdldFBhcmFtZXRlcnMoKS5hZGQocGFyYW1ldGVyKTsNCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIFBhcmFtZXRlcn0gYnkgaXRzIG5hbWUNCisgICAgICoNCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhcmFtDQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQsIHRoZSBwYXJhbSBmb3VuZCBvdGhlcndpc2UNCisgICAgICovDQorICAgIGRlZmF1bHQgT3B0aW9uYWw8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkNCisgICAgICAgICAgICAgICAgLmZpbHRlcihwIC0+IHAuZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVHJ5IHRvIGZpbmQgYSB7QGxpbmsgUGFyYW1ldGVyfSBieSBpdHMgdHlwZQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW0NCisgICAgICogQHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCwgdGhlIHBhcmFtIGZvdW5kIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBPcHRpb25hbDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlckJ5VHlwZShTdHJpbmcgdHlwZSkgew0KKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKQ0KKyAgICAgICAgICAgICAgICAuZmlsdGVyKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHModHlwZSkpLmZpbmRGaXJzdCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUcnkgdG8gZmluZCBhIHtAbGluayBQYXJhbWV0ZXJ9IGJ5IGl0cyB0eXBlDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbSA8Yj50YWtlIGNhcmUgYWJvdXQgZ2VuZXJpY3MsIGl0IHdvbnQgd29yazwvYj4NCisgICAgICogQHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCwgdGhlIHBhcmFtIGZvdW5kIG90aGVyd2lzZQ0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBPcHRpb25hbDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlckJ5VHlwZShDbGFzczw/PiB0eXBlKSB7DQorICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpDQorICAgICAgICAgICAgICAgIC5maWx0ZXIocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpLmVxdWFscyh0eXBlLmdldFNpbXBsZU5hbWUoKSkpLmZpbmRGaXJzdCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDaGVjayBpZiB0aGUgcGFyYW1ldGVycyBoYXZlIGNlcnRhaW4gdHlwZXMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzIHRoZSB0eXBlcyBvZiBwYXJhbWV0ZXJzIGxpa2UgIk1hcCZsdDtJbnRlZ2VyLFN0cmluZyZndDsiLCJpbnQiIHRvIG1hdGNoPGJyPiB2b2lkDQorICAgICAqIGZvbyhNYXAmbHQ7SW50ZWdlcixTdHJpbmcmZ3Q7IG15TWFwLGludCBudW1iZXIpDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBtYXRjaA0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBib29sZWFuIGhhc1BhcmFtZXRlcnNPZlR5cGUoU3RyaW5nLi4uIHBhcmFtVHlwZXMpIHsNCisgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkNCisgICAgICAgICAgICAgICAgLm1hcChwIC0+IHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpDQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvU2V0KCkpDQorICAgICAgICAgICAgICAgIC5lcXVhbHMoU3RyZWFtLm9mKHBhcmFtVHlwZXMpLmNvbGxlY3QodG9TZXQoKSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDaGVjayBpZiB0aGUgcGFyYW1ldGVycyBoYXZlIGNlcnRhaW4gdHlwZXMuIE5vdGUgdGhhdCB0aGlzIGlzIGEgbWF0Y2ggaW4gU2ltcGxlTmFtZSwgc28gImphdmEuYXd0Lkxpc3QiIGFuZA0KKyAgICAgKiAiamF2YS51dGlsLkxpc3QiIGFyZSBpZGVudGljYWwgdG8gdGhpcyBhbGdvcml0aG0uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzIHRoZSB0eXBlcyBvZiBwYXJhbWV0ZXJzIGxpa2UgIk1hcCZsdDtJbnRlZ2VyLFN0cmluZyZndDsiLCJpbnQiIHRvIG1hdGNoPGJyPiB2b2lkDQorICAgICAqIGZvbyhNYXAmbHQ7SW50ZWdlcixTdHJpbmcmZ3Q7IG15TWFwLGludCBudW1iZXIpDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBtYXRjaA0KKyAgICAgKi8NCisgICAgZGVmYXVsdCBib29sZWFuIGhhc1BhcmFtZXRlcnNPZlR5cGUoQ2xhc3M8Pz4uLi4gcGFyYW1UeXBlcykgew0KKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKQ0KKyAgICAgICAgICAgICAgICAuY29sbGVjdCh0b1NldCgpKQ0KKyAgICAgICAgICAgICAgICAuZXF1YWxzKFN0cmVhbS5vZihwYXJhbVR5cGVzKS5tYXAoQ2xhc3M6OmdldFNpbXBsZU5hbWUpLmNvbGxlY3QodG9TZXQoKSkpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoUmFuZ2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoUmFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWUyZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhSYW5nZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIG5vZGUgdGhhdCBoYXMgYSBSYW5nZSwgd2hpY2ggaXMgZXZlcnkgTm9kZS4KKyAqIAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoUmFuZ2U8Tj4geworICAgIE9wdGlvbmFsPFJhbmdlPiBnZXRSYW5nZSgpOworCisgICAgTiBzZXRSYW5nZShSYW5nZSByYW5nZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmVnaW4gcG9zaXRpb24gb2YgdGhpcyBub2RlIGluIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IE9wdGlvbmFsPFBvc2l0aW9uPiBnZXRCZWdpbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFJhbmdlKCkubWFwKHIgLT4gci5iZWdpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGlzIG5vZGUgaW4gdGhlIHNvdXJjZSBmaWxlLgorICAgICAqLworICAgIGRlZmF1bHQgT3B0aW9uYWw8UG9zaXRpb24+IGdldEVuZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJhbmdlKCkubWFwKHIgLT4gci5lbmQpOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBjb250YWluc1dpdGhpbihOb2RlIG90aGVyKSB7CisgICAgICAgIGlmIChnZXRSYW5nZSgpLmlzUHJlc2VudCgpICYmIG90aGVyLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSYW5nZSgpLmdldCgpLmNvbnRhaW5zKG90aGVyLmdldFJhbmdlKCkuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaXNBZnRlcigpIG9uIHJhbmdlCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNQb3NpdGlvbmVkQWZ0ZXIoUG9zaXRpb24gcG9zaXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGdldFJhbmdlKCkubWFwKHIgLT4gci5pc0FmdGVyKHBvc2l0aW9uKSkub3JFbHNlKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgaXNCZWZvcmUoKSBvbiByYW5nZQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgZGVmYXVsdCBib29sZWFuIGlzUG9zaXRpb25lZEJlZm9yZShQb3NpdGlvbiBwb3NpdGlvbikgeworICAgICAgICByZXR1cm4gZ2V0UmFuZ2UoKS5tYXAociAtPiByLmlzQmVmb3JlKHBvc2l0aW9uKSkub3JFbHNlKGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFNjb3BlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlYTNhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoU2NvcGUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNyBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbm9kZSB3aGljaCBoYXMgYSByZXF1aXJlZCBzY29wZSBleHByZXNzaW9uIGVnLiBmaWVsZCBhY2Nlc3MgKG9iamVjdC5tZXRob2QpLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoU2NvcGU8TiBleHRlbmRzIE5vZGU+IGV4dGVuZHMgTm9kZVdpdGhUcmF2ZXJzYWJsZVNjb3BlIHsKKworICAgIEV4cHJlc3Npb24gZ2V0U2NvcGUoKTsKKworICAgIE4gc2V0U2NvcGUoRXhwcmVzc2lvbiBzY29wZSk7CisKKyAgICBkZWZhdWx0IE9wdGlvbmFsPEV4cHJlc3Npb24+IHRyYXZlcnNlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihnZXRTY29wZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFNpbXBsZU5hbWUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoU2ltcGxlTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDM5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFNpbXBsZU5hbWUuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vbkVtcHR5OworCisvKioKKyAqIEEgbm9kZSB3aXRoIGEgbmFtZS4KKyAqIDxwPgorICogVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGludGVyZmFjZSBpcyB0byBwZXJtaXQgdXNlcnMgdG8gbWFuaXB1bGF0ZSBob21vZ2VuZW91c2x5IGFsbCBub2RlcyB3aXRoIGEgZ2V0TmFtZSBtZXRob2QuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhTaW1wbGVOYW1lPE4gZXh0ZW5kcyBOb2RlPiB7CisgICAgU2ltcGxlTmFtZSBnZXROYW1lKCk7CisKKyAgICBOIHNldE5hbWUoU2ltcGxlTmFtZSBuYW1lKTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFzc2VydE5vbkVtcHR5KG5hbWUpOworICAgICAgICByZXR1cm4gc2V0TmFtZShuZXcgU2ltcGxlTmFtZShuYW1lKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBTdHJpbmcgZ2V0TmFtZUFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKKyAgICB9CisKKyAgICBkZWZhdWx0IE5hbWVFeHByIGdldE5hbWVBc0V4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgTmFtZUV4cHIoZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFN0YXRlbWVudHMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoU3RhdGVtZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmM5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFN0YXRlbWVudHMuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsNCisNCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7DQorDQorLyoqDQorICogQSBub2RlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIHN0YXRlbWVudHMuDQorICovDQorcHVibGljIGludGVyZmFjZSBOb2RlV2l0aFN0YXRlbWVudHM8TiBleHRlbmRzIE5vZGU+IHsNCisgICAgTm9kZUxpc3Q8U3RhdGVtZW50PiBnZXRTdGF0ZW1lbnRzKCk7DQorDQorICAgIGRlZmF1bHQgU3RhdGVtZW50IGdldFN0YXRlbWVudChpbnQgaSkgew0KKyAgICAgICAgcmV0dXJuIGdldFN0YXRlbWVudHMoKS5nZXQoaSk7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIGRlZmF1bHQgTiBzZXRTdGF0ZW1lbnQoaW50IGksIFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsNCisgICAgICAgIGdldFN0YXRlbWVudHMoKS5zZXQoaSwgc3RhdGVtZW50KTsNCisgICAgICAgIHJldHVybiAoTikgdGhpczsNCisgICAgfQ0KKw0KKyAgICBOIHNldFN0YXRlbWVudHMoZmluYWwgTm9kZUxpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKTsNCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIGRlZmF1bHQgTiBhZGRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgew0KKyAgICAgICAgZ2V0U3RhdGVtZW50cygpLmFkZChzdGF0ZW1lbnQpOw0KKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gYWRkU3RhdGVtZW50KGludCBpbmRleCwgZmluYWwgU3RhdGVtZW50IHN0YXRlbWVudCkgew0KKyAgICAgICAgZ2V0U3RhdGVtZW50cygpLmFkZChpbmRleCwgc3RhdGVtZW50KTsNCisgICAgICAgIHJldHVybiAoTikgdGhpczsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IE4gYWRkU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcikgew0KKyAgICAgICAgcmV0dXJuIGFkZFN0YXRlbWVudChuZXcgRXhwcmVzc2lvblN0bXQoZXhwcikpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBJdCB3aWxsIHVzZSB7QGxpbmsgSmF2YVBhcnNlciNwYXJzZVN0YXRlbWVudChTdHJpbmcpfSBpbnNpZGUsIHNvIGl0IHNob3VsZCBlbmQgd2l0aCBhIHNlbWkgY29sdW1uDQorICAgICAqLw0KKyAgICBkZWZhdWx0IE4gYWRkU3RhdGVtZW50KFN0cmluZyBzdGF0ZW1lbnQpIHsNCisgICAgICAgIHJldHVybiBhZGRTdGF0ZW1lbnQocGFyc2VTdGF0ZW1lbnQoc3RhdGVtZW50KSk7DQorICAgIH0NCisNCisgICAgZGVmYXVsdCBOIGFkZFN0YXRlbWVudChpbnQgaW5kZXgsIGZpbmFsIEV4cHJlc3Npb24gZXhwcikgew0KKyAgICAgICAgU3RhdGVtZW50IHN0bXQgPSBuZXcgRXhwcmVzc2lvblN0bXQoZXhwcik7DQorICAgICAgICByZXR1cm4gYWRkU3RhdGVtZW50KGluZGV4LCBzdG10KTsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IDxBIGV4dGVuZHMgU3RhdGVtZW50PiBBIGFkZEFuZEdldFN0YXRlbWVudChBIHN0YXRlbWVudCkgew0KKyAgICAgICAgZ2V0U3RhdGVtZW50cygpLmFkZChzdGF0ZW1lbnQpOw0KKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IFN0YXRlbWVudCBhZGRBbmRHZXRTdGF0ZW1lbnQoaW50IGluZGV4LCBmaW5hbCBTdGF0ZW1lbnQgc3RhdGVtZW50KSB7DQorICAgICAgICBnZXRTdGF0ZW1lbnRzKCkuYWRkKGluZGV4LCBzdGF0ZW1lbnQpOw0KKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IEV4cHJlc3Npb25TdG10IGFkZEFuZEdldFN0YXRlbWVudChFeHByZXNzaW9uIGV4cHIpIHsNCisgICAgICAgIEV4cHJlc3Npb25TdG10IHN0YXRlbWVudCA9IG5ldyBFeHByZXNzaW9uU3RtdChleHByKTsNCisgICAgICAgIHJldHVybiBhZGRBbmRHZXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IEV4cHJlc3Npb25TdG10IGFkZEFuZEdldFN0YXRlbWVudChTdHJpbmcgc3RhdGVtZW50KSB7DQorICAgICAgICByZXR1cm4gYWRkQW5kR2V0U3RhdGVtZW50KG5ldyBOYW1lRXhwcihzdGF0ZW1lbnQpKTsNCisgICAgfQ0KKw0KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNFbXB0eSgpIHsNCisgICAgICAgIHJldHVybiBnZXRTdGF0ZW1lbnRzKCkuaXNFbXB0eSgpOw0KKyAgICB9DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKyAgICBkZWZhdWx0IE4gY29weVN0YXRlbWVudHMoTm9kZUxpc3Q8U3RhdGVtZW50PiBub2RlTGlzdCkgew0KKyAgICAgICAgZm9yIChTdGF0ZW1lbnQgbiA6IG5vZGVMaXN0KSB7DQorICAgICAgICAgICAgYWRkU3RhdGVtZW50KG4uY2xvbmUoKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gKE4pIHRoaXM7DQorICAgIH0NCisNCisgICAgZGVmYXVsdCBOIGNvcHlTdGF0ZW1lbnRzKE5vZGVXaXRoU3RhdGVtZW50czw/PiBvdGhlcikgew0KKyAgICAgICAgcmV0dXJuIGNvcHlTdGF0ZW1lbnRzKG90aGVyLmdldFN0YXRlbWVudHMoKSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFRocm93bkV4Y2VwdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWI5MDA3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGRlY2xhcmVzIHRoZSB0eXBlcyBvZiBleGNlcHRpb24gaXQgdGhyb3dzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVGhyb3duRXhjZXB0aW9uczxOIGV4dGVuZHMgTm9kZT4geworICAgIE4gc2V0VGhyb3duRXhjZXB0aW9ucyhOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zKTsKKworICAgIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGdldFRocm93bkV4Y2VwdGlvbnMoKTsKKworICAgIHZvaWQgdHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoQ2xhc3M8Pz4gY2xhenopOworCisgICAgZGVmYXVsdCBSZWZlcmVuY2VUeXBlIGdldFRocm93bkV4Y2VwdGlvbihpbnQgaSkgeworICAgICAgICByZXR1cm4gZ2V0VGhyb3duRXhjZXB0aW9ucygpLmdldChpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoaXMgdHlwZSB0byB0aGUgdGhyb3dzIGNsYXVzZQorICAgICAqCisgICAgICogQHBhcmFtIHRocm93VHlwZSB0aGUgZXhjZXB0aW9uIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gYWRkVGhyb3duRXhjZXB0aW9uKFJlZmVyZW5jZVR5cGUgdGhyb3dUeXBlKSB7CisgICAgICAgIGdldFRocm93bkV4Y2VwdGlvbnMoKS5hZGQodGhyb3dUeXBlKTsKKyAgICAgICAgcmV0dXJuIChOKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhpcyBjbGFzcyB0byB0aGUgdGhyb3dzIGNsYXVzZQorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBleGNlcHRpb24gY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBkZWZhdWx0IE4gYWRkVGhyb3duRXhjZXB0aW9uKENsYXNzPD8gZXh0ZW5kcyBUaHJvd2FibGU+IGNsYXp6KSB7CisgICAgICAgIHRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KTsKKyAgICAgICAgcmV0dXJuIGFkZFRocm93bkV4Y2VwdGlvbihwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKGNsYXp6LmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyBlbGVtZW50cyB0aHJvd3MgdGhpcyBleGNlcHRpb24gY2xhc3MuCisgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgc2ltcGx5IGEgdGV4dCBjb21wYXJlIG9mIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgY2xhc3MsCisgICAgICogbm8gYWN0dWFsIHR5cGUgcmVzb2x1dGlvbiB0YWtlcyBwbGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgb2YgdGhlIGV4Y2VwdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmb3VuZCBpbiB0aHJvd3MgY2xhdXNlLCBmYWxzZSBpZiBub3QKKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNUaHJvd24oQ2xhc3M8PyBleHRlbmRzIFRocm93YWJsZT4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGlzVGhyb3duKGNsYXp6LmdldFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIGVsZW1lbnRzIHRocm93cyB0aGlzIGV4Y2VwdGlvbiBjbGFzcworICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHNpbXBseSBhIHRleHQgY29tcGFyZSwKKyAgICAgKiBubyBhY3R1YWwgdHlwZSByZXNvbHV0aW9uIHRha2VzIHBsYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHRocm93YWJsZU5hbWUgdGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQgaW4gdGhyb3dzIGNsYXVzZSwgZmFsc2UgaWYgbm90CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzVGhyb3duKFN0cmluZyB0aHJvd2FibGVOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRUaHJvd25FeGNlcHRpb25zKCkuc3RyZWFtKCkuYW55TWF0Y2godCAtPiB0LnRvU3RyaW5nKCkuZXF1YWxzKHRocm93YWJsZU5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFRva2VuUmFuZ2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVG9rZW5SYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDNmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFRva2VuUmFuZ2UuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBub2RlIHRoYXQgaGFzIGEgUmFuZ2UsIHdoaWNoIGlzIGV2ZXJ5IE5vZGUuCisgKiAKKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aFRva2VuUmFuZ2U8Tj4geworICAgIE9wdGlvbmFsPFRva2VuUmFuZ2U+IGdldFRva2VuUmFuZ2UoKTsKKworICAgIE4gc2V0VG9rZW5SYW5nZShUb2tlblJhbmdlIHJhbmdlKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHJhdmVyc2FibGVTY29wZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUcmF2ZXJzYWJsZVNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiOWIzYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHJhdmVyc2FibGVTY29wZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE3IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG5vZGUgd2hpY2ggaGFzIGEgc2NvcGUgZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB0cmF2ZXJzZWQvd2Fsa2VkLgorICogVGhpcyB1bmlmaWVzIHNjb3BlIGFjY2VzcyBmb3IgTm9kZVdpdGhTY29wZSBhbmQgTm9kZVdpdGhPcHRpb25hbFNjb3BlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVHJhdmVyc2FibGVTY29wZSB7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzY29wZSBvZiB0aGlzIG5vZGUsIHJlZ2FyZGxlc3Mgb2Ygb3B0aW9uYWxpdHkuCisgICAgICogQW4gb3B0aW9uYWwgc2NvcGUgaXMgcmV0dXJuZWQgZGlyZWN0bHkuCisgICAgICogQSByZXF1aXJlZCBzY29wZSBpcyByZXR1cm5lZCBpbiBhbiAiT3B0aW9uYWwiLCBidXQgd2lsbCBuZXZlciBiZSBlbXB0eS4KKyAgICAgKi8KKyAgICBPcHRpb25hbDxFeHByZXNzaW9uPiB0cmF2ZXJzZVNjb3BlKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTY2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGUuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7DQorDQoraW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZVR5cGU7DQoraW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm9uRW1wdHk7DQorDQorLyoqDQorICogQSBub2RlIHdpdGggYSB0eXBlLg0KKyAqIDxwPg0KKyAqIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBpbnRlcmZhY2UgaXMgdG8gcGVybWl0IHVzZXJzIHRvIG1hbmlwdWxhdGUgaG9tb2dlbmVvdXNseSBhbGwgbm9kZXMgd2l0aCBnZXRUeXBlL3NldFR5cGUNCisgKiBtZXRob2RzDQorICoNCisgKiBAc2luY2UgMi4zLjENCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVHlwZTxOIGV4dGVuZHMgTm9kZSwgVCBleHRlbmRzIFR5cGU+IHsNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIHR5cGUNCisgICAgICoNCisgICAgICogQHJldHVybiB0aGUgdHlwZQ0KKyAgICAgKi8NCisgICAgVCBnZXRUeXBlKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSB0eXBlDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlDQorICAgICAqIEByZXR1cm4gdGhpcw0KKyAgICAgKi8NCisgICAgTiBzZXRUeXBlKFQgdHlwZSk7DQorDQorICAgIHZvaWQgdHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoQ2xhc3M8Pz4gY2xhenopOw0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGlzIHR5cGUgdG8gdGhpcyBjbGFzcyBhbmQgdHJ5IHRvIGltcG9ydCBpdCB0byB0aGUge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gaWYgbmVlZGVkDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0eXBlQ2xhc3MgdGhlIHR5cGUNCisgICAgICogQHJldHVybiB0aGlzDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgZGVmYXVsdCBOIHNldFR5cGUoQ2xhc3M8Pz4gdHlwZUNsYXNzKSB7DQorICAgICAgICB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdCh0eXBlQ2xhc3MpOw0KKyAgICAgICAgcmV0dXJuIHNldFR5cGUoKFQpIHBhcnNlVHlwZSh0eXBlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7DQorICAgIH0NCisNCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgIGRlZmF1bHQgTiBzZXRUeXBlKGZpbmFsIFN0cmluZyB0eXBlU3RyaW5nKSB7DQorICAgICAgICBhc3NlcnROb25FbXB0eSh0eXBlU3RyaW5nKTsNCisgICAgICAgIHJldHVybiBzZXRUeXBlKChUKSBwYXJzZVR5cGUodHlwZVN0cmluZykpOw0KKyAgICB9DQorDQorICAgIGRlZmF1bHQgU3RyaW5nIGdldFR5cGVBc1N0cmluZygpIHsNCisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuYXNTdHJpbmcoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGVBcmd1bWVudHMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZUFyZ3VtZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzJiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGVBcmd1bWVudHMuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRGVyaXZlZFByb3BlcnR5OworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Qubm9kZUxpc3Q7CisKKy8qKgorICogQSBub2RlIHRoYXQgY2FuIGhhdmUgdHlwZSBhcmd1bWVudHMuCisgKiA8cD4KKyAqIDxwcmU+CisgKiAgICAgbmV3IFgoKTsgICAgICAgIC0tPiB0eXBlQXJndW1lbnRzID09IE9wdGlvbmFsIGlzIGVtcHR5CisgKiAgICAgbmV3IFgmbHQ7PigpOyAgICAgIC0tPiB0eXBlQXJndW1lbnRzID0gW10sIGRpYW1vbmRPcGVyYXRvciA9IHRydWUKKyAqICAgICBuZXcgWCZsdDtDLEQ+KCk7ICAgLS0+IHR5cGVBcmd1bWVudHMgPSBbQyxEXSwgZGlhbW9uZE9wZXJhdG9yID0gZmFsc2UKKyAqIDwvcHJlPgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVHlwZUFyZ3VtZW50czxOIGV4dGVuZHMgTm9kZT4geworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSB0eXBlIGFyZ3VtZW50czogJmx0O1N0cmluZywgSW50ZWdlciZndDsuCisgICAgICovCisgICAgT3B0aW9uYWw8Tm9kZUxpc3Q8VHlwZT4+IGdldFR5cGVBcmd1bWVudHMoKTsKKworICAgIC8qKgorICAgICAqIEFsbG93cyB5b3UgdG8gc2V0IHRoZSBnZW5lcmljIGFyZ3VtZW50cworICAgICAqCisgICAgICogQHBhcmFtIHR5cGVBcmd1bWVudHMgVGhlIGxpc3Qgb2YgdHlwZXMgb2YgdGhlIGdlbmVyaWNzLCBjYW4gYmUgbnVsbAorICAgICAqLworICAgIE4gc2V0VHlwZUFyZ3VtZW50cyhOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgdHlwZSBhcmd1bWVudHMgbG9vayBsaWtlICZsdDs+LgorICAgICAqLworICAgIEBEZXJpdmVkUHJvcGVydHkKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNVc2luZ0RpYW1vbmRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSAmJiBnZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHR5cGUgYXJndW1lbnRzIHRvICZsdD4uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIHNldERpYW1vbmRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHNldFR5cGVBcmd1bWVudHMobmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdHlwZSBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgJmx0Oz4uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIHJlbW92ZVR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBzZXRUeXBlQXJndW1lbnRzKChOb2RlTGlzdDxUeXBlPikgbnVsbCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIHNldFR5cGVBcmd1bWVudHMoVHlwZS4uLiB0eXBlQXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBzZXRUeXBlQXJndW1lbnRzKG5vZGVMaXN0KHR5cGVBcmd1bWVudHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxN2E3NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZVBhcmFtZXRlcnMuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBoYXZlIHR5cGUgcGFyYW1ldGVycy4KKyAqIDxwcmU+CisgKiAgICAgY2xhc3MgWCB7fSAgICAgICAgLS0+IHR5cGVQYXJhbWV0ZXJzID09IFtdCisgKiAgICAgY2xhc3MgWCZsdDs+IHt9ICAgICAgLS0+IGRvZXMgbm90IG9jY3VyLgorICogICAgIGNsYXNzIFgmbHQ7QyxEPiB7fSAgIC0tPiB0eXBlUGFyYW1ldGVycyA9IFtDLERdCisgKiA8L3ByZT4KKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzPE4gZXh0ZW5kcyBOb2RlPiB7CisgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKworICAgIGRlZmF1bHQgVHlwZVBhcmFtZXRlciBnZXRUeXBlUGFyYW1ldGVyKGludCBpKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlUGFyYW1ldGVycygpLmdldChpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gc2V0VHlwZVBhcmFtZXRlcihpbnQgaSwgVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgIGdldFR5cGVQYXJhbWV0ZXJzKCkuc2V0KGksIHR5cGVQYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gKE4pIHRoaXM7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIGFkZFR5cGVQYXJhbWV0ZXIoVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgIGdldFR5cGVQYXJhbWV0ZXJzKCkuYWRkKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gKE4pIHRoaXM7CisgICAgfQorCisgICAgTiBzZXRUeXBlUGFyYW1ldGVycyhOb2RlTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyk7CisKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNHZW5lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgPiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVmFyaWFibGVzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFZhcmlhYmxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYWYzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFZhcmlhYmxlcy5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkRlcml2ZWRQcm9wZXJ0eTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQSBub2RlIHdoaWNoIGhhcyBhIGxpc3Qgb2YgdmFyaWFibGVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVmFyaWFibGVzPE4gZXh0ZW5kcyBOb2RlPiB7CisgICAgTm9kZUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiBnZXRWYXJpYWJsZXMoKTsKKworICAgIE4gc2V0VmFyaWFibGVzKE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKTsKKworICAgIGRlZmF1bHQgVmFyaWFibGVEZWNsYXJhdG9yIGdldFZhcmlhYmxlKGludCBpKSB7CisgICAgICAgIHJldHVybiBnZXRWYXJpYWJsZXMoKS5nZXQoaSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIHNldFZhcmlhYmxlKGludCBpLCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGVEZWNsYXJhdG9yKSB7CisgICAgICAgIGdldFZhcmlhYmxlcygpLnNldChpLCB2YXJpYWJsZURlY2xhcmF0b3IpOworICAgICAgICByZXR1cm4gKE4pIHRoaXM7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIGFkZFZhcmlhYmxlKFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IpIHsKKyAgICAgICAgZ2V0VmFyaWFibGVzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcik7CisgICAgICAgIHJldHVybiAoTikgdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIHZhcmlhYmxlcy4KKyAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIHdoZW4geW91IGFyZSBjZXJ0YWluIHRoYXQgYWxsIHZhcmlhYmxlcyBzaGFyZSBvbmUgdHlwZS4KKyAgICAgKiBXaGF0IG1ha2VzIHRoaXMgZGlmZmljdWx0IGlzIGFycmF5cywgYW5kIGJlaW5nIGFibGUgdG8gc2V0IHRoZSB0eXBlLgorICAgICAqIDxici8+Rm9yIDxjb2RlPmludCBhOzwvY29kZT4gdGhpcyBpcyBpbnQuCisgICAgICogPGJyLz5Gb3IgPGNvZGU+aW50IGEsYixjLGQ7PC9jb2RlPiB0aGlzIGlzIGFsc28gaW50LgorICAgICAqIDxici8+Rm9yIDxjb2RlPmludCBhLGJbXSxjOzwvY29kZT4gdGhpcyBpcyBhbiBhc3NlcnRpb24gZXJyb3Igc2luY2UgYiBpcyBhbiBpbnRbXSwgbm90IGFuIGludC4KKyAgICAgKiA8YnIvPkZvciA8Y29kZT5pbnQgYSxiOzwvY29kZT4sIHRoZW4gZG9pbmcgc2V0VHlwZShTdHJpbmcpIG9uIGIsIHRoaXMgaXMgYW4gYXNzZXJ0aW9uIGVycm9yLiBJdCBpcyBhbHNvIGEgc2l0dWF0aW9uIHRoYXQgeW91IGRvbid0IHJlYWxseSB3YW50LgorICAgICAqLworICAgIGRlZmF1bHQgVHlwZSBnZXRDb21tb25UeXBlKCkgeworICAgICAgICBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IGdldFZhcmlhYmxlcygpOworICAgICAgICBpZiAodmFyaWFibGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUaGVyZSBpcyBubyBjb21tb24gdHlwZSBzaW5jZSB0aGVyZSBhcmUgbm8gdmFyaWFibGVzLiIpOworICAgICAgICB9CisgICAgICAgIFR5cGUgdHlwZSA9IHZhcmlhYmxlcy5nZXQoMCkuZ2V0VHlwZSgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHZhcmlhYmxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCF2YXJpYWJsZXMuZ2V0KGkpLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlRoZSB2YXJpYWJsZXMgZG8gbm90IGhhdmUgYSBjb21tb24gdHlwZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHR5cGUuCisgICAgICogPGJyLz5Gb3IgPGNvZGU+aW50IGE7PC9jb2RlPiB0aGlzIGlzIGludC4KKyAgICAgKiA8YnIvPkZvciA8Y29kZT5pbnQgYSxiLGMsZDs8L2NvZGU+IHRoaXMgaXMgYWxzbyBpbnQuCisgICAgICogPGJyLz5Gb3IgPGNvZGU+aW50IGEsYltdLGM7PC9jb2RlPiB0aGlzIGlzIGFsc28gaW50LiBOb3RlOiBubyBtZW50aW9uIG9mIGIgYmVpbmcgYW4gYXJyYXkuCisgICAgICogPGJyLz5Gb3IgPGNvZGU+aW50IGEsYjs8L2NvZGU+LCB0aGVuIGRvaW5nIHNldFR5cGUoU3RyaW5nKSBvbiBiLCB0aGVuIGNhbGxpbmcgZ2V0RWxlbWVudFR5cGUoKS4gVGhpcyBpcyBhbiBhc3NlcnRpb24gZXJyb3IuIEl0IGlzIGFsc28gYSBzaXR1YXRpb24gdGhhdCB5b3UgZG9uJ3QgcmVhbGx5IHdhbnQuCisgICAgICovCisgICAgZGVmYXVsdCBUeXBlIGdldEVsZW1lbnRUeXBlKCkgeworICAgICAgICBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IGdldFZhcmlhYmxlcygpOworICAgICAgICBpZiAodmFyaWFibGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUaGVyZSBpcyBubyBlbGVtZW50IHR5cGUgc2luY2UgdGhlcmUgYXJlIG5vIHZhcmlhYmxlcy4iKTsKKyAgICAgICAgfQorICAgICAgICBUeXBlIHR5cGUgPSB2YXJpYWJsZXMuZ2V0KDApLmdldFR5cGUoKS5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHZhcmlhYmxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCF2YXJpYWJsZXMuZ2V0KGkpLmdldFR5cGUoKS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVGhlIHZhcmlhYmxlcyBkbyBub3QgaGF2ZSBhIGNvbW1vbiB0eXBlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgdGhhdCBtYXhpbXVtIHNoYXJlZCB0eXBlIGJldHdlZW4gYWxsIHZhcmlhYmxlcy4KKyAgICAgKiBUaGUgbWluaW11bSBjb21tb24gdHlwZSBkb2VzIG5ldmVyIGluY2x1ZGUgYW5ub3RhdGlvbnMgb24gdGhlIGFycmF5IGxldmVsLgorICAgICAqIDxwPgorICAgICAqIDxici8+Rm9yIDxjb2RlPmludCBhOzwvY29kZT4gdGhpcyBpcyBpbnQuCisgICAgICogPGJyLz5Gb3IgPGNvZGU+aW50IGEsYixjLGQ7PC9jb2RlPiB0aGlzIGlzIGFsc28gaW50LgorICAgICAqIDxici8+Rm9yIDxjb2RlPmludCBhLGJbXSxjOzwvY29kZT4gdGhpcyBpcyBhbHNvIGludC4KKyAgICAgKiA8YnIvPkZvciA8Y29kZT5pbnRbXSBhW11bXSxiW10sY1tdW107PC9jb2RlPiB0aGlzIGlzIGludFtdW10uCisgICAgICovCisgICAgQERlcml2ZWRQcm9wZXJ0eQorICAgIGRlZmF1bHQgT3B0aW9uYWw8VHlwZT4gZ2V0TWF4aW11bUNvbW1vblR5cGUoKSB7CisgICAgICAgIHJldHVybiBjYWxjdWxhdGVNYXhpbXVtQ29tbW9uVHlwZShnZXRWYXJpYWJsZXMoKS5zdHJlYW0oKS5tYXAodiAtPiB2LmdldFR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgc3RhdGljIE9wdGlvbmFsPFR5cGU+IGNhbGN1bGF0ZU1heGltdW1Db21tb25UeXBlKExpc3Q8VHlwZT4gdHlwZXMpIHsKKyAgICAgICAgLy8gd2UgdXNlIGEgbG9jYWwgY2xhc3MgYmVjYXVzZSB3ZSBjYW5ub3QgdXNlIGFuIGhlbHBlciBzdGF0aWMgbWV0aG9kIGluIGFuIGludGVyZmFjZQorICAgICAgICBjbGFzcyBIZWxwZXIgeworICAgICAgICAgICAgLy8gQ29uY2VwdHVhbGx5OiBnaXZlbiBhIHR5cGUgd2Ugc3RhcnQgZnJvbSB0aGUgRWxlbWVudCBUeXBlIGFuZCBnZXQgYXMgbWFueSBhcnJheSBsZXZlbHMgYXMgaW5kaWNhdGVkCisgICAgICAgICAgICAvLyBGcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBwb2ludCBvZiB2aWV3IHdlIHN0YXJ0IGZyb20gdGhlIGFjdHVhbCB0eXBlIGFuZCB3ZSByZW1vdmUgaG93IG1hbnkgYXJyYXkKKyAgICAgICAgICAgIC8vIGxldmVscyBhcyBuZWVkZWQgdG8gZ2V0IHRoZSB0YXJnZXQgbGV2ZWwgb2YgYXJyYXlzCisgICAgICAgICAgICAvLyBJdCByZXR1cm5zIG51bGwgaWYgdGhlIHR5cGUgaGFzIGxlc3MgYXJyYXkgbGV2ZWxzIHRoZW4gdGhlIGRlc2lyZWQgdGFyZ2V0CisgICAgICAgICAgICBwcml2YXRlIE9wdGlvbmFsPFR5cGU+IHRvQXJyYXlMZXZlbChUeXBlIHR5cGUsIGludCBsZXZlbCkgeworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IHR5cGUuZ2V0QXJyYXlMZXZlbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdHlwZS5nZXRBcnJheUxldmVsKCk7IGkgPiBsZXZlbDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0eXBlID0gKChBcnJheVR5cGUpIHR5cGUpLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSGVscGVyIGhlbHBlciA9IG5ldyBIZWxwZXIoKTsKKyAgICAgICAgaW50IGxldmVsID0gMDsKKyAgICAgICAgYm9vbGVhbiBrZWVwR29pbmcgPSB0cnVlOworICAgICAgICAvLyBJbiBwcmFjdGljZSB3ZSB3YW50IHRvIGNoZWNrIGZvciBob3cgbWFueSBsZXZlbHMgb2YgYXJyYXlzIGFsbCB0aGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgdHlwZSwKKyAgICAgICAgLy8gaW5jbHVkaW5nIGFsc28gdGhlIGFubm90YXRpb25zCisgICAgICAgIHdoaWxlIChrZWVwR29pbmcpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJyZW50TGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIC8vIE5vdywgZ2l2ZW4gdGhhdCBlcXVhbGl0eSBvbiBub2RlcyBjb25zaWRlciB0aGUgcG9zaXRpb24gdGhlIHNpbXBsZXN0IHdheSBpcyB0byBjb21wYXJlCisgICAgICAgICAgICAvLyB0aGUgcHJldHR5LXByaW50ZWQgc3RyaW5nIGdvdCBmb3IgYSBub2RlLiBXZSBqdXN0IGNoZWNrIGFsbCB0aGVtIGFyZSB0aGUgc2FtZSBhbmQgaWYgdGhleQorICAgICAgICAgICAgLy8gYXJlIHdlIGp1c3QganVzdCBpcyBub3QgbnVsbAorICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gdHlwZXMuc3RyZWFtKCkubWFwKHYgLT4geworICAgICAgICAgICAgICAgIE9wdGlvbmFsPFR5cGU+IHQgPSBoZWxwZXIudG9BcnJheUxldmVsKHYsIGN1cnJlbnRMZXZlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQubWFwKE5vZGU6OnRvU3RyaW5nKS5vckVsc2UobnVsbCk7CisgICAgICAgICAgICB9KS5kaXN0aW5jdCgpLnRvQXJyYXkoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDEgJiYgdmFsdWVzWzBdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBrZWVwR29pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGVscGVyLnRvQXJyYXlMZXZlbCh0eXBlcy5nZXQoMCksIC0tbGV2ZWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoQWJzdHJhY3RNb2RpZmllci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoQWJzdHJhY3RNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MWM0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5BQlNUUkFDVDsKKworLyoqCisgKiBBIG5vZGUgdGhhdCBjYW4gYmUgYWJzdHJhY3QuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyPE4gZXh0ZW5kcyBOb2RlPiBleHRlbmRzIE5vZGVXaXRoTW9kaWZpZXJzPE4+IHsKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKEFCU1RSQUNUKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gc2V0QWJzdHJhY3QoYm9vbGVhbiBzZXQpIHsKKyAgICAgICAgcmV0dXJuIHNldE1vZGlmaWVyKEFCU1RSQUNULCBzZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoQWNjZXNzTW9kaWZpZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2OTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycy5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKKy8qKgorICogQSBub2RlIHRoYXQgY2FuIGJlIHB1YmxpYywgcHJvdGVjdGVkLCBhbmQvb3IgcHJpdmF0ZS4KKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aEFjY2Vzc01vZGlmaWVyczxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBOb2RlV2l0aFB1YmxpY01vZGlmaWVyPE4+LCBOb2RlV2l0aFByaXZhdGVNb2RpZmllcjxOPiwgTm9kZVdpdGhQcm90ZWN0ZWRNb2RpZmllcjxOPiB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhGaW5hbE1vZGlmaWVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhGaW5hbE1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhYWU0MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aEZpbmFsTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLkZJTkFMOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBiZSBmaW5hbC4KKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aEZpbmFsTW9kaWZpZXI8TiBleHRlbmRzIE5vZGU+IGV4dGVuZHMgTm9kZVdpdGhNb2RpZmllcnM8Tj4geworICAgIGRlZmF1bHQgYm9vbGVhbiBpc0ZpbmFsKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoRklOQUwpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBzZXRGaW5hbChib29sZWFuIHNldCkgeworICAgICAgICByZXR1cm4gc2V0TW9kaWZpZXIoRklOQUwsIHNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoUHJpdmF0ZU1vZGlmaWVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhQcml2YXRlTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWEwMjJjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoUHJpdmF0ZU1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4qOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBiZSBwcml2YXRlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoUHJpdmF0ZU1vZGlmaWVyPE4gZXh0ZW5kcyBOb2RlPiBleHRlbmRzIE5vZGVXaXRoTW9kaWZpZXJzPE4+IHsKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNQcml2YXRlKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoUFJJVkFURSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBOIHNldFByaXZhdGUoYm9vbGVhbiBzZXQpIHsKKyAgICAgICAgcmV0dXJuIHNldE1vZGlmaWVyKFBSSVZBVEUsIHNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoUHJvdGVjdGVkTW9kaWZpZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aFByb3RlY3RlZE1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMDBiNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aFByb3RlY3RlZE1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4qOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBiZSBwcm90ZWN0ZWQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhQcm90ZWN0ZWRNb2RpZmllcjxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBOb2RlV2l0aE1vZGlmaWVyczxOPiB7CisgICAgZGVmYXVsdCBib29sZWFuIGlzUHJvdGVjdGVkKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoUFJPVEVDVEVEKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gc2V0UHJvdGVjdGVkKGJvb2xlYW4gc2V0KSB7CisgICAgICAgIHJldHVybiBzZXRNb2RpZmllcihQUk9URUNURUQsIHNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoUHVibGljTW9kaWZpZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aFB1YmxpY01vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiNDA2NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aFB1YmxpY01vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4qOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBiZSBwdWJsaWMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhQdWJsaWNNb2RpZmllcjxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBOb2RlV2l0aE1vZGlmaWVyczxOPiB7CisgICAgZGVmYXVsdCBib29sZWFuIGlzUHVibGljKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoUFVCTElDKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gc2V0UHVibGljKGJvb2xlYW4gc2V0KSB7CisgICAgICAgIHJldHVybiBzZXRNb2RpZmllcihQVUJMSUMsIHNldCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhTdGF0aWNNb2RpZmllci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoU3RhdGljTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM2M2VhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvbW9kaWZpZXJzL05vZGVXaXRoU3RhdGljTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLlNUQVRJQzsKKworLyoqCisgKiBBIG5vZGUgdGhhdCBjYW4gYmUgc3RhdGljLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoU3RhdGljTW9kaWZpZXI8TiBleHRlbmRzIE5vZGU+IGV4dGVuZHMgTm9kZVdpdGhNb2RpZmllcnM8Tj4geworCisgICAgZGVmYXVsdCBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoU1RBVElDKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IE4gc2V0U3RhdGljKGJvb2xlYW4gc2V0KSB7CisgICAgICAgIHJldHVybiBzZXRNb2RpZmllcihTVEFUSUMsIHNldCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhTdHJpY3RmcE1vZGlmaWVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9tb2RpZmllcnMvTm9kZVdpdGhTdHJpY3RmcE1vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4ZmI0MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL21vZGlmaWVycy9Ob2RlV2l0aFN0cmljdGZwTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLlNUUklDVEZQOworCisvKioKKyAqIEEgbm9kZSB0aGF0IGNhbiBiZSBzdHJpY3RmcC4KKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aFN0cmljdGZwTW9kaWZpZXI8TiBleHRlbmRzIE5vZGU+IGV4dGVuZHMgTm9kZVdpdGhNb2RpZmllcnM8Tj4geworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1N0cmljdGZwKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoU1RSSUNURlApOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGRlZmF1bHQgTiBzZXRTdHJpY3RmcChib29sZWFuIHNldCkgeworICAgICAgICByZXR1cm4gc2V0TW9kaWZpZXIoU1RSSUNURlAsIHNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Bc3RPYnNlcnZlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Bc3RPYnNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDFmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L29ic2VydmVyL0FzdE9ic2VydmVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworCisvKioKKyAqIEFuIE9ic2VydmVyIGZvciBhbiBBU1QgZWxlbWVudCAoZWl0aGVyIGEgTm9kZSBvciBhIE5vZGVMaXN0KS4KKyAqLworcHVibGljIGludGVyZmFjZSBBc3RPYnNlcnZlciB7CisKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIGNoYW5nZSBvY2N1cnJpbmcgb24gYSBMaXN0CisgICAgICovCisgICAgZW51bSBMaXN0Q2hhbmdlVHlwZSB7CisgICAgICAgIEFERElUSU9OLAorICAgICAgICBSRU1PVkFMCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgaXMgY2hhbmdlZAorICAgICAqCisgICAgICogQHBhcmFtIG9ic2VydmVkTm9kZSBvd25lciBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgY2hhbmdlZAorICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYmVmb3JlIHRoZSBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFmdGVyIHRoZSBjaGFuZ2UKKyAgICAgKi8KKyAgICB2b2lkIHByb3BlcnR5Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJlbnQgb2YgYSBub2RlIGlzIGNoYW5nZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYnNlcnZlZE5vZGUgbm9kZSBvZiB3aGljaCB0aGUgcGFyZW50IGlzIGNoYW5nZWQKKyAgICAgKiBAcGFyYW0gcHJldmlvdXNQYXJlbnQgcHJldmlvdXMgcGFyZW50CisgICAgICogQHBhcmFtIG5ld1BhcmVudCBuZXcgcGFyZW50CisgICAgICovCisgICAgdm9pZCBwYXJlbnRDaGFuZ2UoTm9kZSBvYnNlcnZlZE5vZGUsIE5vZGUgcHJldmlvdXNQYXJlbnQsIE5vZGUgbmV3UGFyZW50KTsKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBpcyBjaGFuZ2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZWROb2RlIGxpc3QgY2hhbmdlZAorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgY2hhbmdlCisgICAgICogQHBhcmFtIGluZGV4IHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBjaGFuZ2VkIG9jY3VycmVkCisgICAgICogQHBhcmFtIG5vZGVBZGRlZE9yUmVtb3ZlZCBlbGVtZW50IGFkZGVkIG9yIHJlbW92ZWQKKyAgICAgKi8KKyAgICB2b2lkIGxpc3RDaGFuZ2UoTm9kZUxpc3Qgb2JzZXJ2ZWROb2RlLCBMaXN0Q2hhbmdlVHlwZSB0eXBlLCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKTsKKworICAgIHZvaWQgbGlzdFJlcGxhY2VtZW50KE5vZGVMaXN0IG9ic2VydmVkTm9kZSwgaW50IGluZGV4LCBOb2RlIG9sZE5vZGUsIE5vZGUgbmV3Tm9kZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L29ic2VydmVyL0FzdE9ic2VydmVyQWRhcHRlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Bc3RPYnNlcnZlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI5MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Bc3RPYnNlcnZlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3RPYnNlcnZlckFkYXB0ZXIgaW1wbGVtZW50cyBBc3RPYnNlcnZlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGFyZW50Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBOb2RlIHByZXZpb3VzUGFyZW50LCBOb2RlIG5ld1BhcmVudCkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbGlzdENoYW5nZShOb2RlTGlzdCBvYnNlcnZlZE5vZGUsIExpc3RDaGFuZ2VUeXBlIHR5cGUsIGludCBpbmRleCwgTm9kZSBub2RlQWRkZWRPclJlbW92ZWQpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGxpc3RSZXBsYWNlbWVudChOb2RlTGlzdCBvYnNlcnZlZE5vZGUsIGludCBpbmRleCwgTm9kZSBvbGROb2RlLCBOb2RlIG5ld05vZGUpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvb2JzZXJ2ZXIvT2JzZXJ2YWJsZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9PYnNlcnZhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwZjkyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvb2JzZXJ2ZXIvT2JzZXJ2YWJsZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXI7CisKKy8qKgorICogT2JzZXJ2YWJsZSBlbGVtZW50LgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ic2VydmFibGUgeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIuCisgICAgICovCisgICAgdm9pZCByZWdpc3RlcihBc3RPYnNlcnZlciBvYnNlcnZlcik7CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGFuIG9ic2VydmVyLiBJZiB0aGUgZ2l2ZW4gb2JzZXJ2ZXIgd2FzIG5vdCByZWdpc3RlcmVkIHRoZXJlIGFyZSBubyBlZmZlY3RzLgorICAgICAqLworICAgIHZvaWQgdW5yZWdpc3RlcihBc3RPYnNlcnZlciBvYnNlcnZlcik7CisKKyAgICAvKioKKyAgICAgKiBXYXMgdGhpcyBvYnNlcnZlciByZWdpc3RlcmVkPworICAgICAqIE5vdGUgdGhhdCBlcXVhbHMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIG9ic2VydmVyIHdhcyByZWdpc3RlcmVkLgorICAgICAqLworICAgIGJvb2xlYW4gaXNSZWdpc3RlcmVkKEFzdE9ic2VydmVyIG9ic2VydmVyKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvb2JzZXJ2ZXIvT2JzZXJ2YWJsZVByb3BlcnR5LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L29ic2VydmVyL09ic2VydmFibGVQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjgyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L29ic2VydmVyL09ic2VydmFibGVQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlsczsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworCisvKioKKyAqIFByb3BlcnRpZXMgY29uc2lkZXJlZCBieSB0aGUgQXN0T2JzZXJ2ZXIKKyAqLworQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorcHVibGljIGVudW0gT2JzZXJ2YWJsZVByb3BlcnR5IHsKKworICAgIEFOTk9UQVRJT05TKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBBTk9OWU1PVVNfQ0xBU1NfQk9EWShUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgQVJHVU1FTlRTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBBU1RFUklTSyhUeXBlLlNJTkdMRV9BVFRSSUJVVEUpLAorICAgIEJPRFkoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBDQVRDSF9DTEFVU0VTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBDSEVDSyhUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIENMQVNTX0JPRFkoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIENMQVNTX0RFQ0xBUkFUSU9OKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgQ0xBU1NfRVhQUihUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIENPTU1FTlQoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBDT01QQVJFKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgQ09NUE9ORU5UX1RZUEUoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBDT05ESVRJT04oVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBDT05URU5UKFR5cGUuU0lOR0xFX0FUVFJJQlVURSksCisgICAgREVGQVVMVF9WQUxVRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIERJTUVOU0lPTihUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIEVMRU1FTlRTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBFTEVNRU5UX1RZUEUoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBFTFNFX0VYUFIoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBFTFNFX1NUTVQoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBFTkNMT1NJTkdfUEFSQU1FVEVSUyhUeXBlLlNJTkdMRV9BVFRSSUJVVEUpLAorICAgIEVOVFJJRVMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIEVYUFJFU1NJT04oVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBFWFRFTkRFRF9UWVBFKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgRVhURU5ERURfVFlQRVMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIEZJTkFMTFlfQkxPQ0soVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBJREVOVElGSUVSKFR5cGUuU0lOR0xFX0FUVFJJQlVURSksCisgICAgSU1QTEVNRU5URURfVFlQRVMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIElNUE9SVFMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIElOREVYKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgSU5JVElBTElaQVRJT04oVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIElOSVRJQUxJWkVSKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgSU5ORVIoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBJTlRFUkZBQ0UoVHlwZS5TSU5HTEVfQVRUUklCVVRFKSwKKyAgICBJVEVSQUJMRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIExBQkVMKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgTEVGVChUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIExFVkVMUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgTUVNQkVSUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgTUVNQkVSX1ZBTFVFKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgTUVTU0FHRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIE1PRElGSUVSUyhUeXBlLk1VTFRJUExFX0FUVFJJQlVURSksCisgICAgTU9EVUxFKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgTU9EVUxFX05BTUVTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBNT0RVTEVfU1RNVFMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIE5BTUUoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBPUEVOKFR5cGUuU0lOR0xFX0FUVFJJQlVURSksCisgICAgT1BFUkFUT1IoVHlwZS5TSU5HTEVfQVRUUklCVVRFKSwKKyAgICBPUklHSU4oVHlwZS5TSU5HTEVfQVRUUklCVVRFKSwKKyAgICBQQUNLQUdFX0RFQ0xBUkFUSU9OKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgUEFJUlMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIFBBUkFNRVRFUihUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFBBUkFNRVRFUlMoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIFFVQUxJRklFUihUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFJFQ0VJVkVSX1BBUkFNRVRFUihUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFJFU09VUkNFUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgUklHSFQoVHlwZS5TSU5HTEVfUkVGRVJFTkNFKSwKKyAgICBTQ09QRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFNFTEVDVE9SKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgU1RBVEVNRU5UKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgU1RBVEVNRU5UUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgU1RBVElDKFR5cGUuU0lOR0xFX0FUVFJJQlVURSksCisgICAgU1VQRVJfVFlQRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFRBUkdFVChUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFRIRU5fRVhQUihUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFRIRU5fU1RNVChUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFRISVMoVHlwZS5TSU5HTEVfQVRUUklCVVRFKSwKKyAgICBUSFJPV05fRVhDRVBUSU9OUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgVFJZX0JMT0NLKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgVFlQRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFRZUEVTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBUWVBFX0FSR1VNRU5UUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgVFlQRV9CT1VORChUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgVFlQRV9QQVJBTUVURVJTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBVUERBVEUoVHlwZS5NVUxUSVBMRV9SRUZFUkVOQ0UpLAorICAgIFZBTFVFKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSksCisgICAgVkFMVUVTKFR5cGUuTVVMVElQTEVfUkVGRVJFTkNFKSwKKyAgICBWQVJJQUJMRShUeXBlLlNJTkdMRV9SRUZFUkVOQ0UpLAorICAgIFZBUklBQkxFUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgVkFSX0FSR1MoVHlwZS5TSU5HTEVfQVRUUklCVVRFKSwKKyAgICBWQVJfQVJHU19BTk5PVEFUSU9OUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgV0lUSF9UWVBFUyhUeXBlLk1VTFRJUExFX1JFRkVSRU5DRSksCisgICAgQ0FTQ0FESU5HX0lGX1NUTVQoVHlwZS5TSU5HTEVfQVRUUklCVVRFLCB0cnVlKSwKKyAgICBFTFNFX0JMT0NLKFR5cGUuU0lOR0xFX0FUVFJJQlVURSwgdHJ1ZSksCisgICAgRUxTRV9CUkFOQ0goVHlwZS5TSU5HTEVfQVRUUklCVVRFLCB0cnVlKSwKKyAgICBFWFBSRVNTSU9OX0JPRFkoVHlwZS5TSU5HTEVfUkVGRVJFTkNFLCB0cnVlKSwKKyAgICBNQVhJTVVNX0NPTU1PTl9UWVBFKFR5cGUuU0lOR0xFX1JFRkVSRU5DRSwgdHJ1ZSksCisgICAgUE9TVEZJWChUeXBlLlNJTkdMRV9BVFRSSUJVVEUsIHRydWUpLAorICAgIFBSRUZJWChUeXBlLlNJTkdMRV9BVFRSSUJVVEUsIHRydWUpLAorICAgIFRIRU5fQkxPQ0soVHlwZS5TSU5HTEVfQVRUUklCVVRFLCB0cnVlKSwKKyAgICBVU0lOR19ESUFNT05EX09QRVJBVE9SKFR5cGUuU0lOR0xFX0FUVFJJQlVURSwgdHJ1ZSksCisgICAgUkFOR0UsCisgICAgQ09NTUVOVEVEX05PREU7CisKKyAgICBlbnVtIFR5cGUgeworCisgICAgICAgIFNJTkdMRV9BVFRSSUJVVEUoZmFsc2UsIGZhbHNlKSwgU0lOR0xFX1JFRkVSRU5DRShmYWxzZSwgdHJ1ZSksIE1VTFRJUExFX0FUVFJJQlVURSh0cnVlLCBmYWxzZSksIE1VTFRJUExFX1JFRkVSRU5DRSh0cnVlLCB0cnVlKTsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGU7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5vZGU7CisKKyAgICAgICAgVHlwZShib29sZWFuIG11bHRpcGxlLCBib29sZWFuIG5vZGUpIHsKKyAgICAgICAgICAgIHRoaXMubXVsdGlwbGUgPSBtdWx0aXBsZTsKKyAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBkZXJpdmVkOworCisgICAgcHVibGljIHN0YXRpYyBPYnNlcnZhYmxlUHJvcGVydHkgZnJvbUNhbWVsQ2FzZU5hbWUoU3RyaW5nIGNhbWVsQ2FzZU5hbWUpIHsKKyAgICAgICAgT3B0aW9uYWw8T2JzZXJ2YWJsZVByb3BlcnR5PiBvYnNlcnZhYmxlUHJvcGVydHkgPSBBcnJheXMuc3RyZWFtKHZhbHVlcygpKS5maWx0ZXIodiAtPiB2LmNhbWVsQ2FzZU5hbWUoKS5lcXVhbHMoY2FtZWxDYXNlTmFtZSkpLmZpbmRGaXJzdCgpOworICAgICAgICBpZiAob2JzZXJ2YWJsZVByb3BlcnR5LmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVByb3BlcnR5LmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gcHJvcGVydHkgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gY2FtZWwgY2FzZSBuYW1lOiAiICsgY2FtZWxDYXNlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPYnNlcnZhYmxlUHJvcGVydHkoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZGVyaXZlZCA9IGZhbHNlOworICAgIH0KKworICAgIE9ic2VydmFibGVQcm9wZXJ0eShUeXBlIHR5cGUsIGJvb2xlYW4gZGVyaXZlZCkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmRlcml2ZWQgPSBkZXJpdmVkOworICAgIH0KKworICAgIE9ic2VydmFibGVQcm9wZXJ0eSgpIHsKKyAgICAgICAgdGhpcyhUeXBlLlNJTkdMRV9SRUZFUkVOQ0UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWQoKSB7CisgICAgICAgIHJldHVybiBkZXJpdmVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWJvdXROb2RlcygpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUubm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fib3V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gIWlzQWJvdXROb2RlcygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTXVsdGlwbGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlLm11bHRpcGxlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlKCkgeworICAgICAgICByZXR1cm4gIWlzTXVsdGlwbGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGNhbWVsQ2FzZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBVdGlscy5zY3JlYW1pbmdUb0NhbWVsQ2FzZShuYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIGdldFZhbHVlQXNTaW5nbGVSZWZlcmVuY2UoTm9kZSBub2RlKSB7CisgICAgICAgIE9iamVjdCByYXdWYWx1ZSA9IGdldFJhd1ZhbHVlKG5vZGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHJhd1ZhbHVlIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoTm9kZSkgcmF3VmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd1ZhbHVlIGluc3RhbmNlb2YgT3B0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICBPcHRpb25hbDxOb2RlPiBvcHQgPSAoT3B0aW9uYWw8Tm9kZT4pIHJhd1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChvcHQuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdC5nZXQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlByb3BlcnR5ICVzIHJldHVybmVkICVzICglcykiLCB0aGlzLm5hbWUoKSwgcmF3VmFsdWUudG9TdHJpbmcoKSwgcmF3VmFsdWUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc01ldGhvZChOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBub2RlLmdldENsYXNzKCkuZ2V0TWV0aG9kKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZUxpc3Q8PyBleHRlbmRzIE5vZGU+IGdldFZhbHVlQXNNdWx0aXBsZVJlZmVyZW5jZShOb2RlIG5vZGUpIHsKKyAgICAgICAgT2JqZWN0IHJhd1ZhbHVlID0gZ2V0UmF3VmFsdWUobm9kZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmF3VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJhd1ZhbHVlIGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5vZGVMaXN0KSByYXdWYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8Tm9kZUxpc3Q+IG9wdCA9IChPcHRpb25hbDxOb2RlTGlzdD4pIHJhd1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChvcHQuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdC5nZXQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCBsaXN0IHZhbHVlIGZvciAiICsgdGhpcy5uYW1lKCkgKyAiIGZyb20gIiArIG5vZGUgKyAiIChjbGFzczogIiArIG5vZGUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiKSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0VmFsdWVBc0NvbGxlY3Rpb24oTm9kZSBub2RlKSB7CisgICAgICAgIE9iamVjdCByYXdWYWx1ZSA9IGdldFJhd1ZhbHVlKG5vZGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uKSByYXdWYWx1ZTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IGxpc3QgdmFsdWUgZm9yICIgKyB0aGlzLm5hbWUoKSArICIgZnJvbSAiICsgbm9kZSArICIgKGNsYXNzOiAiICsgbm9kZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIpIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmdBdHRyaWJ1dGUoTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXRSYXdWYWx1ZShub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZUFzQm9vbGVhbkF0dHJpYnV0ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIChCb29sZWFuKSBnZXRSYXdWYWx1ZShub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJhd1ZhbHVlKE5vZGUgbm9kZSkgeworICAgICAgICBTdHJpbmcgZ2V0dGVyTmFtZSA9ICJnZXQiICsgVXRpbHMuY2FwaXRhbGl6ZShjYW1lbENhc2VOYW1lKCkpOworICAgICAgICBpZiAoIWhhc01ldGhvZChub2RlLCBnZXR0ZXJOYW1lKSkgeworICAgICAgICAgICAgZ2V0dGVyTmFtZSA9ICJpcyIgKyBVdGlscy5jYXBpdGFsaXplKGNhbWVsQ2FzZU5hbWUoKSk7CisgICAgICAgICAgICBpZiAoIWhhc01ldGhvZChub2RlLCBnZXR0ZXJOYW1lKSkgeworICAgICAgICAgICAgICAgIGdldHRlck5hbWUgPSAiaGFzIiArIFV0aWxzLmNhcGl0YWxpemUoY2FtZWxDYXNlTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoZ2V0dGVyTmFtZSkuaW52b2tlKG5vZGUpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCB2YWx1ZSBmb3IgIiArIHRoaXMubmFtZSgpICsgIiBmcm9tICIgKyBub2RlICsgIiAoIiArIG5vZGUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiKSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbnVsbCA9PSBnZXRSYXdWYWx1ZShub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc051bGxPck5vdFByZXNlbnQoTm9kZSBub2RlKSB7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRSYXdWYWx1ZShub2RlKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT3B0aW9uYWwpIHsKKyAgICAgICAgICAgIHJldHVybiAhKChPcHRpb25hbCkgcmVzdWx0KS5pc1ByZXNlbnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIFV0aWxzLnZhbHVlSXNOdWxsT3JFbXB0eShnZXRSYXdWYWx1ZShub2RlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Qcm9wYWdhdGluZ0FzdE9ic2VydmVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L29ic2VydmVyL1Byb3BhZ2F0aW5nQXN0T2JzZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTc5NDc0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Qcm9wYWdhdGluZ0FzdE9ic2VydmVyLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKKworLyoqCisgKiBUaGlzIEFzdE9ic2VydmVyIGF0dGFjaCBpdHNlbGYgdG8gYWxsIG5ldyBub2RlcyBhZGRlZCB0byB0aGUgbm9kZXMgYWxyZWFkeSBvYnNlcnZlZC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BhZ2F0aW5nQXN0T2JzZXJ2ZXIgaW1wbGVtZW50cyBBc3RPYnNlcnZlciB7CisKKyAgICAvKioKKyAgICAgKiBXcmFwIGEgZ2l2ZW4gb2JzZXJ2ZXIgdG8gbWFrZSBpdCBzZWxmLXByb3BhZ2F0aW5nLiBJZiB0aGUgZ2l2ZW4gb2JzZXJ2ZXIgaXMgYW4gaW5zdGFuY2Ugb2YgUHJvcGFnYXRpbmdBc3RPYnNlcnZlcgorICAgICAqIHRoZSBvYnNlcnZlciBpcyByZXR1cm5lZCB3aXRob3V0IGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9wYWdhdGluZ0FzdE9ic2VydmVyIHRyYW5zZm9ybUluUHJvcGFnYXRpbmdPYnNlcnZlcihmaW5hbCBBc3RPYnNlcnZlciBvYnNlcnZlcikgeworICAgICAgICBpZiAob2JzZXJ2ZXIgaW5zdGFuY2VvZiBQcm9wYWdhdGluZ0FzdE9ic2VydmVyKSB7CisgICAgICAgICAgICByZXR1cm4gKFByb3BhZ2F0aW5nQXN0T2JzZXJ2ZXIpIG9ic2VydmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUHJvcGFnYXRpbmdBc3RPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29uY3JldGVQcm9wZXJ0eUNoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgIG9ic2VydmVyLnByb3BlcnR5Q2hhbmdlKG9ic2VydmVkTm9kZSwgcHJvcGVydHksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29uY3JldGVMaXN0Q2hhbmdlKE5vZGVMaXN0IG9ic2VydmVkTm9kZSwgTGlzdENoYW5nZVR5cGUgdHlwZSwgaW50IGluZGV4LCBOb2RlIG5vZGVBZGRlZE9yUmVtb3ZlZCkgeworICAgICAgICAgICAgICAgIG9ic2VydmVyLmxpc3RDaGFuZ2Uob2JzZXJ2ZWROb2RlLCB0eXBlLCBpbmRleCwgbm9kZUFkZGVkT3JSZW1vdmVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJlbnRDaGFuZ2UoTm9kZSBvYnNlcnZlZE5vZGUsIE5vZGUgcHJldmlvdXNQYXJlbnQsIE5vZGUgbmV3UGFyZW50KSB7CisgICAgICAgICAgICAgICAgb2JzZXJ2ZXIucGFyZW50Q2hhbmdlKG9ic2VydmVkTm9kZSwgcHJldmlvdXNQYXJlbnQsIG5ld1BhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgcHJvcGVydHlDaGFuZ2UoTm9kZSBvYnNlcnZlZE5vZGUsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgY29uc2lkZXJSZW1vdmluZyhvbGRWYWx1ZSk7CisgICAgICAgIGNvbnNpZGVyQWRkaW5nKG5ld1ZhbHVlKTsKKyAgICAgICAgY29uY3JldGVQcm9wZXJ0eUNoYW5nZShvYnNlcnZlZE5vZGUsIHByb3BlcnR5LCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIGxpc3RDaGFuZ2UoTm9kZUxpc3Qgb2JzZXJ2ZWROb2RlLCBMaXN0Q2hhbmdlVHlwZSB0eXBlLCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKSB7CisgICAgICAgIGlmICh0eXBlID09IExpc3RDaGFuZ2VUeXBlLlJFTU9WQUwpIHsKKyAgICAgICAgICAgIGNvbnNpZGVyUmVtb3Zpbmcobm9kZUFkZGVkT3JSZW1vdmVkKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IExpc3RDaGFuZ2VUeXBlLkFERElUSU9OKSB7CisgICAgICAgICAgICBjb25zaWRlckFkZGluZyhub2RlQWRkZWRPclJlbW92ZWQpOworICAgICAgICB9CisgICAgICAgIGNvbmNyZXRlTGlzdENoYW5nZShvYnNlcnZlZE5vZGUsIHR5cGUsIGluZGV4LCBub2RlQWRkZWRPclJlbW92ZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGxpc3RSZXBsYWNlbWVudChOb2RlTGlzdCBvYnNlcnZlZE5vZGUsIGludCBpbmRleCwgTm9kZSBvbGROb2RlLCBOb2RlIG5ld05vZGUpIHsKKyAgICAgICAgaWYgKG9sZE5vZGUgPT0gbmV3Tm9kZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnNpZGVyUmVtb3Zpbmcob2xkTm9kZSk7CisgICAgICAgIGNvbnNpZGVyQWRkaW5nKG5ld05vZGUpOworICAgICAgICBjb25jcmV0ZUxpc3RSZXBsYWNlbWVudChvYnNlcnZlZE5vZGUsIGluZGV4LCBvbGROb2RlLCBuZXdOb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25jcmV0ZVByb3BlcnR5Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25jcmV0ZUxpc3RDaGFuZ2UoTm9kZUxpc3Qgb2JzZXJ2ZWROb2RlLCBMaXN0Q2hhbmdlVHlwZSB0eXBlLCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKSB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25jcmV0ZUxpc3RSZXBsYWNlbWVudChOb2RlTGlzdCBvYnNlcnZlZE5vZGUsIGludCBpbmRleCwgTm9kZSBvbGRWYWx1ZSwgTm9kZSBuZXdWYWx1ZSkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGFyZW50Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBOb2RlIHByZXZpb3VzUGFyZW50LCBOb2RlIG5ld1BhcmVudCkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbnNpZGVyUmVtb3ZpbmcoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7CisgICAgICAgICAgICBpZiAoKChPYnNlcnZhYmxlKSBlbGVtZW50KS5pc1JlZ2lzdGVyZWQodGhpcykpIHsKKyAgICAgICAgICAgICAgICAoKE9ic2VydmFibGUpIGVsZW1lbnQpLnVucmVnaXN0ZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uc2lkZXJBZGRpbmcoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICAoKE5vZGUpIGVsZW1lbnQpLnJlZ2lzdGVyRm9yU3VidHJlZSh0aGlzKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkgeworICAgICAgICAgICAgKChPYnNlcnZhYmxlKSBlbGVtZW50KS5yZWdpc3Rlcih0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Fzc2VydFN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10LmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQXNzZXJ0U3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBBIHVzYWdlIG9mIHRoZSBrZXl3b3JkICJhc3NlcnQiCisgKiA8YnIvPkluIDxjb2RlPmFzc2VydCBkZWFkIDogIldhc24ndCBleHBlY3RpbmcgdG8gYmUgZGVhZCBoZXJlIjs8L2NvZGU+IHRoZSBjaGVjayBpcyAiZGVhZCIgYW5kIHRoZSBtZXNzYWdlIGlzIHRoZSBzdHJpbmcuCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNoZWNrOworCisgICAgQE9wdGlvbmFsUHJvcGVydHkKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gbWVzc2FnZTsKKworICAgIHB1YmxpYyBBc3NlcnRTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBCb29sZWFuTGl0ZXJhbEV4cHIoKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEFzc2VydFN0bXQoZmluYWwgRXhwcmVzc2lvbiBjaGVjaykgeworICAgICAgICB0aGlzKG51bGwsIGNoZWNrLCBudWxsKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQXNzZXJ0U3RtdChmaW5hbCBFeHByZXNzaW9uIGNoZWNrLCBmaW5hbCBFeHByZXNzaW9uIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcyhudWxsLCBjaGVjaywgbWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBc3NlcnRTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBjaGVjaywgRXhwcmVzc2lvbiBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRDaGVjayhjaGVjayk7CisgICAgICAgIHNldE1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0Q2hlY2soKSB7CisgICAgICAgIHJldHVybiBjaGVjazsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cHJlc3Npb24+IGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKG1lc3NhZ2UpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzZXJ0U3RtdCBzZXRDaGVjayhmaW5hbCBFeHByZXNzaW9uIGNoZWNrKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2hlY2spOworICAgICAgICBpZiAoY2hlY2sgPT0gdGhpcy5jaGVjaykgeworICAgICAgICAgICAgcmV0dXJuIChBc3NlcnRTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5DSEVDSywgdGhpcy5jaGVjaywgY2hlY2spOworICAgICAgICBpZiAodGhpcy5jaGVjayAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5jaGVjay5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNoZWNrID0gY2hlY2s7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGNoZWNrKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVzc2FnZQorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgQXNzZXJ0U3RtdAorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzZXJ0U3RtdCBzZXRNZXNzYWdlKGZpbmFsIEV4cHJlc3Npb24gbWVzc2FnZSkgeworICAgICAgICBpZiAobWVzc2FnZSA9PSB0aGlzLm1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiAoQXNzZXJ0U3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTUVTU0FHRSwgdGhpcy5tZXNzYWdlLCBtZXNzYWdlKTsKKyAgICAgICAgaWYgKHRoaXMubWVzc2FnZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG1lc3NhZ2UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIEFzc2VydFN0bXQgcmVtb3ZlTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHNldE1lc3NhZ2UoKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzZXJ0U3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChBc3NlcnRTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBc3NlcnRTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuYXNzZXJ0U3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gY2hlY2spIHsKKyAgICAgICAgICAgIHNldENoZWNrKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHNldE1lc3NhZ2UoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NlcnRTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEFzc2VydFN0bXQgYXNBc3NlcnRTdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZBc3NlcnRTdG10KENvbnN1bWVyPEFzc2VydFN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXNzZXJ0U3RtdD4gdG9Bc3NlcnRTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Jsb2NrU3RtdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Jsb2NrU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjViOTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQmxvY2tTdG10LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CbG9ja1N0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogU3RhdGVtZW50cyBpbiBiZXR3ZWVuIHsgYW5kIH0uCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbG9ja1N0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aFN0YXRlbWVudHM8QmxvY2tTdG10PiB7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50czsKKworICAgIHB1YmxpYyBCbG9ja1N0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEJsb2NrU3RtdChmaW5hbCBOb2RlTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBzdGF0ZW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8U3RhdGVtZW50PiBnZXRTdGF0ZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gc3RhdGVtZW50czsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrU3RtdCBzZXRTdGF0ZW1lbnRzKGZpbmFsIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cykgeworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXRlbWVudHMpOworICAgICAgICBpZiAoc3RhdGVtZW50cyA9PSB0aGlzLnN0YXRlbWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoQmxvY2tTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5TVEFURU1FTlRTLCB0aGlzLnN0YXRlbWVudHMsIHN0YXRlbWVudHMpOworICAgICAgICBpZiAodGhpcy5zdGF0ZW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnN0YXRlbWVudHMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2Yoc3RhdGVtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnRzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChCbG9ja1N0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIEJsb2NrU3RtdE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmJsb2NrU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHN0YXRlbWVudHMuc2V0KGksIChTdGF0ZW1lbnQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tTdG10IGFzQmxvY2tTdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZCbG9ja1N0bXQoQ29uc3VtZXI8QmxvY2tTdG10PiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEJsb2NrU3RtdD4gdG9CbG9ja1N0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQnJlYWtTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQnJlYWtTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwYjQxMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9CcmVha1N0bXQuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5CcmVha1N0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogQSB1c2FnZSBvZiB0aGUgYnJlYWsga2V5d29yZC4KKyAqIDxici8+SW4gPGNvZGU+YnJlYWsgYWJjOzwvY29kZT4gdGhlIGxhYmVsIGlzIGFiYy4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJyZWFrU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgU2ltcGxlTmFtZSBsYWJlbDsKKworICAgIHB1YmxpYyBCcmVha1N0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIEJyZWFrU3RtdChmaW5hbCBTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgU2ltcGxlTmFtZShsYWJlbCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBCcmVha1N0bXQoZmluYWwgU2ltcGxlTmFtZSBsYWJlbCkgeworICAgICAgICB0aGlzKG51bGwsIGxhYmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJyZWFrU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFNpbXBsZU5hbWUgbGFiZWwpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldExhYmVsKGxhYmVsKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U2ltcGxlTmFtZT4gZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGxhYmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsYWJlbAorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBCcmVha1N0bXQKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEJyZWFrU3RtdCBzZXRMYWJlbChmaW5hbCBTaW1wbGVOYW1lIGxhYmVsKSB7CisgICAgICAgIGlmIChsYWJlbCA9PSB0aGlzLmxhYmVsKSB7CisgICAgICAgICAgICByZXR1cm4gKEJyZWFrU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTEFCRUwsIHRoaXMubGFiZWwsIGxhYmVsKTsKKyAgICAgICAgaWYgKHRoaXMubGFiZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubGFiZWwuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihsYWJlbCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbGFiZWwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVMYWJlbCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQnJlYWtTdG10IHJlbW92ZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gc2V0TGFiZWwoKFNpbXBsZU5hbWUpIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQnJlYWtTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEJyZWFrU3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQnJlYWtTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuYnJlYWtTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbGFiZWwpIHsKKyAgICAgICAgICAgICAgICBzZXRMYWJlbCgoU2ltcGxlTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JyZWFrU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCcmVha1N0bXQgYXNCcmVha1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkJyZWFrU3RtdChDb25zdW1lcjxCcmVha1N0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QnJlYWtTdG10PiB0b0JyZWFrU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9DYXRjaENsYXVzZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NhdGNoQ2xhdXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhYTMwZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9DYXRjaENsYXVzZS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuQ2F0Y2hDbGF1c2VNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworCisvKioKKyAqIFRoZSBjYXRjaCBwYXJ0IG9mIGEgdHJ5LWNhdGNoLWZpbmFsbHkuIDxici8+SW4gPGNvZGU+dHJ5IHsgLi4uIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC4uLiB9PC9jb2RlPiB0aGUgQ2F0Y2hDbGF1c2UKKyAqIGlzIDxjb2RlPmNhdGNoIChFeGNlcHRpb24gZSkgeyAuLi4gfTwvY29kZT4uIEV4Y2VwdGlvbiBlIGlzIHRoZSBwYXJhbWV0ZXIuIFRoZSB7IC4uLiB9IGlzIHRoZSBib2R5LgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2F0Y2hDbGF1c2UgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhCbG9ja1N0bXQ8Q2F0Y2hDbGF1c2U+IHsKKworICAgIHByaXZhdGUgUGFyYW1ldGVyIHBhcmFtZXRlcjsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IGJvZHk7CisKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2UoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IFBhcmFtZXRlcigpLCBuZXcgQmxvY2tTdG10KCkpOworICAgIH0KKworICAgIHB1YmxpYyBDYXRjaENsYXVzZShmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBleGNlcHRNb2RpZmllciwgZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGV4Y2VwdEFubm90YXRpb25zLCBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBleGNlcHRUeXBlLCBmaW5hbCBTaW1wbGVOYW1lIGV4Y2VwdE5hbWUsIGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IFBhcmFtZXRlcihudWxsLCBleGNlcHRNb2RpZmllciwgZXhjZXB0QW5ub3RhdGlvbnMsIGV4Y2VwdFR5cGUsIGZhbHNlLCBuZXcgTm9kZUxpc3Q8PigpLCBleGNlcHROYW1lKSwgYm9keSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIENhdGNoQ2xhdXNlKGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIsIGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHRoaXMobnVsbCwgcGFyYW1ldGVyLCBib2R5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENhdGNoQ2xhdXNlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgUGFyYW1ldGVyIHBhcmFtZXRlciwgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFBhcmFtZXRlcihwYXJhbWV0ZXIpOworICAgICAgICBzZXRCb2R5KGJvZHkpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBQYXJhbWV0ZXIgY2FuIGJlIGEgVW5pb25UeXBlLiBJbiB0aGlzIGNhc2UsIGFueSBhbm5vdGF0aW9ucyBmb3VuZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgICogY2F0Y2goQFggQSBhIHwuLi4pIGFyZSBmb3VuZCBkaXJlY3RseSBpbiB0aGUgUGFyYW1ldGVyLiBBbm5vdGF0aW9ucyB0aGF0IGFyZSBvbiB0aGUgc2Vjb25kIG9yIGxhdGVyIHR5cGUgLQorICAgICAqIGNhdGNoKEEgYSB8IEBYIEIgYiAuLi4pIGFyZSBmb3VuZCBvbiB0aG9zZSB0eXBlcy4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYXRjaENsYXVzZSBzZXRQYXJhbWV0ZXIoZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmFtZXRlcik7CisgICAgICAgIGlmIChwYXJhbWV0ZXIgPT0gdGhpcy5wYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2F0Y2hDbGF1c2UpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlBBUkFNRVRFUiwgdGhpcy5wYXJhbWV0ZXIsIHBhcmFtZXRlcik7CisgICAgICAgIGlmICh0aGlzLnBhcmFtZXRlciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXIuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHBhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tTdG10IGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiBib2R5OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2Ugc2V0Qm9keShmaW5hbCBCbG9ja1N0bXQgYm9keSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGJvZHkpOworICAgICAgICBpZiAoYm9keSA9PSB0aGlzLmJvZHkpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2F0Y2hDbGF1c2UpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFksIHRoaXMuYm9keSwgYm9keSk7CisgICAgICAgIGlmICh0aGlzLmJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYm9keS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDYXRjaENsYXVzZSBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChDYXRjaENsYXVzZSkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2VNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5jYXRjaENsYXVzZU1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gYm9keSkgeworICAgICAgICAgICAgc2V0Qm9keSgoQmxvY2tTdG10KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gcGFyYW1ldGVyKSB7CisgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoKFBhcmFtZXRlcikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NvbnRpbnVlU3RtdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NvbnRpbnVlU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Mjk5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQ29udGludWVTdG10LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoT3B0aW9uYWxMYWJlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkNvbnRpbnVlU3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBBIGNvbnRpbnVlIHN0YXRlbWVudCB3aXRoIGFuIG9wdGlvbmFsIGxhYmVsOworICogPGJyLz48Y29kZT5jb250aW51ZSBicmFpbnM7PC9jb2RlPgorICogPGJyLz48Y29kZT5jb250aW51ZTs8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb250aW51ZVN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aE9wdGlvbmFsTGFiZWw8Q29udGludWVTdG10PiB7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgU2ltcGxlTmFtZSBsYWJlbDsKKworICAgIHB1YmxpYyBDb250aW51ZVN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENvbnRpbnVlU3RtdChmaW5hbCBTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgU2ltcGxlTmFtZShsYWJlbCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBDb250aW51ZVN0bXQoZmluYWwgU2ltcGxlTmFtZSBsYWJlbCkgeworICAgICAgICB0aGlzKG51bGwsIGxhYmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENvbnRpbnVlU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFNpbXBsZU5hbWUgbGFiZWwpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldExhYmVsKGxhYmVsKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U2ltcGxlTmFtZT4gZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGxhYmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsYWJlbAorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBDb250aW51ZVN0bXQKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENvbnRpbnVlU3RtdCBzZXRMYWJlbChmaW5hbCBTaW1wbGVOYW1lIGxhYmVsKSB7CisgICAgICAgIGlmIChsYWJlbCA9PSB0aGlzLmxhYmVsKSB7CisgICAgICAgICAgICByZXR1cm4gKENvbnRpbnVlU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTEFCRUwsIHRoaXMubGFiZWwsIGxhYmVsKTsKKyAgICAgICAgaWYgKHRoaXMubGFiZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubGFiZWwuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihsYWJlbCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbGFiZWwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVMYWJlbCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29udGludWVTdG10IHJlbW92ZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gc2V0TGFiZWwoKFNpbXBsZU5hbWUpIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29udGludWVTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKENvbnRpbnVlU3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29udGludWVTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuY29udGludWVTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbGFiZWwpIHsKKyAgICAgICAgICAgICAgICBzZXRMYWJlbCgoU2ltcGxlTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRpbnVlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDb250aW51ZVN0bXQgYXNDb250aW51ZVN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNvbnRpbnVlU3RtdChDb25zdW1lcjxDb250aW51ZVN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q29udGludWVTdG10PiB0b0NvbnRpbnVlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Eb1N0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Eb1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzE2MWZmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0RvU3RtdC5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQm9keTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aENvbmRpdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkRvU3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIGRvLXdoaWxlLgorICogPGJyLz48Y29kZT5kbyB7IC4uLiB9IHdoaWxlICggYT09MCApOzwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERvU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoQm9keTxEb1N0bXQ+LCBOb2RlV2l0aENvbmRpdGlvbjxEb1N0bXQ+IHsKKworICAgIHByaXZhdGUgU3RhdGVtZW50IGJvZHk7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gY29uZGl0aW9uOworCisgICAgcHVibGljIERvU3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgUmV0dXJuU3RtdCgpLCBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBEb1N0bXQoZmluYWwgU3RhdGVtZW50IGJvZHksIGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CisgICAgICAgIHRoaXMobnVsbCwgYm9keSwgY29uZGl0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIERvU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFN0YXRlbWVudCBib2R5LCBFeHByZXNzaW9uIGNvbmRpdGlvbikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0Qm9keShib2R5KTsKKyAgICAgICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworICAgICAgICByZXR1cm4gYm9keTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0Q29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gY29uZGl0aW9uOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRG9TdG10IHNldEJvZHkoZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChib2R5KTsKKyAgICAgICAgaWYgKGJvZHkgPT0gdGhpcy5ib2R5KSB7CisgICAgICAgICAgICByZXR1cm4gKERvU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSwgdGhpcy5ib2R5LCBib2R5KTsKKyAgICAgICAgaWYgKHRoaXMuYm9keSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5ib2R5LnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGJvZHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIERvU3RtdCBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25kaXRpb24pOworICAgICAgICBpZiAoY29uZGl0aW9uID09IHRoaXMuY29uZGl0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKERvU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQ09ORElUSU9OLCB0aGlzLmNvbmRpdGlvbiwgY29uZGl0aW9uKTsKKyAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoY29uZGl0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBEb1N0bXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoRG9TdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBEb1N0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5kb1N0bXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGJvZHkpIHsKKyAgICAgICAgICAgIHNldEJvZHkoKFN0YXRlbWVudCkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IGNvbmRpdGlvbikgeworICAgICAgICAgICAgc2V0Q29uZGl0aW9uKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNEb1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRG9TdG10IGFzRG9TdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZEb1N0bXQoQ29uc3VtZXI8RG9TdG10PiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPERvU3RtdD4gdG9Eb1N0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRW1wdHlTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRW1wdHlTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczZWRlNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FbXB0eVN0bXQuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkVtcHR5U3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBbiBlbXB0eSBzdGF0ZW1lbnQgaXMgYSAiOyIgd2hlcmUgYSBzdGF0ZW1lbnQgaXMgZXhwZWN0ZWQuCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5U3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgRW1wdHlTdG10KCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW1wdHlTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW1wdHlTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEVtcHR5U3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRW1wdHlTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuZW1wdHlTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFbXB0eVN0bXQgYXNFbXB0eVN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkVtcHR5U3RtdChDb25zdW1lcjxFbXB0eVN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RW1wdHlTdG10PiB0b0VtcHR5U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjliOWMyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIEEgY2FsbCB0byBzdXBlciBvciB0aGlzIGluIGEgY29uc3RydWN0b3Igb3IgaW5pdGlhbGl6ZXIuCisgKiA8YnIvPjxjb2RlPmNsYXNzIFggeyBYKCkgeyBzdXBlcigxNSk7IH0gfTwvY29kZT4KKyAqIDxici8+PGNvZGU+Y2xhc3MgWCB7IFgoKSB7IHRoaXMoMSwgMik7IH0gfTwvY29kZT4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwcgorICogQHNlZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZUFyZ3VtZW50czxFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ+IHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGhpczsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50czsKKworICAgIHB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5vZGVMaXN0PD4oKSwgdHJ1ZSwgbnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChmaW5hbCBib29sZWFuIGlzVGhpcywgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBmaW5hbCBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBpc1RoaXMsIGV4cHJlc3Npb24sIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChmaW5hbCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBmaW5hbCBib29sZWFuIGlzVGhpcywgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBmaW5hbCBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKKyAgICAgICAgdGhpcyhudWxsLCB0eXBlQXJndW1lbnRzLCBpc1RoaXMsIGV4cHJlc3Npb24sIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzLCBib29sZWFuIGlzVGhpcywgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHNldFRoaXMoaXNUaGlzKTsKKyAgICAgICAgc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3VtZW50cyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PEV4cHJlc3Npb24+IGdldEFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3VtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRBcmd1bWVudChpbnQgaSkgeworICAgICAgICByZXR1cm4gZ2V0QXJndW1lbnRzKCkuZ2V0KGkpOworICAgIH0KKworICAgIHB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgc2V0QXJndW1lbnQoaW50IGksIEV4cHJlc3Npb24gYXJndW1lbnQpIHsKKyAgICAgICAgZ2V0QXJndW1lbnRzKCkuc2V0KGksIGFyZ3VtZW50KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBhZGRBcmd1bWVudChFeHByZXNzaW9uIGFyZ3VtZW50KSB7CisgICAgICAgIGdldEFyZ3VtZW50cygpLmFkZChhcmd1bWVudCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZ2V0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVGhpcygpIHsKKyAgICAgICAgcmV0dXJuIGlzVGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBzZXRBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSB0aGlzLmFyZ3VtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkFSR1VNRU5UUywgdGhpcy5hcmd1bWVudHMsIGFyZ3VtZW50cyk7CisgICAgICAgIGlmICh0aGlzLmFyZ3VtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV4cHJlc3Npb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdAorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IHNldEV4cHJlc3Npb24oZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IHRoaXMuZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVYUFJFU1NJT04sIHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CisgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihleHByZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgc2V0VGhpcyhmaW5hbCBib29sZWFuIGlzVGhpcykgeworICAgICAgICBpZiAoaXNUaGlzID09IHRoaXMuaXNUaGlzKSB7CisgICAgICAgICAgICByZXR1cm4gKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVEhJUywgdGhpcy5pc1RoaXMsIGlzVGhpcyk7CisgICAgICAgIHRoaXMuaXNUaGlzID0gaXNUaGlzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPE5vZGVMaXN0PFR5cGU+PiBnZXRUeXBlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0eXBlQXJndW1lbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyB0aGUgdHlwZUFyZ3VtZW50cywgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQKKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gdGhpcy50eXBlQXJndW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVFlQRV9BUkdVTUVOVFMsIHRoaXMudHlwZUFyZ3VtZW50cywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZUFyZ3VtZW50cy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnR5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgYXJndW1lbnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBleHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgcmVtb3ZlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5zZXQoaSwgKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gZXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIHNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgYXNFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChDb25zdW1lcjxFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gcmVzb2x2ZUludm9rZWRDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkucmVzb2x2ZURlY2xhcmF0aW9uKHRoaXMsIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ+IHRvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cHJlc3Npb25TdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRXhwcmVzc2lvblN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNjNDVkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cHJlc3Npb25TdG10LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRXhwcmVzc2lvblN0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogVXNlZCB0byB3cmFwIGFuIGV4cHJlc3Npb24gc28gdGhhdCBpdCBjYW4gdGFrZSB0aGUgcGxhY2Ugb2YgYSBzdGF0ZW1lbnQuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHByZXNzaW9uU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoRXhwcmVzc2lvbjxFeHByZXNzaW9uU3RtdD4geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvblN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IEJvb2xlYW5MaXRlcmFsRXhwcigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgRXhwcmVzc2lvblN0bXQoZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMobnVsbCwgZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb25TdG10IHNldEV4cHJlc3Npb24oZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoZXhwcmVzc2lvbik7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IHRoaXMuZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIChFeHByZXNzaW9uU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTiwgdGhpcy5leHByZXNzaW9uLCBleHByZXNzaW9uKTsKKyAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGV4cHJlc3Npb24pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb25TdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKEV4cHJlc3Npb25TdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uU3RtdE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmV4cHJlc3Npb25TdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBzZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHByZXNzaW9uU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uU3RtdCBhc0V4cHJlc3Npb25TdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZFeHByZXNzaW9uU3RtdChDb25zdW1lcjxFeHByZXNzaW9uU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFeHByZXNzaW9uU3RtdD4gdG9FeHByZXNzaW9uU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Gb3JTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODg5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yU3RtdC5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQm9keTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Gb3JTdG10TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk9wdGlvbmFsUHJvcGVydHk7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CisKKy8qKgorICogPGgxPlRoZSBjbGFzc2ljIGZvciBzdGF0ZW1lbnQ8L2gxPgorICogRXhhbXBsZXM6CisgKiA8b2w+CisgKiA8bGk+PGNvZGU+Zm9yKGludCBhPTMsIGI9NTsgYTw5OTsgYSsrLCBiKyspIGhlbGxvKCk7PC9jb2RlPjwvbGk+CisgKiA8bGk+PGNvZGU+Zm9yKGE9MywgYj01OyBhPDk5OyBhKyspIHsgaGVsbG8oKTsgfTwvY29kZT4gPC9saT4KKyAqIDxsaT48Y29kZT5mb3IoYSgpLGIoKTs7KSBoZWxsbygpOzwvY29kZT4gPC9saT4KKyAqIDwvb2w+CisgKiA8dWw+CisgKiA8bGk+PGk+aW5pdGlhbGl6YXRpb248L2k+IGlzIGEgbGlzdCBvZiBleHByZXNzaW9ucy4KKyAqIFRoZXNlIGNhbiBiZSBhbnkga2luZCBvZiBleHByZXNzaW9uIGFzIGNhbiBiZSBzZWVuIGluIGV4YW1wbGUgMywKKyAqIGJ1dCB0aGUgY29tbW9uIG9uZXMgYXJlIGEgc2luZ2xlIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByICh3aGljaCBkZWNsYXJlcyBtdWx0aXBsZSB2YXJpYWJsZXMpIGluIGV4YW1wbGUgMSwKKyAqIG9yIGEgbGlzdCBvZiBBc3NpZ25FeHByJ3MgaW4gZXhhbXBsZSAyLjwvbGk+CisgKiA8bGk+PGk+Y29tcGFyZTwvaT4gaXMgYW4gZXhwcmVzc2lvbiwKKyAqIGluIGV4YW1wbGUgMSBhbmQgMiBpdCBpcyBhIEJpbmFyeUV4cHIuCisgKiBJbiBleGFtcGxlIDMgdGhlcmUgaXMgbm8gZXhwcmVzc2lvbiwgaXQgaXMgZW1wdHkuPC9saT4KKyAqIDxsaT48aT51cGRhdGU8L2k+IGlzIGEgbGlzdCBvZiBleHByZXNzaW9ucywKKyAqIGluIGV4YW1wbGUgMSBhbmQgMiB0aGV5IGFyZSBVbmFyeUV4cHIncy4KKyAqIEluIGV4YW1wbGUgMyB0aGVyZSBpcyBubyBleHByZXNzaW9uLCB0aGUgbGlzdCBlbXB0eS48L2xpPgorICogPGxpPjxpPmJvZHk8L2k+IGlzIGEgc3RhdGVtZW50LAorICogaW4gZXhhbXBsZSAxIGFuZCAzIGl0IGlzIGFuIEV4cHJlc3Npb25TdG10LgorICogaW4gZXhhbXBsZSAyIGl0IGlzIGEgQmxvY2tTdG10LjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICogQHNlZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZvclN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aEJvZHk8Rm9yU3RtdD4geworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxFeHByZXNzaW9uPiBpbml0aWFsaXphdGlvbjsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNvbXBhcmU7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZTsKKworICAgIHByaXZhdGUgU3RhdGVtZW50IGJvZHk7CisKKyAgICBwdWJsaWMgRm9yU3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKCksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBSZXR1cm5TdG10KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBGb3JTdG10KGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IGluaXRpYWxpemF0aW9uLCBmaW5hbCBFeHByZXNzaW9uIGNvbXBhcmUsIGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSwgZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKyAgICAgICAgdGhpcyhudWxsLCBpbml0aWFsaXphdGlvbiwgY29tcGFyZSwgdXBkYXRlLCBib2R5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIEZvclN0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBOb2RlTGlzdDxFeHByZXNzaW9uPiBpbml0aWFsaXphdGlvbiwgRXhwcmVzc2lvbiBjb21wYXJlLCBOb2RlTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUsIFN0YXRlbWVudCBib2R5KSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRJbml0aWFsaXphdGlvbihpbml0aWFsaXphdGlvbik7CisgICAgICAgIHNldENvbXBhcmUoY29tcGFyZSk7CisgICAgICAgIHNldFVwZGF0ZSh1cGRhdGUpOworICAgICAgICBzZXRCb2R5KGJvZHkpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFeHByZXNzaW9uPiBnZXRDb21wYXJlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShjb21wYXJlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PEV4cHJlc3Npb24+IGdldEluaXRpYWxpemF0aW9uKCkgeworICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb247CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxFeHByZXNzaW9uPiBnZXRVcGRhdGUoKSB7CisgICAgICAgIHJldHVybiB1cGRhdGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGb3JTdG10IHNldEJvZHkoZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChib2R5KTsKKyAgICAgICAgaWYgKGJvZHkgPT0gdGhpcy5ib2R5KSB7CisgICAgICAgICAgICByZXR1cm4gKEZvclN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFksIHRoaXMuYm9keSwgYm9keSk7CisgICAgICAgIGlmICh0aGlzLmJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYm9keS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcGFyZQorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBhcmUgdGhlIGNvbXBhcmUsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgRm9yU3RtdAorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yU3RtdCBzZXRDb21wYXJlKGZpbmFsIEV4cHJlc3Npb24gY29tcGFyZSkgeworICAgICAgICBpZiAoY29tcGFyZSA9PSB0aGlzLmNvbXBhcmUpIHsKKyAgICAgICAgICAgIHJldHVybiAoRm9yU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQ09NUEFSRSwgdGhpcy5jb21wYXJlLCBjb21wYXJlKTsKKyAgICAgICAgaWYgKHRoaXMuY29tcGFyZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5jb21wYXJlLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGNvbXBhcmUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEZvclN0bXQgc2V0SW5pdGlhbGl6YXRpb24oZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gaW5pdGlhbGl6YXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbml0aWFsaXphdGlvbik7CisgICAgICAgIGlmIChpbml0aWFsaXphdGlvbiA9PSB0aGlzLmluaXRpYWxpemF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKEZvclN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LklOSVRJQUxJWkFUSU9OLCB0aGlzLmluaXRpYWxpemF0aW9uLCBpbml0aWFsaXphdGlvbik7CisgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmluaXRpYWxpemF0aW9uLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb24gPSBpbml0aWFsaXphdGlvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoaW5pdGlhbGl6YXRpb24pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEZvclN0bXQgc2V0VXBkYXRlKGZpbmFsIE5vZGVMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHVwZGF0ZSk7CisgICAgICAgIGlmICh1cGRhdGUgPT0gdGhpcy51cGRhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoRm9yU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdXBkYXRlKTsKKyAgICAgICAgaWYgKHRoaXMudXBkYXRlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnVwZGF0ZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodXBkYXRlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjb21wYXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGNvbXBhcmUpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVDb21wYXJlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsaXphdGlvbi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24ucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIEZvclN0bXQgcmVtb3ZlQ29tcGFyZSgpIHsKKyAgICAgICAgcmV0dXJuIHNldENvbXBhcmUoKEV4cHJlc3Npb24pIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChGb3JTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGb3JTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuZm9yU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gYm9keSkgeworICAgICAgICAgICAgc2V0Qm9keSgoU3RhdGVtZW50KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gY29tcGFyZSkgeworICAgICAgICAgICAgICAgIHNldENvbXBhcmUoKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsaXphdGlvbi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uc2V0KGksIChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlLnNldChpLCAoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvclN0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yU3RtdCBhc0ZvclN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkZvclN0bXQoQ29uc3VtZXI8Rm9yU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxGb3JTdG10PiB0b0ZvclN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yZWFjaFN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Gb3JlYWNoU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMDRlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yZWFjaFN0bXQuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJvZHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Gb3JlYWNoU3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIGZvci1lYWNoIHN0YXRlbWVudC4KKyAqIDxici8+PGNvZGU+Zm9yKE9iamVjdCBvOiBvYmplY3RzKSB7IC4uLiB9PC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRm9yZWFjaFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aEJvZHk8Rm9yZWFjaFN0bXQ+IHsKKworICAgIHByaXZhdGUgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyaWFibGU7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gaXRlcmFibGU7CisKKyAgICBwcml2YXRlIFN0YXRlbWVudCBib2R5OworCisgICAgcHVibGljIEZvcmVhY2hTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpLCBuZXcgTmFtZUV4cHIoKSwgbmV3IFJldHVyblN0bXQoKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEZvcmVhY2hTdG10KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhcmlhYmxlLCBmaW5hbCBFeHByZXNzaW9uIGl0ZXJhYmxlLCBmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworICAgICAgICB0aGlzKG51bGwsIHZhcmlhYmxlLCBpdGVyYWJsZSwgYm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGb3JlYWNoU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhcmlhYmxlLCBFeHByZXNzaW9uIGl0ZXJhYmxlLCBTdGF0ZW1lbnQgYm9keSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0VmFyaWFibGUodmFyaWFibGUpOworICAgICAgICBzZXRJdGVyYWJsZShpdGVyYWJsZSk7CisgICAgICAgIHNldEJvZHkoYm9keSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEZvcmVhY2hTdG10KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhcmlhYmxlLCBTdHJpbmcgaXRlcmFibGUsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHRoaXMobnVsbCwgdmFyaWFibGUsIG5ldyBOYW1lRXhwcihpdGVyYWJsZSksIGJvZHkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEl0ZXJhYmxlKCkgeworICAgICAgICByZXR1cm4gaXRlcmFibGU7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBnZXRWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yZWFjaFN0bXQgc2V0Qm9keShmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGJvZHkpOworICAgICAgICBpZiAoYm9keSA9PSB0aGlzLmJvZHkpIHsKKyAgICAgICAgICAgIHJldHVybiAoRm9yZWFjaFN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFksIHRoaXMuYm9keSwgYm9keSk7CisgICAgICAgIGlmICh0aGlzLmJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYm9keS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGb3JlYWNoU3RtdCBzZXRJdGVyYWJsZShmaW5hbCBFeHByZXNzaW9uIGl0ZXJhYmxlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoaXRlcmFibGUpOworICAgICAgICBpZiAoaXRlcmFibGUgPT0gdGhpcy5pdGVyYWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIChGb3JlYWNoU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuSVRFUkFCTEUsIHRoaXMuaXRlcmFibGUsIGl0ZXJhYmxlKTsKKyAgICAgICAgaWYgKHRoaXMuaXRlcmFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuaXRlcmFibGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihpdGVyYWJsZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yZWFjaFN0bXQgc2V0VmFyaWFibGUoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyaWFibGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJpYWJsZSk7CisgICAgICAgIGlmICh2YXJpYWJsZSA9PSB0aGlzLnZhcmlhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gKEZvcmVhY2hTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5WQVJJQUJMRSwgdGhpcy52YXJpYWJsZSwgdmFyaWFibGUpOworICAgICAgICBpZiAodGhpcy52YXJpYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy52YXJpYWJsZS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHZhcmlhYmxlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGb3JlYWNoU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChGb3JlYWNoU3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yZWFjaFN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5mb3JlYWNoU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gYm9keSkgeworICAgICAgICAgICAgc2V0Qm9keSgoU3RhdGVtZW50KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gaXRlcmFibGUpIHsKKyAgICAgICAgICAgIHNldEl0ZXJhYmxlKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gdmFyaWFibGUpIHsKKyAgICAgICAgICAgIHNldFZhcmlhYmxlKChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzRm9yZWFjaFN0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRm9yZWFjaFN0bXQgYXNGb3JlYWNoU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRm9yZWFjaFN0bXQoQ29uc3VtZXI8Rm9yZWFjaFN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Rm9yZWFjaFN0bXQ+IHRvRm9yZWFjaFN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3M2ZmOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9JZlN0bXQuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aENvbmRpdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5EZXJpdmVkUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5JZlN0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogQW4gaWYtdGhlbi1lbHNlIHN0YXRlbWVudC4gVGhlIGVsc2UgaXMgb3B0aW9uYWwuCisgKiA8YnIvPkluIDxjb2RlPmlmKGE9PTUpIGh1cnJheSgpIGVsc2UgYm9vKCk7PC9jb2RlPiB0aGUgY29uZGl0aW9uIGlzIGE9PTUsCisgKiBodXJyYXkoKSBpcyB0aGUgdGhlblN0bXQsIGFuZCBib28oKSBpcyB0aGUgZWxzZVN0bXQuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJZlN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aENvbmRpdGlvbjxJZlN0bXQ+IHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBjb25kaXRpb247CisKKyAgICBwcml2YXRlIFN0YXRlbWVudCB0aGVuU3RtdDsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgZWxzZVN0bXQ7CisKKyAgICBwdWJsaWMgSWZTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBCb29sZWFuTGl0ZXJhbEV4cHIoKSwgbmV3IFJldHVyblN0bXQoKSwgbnVsbCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIElmU3RtdChmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgZmluYWwgU3RhdGVtZW50IHRoZW5TdG10LCBmaW5hbCBTdGF0ZW1lbnQgZWxzZVN0bXQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBjb25kaXRpb24sIHRoZW5TdG10LCBlbHNlU3RtdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJZlN0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IHRoZW5TdG10LCBTdGF0ZW1lbnQgZWxzZVN0bXQpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldENvbmRpdGlvbihjb25kaXRpb24pOworICAgICAgICBzZXRUaGVuU3RtdCh0aGVuU3RtdCk7CisgICAgICAgIHNldEVsc2VTdG10KGVsc2VTdG10KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBjb25kaXRpb247CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxTdGF0ZW1lbnQ+IGdldEVsc2VTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShlbHNlU3RtdCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0VGhlblN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGVuU3RtdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIElmU3RtdCBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25kaXRpb24pOworICAgICAgICBpZiAoY29uZGl0aW9uID09IHRoaXMuY29uZGl0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKElmU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQ09ORElUSU9OLCB0aGlzLmNvbmRpdGlvbiwgY29uZGl0aW9uKTsKKyAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoY29uZGl0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZWxzZVN0bXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbHNlU3RtdCB0aGUgZWxzZVN0bXQsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgSWZTdG10CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJZlN0bXQgc2V0RWxzZVN0bXQoZmluYWwgU3RhdGVtZW50IGVsc2VTdG10KSB7CisgICAgICAgIGlmIChlbHNlU3RtdCA9PSB0aGlzLmVsc2VTdG10KSB7CisgICAgICAgICAgICByZXR1cm4gKElmU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRUxTRV9TVE1ULCB0aGlzLmVsc2VTdG10LCBlbHNlU3RtdCk7CisgICAgICAgIGlmICh0aGlzLmVsc2VTdG10ICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmVsc2VTdG10LnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuZWxzZVN0bXQgPSBlbHNlU3RtdDsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZWxzZVN0bXQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIElmU3RtdCBzZXRUaGVuU3RtdChmaW5hbCBTdGF0ZW1lbnQgdGhlblN0bXQpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aGVuU3RtdCk7CisgICAgICAgIGlmICh0aGVuU3RtdCA9PSB0aGlzLnRoZW5TdG10KSB7CisgICAgICAgICAgICByZXR1cm4gKElmU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuVEhFTl9TVE1ULCB0aGlzLnRoZW5TdG10LCB0aGVuU3RtdCk7CisgICAgICAgIGlmICh0aGlzLnRoZW5TdG10ICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnRoZW5TdG10LnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudGhlblN0bXQgPSB0aGVuU3RtdDsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhlblN0bXQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGVsc2VTdG10ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGVsc2VTdG10KSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRWxzZVN0bXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIElmU3RtdCByZW1vdmVFbHNlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHNldEVsc2VTdG10KChTdGF0ZW1lbnQpIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlbiBicmFuY2ggKHdoaWNoIHNob3VsZCBiZSBhbHdheXMgcHJlc2VudCkgaXMgYSBibG9jayBzdGF0ZW1lbnQuCisgICAgICovCisgICAgQERlcml2ZWRQcm9wZXJ0eQorICAgIHB1YmxpYyBib29sZWFuIGhhc1RoZW5CbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIHRoZW5TdG10IGluc3RhbmNlb2YgQmxvY2tTdG10OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgSWYgU3RhdGVtZW50IGhhcyBhbiBlbHNlIGJyYW5jaCBhbmQgdGhhdCBicmFuY2ggaXMgYSBibG9jayBzdGF0ZW1lbnQuCisgICAgICovCisgICAgQERlcml2ZWRQcm9wZXJ0eQorICAgIHB1YmxpYyBib29sZWFuIGhhc0Vsc2VCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIGVsc2VTdG10IGluc3RhbmNlb2YgQmxvY2tTdG10OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgSWYgU3RhdGVtZW50IGhhcyBhbiBlbHNlIGJyYW5jaCBhbmQgdGhhdCBicmFuY2ggaXMgYW5vdGhlciBJZiBTdGF0ZW1lbnQuCisgICAgICovCisgICAgQERlcml2ZWRQcm9wZXJ0eQorICAgIHB1YmxpYyBib29sZWFuIGhhc0Nhc2NhZGluZ0lmU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGVsc2VTdG10IGluc3RhbmNlb2YgSWZTdG10OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgSWYgU3RhdGVtZW50IGhhcyBhbiBlbHNlIGJyYW5jaC4KKyAgICAgKi8KKyAgICBARGVyaXZlZFByb3BlcnR5CisgICAgcHVibGljIGJvb2xlYW4gaGFzRWxzZUJyYW5jaCgpIHsKKyAgICAgICAgcmV0dXJuIGVsc2VTdG10ICE9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJZlN0bXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoSWZTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJZlN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5pZlN0bXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGNvbmRpdGlvbikgeworICAgICAgICAgICAgc2V0Q29uZGl0aW9uKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsc2VTdG10ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGVsc2VTdG10KSB7CisgICAgICAgICAgICAgICAgc2V0RWxzZVN0bXQoKFN0YXRlbWVudCkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSB0aGVuU3RtdCkgeworICAgICAgICAgICAgc2V0VGhlblN0bXQoKFN0YXRlbWVudCkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzSWZTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIElmU3RtdCBhc0lmU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmSWZTdG10KENvbnN1bWVyPElmU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJZlN0bXQ+IHRvSWZTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0xhYmVsZWRTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvTGFiZWxlZFN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA2ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0xhYmVsZWRTdG10LmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTGFiZWxlZFN0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBzdGF0ZW1lbnQgdGhhdCBpcyBsYWJlbGVkLCBsaWtlIDxjb2RlPmxhYmVsMTIzOiBwcmludGxuKCJjb250aW51aW5nIik7PC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHJpdmF0ZSBTaW1wbGVOYW1lIGxhYmVsOworCisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgc3RhdGVtZW50OworCisgICAgcHVibGljIExhYmVsZWRTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTaW1wbGVOYW1lKCksIG5ldyBSZXR1cm5TdG10KCkpOworICAgIH0KKworICAgIHB1YmxpYyBMYWJlbGVkU3RtdChmaW5hbCBTdHJpbmcgbGFiZWwsIGZpbmFsIFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgU2ltcGxlTmFtZShsYWJlbCksIHN0YXRlbWVudCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIExhYmVsZWRTdG10KGZpbmFsIFNpbXBsZU5hbWUgbGFiZWwsIGZpbmFsIFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBsYWJlbCwgc3RhdGVtZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIExhYmVsZWRTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgU2ltcGxlTmFtZSBsYWJlbCwgU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0TGFiZWwobGFiZWwpOworICAgICAgICBzZXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldFN0YXRlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIExhYmVsZWRTdG10IHNldFN0YXRlbWVudChmaW5hbCBTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3RhdGVtZW50KTsKKyAgICAgICAgaWYgKHN0YXRlbWVudCA9PSB0aGlzLnN0YXRlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIChMYWJlbGVkU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuU1RBVEVNRU5ULCB0aGlzLnN0YXRlbWVudCwgc3RhdGVtZW50KTsKKyAgICAgICAgaWYgKHRoaXMuc3RhdGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnN0YXRlbWVudC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2Yoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMYWJlbGVkU3RtdCBzZXRMYWJlbChmaW5hbCBTaW1wbGVOYW1lIGxhYmVsKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwobGFiZWwpOworICAgICAgICBpZiAobGFiZWwgPT0gdGhpcy5sYWJlbCkgeworICAgICAgICAgICAgcmV0dXJuIChMYWJlbGVkU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTEFCRUwsIHRoaXMubGFiZWwsIGxhYmVsKTsKKyAgICAgICAgaWYgKHRoaXMubGFiZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMubGFiZWwuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihsYWJlbCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGFiZWxlZFN0bXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoTGFiZWxlZFN0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIExhYmVsZWRTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwubGFiZWxlZFN0bXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGxhYmVsKSB7CisgICAgICAgICAgICBzZXRMYWJlbCgoU2ltcGxlTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IHN0YXRlbWVudCkgeworICAgICAgICAgICAgc2V0U3RhdGVtZW50KChTdGF0ZW1lbnQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsZWRTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIExhYmVsZWRTdG10IGFzTGFiZWxlZFN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkxhYmVsZWRTdG10KENvbnN1bWVyPExhYmVsZWRTdG10PiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPExhYmVsZWRTdG10PiB0b0xhYmVsZWRTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0xvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Mb2NhbENsYXNzRGVjbGFyYXRpb25TdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4ZWViYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Mb2NhbENsYXNzRGVjbGFyYXRpb25TdG10LmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Mb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIDxoMT5BIGNsYXNzIGRlY2xhcmF0aW9uIGluc2lkZSBhIG1ldGhvZC48L2gxPgorICogPGgyPkphdmEgMS4wPC9oMj4KKyAqIE5vdCBhdmFpbGFibGUuCisgKiA8aDI+SmF2YSAxLjErPC9oMj4KKyAqIEEgc3RhdGVtZW50IGNvbnNpc3Rpbmcgb2YgYSBjbGFzcyBkZWNsYXJhdGlvbi4KKyAqIDxici8+PGNvZGU+Y2xhc3MgWCB7IHZvaWQgbSgpIHsgPGI+Y2xhc3MgWSB7IH08L2I+IH0gfTwvY29kZT4KKyAqCisgKiBAc2VlIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb247CisKKyAgICBwdWJsaWMgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMobnVsbCwgY2xhc3NEZWNsYXJhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldENsYXNzRGVjbGFyYXRpb24oY2xhc3NEZWNsYXJhdGlvbik7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBnZXRDbGFzc0RlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gY2xhc3NEZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgc2V0Q2xhc3NEZWNsYXJhdGlvbihmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGNsYXNzRGVjbGFyYXRpb24pOworICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbiA9PSB0aGlzLmNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuQ0xBU1NfREVDTEFSQVRJT04sIHRoaXMuY2xhc3NEZWNsYXJhdGlvbiwgY2xhc3NEZWNsYXJhdGlvbik7CisgICAgICAgIGlmICh0aGlzLmNsYXNzRGVjbGFyYXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuY2xhc3NEZWNsYXJhdGlvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNsYXNzRGVjbGFyYXRpb24gPSBjbGFzc0RlY2xhcmF0aW9uOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihjbGFzc0RlY2xhcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5sb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBjbGFzc0RlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBzZXRDbGFzc0RlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBhc0xvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkxvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQoQ29uc3VtZXI8TG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10PiB0b0xvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvUmV0dXJuU3RtdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1JldHVyblN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1JldHVyblN0bXQuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlJldHVyblN0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBUaGUgcmV0dXJuIHN0YXRlbWVudCwgd2l0aCBhbiBvcHRpb25hbCBleHByZXNzaW9uIHRvIHJldHVybi4KKyAqIDxici8+PGNvZGU+cmV0dXJuIDUgKiA1OzwvY29kZT4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmV0dXJuU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCisgICAgcHVibGljIFJldHVyblN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFJldHVyblN0bXQoZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMobnVsbCwgZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZXR1cm5TdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdpbGwgY3JlYXRlIGEgTmFtZUV4cHIgd2l0aCB0aGUgc3RyaW5nIHBhcmFtCisgICAgICovCisgICAgcHVibGljIFJldHVyblN0bXQoU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZUV4cHIoZXhwcmVzc2lvbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFeHByZXNzaW9uPiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBleHByZXNzaW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgZXhwcmVzc2lvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSBSZXR1cm5TdG10CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZXR1cm5TdG10IHNldEV4cHJlc3Npb24oZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IHRoaXMuZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIChSZXR1cm5TdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5FWFBSRVNTSU9OLCB0aGlzLmV4cHJlc3Npb24sIGV4cHJlc3Npb24pOworICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24uc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZXhwcmVzc2lvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBleHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmV0dXJuU3RtdCByZW1vdmVFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZXR1cm5TdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFJldHVyblN0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFJldHVyblN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5yZXR1cm5TdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBleHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldHVyblN0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmV0dXJuU3RtdCBhc1JldHVyblN0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlJldHVyblN0bXQoQ29uc3VtZXI8UmV0dXJuU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxSZXR1cm5TdG10PiB0b1JldHVyblN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxMDBlOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuU3RhdGVtZW50TWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciBhbGwgc3RhdGVtZW50cy4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudCBleHRlbmRzIE5vZGUgeworCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFN0YXRlbWVudCgpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFN0YXRlbWVudChUb2tlblJhbmdlIHRva2VuUmFuZ2UpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoU3RhdGVtZW50KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdGF0ZW1lbnRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5zdGF0ZW1lbnRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzZXJ0U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXNzZXJ0U3RtdCBhc0Fzc2VydFN0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEFzc2VydFN0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQmxvY2tTdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCbG9ja1N0bXQgYXNCbG9ja1N0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEJsb2NrU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNCcmVha1N0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEJyZWFrU3RtdCBhc0JyZWFrU3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQnJlYWtTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRpbnVlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ29udGludWVTdG10IGFzQ29udGludWVTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBDb250aW51ZVN0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzRG9TdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBEb1N0bXQgYXNEb1N0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIERvU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEVtcHR5U3RtdCBhc0VtcHR5U3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gRW1wdHlTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IGFzRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhwcmVzc2lvblN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEV4cHJlc3Npb25TdG10IGFzRXhwcmVzc2lvblN0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEV4cHJlc3Npb25TdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvclN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIEZvclN0bXQgYXNGb3JTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBGb3JTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvcmVhY2hTdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBGb3JlYWNoU3RtdCBhc0ZvcmVhY2hTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBGb3JlYWNoU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNJZlN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIElmU3RtdCBhc0lmU3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gSWZTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsZWRTdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMYWJlbGVkU3RtdCBhc0xhYmVsZWRTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBMYWJlbGVkU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IGFzTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXR1cm5TdG10KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZXR1cm5TdG10IGFzUmV0dXJuU3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gUmV0dXJuU3RtdCIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNTd2l0Y2hFbnRyeVN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN3aXRjaEVudHJ5U3RtdCBhc1N3aXRjaEVudHJ5U3RtdCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gU3dpdGNoRW50cnlTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N3aXRjaFN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN3aXRjaFN0bXQgYXNTd2l0Y2hTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBTd2l0Y2hTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZFN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXQgYXNTeW5jaHJvbml6ZWRTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBTeW5jaHJvbml6ZWRTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Rocm93U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVGhyb3dTdG10IGFzVGhyb3dTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBUaHJvd1N0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVHJ5U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHJ5U3RtdCBhc1RyeVN0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFRyeVN0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVW5wYXJzYWJsZVN0bXQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFVucGFyc2FibGVTdG10IGFzVW5wYXJzYWJsZVN0bXQoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFVucGFyc2FibGVTdG10IiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1doaWxlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2hpbGVTdG10IGFzV2hpbGVTdG10KCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBXaGlsZVN0bXQiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXNzZXJ0U3RtdChDb25zdW1lcjxBc3NlcnRTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZCbG9ja1N0bXQoQ29uc3VtZXI8QmxvY2tTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZCcmVha1N0bXQoQ29uc3VtZXI8QnJlYWtTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZDb250aW51ZVN0bXQoQ29uc3VtZXI8Q29udGludWVTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZEb1N0bXQoQ29uc3VtZXI8RG9TdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZFbXB0eVN0bXQoQ29uc3VtZXI8RW1wdHlTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoQ29uc3VtZXI8RXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZFeHByZXNzaW9uU3RtdChDb25zdW1lcjxFeHByZXNzaW9uU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmRm9yU3RtdChDb25zdW1lcjxGb3JTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZGb3JlYWNoU3RtdChDb25zdW1lcjxGb3JlYWNoU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmSWZTdG10KENvbnN1bWVyPElmU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmTGFiZWxlZFN0bXQoQ29uc3VtZXI8TGFiZWxlZFN0bXQ+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkxvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQoQ29uc3VtZXI8TG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmUmV0dXJuU3RtdChDb25zdW1lcjxSZXR1cm5TdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZTd2l0Y2hFbnRyeVN0bXQoQ29uc3VtZXI8U3dpdGNoRW50cnlTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZTd2l0Y2hTdG10KENvbnN1bWVyPFN3aXRjaFN0bXQ+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlN5bmNocm9uaXplZFN0bXQoQ29uc3VtZXI8U3luY2hyb25pemVkU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVGhyb3dTdG10KENvbnN1bWVyPFRocm93U3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVHJ5U3RtdChDb25zdW1lcjxUcnlTdG10PiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZVbnBhcnNhYmxlU3RtdChDb25zdW1lcjxVbnBhcnNhYmxlU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmV2hpbGVTdG10KENvbnN1bWVyPFdoaWxlU3RtdD4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxBc3NlcnRTdG10PiB0b0Fzc2VydFN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QmxvY2tTdG10PiB0b0Jsb2NrU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxCcmVha1N0bXQ+IHRvQnJlYWtTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPENvbnRpbnVlU3RtdD4gdG9Db250aW51ZVN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RG9TdG10PiB0b0RvU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxFbXB0eVN0bXQ+IHRvRW1wdHlTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdD4gdG9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8RXhwcmVzc2lvblN0bXQ+IHRvRXhwcmVzc2lvblN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Rm9yU3RtdD4gdG9Gb3JTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEZvcmVhY2hTdG10PiB0b0ZvcmVhY2hTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPElmU3RtdD4gdG9JZlN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TGFiZWxlZFN0bXQ+IHRvTGFiZWxlZFN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8TG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdD4gdG9Mb2NhbENsYXNzRGVjbGFyYXRpb25TdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFJldHVyblN0bXQ+IHRvUmV0dXJuU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxTd2l0Y2hFbnRyeVN0bXQ+IHRvU3dpdGNoRW50cnlTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFN3aXRjaFN0bXQ+IHRvU3dpdGNoU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxTeW5jaHJvbml6ZWRTdG10PiB0b1N5bmNocm9uaXplZFN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VGhyb3dTdG10PiB0b1Rocm93U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxUcnlTdG10PiB0b1RyeVN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VW5wYXJzYWJsZVN0bXQ+IHRvVW5wYXJzYWJsZVN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8V2hpbGVTdG10PiB0b1doaWxlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaEVudHJ5U3RtdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaEVudHJ5U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYThmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3dpdGNoRW50cnlTdG10LmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIE9uZSBjYXNlIGluIGEgc3dpdGNoIHN0YXRlbWVudC4KKyAqIDxici8+PHByZT4KKyAqIHN3aXRjaCAoaSkgeworICogY2FzZSAxOgorICogY2FzZSAyOgorICogU3lzdGVtLm91dC5wcmludGxuKDQ0NCk7CisgKiBicmVhazsKKyAqIGRlZmF1bHQ6CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oMCk7CisgKiB9CisgKiA8L3ByZT4KKyAqIFRoaXMgY29udGFpbnMgdGhyZWUgU3dpdGNoRW50cnlTdG10cy4KKyAqIDxici8+VGhlIGZpcnN0IG9uZSBoYXMgbGFiZWwgMSBhbmQgbm8gc3RhdGVtZW50cy4KKyAqIDxici8+VGhlIHNlY29uZCBoYXMgbGFiZWwgMiBhbmQgdHdvIHN0YXRlbWVudHMgKHRoZSBwcmludGxuIGFuZCB0aGUgYnJlYWspLgorICogPGJyLz5UaGUgdGhpcmQsIHRoZSBkZWZhdWx0LCBoYXMgbm8gbGFiZWwgYW5kIG9uZSBzdGF0ZW1lbnQuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKiBAc2VlIFN3aXRjaFN0bXQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN3aXRjaEVudHJ5U3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoU3RhdGVtZW50czxTd2l0Y2hFbnRyeVN0bXQ+IHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGxhYmVsOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHM7CisKKyAgICBwdWJsaWMgU3dpdGNoRW50cnlTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQoZmluYWwgRXhwcmVzc2lvbiBsYWJlbCwgZmluYWwgTm9kZUxpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSB7CisgICAgICAgIHRoaXMobnVsbCwgbGFiZWwsIHN0YXRlbWVudHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3dpdGNoRW50cnlTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBsYWJlbCwgTm9kZUxpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRMYWJlbChsYWJlbCk7CisgICAgICAgIHNldFN0YXRlbWVudHMoc3RhdGVtZW50cyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEV4cHJlc3Npb24+IGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShsYWJlbCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxTdGF0ZW1lbnQ+IGdldFN0YXRlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxhYmVsCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIFN3aXRjaEVudHJ5U3RtdAorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3dpdGNoRW50cnlTdG10IHNldExhYmVsKGZpbmFsIEV4cHJlc3Npb24gbGFiZWwpIHsKKyAgICAgICAgaWYgKGxhYmVsID09IHRoaXMubGFiZWwpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3dpdGNoRW50cnlTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5MQUJFTCwgdGhpcy5sYWJlbCwgbGFiZWwpOworICAgICAgICBpZiAodGhpcy5sYWJlbCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5sYWJlbC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGxhYmVsKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQgc2V0U3RhdGVtZW50cyhmaW5hbCBOb2RlTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnRzKTsKKyAgICAgICAgaWYgKHN0YXRlbWVudHMgPT0gdGhpcy5zdGF0ZW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKFN3aXRjaEVudHJ5U3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuU1RBVEVNRU5UUywgdGhpcy5zdGF0ZW1lbnRzLCBzdGF0ZW1lbnRzKTsKKyAgICAgICAgaWYgKHRoaXMuc3RhdGVtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHN0YXRlbWVudHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGxhYmVsKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlTGFiZWwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnRzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQgcmVtb3ZlTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBzZXRMYWJlbCgoRXhwcmVzc2lvbikgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoU3dpdGNoRW50cnlTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5zd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBsYWJlbCkgeworICAgICAgICAgICAgICAgIHNldExhYmVsKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0YXRlbWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzLnNldChpLCAoU3RhdGVtZW50KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzU3dpdGNoRW50cnlTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN3aXRjaEVudHJ5U3RtdCBhc1N3aXRjaEVudHJ5U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmU3dpdGNoRW50cnlTdG10KENvbnN1bWVyPFN3aXRjaEVudHJ5U3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxTd2l0Y2hFbnRyeVN0bXQ+IHRvU3dpdGNoRW50cnlTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaFN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlODhiMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hTdG10LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Td2l0Y2hTdG10TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgc3dpdGNoIHN0YXRlbWVudC4KKyAqIDxici8+SW4gPGNvZGU+c3dpdGNoKGEpIHsgLi4uIH08L2NvZGU+IHRoZSBzZWxlY3RvciBpcyAiYSIsCisgKiBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSB7IC4uLiB9IGFyZSB0aGUgZW50cmllcy4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqIEBzZWUgU3dpdGNoRW50cnlTdG10CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTd2l0Y2hTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBzZWxlY3RvcjsKKworICAgIHByaXZhdGUgTm9kZUxpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzOworCisgICAgcHVibGljIFN3aXRjaFN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5hbWVFeHByKCksIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBTd2l0Y2hTdG10KGZpbmFsIEV4cHJlc3Npb24gc2VsZWN0b3IsIGZpbmFsIE5vZGVMaXN0PFN3aXRjaEVudHJ5U3RtdD4gZW50cmllcykgeworICAgICAgICB0aGlzKG51bGwsIHNlbGVjdG9yLCBlbnRyaWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFN3aXRjaFN0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIHNlbGVjdG9yLCBOb2RlTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICAgICAgc2V0RW50cmllcyhlbnRyaWVzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8U3dpdGNoRW50cnlTdG10PiBnZXRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gZW50cmllczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3dpdGNoRW50cnlTdG10IGdldEVudHJ5KGludCBpKSB7CisgICAgICAgIHJldHVybiBnZXRFbnRyaWVzKCkuZ2V0KGkpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRTZWxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3dpdGNoU3RtdCBzZXRFbnRyaWVzKGZpbmFsIE5vZGVMaXN0PFN3aXRjaEVudHJ5U3RtdD4gZW50cmllcykgeworICAgICAgICBhc3NlcnROb3ROdWxsKGVudHJpZXMpOworICAgICAgICBpZiAoZW50cmllcyA9PSB0aGlzLmVudHJpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3dpdGNoU3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRU5UUklFUywgdGhpcy5lbnRyaWVzLCBlbnRyaWVzKTsKKyAgICAgICAgaWYgKHRoaXMuZW50cmllcyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGVudHJpZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYSBtZXRob2Qgb24gZ2V0RW50cmllcyBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3dpdGNoU3RtdCBzZXRFbnRyeShpbnQgaSwgU3dpdGNoRW50cnlTdG10IGVudHJ5KSB7CisgICAgICAgIGdldEVudHJpZXMoKS5zZXQoaSwgZW50cnkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYSBtZXRob2Qgb24gZ2V0RW50cmllcyBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3dpdGNoU3RtdCBhZGRFbnRyeShTd2l0Y2hFbnRyeVN0bXQgZW50cnkpIHsKKyAgICAgICAgZ2V0RW50cmllcygpLmFkZChlbnRyeSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3dpdGNoU3RtdCBzZXRTZWxlY3RvcihmaW5hbCBFeHByZXNzaW9uIHNlbGVjdG9yKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2VsZWN0b3IpOworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gdGhpcy5zZWxlY3RvcikgeworICAgICAgICAgICAgcmV0dXJuIChTd2l0Y2hTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5TRUxFQ1RPUiwgdGhpcy5zZWxlY3Rvciwgc2VsZWN0b3IpOworICAgICAgICBpZiAodGhpcy5zZWxlY3RvciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHNlbGVjdG9yKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJpZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBlbnRyaWVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU3dpdGNoU3RtdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChTd2l0Y2hTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTd2l0Y2hTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuc3dpdGNoU3RtdE1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW50cmllcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGVudHJpZXMuc2V0KGksIChTd2l0Y2hFbnRyeVN0bXQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgPT0gc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIHNldFNlbGVjdG9yKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNTd2l0Y2hTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN3aXRjaFN0bXQgYXNTd2l0Y2hTdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZTd2l0Y2hTdG10KENvbnN1bWVyPFN3aXRjaFN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U3dpdGNoU3RtdD4gdG9Td2l0Y2hTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N5bmNocm9uaXplZFN0bXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9TeW5jaHJvbml6ZWRTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZDUyNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9TeW5jaHJvbml6ZWRTdG10LmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5TeW5jaHJvbml6ZWRTdG10TWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFVzYWdlIG9mIHRoZSBzeW5jaHJvbml6ZWQga2V5d29yZC4KKyAqIDxici8+SW4gPGNvZGU+c3luY2hyb25pemVkIChhMTIzKSB7IC4uLiB9PC9jb2RlPiB0aGUgZXhwcmVzc2lvbiBpcyBhMTIzIGFuZCB7IC4uLiB9IGlzIHRoZSBib2R5CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTeW5jaHJvbml6ZWRTdG10IGV4dGVuZHMgU3RhdGVtZW50IGltcGxlbWVudHMgTm9kZVdpdGhCbG9ja1N0bXQ8U3luY2hyb25pemVkU3RtdD4sIE5vZGVXaXRoRXhwcmVzc2lvbjxTeW5jaHJvbml6ZWRTdG10PiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IGJvZHk7CisKKyAgICBwdWJsaWMgU3luY2hyb25pemVkU3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTmFtZUV4cHIoKSwgbmV3IEJsb2NrU3RtdCgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgU3luY2hyb25pemVkU3RtdChmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHRoaXMobnVsbCwgZXhwcmVzc2lvbiwgYm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCBCbG9ja1N0bXQgYm9keSkgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgc2V0Qm9keShib2R5KTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXQgc2V0RXhwcmVzc2lvbihmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChleHByZXNzaW9uKTsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gdGhpcy5leHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKFN5bmNocm9uaXplZFN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVYUFJFU1NJT04sIHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CisgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihleHByZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCbG9ja1N0bXQgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdG10IHNldEJvZHkoZmluYWwgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChib2R5KTsKKyAgICAgICAgaWYgKGJvZHkgPT0gdGhpcy5ib2R5KSB7CisgICAgICAgICAgICByZXR1cm4gKFN5bmNocm9uaXplZFN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFksIHRoaXMuYm9keSwgYm9keSk7CisgICAgICAgIGlmICh0aGlzLmJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYm9keS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFN5bmNocm9uaXplZFN0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5zeW5jaHJvbml6ZWRTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBib2R5KSB7CisgICAgICAgICAgICBzZXRCb2R5KChCbG9ja1N0bXQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBzZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXQgYXNTeW5jaHJvbml6ZWRTdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZTeW5jaHJvbml6ZWRTdG10KENvbnN1bWVyPFN5bmNocm9uaXplZFN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8U3luY2hyb25pemVkU3RtdD4gdG9TeW5jaHJvbml6ZWRTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1Rocm93U3RtdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1Rocm93U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmI4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVGhyb3dTdG10LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5UaHJvd1N0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogVXNhZ2Ugb2YgdGhlIHRocm93IHN0YXRlbWVudC4KKyAqIDxici8+PGNvZGU+dGhyb3cgbmV3IEV4Y2VwdGlvbigpPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhyb3dTdG10IGV4dGVuZHMgU3RhdGVtZW50IGltcGxlbWVudHMgTm9kZVdpdGhFeHByZXNzaW9uPFRocm93U3RtdD4geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisKKyAgICBwdWJsaWMgVGhyb3dTdG10KCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOYW1lRXhwcigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgVGhyb3dTdG10KGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzKG51bGwsIGV4cHJlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVGhyb3dTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVGhyb3dTdG10IHNldEV4cHJlc3Npb24oZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoZXhwcmVzc2lvbik7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IHRoaXMuZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIChUaHJvd1N0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVYUFJFU1NJT04sIHRoaXMuZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CisgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbi5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihleHByZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUaHJvd1N0bXQgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoVGhyb3dTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUaHJvd1N0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC50aHJvd1N0bXRNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Rocm93U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUaHJvd1N0bXQgYXNUaHJvd1N0bXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlRocm93U3RtdChDb25zdW1lcjxUaHJvd1N0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VGhyb3dTdG10PiB0b1Rocm93U3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UcnlTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHJ5U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNGE4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHJ5U3RtdC5qYXZhCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlRyeVN0bXRNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiA8aDE+VGhlIHRyeSBzdGF0ZW1lbnQ8L2gxPgorICogPGgyPkphdmEgMS4wLTY8L2gyPgorICogPHByZT4KKyAqIHRyeSB7CisgKiAvLyAuLi4KKyAqIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAqIC8vIC4uLgorICogfSBmaW5hbGx5IHsKKyAqIC8vIC4uLgorICogfQorICogPC9wcmU+CisgKiBJbiB0aGlzIGNvZGUsICIvLyBkbyB0aGluZ3MiIGlzIHRoZSBjb250ZW50IG9mIHRoZSB0cnlCbG9jaywgdGhlcmUgaXMgb25lIGNhdGNoIGNsYXVzZSB0aGF0IGNhdGNoZXMgSU9FeGNlcHRpb24gZSwKKyAqIGFuZCB0aGVyZSBpcyBhIGZpbmFsbHkgYmxvY2suCisgKiA8cD4KKyAqIFRoZSBjYXRjaCBhbmQgZmluYWxseSBibG9ja3MgYXJlIG9wdGlvbmFsLCBidXQgdGhleSBzaG91bGQgbm90IGJlIGVtcHR5IGF0IHRoZSBzYW1lIHRpbWUuCisgKiA8aDI+SmF2YSA3LTg8L2gyPgorICogPHByZT4KKyAqIHRyeSAoSW5wdXRTdHJlYW0gaSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oImZpbGUiKSkgeworICogLy8gLi4uCisgKiB9IGNhdGNoIChJT0V4Y2VwdGlvbnxOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgKiAvLyAuLi4KKyAqIH0gZmluYWxseSB7CisgKiAvLyAuLi4KKyAqIH0KKyAqIDwvcHJlPgorICogSmF2YSA3IGludHJvZHVjZWQgdHdvIHRoaW5nczoKKyAqIDx1bD4KKyAqIDxsaT5SZXNvdXJjZXMgY2FuIGJlIHNwZWNpZmllZCBhZnRlciAidHJ5IiwgYnV0IG9ubHkgdmFyaWFibGUgZGVjbGFyYXRpb25zIChWYXJpYWJsZURlY2xhcmF0aW9uRXhwci4pPC9saT4KKyAqIDxsaT5BIHNpbmdsZSBjYXRjaCBjYW4gY2F0Y2ggbXVsdGlwbGUgZXhjZXB0aW9uIHR5cGVzLiBUaGlzIHVzZXMgdGhlIEludGVyc2VjdGlvblR5cGUuPC9saT4KKyAqIDwvdWw+CisgKiA8aDI+SmF2YSA5KzwvaDI+CisgKiA8cHJlPgorICogdHJ5IChyKSB7CisgKiAvLyAuLi4KKyAqIH0gY2F0Y2ggKElPRXhjZXB0aW9ufE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAqIC8vIC4uLgorICogfSBmaW5hbGx5IHsKKyAqIC8vIC4uLgorICogfQorICogPC9wcmU+CisgKiBKYXZhIDkgZmluaXNoZXMgcmVzb3VyY2VzOiB5b3UgY2FuIG5vdyByZWZlciB0byBhIHJlc291cmNlIHRoYXQgd2FzIGRlY2xhcmVkIHNvbWV3aGVyZSBlbHNlLgorICogVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYWxsb3dlZDoKKyAqIDx1bD4KKyAqIDxsaT5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjogIlggeCA9IG5ldyBYKCkiIGxpa2UgaW4gSmF2YSA3LTguPC9saT4KKyAqIDxsaT5OYW1lRXhwcjogImEiLjwvbGk+CisgKiA8bGk+RmllbGRBY2Nlc3NFeHByOiAieC55LnoiLCAic3VwZXIudGVzdCIgZXRjLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICogQHNlZSBDYXRjaENsYXVzZQorICogQHNlZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuSW50ZXJzZWN0aW9uVHlwZQorICogQHNlZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByCisgKiBAc2VlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJ5U3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PEV4cHJlc3Npb24+IHJlc291cmNlczsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IHRyeUJsb2NrOworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hDbGF1c2VzOworCisgICAgQE9wdGlvbmFsUHJvcGVydHkKKyAgICBwcml2YXRlIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2s7CisKKyAgICBwdWJsaWMgVHJ5U3RtdCgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgQmxvY2tTdG10KCksIG5ldyBOb2RlTGlzdDw+KCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBUcnlTdG10KGZpbmFsIEJsb2NrU3RtdCB0cnlCbG9jaywgZmluYWwgTm9kZUxpc3Q8Q2F0Y2hDbGF1c2U+IGNhdGNoQ2xhdXNlcywgZmluYWwgQmxvY2tTdG10IGZpbmFsbHlCbG9jaykgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBOb2RlTGlzdDw+KCksIHRyeUJsb2NrLCBjYXRjaENsYXVzZXMsIGZpbmFsbHlCbG9jayk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFRyeVN0bXQoTm9kZUxpc3Q8RXhwcmVzc2lvbj4gcmVzb3VyY2VzLCBmaW5hbCBCbG9ja1N0bXQgdHJ5QmxvY2ssIGZpbmFsIE5vZGVMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaENsYXVzZXMsIGZpbmFsIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2spIHsKKyAgICAgICAgdGhpcyhudWxsLCByZXNvdXJjZXMsIHRyeUJsb2NrLCBjYXRjaENsYXVzZXMsIGZpbmFsbHlCbG9jayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10KFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gcmVzb3VyY2VzLCBCbG9ja1N0bXQgdHJ5QmxvY2ssIE5vZGVMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaENsYXVzZXMsIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2spIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldFJlc291cmNlcyhyZXNvdXJjZXMpOworICAgICAgICBzZXRUcnlCbG9jayh0cnlCbG9jayk7CisgICAgICAgIHNldENhdGNoQ2xhdXNlcyhjYXRjaENsYXVzZXMpOworICAgICAgICBzZXRGaW5hbGx5QmxvY2soZmluYWxseUJsb2NrKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8Q2F0Y2hDbGF1c2U+IGdldENhdGNoQ2xhdXNlcygpIHsKKyAgICAgICAgcmV0dXJuIGNhdGNoQ2xhdXNlczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPEJsb2NrU3RtdD4gZ2V0RmluYWxseUJsb2NrKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShmaW5hbGx5QmxvY2spOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQmxvY2tTdG10IGdldFRyeUJsb2NrKCkgeworICAgICAgICByZXR1cm4gdHJ5QmxvY2s7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxFeHByZXNzaW9uPiBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10IHNldENhdGNoQ2xhdXNlcyhmaW5hbCBOb2RlTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hDbGF1c2VzKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2F0Y2hDbGF1c2VzKTsKKyAgICAgICAgaWYgKGNhdGNoQ2xhdXNlcyA9PSB0aGlzLmNhdGNoQ2xhdXNlcykgeworICAgICAgICAgICAgcmV0dXJuIChUcnlTdG10KSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5DQVRDSF9DTEFVU0VTLCB0aGlzLmNhdGNoQ2xhdXNlcywgY2F0Y2hDbGF1c2VzKTsKKyAgICAgICAgaWYgKHRoaXMuY2F0Y2hDbGF1c2VzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNhdGNoQ2xhdXNlcy5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmNhdGNoQ2xhdXNlcyA9IGNhdGNoQ2xhdXNlczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoY2F0Y2hDbGF1c2VzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10IHNldEZpbmFsbHlCbG9jayhmaW5hbCBCbG9ja1N0bXQgZmluYWxseUJsb2NrKSB7CisgICAgICAgIGlmIChmaW5hbGx5QmxvY2sgPT0gdGhpcy5maW5hbGx5QmxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiAoVHJ5U3RtdCkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRklOQUxMWV9CTE9DSywgdGhpcy5maW5hbGx5QmxvY2ssIGZpbmFsbHlCbG9jayk7CisgICAgICAgIGlmICh0aGlzLmZpbmFsbHlCbG9jayAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5maW5hbGx5QmxvY2suc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5maW5hbGx5QmxvY2sgPSBmaW5hbGx5QmxvY2s7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGZpbmFsbHlCbG9jayk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHJ5U3RtdCBzZXRUcnlCbG9jayhmaW5hbCBCbG9ja1N0bXQgdHJ5QmxvY2spIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0cnlCbG9jayk7CisgICAgICAgIGlmICh0cnlCbG9jayA9PSB0aGlzLnRyeUJsb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gKFRyeVN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRSWV9CTE9DSywgdGhpcy50cnlCbG9jaywgdHJ5QmxvY2spOworICAgICAgICBpZiAodGhpcy50cnlCbG9jayAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50cnlCbG9jay5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLnRyeUJsb2NrID0gdHJ5QmxvY2s7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRyeUJsb2NrKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10IHNldFJlc291cmNlcyhmaW5hbCBOb2RlTGlzdDxFeHByZXNzaW9uPiByZXNvdXJjZXMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNvdXJjZXMpOworICAgICAgICBpZiAocmVzb3VyY2VzID09IHRoaXMucmVzb3VyY2VzKSB7CisgICAgICAgICAgICByZXR1cm4gKFRyeVN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlJFU09VUkNFUywgdGhpcy5yZXNvdXJjZXMsIHJlc291cmNlcyk7CisgICAgICAgIGlmICh0aGlzLnJlc291cmNlcyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHJlc291cmNlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGNoQ2xhdXNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhdGNoQ2xhdXNlcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGNhdGNoQ2xhdXNlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbmFsbHlCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBmaW5hbGx5QmxvY2spIHsKKyAgICAgICAgICAgICAgICByZW1vdmVGaW5hbGx5QmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlc291cmNlcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIHJlc291cmNlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10IHJlbW92ZUZpbmFsbHlCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIHNldEZpbmFsbHlCbG9jaygoQmxvY2tTdG10KSBudWxsKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10IHJlbW92ZVRyeUJsb2NrKCkgeworICAgICAgICByZXR1cm4gc2V0VHJ5QmxvY2soKEJsb2NrU3RtdCkgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUcnlTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFRyeVN0bXQpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFRyeVN0bXRNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC50cnlTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGNoQ2xhdXNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhdGNoQ2xhdXNlcy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGNhdGNoQ2xhdXNlcy5zZXQoaSwgKENhdGNoQ2xhdXNlKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmaW5hbGx5QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gZmluYWxseUJsb2NrKSB7CisgICAgICAgICAgICAgICAgc2V0RmluYWxseUJsb2NrKChCbG9ja1N0bXQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuc2V0KGksIChFeHByZXNzaW9uKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlID09IHRyeUJsb2NrKSB7CisgICAgICAgICAgICBzZXRUcnlCbG9jaygoQmxvY2tTdG10KSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNUcnlTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFRyeVN0bXQgYXNUcnlTdG10KCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZUcnlTdG10KENvbnN1bWVyPFRyeVN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VHJ5U3RtdD4gdG9UcnlTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1VucGFyc2FibGVTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVW5wYXJzYWJsZVN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdmYzAxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1VucGFyc2FibGVTdG10LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlVucGFyc2FibGVTdG10TWV0YU1vZGVsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuUGFyc2VkbmVzcy4qOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSBzdGF0ZW1lbnQgdGhhdCBoYWQgcGFyc2UgZXJyb3JzLgorICogTm90aGluZyBpcyBrbm93biBhYm91dCBpdCBleGNlcHQgdGhlIHRva2VucyBpdCBjb3ZlcnMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbnBhcnNhYmxlU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgVW5wYXJzYWJsZVN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBVbnBhcnNhYmxlU3RtdChUb2tlblJhbmdlIHRva2VuUmFuZ2UpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIFVucGFyc2FibGVTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFVucGFyc2FibGVTdG10KSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBVbnBhcnNhYmxlU3RtdE1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLnVucGFyc2FibGVTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJzZWRuZXNzIGdldFBhcnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIFVOUEFSU0FCTEU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVW5wYXJzYWJsZVN0bXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5wYXJzYWJsZVN0bXQgYXNVbnBhcnNhYmxlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVW5wYXJzYWJsZVN0bXQoQ29uc3VtZXI8VW5wYXJzYWJsZVN0bXQ+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VW5wYXJzYWJsZVN0bXQ+IHRvVW5wYXJzYWJsZVN0bXQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvV2hpbGVTdG10LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvV2hpbGVTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMWY5OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9XaGlsZVN0bXQuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJvZHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhDb25kaXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5XaGlsZVN0bXRNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQSB3aGlsZSBzdGF0ZW1lbnQuCisgKiA8YnIvPjxjb2RlPndoaWxlKHRydWUpIHsgLi4uIH08L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXaGlsZVN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aEJvZHk8V2hpbGVTdG10PiwgTm9kZVdpdGhDb25kaXRpb248V2hpbGVTdG10PiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gY29uZGl0aW9uOworCisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgYm9keTsKKworICAgIHB1YmxpYyBXaGlsZVN0bXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IEJvb2xlYW5MaXRlcmFsRXhwcigpLCBuZXcgUmV0dXJuU3RtdCgpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgV2hpbGVTdG10KGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uLCBmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworICAgICAgICB0aGlzKG51bGwsIGNvbmRpdGlvbiwgYm9keSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBXaGlsZVN0bXQoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgU3RhdGVtZW50IGJvZHkpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldENvbmRpdGlvbihjb25kaXRpb24pOworICAgICAgICBzZXRCb2R5KGJvZHkpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFdoaWxlU3RtdCBzZXRCb2R5KGZpbmFsIFN0YXRlbWVudCBib2R5KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoYm9keSk7CisgICAgICAgIGlmIChib2R5ID09IHRoaXMuYm9keSkgeworICAgICAgICAgICAgcmV0dXJuIChXaGlsZVN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFksIHRoaXMuYm9keSwgYm9keSk7CisgICAgICAgIGlmICh0aGlzLmJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuYm9keS5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBXaGlsZVN0bXQgc2V0Q29uZGl0aW9uKGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZGl0aW9uKTsKKyAgICAgICAgaWYgKGNvbmRpdGlvbiA9PSB0aGlzLmNvbmRpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIChXaGlsZVN0bXQpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkNPTkRJVElPTiwgdGhpcy5jb25kaXRpb24sIGNvbmRpdGlvbik7CisgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5jb25kaXRpb24uc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGNvbmRpdGlvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2hpbGVTdG10IGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFdoaWxlU3RtdCkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2hpbGVTdG10TWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwud2hpbGVTdG10TWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZSA9PSBib2R5KSB7CisgICAgICAgICAgICBzZXRCb2R5KChTdGF0ZW1lbnQpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBjb25kaXRpb24pIHsKKyAgICAgICAgICAgIHNldENvbmRpdGlvbigoRXhwcmVzc2lvbikgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzV2hpbGVTdG10KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFdoaWxlU3RtdCBhc1doaWxlU3RtdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmV2hpbGVTdG10KENvbnN1bWVyPFdoaWxlU3RtdD4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxXaGlsZVN0bXQ+IHRvV2hpbGVTdG10KCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0FycmF5VHlwZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0FycmF5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZGJhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvQXJyYXlUeXBlLmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkFycmF5VHlwZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRBcnJheVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Qubm9kZUxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBUbyBpbmRpY2F0ZSB0aGF0IGEgdHlwZSBpcyBhbiBhcnJheSwgaXQgZ2V0cyB3cmFwcGVkIGluIGFuIEFycmF5VHlwZSBmb3IgZXZlcnkgYXJyYXkgbGV2ZWwgaXQgaGFzLgorICogU28sIGludFtdW10gYmVjb21lcyBBcnJheVR5cGUoQXJyYXlUeXBlKGludCkpLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8QXJyYXlUeXBlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRBcnJheVR5cGUgcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkudG9SZXNvbHZlZFR5cGUodGhpcywgUmVzb2x2ZWRBcnJheVR5cGUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW4gb2YgYSBwYWlyIG9mIGFycmF5IGJyYWNrZXRzIFtdLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIE9yaWdpbiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBbXSB3ZXJlIGZvdW5kIG9uIHRoZSBuYW1lLCBsaWtlICJpbnQgYVtdIiBvciAiU3RyaW5nIGFiYygpW11bXSIKKyAgICAgICAgICovCisgICAgICAgIE5BTUUsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgW10gd2VyZSBmb3VuZCBvbiB0aGUgdHlwZSwgbGlrZSAiaW50W10gYSIgb3IgIlN0cmluZ1tdW10gYWJjKCkiCisgICAgICAgICAqLworICAgICAgICBUWVBFCisgICAgfQorCisgICAgcHJpdmF0ZSBUeXBlIGNvbXBvbmVudFR5cGU7CisKKyAgICBwcml2YXRlIE9yaWdpbiBvcmlnaW47CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQXJyYXlUeXBlKFR5cGUgY29tcG9uZW50VHlwZSwgT3JpZ2luIG9yaWdpbiwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMobnVsbCwgY29tcG9uZW50VHlwZSwgb3JpZ2luLCBhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5VHlwZShUeXBlIHR5cGUsIEFubm90YXRpb25FeHByLi4uIGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXModHlwZSwgT3JpZ2luLlRZUEUsIG5vZGVMaXN0KGFubm90YXRpb25zKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheVR5cGUoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBUeXBlIGNvbXBvbmVudFR5cGUsIE9yaWdpbiBvcmlnaW4sIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldENvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZSk7CisgICAgICAgIHNldE9yaWdpbihvcmlnaW4pOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlIGdldENvbXBvbmVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBjb21wb25lbnRUeXBlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQXJyYXlUeXBlIHNldENvbXBvbmVudFR5cGUoZmluYWwgVHlwZSBjb21wb25lbnRUeXBlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcG9uZW50VHlwZSk7CisgICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IHRoaXMuY29tcG9uZW50VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIChBcnJheVR5cGUpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkNPTVBPTkVOVF9UWVBFLCB0aGlzLmNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFR5cGUpOworICAgICAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoY29tcG9uZW50VHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGxpc3RzIG9mIGFycmF5QnJhY2tldFBhaXJzLCBhc3N1bWVzIHRoZSBsaXN0cyBhcmUgb3JkZXJlZCBsZWZ0IHRvIHJpZ2h0IGFuZCB0aGUgcGFpcnMgYXJlIG9yZGVyZWQgbGVmdCB0bworICAgICAqIHJpZ2h0LCBtaXJyb3JpbmcgdGhlIGFjdHVhbCBjb2RlLiBUaGUgdHlwZSBnZXRzIHdyYXBwZWQgaW4gQXJyYXlUeXBlcyBzbyB0aGF0IHRoZSBvdXRlcm1vc3QgQXJyYXlUeXBlIGNvcnJlc3BvbmRzCisgICAgICogdG8gdGhlIHJpZ2h0bW9zdCBBcnJheUJyYWNrZXRQYWlyLgorICAgICAqLworICAgIEBTYWZlVmFyYXJncworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB3cmFwSW5BcnJheVR5cGVzKFR5cGUgdHlwZSwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPi4uLiBhcnJheUJyYWNrZXRQYWlyTGlzdHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGFycmF5QnJhY2tldFBhaXJMaXN0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyTGlzdCA9IGFycmF5QnJhY2tldFBhaXJMaXN0c1tpXTsKKyAgICAgICAgICAgIGlmIChhcnJheUJyYWNrZXRQYWlyTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGFycmF5QnJhY2tldFBhaXJMaXN0LnNpemUoKSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5QnJhY2tldFBhaXIgcGFpciA9IGFycmF5QnJhY2tldFBhaXJMaXN0LmdldChqKTsKKyAgICAgICAgICAgICAgICAgICAgVG9rZW5SYW5nZSB0b2tlblJhbmdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VG9rZW5SYW5nZSgpLmlzUHJlc2VudCgpICYmIHBhaXIuZ2V0VG9rZW5SYW5nZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblJhbmdlID0gbmV3IFRva2VuUmFuZ2UodHlwZS5nZXRUb2tlblJhbmdlKCkuZ2V0KCkuZ2V0QmVnaW4oKSwgcGFpci5nZXRUb2tlblJhbmdlKCkuZ2V0KCkuZ2V0RW5kKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBuZXcgQXJyYXlUeXBlKHRva2VuUmFuZ2UsIHR5cGUsIHBhaXIuZ2V0T3JpZ2luKCksIHBhaXIuZ2V0QW5ub3RhdGlvbnMoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblJhbmdlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuc2V0UmFuZ2UodG9rZW5SYW5nZS50b1JhbmdlKCkuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGEgdHlwZSB0aGF0IG1heSBiZSBhbiBBcnJheVR5cGUuIFVud3JhcHMgQXJyYXlUeXBlcyB1bnRpbCB0aGUgZWxlbWVudCB0eXBlIGlzIGZvdW5kLgorICAgICAqCisgICAgICogQHJldHVybiBhIHBhaXIgb2YgdGhlIGVsZW1lbnQgdHlwZSwgYW5kIHRoZSB1bndyYXBwZWQgQXJyYXlUeXBlcywgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFpcjxUeXBlLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+PiB1bndyYXBBcnJheVR5cGVzKFR5cGUgdHlwZSkgeworICAgICAgICBmaW5hbCBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzID0gbmV3IEFycmF5TGlzdDw+KDApOworICAgICAgICB3aGlsZSAodHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSkgeworICAgICAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICBhcnJheUJyYWNrZXRQYWlycy5hZGQobmV3IEFycmF5QnJhY2tldFBhaXIodHlwZS5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBhcnJheVR5cGUuZ2V0T3JpZ2luKCksIGFycmF5VHlwZS5nZXRBbm5vdGF0aW9ucygpKSk7CisgICAgICAgICAgICB0eXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFBhaXI8Pih0eXBlLCBhcnJheUJyYWNrZXRQYWlycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFpciBvZiBicmFja2V0cyBpbiBhIG5vbi1yZWN1cnNpdmUgd2F5CisgICAgICogKHVubGlrZSBBcnJheVR5cGUuKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJyYXlCcmFja2V0UGFpciB7CisKKyAgICAgICAgcHJpdmF0ZSBUb2tlblJhbmdlIHRva2VuUmFuZ2U7CisKKyAgICAgICAgcHJpdmF0ZSBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuZXcgTm9kZUxpc3Q8PigpOworCisgICAgICAgIHByaXZhdGUgT3JpZ2luIG9yaWdpbjsKKworICAgICAgICBwdWJsaWMgQXJyYXlCcmFja2V0UGFpcihUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE9yaWdpbiBvcmlnaW4sIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgc2V0VG9rZW5SYW5nZSh0b2tlblJhbmdlKTsKKyAgICAgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIHNldE9yaWdpbihvcmlnaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBcnJheUJyYWNrZXRQYWlyIHNldEFubm90YXRpb25zKE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXJyYXlCcmFja2V0UGFpciBzZXRUb2tlblJhbmdlKFRva2VuUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgICAgIHRoaXMudG9rZW5SYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3B0aW9uYWw8VG9rZW5SYW5nZT4gZ2V0VG9rZW5SYW5nZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHRva2VuUmFuZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9yaWdpbiBnZXRPcmlnaW4oKSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFycmF5QnJhY2tldFBhaXIgc2V0T3JpZ2luKE9yaWdpbiBvcmlnaW4pIHsKKyAgICAgICAgICAgIHRoaXMub3JpZ2luID0gYXNzZXJ0Tm90TnVsbChvcmlnaW4pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXJyYXlUeXBlIHNldEFubm90YXRpb25zKE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICByZXR1cm4gKEFycmF5VHlwZSkgc3VwZXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3JpZ2luIGdldE9yaWdpbigpIHsKKyAgICAgICAgcmV0dXJuIG9yaWdpbjsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEFycmF5VHlwZSBzZXRPcmlnaW4oZmluYWwgT3JpZ2luIG9yaWdpbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKG9yaWdpbik7CisgICAgICAgIGlmIChvcmlnaW4gPT0gdGhpcy5vcmlnaW4pIHsKKyAgICAgICAgICAgIHJldHVybiAoQXJyYXlUeXBlKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5PUklHSU4sIHRoaXMub3JpZ2luLCBvcmlnaW4pOworICAgICAgICB0aGlzLm9yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGUuYXNTdHJpbmcoKSArICJbXSI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheVR5cGUgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQXJyYXlUeXBlKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheVR5cGVNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5hcnJheVR5cGVNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IGNvbXBvbmVudFR5cGUpIHsKKyAgICAgICAgICAgIHNldENvbXBvbmVudFR5cGUoKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheVR5cGUgYXNBcnJheVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkFycmF5VHlwZShDb25zdW1lcjxBcnJheVR5cGU+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXJyYXlUeXBlPiB0b0FycmF5VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9DbGFzc09ySW50ZXJmYWNlVHlwZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0NsYXNzT3JJbnRlcmZhY2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNjg0NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9DbGFzc09ySW50ZXJmYWNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5qb2luaW5nOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuT3B0aW9uYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIEEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlIHR5cGUuIDxici8+PGNvZGU+T2JqZWN0PC9jb2RlPiA8YnIvPjxjb2RlPkhhc2hNYXAmbHQ7U3RyaW5nLCBTdHJpbmc+PC9jb2RlPgorICogPGJyLz48Y29kZT5qYXZhLnV0aWwuUHVuY2hjYXJkPC9jb2RlPgorICogPHA+CisgKiA8cD5Ob3RlIHRoYXQgdGhlIHN5bnRheCBpcyBhbWJpZ3VvdXMgaGVyZSwgYW5kIEphdmFQYXJzZXIgZG9lcyBub3Qga25vdyB3aGF0IGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBjbGFzcy4gSXQgYXNzdW1lcworICogY2FzZXMgbGlrZSA8Y29kZT5NYXAuRW50cnk8L2NvZGU+IHdoZXJlIE1hcCBpcyB0aGUgc2NvcGUgb2YgRW50cnkuIEluIDxjb2RlPmphdmEudXRpbC5QdW5jaGNhcmQ8L2NvZGU+LCBpdCB3aWxsIG5vdAorICogcmVjb2duaXplIHRoYXQgamF2YSBhbmQgdXRpbCBhcmUgcGFydHMgb2YgdGhlIHBhY2thZ2UgbmFtZS4gSW5zdGVhZCwgaXQgd2lsbCBzZXQgdXRpbCBhcyB0aGUgc2NvcGUgb2YgUHVuY2hjYXJkLCBhcyBhCisgKiBDbGFzc09ySW50ZXJmYWNlVHlwZSAod2hpY2ggaXQgaXMgbm90LikgSW4gdHVybiwgdXRpbCB3aWxsIGhhdmUgamF2YSBhcyBpdHMgc2NvcGUsIGFsc28gYXMgYQorICogQ2xhc3NPckludGVyZmFjZVR5cGU8L3A+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc09ySW50ZXJmYWNlVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUgaW1wbGVtZW50cyBOb2RlV2l0aFNpbXBsZU5hbWU8Q2xhc3NPckludGVyZmFjZVR5cGU+LCBOb2RlV2l0aEFubm90YXRpb25zPENsYXNzT3JJbnRlcmZhY2VUeXBlPiwgTm9kZVdpdGhUeXBlQXJndW1lbnRzPENsYXNzT3JJbnRlcmZhY2VUeXBlPiB7CisKKyAgICBAT3B0aW9uYWxQcm9wZXJ0eQorICAgIHByaXZhdGUgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGU7CisKKyAgICBwcml2YXRlIFNpbXBsZU5hbWUgbmFtZTsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzOworCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIG5ldyBTaW1wbGVOYW1lKCksIG51bGwsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBKYXZhUGFyc2VyLnBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGUgaW5zdGVhZC4gVGhpcyBjb25zdHJ1Y3RvciBkb2VzIG5vdCB1bmRlcnN0YW5kIGdlbmVyaWNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBudWxsLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGUsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobnVsbCwgc2NvcGUsIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBudWxsLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGUsIGZpbmFsIFNpbXBsZU5hbWUgbmFtZSwgZmluYWwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cykgeworICAgICAgICB0aGlzKG51bGwsIHNjb3BlLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGUsIGZpbmFsIFNpbXBsZU5hbWUgbmFtZSwgZmluYWwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cywgZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMobnVsbCwgc2NvcGUsIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGUsIFNpbXBsZU5hbWUgbmFtZSwgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cywgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UsIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBTaW1wbGVOYW1lIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShzY29wZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNCb3hlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBQcmltaXRpdmVUeXBlLnVuYm94TWFwLmNvbnRhaW5zS2V5KG5hbWUuZ2V0SWRlbnRpZmllcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbWl0aXZlVHlwZSB0b1VuYm94ZWRUeXBlKCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc0JveGVkVHlwZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obmFtZSArICIgaXNuJ3QgYSBib3hlZCB0eXBlLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnVuYm94TWFwLmdldChuYW1lLmdldElkZW50aWZpZXIoKSkpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgc2V0TmFtZShmaW5hbCBTaW1wbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gdGhpcy5uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLCB0aGlzLm5hbWUsIG5hbWUpOworICAgICAgICBpZiAodGhpcy5uYW1lICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNjb3BlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIENsYXNzT3JJbnRlcmZhY2VUeXBlCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBzZXRTY29wZShmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBzY29wZSkgeworICAgICAgICBpZiAoc2NvcGUgPT0gdGhpcy5zY29wZSkgeworICAgICAgICAgICAgcmV0dXJuIChDbGFzc09ySW50ZXJmYWNlVHlwZSkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuU0NPUEUsIHRoaXMuc2NvcGUsIHNjb3BlKTsKKyAgICAgICAgaWYgKHRoaXMuc2NvcGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuc2NvcGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihzY29wZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Tm9kZUxpc3Q8VHlwZT4+IGdldFR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKHR5cGVBcmd1bWVudHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHR5cGVBcmd1bWVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlQXJndW1lbnRzIHRoZSB0eXBlQXJndW1lbnRzLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIENsYXNzT3JJbnRlcmZhY2VUeXBlCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gdGhpcy50eXBlQXJndW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0aGlzOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFX0FSR1VNRU5UUywgdGhpcy50eXBlQXJndW1lbnRzLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy50eXBlQXJndW1lbnRzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVBcmd1bWVudHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgc2V0QW5ub3RhdGlvbnMoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHN1cGVyLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHNjb3BlKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlU2NvcGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBnZXRTY29wZSgpLmlmUHJlc2VudChzIC0+IHN0ci5hcHBlbmQocy5hc1N0cmluZygpKS5hcHBlbmQoIi4iKSk7CisgICAgICAgIHN0ci5hcHBlbmQobmFtZS5hc1N0cmluZygpKTsKKyAgICAgICAgZ2V0VHlwZUFyZ3VtZW50cygpLmlmUHJlc2VudCh0YSAtPiBzdHIuYXBwZW5kKHRhLnN0cmVhbSgpLm1hcChUeXBlOjphc1N0cmluZykuY29sbGVjdChqb2luaW5nKCIsIiwgIjwiLCAiPiIpKSkpOworICAgICAgICByZXR1cm4gc3RyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgcmVtb3ZlU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzZXRTY29wZSgoQ2xhc3NPckludGVyZmFjZVR5cGUpIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwuY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChub2RlID09IG5hbWUpIHsKKyAgICAgICAgICAgIHNldE5hbWUoKFNpbXBsZU5hbWUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gc2NvcGUpIHsKKyAgICAgICAgICAgICAgICBzZXRTY29wZSgoQ2xhc3NPckludGVyZmFjZVR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzT3JJbnRlcmZhY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIGFzQ2xhc3NPckludGVyZmFjZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkNsYXNzT3JJbnRlcmZhY2VUeXBlKENvbnN1bWVyPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xSZXNvbHZlcigpLnRvUmVzb2x2ZWRUeXBlKHRoaXMsIFJlc29sdmVkUmVmZXJlbmNlVHlwZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdG9DbGFzc09ySW50ZXJmYWNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9JbnRlcnNlY3Rpb25UeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvSW50ZXJzZWN0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTA1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvSW50ZXJzZWN0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5JbnRlcnNlY3Rpb25UeXBlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5qb2luaW5nOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkSW50ZXJzZWN0aW9uVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2V0IG9mIHR5cGVzLiBBIGdpdmVuIHZhbHVlIG9mIHRoaXMgdHlwZSBoYXMgdG8gYmUgYXNzaWduYWJsZSB0byBhdCBhbGwgb2YgdGhlIGVsZW1lbnQgdHlwZXMuCisgKiBBcyBvZiBKYXZhIDggaXQgaXMgdXNlZCBpbiBjYXN0cyBvciB3aGlsZSBleHByZXNzaW5nIGJvdW5kcyBmb3IgZ2VuZXJpYyB0eXBlcy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8Y29kZT5wdWJsaWMgY2xhc3MgQSZsdDtUIGV4dGVuZHMgU2VyaWFsaXphYmxlICZhbXA7IENsb25lYWJsZSZndDsgeyB9PC9jb2RlPgorICogPHA+CisgKiBPcjoKKyAqIDxjb2RlPnZvaWQgZm9vKChTZXJpYWxpemFibGUgJmFtcDsgQ2xvbmVhYmxlKW15T2JqZWN0KTs8L2NvZGU+CisgKgorICogQHNpbmNlIDMuMC4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnRlcnNlY3Rpb25UeXBlIGV4dGVuZHMgVHlwZSBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8SW50ZXJzZWN0aW9uVHlwZT4geworCisgICAgQE5vbkVtcHR5UHJvcGVydHkKKyAgICBwcml2YXRlIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzOworCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIEludGVyc2VjdGlvblR5cGUoTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBlbGVtZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlcnNlY3Rpb25UeXBlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIHNldEVsZW1lbnRzKGVsZW1lbnRzKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZ2V0RWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVyc2VjdGlvblR5cGUgc2V0RWxlbWVudHMoZmluYWwgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtZW50cyk7CisgICAgICAgIGlmIChlbGVtZW50cyA9PSB0aGlzLmVsZW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKEludGVyc2VjdGlvblR5cGUpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkVMRU1FTlRTLCB0aGlzLmVsZW1lbnRzLCBlbGVtZW50cyk7CisgICAgICAgIGlmICh0aGlzLmVsZW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZWxlbWVudHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW50ZXJzZWN0aW9uVHlwZSBzZXRBbm5vdGF0aW9ucyhOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIChJbnRlcnNlY3Rpb25UeXBlKSBzdXBlci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50cy5zdHJlYW0oKS5tYXAoVHlwZTo6YXNTdHJpbmcpLmNvbGxlY3Qoam9pbmluZygiJiIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVyc2VjdGlvblR5cGUgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoSW50ZXJzZWN0aW9uVHlwZSkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZXJzZWN0aW9uVHlwZU1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLmludGVyc2VjdGlvblR5cGVNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50cy5nZXQoaSkgPT0gbm9kZSkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNldChpLCAoUmVmZXJlbmNlVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyc2VjdGlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZXJzZWN0aW9uVHlwZSBhc0ludGVyc2VjdGlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkludGVyc2VjdGlvblR5cGUoQ29uc3VtZXI8SW50ZXJzZWN0aW9uVHlwZT4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkSW50ZXJzZWN0aW9uVHlwZSByZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS50b1Jlc29sdmVkVHlwZSh0aGlzLCBSZXNvbHZlZEludGVyc2VjdGlvblR5cGUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8SW50ZXJzZWN0aW9uVHlwZT4gdG9JbnRlcnNlY3Rpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1ByaW1pdGl2ZVR5cGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9QcmltaXRpdmVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1OWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9QcmltaXRpdmVUeXBlLmphdmEKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlByaW1pdGl2ZVR5cGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBBIHByaW1pdGl2ZSB0eXBlLgorICogPGJyLz48Y29kZT5pbnQ8L2NvZGU+CisgKiA8YnIvPjxjb2RlPmJvb2xlYW48L2NvZGU+CisgKiA8YnIvPjxjb2RlPnNob3J0PC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJpbWl0aXZlVHlwZSBleHRlbmRzIFR5cGUgaW1wbGVtZW50cyBOb2RlV2l0aEFubm90YXRpb25zPFByaW1pdGl2ZVR5cGU+IHsKKworICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlVHlwZSBib29sZWFuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5CT09MRUFOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByaW1pdGl2ZVR5cGUgY2hhclR5cGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuQ0hBUik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcmltaXRpdmVUeXBlIGJ5dGVUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkJZVEUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlVHlwZSBzaG9ydFR5cGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuU0hPUlQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlVHlwZSBpbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLklOVCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcmltaXRpdmVUeXBlIGxvbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkxPTkcpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlVHlwZSBmbG9hdFR5cGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuRkxPQVQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlVHlwZSBkb3VibGVUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkRPVUJMRSk7CisgICAgfQorCisgICAgcHVibGljIGVudW0gUHJpbWl0aXZlIHsKKworICAgICAgICBCT09MRUFOKCJCb29sZWFuIiksCisgICAgICAgIENIQVIoIkNoYXJhY3RlciIpLAorICAgICAgICBCWVRFKCJCeXRlIiksCisgICAgICAgIFNIT1JUKCJTaG9ydCIpLAorICAgICAgICBJTlQoIkludGVnZXIiKSwKKyAgICAgICAgTE9ORygiTG9uZyIpLAorICAgICAgICBGTE9BVCgiRmxvYXQiKSwKKyAgICAgICAgRE9VQkxFKCJEb3VibGUiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZU9mQm94ZWRUeXBlOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvZGVSZXByZXNlbnRhdGlvbjsKKworICAgICAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgdG9Cb3hlZFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZShuYW1lT2ZCb3hlZFR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBjb2RlUmVwcmVzZW50YXRpb247CisgICAgICAgIH0KKworICAgICAgICBQcmltaXRpdmUoU3RyaW5nIG5hbWVPZkJveGVkVHlwZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lT2ZCb3hlZFR5cGUgPSBuYW1lT2ZCb3hlZFR5cGU7CisgICAgICAgICAgICB0aGlzLmNvZGVSZXByZXNlbnRhdGlvbiA9IG5hbWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmU+IHVuYm94TWFwID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChQcmltaXRpdmUgdW5ib3hlZFR5cGUgOiBQcmltaXRpdmUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIHVuYm94TWFwLnB1dCh1bmJveGVkVHlwZS5uYW1lT2ZCb3hlZFR5cGUsIHVuYm94ZWRUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUHJpbWl0aXZlIHR5cGU7CisKKyAgICBwdWJsaWMgUHJpbWl0aXZlVHlwZSgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBQcmltaXRpdmUuSU5ULCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbWl0aXZlVHlwZShmaW5hbCBQcmltaXRpdmUgdHlwZSkgeworICAgICAgICB0aGlzKG51bGwsIHR5cGUsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIEBBbGxGaWVsZHNDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBQcmltaXRpdmVUeXBlKGZpbmFsIFByaW1pdGl2ZSB0eXBlLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCB0eXBlLCBhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQcmltaXRpdmVUeXBlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgUHJpbWl0aXZlIHR5cGUsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFByaW1pdGl2ZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgdG9Cb3hlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlLnRvQm94ZWRUeXBlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQcmltaXRpdmVUeXBlIHNldFR5cGUoZmluYWwgUHJpbWl0aXZlIHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gdGhpcy50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKFByaW1pdGl2ZVR5cGUpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUsIHRoaXMudHlwZSwgdHlwZSk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0eXBlLmFzU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByaW1pdGl2ZVR5cGUgc2V0QW5ub3RhdGlvbnMoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiAoUHJpbWl0aXZlVHlwZSkgc3VwZXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUHJpbWl0aXZlVHlwZSBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChQcmltaXRpdmVUeXBlKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBQcmltaXRpdmVUeXBlTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwucHJpbWl0aXZlVHlwZU1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFByaW1pdGl2ZVR5cGUgYXNQcmltaXRpdmVUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZQcmltaXRpdmVUeXBlKENvbnN1bWVyPFByaW1pdGl2ZVR5cGU+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFByaW1pdGl2ZVR5cGUgcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkudG9SZXNvbHZlZFR5cGUodGhpcywgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFByaW1pdGl2ZVR5cGU+IHRvUHJpbWl0aXZlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9SZWZlcmVuY2VUeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWVlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5SZWZlcmVuY2VUeXBlTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgcmVmZXJlbmNlIHR5cGVzLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmZXJlbmNlVHlwZSBleHRlbmRzIFR5cGUgeworCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGUoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMobnVsbCwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmVmZXJlbmNlVHlwZShUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSZWZlcmVuY2VUeXBlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFJlZmVyZW5jZVR5cGUpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGVNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC5yZWZlcmVuY2VUeXBlTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmVmZXJlbmNlVHlwZSBhc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlJlZmVyZW5jZVR5cGUoQ29uc3VtZXI8UmVmZXJlbmNlVHlwZT4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxSZWZlcmVuY2VUeXBlPiB0b1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVHlwZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FmNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGUuamF2YQpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5EYXRhS2V5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlR5cGVNZXRhTW9kZWw7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlJlc29sdmFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uU3ltYm9sUmVzb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHR5cGVzLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZSBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBSZXNvbHZhYmxlPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBTZXZlcmFsIHN1YiBjbGFzc2VzIGRvIG5vdCBzdXBwb3J0IGFubm90YXRpb25zLgorICAgICAqIFRoaXMgaXMgYSBzdXBwb3J0IGNvbnN0cnVjdG9yIGZvciB0aGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCBUeXBlKFRva2VuUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgdGhpcyhyYW5nZSwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFR5cGUoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMobnVsbCwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZShUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlKTsKKyAgICAgICAgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25FeHByIGdldEFubm90YXRpb24oaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zKCkuZ2V0KGkpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZSBzZXRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSB0aGlzLmFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKFR5cGUpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LkFOTk9UQVRJT05TLCB0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25zICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmFubm90YXRpb25zLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgZWxlbWVudCB0eXBlLCBtZWFuaW5nOiB0aGUgdHlwZSB3aXRob3V0IEFycmF5VHlwZXMgYXJvdW5kIGl0LgorICAgICAqIDxwPgorICAgICAqIEluICI8Y29kZT5pbnRbXSBhW107PC9jb2RlPiIsIHRoZSBlbGVtZW50IHR5cGUgaXMgaW50LgorICAgICAqLworICAgIHB1YmxpYyBUeXBlIGdldEVsZW1lbnRUeXBlKCkgeworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEFycmF5VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICgoQXJyYXlUeXBlKSB0aGlzKS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEFycmF5TGV2ZWwoKSB7CisgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQXJyYXlUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gMSArICgoQXJyYXlUeXBlKSB0aGlzKS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0QXJyYXlMZXZlbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBhc1N0cmluZygpOworCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFR5cGUpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC50eXBlTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSByZXBsYWNlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXlUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBBcnJheVR5cGUgYXNBcnJheVR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEFycmF5VHlwZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc09ySW50ZXJmYWNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgYXNDbGFzc09ySW50ZXJmYWNlVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gQ2xhc3NPckludGVyZmFjZVR5cGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJzZWN0aW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZXJzZWN0aW9uVHlwZSBhc0ludGVyc2VjdGlvblR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIEludGVyc2VjdGlvblR5cGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUHJpbWl0aXZlVHlwZSBhc1ByaW1pdGl2ZVR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFByaW1pdGl2ZVR5cGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUmVmZXJlbmNlVHlwZSBhc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFJlZmVyZW5jZVR5cGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlciBhc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFR5cGVQYXJhbWV0ZXIiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVW5pb25UeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBVbmlvblR5cGUgYXNVbmlvblR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFVuaW9uVHlwZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmtub3duVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5rbm93blR5cGUgYXNVbmtub3duVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gVW5rbm93blR5cGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVm9pZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFZvaWRUeXBlIGFzVm9pZFR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZigiJXMgaXMgbm90IGFuIFZvaWRUeXBlIiwgdGhpcykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dpbGRjYXJkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlIGFzV2lsZGNhcmRUeXBlKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGYoIiVzIGlzIG5vdCBhbiBXaWxkY2FyZFR5cGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQXJyYXlUeXBlKENvbnN1bWVyPEFycmF5VHlwZT4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmQ2xhc3NPckludGVyZmFjZVR5cGUoQ29uc3VtZXI8Q2xhc3NPckludGVyZmFjZVR5cGU+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZkludGVyc2VjdGlvblR5cGUoQ29uc3VtZXI8SW50ZXJzZWN0aW9uVHlwZT4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmUHJpbWl0aXZlVHlwZShDb25zdW1lcjxQcmltaXRpdmVUeXBlPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZSZWZlcmVuY2VUeXBlKENvbnN1bWVyPFJlZmVyZW5jZVR5cGU+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlR5cGVQYXJhbWV0ZXIoQ29uc3VtZXI8VHlwZVBhcmFtZXRlcj4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVW5pb25UeXBlKENvbnN1bWVyPFVuaW9uVHlwZT4gYWN0aW9uKSB7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVW5rbm93blR5cGUoQ29uc3VtZXI8VW5rbm93blR5cGU+IGFjdGlvbikgeworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlZvaWRUeXBlKENvbnN1bWVyPFZvaWRUeXBlPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZXaWxkY2FyZFR5cGUoQ29uc3VtZXI8V2lsZGNhcmRUeXBlPiBhY3Rpb24pIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYWJzdHJhY3QgUmVzb2x2ZWRUeXBlIHJlc29sdmUoKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8QXJyYXlUeXBlPiB0b0FycmF5VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdG9DbGFzc09ySW50ZXJmYWNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxJbnRlcnNlY3Rpb25UeXBlPiB0b0ludGVyc2VjdGlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8UHJpbWl0aXZlVHlwZT4gdG9QcmltaXRpdmVUeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFJlZmVyZW5jZVR5cGU+IHRvUmVmZXJlbmNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxUeXBlUGFyYW1ldGVyPiB0b1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VW5pb25UeXBlPiB0b1VuaW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxVbmtub3duVHlwZT4gdG9Vbmtub3duVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxWb2lkVHlwZT4gdG9Wb2lkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxXaWxkY2FyZFR5cGU+IHRvV2lsZGNhcmRUeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWYXJUeXBlIGFzVmFyVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmKCIlcyBpcyBub3QgYW4gVmFyVHlwZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIE9wdGlvbmFsPFZhclR5cGU+IHRvVmFyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVmFyVHlwZShDb25zdW1lcjxWYXJUeXBlPiBhY3Rpb24pIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVHlwZVBhcmFtZXRlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGVQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y4Y2VkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGVQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFsbEZpZWxkc0NvbnN0cnVjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuam9pbmluZzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlR5cGVQYXJhbWV0ZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGVWYXJpYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgdHlwZSBwYXJhbWV0ZXIuCisgKiA8YnIvPjxjb2RlPiZsdDs8Yj5VPC9iPj4gVSBnZXRVKCkgeyAuLi4gfTwvY29kZT4KKyAqIDxici8+PGNvZGU+Y2xhc3MgRCAmbHQ7PGI+QEJyYWluIFQgZXh0ZW5kcyBCICYgQSAmIEBUcmlwZSBDPC9iPj4geyAuLi4gfTwvY29kZT4KKyAqIDxwPlUgYW5kIFQgYXJlIHR5cGUgcGFyYW1ldGVyIG5hbWVzLgorICogPGJyLz5CLCBBLCBhbmQgQyBhcmUgdHlwZSBwYXJhbWV0ZXIgYm91bmRzLgorICogPGJyLz5UcmlwZSBpcyBhbiBhbm5vdGF0aW9uIG9uIHR5cGUgcGFyYW1ldGVyIGJvdW5kIEMuCisgKiA8YnIvPkJyYWluIGlzIGFuIGFubm90YXRpb24gb24gdHlwZSBwYXJhbWV0ZXIgVC4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycworICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHlwZVBhcmFtZXRlciBleHRlbmRzIFJlZmVyZW5jZVR5cGUgaW1wbGVtZW50cyBOb2RlV2l0aFNpbXBsZU5hbWU8VHlwZVBhcmFtZXRlcj4sIE5vZGVXaXRoQW5ub3RhdGlvbnM8VHlwZVBhcmFtZXRlcj4geworCisgICAgcHJpdmF0ZSBTaW1wbGVOYW1lIG5hbWU7CisKKyAgICBwcml2YXRlIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQ7CisKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgU2ltcGxlTmFtZSgpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCBuZXcgTm9kZUxpc3Q8PigpLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBTaW1wbGVOYW1lKG5hbWUpLCB0eXBlQm91bmQsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHJhbmdlIHNob3VsZG4ndCBiZSBpbiB1dGlsaXR5IGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBUeXBlUGFyYW1ldGVyKFJhbmdlIHJhbmdlLCBmaW5hbCBTaW1wbGVOYW1lIG5hbWUsIGZpbmFsIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuYW1lLCB0eXBlQm91bmQsIG5ldyBOb2RlTGlzdDw+KCkpOworICAgICAgICBzZXRSYW5nZShyYW5nZSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFR5cGVQYXJhbWV0ZXIoU2ltcGxlTmFtZSBuYW1lLCBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdHlwZUJvdW5kLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuYW1lLCB0eXBlQm91bmQsIGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVQYXJhbWV0ZXIoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBTaW1wbGVOYW1lIG5hbWUsIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFR5cGVCb3VuZCh0eXBlQm91bmQpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWVudGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFyYW1lbnRlcgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgU2ltcGxlTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2Yge0BsaW5rIENsYXNzT3JJbnRlcmZhY2VUeXBlfSB0aGF0IHRoaXMgcGFyYW1ldGVyCisgICAgICogZXh0ZW5kcy4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IG51bGwgaWYgdGhlcmUgYXJlIG5vIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdHlwZXMgdGhhdCB0aGlzIHBhcmFtZW50ZSBleHRlbmRzIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0VHlwZUJvdW5kKCkgeworICAgICAgICByZXR1cm4gdHlwZUJvdW5kOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlciBzZXROYW1lKGZpbmFsIFNpbXBsZU5hbWUgbmFtZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOworICAgICAgICBpZiAobmFtZSA9PSB0aGlzLm5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoVHlwZVBhcmFtZXRlcikgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSwgdGhpcy5uYW1lLCBuYW1lKTsKKyAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5uYW1lLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVQYXJhbWV0ZXIgc2V0VHlwZUJvdW5kKGZpbmFsIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlQm91bmQpOworICAgICAgICBpZiAodHlwZUJvdW5kID09IHRoaXMudHlwZUJvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gKFR5cGVQYXJhbWV0ZXIpIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEVfQk9VTkQsIHRoaXMudHlwZUJvdW5kLCB0eXBlQm91bmQpOworICAgICAgICBpZiAodGhpcy50eXBlQm91bmQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMudHlwZUJvdW5kLnNldFBhcmVudE5vZGUobnVsbCk7CisgICAgICAgIHRoaXMudHlwZUJvdW5kID0gdHlwZUJvdW5kOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlQm91bmQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlciBzZXRBbm5vdGF0aW9ucyhOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc3VwZXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQm91bmQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0eXBlQm91bmQuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICB0eXBlQm91bmQucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIGdldFR5cGVCb3VuZCgpLmlmTm9uRW1wdHkobCAtPiBzdHIuYXBwZW5kKGwuc3RyZWFtKCkubWFwKENsYXNzT3JJbnRlcmZhY2VUeXBlOjphc1N0cmluZykuY29sbGVjdChqb2luaW5nKCImIiwgIiBleHRlbmRzICIsICIiKSkpKTsKKyAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlciBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChUeXBlUGFyYW1ldGVyKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBUeXBlUGFyYW1ldGVyTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwudHlwZVBhcmFtZXRlck1ldGFNb2RlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZXBsYWNlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKE5vZGUgbm9kZSwgTm9kZSByZXBsYWNlbWVudE5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZSgoU2ltcGxlTmFtZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUJvdW5kLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodHlwZUJvdW5kLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgdHlwZUJvdW5kLnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFR5cGVQYXJhbWV0ZXIgYXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZUeXBlUGFyYW1ldGVyKENvbnN1bWVyPFR5cGVQYXJhbWV0ZXI+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGVWYXJpYWJsZSByZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gZ2V0U3ltYm9sUmVzb2x2ZXIoKS50b1Jlc29sdmVkVHlwZSh0aGlzLCBSZXNvbHZlZFR5cGVWYXJpYWJsZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxUeXBlUGFyYW1ldGVyPiB0b1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5pb25UeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5pb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNzhmMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9VbmlvblR5cGUuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuam9pbmluZzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5VbmlvblR5cGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFVuaW9uVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIDxoMT5UaGUgdW5pb24gdHlwZTwvaDE+CisgKiBSZXByZXNlbnRzIGEgc2V0IG9mIHR5cGVzLiBBIGdpdmVuIHZhbHVlIG9mIHRoaXMgdHlwZSBoYXMgdG8gYmUgYXNzaWduYWJsZSB0byBhdCBsZWFzdCBvbmUgb2YgdGhlIGVsZW1lbnQgdHlwZXMuCisgKiA8aDI+SmF2YSAxLTY8L2gyPgorICogRG9lcyBub3QgZXhpc3QuCisgKiA8aDI+SmF2YSA3KzwvaDI+CisgKiBBcyBvZiBKYXZhIDcgaXQgaXMgdXNlZCBpbiBjYXRjaCBjbGF1c2VzLgorICogPHByZT48Y29kZT4KKyAqIHRyeSB7CisgKiAuLi4KKyAqIH0gY2F0Y2goPGI+SU9FeGNlcHRpb24gfCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBleDwvYj4pIHsKKyAqIC4uLgorICogfQorICogPC9wcmU+CisgKgorICogVGhlIHR5cGVzIHRoYXQgbWFrZSB1cCB0aGUgdW5pb24gdHlwZSBhcmUgaXRzICJlbGVtZW50cyIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVuaW9uVHlwZSBleHRlbmRzIFR5cGUgaW1wbGVtZW50cyBOb2RlV2l0aEFubm90YXRpb25zPFVuaW9uVHlwZT4geworCisgICAgQE5vbkVtcHR5UHJvcGVydHkKKyAgICBwcml2YXRlIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzOworCisgICAgcHVibGljIFVuaW9uVHlwZSgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgTm9kZUxpc3Q8PigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFVuaW9uVHlwZShUb2tlblJhbmdlIHRva2VuUmFuZ2UsIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRFbGVtZW50cyhlbGVtZW50cyk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFVuaW9uVHlwZShOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiBlbGVtZW50cykgeworICAgICAgICB0aGlzKG51bGwsIGVsZW1lbnRzKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5Qcm9wZXJ0eUdlbmVyYXRvciIpCisgICAgcHVibGljIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGdldEVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUHJvcGVydHlHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBVbmlvblR5cGUgc2V0RWxlbWVudHMoZmluYWwgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbGVtZW50cyk7CisgICAgICAgIGlmIChlbGVtZW50cyA9PSB0aGlzLmVsZW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKFVuaW9uVHlwZSkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRUxFTUVOVFMsIHRoaXMuZWxlbWVudHMsIGVsZW1lbnRzKTsKKyAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihlbGVtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVbmlvblR5cGUgc2V0QW5ub3RhdGlvbnMoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiAoVW5pb25UeXBlKSBzdXBlci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmdldChpKSA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmUobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnN0cmVhbSgpLm1hcChUeXBlOjphc1N0cmluZykuY29sbGVjdChqb2luaW5nKCJ8IikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5pb25UeXBlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFVuaW9uVHlwZSkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5pb25UeXBlTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwudW5pb25UeXBlTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudHMuZ2V0KGkpID09IG5vZGUpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50cy5zZXQoaSwgKFJlZmVyZW5jZVR5cGUpIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2Uobm9kZSwgcmVwbGFjZW1lbnROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5pb25UeXBlIGFzVW5pb25UeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgaWZVbmlvblR5cGUoQ29uc3VtZXI8VW5pb25UeXBlPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRVbmlvblR5cGUgcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkudG9SZXNvbHZlZFR5cGUodGhpcywgUmVzb2x2ZWRVbmlvblR5cGUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VW5pb25UeXBlPiB0b1VuaW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Vbmtub3duVHlwZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1Vua25vd25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxNTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Vbmtub3duVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Vbmtub3duVHlwZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFVuaW9uVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEFuIHVua25vd24gcGFyYW1ldGVyIHR5cGUgb2JqZWN0LiBJdCBwbGF5cyB0aGUgcm9sZSBvZiBhIG51bGwgb2JqZWN0IGZvcgorICogbGFtYmRhIHBhcmFtZXRlcnMgdGhhdCBoYXZlIG5vIGV4cGxpY2l0IHR5cGUgZGVjbGFyZWQuIEFzIHN1Y2gsIGl0IGhhcyBubworICogbGV4aWNhbCByZXByZXNlbnRhdGlvbiBhbmQgaGVuY2UgZ2V0cyBubyBjb21tZW50IGF0dHJpYnV0ZWQuCisgKiA8cD4KKyAqIDxici8+SW4gPGNvZGU+RG91YmxlVG9JbnRGdW5jdGlvbiBkID0gPGI+eDwvYj4gLT4gKGludCl4ICsgMTs8L2NvZGU+IHRoZSB4IHBhcmFtZXRlciBpbiBib2xkIGhhcyB0eXBlIFVua25vd25UeXBlLgorICoKKyAqIEBhdXRob3IgRGlkaWVyIFZpbGxldmFsb2lzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duVHlwZSBleHRlbmRzIFR5cGUgeworCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFVua25vd25UeXBlKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVW5rbm93blR5cGUoVG9rZW5SYW5nZSB0b2tlblJhbmdlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkFjY2VwdEdlbmVyYXRvciIpCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVua25vd25UeXBlIHNldEFubm90YXRpb25zKE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBpZiAoYW5ub3RhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5mZXJyZWQgbGFtYmRhIHR5cGVzIGNhbm5vdCBiZSBhbm5vdGF0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChVbmtub3duVHlwZSkgc3VwZXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5DbG9uZUdlbmVyYXRvciIpCisgICAgcHVibGljIFVua25vd25UeXBlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFVua25vd25UeXBlKSBhY2NlcHQobmV3IENsb25lVmlzaXRvcigpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5HZXRNZXRhTW9kZWxHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBVbmtub3duVHlwZU1ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyTWV0YU1vZGVsLnVua25vd25UeXBlTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Vua25vd25UeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFVua25vd25UeXBlIGFzVW5rbm93blR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCBpZlVua25vd25UeXBlKENvbnN1bWVyPFVua25vd25UeXBlPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xSZXNvbHZlcigpLnRvUmVzb2x2ZWRUeXBlKHRoaXMsIFJlc29sdmVkUmVmZXJlbmNlVHlwZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxVbmtub3duVHlwZT4gdG9Vbmtub3duVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9WYXJUeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVmFyVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTVjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVmFyVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5KYXZhUGFyc2VyTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuVm9pZFR5cGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVm9pZFR5cGU7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlZhclR5cGVNZXRhTW9kZWw7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBWYXJUeXBlIGV4dGVuZHMgVHlwZSB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgVmFyVHlwZSgpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIHBhcnNlciBhbmQgaXMgY29uc2lkZXJlZCBwcml2YXRlLgorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLk1haW5Db25zdHJ1Y3RvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZhclR5cGUoVG9rZW5SYW5nZSB0b2tlblJhbmdlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBjdXN0b21Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYXJUeXBlIHNldEFubm90YXRpb25zKE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICByZXR1cm4gKFZhclR5cGUpIHN1cGVyLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInZhciI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQ2xvbmVHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWYXJUeXBlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFZhclR5cGUpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFZhclR5cGVNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlck1ldGFNb2RlbC52YXJUeXBlTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkudG9SZXNvbHZlZFR5cGUodGhpcywgUmVzb2x2ZWRUeXBlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhclR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmFyVHlwZSBhc1ZhclR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8VmFyVHlwZT4gdG9WYXJUeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVmFyVHlwZShDb25zdW1lcjxWYXJUeXBlPiBhY3Rpb24pIHsKKyAgICAgICAgYWN0aW9uLmFjY2VwdCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVm9pZFR5cGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Wb2lkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGE5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVm9pZFR5cGUuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Wb2lkVHlwZU1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRVbmlvblR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRWb2lkVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRoZSByZXR1cm4gdHlwZSBvZiBhIHtAbGluayBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb259CisgKiB3aGVuIGl0IHJldHVybnMgdm9pZC4KKyAqIDxici8+PGNvZGU+PGI+dm9pZDwvYj4gaGVsbG9Xb3JsZCgpIHsgLi4uIH08L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWb2lkVHlwZSBleHRlbmRzIFR5cGUgaW1wbGVtZW50cyBOb2RlV2l0aEFubm90YXRpb25zPFZvaWRUeXBlPiB7CisKKyAgICBAQWxsRmllbGRzQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgVm9pZFR5cGUoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWb2lkVHlwZShUb2tlblJhbmdlIHRva2VuUmFuZ2UpIHsKKyAgICAgICAgc3VwZXIodG9rZW5SYW5nZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuQWNjZXB0R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVm9pZFR5cGUgc2V0QW5ub3RhdGlvbnMoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiAoVm9pZFR5cGUpIHN1cGVyLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5SZW1vdmVNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInZvaWQiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVm9pZFR5cGUgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiAoVm9pZFR5cGUpIGFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkdldE1ldGFNb2RlbEdlbmVyYXRvciIpCisgICAgcHVibGljIFZvaWRUeXBlTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwudm9pZFR5cGVNZXRhTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVwbGFjZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIGJvb2xlYW4gcmVwbGFjZShOb2RlIG5vZGUsIE5vZGUgcmVwbGFjZW1lbnROb2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKG5vZGUsIHJlcGxhY2VtZW50Tm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzVm9pZFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVm9pZFR5cGUgYXNWb2lkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmVm9pZFR5cGUoQ29uc3VtZXI8Vm9pZFR5cGU+IGFjdGlvbikgeworICAgICAgICBhY3Rpb24uYWNjZXB0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFZvaWRUeXBlIHJlc29sdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xSZXNvbHZlcigpLnRvUmVzb2x2ZWRUeXBlKHRoaXMsIFJlc29sdmVkVm9pZFR5cGUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlR5cGVDYXN0aW5nR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8Vm9pZFR5cGU+IHRvVm9pZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvV2lsZGNhcmRUeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvV2lsZGNhcmRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ODQyZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9XaWxkY2FyZFR5cGUuamF2YQpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWxsRmllbGRzQ29uc3RydWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSmF2YVBhcnNlck1ldGFNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk9wdGlvbmFsUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5XaWxkY2FyZFR5cGVNZXRhTW9kZWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRVbmlvblR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRXaWxkY2FyZDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogQSB3aWxkY2FyZCB0eXBlIGFyZ3VtZW50LgorICogPGJyLz48Y29kZT52b2lkIHByaW50Q29sbGVjdGlvbihDb2xsZWN0aW9uJmx0OzxiPj88L2I+PiBjKSB7IC4uLiB9PC9jb2RlPgorICogPGJyLz48Y29kZT5ib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uJmx0OzxiPj8gZXh0ZW5kcyBFPC9iPj4gYyk8L2NvZGU+CisgKiA8YnIvPjxjb2RlPlJlZmVyZW5jZShUIHJlZmVyZW50LCBSZWZlcmVuY2VRdWV1ZSZsdDs8Yj4/IHN1cGVyIFQ8L2I+PiBxdWV1ZSk8L2NvZGU+CisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXaWxkY2FyZFR5cGUgZXh0ZW5kcyBUeXBlIGltcGxlbWVudHMgTm9kZVdpdGhBbm5vdGF0aW9uczxXaWxkY2FyZFR5cGU+IHsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlIGV4dGVuZGVkVHlwZTsKKworICAgIEBPcHRpb25hbFByb3BlcnR5CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlIHN1cGVyVHlwZTsKKworICAgIHB1YmxpYyBXaWxkY2FyZFR5cGUoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgcHVibGljIFdpbGRjYXJkVHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dGVuZGVkVHlwZSkgeworICAgICAgICB0aGlzKG51bGwsIGV4dGVuZGVkVHlwZSwgbnVsbCwgbmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQEFsbEZpZWxkc0NvbnN0cnVjdG9yCisgICAgcHVibGljIFdpbGRjYXJkVHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dGVuZGVkVHlwZSwgZmluYWwgUmVmZXJlbmNlVHlwZSBzdXBlclR5cGUsIGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzKG51bGwsIGV4dGVuZGVkVHlwZSwgc3VwZXJUeXBlLCBhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZS4KKyAgICAgKi8KKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5NYWluQ29uc3RydWN0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBXaWxkY2FyZFR5cGUoVG9rZW5SYW5nZSB0b2tlblJhbmdlLCBSZWZlcmVuY2VUeXBlIGV4dGVuZGVkVHlwZSwgUmVmZXJlbmNlVHlwZSBzdXBlclR5cGUsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcih0b2tlblJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldEV4dGVuZGVkVHlwZShleHRlbmRlZFR5cGUpOworICAgICAgICBzZXRTdXBlclR5cGUoc3VwZXJUeXBlKTsKKyAgICAgICAgY3VzdG9tSW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5BY2NlcHRHZW5lcmF0b3IiKQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVmZXJlbmNlVHlwZT4gZ2V0RXh0ZW5kZWRUeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShleHRlbmRlZFR5cGUpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVmZXJlbmNlVHlwZT4gZ2V0U3VwZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShzdXBlclR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRFeHRlbmRlZFR5cGUgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBPcHRpb25hbDxSZWZlcmVuY2VUeXBlPiBnZXRFeHRlbmRlZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRUeXBlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGdldFN1cGVyVHlwZSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIE9wdGlvbmFsPFJlZmVyZW5jZVR5cGU+IGdldFN1cGVyVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRTdXBlclR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBleHRlbmRlZCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5kZWRUeXBlIHRoZSBleHRlbmRzLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIFdpbGRjYXJkVHlwZQorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlIHNldEV4dGVuZGVkVHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dGVuZGVkVHlwZSkgeworICAgICAgICBpZiAoZXh0ZW5kZWRUeXBlID09IHRoaXMuZXh0ZW5kZWRUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKFdpbGRjYXJkVHlwZSkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuRVhURU5ERURfVFlQRSwgdGhpcy5leHRlbmRlZFR5cGUsIGV4dGVuZGVkVHlwZSk7CisgICAgICAgIGlmICh0aGlzLmV4dGVuZGVkVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5leHRlbmRlZFR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5leHRlbmRlZFR5cGUgPSBleHRlbmRlZFR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGV4dGVuZGVkVHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV4dGVuZGVkIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbmRlZFR5cGUgdGhlIGV4dGVuZHMsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgV2lsZGNhcmRUeXBlCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHNldEV4dGVuZGVkVHlwZSBpbnN0ZWFkLAorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFdpbGRjYXJkVHlwZSBzZXRFeHRlbmRlZFR5cGVzKGZpbmFsIFJlZmVyZW5jZVR5cGUgZXh0ZW5kZWRUeXBlKSB7CisgICAgICAgIHJldHVybiBzZXRFeHRlbmRlZFR5cGUoZXh0ZW5kZWRUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdXBlcnR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdXBlclR5cGUgdGhlIHN1cGVyLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIFdpbGRjYXJkVHlwZQorICAgICAqLworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlByb3BlcnR5R2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlIHNldFN1cGVyVHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIHN1cGVyVHlwZSkgeworICAgICAgICBpZiAoc3VwZXJUeXBlID09IHRoaXMuc3VwZXJUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKFdpbGRjYXJkVHlwZSkgdGhpczsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkuU1VQRVJfVFlQRSwgdGhpcy5zdXBlclR5cGUsIHN1cGVyVHlwZSk7CisgICAgICAgIGlmICh0aGlzLnN1cGVyVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5zdXBlclR5cGUuc2V0UGFyZW50Tm9kZShudWxsKTsKKyAgICAgICAgdGhpcy5zdXBlclR5cGUgPSBzdXBlclR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHN1cGVyVHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN1cGVydHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHN1cGVyVHlwZSB0aGUgc3VwZXIsIGNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0aGlzLCB0aGUgV2lsZGNhcmRUeXBlCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHNldFN1cGVyVHlwZSBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlIHNldFN1cGVyVHlwZXMoZmluYWwgUmVmZXJlbmNlVHlwZSBzdXBlclR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHNldFN1cGVyVHlwZShzdXBlclR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBXaWxkY2FyZFR5cGUgc2V0QW5ub3RhdGlvbnMoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiAoV2lsZGNhcmRUeXBlKSBzdXBlci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuUmVtb3ZlTWV0aG9kR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChleHRlbmRlZFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gZXh0ZW5kZWRUeXBlKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRXh0ZW5kZWRUeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1cGVyVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBzdXBlclR5cGUpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVTdXBlclR5cGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoIj8iKTsKKyAgICAgICAgZ2V0RXh0ZW5kZWRUeXBlKCkuaWZQcmVzZW50KHQgLT4gc3RyLmFwcGVuZCgiIGV4dGVuZHMgIikuYXBwZW5kKHQuYXNTdHJpbmcoKSkpOworICAgICAgICBnZXRTdXBlclR5cGUoKS5pZlByZXNlbnQodCAtPiBzdHIuYXBwZW5kKCIgc3VwZXIgIikuYXBwZW5kKHQuYXNTdHJpbmcoKSkpOworICAgICAgICByZXR1cm4gc3RyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlIHJlbW92ZUV4dGVuZGVkVHlwZXMoKSB7CisgICAgICAgIHJldHVybiByZW1vdmVFeHRlbmRlZFR5cGUoKTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBXaWxkY2FyZFR5cGUgcmVtb3ZlU3VwZXJUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZVN1cGVyVHlwZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIFdpbGRjYXJkVHlwZSByZW1vdmVFeHRlbmRlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBzZXRFeHRlbmRlZFR5cGUoKFJlZmVyZW5jZVR5cGUpIG51bGwpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlbW92ZU1ldGhvZEdlbmVyYXRvciIpCisgICAgcHVibGljIFdpbGRjYXJkVHlwZSByZW1vdmVTdXBlclR5cGUoKSB7CisgICAgICAgIHJldHVybiBzZXRTdXBlclR5cGUoKFJlZmVyZW5jZVR5cGUpIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLkNsb25lR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlIGNsb25lKCkgeworICAgICAgICByZXR1cm4gKFdpbGRjYXJkVHlwZSkgYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuR2V0TWV0YU1vZGVsR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJNZXRhTW9kZWwud2lsZGNhcmRUeXBlTWV0YU1vZGVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS5ub2RlLlJlcGxhY2VNZXRob2RHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoTm9kZSBub2RlLCBOb2RlIHJlcGxhY2VtZW50Tm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZXh0ZW5kZWRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IGV4dGVuZGVkVHlwZSkgeworICAgICAgICAgICAgICAgIHNldEV4dGVuZGVkVHlwZSgoUmVmZXJlbmNlVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3VwZXJUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChub2RlID09IHN1cGVyVHlwZSkgeworICAgICAgICAgICAgICAgIHNldFN1cGVyVHlwZSgoUmVmZXJlbmNlVHlwZSkgcmVwbGFjZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShub2RlLCByZXBsYWNlbWVudE5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgcGFyc2VyIGFuZCBpcyBjb25zaWRlcmVkIHByaXZhdGUuCisgICAgICovCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuTWFpbkNvbnN0cnVjdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgV2lsZGNhcmRUeXBlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgUmVmZXJlbmNlVHlwZSBleHRlbmRlZFR5cGUsIFJlZmVyZW5jZVR5cGUgc3VwZXJUeXBlKSB7CisgICAgICAgIHN1cGVyKHRva2VuUmFuZ2UpOworICAgICAgICBzZXRFeHRlbmRlZFR5cGUoZXh0ZW5kZWRUeXBlKTsKKyAgICAgICAgc2V0U3VwZXJUeXBlKHN1cGVyVHlwZSk7CisgICAgICAgIGN1c3RvbUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBib29sZWFuIGlzV2lsZGNhcmRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUubm9kZS5UeXBlQ2FzdGluZ0dlbmVyYXRvciIpCisgICAgcHVibGljIFdpbGRjYXJkVHlwZSBhc1dpbGRjYXJkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIGlmV2lsZGNhcmRUeXBlKENvbnN1bWVyPFdpbGRjYXJkVHlwZT4gYWN0aW9uKSB7CisgICAgICAgIGFjdGlvbi5hY2NlcHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkV2lsZGNhcmQgcmVzb2x2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFN5bWJvbFJlc29sdmVyKCkudG9SZXNvbHZlZFR5cGUodGhpcywgUmVzb2x2ZWRXaWxkY2FyZC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLm5vZGUuVHlwZUNhc3RpbmdHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBPcHRpb25hbDxXaWxkY2FyZFR5cGU+IHRvV2lsZGNhcmRUeXBlKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTEwVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMTBWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZkYTJmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTEwVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5WYXJUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLmNodW5rcy5WYXJWYWxpZGF0b3I7CisKKy8qKgorICogVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIGFjY29yZGluZyB0byBKYXZhIDEwIHN5bnRheCBydWxlcy4KKyAqLworcHVibGljIGNsYXNzIEphdmExMFZhbGlkYXRvciBleHRlbmRzIEphdmE5VmFsaWRhdG9yIHsKKworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3IgdmFyT25seU9uTG9jYWxWYXJpYWJsZURlZmluaXRpb25BbmRGb3IgPSBuZXcgU2luZ2xlTm9kZVR5cGVWYWxpZGF0b3I8PihWYXJUeXBlLmNsYXNzLCBuZXcgVmFyVmFsaWRhdG9yKGZhbHNlKSk7CisKKyAgICBwdWJsaWMgSmF2YTEwVmFsaWRhdG9yKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBhZGQodmFyT25seU9uTG9jYWxWYXJpYWJsZURlZmluaXRpb25BbmRGb3IpOworICAgICAgICAvKiBUaGVyZSBpcyBubyB2YWxpZGF0b3IgdGhhdCB2YWxpZGF0ZXMgdGhhdCAidmFyIiBpcyBub3QgdXNlZCBpbiBKYXZhIDkgYW5kIGxvd2VyLCBzaW5jZSB0aGUgcGFyc2VyIHdpbGwgbmV2ZXIgY3JlYXRlIGEgVmFyVHlwZSBub2RlLAorICAgICAgICAgICBiZWNhdXNlIHRoYXQgaXMgZG9uZSBieSB0aGUgSmF2YTEwIHBvc3Rwcm9jZXNzb3IuIFlvdSBjYW4gYWRkIGl0IGJ5IGhhbmQsIGJ1dCB0aGF0IGlzIG9ic2N1cmUgZW5vdWdoIHRvIGlnbm9yZS4gKi8KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMTFWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExMVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjg3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMTFWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlZhclR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuY2h1bmtzLlZhclZhbGlkYXRvcjsKKworLyoqCisgKiBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgYWNjb3JkaW5nIHRvIEphdmEgMTEgc3ludGF4IHJ1bGVzLgorICovCitwdWJsaWMgY2xhc3MgSmF2YTExVmFsaWRhdG9yIGV4dGVuZHMgSmF2YTEwVmFsaWRhdG9yIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdG9yIHZhckFsc29JbkxhbWJkYVBhcmFtZXRlcnMgPSBuZXcgU2luZ2xlTm9kZVR5cGVWYWxpZGF0b3I8PihWYXJUeXBlLmNsYXNzLCBuZXcgVmFyVmFsaWRhdG9yKHRydWUpKTsKKworICAgIHB1YmxpYyBKYXZhMTFWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHJlcGxhY2UodmFyT25seU9uTG9jYWxWYXJpYWJsZURlZmluaXRpb25BbmRGb3IsIHZhckFsc29JbkxhbWJkYVBhcmFtZXRlcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzBWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzBWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDEwNTFkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfMFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy5Nb2R1bGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVBcmd1bWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLmNodW5rcy5Db21tb25WYWxpZGF0b3JzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLmNodW5rcy5Nb2RpZmllclZhbGlkYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3MuTm9CaW5hcnlJbnRlZ2VyTGl0ZXJhbHNWYWxpZGF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuY2h1bmtzLk5vVW5kZXJzY29yZXNJbkludGVnZXJMaXRlcmFsc1ZhbGlkYXRvcjsKKworLyoqCisgKiBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgYWNjb3JkaW5nIHRvIEphdmEgMS4wIHN5bnRheCBydWxlcy4KKyAqLworcHVibGljIGNsYXNzIEphdmExXzBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3JzIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdG9yIG1vZGlmaWVyc1dpdGhvdXRTdHJpY3RmcEFuZERlZmF1bHRBbmRTdGF0aWNJbnRlcmZhY2VNZXRob2RzQW5kUHJpdmF0ZUludGVyZmFjZU1ldGhvZHMKKyAgICAgICAgICAgID0gbmV3IE1vZGlmaWVyVmFsaWRhdG9yKGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9Bc3NlcnRLZXl3b3JkID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KEFzc2VydFN0bXQuY2xhc3MsCisgICAgICAgICAgICBuIC0+IHRydWUsCisgICAgICAgICAgICAobiwgcmVwb3J0ZXIpIC0+IHJlcG9ydGVyLnJlcG9ydChuLCAiJ2Fzc2VydCcga2V5d29yZCBpcyBub3Qgc3VwcG9ydGVkLiIpCisgICAgKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdG9yIG5vSW5uZXJDbGFzc2VzID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcywKKyAgICAgICAgICAgIG4gLT4gIW4uaXNUb3BMZXZlbFR5cGUoKSwKKyAgICAgICAgICAgIChuLCByZXBvcnRlcikgLT4gcmVwb3J0ZXIucmVwb3J0KG4sICJpbm5lciBjbGFzc2VzIG9yIGludGVyZmFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIikKKyAgICApOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9SZWZsZWN0aW9uID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KENsYXNzRXhwci5jbGFzcywKKyAgICAgICAgICAgIG4gLT4gdHJ1ZSwKKyAgICAgICAgICAgIChuLCByZXBvcnRlcikgLT4gcmVwb3J0ZXIucmVwb3J0KG4sICJSZWZsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIikKKyAgICApOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9HZW5lcmljcyA9IG5ldyBUcmVlVmlzaXRvclZhbGlkYXRvcigobm9kZSwgcmVwb3J0ZXIpIC0+IHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlV2l0aFR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIGlmICgoKE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/IGV4dGVuZHMgTm9kZT4pIG5vZGUpLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydChub2RlLCAiR2VuZXJpY3MgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBpZiAoKChOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzPD8gZXh0ZW5kcyBOb2RlPikgbm9kZSkuZ2V0VHlwZVBhcmFtZXRlcnMoKS5pc05vbkVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobm9kZSwgIkdlbmVyaWNzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFNpbmdsZU5vZGVUeXBlVmFsaWRhdG9yPFRyeVN0bXQ+IHRyeVdpdGhvdXRSZXNvdXJjZXMgPSBuZXcgU2luZ2xlTm9kZVR5cGVWYWxpZGF0b3I8PihUcnlTdG10LmNsYXNzLCAobiwgcmVwb3J0ZXIpIC0+IHsKKyAgICAgICAgaWYgKG4uZ2V0Q2F0Y2hDbGF1c2VzKCkuaXNFbXB0eSgpICYmICFuLmdldEZpbmFsbHlCbG9jaygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgIlRyeSBoYXMgbm8gZmluYWxseSBhbmQgbm8gY2F0Y2guIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0UmVzb3VyY2VzKCkuaXNOb25FbXB0eSgpKSB7CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgIkNhdGNoIHdpdGggcmVzb3VyY2UgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9Bbm5vdGF0aW9ucyA9IG5ldyBUcmVlVmlzaXRvclZhbGlkYXRvcigobm9kZSwgcmVwb3J0ZXIpIC0+IHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRXhwciB8fCBub2RlIGluc3RhbmNlb2YgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobm9kZSwgIkFubm90YXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisgICAgfSk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBub0VudW1zID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KEVudW1EZWNsYXJhdGlvbi5jbGFzcywKKyAgICAgICAgICAgIG4gLT4gdHJ1ZSwKKyAgICAgICAgICAgIChuLCByZXBvcnRlcikgLT4gcmVwb3J0ZXIucmVwb3J0KG4sICJFbnVtZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuIikKKyAgICApOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9WYXJhcmdzID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KFBhcmFtZXRlci5jbGFzcywKKyAgICAgICAgICAgIFBhcmFtZXRlcjo6aXNWYXJBcmdzLAorICAgICAgICAgICAgKG4sIHJlcG9ydGVyKSAtPiByZXBvcnRlci5yZXBvcnQobiwgIlZhcmFyZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuIikKKyAgICApOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9Gb3JFYWNoID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KEZvcmVhY2hTdG10LmNsYXNzLAorICAgICAgICAgICAgbiAtPiB0cnVlLAorICAgICAgICAgICAgKG4sIHJlcG9ydGVyKSAtPiByZXBvcnRlci5yZXBvcnQobiwgIkZvci1lYWNoIGxvb3BzIGFyZSBub3Qgc3VwcG9ydGVkLiIpCisgICAgKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdG9yIG5vU3RhdGljSW1wb3J0cyA9IG5ldyBTaW1wbGVWYWxpZGF0b3I8PihJbXBvcnREZWNsYXJhdGlvbi5jbGFzcywKKyAgICAgICAgICAgIEltcG9ydERlY2xhcmF0aW9uOjppc1N0YXRpYywKKyAgICAgICAgICAgIChuLCByZXBvcnRlcikgLT4gcmVwb3J0ZXIucmVwb3J0KG4sICJTdGF0aWMgaW1wb3J0cyBhcmUgbm90IHN1cHBvcnRlZC4iKQorICAgICk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBub1N0cmluZ3NJblN3aXRjaCA9IG5ldyBTaW1wbGVWYWxpZGF0b3I8PihTd2l0Y2hFbnRyeVN0bXQuY2xhc3MsCisgICAgICAgICAgICBuIC0+IG4uZ2V0TGFiZWwoKS5tYXAobCAtPiBsIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbEV4cHIpLm9yRWxzZShmYWxzZSksCisgICAgICAgICAgICAobiwgcmVwb3J0ZXIpIC0+IHJlcG9ydGVyLnJlcG9ydChuLmdldExhYmVsKCkuZ2V0KCksICJTdHJpbmdzIGluIHN3aXRjaCBzdGF0ZW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLiIpCisgICAgKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdG9yIG5vQmluYXJ5SW50ZWdlckxpdGVyYWxzID0gbmV3IE5vQmluYXJ5SW50ZWdlckxpdGVyYWxzVmFsaWRhdG9yKCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBub1VuZGVyc2NvcmVzSW5JbnRlZ2VyTGl0ZXJhbHMgPSBuZXcgTm9VbmRlcnNjb3Jlc0luSW50ZWdlckxpdGVyYWxzVmFsaWRhdG9yKCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBub011bHRpQ2F0Y2ggPSBuZXcgU2ltcGxlVmFsaWRhdG9yPD4oVW5pb25UeXBlLmNsYXNzLAorICAgICAgICAgICAgbiAtPiB0cnVlLAorICAgICAgICAgICAgKG4sIHJlcG9ydGVyKSAtPiByZXBvcnRlci5yZXBvcnQobiwgIk11bHRpLWNhdGNoIGlzIG5vdCBzdXBwb3J0ZWQuIikKKyAgICApOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igbm9MYW1iZGFzID0gbmV3IFNpbXBsZVZhbGlkYXRvcjw+KExhbWJkYUV4cHIuY2xhc3MsCisgICAgICAgICAgICBuIC0+IHRydWUsCisgICAgICAgICAgICAobiwgcmVwb3J0ZXIpIC0+IHJlcG9ydGVyLnJlcG9ydChuLCAiTGFtYmRhcyBhcmUgbm90IHN1cHBvcnRlZC4iKQorICAgICk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBub01vZHVsZXMgPSBuZXcgU2ltcGxlVmFsaWRhdG9yPD4oTW9kdWxlRGVjbGFyYXRpb24uY2xhc3MsCisgICAgICAgICAgICBuIC0+IHRydWUsCisgICAgICAgICAgICAobiwgcmVwb3J0ZXIpIC0+IHJlcG9ydGVyLnJlcG9ydChuLCAiTW9kdWxlcyBhcmUgbm90IHN1cHBvcnRlZC4iKQorICAgICk7CisKKyAgICBwdWJsaWMgSmF2YTFfMFZhbGlkYXRvcigpIHsKKyAgICAgICAgc3VwZXIobmV3IENvbW1vblZhbGlkYXRvcnMoKSk7CisgICAgICAgIGFkZChtb2RpZmllcnNXaXRob3V0U3RyaWN0ZnBBbmREZWZhdWx0QW5kU3RhdGljSW50ZXJmYWNlTWV0aG9kc0FuZFByaXZhdGVJbnRlcmZhY2VNZXRob2RzKTsKKyAgICAgICAgYWRkKG5vQXNzZXJ0S2V5d29yZCk7CisgICAgICAgIGFkZChub0lubmVyQ2xhc3Nlcyk7CisgICAgICAgIGFkZChub1JlZmxlY3Rpb24pOworICAgICAgICBhZGQobm9HZW5lcmljcyk7CisgICAgICAgIGFkZCh0cnlXaXRob3V0UmVzb3VyY2VzKTsKKyAgICAgICAgYWRkKG5vQW5ub3RhdGlvbnMpOworICAgICAgICBhZGQobm9FbnVtcyk7CisgICAgICAgIGFkZChub1ZhcmFyZ3MpOworICAgICAgICBhZGQobm9Gb3JFYWNoKTsKKyAgICAgICAgYWRkKG5vU3RhdGljSW1wb3J0cyk7CisgICAgICAgIGFkZChub1N0cmluZ3NJblN3aXRjaCk7CisgICAgICAgIGFkZChub0JpbmFyeUludGVnZXJMaXRlcmFscyk7CisgICAgICAgIGFkZChub1VuZGVyc2NvcmVzSW5JbnRlZ2VyTGl0ZXJhbHMpOworICAgICAgICBhZGQobm9NdWx0aUNhdGNoKTsKKyAgICAgICAgYWRkKG5vTGFtYmRhcyk7CisgICAgICAgIGFkZChub01vZHVsZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzFWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzFWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc5YjdmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfMVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Mb2NhbENsYXNzRGVjbGFyYXRpb25TdG10OworCisvKioKKyAqIFRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcyBhY2NvcmRpbmcgdG8gSmF2YSAxLjEgc3ludGF4IHJ1bGVzLgorICovCitwdWJsaWMgY2xhc3MgSmF2YTFfMVZhbGlkYXRvciBleHRlbmRzIEphdmExXzBWYWxpZGF0b3IgeworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3IgaW5uZXJDbGFzc2VzID0gbmV3IFNpbmdsZU5vZGVUeXBlVmFsaWRhdG9yPD4oQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzLAorICAgICAgICAgICAgKG4sIHJlcG9ydGVyKSAtPiBuLmdldFBhcmVudE5vZGUoKS5pZlByZXNlbnQocCAtPiB7CisgICAgICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10ICYmIG4uaXNJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0KG4sICJUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGEgbG9jYWwgaW50ZXJmYWNlLiIpOworICAgICAgICAgICAgfSkKKyAgICApOworCisgICAgcHVibGljIEphdmExXzFWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHJlcGxhY2Uobm9Jbm5lckNsYXNzZXMsIGlubmVyQ2xhc3Nlcyk7CisgICAgICAgIHJlbW92ZShub1JlZmxlY3Rpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzJWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzJWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWM3NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfMlZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3MuTW9kaWZpZXJWYWxpZGF0b3I7CisKKy8qKgorICogVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIGFjY29yZGluZyB0byBKYXZhIDEuMiBzeW50YXggcnVsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhMV8yVmFsaWRhdG9yIGV4dGVuZHMgSmF2YTFfMVZhbGlkYXRvciB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBtb2RpZmllcnNXaXRob3V0RGVmYXVsdEFuZFN0YXRpY0ludGVyZmFjZU1ldGhvZHNBbmRQcml2YXRlSW50ZXJmYWNlTWV0aG9kcyA9IG5ldyBNb2RpZmllclZhbGlkYXRvcih0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3Igc3RyaWN0ZnBOb3RBbGxvd2VkID0gbmV3IFJlc2VydmVkS2V5d29yZFZhbGlkYXRvcigic3RyaWN0ZnAiKTsKKyAgICAKKyAgICBwdWJsaWMgSmF2YTFfMlZhbGlkYXRvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcmVwbGFjZShtb2RpZmllcnNXaXRob3V0U3RyaWN0ZnBBbmREZWZhdWx0QW5kU3RhdGljSW50ZXJmYWNlTWV0aG9kc0FuZFByaXZhdGVJbnRlcmZhY2VNZXRob2RzLCBtb2RpZmllcnNXaXRob3V0RGVmYXVsdEFuZFN0YXRpY0ludGVyZmFjZU1ldGhvZHNBbmRQcml2YXRlSW50ZXJmYWNlTWV0aG9kcyk7CisgICAgICAgIGFkZChzdHJpY3RmcE5vdEFsbG93ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzNWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzNWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjgzMGExCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfM1ZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKKy8qKgorICogVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIGFjY29yZGluZyB0byBKYXZhIDEuMyBzeW50YXggcnVsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhMV8zVmFsaWRhdG9yIGV4dGVuZHMgSmF2YTFfMlZhbGlkYXRvciB7CisgICAgcHVibGljIEphdmExXzNWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfNFZhbGlkYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfNFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGFkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV80VmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworLyoqCisgKiBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgYWNjb3JkaW5nIHRvIEphdmEgMS40IHN5bnRheCBydWxlcy4KKyAqLworcHVibGljIGNsYXNzIEphdmExXzRWYWxpZGF0b3IgZXh0ZW5kcyBKYXZhMV8zVmFsaWRhdG9yIHsKKyAgICBwdWJsaWMgSmF2YTFfNFZhbGlkYXRvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcmVtb3ZlKG5vQXNzZXJ0S2V5d29yZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTVWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE1VmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiMWFhYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE1VmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgYWNjb3JkaW5nIHRvIEphdmEgNSBzeW50YXggcnVsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhNVZhbGlkYXRvciBleHRlbmRzIEphdmExXzRWYWxpZGF0b3IgeworICAgIFZhbGlkYXRvciBnZW5lcmljc1dpdGhvdXREaWFtb25kT3BlcmF0b3IgPSBuZXcgVHJlZVZpc2l0b3JWYWxpZGF0b3IoKG5vZGUsIHJlcG9ydGVyKSAtPiB7CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTm9kZVdpdGhUeXBlQXJndW1lbnRzKSB7CisgICAgICAgICAgICBPcHRpb25hbDxOb2RlTGlzdDxUeXBlPj4gdHlwZUFyZ3VtZW50cyA9ICgoTm9kZVdpdGhUeXBlQXJndW1lbnRzPD8gZXh0ZW5kcyBOb2RlPikgbm9kZSkuZ2V0VHlwZUFyZ3VtZW50cygpOworICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMuaXNQcmVzZW50KCkgJiYgdHlwZUFyZ3VtZW50cy5nZXQoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobm9kZSwgIlRoZSBkaWFtb25kIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHByb3RlY3RlZCBWYWxpZGF0b3Igbm9QcmltaXRpdmVHZW5lcmljQXJndW1lbnRzID0gbmV3IFRyZWVWaXNpdG9yVmFsaWRhdG9yKChub2RlLCByZXBvcnRlcikgLT4geworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVXaXRoVHlwZUFyZ3VtZW50cykgeworICAgICAgICAgICAgT3B0aW9uYWw8Tm9kZUxpc3Q8VHlwZT4+IHR5cGVBcmd1bWVudHMgPSAoKE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/IGV4dGVuZHMgTm9kZT4pIG5vZGUpLmdldFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudHMuaWZQcmVzZW50KHR5cGVzIC0+IHR5cGVzLmZvckVhY2godHkgLT4geworICAgICAgICAgICAgICAgIGlmICh0eSBpbnN0YW5jZW9mIFByaW1pdGl2ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0KG5vZGUsICJUeXBlIGFyZ3VtZW50cyBtYXkgbm90IGJlIHByaW1pdGl2ZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3IgZW51bU5vdEFsbG93ZWQgPSBuZXcgUmVzZXJ2ZWRLZXl3b3JkVmFsaWRhdG9yKCJlbnVtIik7CisKKyAgICBwdWJsaWMgSmF2YTVWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHJlcGxhY2Uobm9HZW5lcmljcywgZ2VuZXJpY3NXaXRob3V0RGlhbW9uZE9wZXJhdG9yKTsKKyAgICAgICAgYWRkKG5vUHJpbWl0aXZlR2VuZXJpY0FyZ3VtZW50cyk7CisgICAgICAgIGFkZChlbnVtTm90QWxsb3dlZCk7CisgICAgICAgIAorICAgICAgICAvLyBUT0RPIHZhbGlkYXRlIGFubm90YXRpb25zIG9uIGNsYXNzZXMsIGZpZWxkcyBhbmQgbWV0aG9kcyBidXQgbm93aGVyZSBlbHNlCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgcHJvYmFibHkgdG9vIHNpbXBsZS4KKyAgICAgICAgcmVtb3ZlKG5vQW5ub3RhdGlvbnMpOworCisgICAgICAgIHJlbW92ZShub0VudW1zKTsKKyAgICAgICAgcmVtb3ZlKG5vVmFyYXJncyk7CisgICAgICAgIHJlbW92ZShub0ZvckVhY2gpOworICAgICAgICByZW1vdmUobm9TdGF0aWNJbXBvcnRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhNlZhbGlkYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTZWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDU0MDAzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTZWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCisvKioKKyAqIFRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcyBhY2NvcmRpbmcgdG8gSmF2YSA2IHN5bnRheCBydWxlcy4KKyAqLworcHVibGljIGNsYXNzIEphdmE2VmFsaWRhdG9yIGV4dGVuZHMgSmF2YTVWYWxpZGF0b3J7CisgICAgcHVibGljIEphdmE2VmFsaWRhdG9yKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE3VmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhN1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NWU4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhN1ZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlOworCisvKioKKyAqIFRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcyBhY2NvcmRpbmcgdG8gSmF2YSA3IHN5bnRheCBydWxlcy4KKyAqLworcHVibGljIGNsYXNzIEphdmE3VmFsaWRhdG9yIGV4dGVuZHMgSmF2YTZWYWxpZGF0b3IgeworICAgIHByb3RlY3RlZCBmaW5hbCBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcjxUcnlTdG10PiB0cnlXaXRoTGltaXRlZFJlc291cmNlcyA9IG5ldyBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcjw+KFRyeVN0bXQuY2xhc3MsIChuLCByZXBvcnRlcikgLT4geworICAgICAgICBpZiAobi5nZXRDYXRjaENsYXVzZXMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiBuLmdldFJlc291cmNlcygpLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICYmICFuLmdldEZpbmFsbHlCbG9jaygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgIlRyeSBoYXMgbm8gZmluYWxseSwgbm8gY2F0Y2gsIGFuZCBubyByZXNvdXJjZXMuIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChFeHByZXNzaW9uIHJlc291cmNlIDogbi5nZXRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZS5pc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgIlRyeSB3aXRoIHJlc291cmNlcyBvbmx5IHN1cHBvcnRzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pOworICAgIHByb3RlY3RlZCBmaW5hbCBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcjxVbmlvblR5cGU+IG11bHRpQ2F0Y2ggPSBuZXcgU2luZ2xlTm9kZVR5cGVWYWxpZGF0b3I8PihVbmlvblR5cGUuY2xhc3MsIChuLCByZXBvcnRlcikgLT4geworICAgICAgICAvLyBDYXNlICIwIGVsZW1lbnRzIiBpcyBjYXVnaHQgZWxzZXdoZXJlLgorICAgICAgICBpZiAobi5nZXRFbGVtZW50cygpLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgIlVuaW9uIHR5cGUgKG11bHRpIGNhdGNoKSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiIpOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBwdWJsaWMgSmF2YTdWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHJlbW92ZShnZW5lcmljc1dpdGhvdXREaWFtb25kT3BlcmF0b3IpOworICAgICAgICByZXBsYWNlKHRyeVdpdGhvdXRSZXNvdXJjZXMsIHRyeVdpdGhMaW1pdGVkUmVzb3VyY2VzKTsKKyAgICAgICAgcmVtb3ZlKG5vU3RyaW5nc0luU3dpdGNoKTsKKyAgICAgICAgcmVtb3ZlKG5vQmluYXJ5SW50ZWdlckxpdGVyYWxzKTsKKyAgICAgICAgcmVtb3ZlKG5vVW5kZXJzY29yZXNJbkludGVnZXJMaXRlcmFscyk7CisgICAgICAgIHJlcGxhY2Uobm9NdWx0aUNhdGNoLCBtdWx0aUNhdGNoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhOFZhbGlkYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YThWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFjYTkyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YThWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3MuTW9kaWZpZXJWYWxpZGF0b3I7CisKKy8qKgorICogVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIGFjY29yZGluZyB0byBKYXZhIDcgc3ludGF4IHJ1bGVzLgorICovCitwdWJsaWMgY2xhc3MgSmF2YThWYWxpZGF0b3IgZXh0ZW5kcyBKYXZhN1ZhbGlkYXRvciB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRvciBtb2RpZmllcnNXaXRob3V0UHJpdmF0ZUludGVyZmFjZU1ldGhvZHMgPSBuZXcgTW9kaWZpZXJWYWxpZGF0b3IodHJ1ZSwgdHJ1ZSwgZmFsc2UpOworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3IgZGVmYXVsdE1ldGhvZHNJbkludGVyZmFjZSA9IG5ldyBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcjw+KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcywKKyAgICAgICAgICAgIChuLCByZXBvcnRlcikgLT4geworICAgICAgICAgICAgICAgIGlmIChuLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbi5nZXRNZXRob2RzKCkuZm9yRWFjaChtIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLmlzRGVmYXVsdCgpICYmICFtLmdldEJvZHkoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydChtLCAiJ2RlZmF1bHQnIG1ldGhvZHMgbXVzdCBoYXZlIGEgYm9keS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICk7CisKKyAgICBwdWJsaWMgSmF2YThWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHJlcGxhY2UobW9kaWZpZXJzV2l0aG91dERlZmF1bHRBbmRTdGF0aWNJbnRlcmZhY2VNZXRob2RzQW5kUHJpdmF0ZUludGVyZmFjZU1ldGhvZHMsIG1vZGlmaWVyc1dpdGhvdXRQcml2YXRlSW50ZXJmYWNlTWV0aG9kcyk7CisgICAgICAgIGFkZChkZWZhdWx0TWV0aG9kc0luSW50ZXJmYWNlKTsKKyAgICAgICAgcmVtb3ZlKG5vTGFtYmRhcyk7CisKKyAgICAgICAgLy8gVE9ETyB2YWxpZGF0ZSBtb3JlIGFubm90YXRpb24gbG9jYXRpb25zIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2plcHMvMTA0CisgICAgICAgIC8vIFRPRE8gdmFsaWRhdGUgcmVwZWF0aW5nIGFubm90YXRpb25zIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2plcHMvMTIwCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTlWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE5VmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NWM5YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE5VmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3MuTW9kaWZpZXJWYWxpZGF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuY2h1bmtzLlVuZGVyc2NvcmVLZXl3b3JkVmFsaWRhdG9yOworCisvKioKKyAqIFRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcyBhY2NvcmRpbmcgdG8gSmF2YSA5IHN5bnRheCBydWxlcy4KKyAqLworcHVibGljIGNsYXNzIEphdmE5VmFsaWRhdG9yIGV4dGVuZHMgSmF2YThWYWxpZGF0b3IgeworICAgIHByb3RlY3RlZCBmaW5hbCBWYWxpZGF0b3IgdW5kZXJzY29yZUtleXdvcmRWYWxpZGF0b3IgPSBuZXcgVW5kZXJzY29yZUtleXdvcmRWYWxpZGF0b3IoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdG9yIG1vZGlmaWVycyA9IG5ldyBNb2RpZmllclZhbGlkYXRvcih0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2luZ2xlTm9kZVR5cGVWYWxpZGF0b3I8VHJ5U3RtdD4gdHJ5V2l0aFJlc291cmNlcyA9IG5ldyBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcjw+KFRyeVN0bXQuY2xhc3MsIChuLCByZXBvcnRlcikgLT4geworICAgICAgICBpZiAobi5nZXRDYXRjaENsYXVzZXMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiBuLmdldFJlc291cmNlcygpLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICYmICFuLmdldEZpbmFsbHlCbG9jaygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgIlRyeSBoYXMgbm8gZmluYWxseSwgbm8gY2F0Y2gsIGFuZCBubyByZXNvdXJjZXMuIik7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHB1YmxpYyBKYXZhOVZhbGlkYXRvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgYWRkKHVuZGVyc2NvcmVLZXl3b3JkVmFsaWRhdG9yKTsKKyAgICAgICAgcmVtb3ZlKG5vTW9kdWxlcyk7CisgICAgICAgIHJlcGxhY2UobW9kaWZpZXJzV2l0aG91dFByaXZhdGVJbnRlcmZhY2VNZXRob2RzLCBtb2RpZmllcnMpOworICAgICAgICByZXBsYWNlKHRyeVdpdGhMaW1pdGVkUmVzb3VyY2VzLCB0cnlXaXRoUmVzb3VyY2VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9Ob1Byb2JsZW1zVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9Ob1Byb2JsZW1zVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyNjY4OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL05vUHJvYmxlbXNWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCisvKioKKyAqIFN0dWIgdmFsaWRhdG9yIGZvciB3aGVuIG5vIHZhbGlkYXRpb24gaXMgd2FudGVkLgorICoKKyAqIEBkZXByZWNhdGVkIHdoZW4gc2V0dGluZyBhIGxhbmd1YWdlIHZhbGlkYXRvciwgdHJ5IHtAbGluayBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbiNzZXRMYW5ndWFnZUxldmVsKFBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbCl9IHdpdGggUkFXLgorICovCitARGVwcmVjYXRlZAorcHVibGljIGZpbmFsIGNsYXNzIE5vUHJvYmxlbXNWYWxpZGF0b3IgaW1wbGVtZW50cyBWYWxpZGF0b3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChOb2RlIG5vZGUsIFByb2JsZW1SZXBvcnRlciBwcm9ibGVtUmVwb3J0ZXIpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9Qcm9ibGVtUmVwb3J0ZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1Byb2JsZW1SZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTQ4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9Qcm9ibGVtUmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb2JsZW07CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUb2tlblJhbmdlOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CisKKy8qKgorICogQSBzaW1wbGUgaW50ZXJmYWNlIHdoZXJlIHZhbGlkYXRvcnMgY2FuIHJlcG9ydCBmb3VuZCBwcm9ibGVtcy4KKyAqLworcHVibGljIGNsYXNzIFByb2JsZW1SZXBvcnRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25zdW1lcjxQcm9ibGVtPiBwcm9ibGVtQ29uc3VtZXI7CisKKyAgICBwdWJsaWMgUHJvYmxlbVJlcG9ydGVyKENvbnN1bWVyPFByb2JsZW0+IHByb2JsZW1Db25zdW1lcikgeworICAgICAgICB0aGlzLnByb2JsZW1Db25zdW1lciA9IHByb2JsZW1Db25zdW1lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnQgYSBwcm9ibGVtLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0KKyAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnJlZCwgdXNlZCB0byBmaW5kIHRoZSBSYW5nZSBvZiB0aGUgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBvcnQoTm9kZVdpdGhUb2tlblJhbmdlPD8+IG5vZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QuLi4gYXJncykgeworICAgICAgICByZXBvcnQobm9kZS5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBtZXNzYWdlLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXBvcnQoVG9rZW5SYW5nZSByYW5nZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIHByb2JsZW1Db25zdW1lci5hY2NlcHQobmV3IFByb2JsZW0oZihtZXNzYWdlLCBhcmdzKSwgcmFuZ2UsIG51bGwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9SZXNlcnZlZEtleXdvcmRWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1Jlc2VydmVkS2V5d29yZFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTA4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9SZXNlcnZlZEtleXdvcmRWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKKworLyoqCisgKiBWYWxpZGF0ZXMgdGhhdCBpZGVudGlmaWVycyBhcmUgbm90IGtleXdvcmRzIC0gdGhpcyBmb3IgdGhlIGZldyBrZXl3b3JkcyB0aGF0IHRoZSBwYXJzZXIKKyAqIGFjY2VwdHMgYmVjYXVzZSB0aGV5IHdlcmUgYWRkZWQgYWZ0ZXIgSmF2YSAxLjAuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNlcnZlZEtleXdvcmRWYWxpZGF0b3IgZXh0ZW5kcyBWaXNpdG9yVmFsaWRhdG9yIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXl3b3JkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVycm9yOworCisgICAgcHVibGljIFJlc2VydmVkS2V5d29yZFZhbGlkYXRvcihTdHJpbmcga2V5d29yZCkgeworICAgICAgICB0aGlzLmtleXdvcmQgPSBrZXl3b3JkOworICAgICAgICBlcnJvciA9IGYoIiclcycgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBhcyBpdCBpcyBhIGtleXdvcmQuIiwga2V5d29yZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTmFtZSBuLCBQcm9ibGVtUmVwb3J0ZXIgYXJnKSB7CisgICAgICAgIGlmIChuLmdldElkZW50aWZpZXIoKS5lcXVhbHMoa2V5d29yZCkpIHsKKyAgICAgICAgICAgIGFyZy5yZXBvcnQobiwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoU2ltcGxlTmFtZSBuLCBQcm9ibGVtUmVwb3J0ZXIgYXJnKSB7CisgICAgICAgIGlmIChuLmdldElkZW50aWZpZXIoKS5lcXVhbHMoa2V5d29yZCkpIHsKKyAgICAgICAgICAgIGFyZy5yZXBvcnQobiwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvU2ltcGxlVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9TaW1wbGVWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzA1YjkxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvU2ltcGxlVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CisKKy8qKgorICogUnVucyBhIHZhbGlkYXRvciBvbiBhbGwgbm9kZXMgb2YgYSBjZXJ0YWluIHR5cGUsCisgKiBhbmQgYWRkcyBhIHByb2JsZW0gZm9yIGFsbCBub2RlcyB0aGF0IHBhc3MgYSBjb25kaXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0b3I8TiBleHRlbmRzIE5vZGU+IGV4dGVuZHMgU2luZ2xlTm9kZVR5cGVWYWxpZGF0b3I8Tj4geworICAgIHB1YmxpYyBTaW1wbGVWYWxpZGF0b3IoQ2xhc3M8Tj4gdHlwZSwgUHJlZGljYXRlPE4+IGNvbmRpdGlvbiwgQmlDb25zdW1lcjxOLCBQcm9ibGVtUmVwb3J0ZXI+IHByb2JsZW1TdXBwbGllcikgeworICAgICAgICBzdXBlcih0eXBlLCAobm9kZSwgcHJvYmxlbVJlcG9ydGVyKSAtPiB7CisgICAgICAgICAgICBpZiAoY29uZGl0aW9uLnRlc3Qobm9kZSkpIHsKKyAgICAgICAgICAgICAgICBwcm9ibGVtU3VwcGxpZXIuYWNjZXB0KG5vZGUsIHByb2JsZW1SZXBvcnRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1NpbmdsZU5vZGVUeXBlVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9TaW5nbGVOb2RlVHlwZVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTg0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9TaW5nbGVOb2RlVHlwZVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKKy8qKgorICogUnVucyBhIHZhbGlkYXRvciBvbiBhbGwgbm9kZXMgb2YgYSBjZXJ0YWluIHR5cGUuCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcjxOIGV4dGVuZHMgTm9kZT4gaW1wbGVtZW50cyBWYWxpZGF0b3IgeworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Tj4gdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGVkVmFsaWRhdG9yPE4+IHZhbGlkYXRvcjsKKworICAgIHB1YmxpYyBTaW5nbGVOb2RlVHlwZVZhbGlkYXRvcihDbGFzczxOPiB0eXBlLCBUeXBlZFZhbGlkYXRvcjxOPiB2YWxpZGF0b3IpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KE5vZGUgbm9kZSwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgeworICAgICAgICBpZiAodHlwZS5pc0luc3RhbmNlKG5vZGUpKSB7CisgICAgICAgICAgICB2YWxpZGF0b3IuYWNjZXB0KHR5cGUuY2FzdChub2RlKSwgcHJvYmxlbVJlcG9ydGVyKTsKKyAgICAgICAgfQorICAgICAgICBub2RlLmZpbmRBbGwodHlwZSkuZm9yRWFjaChuIC0+IHZhbGlkYXRvci5hY2NlcHQobiwgcHJvYmxlbVJlcG9ydGVyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvVHJlZVZpc2l0b3JWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1RyZWVWaXNpdG9yVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4ZTA0OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1RyZWVWaXNpdG9yVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworLyoqCisgKiBBIHZhbGlkYXRvciB0aGF0IHdhbGtzIHRoZSB3aG9sZSB0cmVlLCB2aXNpdGluZyBldmVyeSBub2RlLgorICovCitwdWJsaWMgY2xhc3MgVHJlZVZpc2l0b3JWYWxpZGF0b3IgaW1wbGVtZW50cyBWYWxpZGF0b3IgeworICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdG9yIHZhbGlkYXRvcjsKKworICAgIHB1YmxpYyBUcmVlVmlzaXRvclZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisgICAgICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFjY2VwdChOb2RlIG5vZGUsIFByb2JsZW1SZXBvcnRlciByZXBvcnRlcikgeworICAgICAgICB2YWxpZGF0b3IuYWNjZXB0KG5vZGUsIHJlcG9ydGVyKTsKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogbm9kZS5nZXRDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgIGFjY2VwdChjaGlsZCwgcmVwb3J0ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvVHlwZWRWYWxpZGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1R5cGVkVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4YzUzZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1R5cGVkVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKKworLyoqCisgKiBBIHZhbGlkYXRvciB0aGF0IHZhbGlkYXRlcyBhIGtub3duIG5vZGUgdHlwZS4KKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlZFZhbGlkYXRvcjxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBCaUNvbnN1bWVyPE4sIFByb2JsZW1SZXBvcnRlcj4geworICAgIC8qKgorICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRoYXQgd2FudHMgdG8gYmUgdmFsaWRhdGVkCisgICAgICogQHBhcmFtIHByb2JsZW1SZXBvcnRlciB3aGVuIGZvdW5kLCB2YWxpZGF0aW9uIGVycm9ycyBjYW4gYmUgcmVwb3J0ZWQgaGVyZQorICAgICAqLworICAgIHZvaWQgYWNjZXB0KE4gbm9kZSwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcik7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IFBhcnNlUmVzdWx0LlBvc3RQcm9jZXNzb3IgcG9zdFByb2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQsIGNvbmZpZ3VyYXRpb24pIC0+CisgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3VsdCgpLmlmUHJlc2VudChub2RlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQoKE4pIG5vZGUsIG5ldyBQcm9ibGVtUmVwb3J0ZXIocHJvYmxlbSAtPiByZXN1bHQuZ2V0UHJvYmxlbXMoKS5hZGQocHJvYmxlbSkpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU3NTJhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworLyoqCisgKiBBIHZhbGlkYXRvciB0aGF0IGNhbiBiZSBydW4gb24gYSBub2RlIHRvIGNoZWNrIGZvciBzZW1hbnRpYyBlcnJvcnMuCisgKiBJdCBpcyBmdWxseSB1cCB0byB0aGUgaW1wbGVtZW50b3IgaG93IHRvIGRvIHRoaXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdG9yIGV4dGVuZHMgVHlwZWRWYWxpZGF0b3I8Tm9kZT4geworICAgIC8qKgorICAgICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRoYXQgd2FudHMgdG8gYmUgdmFsaWRhdGVkCisgICAgICogQHBhcmFtIHByb2JsZW1SZXBvcnRlciB3aGVuIGZvdW5kLCB2YWxpZGF0aW9uIGVycm9ycyBjYW4gYmUgcmVwb3J0ZWQgaGVyZQorICAgICAqLworICAgIHZvaWQgYWNjZXB0KE5vZGUgbm9kZSwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcik7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9WYWxpZGF0b3JzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9WYWxpZGF0b3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2OTI2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1ZhbGlkYXRvcnMuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgdmFsaWRhdG9yIHRoYXQgd2lsbCBjYWxsIGEgY29sbGVjdGlvbiBvZiB2YWxpZGF0b3JzLgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9ycyBpbXBsZW1lbnRzIFZhbGlkYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFZhbGlkYXRvcj4gdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIFZhbGlkYXRvcnMoVmFsaWRhdG9yLi4uIHZhbGlkYXRvcnMpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0b3JzLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbGlkYXRvcnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxWYWxpZGF0b3I+IGdldFZhbGlkYXRvcnMoKSB7CisgICAgICAgIHJldHVybiB2YWxpZGF0b3JzOworICAgIH0KKworICAgIHB1YmxpYyBWYWxpZGF0b3JzIHJlbW92ZShWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisgICAgICAgIGlmICghdmFsaWRhdG9ycy5yZW1vdmUodmFsaWRhdG9yKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUcnlpbmcgdG8gcmVtb3ZlIGEgdmFsaWRhdG9yIHRoYXQgaXNuJ3QgdGhlcmUuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFZhbGlkYXRvcnMgcmVwbGFjZShWYWxpZGF0b3Igb2xkVmFsaWRhdG9yLCBWYWxpZGF0b3IgbmV3VmFsaWRhdG9yKSB7CisgICAgICAgIHJlbW92ZShvbGRWYWxpZGF0b3IpOworICAgICAgICBhZGQobmV3VmFsaWRhdG9yKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFZhbGlkYXRvcnMgYWRkKFZhbGlkYXRvciBuZXdWYWxpZGF0b3IpIHsKKyAgICAgICAgdmFsaWRhdG9ycy5hZGQobmV3VmFsaWRhdG9yKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KE5vZGUgbm9kZSwgUHJvYmxlbVJlcG9ydGVyIHByb2JsZW1SZXBvcnRlcikgeworICAgICAgICB2YWxpZGF0b3JzLmZvckVhY2godiAtPiB2LmFjY2VwdChub2RlLCBwcm9ibGVtUmVwb3J0ZXIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9WaXNpdG9yVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9WaXNpdG9yVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3MDkyZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL1Zpc2l0b3JWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXI7CisKKy8qKgorICogQSB2YWxpZGF0b3IgdGhhdCB1c2VzIGEgdmlzaXRvciBmb3IgdmFsaWRhdGlvbi4KKyAqIFRoaXMgY2xhc3MgaXMgdGhlIHZpc2l0b3IgdG9vLgorICogSW1wbGVtZW50IHRoZSAidmlzaXQiIG1ldGhvZHMgeW91IHdhbnQgdG8gdXNlIGZvciB2YWxpZGF0aW9uLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlzaXRvclZhbGlkYXRvciBleHRlbmRzIFZvaWRWaXNpdG9yQWRhcHRlcjxQcm9ibGVtUmVwb3J0ZXI+IGltcGxlbWVudHMgVmFsaWRhdG9yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoTm9kZSBub2RlLCBQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyKSB7CisgICAgICAgIG5vZGUuYWNjZXB0KHRoaXMsIHByb2JsZW1SZXBvcnRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL0NvbW1vblZhbGlkYXRvcnMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL2NodW5rcy9Db21tb25WYWxpZGF0b3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1Yjc5MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL2NodW5rcy9Db21tb25WYWxpZGF0b3JzLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3M7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuU2ltcGxlVmFsaWRhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlNpbmdsZU5vZGVUeXBlVmFsaWRhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlRyZWVWaXNpdG9yVmFsaWRhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlZhbGlkYXRvcnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Ob2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQ29udGFpbnMgdmFsaWRhdGlvbnMgdGhhdCBhcmUgdmFsaWQgZm9yIGV2ZXJ5IEphdmEgdmVyc2lvbi4KKyAqLworcHVibGljIGNsYXNzIENvbW1vblZhbGlkYXRvcnMgZXh0ZW5kcyBWYWxpZGF0b3JzIHsKKyAgICBwdWJsaWMgQ29tbW9uVmFsaWRhdG9ycygpIHsKKyAgICAgICAgc3VwZXIoCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVZhbGlkYXRvcjw+KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gLT4gIW4uaXNJbnRlcmZhY2UoKSAmJiBuLmdldEV4dGVuZGVkVHlwZXMoKS5zaXplKCkgPiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgKG4sIHJlcG9ydGVyKSAtPiByZXBvcnRlci5yZXBvcnQobi5nZXRFeHRlbmRlZFR5cGVzKDEpLCAiQSBjbGFzcyBjYW5ub3QgZXh0ZW5kIG1vcmUgdGhhbiBvbmUgb3RoZXIgY2xhc3MuIikKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVWYWxpZGF0b3I8PihDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBuIC0+IG4uaXNJbnRlcmZhY2UoKSAmJiAhbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKG4sIHJlcG9ydGVyKSAtPiByZXBvcnRlci5yZXBvcnQobi5nZXRJbXBsZW1lbnRlZFR5cGVzKDApLCAiQW4gaW50ZXJmYWNlIGNhbm5vdCBpbXBsZW1lbnQgb3RoZXIgaW50ZXJmYWNlcy4iKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgbmV3IFNpbmdsZU5vZGVUeXBlVmFsaWRhdG9yPD4oQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzLCAobiwgcmVwb3J0ZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRNZW1iZXJzKCkuZm9yRWFjaChtZW0gLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW0gaW5zdGFuY2VvZiBJbml0aWFsaXplckRlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydChtZW0sICJBbiBpbnRlcmZhY2UgY2Fubm90IGhhdmUgaW5pdGlhbGl6ZXJzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgbmV3IFNpbmdsZU5vZGVUeXBlVmFsaWRhdG9yPD4oQXNzaWduRXhwci5jbGFzcywgKG4sIHJlcG9ydGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U4L2h0bWwvamxzLTE1Lmh0bWwjamxzLTE1LjI2CisgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gdGFyZ2V0ID0gbi5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldCBpbnN0YW5jZW9mIEVuY2xvc2VkRXhwcikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKChFbmNsb3NlZEV4cHIpIHRhcmdldCkuZ2V0SW5uZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTmFtZUV4cHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0YXJnZXQgaW5zdGFuY2VvZiBBcnJheUFjY2Vzc0V4cHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0YXJnZXQgaW5zdGFuY2VvZiBGaWVsZEFjY2Vzc0V4cHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobi5nZXRUYXJnZXQoKSwgIklsbGVnYWwgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBuZXcgVHJlZVZpc2l0b3JWYWxpZGF0b3IoKG5vZGUsIHByb2JsZW1SZXBvcnRlcikgLT4geworICAgICAgICAgICAgICAgICAgICBOb2RlTWV0YU1vZGVsIG1tID0gbm9kZS5nZXRNZXRhTW9kZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBwcG0gOiBtbS5nZXRBbGxQcm9wZXJ0eU1ldGFNb2RlbHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwbS5pc05vbkVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBtLmlzTm9kZUxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCB2YWx1ZSA9IChOb2RlTGlzdCkgcHBtLmdldFZhbHVlKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtUmVwb3J0ZXIucmVwb3J0KG5vZGUsICIlcy4lcyBjYW4gbm90IGJlIGVtcHR5LiIsIG1tLmdldFR5cGVOYW1lKCksIHBwbS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgZW1wdHkgc3RyaW5ncywgaXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gc2V0IHRoZW0gdG8gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL01vZGlmaWVyVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9jaHVua3MvTW9kaWZpZXJWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAxYzMzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL01vZGlmaWVyVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyMTEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuY2h1bmtzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLk1vZHVsZVJlcXVpcmVzU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRva2VuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5WaXNpdG9yVmFsaWRhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5TZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4qOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKKworCisvKioKKyAqIFZlcmlmaWVzIHRoYXQgb25seSBhbGxvd2VkIG1vZGlmaWVycyBhcmUgdXNlZCB3aGVyZSBtb2RpZmllcnMgYXJlIGV4cGVjdGVkLgorICovCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJWYWxpZGF0b3IgZXh0ZW5kcyBWaXNpdG9yVmFsaWRhdG9yIHsKKyAgICBwcml2YXRlIGZpbmFsIE1vZGlmaWVyW10gaW50ZXJmYWNlV2l0aE5vdGhpbmdTcGVjaWFsID0gbmV3IE1vZGlmaWVyW117UFVCTElDLCBQUk9URUNURUQsIEFCU1RSQUNULCBGSU5BTCwgU1lOQ0hST05JWkVELCBOQVRJVkUsIFNUUklDVEZQfTsKKyAgICBwcml2YXRlIGZpbmFsIE1vZGlmaWVyW10gaW50ZXJmYWNlV2l0aFN0YXRpY0FuZERlZmF1bHQgPSBuZXcgTW9kaWZpZXJbXXtQVUJMSUMsIFBST1RFQ1RFRCwgQUJTVFJBQ1QsIFNUQVRJQywgRklOQUwsIFNZTkNIUk9OSVpFRCwgTkFUSVZFLCBTVFJJQ1RGUCwgREVGQVVMVH07CisgICAgcHJpdmF0ZSBmaW5hbCBNb2RpZmllcltdIGludGVyZmFjZVdpdGhTdGF0aWNBbmREZWZhdWx0QW5kUHJpdmF0ZSA9IG5ldyBNb2RpZmllcltde1BVQkxJQywgUFJPVEVDVEVELCBQUklWQVRFLCBBQlNUUkFDVCwgU1RBVElDLCBGSU5BTCwgU1lOQ0hST05JWkVELCBOQVRJVkUsIFNUUklDVEZQLCBERUZBVUxUfTsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNTdHJpY3RmcDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzRGVmYXVsdEFuZFN0YXRpY0ludGVyZmFjZU1ldGhvZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc1ByaXZhdGVJbnRlcmZhY2VNZXRob2RzOworCisgICAgcHVibGljIE1vZGlmaWVyVmFsaWRhdG9yKGJvb2xlYW4gaGFzU3RyaWN0ZnAsIGJvb2xlYW4gaGFzRGVmYXVsdEFuZFN0YXRpY0ludGVyZmFjZU1ldGhvZHMsIGJvb2xlYW4gaGFzUHJpdmF0ZUludGVyZmFjZU1ldGhvZHMpIHsKKyAgICAgICAgdGhpcy5oYXNTdHJpY3RmcCA9IGhhc1N0cmljdGZwOworICAgICAgICB0aGlzLmhhc0RlZmF1bHRBbmRTdGF0aWNJbnRlcmZhY2VNZXRob2RzID0gaGFzRGVmYXVsdEFuZFN0YXRpY0ludGVyZmFjZU1ldGhvZHM7CisgICAgICAgIHRoaXMuaGFzUHJpdmF0ZUludGVyZmFjZU1ldGhvZHMgPSBoYXNQcml2YXRlSW50ZXJmYWNlTWV0aG9kczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIGlmIChuLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlSW50ZXJmYWNlTW9kaWZpZXJzKG4sIHJlcG9ydGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbGlkYXRlQ2xhc3NNb2RpZmllcnMobiwgcmVwb3J0ZXIpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIHJlcG9ydGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDbGFzc01vZGlmaWVycyhDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIGlmIChuLmlzVG9wTGV2ZWxUeXBlKCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBQVUJMSUMsIEFCU1RSQUNULCBGSU5BTCwgU1RSSUNURlApOworICAgICAgICB9IGVsc2UgaWYgKG4uaXNOZXN0ZWRUeXBlKCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBQVUJMSUMsIFBST1RFQ1RFRCwgUFJJVkFURSwgQUJTVFJBQ1QsIFNUQVRJQywgRklOQUwsIFNUUklDVEZQKTsKKyAgICAgICAgfSBlbHNlIGlmIChuLmlzTG9jYWxDbGFzc0RlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBBQlNUUkFDVCwgRklOQUwsIFNUUklDVEZQKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUludGVyZmFjZU1vZGlmaWVycyhUeXBlRGVjbGFyYXRpb248Pz4gbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIGlmIChuLmlzVG9wTGV2ZWxUeXBlKCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBQVUJMSUMsIEFCU1RSQUNULCBTVFJJQ1RGUCk7CisgICAgICAgIH0gZWxzZSBpZiAobi5pc05lc3RlZFR5cGUoKSkgeworICAgICAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobiwgcmVwb3J0ZXIsIFBVQkxJQywgUFJPVEVDVEVELCBQUklWQVRFLCBBQlNUUkFDVCwgU1RBVElDLCBTVFJJQ1RGUCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChFbnVtRGVjbGFyYXRpb24gbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIGlmIChuLmlzVG9wTGV2ZWxUeXBlKCkpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBQVUJMSUMsIFNUUklDVEZQKTsKKyAgICAgICAgfSBlbHNlIGlmIChuLmlzTmVzdGVkVHlwZSgpKSB7CisgICAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhuLCByZXBvcnRlciwgUFVCTElDLCBQUk9URUNURUQsIFBSSVZBVEUsIFNUQVRJQywgU1RSSUNURlApOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIHJlcG9ydGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIHZhbGlkYXRlSW50ZXJmYWNlTW9kaWZpZXJzKG4sIHJlcG9ydGVyKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgcmVwb3J0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBQcm9ibGVtUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobiwgcmVwb3J0ZXIsIFBVQkxJQywgQUJTVFJBQ1QpOworICAgICAgICBzdXBlci52aXNpdChuLCByZXBvcnRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBQcm9ibGVtUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobiwgcmVwb3J0ZXIsIFBVQkxJQywgUFJPVEVDVEVELCBQUklWQVRFKTsKKyAgICAgICAgbi5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHZhbGlkYXRlTW9kaWZpZXJzKHAsIHJlcG9ydGVyLCBGSU5BTCkpOworICAgICAgICBzdXBlci52aXNpdChuLCByZXBvcnRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoRmllbGREZWNsYXJhdGlvbiBuLCBQcm9ibGVtUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobiwgcmVwb3J0ZXIsIFBVQkxJQywgUFJPVEVDVEVELCBQUklWQVRFLCBTVEFUSUMsIEZJTkFMLCBUUkFOU0lFTlQsIFZPTEFUSUxFKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgcmVwb3J0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG4sIFByb2JsZW1SZXBvcnRlciByZXBvcnRlcikgeworICAgICAgICBpZiAobi5pc0Fic3RyYWN0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFNlcGFyYXRlZEl0ZW1TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIoIkNhbm5vdCBiZSAnYWJzdHJhY3QnIGFuZCBhbHNvICciLCAiJywgJyIsICInLiIpOworICAgICAgICAgICAgZm9yIChNb2RpZmllciBtIDogYXNMaXN0KFBSSVZBVEUsIFNUQVRJQywgRklOQUwsIE5BVElWRSwgU1RSSUNURlAsIFNZTkNIUk9OSVpFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhtKSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtLmFzU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWlsZGVyLmhhc0l0ZW1zKCkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobiwgYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChuLmdldFBhcmVudE5vZGUoKS5nZXQoKSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgIGlmICgoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgbi5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0RlZmF1bHRBbmRTdGF0aWNJbnRlcmZhY2VNZXRob2RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJpdmF0ZUludGVyZmFjZU1ldGhvZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhuLCByZXBvcnRlciwgaW50ZXJmYWNlV2l0aFN0YXRpY0FuZERlZmF1bHRBbmRQcml2YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobiwgcmVwb3J0ZXIsIGludGVyZmFjZVdpdGhTdGF0aWNBbmREZWZhdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBpbnRlcmZhY2VXaXRoTm90aGluZ1NwZWNpYWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobiwgcmVwb3J0ZXIsIFBVQkxJQywgUFJPVEVDVEVELCBQUklWQVRFLCBBQlNUUkFDVCwgU1RBVElDLCBGSU5BTCwgU1lOQ0hST05JWkVELCBOQVRJVkUsIFNUUklDVEZQKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbi5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHZhbGlkYXRlTW9kaWZpZXJzKHAsIHJlcG9ydGVyLCBGSU5BTCkpOworICAgICAgICBzdXBlci52aXNpdChuLCByZXBvcnRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBQcm9ibGVtUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgICAgICAgbi5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHsKKyAgICAgICAgICAgIC8vIEZpbmFsIGlzIG5vdCBhbGxvd2VkIG9uIGluZmVycmVkIHBhcmFtZXRlcnMsIGJ1dCB0aG9zZSBnZXQgY2F1Z2h0IGJ5IHRoZSBwYXJzZXIuCisgICAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhwLCByZXBvcnRlciwgRklOQUwpOworICAgICAgICB9KTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgcmVwb3J0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KENhdGNoQ2xhdXNlIG4sIFByb2JsZW1SZXBvcnRlciByZXBvcnRlcikgeworICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhuLmdldFBhcmFtZXRlcigpLCByZXBvcnRlciwgRklOQUwpOworICAgICAgICBzdXBlci52aXNpdChuLCByZXBvcnRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBGSU5BTCk7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIHJlcG9ydGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChNb2R1bGVSZXF1aXJlc1N0bXQgbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG4sIHJlcG9ydGVyLCBUUkFOU0lUSVZFLCBTVEFUSUMpOworICAgICAgICBzdXBlci52aXNpdChuLCByZXBvcnRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIE5vZGVXaXRoTW9kaWZpZXJzPD8+ICYgTm9kZVdpdGhUb2tlblJhbmdlPD8+PiB2b2lkIHZhbGlkYXRlTW9kaWZpZXJzKFQgbiwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyLCBNb2RpZmllci4uLiBhbGxvd2VkTW9kaWZpZXJzKSB7CisgICAgICAgIHZhbGlkYXRlQXRNb3N0T25lT2YobiwgcmVwb3J0ZXIsIFBVQkxJQywgUFJPVEVDVEVELCBQUklWQVRFKTsKKyAgICAgICAgdmFsaWRhdGVBdE1vc3RPbmVPZihuLCByZXBvcnRlciwgRklOQUwsIEFCU1RSQUNUKTsKKyAgICAgICAgaWYgKGhhc1N0cmljdGZwKSB7CisgICAgICAgICAgICB2YWxpZGF0ZUF0TW9zdE9uZU9mKG4sIHJlcG9ydGVyLCBOQVRJVkUsIFNUUklDVEZQKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbG93ZWRNb2RpZmllcnMgPSByZW1vdmVNb2RpZmllckZyb21BcnJheShTVFJJQ1RGUCwgYWxsb3dlZE1vZGlmaWVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChNb2RpZmllciBtIDogbi5nZXRNb2RpZmllcnMoKSkgeworICAgICAgICAgICAgaWYgKCFhcnJheUNvbnRhaW5zKGFsbG93ZWRNb2RpZmllcnMsIG0pKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0KG4sICInJXMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwgbS5hc1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTW9kaWZpZXJbXSByZW1vdmVNb2RpZmllckZyb21BcnJheShNb2RpZmllciBtLCBNb2RpZmllcltdIGFsbG93ZWRNb2RpZmllcnMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxNb2RpZmllcj4gbmV3TW9kaWZpZXJzID0gbmV3IEFycmF5TGlzdDw+KGFzTGlzdChhbGxvd2VkTW9kaWZpZXJzKSk7CisgICAgICAgIG5ld01vZGlmaWVycy5yZW1vdmUobSk7CisgICAgICAgIGFsbG93ZWRNb2RpZmllcnMgPSBuZXdNb2RpZmllcnMudG9BcnJheShuZXcgTW9kaWZpZXJbMF0pOworICAgICAgICByZXR1cm4gYWxsb3dlZE1vZGlmaWVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYXJyYXlDb250YWlucyhPYmplY3RbXSBpdGVtcywgT2JqZWN0IHNlYXJjaEl0ZW0pIHsKKyAgICAgICAgZm9yIChPYmplY3QgbyA6IGl0ZW1zKSB7CisgICAgICAgICAgICBpZiAobyA9PSBzZWFyY2hJdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOb2RlV2l0aE1vZGlmaWVyczw/PiAmIE5vZGVXaXRoVG9rZW5SYW5nZTw/Pj4gdm9pZCB2YWxpZGF0ZUF0TW9zdE9uZU9mKFQgdCwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgTGlzdDxNb2RpZmllcj4gZm91bmRNb2RpZmllcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChNb2RpZmllciBtIDogbW9kaWZpZXJzKSB7CisgICAgICAgICAgICBpZiAodC5nZXRNb2RpZmllcnMoKS5jb250YWlucyhtKSkgeworICAgICAgICAgICAgICAgIGZvdW5kTW9kaWZpZXJzLmFkZChtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZm91bmRNb2RpZmllcnMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlcigiQ2FuIGhhdmUgb25seSBvbmUgb2YgJyIsICInLCAnIiwgIicuIik7CisgICAgICAgICAgICBmb3IgKE1vZGlmaWVyIG0gOiBmb3VuZE1vZGlmaWVycykgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG0uYXNTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQodCwgYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL05vQmluYXJ5SW50ZWdlckxpdGVyYWxzVmFsaWRhdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9jaHVua3MvTm9CaW5hcnlJbnRlZ2VyTGl0ZXJhbHNWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmU4ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL05vQmluYXJ5SW50ZWdlckxpdGVyYWxzVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3M7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsU3RyaW5nVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlZpc2l0b3JWYWxpZGF0b3I7CisKK3B1YmxpYyBjbGFzcyBOb0JpbmFyeUludGVnZXJMaXRlcmFsc1ZhbGlkYXRvciBleHRlbmRzIFZpc2l0b3JWYWxpZGF0b3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEludGVnZXJMaXRlcmFsRXhwciBuLCBQcm9ibGVtUmVwb3J0ZXIgYXJnKSB7CisgICAgICAgIHZhbGlkYXRlKG4sIGFyZyk7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTG9uZ0xpdGVyYWxFeHByIG4sIFByb2JsZW1SZXBvcnRlciBhcmcpIHsKKyAgICAgICAgdmFsaWRhdGUobiwgYXJnKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlKExpdGVyYWxTdHJpbmdWYWx1ZUV4cHIgbiwgUHJvYmxlbVJlcG9ydGVyIGFyZykgeworICAgICAgICBpZiAobi5nZXRWYWx1ZSgpLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiMEIiKSkgeworICAgICAgICAgICAgYXJnLnJlcG9ydChuLCAiQmluYXJ5IGxpdGVyYWwgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL05vVW5kZXJzY29yZXNJbkludGVnZXJMaXRlcmFsc1ZhbGlkYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL05vVW5kZXJzY29yZXNJbkludGVnZXJMaXRlcmFsc1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWI3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9jaHVua3MvTm9VbmRlcnNjb3Jlc0luSW50ZWdlckxpdGVyYWxzVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3M7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsU3RyaW5nVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuUHJvYmxlbVJlcG9ydGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlZpc2l0b3JWYWxpZGF0b3I7CisKK3B1YmxpYyBjbGFzcyBOb1VuZGVyc2NvcmVzSW5JbnRlZ2VyTGl0ZXJhbHNWYWxpZGF0b3IgZXh0ZW5kcyBWaXNpdG9yVmFsaWRhdG9yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgUHJvYmxlbVJlcG9ydGVyIGFyZykgeworICAgICAgICB2YWxpZGF0ZShuLCBhcmcpOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KExvbmdMaXRlcmFsRXhwciBuLCBQcm9ibGVtUmVwb3J0ZXIgYXJnKSB7CisgICAgICAgIHZhbGlkYXRlKG4sIGFyZyk7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZShMaXRlcmFsU3RyaW5nVmFsdWVFeHByIG4sIFByb2JsZW1SZXBvcnRlciBhcmcpIHsKKyAgICAgICAgaWYgKG4uZ2V0VmFsdWUoKS5jb250YWlucygiXyIpKSB7CisgICAgICAgICAgICBhcmcucmVwb3J0KG4sICJVbmRlcnNjb3JlcyBpbiBsaXRlcmFsIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL2NodW5rcy9VbmRlcnNjb3JlS2V5d29yZFZhbGlkYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL1VuZGVyc2NvcmVLZXl3b3JkVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxMjU5NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL2NodW5rcy9VbmRlcnNjb3JlS2V5d29yZFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuY2h1bmtzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5WaXNpdG9yVmFsaWRhdG9yOworCitwdWJsaWMgY2xhc3MgVW5kZXJzY29yZUtleXdvcmRWYWxpZGF0b3IgZXh0ZW5kcyBWaXNpdG9yVmFsaWRhdG9yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChOYW1lIG4sIFByb2JsZW1SZXBvcnRlciBhcmcpIHsKKyAgICAgICAgdmFsaWRhdGVJZGVudGlmaWVyKG4sIG4uZ2V0SWRlbnRpZmllcigpLCBhcmcpOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFNpbXBsZU5hbWUgbiwgUHJvYmxlbVJlcG9ydGVyIGFyZykgeworICAgICAgICB2YWxpZGF0ZUlkZW50aWZpZXIobiwgbi5nZXRJZGVudGlmaWVyKCksIGFyZyk7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUlkZW50aWZpZXIoTm9kZSBuLCBTdHJpbmcgaWQsIFByb2JsZW1SZXBvcnRlciBhcmcpIHsKKyAgICAgICAgaWYgKGlkLmVxdWFscygiXyIpKSB7CisgICAgICAgICAgICBhcmcucmVwb3J0KG4sICInXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL1ZhclZhbGlkYXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvY2h1bmtzL1ZhclZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MzU3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9jaHVua3MvVmFyVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5jaHVua3M7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTnVsbExpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5WYXJUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLlByb2JsZW1SZXBvcnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5UeXBlZFZhbGlkYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFZhclZhbGlkYXRvciBpbXBsZW1lbnRzIFR5cGVkVmFsaWRhdG9yPFZhclR5cGU+IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmFyQWxsb3dlZEluTGFtYmRhUGFyYW1ldGVyczsKKworICAgIHB1YmxpYyBWYXJWYWxpZGF0b3IoYm9vbGVhbiB2YXJBbGxvd2VkSW5MYW1iZGFQYXJhbWV0ZXJzKSB7CisgICAgICAgIHRoaXMudmFyQWxsb3dlZEluTGFtYmRhUGFyYW1ldGVycyA9IHZhckFsbG93ZWRJbkxhbWJkYVBhcmFtZXRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KFZhclR5cGUgbm9kZSwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIC8vIEFsbCBhbGxvd2VkIGxvY2F0aW9ucyBhcmUgd2l0aGluIGEgVmFyaWFibGVEZWNsYXJhdGlvbiBpbnNpZGUgYSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBpbnNpZGUgc29tZXRoaW5nIGVsc2UuCisgICAgICAgIE9wdGlvbmFsPFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVEZWNsYXJhdG9yID0gbm9kZS5maW5kUGFyZW50KFZhcmlhYmxlRGVjbGFyYXRvci5jbGFzcyk7CisgICAgICAgIGlmICghdmFyaWFibGVEZWNsYXJhdG9yLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAvLyBKYXZhIDExJ3MgdmFyIGluIGxhbWJkYSdzCisgICAgICAgICAgICBpZiAodmFyQWxsb3dlZEluTGFtYmRhUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZFBhcmVudChQYXJhbWV0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcChOb2RlOjpnZXRQYXJlbnROb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoTm9kZSBwKSAtPiBwIGluc3RhbmNlb2YgTGFtYmRhRXhwcikub3JFbHNlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydElsbGVnYWxQb3NpdGlvbihub2RlLCByZXBvcnRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yLmlmUHJlc2VudCh2ZCAtPiB7CisgICAgICAgICAgICBPcHRpb25hbDxOb2RlPiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwciA9IHZkLmdldFBhcmVudE5vZGUoKTsKKyAgICAgICAgICAgIGlmICghdmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRJbGxlZ2FsUG9zaXRpb24obm9kZSwgcmVwb3J0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmlmUHJlc2VudCh2ZGVOb2RlIC0+IHsKKyAgICAgICAgICAgICAgICBpZiAoISh2ZGVOb2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydElsbGVnYWxQb3NpdGlvbihub2RlLCByZXBvcnRlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmRlID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB2ZGVOb2RlOworICAgICAgICAgICAgICAgIGlmICh2ZGUuZ2V0VmFyaWFibGVzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQodmRlLCAiXCJ2YXJcIiBvbmx5IHRha2VzIGEgc2luZ2xlIHZhcmlhYmxlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPcHRpb25hbDxOb2RlPiBjb250YWluZXIgPSB2ZGVOb2RlLmdldFBhcmVudE5vZGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRJbGxlZ2FsUG9zaXRpb24obm9kZSwgcmVwb3J0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pZlByZXNlbnQoYyAtPiB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcG9zaXRpb25Jc0ZpbmUgPSBjIGluc3RhbmNlb2YgRm9yU3RtdCB8fCBjIGluc3RhbmNlb2YgRm9yZWFjaFN0bXQgfHwgYyBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdG10OworICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uSXNGaW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRJbGxlZ2FsUG9zaXRpb24obm9kZSwgcmVwb3J0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gZW5kcyB1cCBpbnNpZGUgYW4gRXhwcmVzc2lvblN0bXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgRXhwcmVzc2lvblN0bXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmQuZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydChub2RlLCAiXCJ2YXJcIiBuZWVkcyBhbiBpbml0aWFsaXplci4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZkLmdldEluaXRpYWxpemVyKCkuaWZQcmVzZW50KGluaXRpYWxpemVyIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgaW5zdGFuY2VvZiBOdWxsTGl0ZXJhbEV4cHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIucmVwb3J0KG5vZGUsICJcInZhclwiIGNhbm5vdCBpbmZlciB0eXBlIGZyb20ganVzdCBudWxsLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgaW5zdGFuY2VvZiBBcnJheUNyZWF0aW9uRXhwcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci5yZXBvcnQobm9kZSwgIlwidmFyXCIgY2Fubm90IGluZmVyIGFycmF5IHR5cGVzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXBvcnRJbGxlZ2FsUG9zaXRpb24oVmFyVHlwZSBuLCBQcm9ibGVtUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgICAgICAgcmVwb3J0ZXIucmVwb3J0KG4sICJcInZhclwiIGlzIG5vdCBhbGxvd2VkIGhlcmUuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0Nsb25lVmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0Nsb25lVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvQ2xvbmVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxMDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgY2xvbmVzIChjb3BpZXMpIGEgbm9kZSBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KKyAqLworcHVibGljIGNsYXNzIENsb25lVmlzaXRvciBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPFZpc2l0YWJsZSwgT2JqZWN0PiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMgPSBjbG9uZUxpc3Qobi5nZXRJbXBvcnRzKCksIGFyZyk7CisgICAgICAgIE1vZHVsZURlY2xhcmF0aW9uIG1vZHVsZSA9IGNsb25lTm9kZShuLmdldE1vZHVsZSgpLCBhcmcpOworICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gY2xvbmVOb2RlKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGVEZWNsYXJhdGlvbjw/Pj4gdHlwZXMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlcygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCByID0gbmV3IENvbXBpbGF0aW9uVW5pdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHBhY2thZ2VEZWNsYXJhdGlvbiwgaW1wb3J0cywgdHlwZXMsIG1vZHVsZSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIE5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gciA9IG5ldyBQYWNrYWdlRGVjbGFyYXRpb24obi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBhbm5vdGF0aW9ucywgbmFtZSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQgPSBjbG9uZUxpc3Qobi5nZXRUeXBlQm91bmQoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBUeXBlUGFyYW1ldGVyIHIgPSBuZXcgVHlwZVBhcmFtZXRlcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG5hbWUsIHR5cGVCb3VuZCwgYW5ub3RhdGlvbnMpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTGluZUNvbW1lbnQgciA9IG5ldyBMaW5lQ29tbWVudChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG4uZ2V0Q29udGVudCgpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBCbG9ja0NvbW1lbnQgciA9IG5ldyBCbG9ja0NvbW1lbnQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldENvbnRlbnQoKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRlbmRlZFR5cGVzID0gY2xvbmVMaXN0KG4uZ2V0RXh0ZW5kZWRUeXBlcygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50ZWRUeXBlcyA9IGNsb25lTGlzdChuLmdldEltcGxlbWVudGVkVHlwZXMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBjbG9uZUxpc3Qobi5nZXRNZW1iZXJzKCksIGFyZyk7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gciA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24obi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgbi5pc0ludGVyZmFjZSgpLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgZXh0ZW5kZWRUeXBlcywgaW1wbGVtZW50ZWRUeXBlcywgbWVtYmVycyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnRyaWVzID0gY2xvbmVMaXN0KG4uZ2V0RW50cmllcygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50ZWRUeXBlcyA9IGNsb25lTGlzdChuLmdldEltcGxlbWVudGVkVHlwZXMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzID0gY2xvbmVMaXN0KG4uZ2V0TWVtYmVycygpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgRW51bURlY2xhcmF0aW9uIHIgPSBuZXcgRW51bURlY2xhcmF0aW9uKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIG5hbWUsIGltcGxlbWVudGVkVHlwZXMsIGVudHJpZXMsIG1lbWJlcnMpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IGNsb25lTGlzdChuLmdldEFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGNsYXNzQm9keSA9IGNsb25lTGlzdChuLmdldENsYXNzQm9keSgpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gciA9IG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGFubm90YXRpb25zLCBuYW1lLCBhcmd1bWVudHMsIGNsYXNzQm9keSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycyA9IGNsb25lTGlzdChuLmdldE1lbWJlcnMoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiByID0gbmV3IEFubm90YXRpb25EZWNsYXJhdGlvbihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG4uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCBuYW1lLCBtZW1iZXJzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUgPSBjbG9uZU5vZGUobi5nZXREZWZhdWx0VmFsdWUoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBUeXBlIHR5cGUgPSBjbG9uZU5vZGUobi5nZXRUeXBlKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHIgPSBuZXcgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGUsIG5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IGNsb25lTGlzdChuLmdldFZhcmlhYmxlcygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gciA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHZhcmlhYmxlcyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBjbG9uZU5vZGUobi5nZXRJbml0aWFsaXplcigpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIFR5cGUgdHlwZSA9IGNsb25lTm9kZShuLmdldFR5cGUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3Iobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB0eXBlLCBuYW1lLCBpbml0aWFsaXplcik7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IGNsb25lTm9kZShuLmdldEJvZHkoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBjbG9uZUxpc3Qobi5nZXRQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIFJlY2VpdmVyUGFyYW1ldGVyIHJlY2VpdmVyUGFyYW1ldGVyID0gY2xvbmVOb2RlKG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3duRXhjZXB0aW9ucyA9IGNsb25lTGlzdChuLmdldFRocm93bkV4Y2VwdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gciA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLCBuYW1lLCBwYXJhbWV0ZXJzLCB0aHJvd25FeGNlcHRpb25zLCBib2R5LCByZWNlaXZlclBhcmFtZXRlcik7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSBjbG9uZU5vZGUobi5nZXRCb2R5KCksIGFyZyk7CisgICAgICAgIFR5cGUgdHlwZSA9IGNsb25lTm9kZShuLmdldFR5cGUoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBjbG9uZUxpc3Qobi5nZXRQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIFJlY2VpdmVyUGFyYW1ldGVyIHJlY2VpdmVyUGFyYW1ldGVyID0gY2xvbmVOb2RlKG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3duRXhjZXB0aW9ucyA9IGNsb25lTGlzdChuLmdldFRocm93bkV4Y2VwdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIHIgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24obi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIHR5cGUsIG5hbWUsIHBhcmFtZXRlcnMsIHRocm93bkV4Y2VwdGlvbnMsIGJvZHksIHJlY2VpdmVyUGFyYW1ldGVyKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBUeXBlIHR5cGUgPSBjbG9uZU5vZGUobi5nZXRUeXBlKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiB2YXJBcmdzQW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRWYXJBcmdzQW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBQYXJhbWV0ZXIgciA9IG5ldyBQYXJhbWV0ZXIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZSwgbi5pc1ZhckFyZ3MoKSwgdmFyQXJnc0Fubm90YXRpb25zLCBuYW1lKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEJsb2NrU3RtdCBib2R5ID0gY2xvbmVOb2RlKG4uZ2V0Qm9keSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEluaXRpYWxpemVyRGVjbGFyYXRpb24gciA9IG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5pc1N0YXRpYygpLCBib2R5KTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEphdmFkb2NDb21tZW50IHIgPSBuZXcgSmF2YWRvY0NvbW1lbnQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldENvbnRlbnQoKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBzY29wZSA9IGNsb25lTm9kZShuLmdldFNjb3BlKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlQXJndW1lbnRzKCkub3JFbHNlKG51bGwpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIHIgPSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBzY29wZSwgbmFtZSwgdHlwZUFyZ3VtZW50cywgYW5ub3RhdGlvbnMpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBQcmltaXRpdmVUeXBlIHIgPSBuZXcgUHJpbWl0aXZlVHlwZShuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG4uZ2V0VHlwZSgpLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFR5cGUgY29tcG9uZW50VHlwZSA9IGNsb25lTm9kZShuLmdldENvbXBvbmVudFR5cGUoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBBcnJheVR5cGUgciA9IG5ldyBBcnJheVR5cGUobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBjb21wb25lbnRUeXBlLCBuLmdldE9yaWdpbigpLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gZGltZW5zaW9uID0gY2xvbmVOb2RlKG4uZ2V0RGltZW5zaW9uKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQXJyYXlDcmVhdGlvbkxldmVsIHIgPSBuZXcgQXJyYXlDcmVhdGlvbkxldmVsKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZGltZW5zaW9uLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiBlbGVtZW50cyA9IGNsb25lTGlzdChuLmdldEVsZW1lbnRzKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgSW50ZXJzZWN0aW9uVHlwZSByID0gbmV3IEludGVyc2VjdGlvblR5cGUobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBlbGVtZW50cyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzID0gY2xvbmVMaXN0KG4uZ2V0RWxlbWVudHMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBVbmlvblR5cGUgciA9IG5ldyBVbmlvblR5cGUobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBlbGVtZW50cyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBWb2lkVHlwZSByID0gbmV3IFZvaWRUeXBlKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFJlZmVyZW5jZVR5cGUgZXh0ZW5kZWRUeXBlID0gY2xvbmVOb2RlKG4uZ2V0RXh0ZW5kZWRUeXBlKCksIGFyZyk7CisgICAgICAgIFJlZmVyZW5jZVR5cGUgc3VwZXJUeXBlID0gY2xvbmVOb2RlKG4uZ2V0U3VwZXJUeXBlKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGNsb25lTGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgV2lsZGNhcmRUeXBlIHIgPSBuZXcgV2lsZGNhcmRUeXBlKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZXh0ZW5kZWRUeXBlLCBzdXBlclR5cGUsIGFubm90YXRpb25zKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIFVua25vd25UeXBlIHIgPSBuZXcgVW5rbm93blR5cGUobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBpbmRleCA9IGNsb25lTm9kZShuLmdldEluZGV4KCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBBcnJheUFjY2Vzc0V4cHIgciA9IG5ldyBBcnJheUFjY2Vzc0V4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuYW1lLCBpbmRleCk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgVHlwZSBlbGVtZW50VHlwZSA9IGNsb25lTm9kZShuLmdldEVsZW1lbnRUeXBlKCksIGFyZyk7CisgICAgICAgIEFycmF5SW5pdGlhbGl6ZXJFeHByIGluaXRpYWxpemVyID0gY2xvbmVOb2RlKG4uZ2V0SW5pdGlhbGl6ZXIoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBsZXZlbHMgPSBjbG9uZUxpc3Qobi5nZXRMZXZlbHMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBBcnJheUNyZWF0aW9uRXhwciByID0gbmV3IEFycmF5Q3JlYXRpb25FeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZWxlbWVudFR5cGUsIGxldmVscywgaW5pdGlhbGl6ZXIpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEV4cHJlc3Npb24+IHZhbHVlcyA9IGNsb25lTGlzdChuLmdldFZhbHVlcygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEFycmF5SW5pdGlhbGl6ZXJFeHByIHIgPSBuZXcgQXJyYXlJbml0aWFsaXplckV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB2YWx1ZXMpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiB0YXJnZXQgPSBjbG9uZU5vZGUobi5nZXRUYXJnZXQoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGNsb25lTm9kZShuLmdldFZhbHVlKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQXNzaWduRXhwciByID0gbmV3IEFzc2lnbkV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB0YXJnZXQsIHZhbHVlLCBuLmdldE9wZXJhdG9yKCkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBsZWZ0ID0gY2xvbmVOb2RlKG4uZ2V0TGVmdCgpLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0ID0gY2xvbmVOb2RlKG4uZ2V0UmlnaHQoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBCaW5hcnlFeHByIHIgPSBuZXcgQmluYXJ5RXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGxlZnQsIHJpZ2h0LCBuLmdldE9wZXJhdG9yKCkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGNsb25lTm9kZShuLmdldEV4cHJlc3Npb24oKSwgYXJnKTsKKyAgICAgICAgVHlwZSB0eXBlID0gY2xvbmVOb2RlKG4uZ2V0VHlwZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIENhc3RFeHByIHIgPSBuZXcgQ2FzdEV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB0eXBlLCBleHByZXNzaW9uKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gY2xvbmVOb2RlKG4uZ2V0VHlwZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIENsYXNzRXhwciByID0gbmV3IENsYXNzRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHR5cGUpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGNsb25lTm9kZShuLmdldENvbmRpdGlvbigpLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIGVsc2VFeHByID0gY2xvbmVOb2RlKG4uZ2V0RWxzZUV4cHIoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiB0aGVuRXhwciA9IGNsb25lTm9kZShuLmdldFRoZW5FeHByKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQ29uZGl0aW9uYWxFeHByIHIgPSBuZXcgQ29uZGl0aW9uYWxFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgY29uZGl0aW9uLCB0aGVuRXhwciwgZWxzZUV4cHIpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGlubmVyID0gY2xvbmVOb2RlKG4uZ2V0SW5uZXIoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBFbmNsb3NlZEV4cHIgciA9IG5ldyBFbmNsb3NlZEV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBpbm5lcik7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IGNsb25lTm9kZShuLmdldFNjb3BlKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlQXJndW1lbnRzKCkub3JFbHNlKG51bGwpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEZpZWxkQWNjZXNzRXhwciByID0gbmV3IEZpZWxkQWNjZXNzRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHNjb3BlLCB0eXBlQXJndW1lbnRzLCBuYW1lKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBjbG9uZU5vZGUobi5nZXRFeHByZXNzaW9uKCksIGFyZyk7CisgICAgICAgIFJlZmVyZW5jZVR5cGUgdHlwZSA9IGNsb25lTm9kZShuLmdldFR5cGUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBJbnN0YW5jZU9mRXhwciByID0gbmV3IEluc3RhbmNlT2ZFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZXhwcmVzc2lvbiwgdHlwZSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBTdHJpbmdMaXRlcmFsRXhwciByID0gbmV3IFN0cmluZ0xpdGVyYWxFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBJbnRlZ2VyTGl0ZXJhbEV4cHIgciA9IG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldFZhbHVlKCkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIExvbmdMaXRlcmFsRXhwciByID0gbmV3IExvbmdMaXRlcmFsRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG4uZ2V0VmFsdWUoKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQ2hhckxpdGVyYWxFeHByIHIgPSBuZXcgQ2hhckxpdGVyYWxFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIERvdWJsZUxpdGVyYWxFeHByIHIgPSBuZXcgRG91YmxlTGl0ZXJhbEV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldFZhbHVlKCkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEJvb2xlYW5MaXRlcmFsRXhwciByID0gbmV3IEJvb2xlYW5MaXRlcmFsRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG4uZ2V0VmFsdWUoKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTnVsbExpdGVyYWxFeHByIHIgPSBuZXcgTnVsbExpdGVyYWxFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzID0gY2xvbmVMaXN0KG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IGNsb25lTm9kZShuLmdldFNjb3BlKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBjbG9uZUxpc3Qobi5nZXRUeXBlQXJndW1lbnRzKCkub3JFbHNlKG51bGwpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIHIgPSBuZXcgTWV0aG9kQ2FsbEV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBzY29wZSwgdHlwZUFyZ3VtZW50cywgbmFtZSwgYXJndW1lbnRzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTmFtZUV4cHIgciA9IG5ldyBOYW1lRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG5hbWUpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGFub255bW91c0NsYXNzQm9keSA9IGNsb25lTGlzdChuLmdldEFub255bW91c0NsYXNzQm9keSgpLm9yRWxzZShudWxsKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzID0gY2xvbmVMaXN0KG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBjbG9uZU5vZGUobi5nZXRTY29wZSgpLCBhcmcpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlID0gY2xvbmVOb2RlKG4uZ2V0VHlwZSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzID0gY2xvbmVMaXN0KG4uZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBPYmplY3RDcmVhdGlvbkV4cHIgciA9IG5ldyBPYmplY3RDcmVhdGlvbkV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBzY29wZSwgdHlwZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRzLCBhbm9ueW1vdXNDbGFzc0JvZHkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBOYW1lIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTmFtZSBxdWFsaWZpZXIgPSBjbG9uZU5vZGUobi5nZXRRdWFsaWZpZXIoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBOYW1lIHIgPSBuZXcgTmFtZShuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHF1YWxpZmllciwgbi5nZXRJZGVudGlmaWVyKCksIGFubm90YXRpb25zKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgU2ltcGxlTmFtZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSByID0gbmV3IFNpbXBsZU5hbWUobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldElkZW50aWZpZXIoKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjbGFzc0V4cHIgPSBjbG9uZU5vZGUobi5nZXRDbGFzc0V4cHIoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBUaGlzRXhwciByID0gbmV3IFRoaXNFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgY2xhc3NFeHByKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgU3VwZXJFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjbGFzc0V4cHIgPSBjbG9uZU5vZGUobi5nZXRDbGFzc0V4cHIoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBTdXBlckV4cHIgciA9IG5ldyBTdXBlckV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBjbGFzc0V4cHIpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBjbG9uZU5vZGUobi5nZXRFeHByZXNzaW9uKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgVW5hcnlFeHByIHIgPSBuZXcgVW5hcnlFeHByKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZXhwcmVzc2lvbiwgbi5nZXRPcGVyYXRvcigpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IGNsb25lTGlzdChuLmdldFZhcmlhYmxlcygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdmFyaWFibGVzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTWFya2VyQW5ub3RhdGlvbkV4cHIgciA9IG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG5hbWUpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUgPSBjbG9uZU5vZGUobi5nZXRNZW1iZXJWYWx1ZSgpLCBhcmcpOworICAgICAgICBOYW1lIG5hbWUgPSBjbG9uZU5vZGUobi5nZXROYW1lKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgciA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG5hbWUsIG1lbWJlclZhbHVlKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzID0gY2xvbmVMaXN0KG4uZ2V0UGFpcnMoKSwgYXJnKTsKKyAgICAgICAgTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIE5vcm1hbEFubm90YXRpb25FeHByIHIgPSBuZXcgTm9ybWFsQW5ub3RhdGlvbkV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuYW1lLCBwYWlycyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZSA9IGNsb25lTm9kZShuLmdldFZhbHVlKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbmFtZSwgdmFsdWUpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMgPSBjbG9uZUxpc3Qobi5nZXRBcmd1bWVudHMoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gY2xvbmVOb2RlKG4uZ2V0RXhwcmVzc2lvbigpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzID0gY2xvbmVMaXN0KG4uZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgciA9IG5ldyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB0eXBlQXJndW1lbnRzLCBuLmlzVGhpcygpLCBleHByZXNzaW9uLCBhcmd1bWVudHMpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSBjbG9uZU5vZGUobi5nZXRDbGFzc0RlY2xhcmF0aW9uKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCByID0gbmV3IExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBjbGFzc0RlY2xhcmF0aW9uKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gY2hlY2sgPSBjbG9uZU5vZGUobi5nZXRDaGVjaygpLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIG1lc3NhZ2UgPSBjbG9uZU5vZGUobi5nZXRNZXNzYWdlKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQXNzZXJ0U3RtdCByID0gbmV3IEFzc2VydFN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBjaGVjaywgbWVzc2FnZSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IGNsb25lTGlzdChuLmdldFN0YXRlbWVudHMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBCbG9ja1N0bXQgciA9IG5ldyBCbG9ja1N0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBzdGF0ZW1lbnRzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBTaW1wbGVOYW1lIGxhYmVsID0gY2xvbmVOb2RlKG4uZ2V0TGFiZWwoKSwgYXJnKTsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IGNsb25lTm9kZShuLmdldFN0YXRlbWVudCgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIExhYmVsZWRTdG10IHIgPSBuZXcgTGFiZWxlZFN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBsYWJlbCwgc3RhdGVtZW50KTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBFbXB0eVN0bXQgciA9IG5ldyBFbXB0eVN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBjbG9uZU5vZGUobi5nZXRFeHByZXNzaW9uKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvblN0bXQgciA9IG5ldyBFeHByZXNzaW9uU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGV4cHJlc3Npb24pOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzID0gY2xvbmVMaXN0KG4uZ2V0RW50cmllcygpLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIHNlbGVjdG9yID0gY2xvbmVOb2RlKG4uZ2V0U2VsZWN0b3IoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBTd2l0Y2hTdG10IHIgPSBuZXcgU3dpdGNoU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHNlbGVjdG9yLCBlbnRyaWVzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBsYWJlbCA9IGNsb25lTm9kZShuLmdldExhYmVsKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IGNsb25lTGlzdChuLmdldFN0YXRlbWVudHMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBTd2l0Y2hFbnRyeVN0bXQgciA9IG5ldyBTd2l0Y2hFbnRyeVN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBsYWJlbCwgc3RhdGVtZW50cyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbGFiZWwgPSBjbG9uZU5vZGUobi5nZXRMYWJlbCgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEJyZWFrU3RtdCByID0gbmV3IEJyZWFrU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGxhYmVsKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGNsb25lTm9kZShuLmdldEV4cHJlc3Npb24oKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBSZXR1cm5TdG10IHIgPSBuZXcgUmV0dXJuU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGV4cHJlc3Npb24pOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGNsb25lTm9kZShuLmdldENvbmRpdGlvbigpLCBhcmcpOworICAgICAgICBTdGF0ZW1lbnQgZWxzZVN0bXQgPSBjbG9uZU5vZGUobi5nZXRFbHNlU3RtdCgpLCBhcmcpOworICAgICAgICBTdGF0ZW1lbnQgdGhlblN0bXQgPSBjbG9uZU5vZGUobi5nZXRUaGVuU3RtdCgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIElmU3RtdCByID0gbmV3IElmU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGNvbmRpdGlvbiwgdGhlblN0bXQsIGVsc2VTdG10KTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgU3RhdGVtZW50IGJvZHkgPSBjbG9uZU5vZGUobi5nZXRCb2R5KCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2RlKG4uZ2V0Q29uZGl0aW9uKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgV2hpbGVTdG10IHIgPSBuZXcgV2hpbGVTdG10KG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgY29uZGl0aW9uLCBib2R5KTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgU2ltcGxlTmFtZSBsYWJlbCA9IGNsb25lTm9kZShuLmdldExhYmVsKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgQ29udGludWVTdG10IHIgPSBuZXcgQ29udGludWVTdG10KG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgbGFiZWwpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZShuLmdldEJvZHkoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBjbG9uZU5vZGUobi5nZXRDb25kaXRpb24oKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBEb1N0bXQgciA9IG5ldyBEb1N0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBib2R5LCBjb25kaXRpb24pOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2RlKG4uZ2V0Qm9keSgpLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIGl0ZXJhYmxlID0gY2xvbmVOb2RlKG4uZ2V0SXRlcmFibGUoKSwgYXJnKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyaWFibGUgPSBjbG9uZU5vZGUobi5nZXRWYXJpYWJsZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEZvcmVhY2hTdG10IHIgPSBuZXcgRm9yZWFjaFN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB2YXJpYWJsZSwgaXRlcmFibGUsIGJvZHkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgU3RhdGVtZW50IGJvZHkgPSBjbG9uZU5vZGUobi5nZXRCb2R5KCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gY29tcGFyZSA9IGNsb25lTm9kZShuLmdldENvbXBhcmUoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gaW5pdGlhbGl6YXRpb24gPSBjbG9uZUxpc3Qobi5nZXRJbml0aWFsaXphdGlvbigpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUgPSBjbG9uZUxpc3Qobi5nZXRVcGRhdGUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBGb3JTdG10IHIgPSBuZXcgRm9yU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGluaXRpYWxpemF0aW9uLCBjb21wYXJlLCB1cGRhdGUsIGJvZHkpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBjbG9uZU5vZGUobi5nZXRFeHByZXNzaW9uKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgVGhyb3dTdG10IHIgPSBuZXcgVGhyb3dTdG10KG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZXhwcmVzc2lvbik7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IGNsb25lTm9kZShuLmdldEJvZHkoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gY2xvbmVOb2RlKG4uZ2V0RXhwcmVzc2lvbigpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIFN5bmNocm9uaXplZFN0bXQgciA9IG5ldyBTeW5jaHJvbml6ZWRTdG10KG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgZXhwcmVzc2lvbiwgYm9keSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hDbGF1c2VzID0gY2xvbmVMaXN0KG4uZ2V0Q2F0Y2hDbGF1c2VzKCksIGFyZyk7CisgICAgICAgIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2sgPSBjbG9uZU5vZGUobi5nZXRGaW5hbGx5QmxvY2soKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gcmVzb3VyY2VzID0gY2xvbmVMaXN0KG4uZ2V0UmVzb3VyY2VzKCksIGFyZyk7CisgICAgICAgIEJsb2NrU3RtdCB0cnlCbG9jayA9IGNsb25lTm9kZShuLmdldFRyeUJsb2NrKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgVHJ5U3RtdCByID0gbmV3IFRyeVN0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCByZXNvdXJjZXMsIHRyeUJsb2NrLCBjYXRjaENsYXVzZXMsIGZpbmFsbHlCbG9jayk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSBjbG9uZU5vZGUobi5nZXRCb2R5KCksIGFyZyk7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBjbG9uZU5vZGUobi5nZXRQYXJhbWV0ZXIoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBDYXRjaENsYXVzZSByID0gbmV3IENhdGNoQ2xhdXNlKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgcGFyYW1ldGVyLCBib2R5KTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTGFtYmRhRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2RlKG4uZ2V0Qm9keSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBjbG9uZUxpc3Qobi5nZXRQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTGFtYmRhRXhwciByID0gbmV3IExhbWJkYUV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBwYXJhbWV0ZXJzLCBib2R5LCBuLmlzRW5jbG9zaW5nUGFyYW1ldGVycygpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBjbG9uZU5vZGUobi5nZXRTY29wZSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzID0gY2xvbmVMaXN0KG4uZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBNZXRob2RSZWZlcmVuY2VFeHByIHIgPSBuZXcgTWV0aG9kUmVmZXJlbmNlRXhwcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHNjb3BlLCB0eXBlQXJndW1lbnRzLCBuLmdldElkZW50aWZpZXIoKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFR5cGVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gY2xvbmVOb2RlKG4uZ2V0VHlwZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIFR5cGVFeHByIHIgPSBuZXcgVHlwZUV4cHIobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCB0eXBlKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KE5vZGVMaXN0IG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8Tm9kZT4gbmV3Tm9kZXMgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICBmb3IgKE9iamVjdCBub2RlIDogbikgeworICAgICAgICAgICAgTm9kZSByZXN1bHROb2RlID0gKE5vZGUpICgoTm9kZSkgbm9kZSkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV3Tm9kZXMuYWRkKHJlc3VsdE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdOb2RlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIHIgPSBuZXcgSW1wb3J0RGVjbGFyYXRpb24obi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuYW1lLCBuLmlzU3RhdGljKCksIG4uaXNBc3RlcmlzaygpKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTW9kdWxlRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxNb2R1bGVTdG10PiBtb2R1bGVTdG10cyA9IGNsb25lTGlzdChuLmdldE1vZHVsZVN0bXRzKCksIGFyZyk7CisgICAgICAgIE5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBNb2R1bGVEZWNsYXJhdGlvbiByID0gbmV3IE1vZHVsZURlY2xhcmF0aW9uKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgYW5ub3RhdGlvbnMsIG5hbWUsIG4uaXNPcGVuKCksIG1vZHVsZVN0bXRzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTW9kdWxlUmVxdWlyZXNTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIE1vZHVsZVJlcXVpcmVzU3RtdCByID0gbmV3IE1vZHVsZVJlcXVpcmVzU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIG4uZ2V0TW9kaWZpZXJzKCksIG5hbWUpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIE5vZGU+IFQgY2xvbmVOb2RlKE9wdGlvbmFsPFQ+IG5vZGUsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgaWYgKCFub2RlLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBOb2RlIHIgPSAoTm9kZSkgbm9kZS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKHIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUKSByOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIE5vZGU+IFQgY2xvbmVOb2RlKFQgbm9kZSwgT2JqZWN0IGFyZykgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBOb2RlIHIgPSAoTm9kZSkgbm9kZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKHIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUKSByOworICAgIH0KKworICAgIHByaXZhdGUgPE4gZXh0ZW5kcyBOb2RlPiBOb2RlTGlzdDxOPiBjbG9uZUxpc3QoTm9kZUxpc3Q8Tj4gbGlzdCwgT2JqZWN0IGFyZykgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE5vZGVMaXN0PE4+KSBsaXN0LmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBNb2R1bGVFeHBvcnRzU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzID0gY2xvbmVMaXN0KG4uZ2V0TW9kdWxlTmFtZXMoKSwgYXJnKTsKKyAgICAgICAgTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIE1vZHVsZUV4cG9ydHNTdG10IHIgPSBuZXcgTW9kdWxlRXhwb3J0c1N0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuYW1lLCBtb2R1bGVOYW1lcyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIFR5cGUgdHlwZSA9IGNsb25lTm9kZShuLmdldFR5cGUoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZT4gd2l0aFR5cGVzID0gY2xvbmVMaXN0KG4uZ2V0V2l0aFR5cGVzKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTW9kdWxlUHJvdmlkZXNTdG10IHIgPSBuZXcgTW9kdWxlUHJvdmlkZXNTdG10KG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSwgdHlwZSwgd2l0aFR5cGVzKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5DbG9uZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTW9kdWxlVXNlc1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBUeXBlIHR5cGUgPSBjbG9uZU5vZGUobi5nZXRUeXBlKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgTW9kdWxlVXNlc1N0bXQgciA9IG5ldyBNb2R1bGVVc2VzU3RtdChuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIHR5cGUpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkNsb25lVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBNb2R1bGVPcGVuc1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxOYW1lPiBtb2R1bGVOYW1lcyA9IGNsb25lTGlzdChuLmdldE1vZHVsZU5hbWVzKCksIGFyZyk7CisgICAgICAgIE5hbWUgbmFtZSA9IGNsb25lTm9kZShuLmdldE5hbWUoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBNb2R1bGVPcGVuc1N0bXQgciA9IG5ldyBNb2R1bGVPcGVuc1N0bXQobi5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBuYW1lLCBtb2R1bGVOYW1lcyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFVucGFyc2FibGVTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2RlKG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBVbnBhcnNhYmxlU3RtdCByID0gbmV3IFVucGFyc2FibGVTdG10KG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuQ2xvbmVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFJlY2VpdmVyUGFyYW1ldGVyIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gY2xvbmVMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTmFtZSBuYW1lID0gY2xvbmVOb2RlKG4uZ2V0TmFtZSgpLCBhcmcpOworICAgICAgICBUeXBlIHR5cGUgPSBjbG9uZU5vZGUobi5nZXRUeXBlKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZShuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgUmVjZWl2ZXJQYXJhbWV0ZXIgciA9IG5ldyBSZWNlaXZlclBhcmFtZXRlcihuLmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIGFubm90YXRpb25zLCB0eXBlLCBuYW1lKTsKKyAgICAgICAgci5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBjbG9uZUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGUobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIFZhclR5cGUgciA9IG5ldyBWYXJUeXBlKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0VxdWFsc1Zpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9FcXVhbHNWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2MjE4NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9FcXVhbHNWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgY2FsY3VsYXRlcyBkZWVwIG5vZGUgZXF1YWxpdHkgYnkgY29tcGFyaW5nIGFsbCBwcm9wZXJ0aWVzIGFuZCBjaGlsZCBub2RlcyBvZiB0aGUgbm9kZS4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGNsYXNzIEVxdWFsc1Zpc2l0b3IgaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxCb29sZWFuLCBWaXNpdGFibGU+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVxdWFsc1Zpc2l0b3IgU0lOR0xFVE9OID0gbmV3IEVxdWFsc1Zpc2l0b3IoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgTm9kZSBuLCBmaW5hbCBOb2RlIG4yKSB7CisgICAgICAgIHJldHVybiBTSU5HTEVUT04ubm9kZUVxdWFscyhuLCBuMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBFcXVhbHNWaXNpdG9yKCkgeworICAgIC8vIGhpZGUgY29uc3RydWN0b3IKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBmb3IgZXF1YWxpdHkgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBlYWNoIGtpbmQgb2Ygbm9kZSwKKyAgICAgKiB0byBub3QgcmVwZWF0IGl0IGluIGV2ZXJ5IG1ldGhvZCB3ZSBzdG9yZSB0aGF0IGhlcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbW1vbk5vZGVFcXVhbGl0eShOb2RlIG4sIE5vZGUgbjIpIHsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVzRXF1YWxzKG4uZ2V0T3JwaGFuQ29tbWVudHMoKSwgbjIuZ2V0T3JwaGFuQ29tbWVudHMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIE5vZGU+IGJvb2xlYW4gbm9kZXNFcXVhbHMoZmluYWwgTGlzdDxUPiBub2RlczEsIGZpbmFsIExpc3Q8VD4gbm9kZXMyKSB7CisgICAgICAgIGlmIChub2RlczEgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGVzMiA9PSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKG5vZGVzMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGVzMS5zaXplKCkgIT0gbm9kZXMyLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIW5vZGVFcXVhbHMobm9kZXMxLmdldChpKSwgbm9kZXMyLmdldChpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSA8TiBleHRlbmRzIE5vZGU+IGJvb2xlYW4gbm9kZXNFcXVhbHMoTm9kZUxpc3Q8Tj4gbiwgTm9kZUxpc3Q8Tj4gbjIpIHsKKyAgICAgICAgaWYgKG4gPT0gbjIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChuID09IG51bGwgfHwgbjIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChuLnNpemUoKSAhPSBuMi5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldChpKSwgbjIuZ2V0KGkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2RlRXF1YWxzKGZpbmFsIFQgbiwgZmluYWwgVCBuMikgeworICAgICAgICBpZiAobiA9PSBuMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCBuMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q2xhc3MoKSAhPSBuMi5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb21tb25Ob2RlRXF1YWxpdHkobiwgbjIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG4uYWNjZXB0KHRoaXMsIG4yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2RlRXF1YWxzKGZpbmFsIE9wdGlvbmFsPFQ+IG4sIGZpbmFsIE9wdGlvbmFsPFQ+IG4yKSB7CisgICAgICAgIHJldHVybiBub2RlRXF1YWxzKG4ub3JFbHNlKG51bGwpLCBuMi5vckVsc2UobnVsbCkpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOb2RlPiBib29sZWFuIG5vZGVzRXF1YWxzKGZpbmFsIE9wdGlvbmFsPE5vZGVMaXN0PFQ+PiBuLCBmaW5hbCBPcHRpb25hbDxOb2RlTGlzdDxUPj4gbjIpIHsKKyAgICAgICAgcmV0dXJuIG5vZGVzRXF1YWxzKG4ub3JFbHNlKG51bGwpLCBuMi5vckVsc2UobnVsbCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBvYmpFcXVhbHMoZmluYWwgT2JqZWN0IG4sIGZpbmFsIE9iamVjdCBuMikgeworICAgICAgICBpZiAobiA9PSBuMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCBuMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG4uZXF1YWxzKG4yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDb21waWxhdGlvblVuaXQgbjIgPSAoQ29tcGlsYXRpb25Vbml0KSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRJbXBvcnRzKCksIG4yLmdldEltcG9ydHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE1vZHVsZSgpLCBuMi5nZXRNb2R1bGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLCBuMi5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUeXBlcygpLCBuMi5nZXRUeXBlcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbjIgPSAoUGFja2FnZURlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBUeXBlUGFyYW1ldGVyIG4yID0gKFR5cGVQYXJhbWV0ZXIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZUJvdW5kKCksIG4yLmdldFR5cGVCb3VuZCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTGluZUNvbW1lbnQgbjIgPSAoTGluZUNvbW1lbnQpIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRDb250ZW50KCksIG4yLmdldENvbnRlbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQmxvY2tDb21tZW50IG4yID0gKEJsb2NrQ29tbWVudCkgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbjIgPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRFeHRlbmRlZFR5cGVzKCksIG4yLmdldEV4dGVuZGVkVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRJbXBsZW1lbnRlZFR5cGVzKCksIG4yLmdldEltcGxlbWVudGVkVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNJbnRlcmZhY2UoKSwgbjIuaXNJbnRlcmZhY2UoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBuMi5nZXRUeXBlUGFyYW1ldGVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1lbWJlcnMoKSwgbjIuZ2V0TWVtYmVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBFbnVtRGVjbGFyYXRpb24gbjIgPSAoRW51bURlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRFbnRyaWVzKCksIG4yLmdldEVudHJpZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRJbXBsZW1lbnRlZFR5cGVzKCksIG4yLmdldEltcGxlbWVudGVkVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRNZW1iZXJzKCksIG4yLmdldE1lbWJlcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuMiA9IChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QXJndW1lbnRzKCksIG4yLmdldEFyZ3VtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldENsYXNzQm9keSgpLCBuMi5nZXRDbGFzc0JvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuMiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1lbWJlcnMoKSwgbjIuZ2V0TWVtYmVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbjIgPSAoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldERlZmF1bHRWYWx1ZSgpLCBuMi5nZXREZWZhdWx0VmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRmllbGREZWNsYXJhdGlvbiBuMiA9IChGaWVsZERlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFZhcmlhYmxlcygpLCBuMi5nZXRWYXJpYWJsZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbjIgPSAoVmFyaWFibGVEZWNsYXJhdG9yKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEluaXRpYWxpemVyKCksIG4yLmdldEluaXRpYWxpemVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuMiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRQYXJhbWV0ZXJzKCksIG4yLmdldFBhcmFtZXRlcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCksIG4yLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpLCBuMi5nZXRUaHJvd25FeGNlcHRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4yID0gKE1ldGhvZERlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE1vZGlmaWVycygpLCBuMi5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKSwgbjIuZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUaHJvd25FeGNlcHRpb25zKCksIG4yLmdldFRocm93bkV4Y2VwdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBuMi5nZXRUeXBlUGFyYW1ldGVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFBhcmFtZXRlciBuMiA9IChQYXJhbWV0ZXIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmlzVmFyQXJncygpLCBuMi5pc1ZhckFyZ3MoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRWYXJBcmdzQW5ub3RhdGlvbnMoKSwgbjIuZ2V0VmFyQXJnc0Fubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4yID0gKEluaXRpYWxpemVyRGVjbGFyYXRpb24pIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmlzU3RhdGljKCksIG4yLmlzU3RhdGljKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBKYXZhZG9jQ29tbWVudCBuMiA9IChKYXZhZG9jQ29tbWVudCkgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4yID0gKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgUHJpbWl0aXZlVHlwZSBuMiA9IChQcmltaXRpdmVUeXBlKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQXJyYXlUeXBlIG4yID0gKEFycmF5VHlwZSkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21wb25lbnRUeXBlKCksIG4yLmdldENvbXBvbmVudFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0T3JpZ2luKCksIG4yLmdldE9yaWdpbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuMiA9IChBcnJheUNyZWF0aW9uTGV2ZWwpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXREaW1lbnNpb24oKSwgbjIuZ2V0RGltZW5zaW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4yID0gKEludGVyc2VjdGlvblR5cGUpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEVsZW1lbnRzKCksIG4yLmdldEVsZW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5pb25UeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVW5pb25UeXBlIG4yID0gKFVuaW9uVHlwZSkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0RWxlbWVudHMoKSwgbjIuZ2V0RWxlbWVudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFZvaWRUeXBlIG4yID0gKFZvaWRUeXBlKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBXaWxkY2FyZFR5cGUgbjIgPSAoV2lsZGNhcmRUeXBlKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4dGVuZGVkVHlwZSgpLCBuMi5nZXRFeHRlbmRlZFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFN1cGVyVHlwZSgpLCBuMi5nZXRTdXBlclR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFVua25vd25UeXBlIG4yID0gKFVua25vd25UeXBlKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbjIgPSAoQXJyYXlBY2Nlc3NFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEluZGV4KCksIG4yLmdldEluZGV4KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuMiA9IChBcnJheUNyZWF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFbGVtZW50VHlwZSgpLCBuMi5nZXRFbGVtZW50VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0SW5pdGlhbGl6ZXIoKSwgbjIuZ2V0SW5pdGlhbGl6ZXIoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRMZXZlbHMoKSwgbjIuZ2V0TGV2ZWxzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbjIgPSAoQXJyYXlJbml0aWFsaXplckV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFZhbHVlcygpLCBuMi5nZXRWYWx1ZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFzc2lnbkV4cHIgbjIgPSAoQXNzaWduRXhwcikgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE9wZXJhdG9yKCksIG4yLmdldE9wZXJhdG9yKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUYXJnZXQoKSwgbjIuZ2V0VGFyZ2V0KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQmluYXJ5RXhwciBuMiA9IChCaW5hcnlFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldExlZnQoKSwgbjIuZ2V0TGVmdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRPcGVyYXRvcigpLCBuMi5nZXRPcGVyYXRvcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0UmlnaHQoKSwgbjIuZ2V0UmlnaHQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDYXN0RXhwciBuMiA9IChDYXN0RXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDbGFzc0V4cHIgbjIgPSAoQ2xhc3NFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDb25kaXRpb25hbEV4cHIgbjIgPSAoQ29uZGl0aW9uYWxFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbmRpdGlvbigpLCBuMi5nZXRDb25kaXRpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEVsc2VFeHByKCksIG4yLmdldEVsc2VFeHByKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUaGVuRXhwcigpLCBuMi5nZXRUaGVuRXhwcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBFbmNsb3NlZEV4cHIgbjIgPSAoRW5jbG9zZWRFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldElubmVyKCksIG4yLmdldElubmVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuMiA9IChGaWVsZEFjY2Vzc0V4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEluc3RhbmNlT2ZFeHByIG4yID0gKEluc3RhbmNlT2ZFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbjIgPSAoU3RyaW5nTGl0ZXJhbEV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbjIgPSAoSW50ZWdlckxpdGVyYWxFeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4yID0gKExvbmdMaXRlcmFsRXhwcikgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIENoYXJMaXRlcmFsRXhwciBuMiA9IChDaGFyTGl0ZXJhbEV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4yID0gKERvdWJsZUxpdGVyYWxFeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4yID0gKEJvb2xlYW5MaXRlcmFsRXhwcikgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE51bGxMaXRlcmFsRXhwciBuMiA9IChOdWxsTGl0ZXJhbEV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZENhbGxFeHByIG4yID0gKE1ldGhvZENhbGxFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBcmd1bWVudHMoKSwgbjIuZ2V0QXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTmFtZUV4cHIgbjIgPSAoTmFtZUV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuMiA9IChPYmplY3RDcmVhdGlvbkV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFub255bW91c0NsYXNzQm9keSgpLCBuMi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBcmd1bWVudHMoKSwgbjIuZ2V0QXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE5hbWUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBOYW1lIG4yID0gKE5hbWUpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldElkZW50aWZpZXIoKSwgbjIuZ2V0SWRlbnRpZmllcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0UXVhbGlmaWVyKCksIG4yLmdldFF1YWxpZmllcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgU2ltcGxlTmFtZSBuMiA9IChTaW1wbGVOYW1lKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0SWRlbnRpZmllcigpLCBuMi5nZXRJZGVudGlmaWVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVGhpc0V4cHIgbjIgPSAoVGhpc0V4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q2xhc3NFeHByKCksIG4yLmdldENsYXNzRXhwcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBTdXBlckV4cHIgbjIgPSAoU3VwZXJFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENsYXNzRXhwcigpLCBuMi5nZXRDbGFzc0V4cHIoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVW5hcnlFeHByIG4yID0gKFVuYXJ5RXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0T3BlcmF0b3IoKSwgbjIuZ2V0T3BlcmF0b3IoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuMiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFZhcmlhYmxlcygpLCBuMi5nZXRWYXJpYWJsZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuMiA9IChNYXJrZXJBbm5vdGF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuMiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRNZW1iZXJWYWx1ZSgpLCBuMi5nZXRNZW1iZXJWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbjIgPSAoTm9ybWFsQW5ub3RhdGlvbkV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFBhaXJzKCksIG4yLmdldFBhaXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4yID0gKE1lbWJlclZhbHVlUGFpcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuMiA9IChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFyZ3VtZW50cygpLCBuMi5nZXRBcmd1bWVudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5pc1RoaXMoKSwgbjIuaXNUaGlzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4yID0gKExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q2xhc3NEZWNsYXJhdGlvbigpLCBuMi5nZXRDbGFzc0RlY2xhcmF0aW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBBc3NlcnRTdG10IG4yID0gKEFzc2VydFN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q2hlY2soKSwgbjIuZ2V0Q2hlY2soKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE1lc3NhZ2UoKSwgbjIuZ2V0TWVzc2FnZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBCbG9ja1N0bXQgbjIgPSAoQmxvY2tTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRTdGF0ZW1lbnRzKCksIG4yLmdldFN0YXRlbWVudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBMYWJlbGVkU3RtdCBuMiA9IChMYWJlbGVkU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0U3RhdGVtZW50KCksIG4yLmdldFN0YXRlbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBFbXB0eVN0bXQgbjIgPSAoRW1wdHlTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBFeHByZXNzaW9uU3RtdCBuMiA9IChFeHByZXNzaW9uU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFN3aXRjaFN0bXQgbjIgPSAoU3dpdGNoU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0RW50cmllcygpLCBuMi5nZXRFbnRyaWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTZWxlY3RvcigpLCBuMi5nZXRTZWxlY3RvcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbjIgPSAoU3dpdGNoRW50cnlTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldExhYmVsKCksIG4yLmdldExhYmVsKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0U3RhdGVtZW50cygpLCBuMi5nZXRTdGF0ZW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEJyZWFrU3RtdCBuMiA9IChCcmVha1N0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TGFiZWwoKSwgbjIuZ2V0TGFiZWwoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFJldHVyblN0bXQgbjIgPSAoUmV0dXJuU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSWZTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgSWZTdG10IG4yID0gKElmU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFbHNlU3RtdCgpLCBuMi5nZXRFbHNlU3RtdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VGhlblN0bXQoKSwgbjIuZ2V0VGhlblN0bXQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgV2hpbGVTdG10IG4yID0gKFdoaWxlU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbmRpdGlvbigpLCBuMi5nZXRDb25kaXRpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQ29udGludWVTdG10IG4yID0gKENvbnRpbnVlU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBEb1N0bXQgbjIgPSAoRG9TdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEZvcmVhY2hTdG10IG4yID0gKEZvcmVhY2hTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0SXRlcmFibGUoKSwgbjIuZ2V0SXRlcmFibGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFZhcmlhYmxlKCksIG4yLmdldFZhcmlhYmxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBGb3JTdG10IG4yID0gKEZvclN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21wYXJlKCksIG4yLmdldENvbXBhcmUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRJbml0aWFsaXphdGlvbigpLCBuMi5nZXRJbml0aWFsaXphdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFVwZGF0ZSgpLCBuMi5nZXRVcGRhdGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVGhyb3dTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVGhyb3dTdG10IG4yID0gKFRocm93U3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbjIgPSAoU3luY2hyb25pemVkU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVHJ5U3RtdCBuMiA9IChUcnlTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRDYXRjaENsYXVzZXMoKSwgbjIuZ2V0Q2F0Y2hDbGF1c2VzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRGaW5hbGx5QmxvY2soKSwgbjIuZ2V0RmluYWxseUJsb2NrKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0UmVzb3VyY2VzKCksIG4yLmdldFJlc291cmNlcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHJ5QmxvY2soKSwgbjIuZ2V0VHJ5QmxvY2soKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDYXRjaENsYXVzZSBuMiA9IChDYXRjaENsYXVzZSkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFBhcmFtZXRlcigpLCBuMi5nZXRQYXJhbWV0ZXIoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTGFtYmRhRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIExhbWJkYUV4cHIgbjIgPSAoTGFtYmRhRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKCksIG4yLmlzRW5jbG9zaW5nUGFyYW1ldGVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2RSZWZlcmVuY2VFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuMiA9IChNZXRob2RSZWZlcmVuY2VFeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0SWRlbnRpZmllcigpLCBuMi5nZXRJZGVudGlmaWVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUeXBlRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFR5cGVFeHByIG4yID0gKFR5cGVFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4yID0gKEltcG9ydERlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNBc3RlcmlzaygpLCBuMi5pc0FzdGVyaXNrKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmlzU3RhdGljKCksIG4yLmlzU3RhdGljKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoTm9kZUxpc3QgbiwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbm9kZXNFcXVhbHMoKE5vZGVMaXN0PE5vZGU+KSBuLCAoTm9kZUxpc3Q8Tm9kZT4pIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuMiA9IChNb2R1bGVEZWNsYXJhdGlvbikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNPcGVuKCksIG4yLmlzT3BlbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1vZHVsZVN0bXRzKCksIG4yLmdldE1vZHVsZVN0bXRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuRXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlUmVxdWlyZXNTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTW9kdWxlUmVxdWlyZXNTdG10IG4yID0gKE1vZHVsZVJlcXVpcmVzU3RtdCkgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE1vZGlmaWVycygpLCBuMi5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1vZHVsZUV4cG9ydHNTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTW9kdWxlRXhwb3J0c1N0bXQgbjIgPSAoTW9kdWxlRXhwb3J0c1N0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1vZHVsZU5hbWVzKCksIG4yLmdldE1vZHVsZU5hbWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNb2R1bGVQcm92aWRlc1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVQcm92aWRlc1N0bXQgbjIgPSAoTW9kdWxlUHJvdmlkZXNTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFdpdGhUeXBlcygpLCBuMi5nZXRXaXRoVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNb2R1bGVVc2VzU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE1vZHVsZVVzZXNTdG10IG4yID0gKE1vZHVsZVVzZXNTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNb2R1bGVPcGVuc1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVPcGVuc1N0bXQgbjIgPSAoTW9kdWxlT3BlbnNTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRNb2R1bGVOYW1lcygpLCBuMi5nZXRNb2R1bGVOYW1lcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVucGFyc2FibGVTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVW5wYXJzYWJsZVN0bXQgbjIgPSAoVW5wYXJzYWJsZVN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5FcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFJlY2VpdmVyUGFyYW1ldGVyIG4yID0gKFJlY2VpdmVyUGFyYW1ldGVyKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFZhclR5cGUgbjIgPSAoVmFyVHlwZSkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlZmRmYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyMDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBBIHZpc2l0b3IgdGhhdCBoYXMgYSByZXR1cm4gdmFsdWUgb2YgKHtAbGluayBMaXN0IExpc3Q8Uj59KSwgYW5kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBpdHMgdmlzaXQKKyAqIG1ldGhvZHMgdGhhdCB2aXNpdHMgdGhlaXIgY2hpbGRyZW4gaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIsIGFuZCBhbGwgdmlzaXQgbWV0aG9kcworICogdGhhdCByZXR1cm5zIGEgdmFsdWUgYmUgYWRkZWQgdG8gYSBmbGF0dGVuZWQge0BsaW5rIExpc3QgTGlzdDxSPn0uCisgKgorICogQGF1dGhvciBFbm5vIEJvbGFuZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlcjxSLCBBPiBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPExpc3Q8Uj4sIEE+IHsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRNZW1iZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXREZWZhdWx0VmFsdWUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXREZWZhdWx0VmFsdWUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEluaXRpYWxpemVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRMZXZlbHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uTGV2ZWwgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0RGltZW5zaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RGltZW5zaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VmFsdWVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQXJyYXlUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbXBvbmVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0TWVzc2FnZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE1lc3NhZ2UoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFN0YXRlbWVudHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRMYWJlbCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBDYXRjaENsYXVzZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0UGFyYW1ldGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEV4dGVuZGVkVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRNZW1iZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0SW1wb3J0cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRNb2R1bGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRNb2R1bGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RWxzZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUaHJvd25FeGNlcHRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgaWYgKG4uZ2V0TGFiZWwoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRMYWJlbCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENsYXNzQm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRFbnRyaWVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE1lbWJlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QXJndW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEV4cHJlc3Npb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRFeHByZXNzaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFZhcmlhYmxlcygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgRm9yU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbXBhcmUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21wYXJlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0SW5pdGlhbGl6YXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRVcGRhdGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0RWxzZVN0bXQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRFbHNlU3RtdCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRFbGVtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRTdGF0ZW1lbnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBMYW1iZGFFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDbGFzc0RlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTWV0aG9kQ2FsbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QXJndW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldEJvZHkoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRCb2R5KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUaHJvd25FeGNlcHRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTmFtZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRRdWFsaWZpZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRRdWFsaWZpZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRQYWlycygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBOdWxsTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBcmd1bWVudHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRTY29wZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRWYXJBcmdzQW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgaWYgKG4uZ2V0RXhwcmVzc2lvbigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEV4cHJlc3Npb24oKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgaWYgKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRMYWJlbCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0U3RhdGVtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RW50cmllcygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICBpZiAobi5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDbGFzc0V4cHIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q2F0Y2hDbGF1c2VzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEZpbmFsbHlCbG9jaygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEZpbmFsbHlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFJlc291cmNlcygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldFR5cGVCb3VuZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0RWxlbWVudHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRWYXJpYWJsZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldEluaXRpYWxpemVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldEV4dGVuZGVkVHlwZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEV4dGVuZGVkVHlwZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTdXBlclR5cGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRTdXBlclR5cGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KE5vZGVMaXN0IG4sIEEgYXJnKSB7CisgICAgICAgIHJldHVybiAoKE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPikgbikuc3RyZWFtKCkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmZsYXRNYXAodiAtPiB2LmFjY2VwdCh0aGlzLCBhcmcpLnN0cmVhbSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIE1vZHVsZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TW9kdWxlU3RtdHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTW9kdWxlRXhwb3J0c1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TW9kdWxlTmFtZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTW9kdWxlT3BlbnNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE1vZHVsZU5hbWVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0V2l0aFR5cGVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgTW9kdWxlUmVxdWlyZXNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIExpc3Q8Uj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Uj4gdG1wOworICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgTGlzdDxSPiB2aXNpdChmaW5hbCBNb2R1bGVVc2VzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBMaXN0PFI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFI+IHRtcDsKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgVW5wYXJzYWJsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgdG1wID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIExpc3Q8Uj4gdmlzaXQoZmluYWwgUmVjZWl2ZXJQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh0bXApOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwodG1wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFI+IHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTGlzdDxSPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSPiB0bXA7CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0bXAgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDAxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3IuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgaGFzIGEgcmV0dXJuIHZhbHVlLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHsKKworICAgIC8vIC0gQ29tcGlsYXRpb24gVW5pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ29tcGlsYXRpb25Vbml0IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChUeXBlUGFyYW1ldGVyIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KExpbmVDb21tZW50IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEJsb2NrQ29tbWVudCBuLCBBIGFyZyk7CisKKyAgICAvLyAtIEJvZHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChFbnVtRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRvciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFBhcmFtZXRlciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEphdmFkb2NDb21tZW50IG4sIEEgYXJnKTsKKworICAgIC8vIC0gVHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoUHJpbWl0aXZlVHlwZSBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChBcnJheVR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQXJyYXlDcmVhdGlvbkxldmVsIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEludGVyc2VjdGlvblR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoVW5pb25UeXBlIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFZvaWRUeXBlIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFdpbGRjYXJkVHlwZSBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChVbmtub3duVHlwZSBuLCBBIGFyZyk7CisKKyAgICAvLyAtIEV4cHJlc3Npb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEFycmF5QWNjZXNzRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChBcnJheUNyZWF0aW9uRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChBcnJheUluaXRpYWxpemVyRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChBc3NpZ25FeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEJpbmFyeUV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ2FzdEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ2xhc3NFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KENvbmRpdGlvbmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChFbmNsb3NlZEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoRmllbGRBY2Nlc3NFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEluc3RhbmNlT2ZFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFN0cmluZ0xpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEludGVnZXJMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChMb25nTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ2hhckxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KERvdWJsZUxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEJvb2xlYW5MaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChOdWxsTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTWV0aG9kQ2FsbEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTmFtZUV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoT2JqZWN0Q3JlYXRpb25FeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFRoaXNFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFN1cGVyRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChVbmFyeUV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTWVtYmVyVmFsdWVQYWlyIG4sIEEgYXJnKTsKKworICAgIC8vIC0gU3RhdGVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQXNzZXJ0U3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChCbG9ja1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTGFiZWxlZFN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoRW1wdHlTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEV4cHJlc3Npb25TdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFN3aXRjaFN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoU3dpdGNoRW50cnlTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEJyZWFrU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChSZXR1cm5TdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KElmU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChXaGlsZVN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ29udGludWVTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KERvU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChGb3JlYWNoU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChGb3JTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFRocm93U3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChTeW5jaHJvbml6ZWRTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFRyeVN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoQ2F0Y2hDbGF1c2UgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTGFtYmRhRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFR5cGVFeHByIG4sIEEgYXJnKTsKKworICAgIFIgdmlzaXQoTm9kZUxpc3QgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTmFtZSBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChTaW1wbGVOYW1lIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KE1vZHVsZURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KE1vZHVsZVJlcXVpcmVzU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChNb2R1bGVFeHBvcnRzU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckdlbmVyYXRvciIpCisgICAgUiB2aXNpdChNb2R1bGVQcm92aWRlc1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTW9kdWxlVXNlc1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIFIgdmlzaXQoTW9kdWxlT3BlbnNTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFVucGFyc2FibGVTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBSIHZpc2l0KFJlY2VpdmVyUGFyYW1ldGVyIG4sIEEgYXJnKTsKKworICAgIFIgdmlzaXQoVmFyVHlwZSBuLCBBIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIwNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworCisvKioKKyAqIEEgdmlzaXRvciB0aGF0IGhhcyBhIHJldHVybiB2YWx1ZSAoUiksIGFuZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhbGwgaXRzIHZpc2l0CisgKiBtZXRob2RzIHRoYXQgdmlzaXRzIHRoZWlyIGNoaWxkcmVuIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLCBhbmQgdGhlIGZpcnN0IHZpc2l0IG1ldGhvZAorICogdGhhdCByZXR1cm5zIGEgdmFsdWUgd2lsbCBzdG9wIHRoZSB2aXNpdGF0aW9uIGFuZCBiZSB0aGUgZW5kIHJlc3VsdC4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNWaXNpdG9yQWRhcHRlcjxSLCBBPiBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHsKKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE1lbWJlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXREZWZhdWx0VmFsdWUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXREZWZhdWx0VmFsdWUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0SW5kZXgoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEluaXRpYWxpemVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TGV2ZWxzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRWYWx1ZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldE1lc3NhZ2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRNZXNzYWdlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0U3RhdGVtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIGlmIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TGFiZWwoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRQYXJhbWV0ZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRFeHRlbmRlZFR5cGVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEltcGxlbWVudGVkVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TWVtYmVycygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEltcG9ydHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldE1vZHVsZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE1vZHVsZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0TGFiZWwoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRMYWJlbCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDbGFzc0JvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEVudHJpZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRNZW1iZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBcmd1bWVudHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEV4cHJlc3Npb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRFeHByZXNzaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRmllbGRBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFZhcmlhYmxlcygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRm9yU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21wYXJlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tcGFyZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRJbml0aWFsaXphdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRVcGRhdGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEVsc2VTdG10KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RWxzZVN0bXQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRTdGF0ZW1lbnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIGlmIChuLmdldEJvZHkoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRCb2R5KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFBhaXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QXJndW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRWYXJBcmdzQW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE5hbWUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFF1YWxpZmllcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFF1YWxpZmllcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgU2ltcGxlTmFtZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbXBvbmVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0RGltZW5zaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RGltZW5zaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEVsZW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RWxlbWVudHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIGlmIChuLmdldEV4cHJlc3Npb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRFeHByZXNzaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgU3VwZXJFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDbGFzc0V4cHIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0TGFiZWwoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRMYWJlbCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRTdGF0ZW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEVudHJpZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBUaGlzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgVHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDYXRjaENsYXVzZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEZpbmFsbHlCbG9jaygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEZpbmFsbHlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRSZXNvdXJjZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q2xhc3NEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGVCb3VuZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRWYXJpYWJsZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRJbml0aWFsaXplcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0RXh0ZW5kZWRUeXBlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0RXh0ZW5kZWRUeXBlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTdXBlclR5cGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRTdXBlclR5cGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIExhbWJkYUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNZXRob2RSZWZlcmVuY2VFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSIHZpc2l0KE5vZGVMaXN0IG4sIEEgYXJnKSB7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHYgOiBuKSB7CisgICAgICAgICAgICBSIHJlc3VsdCA9ICgoTm9kZSkgdikuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTW9kdWxlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TW9kdWxlU3RtdHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTW9kdWxlUmVxdWlyZXNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTW9kdWxlRXhwb3J0c1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TW9kdWxlTmFtZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNb2R1bGVQcm92aWRlc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRXaXRoVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTW9kdWxlVXNlc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgUiByZXN1bHQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTW9kdWxlT3BlbnNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE1vZHVsZU5hbWVzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFVucGFyc2FibGVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSIHJlc3VsdDsKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBWYXJUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFIgcmVzdWx0OworICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q5YTBmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzLmphdmEKQEAgLTAsMCArMSw2MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworCisvKioKKyAqIEEgdmlzaXRvciB0aGF0IGhhcyBhIHJldHVybiB2YWx1ZSAoUiksIGFuZCBoYXMgZGVmYXVsdCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgd2hlbiBhIHNwZWNpZmljIHZpc2l0IG1ldGhvZCBpcyBub3QKKyAqIG92ZXJyaWRkZW4uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0czxSLCBBPiBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHsKKworICAgIC8qKgorICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgZXZlcnkgbm9kZSB2aXNpdCBtZXRob2QgdGhhdCBpcyBub3Qgb3ZlcnJpZGRlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUiBkZWZhdWx0QWN0aW9uKE5vZGUgbiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBieSB0aGUgTm9kZUxpc3QgdmlzaXQgbWV0aG9kIHdoZW4gaXQgaXMgbm90IG92ZXJyaWRkZW4uCisgICAgICovCisgICAgcHVibGljIFIgZGVmYXVsdEFjdGlvbihOb2RlTGlzdCBuLCBBIGFyZykgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgSWZTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTWV0aG9kQ2FsbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTmFtZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uTGV2ZWwgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBUaGlzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgVHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIExhbWJkYUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBUeXBlRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5HZW5lcmljVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIFIgdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUiB2aXNpdChOb2RlTGlzdCBuLCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNb2R1bGVSZXF1aXJlc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBNb2R1bGVFeHBvcnRzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE1vZHVsZVVzZXNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIE1vZHVsZU9wZW5zU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBVbnBhcnNhYmxlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkdlbmVyaWNWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvSGFzaENvZGVWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvSGFzaENvZGVWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkYTEzZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9IYXNoQ29kZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgY2FsY3VsYXRlcyBhIGRlZXAgaGFzaCBjb2RlIGZvciBhIG5vZGUgYnkgdXNpbmcgdGhlIGhhc2ggY29kZXMgb2YgYWxsIGl0cyBwcm9wZXJ0aWVzLAorICogYW5kIHRoZSBoYXNoIGNvZGVzIG9mIGFsbCBpdHMgY2hpbGQgbm9kZXMgKGJ5IHZpc2l0aW5nIHRob3NlIHRvby4pCisgKi8KK3B1YmxpYyBjbGFzcyBIYXNoQ29kZVZpc2l0b3IgaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxJbnRlZ2VyLCBWb2lkPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoQ29kZVZpc2l0b3IgU0lOR0xFVE9OID0gbmV3IEhhc2hDb2RlVmlzaXRvcigpOworCisgICAgcHJpdmF0ZSBIYXNoQ29kZVZpc2l0b3IoKSB7CisgICAgLy8gaGlkZSBjb25zdHJ1Y3RvcgorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5hY2NlcHQoU0lOR0xFVE9OLCBudWxsKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TWVtYmVycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXREZWZhdWx0VmFsdWUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RGVmYXVsdFZhbHVlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRMZXZlbHMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uTGV2ZWwgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXREaW1lbnNpb24oKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RGltZW5zaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRWYWx1ZXMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBBcnJheVR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENvbXBvbmVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE9yaWdpbigpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNZXNzYWdlKCkuaXNQcmVzZW50KCkgPyBuLmdldE1lc3NhZ2UoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0T3BlcmF0b3IoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE9wZXJhdG9yKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDb250ZW50KCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFN0YXRlbWVudHMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFZhbHVlKCkgPyAxIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkgPyBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFBhcmFtZXRlcigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RXh0ZW5kZWRUeXBlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uaXNJbnRlcmZhY2UoKSA/IDEgOiAwKSAqIDMxICsgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE1lbWJlcnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE1vZGlmaWVycygpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpID8gbi5nZXRTY29wZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRJbXBvcnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNb2R1bGUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0TW9kdWxlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuaXNQcmVzZW50KCkgPyBuLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFR5cGVzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ29uZGl0aW9uYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE1vZGlmaWVycygpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmlzUHJlc2VudCgpID8gbi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TGFiZWwoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0TGFiZWwoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEVtcHR5U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QXJndW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDbGFzc0JvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRFbnRyaWVzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNZW1iZXJzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNb2RpZmllcnMoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0RXhwcmVzc2lvbigpLmlzUHJlc2VudCgpID8gbi5nZXRFeHByZXNzaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uaXNUaGlzKCkgPyAxIDogMCkgKiAzMSArIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRNb2RpZmllcnMoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0VmFyaWFibGVzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbXBhcmUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tcGFyZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldEluaXRpYWxpemF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRVcGRhdGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFZhcmlhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSWZTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEVsc2VTdG10KCkuaXNQcmVzZW50KCkgPyBuLmdldEVsc2VTdG10KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uaXNBc3RlcmlzaygpID8gMSA6IDApICogMzEgKyAobi5pc1N0YXRpYygpID8gMSA6IDApICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uaXNTdGF0aWMoKSA/IDEgOiAwKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEVsZW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDb250ZW50KCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFN0YXRlbWVudCgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIExhbWJkYUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzRW5jbG9zaW5nUGFyYW1ldGVycygpID8gMSA6IDApICogMzEgKyAobi5nZXRQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENvbnRlbnQoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENsYXNzRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFZhbHVlKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QXJndW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpID8gbi5nZXRTY29wZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmlzUHJlc2VudCgpID8gbi5nZXRCb2R5KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuaXNQcmVzZW50KCkgPyBuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0SWRlbnRpZmllcigpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpID8gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTmFtZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldElkZW50aWZpZXIoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0UXVhbGlmaWVyKCkuaXNQcmVzZW50KCkgPyBuLmdldFF1YWxpZmllcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoT2JqZWN0IG5vZGUgOiBuKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gMzEgKiAoKFZpc2l0YWJsZSkgbm9kZSkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRQYWlycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuaXNQcmVzZW50KCkgPyBuLmdldEFub255bW91c0NsYXNzQm9keSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkgPyBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzVmFyQXJncygpID8gMSA6IDApICogMzEgKyAobi5nZXRNb2RpZmllcnMoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VmFyQXJnc0Fubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUHJpbWl0aXZlVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VHlwZSgpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4cHJlc3Npb24oKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRJZGVudGlmaWVyKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkgPyBuLmdldENsYXNzRXhwcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkgPyBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0U3RhdGVtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEVudHJpZXMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENhdGNoQ2xhdXNlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0RmluYWxseUJsb2NrKCkuaXNQcmVzZW50KCkgPyBuLmdldEZpbmFsbHlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFJlc291cmNlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBUeXBlRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGVCb3VuZCgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE9wZXJhdG9yKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEVsZW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldFZhcmlhYmxlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4dGVuZGVkVHlwZSgpLmlzUHJlc2VudCgpID8gbi5nZXRFeHRlbmRlZFR5cGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRTdXBlclR5cGUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0U3VwZXJUeXBlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuSGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzT3BlbigpID8gMSA6IDApICogMzEgKyAobi5nZXRNb2R1bGVTdG10cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZVJlcXVpcmVzU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZUV4cG9ydHNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRNb2R1bGVOYW1lcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTW9kdWxlUHJvdmlkZXNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRXaXRoVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q29tbWVudCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZVVzZXNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTW9kdWxlT3BlbnNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRNb2R1bGVOYW1lcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpID8gbi5nZXRDb21tZW50KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5IYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFVucGFyc2FibGVTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLkhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUmVjZWl2ZXJQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkgPyBuLmdldENvbW1lbnQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Nb2RpZmllclZpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Nb2RpZmllclZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgwODY0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL01vZGlmaWVyVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5QYWlyOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRoaXMgdmlzaXRvciBjYW4gYmUgdXNlZCB0byBzYXZlIHRpbWUgd2hlbiBzb21lIHNwZWNpZmljIG5vZGVzIG5lZWRzCisgKiB0byBiZSBjaGFuZ2VkLiBUbyBkbyB0aGF0IGp1c3QgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIG92ZXJyaWRlIHRoZSBtZXRob2RzCisgKiBmcm9tIHRoZSBub2RlcyB3aG8gbmVlZHMgdG8gYmUgY2hhbmdlZCwgcmV0dXJuaW5nIHRoZSBjaGFuZ2VkIG5vZGUuCisgKiBSZXR1cm5pbmcgbnVsbCB3aWxsIHJlbW92ZSB0aGUgbm9kZS4KKyAqCisgKiBJZiBhIG5vZGUgaXMgcmVtb3ZlZCB0aGF0IHdhcyByZXF1aXJlZCBpbiBpdHMgcGFyZW50IG5vZGUsCisgKiB0aGUgcGFyZW50IG5vZGUgd2lsbCBiZSByZW1vdmVkIHRvby4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVyVmlzaXRvcjxBPiBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPFZpc2l0YWJsZSwgQT4geworCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBtb2RpZnlMaXN0KG4uZ2V0TWVtYmVycygpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0TWVtYmVycyhtZW1iZXJzKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlID0gbi5nZXREZWZhdWx0VmFsdWUoKS5tYXAocyAtPiAoRXhwcmVzc2lvbikgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIFR5cGUgdHlwZSA9IChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgdHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIG4uc2V0TmFtZShuYW1lKTsKKyAgICAgICAgbi5zZXRUeXBlKHR5cGUpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gaW5kZXggPSAoRXhwcmVzc2lvbikgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIG5hbWUgPSAoRXhwcmVzc2lvbikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChpbmRleCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEluZGV4KGluZGV4KTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBUeXBlIGVsZW1lbnRUeXBlID0gKFR5cGUpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQXJyYXlJbml0aWFsaXplckV4cHIgaW5pdGlhbGl6ZXIgPSBuLmdldEluaXRpYWxpemVyKCkubWFwKHMgLT4gKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIE5vZGVMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gbGV2ZWxzID0gbW9kaWZ5TGlzdChuLmdldExldmVscygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCB8fCBsZXZlbHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgICAgICBuLnNldEluaXRpYWxpemVyKGluaXRpYWxpemVyKTsKKyAgICAgICAgbi5zZXRMZXZlbHMobGV2ZWxzKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzID0gbW9kaWZ5TGlzdChuLmdldFZhbHVlcygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gY2hlY2sgPSAoRXhwcmVzc2lvbikgbi5nZXRDaGVjaygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIG1lc3NhZ2UgPSBuLmdldE1lc3NhZ2UoKS5tYXAocyAtPiAoRXhwcmVzc2lvbikgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoY2hlY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldENoZWNrKGNoZWNrKTsKKyAgICAgICAgbi5zZXRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gdGFyZ2V0ID0gKEV4cHJlc3Npb24pIG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSAoRXhwcmVzc2lvbikgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICBuLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGxlZnQgPSAoRXhwcmVzc2lvbikgbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQgPSAoRXhwcmVzc2lvbikgbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobGVmdCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHJpZ2h0OworICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICBuLnNldExlZnQobGVmdCk7CisgICAgICAgIG4uc2V0UmlnaHQocmlnaHQpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gbW9kaWZ5TGlzdChuLmdldFN0YXRlbWVudHMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRTdGF0ZW1lbnRzKHN0YXRlbWVudHMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbGFiZWwgPSBuLmdldExhYmVsKCkubWFwKHMgLT4gKFNpbXBsZU5hbWUpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRMYWJlbChsYWJlbCk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICAgIG4uc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSAoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIG4uZ2V0UGFyYW1ldGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChib2R5ID09IG51bGwgfHwgcGFyYW1ldGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRCb2R5KGJvZHkpOworICAgICAgICBuLnNldFBhcmFtZXRlcihwYXJhbWV0ZXIpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFR5cGUgdHlwZSA9IChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldFR5cGUodHlwZSk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kZWRUeXBlcyA9IG1vZGlmeUxpc3Qobi5nZXRFeHRlbmRlZFR5cGVzKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRlZFR5cGVzID0gbW9kaWZ5TGlzdChuLmdldEltcGxlbWVudGVkVHlwZXMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBtb2RpZnlMaXN0KG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzID0gbW9kaWZ5TGlzdChuLmdldE1lbWJlcnMoKSwgYXJnKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gKFNpbXBsZU5hbWUpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBtb2RpZnlMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEV4dGVuZGVkVHlwZXMoZXh0ZW5kZWRUeXBlcyk7CisgICAgICAgIG4uc2V0SW1wbGVtZW50ZWRUeXBlcyhpbXBsZW1lbnRlZFR5cGVzKTsKKyAgICAgICAgbi5zZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIG4uc2V0TWVtYmVycyhtZW1iZXJzKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gKFNpbXBsZU5hbWUpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBzY29wZSA9IG4uZ2V0U2NvcGUoKS5tYXAocyAtPiAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cyA9IG1vZGlmeUxpc3Qobi5nZXRUeXBlQXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0TmFtZShuYW1lKTsKKyAgICAgICAgbi5zZXRTY29wZShzY29wZSk7CisgICAgICAgIG4uc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IG1vZGlmeUxpc3Qobi5nZXRJbXBvcnRzKCksIGFyZyk7CisgICAgICAgIE1vZHVsZURlY2xhcmF0aW9uIG1vZHVsZSA9IG4uZ2V0TW9kdWxlKCkubWFwKHMgLT4gKE1vZHVsZURlY2xhcmF0aW9uKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSBuLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLm1hcChzIC0+IChQYWNrYWdlRGVjbGFyYXRpb24pIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlcyA9IG1vZGlmeUxpc3Qobi5nZXRUeXBlcygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldEltcG9ydHMoaW1wb3J0cyk7CisgICAgICAgIG4uc2V0TW9kdWxlKG1vZHVsZSk7CisgICAgICAgIG4uc2V0UGFja2FnZURlY2xhcmF0aW9uKHBhY2thZ2VEZWNsYXJhdGlvbik7CisgICAgICAgIG4uc2V0VHlwZXModHlwZXMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSAoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBlbHNlRXhwciA9IChFeHByZXNzaW9uKSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gdGhlbkV4cHIgPSAoRXhwcmVzc2lvbikgbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoY29uZGl0aW9uID09IG51bGwgfHwgZWxzZUV4cHIgPT0gbnVsbCB8fCB0aGVuRXhwciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisgICAgICAgIG4uc2V0RWxzZUV4cHIoZWxzZUV4cHIpOworICAgICAgICBuLnNldFRoZW5FeHByKHRoZW5FeHByKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IChCbG9ja1N0bXQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG1vZGlmeUxpc3Qobi5nZXRQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIFJlY2VpdmVyUGFyYW1ldGVyIHJlY2VpdmVyUGFyYW1ldGVyID0gbi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLm1hcChzIC0+IChSZWNlaXZlclBhcmFtZXRlcikgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zID0gbW9kaWZ5TGlzdChuLmdldFRocm93bkV4Y2VwdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBtb2RpZnlMaXN0KG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChib2R5ID09IG51bGwgfHwgbmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Qm9keShib2R5KTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIG4uc2V0UmVjZWl2ZXJQYXJhbWV0ZXIocmVjZWl2ZXJQYXJhbWV0ZXIpOworICAgICAgICBuLnNldFRocm93bkV4Y2VwdGlvbnModGhyb3duRXhjZXB0aW9ucyk7CisgICAgICAgIG4uc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbGFiZWwgPSBuLmdldExhYmVsKCkubWFwKHMgLT4gKFNpbXBsZU5hbWUpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRMYWJlbChsYWJlbCk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBTdGF0ZW1lbnQgYm9keSA9IChTdGF0ZW1lbnQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IChFeHByZXNzaW9uKSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoYm9keSA9PSBudWxsIHx8IGNvbmRpdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Qm9keShib2R5KTsKKyAgICAgICAgbi5zZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGlubmVyID0gKEV4cHJlc3Npb24pIG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKGlubmVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRJbm5lcihpbm5lcik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cyA9IG1vZGlmeUxpc3Qobi5nZXRBcmd1bWVudHMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBjbGFzc0JvZHkgPSBtb2RpZnlMaXN0KG4uZ2V0Q2xhc3NCb2R5KCksIGFyZyk7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IChTaW1wbGVOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRBcmd1bWVudHMoYXJndW1lbnRzKTsKKyAgICAgICAgbi5zZXRDbGFzc0JvZHkoY2xhc3NCb2R5KTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnRyaWVzID0gbW9kaWZ5TGlzdChuLmdldEVudHJpZXMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkVHlwZXMgPSBtb2RpZnlMaXN0KG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBtb2RpZnlMaXN0KG4uZ2V0TWVtYmVycygpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RW50cmllcyhlbnRyaWVzKTsKKyAgICAgICAgbi5zZXRJbXBsZW1lbnRlZFR5cGVzKGltcGxlbWVudGVkVHlwZXMpOworICAgICAgICBuLnNldE1lbWJlcnMobWVtYmVycyk7CisgICAgICAgIG4uc2V0TmFtZShuYW1lKTsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMgPSBtb2RpZnlMaXN0KG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG4uZ2V0RXhwcmVzc2lvbigpLm1hcChzIC0+IChFeHByZXNzaW9uKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBtb2RpZnlMaXN0KG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldEFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICBuLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICAgIG4uc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRmllbGRBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IChTaW1wbGVOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBtb2RpZnlMaXN0KG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IHNjb3BlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgbi5zZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzID0gbW9kaWZ5TGlzdChuLmdldFZhcmlhYmxlcygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBtb2RpZnlMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKHZhcmlhYmxlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRWYXJpYWJsZXModmFyaWFibGVzKTsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFN0YXRlbWVudCBib2R5ID0gKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gaXRlcmFibGUgPSAoRXhwcmVzc2lvbikgbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2YXJpYWJsZSA9IChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoYm9keSA9PSBudWxsIHx8IGl0ZXJhYmxlID09IG51bGwgfHwgdmFyaWFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEJvZHkoYm9keSk7CisgICAgICAgIG4uc2V0SXRlcmFibGUoaXRlcmFibGUpOworICAgICAgICBuLnNldFZhcmlhYmxlKHZhcmlhYmxlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgRm9yU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBTdGF0ZW1lbnQgYm9keSA9IChTdGF0ZW1lbnQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIGNvbXBhcmUgPSBuLmdldENvbXBhcmUoKS5tYXAocyAtPiAoRXhwcmVzc2lvbikgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBOb2RlTGlzdDxFeHByZXNzaW9uPiBpbml0aWFsaXphdGlvbiA9IG1vZGlmeUxpc3Qobi5nZXRJbml0aWFsaXphdGlvbigpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUgPSBtb2RpZnlMaXN0KG4uZ2V0VXBkYXRlKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChib2R5ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRCb2R5KGJvZHkpOworICAgICAgICBuLnNldENvbXBhcmUoY29tcGFyZSk7CisgICAgICAgIG4uc2V0SW5pdGlhbGl6YXRpb24oaW5pdGlhbGl6YXRpb24pOworICAgICAgICBuLnNldFVwZGF0ZSh1cGRhdGUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSAoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgU3RhdGVtZW50IGVsc2VTdG10ID0gbi5nZXRFbHNlU3RtdCgpLm1hcChzIC0+IChTdGF0ZW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgU3RhdGVtZW50IHRoZW5TdG10ID0gKFN0YXRlbWVudCkgbi5nZXRUaGVuU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoY29uZGl0aW9uID09IG51bGwgfHwgdGhlblN0bXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldENvbmRpdGlvbihjb25kaXRpb24pOworICAgICAgICBuLnNldEVsc2VTdG10KGVsc2VTdG10KTsKKyAgICAgICAgbi5zZXRUaGVuU3RtdCh0aGVuU3RtdCk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSAoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChib2R5ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRCb2R5KGJvZHkpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBSZWZlcmVuY2VUeXBlIHR5cGUgPSAoUmVmZXJlbmNlVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwgfHwgdHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgbi5zZXRUeXBlKHR5cGUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgU2ltcGxlTmFtZSBsYWJlbCA9IChTaW1wbGVOYW1lKSBuLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBuLmdldFN0YXRlbWVudCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobGFiZWwgPT0gbnVsbCB8fCBzdGF0ZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldExhYmVsKGxhYmVsKTsKKyAgICAgICAgbi5zZXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldE5hbWUobmFtZSk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gdmFsdWUgPSAoRXhwcmVzc2lvbikgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTWV0aG9kQ2FsbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzID0gbW9kaWZ5TGlzdChuLmdldEFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBuLmdldFNjb3BlKCkubWFwKHMgLT4gKEV4cHJlc3Npb24pIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZT4gdHlwZUFyZ3VtZW50cyA9IG1vZGlmeUxpc3Qobi5nZXRUeXBlQXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRBcmd1bWVudHMoYXJndW1lbnRzKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgbi5zZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBCbG9ja1N0bXQgYm9keSA9IG4uZ2V0Qm9keSgpLm1hcChzIC0+IChCbG9ja1N0bXQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG1vZGlmeUxpc3Qobi5nZXRQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIFJlY2VpdmVyUGFyYW1ldGVyIHJlY2VpdmVyUGFyYW1ldGVyID0gbi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLm1hcChzIC0+IChSZWNlaXZlclBhcmFtZXRlcikgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd25FeGNlcHRpb25zID0gbW9kaWZ5TGlzdChuLmdldFRocm93bkV4Y2VwdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSBtb2RpZnlMaXN0KG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgbmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Qm9keShib2R5KTsKKyAgICAgICAgbi5zZXRUeXBlKHR5cGUpOworICAgICAgICBuLnNldE5hbWUobmFtZSk7CisgICAgICAgIG4uc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKyAgICAgICAgbi5zZXRSZWNlaXZlclBhcmFtZXRlcihyZWNlaXZlclBhcmFtZXRlcik7CisgICAgICAgIG4uc2V0VGhyb3duRXhjZXB0aW9ucyh0aHJvd25FeGNlcHRpb25zKTsKKyAgICAgICAgbi5zZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIG4uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzID0gbW9kaWZ5TGlzdChuLmdldFBhaXJzKCksIGFyZyk7CisgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldFBhaXJzKHBhaXJzKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBOdWxsTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gYW5vbnltb3VzQ2xhc3NCb2R5ID0gbW9kaWZ5TGlzdChuLmdldEFub255bW91c0NsYXNzQm9keSgpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmd1bWVudHMgPSBtb2RpZnlMaXN0KG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBuLmdldFNjb3BlKCkubWFwKHMgLT4gKEV4cHJlc3Npb24pIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZSA9IChDbGFzc09ySW50ZXJmYWNlVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBtb2RpZnlMaXN0KG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0QW5vbnltb3VzQ2xhc3NCb2R5KGFub255bW91c0NsYXNzQm9keSk7CisgICAgICAgIG4uc2V0QXJndW1lbnRzKGFyZ3VtZW50cyk7CisgICAgICAgIG4uc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBuLnNldFR5cGUodHlwZSk7CisgICAgICAgIG4uc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0TmFtZShuYW1lKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSAoU2ltcGxlTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIFR5cGUgdHlwZSA9IChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IHZhckFyZ3NBbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRWYXJBcmdzQW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCB0eXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0TmFtZShuYW1lKTsKKyAgICAgICAgbi5zZXRUeXBlKHR5cGUpOworICAgICAgICBuLnNldFZhckFyZ3NBbm5vdGF0aW9ucyh2YXJBcmdzQW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBOYW1lIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBOYW1lIHF1YWxpZmllciA9IG4uZ2V0UXVhbGlmaWVyKCkubWFwKHMgLT4gKE5hbWUpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0UXVhbGlmaWVyKHF1YWxpZmllcik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBUeXBlIGNvbXBvbmVudFR5cGUgPSAoVHlwZSkgbi5nZXRDb21wb25lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Q29tcG9uZW50VHlwZShjb21wb25lbnRUeXBlKTsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBtb2RpZnlMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBkaW1lbnNpb24gPSBuLmdldERpbWVuc2lvbigpLm1hcChzIC0+IChFeHByZXNzaW9uKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldERpbWVuc2lvbihkaW1lbnNpb24pOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzID0gbW9kaWZ5TGlzdChuLmdldEVsZW1lbnRzKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RWxlbWVudHMoZWxlbWVudHMpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVW5pb25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzID0gbW9kaWZ5TGlzdChuLmdldEVsZW1lbnRzKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoZWxlbWVudHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RWxlbWVudHMoZWxlbWVudHMpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuLmdldEV4cHJlc3Npb24oKS5tYXAocyAtPiAoRXhwcmVzc2lvbikgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUgPSAoRXhwcmVzc2lvbikgbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChtZW1iZXJWYWx1ZSA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldE1lbWJlclZhbHVlKG1lbWJlclZhbHVlKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjbGFzc0V4cHIgPSBuLmdldENsYXNzRXhwcigpLm1hcChzIC0+IChFeHByZXNzaW9uKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0Q2xhc3NFeHByKGNsYXNzRXhwcik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGxhYmVsID0gbi5nZXRMYWJlbCgpLm1hcChzIC0+IChFeHByZXNzaW9uKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIE5vZGVMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cyA9IG1vZGlmeUxpc3Qobi5nZXRTdGF0ZW1lbnRzKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0TGFiZWwobGFiZWwpOworICAgICAgICBuLnNldFN0YXRlbWVudHMoc3RhdGVtZW50cyk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzID0gbW9kaWZ5TGlzdChuLmdldEVudHJpZXMoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBzZWxlY3RvciA9IChFeHByZXNzaW9uKSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0RW50cmllcyhlbnRyaWVzKTsKKyAgICAgICAgbi5zZXRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgQmxvY2tTdG10IGJvZHkgPSAoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoYm9keSA9PSBudWxsIHx8IGV4cHJlc3Npb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEJvZHkoYm9keSk7CisgICAgICAgIG4uc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjbGFzc0V4cHIgPSBuLmdldENsYXNzRXhwcigpLm1hcChzIC0+IChFeHByZXNzaW9uKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0Q2xhc3NFeHByKGNsYXNzRXhwcik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaENsYXVzZXMgPSBtb2RpZnlMaXN0KG4uZ2V0Q2F0Y2hDbGF1c2VzKCksIGFyZyk7CisgICAgICAgIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2sgPSBuLmdldEZpbmFsbHlCbG9jaygpLm1hcChzIC0+IChCbG9ja1N0bXQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gcmVzb3VyY2VzID0gbW9kaWZ5TGlzdChuLmdldFJlc291cmNlcygpLCBhcmcpOworICAgICAgICBCbG9ja1N0bXQgdHJ5QmxvY2sgPSAoQmxvY2tTdG10KSBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmICh0cnlCbG9jayA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Q2F0Y2hDbGF1c2VzKGNhdGNoQ2xhdXNlcyk7CisgICAgICAgIG4uc2V0RmluYWxseUJsb2NrKGZpbmFsbHlCbG9jayk7CisgICAgICAgIG4uc2V0UmVzb3VyY2VzKHJlc291cmNlcyk7CisgICAgICAgIG4uc2V0VHJ5QmxvY2sodHJ5QmxvY2spOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgbi5nZXRDbGFzc0RlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChjbGFzc0RlY2xhcmF0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRDbGFzc0RlY2xhcmF0aW9uKGNsYXNzRGVjbGFyYXRpb24pOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIFNpbXBsZU5hbWUgbmFtZSA9IChTaW1wbGVOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCA9IG1vZGlmeUxpc3Qobi5nZXRUeXBlQm91bmQoKSwgYXJnKTsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldFR5cGVCb3VuZCh0eXBlQm91bmQpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzID0gbW9kaWZ5TGlzdChuLmdldFZhcmlhYmxlcygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAodmFyaWFibGVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRWYXJpYWJsZXModmFyaWFibGVzKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gaW5pdGlhbGl6ZXIgPSBuLmdldEluaXRpYWxpemVyKCkubWFwKHMgLT4gKEV4cHJlc3Npb24pIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gKFNpbXBsZU5hbWUpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgdHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOworICAgICAgICBuLnNldE5hbWUobmFtZSk7CisgICAgICAgIG4uc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgU3RhdGVtZW50IGJvZHkgPSAoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSAoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCB8fCBjb25kaXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldEJvZHkoYm9keSk7CisgICAgICAgIG4uc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBSZWZlcmVuY2VUeXBlIGV4dGVuZGVkVHlwZSA9IG4uZ2V0RXh0ZW5kZWRUeXBlKCkubWFwKHMgLT4gKFJlZmVyZW5jZVR5cGUpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBzdXBlclR5cGUgPSBuLmdldFN1cGVyVHlwZSgpLm1hcChzIC0+IChSZWZlcmVuY2VUeXBlKSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldEV4dGVuZGVkVHlwZShleHRlbmRlZFR5cGUpOworICAgICAgICBuLnNldFN1cGVyVHlwZShzdXBlclR5cGUpOworICAgICAgICBuLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTGFtYmRhRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBTdGF0ZW1lbnQgYm9keSA9IChTdGF0ZW1lbnQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBtb2RpZnlMaXN0KG4uZ2V0UGFyYW1ldGVycygpLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAoYm9keSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0Qm9keShib2R5KTsKKyAgICAgICAgbi5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBNZXRob2RSZWZlcmVuY2VFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSAoRXhwcmVzc2lvbikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxUeXBlPiB0eXBlQXJndW1lbnRzID0gbW9kaWZ5TGlzdChuLmdldFR5cGVBcmd1bWVudHMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKHNjb3BlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRTY29wZShzY29wZSk7CisgICAgICAgIG4uc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KE5vZGVMaXN0IG4sIEEgYXJnKSB7CisgICAgICAgIGlmIChuLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTGlzdDxQYWlyPE5vZGUsIE5vZGU+PiBjaGFuZ2VMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIExpc3Q8Tm9kZT4gbGlzdENvcHkgPSBuZXcgQXJyYXlMaXN0PD4obik7CisgICAgICAgIGZvciAoTm9kZSBub2RlIDogbGlzdENvcHkpIHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGUgbmV3Tm9kZSA9IChOb2RlKSBub2RlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgY2hhbmdlTGlzdC5hZGQobmV3IFBhaXI8Pihub2RlLCBuZXdOb2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChQYWlyPE5vZGUsIE5vZGU+IGNoYW5nZSA6IGNoYW5nZUxpc3QpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UuYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbi5yZW1vdmUoY2hhbmdlLmEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IG4uaW5kZXhPZihjaGFuZ2UuYSk7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgcmVtb3ZlZCB0aGlzIGl0ZW0gYnkgaGFuZCwgaWdub3JlIHRoZSBjaGFuZ2UuCisgICAgICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbi5zZXQoaSwgY2hhbmdlLmIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldE5hbWUobmFtZSk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIHByaXZhdGUgPE4gZXh0ZW5kcyBOb2RlPiBOb2RlTGlzdDxOPiBtb2RpZnlMaXN0KE5vZGVMaXN0PE4+IGxpc3QsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiAoTm9kZUxpc3Q8Tj4pIGxpc3QuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8TiBleHRlbmRzIE5vZGU+IE5vZGVMaXN0PE4+IG1vZGlmeUxpc3QoT3B0aW9uYWw8Tm9kZUxpc3Q8Tj4+IGxpc3QsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBsaXN0Lm1hcChucyAtPiBtb2RpZnlMaXN0KG5zLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1vZHVsZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG1vZGlmeUxpc3Qobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBOb2RlTGlzdDxNb2R1bGVTdG10PiBtb2R1bGVTdG10cyA9IG1vZGlmeUxpc3Qobi5nZXRNb2R1bGVTdG10cygpLCBhcmcpOworICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIG4uc2V0TW9kdWxlU3RtdHMobW9kdWxlU3RtdHMpOworICAgICAgICBuLnNldE5hbWUobmFtZSk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1vZHVsZVJlcXVpcmVzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1vZHVsZUV4cG9ydHNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzID0gbW9kaWZ5TGlzdChuLmdldE1vZHVsZU5hbWVzKCksIGFyZyk7CisgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldE1vZHVsZU5hbWVzKG1vZHVsZU5hbWVzKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHdpdGhUeXBlcyA9IG1vZGlmeUxpc3Qobi5nZXRXaXRoVHlwZXMoKSwgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldFR5cGUodHlwZSk7CisgICAgICAgIG4uc2V0V2l0aFR5cGVzKHdpdGhUeXBlcyk7CisgICAgICAgIG4uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTW9kdWxlVXNlc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Nb2RpZmllclZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoZmluYWwgTW9kdWxlT3BlbnNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PE5hbWU+IG1vZHVsZU5hbWVzID0gbW9kaWZ5TGlzdChuLmdldE1vZHVsZU5hbWVzKCksIGFyZyk7CisgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbi5nZXRDb21tZW50KCkubWFwKHMgLT4gKENvbW1lbnQpIHMuYWNjZXB0KHRoaXMsIGFyZykpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBuLnNldE1vZHVsZU5hbWVzKG1vZHVsZU5hbWVzKTsKKyAgICAgICAgbi5zZXROYW1lKG5hbWUpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBVbnBhcnNhYmxlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuLmdldENvbW1lbnQoKS5tYXAocyAtPiAoQ29tbWVudCkgcy5hY2NlcHQodGhpcywgYXJnKSkub3JFbHNlKG51bGwpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBtb2RpZnlMaXN0KG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgdHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIG4uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldE5hbWUobmFtZSk7CisgICAgICAgIG4uc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbi5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbW9kaWZ5TGlzdChuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG4uZ2V0Q29tbWVudCgpLm1hcChzIC0+IChDb21tZW50KSBzLmFjY2VwdCh0aGlzLCBhcmcpKS5vckVsc2UobnVsbCk7CisgICAgICAgIG4uc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBuLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTm9Db21tZW50RXF1YWxzVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzFkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTm9Db21tZW50RXF1YWxzVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTm9Db21tZW50RXF1YWxzVmlzaXRvciBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPEJvb2xlYW4sIFZpc2l0YWJsZT4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9Db21tZW50RXF1YWxzVmlzaXRvciBTSU5HTEVUT04gPSBuZXcgTm9Db21tZW50RXF1YWxzVmlzaXRvcigpOworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhmaW5hbCBOb2RlIG4sIGZpbmFsIE5vZGUgbjIpIHsKKyAgICAgICAgcmV0dXJuIFNJTkdMRVRPTi5ub2RlRXF1YWxzKG4sIG4yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxOIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2Rlc0VxdWFscyhOb2RlTGlzdDxOPiBuLCBOb2RlTGlzdDxOPiBuMikgeworICAgICAgICBpZiAobiA9PSBuMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCBuMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uc2l6ZSgpICE9IG4yLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0KGkpLCBuMi5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOb2RlPiBib29sZWFuIG5vZGVFcXVhbHMoZmluYWwgVCBuLCBmaW5hbCBUIG4yKSB7CisgICAgICAgIGlmIChuID09IG4yKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA9PSBudWxsIHx8IG4yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRDbGFzcygpICE9IG4yLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbi5hY2NlcHQodGhpcywgbjIpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOb2RlPiBib29sZWFuIG5vZGVFcXVhbHMoZmluYWwgT3B0aW9uYWw8VD4gbiwgZmluYWwgT3B0aW9uYWw8VD4gbjIpIHsKKyAgICAgICAgcmV0dXJuIG5vZGVFcXVhbHMobi5vckVsc2UobnVsbCksIG4yLm9yRWxzZShudWxsKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIE5vZGU+IGJvb2xlYW4gbm9kZXNFcXVhbHMoZmluYWwgT3B0aW9uYWw8Tm9kZUxpc3Q8VD4+IG4sIGZpbmFsIE9wdGlvbmFsPE5vZGVMaXN0PFQ+PiBuMikgeworICAgICAgICByZXR1cm4gbm9kZXNFcXVhbHMobi5vckVsc2UobnVsbCksIG4yLm9yRWxzZShudWxsKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIG9iakVxdWFscyhmaW5hbCBPYmplY3QgbiwgZmluYWwgT2JqZWN0IG4yKSB7CisgICAgICAgIGlmIChuID09IG4yKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA9PSBudWxsIHx8IG4yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbi5lcXVhbHMobjIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuMiA9IChDb21waWxhdGlvblVuaXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEltcG9ydHMoKSwgbjIuZ2V0SW1wb3J0cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TW9kdWxlKCksIG4yLmdldE1vZHVsZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCksIG4yLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVzKCksIG4yLmdldFR5cGVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbjIgPSAoUGFja2FnZURlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVHlwZVBhcmFtZXRlciBuMiA9IChUeXBlUGFyYW1ldGVyKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVCb3VuZCgpLCBuMi5nZXRUeXBlQm91bmQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbjIgPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRFeHRlbmRlZFR5cGVzKCksIG4yLmdldEV4dGVuZGVkVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRJbXBsZW1lbnRlZFR5cGVzKCksIG4yLmdldEltcGxlbWVudGVkVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNJbnRlcmZhY2UoKSwgbjIuaXNJbnRlcmZhY2UoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBuMi5nZXRUeXBlUGFyYW1ldGVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1lbWJlcnMoKSwgbjIuZ2V0TWVtYmVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRW51bURlY2xhcmF0aW9uIG4yID0gKEVudW1EZWNsYXJhdGlvbikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0RW50cmllcygpLCBuMi5nZXRFbnRyaWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLCBuMi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE1vZGlmaWVycygpLCBuMi5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4yID0gKEVudW1Db25zdGFudERlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBcmd1bWVudHMoKSwgbjIuZ2V0QXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0Q2xhc3NCb2R5KCksIG4yLmdldENsYXNzQm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuMiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1lbWJlcnMoKSwgbjIuZ2V0TWVtYmVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4yID0gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXREZWZhdWx0VmFsdWUoKSwgbjIuZ2V0RGVmYXVsdFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE1vZGlmaWVycygpLCBuMi5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4yID0gKEZpZWxkRGVjbGFyYXRpb24pIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VmFyaWFibGVzKCksIG4yLmdldFZhcmlhYmxlcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbjIgPSAoVmFyaWFibGVEZWNsYXJhdG9yKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEluaXRpYWxpemVyKCksIG4yLmdldEluaXRpYWxpemVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbjIgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0UGFyYW1ldGVycygpLCBuMi5nZXRQYXJhbWV0ZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLCBuMi5nZXRSZWNlaXZlclBhcmFtZXRlcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFRocm93bkV4Y2VwdGlvbnMoKSwgbjIuZ2V0VGhyb3duRXhjZXB0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbjIgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0UGFyYW1ldGVycygpLCBuMi5nZXRQYXJhbWV0ZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLCBuMi5nZXRSZWNlaXZlclBhcmFtZXRlcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFRocm93bkV4Y2VwdGlvbnMoKSwgbjIuZ2V0VGhyb3duRXhjZXB0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFBhcmFtZXRlciBuMiA9IChQYXJhbWV0ZXIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmlzVmFyQXJncygpLCBuMi5pc1ZhckFyZ3MoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0TW9kaWZpZXJzKCksIG4yLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRWYXJBcmdzQW5ub3RhdGlvbnMoKSwgbjIuZ2V0VmFyQXJnc0Fubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuMiA9IChJbml0aWFsaXplckRlY2xhcmF0aW9uKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5pc1N0YXRpYygpLCBuMi5pc1N0YXRpYygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbjIgPSAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgUHJpbWl0aXZlVHlwZSBuMiA9IChQcmltaXRpdmVUeXBlKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFycmF5VHlwZSBuMiA9IChBcnJheVR5cGUpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29tcG9uZW50VHlwZSgpLCBuMi5nZXRDb21wb25lbnRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE9yaWdpbigpLCBuMi5nZXRPcmlnaW4oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4yID0gKEFycmF5Q3JlYXRpb25MZXZlbCkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldERpbWVuc2lvbigpLCBuMi5nZXREaW1lbnNpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4yID0gKEludGVyc2VjdGlvblR5cGUpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEVsZW1lbnRzKCksIG4yLmdldEVsZW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFVuaW9uVHlwZSBuMiA9IChVbmlvblR5cGUpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEVsZW1lbnRzKCksIG4yLmdldEVsZW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVm9pZFR5cGUgbjIgPSAoVm9pZFR5cGUpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBXaWxkY2FyZFR5cGUgbjIgPSAoV2lsZGNhcmRUeXBlKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4dGVuZGVkVHlwZSgpLCBuMi5nZXRFeHRlbmRlZFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFN1cGVyVHlwZSgpLCBuMi5nZXRTdXBlclR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBVbmtub3duVHlwZSBuMiA9IChVbmtub3duVHlwZSkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFycmF5QWNjZXNzRXhwciBuMiA9IChBcnJheUFjY2Vzc0V4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0SW5kZXgoKSwgbjIuZ2V0SW5kZXgoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuMiA9IChBcnJheUNyZWF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFbGVtZW50VHlwZSgpLCBuMi5nZXRFbGVtZW50VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0SW5pdGlhbGl6ZXIoKSwgbjIuZ2V0SW5pdGlhbGl6ZXIoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRMZXZlbHMoKSwgbjIuZ2V0TGV2ZWxzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4yID0gKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRWYWx1ZXMoKSwgbjIuZ2V0VmFsdWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQXNzaWduRXhwciBuMiA9IChBc3NpZ25FeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0T3BlcmF0b3IoKSwgbjIuZ2V0T3BlcmF0b3IoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFRhcmdldCgpLCBuMi5nZXRUYXJnZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQmluYXJ5RXhwciBuMiA9IChCaW5hcnlFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldExlZnQoKSwgbjIuZ2V0TGVmdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRPcGVyYXRvcigpLCBuMi5nZXRPcGVyYXRvcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0UmlnaHQoKSwgbjIuZ2V0UmlnaHQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQ2FzdEV4cHIgbjIgPSAoQ2FzdEV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0RXhwcmVzc2lvbigpLCBuMi5nZXRFeHByZXNzaW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIENsYXNzRXhwciBuMiA9IChDbGFzc0V4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDb25kaXRpb25hbEV4cHIgbjIgPSAoQ29uZGl0aW9uYWxFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbmRpdGlvbigpLCBuMi5nZXRDb25kaXRpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEVsc2VFeHByKCksIG4yLmdldEVsc2VFeHByKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUaGVuRXhwcigpLCBuMi5nZXRUaGVuRXhwcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW5jbG9zZWRFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRW5jbG9zZWRFeHByIG4yID0gKEVuY2xvc2VkRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRJbm5lcigpLCBuMi5nZXRJbm5lcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRmllbGRBY2Nlc3NFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRmllbGRBY2Nlc3NFeHByIG4yID0gKEZpZWxkQWNjZXNzRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEluc3RhbmNlT2ZFeHByIG4yID0gKEluc3RhbmNlT2ZFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4yID0gKFN0cmluZ0xpdGVyYWxFeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEludGVnZXJMaXRlcmFsRXhwciBuMiA9IChJbnRlZ2VyTGl0ZXJhbEV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4yID0gKExvbmdMaXRlcmFsRXhwcikgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbjIgPSAoQ2hhckxpdGVyYWxFeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbjIgPSAoRG91YmxlTGl0ZXJhbEV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4yID0gKEJvb2xlYW5MaXRlcmFsRXhwcikgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBOdWxsTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZENhbGxFeHByIG4yID0gKE1ldGhvZENhbGxFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBcmd1bWVudHMoKSwgbjIuZ2V0QXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE5hbWVFeHByIG4yID0gKE5hbWVFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4yID0gKE9iamVjdENyZWF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCksIG4yLmdldEFub255bW91c0NsYXNzQm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFyZ3VtZW50cygpLCBuMi5nZXRBcmd1bWVudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE5hbWUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBOYW1lIG4yID0gKE5hbWUpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldElkZW50aWZpZXIoKSwgbjIuZ2V0SWRlbnRpZmllcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0UXVhbGlmaWVyKCksIG4yLmdldFF1YWxpZmllcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU2ltcGxlTmFtZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFNpbXBsZU5hbWUgbjIgPSAoU2ltcGxlTmFtZSkgYXJnOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldElkZW50aWZpZXIoKSwgbjIuZ2V0SWRlbnRpZmllcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBUaGlzRXhwciBuMiA9IChUaGlzRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDbGFzc0V4cHIoKSwgbjIuZ2V0Q2xhc3NFeHByKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBTdXBlckV4cHIgbjIgPSAoU3VwZXJFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENsYXNzRXhwcigpLCBuMi5nZXRDbGFzc0V4cHIoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFVuYXJ5RXhwciBuMiA9IChVbmFyeUV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0RXhwcmVzc2lvbigpLCBuMi5nZXRFeHByZXNzaW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW9iakVxdWFscyhuLmdldE9wZXJhdG9yKCksIG4yLmdldE9wZXJhdG9yKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4yID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0VmFyaWFibGVzKCksIG4yLmdldFZhcmlhYmxlcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuMiA9IChNYXJrZXJBbm5vdGF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbjIgPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0TWVtYmVyVmFsdWUoKSwgbjIuZ2V0TWVtYmVyVmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuMiA9IChOb3JtYWxBbm5vdGF0aW9uRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0UGFpcnMoKSwgbjIuZ2V0UGFpcnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4yID0gKE1lbWJlclZhbHVlUGFpcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbjIgPSAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBcmd1bWVudHMoKSwgbjIuZ2V0QXJndW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNUaGlzKCksIG4yLmlzVGhpcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbjIgPSAoTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDbGFzc0RlY2xhcmF0aW9uKCksIG4yLmdldENsYXNzRGVjbGFyYXRpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBBc3NlcnRTdG10IG4yID0gKEFzc2VydFN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q2hlY2soKSwgbjIuZ2V0Q2hlY2soKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE1lc3NhZ2UoKSwgbjIuZ2V0TWVzc2FnZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQmxvY2tTdG10IG4yID0gKEJsb2NrU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0U3RhdGVtZW50cygpLCBuMi5nZXRTdGF0ZW1lbnRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIExhYmVsZWRTdG10IG4yID0gKExhYmVsZWRTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldExhYmVsKCksIG4yLmdldExhYmVsKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTdGF0ZW1lbnQoKSwgbjIuZ2V0U3RhdGVtZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEV4cHJlc3Npb25TdG10IG4yID0gKEV4cHJlc3Npb25TdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFN3aXRjaFN0bXQgbjIgPSAoU3dpdGNoU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0RW50cmllcygpLCBuMi5nZXRFbnRyaWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTZWxlY3RvcigpLCBuMi5nZXRTZWxlY3RvcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgU3dpdGNoRW50cnlTdG10IG4yID0gKFN3aXRjaEVudHJ5U3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFN0YXRlbWVudHMoKSwgbjIuZ2V0U3RhdGVtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQnJlYWtTdG10IG4yID0gKEJyZWFrU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFJldHVyblN0bXQgbjIgPSAoUmV0dXJuU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIElmU3RtdCBuMiA9IChJZlN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0RWxzZVN0bXQoKSwgbjIuZ2V0RWxzZVN0bXQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFRoZW5TdG10KCksIG4yLmdldFRoZW5TdG10KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBXaGlsZVN0bXQgbjIgPSAoV2hpbGVTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQ29udGludWVTdG10IG4yID0gKENvbnRpbnVlU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRG9TdG10IG4yID0gKERvU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldENvbmRpdGlvbigpLCBuMi5nZXRDb25kaXRpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgRm9yZWFjaFN0bXQgbjIgPSAoRm9yZWFjaFN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRJdGVyYWJsZSgpLCBuMi5nZXRJdGVyYWJsZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VmFyaWFibGUoKSwgbjIuZ2V0VmFyaWFibGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBGb3JTdG10IG4yID0gKEZvclN0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRDb21wYXJlKCksIG4yLmdldENvbXBhcmUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRJbml0aWFsaXphdGlvbigpLCBuMi5nZXRJbml0aWFsaXphdGlvbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFVwZGF0ZSgpLCBuMi5nZXRVcGRhdGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIFRocm93U3RtdCBuMiA9IChUaHJvd1N0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0RXhwcmVzc2lvbigpLCBuMi5nZXRFeHByZXNzaW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgU3luY2hyb25pemVkU3RtdCBuMiA9IChTeW5jaHJvbml6ZWRTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0RXhwcmVzc2lvbigpLCBuMi5nZXRFeHByZXNzaW9uKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVHJ5U3RtdCBuMiA9IChUcnlTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRDYXRjaENsYXVzZXMoKSwgbjIuZ2V0Q2F0Y2hDbGF1c2VzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRGaW5hbGx5QmxvY2soKSwgbjIuZ2V0RmluYWxseUJsb2NrKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0UmVzb3VyY2VzKCksIG4yLmdldFJlc291cmNlcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHJ5QmxvY2soKSwgbjIuZ2V0VHJ5QmxvY2soKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgQ2F0Y2hDbGF1c2UgbjIgPSAoQ2F0Y2hDbGF1c2UpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRQYXJhbWV0ZXIoKSwgbjIuZ2V0UGFyYW1ldGVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBMYW1iZGFFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTGFtYmRhRXhwciBuMiA9IChMYW1iZGFFeHByKSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5pc0VuY2xvc2luZ1BhcmFtZXRlcnMoKSwgbjIuaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0UGFyYW1ldGVycygpLCBuMi5nZXRQYXJhbWV0ZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2RSZWZlcmVuY2VFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuMiA9IChNZXRob2RSZWZlcmVuY2VFeHByKSBhcmc7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uZ2V0SWRlbnRpZmllcigpLCBuMi5nZXRJZGVudGlmaWVyKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBUeXBlRXhwciBuMiA9IChUeXBlRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gbjIgPSAoSW1wb3J0RGVjbGFyYXRpb24pIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5pc0FzdGVyaXNrKCksIG4yLmlzQXN0ZXJpc2soKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNTdGF0aWMoKSwgbjIuaXNTdGF0aWMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoTm9kZUxpc3QgbiwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbm9kZXNFcXVhbHMoKE5vZGVMaXN0PE5vZGU+KSBuLCAoTm9kZUxpc3Q8Tm9kZT4pIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuMiA9IChNb2R1bGVEZWNsYXJhdGlvbikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4uaXNPcGVuKCksIG4yLmlzT3BlbigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1vZHVsZVN0bXRzKCksIG4yLmdldE1vZHVsZVN0bXRzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1vZHVsZVJlcXVpcmVzU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE1vZHVsZVJlcXVpcmVzU3RtdCBuMiA9IChNb2R1bGVSZXF1aXJlc1N0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFvYmpFcXVhbHMobi5nZXRNb2RpZmllcnMoKSwgbjIuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlRXhwb3J0c1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVFeHBvcnRzU3RtdCBuMiA9IChNb2R1bGVFeHBvcnRzU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0TW9kdWxlTmFtZXMoKSwgbjIuZ2V0TW9kdWxlTmFtZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNb2R1bGVQcm92aWRlc1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVQcm92aWRlc1N0bXQgbjIgPSAoTW9kdWxlUHJvdmlkZXNTdG10KSBhcmc7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldFdpdGhUeXBlcygpLCBuMi5nZXRXaXRoVHlwZXMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlVXNlc1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBNb2R1bGVVc2VzU3RtdCBuMiA9IChNb2R1bGVVc2VzU3RtdCkgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1vZHVsZU9wZW5zU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIGZpbmFsIE1vZHVsZU9wZW5zU3RtdCBuMiA9IChNb2R1bGVPcGVuc1N0bXQpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuLmdldE1vZHVsZU5hbWVzKCksIG4yLmdldE1vZHVsZU5hbWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVucGFyc2FibGVTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUmVjZWl2ZXJQYXJhbWV0ZXIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICBmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuMiA9IChSZWNlaXZlclBhcmFtZXRlcikgYXJnOworICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4uZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4uZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBWYXJUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgZmluYWwgVmFyVHlwZSBuMiA9IChWYXJUeXBlKSBhcmc7CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobi5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL05vQ29tbWVudEhhc2hDb2RlVmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL05vQ29tbWVudEhhc2hDb2RlVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGU1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTm9Db21tZW50SGFzaENvZGVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworCitwdWJsaWMgY2xhc3MgTm9Db21tZW50SGFzaENvZGVWaXNpdG9yIGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8SW50ZWdlciwgVm9pZD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9Db21tZW50SGFzaENvZGVWaXNpdG9yIFNJTkdMRVRPTiA9IG5ldyBOb0NvbW1lbnRIYXNoQ29kZVZpc2l0b3IoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5hY2NlcHQoU0lOR0xFVE9OLCBudWxsKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TWVtYmVycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXREZWZhdWx0VmFsdWUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RGVmYXVsdFZhbHVlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRMZXZlbHMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uTGV2ZWwgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXREaW1lbnNpb24oKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RGltZW5zaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRWYWx1ZXMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBBcnJheVR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENvbXBvbmVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE9yaWdpbigpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNZXNzYWdlKCkuaXNQcmVzZW50KCkgPyBuLmdldE1lc3NhZ2UoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0T3BlcmF0b3IoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE9wZXJhdG9yKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRTdGF0ZW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRWYWx1ZSgpID8gMSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRMYWJlbCgpLmlzUHJlc2VudCgpID8gbi5nZXRMYWJlbCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRQYXJhbWV0ZXIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFZhbHVlKCkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4dGVuZGVkVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEltcGxlbWVudGVkVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzSW50ZXJmYWNlKCkgPyAxIDogMCkgKiAzMSArIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNZW1iZXJzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNb2RpZmllcnMoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkgPyBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0SW1wb3J0cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kdWxlKCkuaXNQcmVzZW50KCkgPyBuLmdldE1vZHVsZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmlzUHJlc2VudCgpID8gbi5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRUeXBlcygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRNb2RpZmllcnMoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0UGFyYW1ldGVycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRUaHJvd25FeGNlcHRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlUGFyYW1ldGVycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkgPyBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFZhbHVlKCkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0Q2xhc3NCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RW50cmllcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TWVtYmVycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBcmd1bWVudHMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEV4cHJlc3Npb24oKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmlzVGhpcygpID8gMSA6IDApICogMzEgKyAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkgPyBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkgPyBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRmllbGREZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldFZhcmlhYmxlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb21wYXJlKCkuaXNQcmVzZW50KCkgPyBuLmdldENvbXBhcmUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRJbml0aWFsaXphdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VXBkYXRlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRFbHNlU3RtdCgpLmlzUHJlc2VudCgpID8gbi5nZXRFbHNlU3RtdCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmlzQXN0ZXJpc2soKSA/IDEgOiAwKSAqIDMxICsgKG4uaXNTdGF0aWMoKSA/IDEgOiAwKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzU3RhdGljKCkgPyAxIDogMCkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFZhbHVlKCkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRFbGVtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0U3RhdGVtZW50KCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTGFtYmRhRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKCkgPyAxIDogMCkgKiAzMSArIChuLmdldFBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENsYXNzRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldFZhbHVlKCkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QXJndW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpID8gbi5nZXRTY29wZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmlzUHJlc2VudCgpID8gbi5nZXRCb2R5KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuaXNQcmVzZW50KCkgPyBuLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0SWRlbnRpZmllcigpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpID8gbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTmFtZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldElkZW50aWZpZXIoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0UXVhbGlmaWVyKCkuaXNQcmVzZW50KCkgPyBuLmdldFF1YWxpZmllcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoT2JqZWN0IG5vZGUgOiBuKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gMzEgKiAoKFZpc2l0YWJsZSkgbm9kZSkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRQYWlycygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuaXNQcmVzZW50KCkgPyBuLmdldEFub255bW91c0NsYXNzQm9keSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldEFyZ3VtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkgPyBuLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzVmFyQXJncygpID8gMSA6IDApICogMzEgKyAobi5nZXRNb2RpZmllcnMoKS5oYXNoQ29kZSgpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VmFyQXJnc0Fubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUHJpbWl0aXZlVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VHlwZSgpLmhhc2hDb2RlKCkpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4cHJlc3Npb24oKS5pc1ByZXNlbnQoKSA/IG4uZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRJZGVudGlmaWVyKCkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VmFsdWUoKS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkgPyBuLmdldENsYXNzRXhwcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkgPyBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0U3RhdGVtZW50cygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEVudHJpZXMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldENhdGNoQ2xhdXNlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0RmluYWxseUJsb2NrKCkuaXNQcmVzZW50KCkgPyBuLmdldEZpbmFsbHlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpIDogMCkgKiAzMSArIChuLmdldFJlc291cmNlcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBUeXBlRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldFR5cGVCb3VuZCgpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmdldE9wZXJhdG9yKCkuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEVsZW1lbnRzKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRBbm5vdGF0aW9ucygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldFZhcmlhYmxlcygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEV4dGVuZGVkVHlwZSgpLmlzUHJlc2VudCgpID8gbi5nZXRFeHRlbmRlZFR5cGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKSA6IDApICogMzEgKyAobi5nZXRTdXBlclR5cGUoKS5pc1ByZXNlbnQoKSA/IG4uZ2V0U3VwZXJUeXBlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykgOiAwKSAqIDMxICsgKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuTm9Db21tZW50SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0QW5ub3RhdGlvbnMoKS5hY2NlcHQodGhpcywgYXJnKSkgKiAzMSArIChuLmlzT3BlbigpID8gMSA6IDApICogMzEgKyAobi5nZXRNb2R1bGVTdG10cygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZVJlcXVpcmVzU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gKG4uZ2V0TW9kaWZpZXJzKCkuaGFzaENvZGUoKSkgKiAzMSArIChuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZUV4cG9ydHNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRNb2R1bGVOYW1lcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTW9kdWxlUHJvdmlkZXNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRXaXRoVHlwZXMoKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZVVzZXNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTW9kdWxlT3BlbnNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAobi5nZXRNb2R1bGVOYW1lcygpLmFjY2VwdCh0aGlzLCBhcmcpKSAqIDMxICsgKG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFVucGFyc2FibGVTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk5vQ29tbWVudEhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUmVjZWl2ZXJQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpICogMzEgKyAobi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIChuLmdldEFubm90YXRpb25zKCkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY0MmJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL09iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKKworLyoqCisgKiBBIHZpc2l0b3IgdGhhdCBjYWxjdWxhdGVzIGRlZXAgbm9kZSBlcXVhbGl0eSBieSBjb21wYXJpbmcgYWxsIHByb3BlcnRpZXMgYW5kIGNoaWxkIG5vZGVzIG9mIHRoZSBub2RlLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yIGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8Qm9vbGVhbiwgVmlzaXRhYmxlPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IgU0lOR0xFVE9OID0gbmV3IE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvcigpOworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhmaW5hbCBOb2RlIG4sIGZpbmFsIE5vZGUgbjIpIHsKKyAgICAgICAgcmV0dXJuIG4uYWNjZXB0KFNJTkdMRVRPTiwgbjIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEluc3RhbmNlT2ZFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBOYW1lIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU2ltcGxlTmFtZSBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3VwZXJFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFdoaWxlU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRm9yU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBMYW1iZGFFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFR5cGVFeHByIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoTm9kZUxpc3QgbiwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1vZHVsZVJlcXVpcmVzU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlRXhwb3J0c1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlKCkKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTW9kdWxlVXNlc1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNb2R1bGVPcGVuc1N0bXQgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBVbnBhcnNhYmxlU3RtdCBuLCBmaW5hbCBWaXNpdGFibGUgYXJnKSB7CisgICAgICAgIHJldHVybiBuID09IGFyZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFJlY2VpdmVyUGFyYW1ldGVyIG4sIGZpbmFsIFZpc2l0YWJsZSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4gPT0gYXJnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgVmlzaXRhYmxlIGFyZykgeworICAgICAgICByZXR1cm4gbiA9PSBhcmc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL09iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNjZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL09iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworCisvKioKKyAqIEEgdmlzaXRvciB0aGF0IGNhbGN1bGF0ZXMgYSBkZWVwIGhhc2ggY29kZSBmb3IgYSBub2RlIGJ5IHVzaW5nIHRoZSBoYXNoIGNvZGVzIG9mIGFsbCBpdHMgcHJvcGVydGllcywKKyAqIGFuZCB0aGUgaGFzaCBjb2RlcyBvZiBhbGwgaXRzIGNoaWxkIG5vZGVzIChieSB2aXNpdGluZyB0aG9zZSB0b28uKQorICovCitwdWJsaWMgY2xhc3MgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IgaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxJbnRlZ2VyLCBWb2lkPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvciBTSU5HTEVUT04gPSBuZXcgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5hY2NlcHQoU0lOR0xFVE9OLCBudWxsKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEFzc2lnbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSWZTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTGFtYmRhRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTWV0aG9kQ2FsbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBOYW1lIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTaW1wbGVOYW1lIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFR5cGVFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5PYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvckdlbmVyYXRvciIpCisgICAgcHVibGljIEludGVnZXIgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNb2R1bGVSZXF1aXJlc1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUoKQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBNb2R1bGVFeHBvcnRzU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZSgpCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZVVzZXNTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHJldHVybiBuLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIE1vZHVsZU9wZW5zU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBVbnBhcnNhYmxlU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgSW50ZWdlciB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICByZXR1cm4gbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlZ2VyIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG4uaGFzaENvZGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVHJlZVZpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9UcmVlVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNGFlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVHJlZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgbm9kZXMgaW4gKGEgcGFydCBvZikgdGhlIEFTVC4gSW4gY29udHJhc3QgdG8gdGhlIHZpc2l0IG1ldGhvZHMgaW4gTm9kZSwgdGhlc2UgbWV0aG9kcyBhcmUKKyAqIGltcGxlbWVudGVkIGluIGEgc2ltcGxlIHJlY3Vyc2l2ZSB3YXkgd2hpY2ggc2hvdWxkIGJlIG1vcmUgZWZmaWNpZW50LiBBIGRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZXkgY2Fubm90IGJlIHF1aXQgaW4KKyAqIHRoZSBtaWRkbGUgb2YgdGhlaXIgdHJhdmVyc2FsLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJlZVZpc2l0b3IgeworCisgICAgcHVibGljIHZvaWQgdmlzaXRMZWF2ZXNGaXJzdChOb2RlIG5vZGUpIHsKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogbm9kZS5nZXRDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgIHZpc2l0TGVhdmVzRmlyc3QoY2hpbGQpOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3Mobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBwcmUtb3JkZXIgbm9kZSB0cmF2ZXJzYWwgc3RhcnRpbmcgd2l0aCBhIGdpdmVuIG5vZGUuIFdoZW4gZWFjaCBub2RlIGlzIHZpc2l0ZWQsIHtAbGluayAjcHJvY2VzcyhOb2RlKX0KKyAgICAgKiBpcyBjYWxsZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIGF0IHdoaWNoIHRoZSB0cmF2ZXJzYWwgYmVnaW5zLgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJlLW9yZGVyIj5QcmUtb3JkZXIgdHJhdmVyc2FsPC9hPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0UHJlT3JkZXIoTm9kZSBub2RlKSB7CisgICAgICAgIHByb2Nlc3Mobm9kZSk7CisgICAgICAgIG5ldyBBcnJheUxpc3Q8Pihub2RlLmdldENoaWxkTm9kZXMoKSkuZm9yRWFjaCh0aGlzOjp2aXNpdFByZU9yZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHBvc3Qtb3JkZXIgbm9kZSB0cmF2ZXJzYWwgc3RhcnRpbmcgd2l0aCBhIGdpdmVuIG5vZGUuIFdoZW4gZWFjaCBub2RlIGlzIHZpc2l0ZWQsIHtAbGluaworICAgICAqICNwcm9jZXNzKE5vZGUpfSBpcyBjYWxsZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIGF0IHdoaWNoIHRoZSB0cmF2ZXJzYWwgYmVnaW5zLgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9zdC1vcmRlciI+UG9zdC1vcmRlciB0cmF2ZXJzYWw8L2E+CisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRQb3N0T3JkZXIoTm9kZSBub2RlKSB7CisgICAgICAgIG5ldyBBcnJheUxpc3Q8Pihub2RlLmdldENoaWxkTm9kZXMoKSkuZm9yRWFjaCh0aGlzOjp2aXNpdFBvc3RPcmRlcik7CisgICAgICAgIHByb2Nlc3Mobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBwcmUtb3JkZXIgbm9kZSB0cmF2ZXJzYWwgc3RhcnRpbmcgd2l0aCBhIGdpdmVuIG5vZGUuIFdoZW4gZWFjaCBub2RlIGlzIHZpc2l0ZWQsIHtAbGluayAjcHJvY2VzcyhOb2RlKX0KKyAgICAgKiBpcyBjYWxsZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIGF0IHdoaWNoIHRoZSB0cmF2ZXJzYWwgYmVnaW5zLgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJlLW9yZGVyIj5QcmUtb3JkZXIgdHJhdmVyc2FsPC9hPgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMy4xLjAsIHJlcGxhY2VkIGJ5IHtAbGluayAjdmlzaXRQcmVPcmRlcihOb2RlKX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVwdGhGaXJzdChOb2RlIG5vZGUpIHsKKyAgICAgICAgdmlzaXRQcmVPcmRlcihub2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaAorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgdGhlIHN0YXJ0IG5vZGUsIGFuZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgcGFzc2VkIHRvIHByb2Nlc3Mobm9kZSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRCcmVhZHRoRmlyc3QoTm9kZSBub2RlKSB7CisgICAgICAgIGZpbmFsIFF1ZXVlPE5vZGU+IHF1ZXVlID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBxdWV1ZS5vZmZlcihub2RlKTsKKyAgICAgICAgd2hpbGUgKHF1ZXVlLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGUgaGVhZCA9IHF1ZXVlLnBlZWsoKTsKKyAgICAgICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IGhlYWQuZ2V0Q2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICAgICAgcXVldWUub2ZmZXIoY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvY2VzcyhxdWV1ZS5wb2xsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZ2l2ZW4gbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBjdXJyZW50IG5vZGUgdG8gcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzKE5vZGUgbm9kZSk7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHNpbXBsZSB0cmF2ZXJzYWwgb3ZlciBhbGwgbm9kZXMgdGhhdCBoYXZlIHRoZSBwYXNzZWQgbm9kZSBhcyB0aGVpciBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXREaXJlY3RDaGlsZHJlbihOb2RlIG5vZGUpIHsKKyAgICAgICAgbmV3IEFycmF5TGlzdDw+KG5vZGUuZ2V0Q2hpbGROb2RlcygpKS5mb3JFYWNoKHRoaXM6OnByb2Nlc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9WaXNpdGFibGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9WaXNpdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmMwMWExCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1Zpc2l0YWJsZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworcHVibGljIGludGVyZmFjZSBWaXNpdGFibGUgeworICAgIC8qKgorICAgICAqIEFjY2VwdCBtZXRob2QgZm9yIHZpc2l0b3Igc3VwcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8Uj4gdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgdmlzaXRvcgorICAgICAqIEBwYXJhbSA8QT4gdGhlIHR5cGUgdGhlIHVzZXIgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSB2aXNpdG9yCisgICAgICogQHBhcmFtIHYgdGhlIHZpc2l0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcGFyYW0gYXJnIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIHZpc2l0b3IgKG9mIHR5cGUgQSkKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIHZpc2l0IChvZiB0eXBlIFIpCisgICAgICovCisgICAgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKTsKKworICAgIC8qKgorICAgICAqIEFjY2VwdCBtZXRob2QgZm9yIHZpc2l0b3Igc3VwcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8QT4gdGhlIHR5cGUgdGhlIGFyZ3VtZW50IHBhc3NlZCBmb3IgdGhlIHZpc2l0b3IKKyAgICAgKiBAcGFyYW0gdiB0aGUgdmlzaXRvciBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBhcmcgYW55IHZhbHVlIHJlbGV2YW50IGZvciB0aGUgdmlzaXRvciAob2YgdHlwZSBBKQorICAgICAqLworICAgIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzljMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIFZvaWRWaXNpdG9yPEE+IHsKKworICAgIHZvaWQgdmlzaXQoTm9kZUxpc3QgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChBcnJheUFjY2Vzc0V4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQXJyYXlDcmVhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQXJyYXlDcmVhdGlvbkxldmVsIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEFycmF5VHlwZSBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChBc3NlcnRTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEFzc2lnbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQmluYXJ5RXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChCbG9ja0NvbW1lbnQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQmxvY2tTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEJvb2xlYW5MaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChCcmVha1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQ2FzdEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQ2F0Y2hDbGF1c2UgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQ2hhckxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KENsYXNzRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoQ29tcGlsYXRpb25Vbml0IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KENvbmRpdGlvbmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KENvbnRpbnVlU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChEb1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoRG91YmxlTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoRW1wdHlTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEVuY2xvc2VkRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChFbnVtRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEV4cHJlc3Npb25TdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEZpZWxkQWNjZXNzRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChGaWVsZERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEZvclN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoRm9yZWFjaFN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoSWZTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoSW5zdGFuY2VPZkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoSW50ZWdlckxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KEludGVyc2VjdGlvblR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoSmF2YWRvY0NvbW1lbnQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTGFiZWxlZFN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChMaW5lQ29tbWVudCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KExvbmdMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTWV0aG9kQ2FsbEV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChOYW1lRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChOYW1lIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KE5vcm1hbEFubm90YXRpb25FeHByIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KE51bGxMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChPYmplY3RDcmVhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KFBhcmFtZXRlciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChQcmltaXRpdmVUeXBlIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KFJldHVyblN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoU2ltcGxlTmFtZSBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChTdHJpbmdMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChTdXBlckV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoU3dpdGNoRW50cnlTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KFN3aXRjaFN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoU3luY2hyb25pemVkU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChUaGlzRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChUaHJvd1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoVHJ5U3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChUeXBlRXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChUeXBlUGFyYW1ldGVyIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KFVuYXJ5RXhwciBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChVbmlvblR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoVW5rbm93blR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9yIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KFZvaWRUeXBlIG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KFdoaWxlU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChXaWxkY2FyZFR5cGUgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTW9kdWxlRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoTW9kdWxlUmVxdWlyZXNTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KE1vZHVsZUV4cG9ydHNTdG10IG4sIEEgYXJnKTsKKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yR2VuZXJhdG9yIikKKyAgICB2b2lkIHZpc2l0KE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChNb2R1bGVVc2VzU3RtdCBuLCBBIGFyZyk7CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckdlbmVyYXRvciIpCisgICAgdm9pZCB2aXNpdChNb2R1bGVPcGVuc1N0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoVW5wYXJzYWJsZVN0bXQgbiwgQSBhcmcpOworCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JHZW5lcmF0b3IiKQorICAgIHZvaWQgdmlzaXQoUmVjZWl2ZXJQYXJhbWV0ZXIgbiwgQSBhcmcpOworCisgICAgdm9pZCB2aXNpdChWYXJUeXBlIG4sIEEgYXJnKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvckFkYXB0ZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU4MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNzczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKKworLyoqCisgKiBBIHZpc2l0b3IgdGhhdCByZXR1cm5zIG5vdGhpbmcsIGFuZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhbGwgaXRzIHZpc2l0CisgKiBtZXRob2RzIHRoYXQgc2ltcGx5IHZpc2l0IHRoZWlyIGNoaWxkcmVuIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVm9pZFZpc2l0b3JBZGFwdGVyPEE+IGltcGxlbWVudHMgVm9pZFZpc2l0b3I8QT4geworCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRNZW1iZXJzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXREZWZhdWx0VmFsdWUoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRJbml0aWFsaXplcigpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldExldmVscygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldFZhbHVlcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRNZXNzYWdlKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldFN0YXRlbWVudHMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0TGFiZWwoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0UGFyYW1ldGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEV4dGVuZGVkVHlwZXMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRUeXBlUGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRNZW1iZXJzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRTY29wZSgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFR5cGVBcmd1bWVudHMoKS5pZlByZXNlbnQobCAtPiBsLmZvckVhY2godiAtPiB2LmFjY2VwdCh0aGlzLCBhcmcpKSk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0SW1wb3J0cygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRNb2R1bGUoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRUeXBlcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0TGFiZWwoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0QXJndW1lbnRzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENsYXNzQm9keSgpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0RW50cmllcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE1lbWJlcnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFyZ3VtZW50cygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0VHlwZUFyZ3VtZW50cygpLmlmUHJlc2VudChsIC0+IGwuZm9yRWFjaCh2IC0+IHYuYWNjZXB0KHRoaXMsIGFyZykpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlQXJndW1lbnRzKCkuaWZQcmVzZW50KGwgLT4gbC5mb3JFYWNoKHYgLT4gdi5hY2NlcHQodGhpcywgYXJnKSkpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRWYXJpYWJsZXMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tcGFyZSgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldEluaXRpYWxpemF0aW9uKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFVwZGF0ZSgpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRFbHNlU3RtdCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0U3RhdGVtZW50KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFyZ3VtZW50cygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0U2NvcGUoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRUeXBlQXJndW1lbnRzKCkuaWZQcmVzZW50KGwgLT4gbC5mb3JFYWNoKHYgLT4gdi5hY2NlcHQodGhpcywgYXJnKSkpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Qm9keSgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRQYWlycygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuaWZQcmVzZW50KGwgLT4gbC5mb3JFYWNoKHYgLT4gdi5hY2NlcHQodGhpcywgYXJnKSkpOworICAgICAgICBuLmdldEFyZ3VtZW50cygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRTY29wZSgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlQXJndW1lbnRzKCkuaWZQcmVzZW50KGwgLT4gbC5mb3JFYWNoKHYgLT4gdi5hY2NlcHQodGhpcywgYXJnKSkpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldFZhckFyZ3NBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTmFtZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFF1YWxpZmllcigpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFNpbXBsZU5hbWUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21wb25lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0RGltZW5zaW9uKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEVsZW1lbnRzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEVsZW1lbnRzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldENsYXNzRXhwcigpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldExhYmVsKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0U3RhdGVtZW50cygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0RW50cmllcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRTZWxlY3RvcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0Q2xhc3NFeHByKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhyb3dTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDYXRjaENsYXVzZXMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0RmluYWxseUJsb2NrKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0UmVzb3VyY2VzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldENsYXNzRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldFR5cGVCb3VuZCgpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldFZhcmlhYmxlcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRJbml0aWFsaXplcigpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0RXh0ZW5kZWRUeXBlKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0U3VwZXJUeXBlKCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0QW5ub3RhdGlvbnMoKS5mb3JFYWNoKHAgLT4gcC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGFtYmRhRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldENvbW1lbnQoKS5pZlByZXNlbnQobCAtPiBsLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXJHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldFR5cGVBcmd1bWVudHMoKS5pZlByZXNlbnQobCAtPiBsLmZvckVhY2godiAtPiB2LmFjY2VwdCh0aGlzLCBhcmcpKSk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGVMaXN0IG4sIEEgYXJnKSB7CisgICAgICAgIGZvciAoT2JqZWN0IG5vZGUgOiBuKSB7CisgICAgICAgICAgICAoKE5vZGUpIG5vZGUpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE1vZHVsZVN0bXRzKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNb2R1bGVSZXF1aXJlc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTW9kdWxlRXhwb3J0c1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRNb2R1bGVOYW1lcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTW9kdWxlUHJvdmlkZXNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBuLmdldFdpdGhUeXBlcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNb2R1bGVVc2VzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNb2R1bGVPcGVuc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRNb2R1bGVOYW1lcygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlckdlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5wYXJzYWJsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBuLmdldEFubm90YXRpb25zKCkuZm9yRWFjaChwIC0+IHAuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIG4uZ2V0Q29tbWVudCgpLmlmUHJlc2VudChsIC0+IGwuYWNjZXB0KHRoaXMsIGFyZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgbi5nZXRBbm5vdGF0aW9ucygpLmZvckVhY2gocCAtPiBwLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgbi5nZXRDb21tZW50KCkuaWZQcmVzZW50KGwgLT4gbC5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yV2l0aERlZmF1bHRzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjIyNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yV2l0aERlZmF1bHRzLmphdmEKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworCisvKioKKyAqIEEgdmlzaXRvciB0aGF0IHJldHVybnMgbm90aGluZywgYW5kIGhhcyBkZWZhdWx0IG1ldGhvZHMgdGhhdCBhcmUgdXNlZCB3aGVuIGEgc3BlY2lmaWMgdmlzaXQgbWV0aG9kIGlzIG5vdAorICogb3ZlcnJpZGRlbi4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFZvaWRWaXNpdG9yV2l0aERlZmF1bHRzPEE+IGltcGxlbWVudHMgVm9pZFZpc2l0b3I8QT4geworCisgICAgLyoqCisgICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBldmVyeSBub2RlIHZpc2l0IG1ldGhvZCB0aGF0IGlzIG5vdCBvdmVycmlkZGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRBY3Rpb24oTm9kZSBuLCBBIGFyZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIE5vZGVMaXN0IHZpc2l0IG1ldGhvZCB3aGVuIGl0IGlzIG5vdCBvdmVycmlkZGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRBY3Rpb24oTm9kZUxpc3QgbiwgQSBhcmcpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSWZTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluc3RhbmNlT2ZFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOYW1lIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2ltcGxlTmFtZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMYW1iZGFFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFR5cGVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlTGlzdCBuLCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTW9kdWxlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNb2R1bGVSZXF1aXJlc1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNb2R1bGVFeHBvcnRzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdCBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEdlbmVyYXRlZCgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5jb3JlLnZpc2l0b3IuVm9pZFZpc2l0b3JXaXRoRGVmYXVsdHNHZW5lcmF0b3IiKQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1vZHVsZVVzZXNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTW9kdWxlT3BlbnNTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGRlZmF1bHRBY3Rpb24obiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAR2VuZXJhdGVkKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLmNvcmUudmlzaXRvci5Wb2lkVmlzaXRvcldpdGhEZWZhdWx0c0dlbmVyYXRvciIpCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5wYXJzYWJsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgZGVmYXVsdEFjdGlvbihuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBHZW5lcmF0ZWQoImNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IuY29yZS52aXNpdG9yLlZvaWRWaXNpdG9yV2l0aERlZmF1bHRzR2VuZXJhdG9yIikKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZWNlaXZlclBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBkZWZhdWx0QWN0aW9uKG4sIGFyZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvSmF2YWRvYy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvSmF2YWRvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjA2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9KYXZhZG9jLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYy5kZXNjcmlwdGlvbi5KYXZhZG9jRGVzY3JpcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuKjsKKworLyoqCisgKiBUaGUgc3RydWN0dXJlZCBjb250ZW50IG9mIGEgc2luZ2xlIEphdmFkb2MgY29tbWVudC4KKyAqIDxwPgorICogSXQgaXMgY29tcG9zZWQgYnkgYSBkZXNjcmlwdGlvbiBhbmQgYSBsaXN0IG9mIGJsb2NrIHRhZ3MuCisgKiA8cD4KKyAqIEFuIGV4YW1wbGUgd291bGQgYmUgdGhlIHRleHQgY29udGFpbmVkIGluIHRoaXMgdmVyeSBKYXZhZG9jIGNvbW1lbnQuIEF0IHRoZSBtb21lbnQKKyAqIG9mIHRoaXMgd3JpdGluZyB0aGlzIGNvbW1lbnQgZG9lcyBub3QgY29udGFpbiBhbnkgYmxvY2sgdGFncyAoc3VjaCBhcyA8Y29kZT5Ac2VlIEFub3RoZXJDbGFzczwvY29kZT4pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhZG9jIHsKKworICAgIHByaXZhdGUgSmF2YWRvY0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIHByaXZhdGUgTGlzdDxKYXZhZG9jQmxvY2tUYWc+IGJsb2NrVGFnczsKKworICAgIHB1YmxpYyBKYXZhZG9jKEphdmFkb2NEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgIHRoaXMuYmxvY2tUYWdzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhZG9jIGFkZEJsb2NrVGFnKEphdmFkb2NCbG9ja1RhZyBibG9ja1RhZykgeworICAgICAgICB0aGlzLmJsb2NrVGFncy5hZGQoYmxvY2tUYWcpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgdGFncyBsaWtlICJAcmV0dXJuIGdvb2QgdGhpbmdzIiB3aGVyZQorICAgICAqIHRhZ05hbWUgaXMgInJldHVybiIsCisgICAgICogYW5kIHRoZSByZXN0IGlzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIEphdmFkb2MgYWRkQmxvY2tUYWcoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHJldHVybiBhZGRCbG9ja1RhZyhuZXcgSmF2YWRvY0Jsb2NrVGFnKHRhZ05hbWUsIGNvbnRlbnQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgdGFncyBsaWtlICJAcGFyYW0gYWJjIHRoaXMgaXMgYSBwYXJhbWV0ZXIiIHdoZXJlCisgICAgICogdGFnTmFtZSBpcyAicGFyYW0iLAorICAgICAqIHBhcmFtZXRlciBpcyAiYWJjIgorICAgICAqIGFuZCB0aGUgcmVzdCBpcyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBKYXZhZG9jIGFkZEJsb2NrVGFnKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgcGFyYW1ldGVyLCBTdHJpbmcgY29udGVudCkgeworICAgICAgICByZXR1cm4gYWRkQmxvY2tUYWcodGFnTmFtZSwgcGFyYW1ldGVyICsgIiAiICsgY29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIEphdmFkb2MgYWRkQmxvY2tUYWcoU3RyaW5nIHRhZ05hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEJsb2NrVGFnKHRhZ05hbWUsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRleHQgY29udGVudCBvZiB0aGUgZG9jdW1lbnQuIEl0IGRvZXMgbm90IGNvbnRhaW5pbmcgdHJhaWxpbmcgc3BhY2VzIGFuZCBhc3Rlcmlza3MKKyAgICAgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1RleHQoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoIWRlc2NyaXB0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uLnRvVGV4dCgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChFT0wpOworICAgICAgICB9CisgICAgICAgIGlmICghYmxvY2tUYWdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKEVPTCk7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tUYWdzLmZvckVhY2goYnQgLT4geworICAgICAgICAgICAgc2IuYXBwZW5kKGJ0LnRvVGV4dCgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChFT0wpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgSmF2YWRvY0NvbW1lbnQsIGJ5IGZvcm1hdHRpbmcgdGhlIHRleHQgb2YgdGhlIEphdmFkb2MgdXNpbmcgbm8gaW5kZW50YXRpb24gKGV4cGVjdGluZyB0aGUgcHJldHR5IHByaW50ZXIgdG8gZG8gdGhlIGZvcm1hdHRpbmcuKQorICAgICAqLworICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCB0b0NvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiB0b0NvbW1lbnQoIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEphdmFkb2NDb21tZW50LCBieSBmb3JtYXR0aW5nIHRoZSB0ZXh0IG9mIHRoZSBKYXZhZG9jIHVzaW5nIHRoZSBnaXZlbiBpbmRlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgdG9Db21tZW50KFN0cmluZyBpbmRlbnRhdGlvbikgeworICAgICAgICBmb3IgKGNoYXIgYyA6IGluZGVudGF0aW9uLnRvQ2hhckFycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgc2hvdWxkIGJlIGNvbXBvc2VkIG9ubHkgYnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZChFT0wpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IHRvVGV4dCgpOworICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogdGV4dC5zcGxpdChFT0wpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAqICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRU9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoaW5kZW50YXRpb24pOworICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhZG9jQ29tbWVudChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWRvY0Rlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBMaXN0IG9mIGFzc29jaWF0ZWQgSmF2YWRvY0Jsb2NrVGFncworICAgICAqLworICAgIHB1YmxpYyBMaXN0PEphdmFkb2NCbG9ja1RhZz4gZ2V0QmxvY2tUYWdzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ibG9ja1RhZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSmF2YWRvYyBkb2N1bWVudCA9IChKYXZhZG9jKSBvOworCisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi5lcXVhbHMoZG9jdW1lbnQuZGVzY3JpcHRpb24pICYmIGJsb2NrVGFncy5lcXVhbHMoZG9jdW1lbnQuYmxvY2tUYWdzKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBkZXNjcmlwdGlvbi5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGJsb2NrVGFncy5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YWRvY3siICsKKyAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uICsKKyAgICAgICAgICAgICAgICAiLCBibG9ja1RhZ3M9IiArIGJsb2NrVGFncyArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvSmF2YWRvY0Jsb2NrVGFnLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9KYXZhZG9jQmxvY2tUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM5OTMxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvSmF2YWRvY0Jsb2NrVGFnLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb24uSmF2YWRvY0Rlc2NyaXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5uZXh0V29yZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLnNjcmVhbWluZ1RvQ2FtZWxDYXNlOworCisvKioKKyAqIEEgYmxvY2sgdGFnLgorICogPHA+CisgKiBUeXBpY2FsbHkgdGhleSBhcmUgZm91bmQgYXQgdGhlIGVuZCBvZiBKYXZhZG9jIGNvbW1lbnRzLgorICogPHA+CisgKiBFeGFtcGxlczoKKyAqIDxjb2RlPkBzZWUgQW5vdGhlckNsYXNzPC9jb2RlPgorICogPGNvZGU+QHNpbmNlIHYwLjAuMTwvY29kZT4KKyAqIDxjb2RlPkBhdXRob3IgSmltIE8nSmF2YTwvY29kZT4KKyAqLworcHVibGljIGNsYXNzIEphdmFkb2NCbG9ja1RhZyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0YWc6IGl0IGNvdWxkIGVpdGhlciBjb3JyZXNwb25kIHRvIGEga25vd24gdGFnIChwYXJhbSwgcmV0dXJuLCBldGMuKSBvciByZXByZXNlbnQKKyAgICAgKiBhbiB1bmtub3duIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBUeXBlIHsKKyAgICAgICAgQVVUSE9SLAorICAgICAgICBERVBSRUNBVEVELAorICAgICAgICBFWENFUFRJT04sCisgICAgICAgIFBBUkFNLAorICAgICAgICBSRVRVUk4sCisgICAgICAgIFNFRSwKKyAgICAgICAgU0VSSUFMLAorICAgICAgICBTRVJJQUxfREFUQSwKKyAgICAgICAgU0VSSUFMX0ZJRUxELAorICAgICAgICBTSU5DRSwKKyAgICAgICAgVEhST1dTLAorICAgICAgICBWRVJTSU9OLAorICAgICAgICBVTktOT1dOOworCisgICAgICAgIFR5cGUoKSB7CisgICAgICAgICAgICB0aGlzLmtleXdvcmQgPSBzY3JlYW1pbmdUb0NhbWVsQ2FzZShuYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5d29yZDsKKworICAgICAgICBib29sZWFuIGhhc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBQQVJBTTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBUeXBlIGZyb21OYW1lKFN0cmluZyB0YWdOYW1lKSB7CisgICAgICAgICAgICBmb3IgKFR5cGUgdCA6IFR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodC5rZXl3b3JkLmVxdWFscyh0YWdOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBKYXZhZG9jRGVzY3JpcHRpb24gY29udGVudDsKKyAgICBwcml2YXRlIE9wdGlvbmFsPFN0cmluZz4gbmFtZSA9IE9wdGlvbmFsLmVtcHR5KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKKworICAgIHB1YmxpYyBKYXZhZG9jQmxvY2tUYWcoVHlwZSB0eXBlLCBTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLnRhZ05hbWUgPSB0eXBlLmtleXdvcmQ7CisgICAgICAgIGlmICh0eXBlLmhhc05hbWUoKSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gT3B0aW9uYWwub2YobmV4dFdvcmQoY29udGVudCkpOworICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKHRoaXMubmFtZS5nZXQoKS5sZW5ndGgoKSkudHJpbSgpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29udGVudCA9IEphdmFkb2NEZXNjcmlwdGlvbi5wYXJzZVRleHQoY29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIEphdmFkb2NCbG9ja1RhZyhTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcyhUeXBlLmZyb21OYW1lKHRhZ05hbWUpLCBjb250ZW50KTsKKyAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEphdmFkb2NCbG9ja1RhZyBjcmVhdGVQYXJhbUJsb2NrVGFnKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgSmF2YWRvY0Jsb2NrVGFnKFR5cGUuUEFSQU0sIHBhcmFtTmFtZSArICIgIiArIGNvbnRlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhZG9jRGVzY3JpcHRpb24gZ2V0Q29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CisgICAgfQorCisgICAgcHVibGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgeworICAgICAgICByZXR1cm4gdGFnTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvVGV4dCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiQCIpOworICAgICAgICBzYi5hcHBlbmQodGFnTmFtZSk7CisgICAgICAgIG5hbWUuaWZQcmVzZW50KHMgLT4gc2IuYXBwZW5kKCIgIikuYXBwZW5kKHMpKTsKKyAgICAgICAgaWYgKCFjb250ZW50LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoY29udGVudC50b1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSmF2YWRvY0Jsb2NrVGFnIHRoYXQgPSAoSmF2YWRvY0Jsb2NrVGFnKSBvOworCisgICAgICAgIGlmICh0eXBlICE9IHRoYXQudHlwZSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWNvbnRlbnQuZXF1YWxzKHRoYXQuY29udGVudCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG5hbWUuZXF1YWxzKHRoYXQubmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHR5cGUuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBjb250ZW50Lmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbmFtZS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YWRvY0Jsb2NrVGFneyIgKworICAgICAgICAgICAgICAgICJ0eXBlPSIgKyB0eXBlICsKKyAgICAgICAgICAgICAgICAiLCBjb250ZW50PSciICsgY29udGVudCArICdcJycgKworICAgICAgICAgICAgICAgICIsIG5hbWU9IiArIG5hbWUgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9kZXNjcmlwdGlvbi9KYXZhZG9jRGVzY3JpcHRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL2Rlc2NyaXB0aW9uL0phdmFkb2NEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjgxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9kZXNjcmlwdGlvbi9KYXZhZG9jRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUGFpcjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgamF2YWRvYyB0ZXh0LCBwb3RlbnRpYWxseSBjb250YWluaW5nIGlubGluZSB0YWdzLgorICoKKyAqIEZvciBleGFtcGxlIDxjb2RlPlRoaXMgY2xhc3MgaXMgdG90YWxseSB1bnJlbGF0ZWQgdG8ge0BsaW5rIGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZX08L2NvZGU+CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhZG9jRGVzY3JpcHRpb24geworCisgICAgcHJpdmF0ZSBMaXN0PEphdmFkb2NEZXNjcmlwdGlvbkVsZW1lbnQ+IGVsZW1lbnRzOworCisgICAgcHVibGljIHN0YXRpYyBKYXZhZG9jRGVzY3JpcHRpb24gcGFyc2VUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIEphdmFkb2NEZXNjcmlwdGlvbiBpbnN0YW5jZSA9IG5ldyBKYXZhZG9jRGVzY3JpcHRpb24oKTsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBuZXh0SW5saW5lVGFnUG9zOworICAgICAgICB3aGlsZSAoKG5leHRJbmxpbmVUYWdQb3MgPSBpbmRleE9mTmV4dElubGluZVRhZyh0ZXh0LCBpbmRleCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChuZXh0SW5saW5lVGFnUG9zLmEgIT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZS5hZGRFbGVtZW50KG5ldyBKYXZhZG9jU25pcHBldCh0ZXh0LnN1YnN0cmluZyhpbmRleCwgbmV4dElubGluZVRhZ1Bvcy5hICsgMSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc3RhbmNlLmFkZEVsZW1lbnQoSmF2YWRvY0lubGluZVRhZy5mcm9tVGV4dCh0ZXh0LnN1YnN0cmluZyhuZXh0SW5saW5lVGFnUG9zLmEsIG5leHRJbmxpbmVUYWdQb3MuYiArIDEpKSk7CisgICAgICAgICAgICBpbmRleCA9IG5leHRJbmxpbmVUYWdQb3MuYjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPCB0ZXh0Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICBpbnN0YW5jZS5hZGRFbGVtZW50KG5ldyBKYXZhZG9jU25pcHBldCh0ZXh0LnN1YnN0cmluZyhpbmRleCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBpbmRleE9mTmV4dElubGluZVRhZyhTdHJpbmcgdGV4dCwgaW50IHN0YXJ0KSB7CisgICAgICAgIGludCBpbmRleCA9IHRleHQuaW5kZXhPZigie0AiLCBzdGFydCk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2UgYXJlIGludGVyZXN0ZWQgb25seSBpbiBjb21wbGV0ZSBpbmxpbmUgdGFncworICAgICAgICBpbnQgY2xvc2VJbmRleCA9IHRleHQuaW5kZXhPZigifSIsIGluZGV4KTsKKyAgICAgICAgaWYgKGNsb3NlSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KGluZGV4LCBjbG9zZUluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWRvY0Rlc2NyaXB0aW9uKCkgeworICAgICAgICBlbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWRvY0Rlc2NyaXB0aW9uKExpc3Q8SmF2YWRvY0Rlc2NyaXB0aW9uRWxlbWVudD4gZWxlbWVudHMpIHsKKyAgICAgICAgdGhpcygpOworCisgICAgICAgIHRoaXMuZWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRFbGVtZW50KEphdmFkb2NEZXNjcmlwdGlvbkVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5hZGQoZWxlbWVudCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8SmF2YWRvY0Rlc2NyaXB0aW9uRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9UZXh0KCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlIC0+IHNiLmFwcGVuZChlLnRvVGV4dCgpKSk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiB0b1RleHQoKS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSmF2YWRvY0Rlc2NyaXB0aW9uIHRoYXQgPSAoSmF2YWRvY0Rlc2NyaXB0aW9uKSBvOworCisgICAgICAgIHJldHVybiBlbGVtZW50cy5lcXVhbHModGhhdC5lbGVtZW50cyk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkphdmFkb2NEZXNjcmlwdGlvbnsiICsKKyAgICAgICAgICAgICAgICAiZWxlbWVudHM9IiArIGVsZW1lbnRzICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9kZXNjcmlwdGlvbi9KYXZhZG9jRGVzY3JpcHRpb25FbGVtZW50LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9kZXNjcmlwdGlvbi9KYXZhZG9jRGVzY3JpcHRpb25FbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NWI2YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL2Rlc2NyaXB0aW9uL0phdmFkb2NEZXNjcmlwdGlvbkVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYy5kZXNjcmlwdGlvbjsKKworLyoqCisgKiBBbiBlbGVtZW50IG9mIGEgZGVzY3JpcHRpb246IGVpdGhlciBhbiBpbmxpbmUgdGFnIG9yIGEgcGllY2Ugb2YgdGV4dC4KKyAqIDxwPgorICogU28gZm9yIGV4YW1wbGUgPGNvZGU+YSB0ZXh0PC9jb2RlPiBvciA8Y29kZT57QGxpbmsgU3RyaW5nfTwvY29kZT4gY291bGQgYmUgdmFsaWQgZGVzY3JpcHRpb24gZWxlbWVudHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YWRvY0Rlc2NyaXB0aW9uRWxlbWVudCB7CisgICAgU3RyaW5nIHRvVGV4dCgpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvZGVzY3JpcHRpb24vSmF2YWRvY0lubGluZVRhZy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvZGVzY3JpcHRpb24vSmF2YWRvY0lubGluZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjViZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9kZXNjcmlwdGlvbi9KYXZhZG9jSW5saW5lVGFnLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE3IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jLmRlc2NyaXB0aW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5uZXh0V29yZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLnNjcmVhbWluZ1RvQ2FtZWxDYXNlOworCisvKioKKyAqIEFuIGlubGluZSB0YWcgY29udGFpbmVkIGluIGEgSmF2YWRvYyBkZXNjcmlwdGlvbi4KKyAqIDxwPgorICogRm9yIGV4YW1wbGUgPGNvZGU+e0BsaW5rIFN0cmluZ308L2NvZGU+CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhZG9jSW5saW5lVGFnIGltcGxlbWVudHMgSmF2YWRvY0Rlc2NyaXB0aW9uRWxlbWVudCB7CisKKyAgICBwdWJsaWMgc3RhdGljIEphdmFkb2NEZXNjcmlwdGlvbkVsZW1lbnQgZnJvbVRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaWYgKCF0ZXh0LnN0YXJ0c1dpdGgoIntAIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgdG8gc3RhcnQgd2l0aCAne0AnLiBUZXh0ICclcyciLCB0ZXh0KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0ZXh0LmVuZHNXaXRoKCJ9IikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgdG8gZW5kIHdpdGggJ30nLiBUZXh0ICclcyciLCB0ZXh0KSk7CisgICAgICAgIH0KKyAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDIsIHRleHQubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBuZXh0V29yZCh0ZXh0KTsKKyAgICAgICAgVHlwZSB0eXBlID0gVHlwZS5mcm9tTmFtZSh0YWdOYW1lKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZyh0YWdOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhZG9jSW5saW5lVGFnKHRhZ05hbWUsIHR5cGUsIGNvbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRhZzogaXQgY291bGQgZWl0aGVyIGNvcnJlc3BvbmQgdG8gYSBrbm93biB0YWcgKGNvZGUsIGRvY1Jvb3QsIGV0Yy4pIG9yIHJlcHJlc2VudAorICAgICAqIGFuIHVua25vd24gdGFnLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIFR5cGUgeworICAgICAgICBDT0RFLAorICAgICAgICBET0NfUk9PVCwKKyAgICAgICAgSU5IRVJJVF9ET0MsCisgICAgICAgIExJTkssCisgICAgICAgIExJTktQTEFJTiwKKyAgICAgICAgTElURVJBTCwKKyAgICAgICAgVkFMVUUsCisgICAgICAgIFVOS05PV047CisKKyAgICAgICAgVHlwZSgpIHsKKyAgICAgICAgICAgIHRoaXMua2V5d29yZCA9IHNjcmVhbWluZ1RvQ2FtZWxDYXNlKG5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBrZXl3b3JkOworCisgICAgICAgIHN0YXRpYyBKYXZhZG9jSW5saW5lVGFnLlR5cGUgZnJvbU5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKKyAgICAgICAgICAgIGZvciAoSmF2YWRvY0lubGluZVRhZy5UeXBlIHQgOiBKYXZhZG9jSW5saW5lVGFnLlR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodC5rZXl3b3JkLmVxdWFscyh0YWdOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50OworCisgICAgcHVibGljIEphdmFkb2NJbmxpbmVUYWcoU3RyaW5nIHRhZ05hbWUsIFR5cGUgdHlwZSwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvVGV4dCgpIHsKKyAgICAgICAgcmV0dXJuICJAIiArIHRhZ05hbWUgKyB0aGlzLmNvbnRlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSmF2YWRvY0lubGluZVRhZyB0aGF0ID0gKEphdmFkb2NJbmxpbmVUYWcpIG87CisKKyAgICAgICAgaWYgKHRhZ05hbWUgIT0gbnVsbCA/ICF0YWdOYW1lLmVxdWFscyh0aGF0LnRhZ05hbWUpIDogdGhhdC50YWdOYW1lICE9IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHR5cGUgIT0gdGhhdC50eXBlKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBjb250ZW50ICE9IG51bGwgPyBjb250ZW50LmVxdWFscyh0aGF0LmNvbnRlbnQpIDogdGhhdC5jb250ZW50ID09IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRhZ05hbWUgIT0gbnVsbCA/IHRhZ05hbWUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHR5cGUgIT0gbnVsbCA/IHR5cGUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChjb250ZW50ICE9IG51bGwgPyBjb250ZW50Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkphdmFkb2NJbmxpbmVUYWd7IiArCisgICAgICAgICAgICAgICAgInRhZ05hbWU9JyIgKyB0YWdOYW1lICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgdHlwZT0iICsgdHlwZSArCisgICAgICAgICAgICAgICAgIiwgY29udGVudD0nIiArIGNvbnRlbnQgKyAnXCcnICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvZGVzY3JpcHRpb24vSmF2YWRvY1NuaXBwZXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL2Rlc2NyaXB0aW9uL0phdmFkb2NTbmlwcGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiMzJjYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL2Rlc2NyaXB0aW9uL0phdmFkb2NTbmlwcGV0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb247CisKKy8qKgorICogQSBwaWVjZSBvZiB0ZXh0IGluc2lkZSBhIEphdmFkb2MgZGVzY3JpcHRpb24uCisgKiA8cD4KKyAqIEZvciBleGFtcGxlIGluIDxjb2RlPkEgY2xhc3MgdG90YWxseSB1bnJlbGF0ZWQgdG8ge0BsaW5rIFN0cmluZ30sIEkgc3dlYXIhPC9jb2RlPiB3ZSB3b3VsZCBoYXZlIHR3byBzbmlwcGV0czogb25lCisgKiBiZWZvcmUgYW5kIG9uZSBhZnRlciB0aGUgaW5saW5lIHRhZyAoPGNvZGU+e0BsaW5rIFN0cmluZ308L2NvZGU+KS4KKyAqLworcHVibGljIGNsYXNzIEphdmFkb2NTbmlwcGV0IGltcGxlbWVudHMgSmF2YWRvY0Rlc2NyaXB0aW9uRWxlbWVudCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworICAgIHB1YmxpYyBKYXZhZG9jU25pcHBldChTdHJpbmcgdGV4dCkgeworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9UZXh0KCkgeworICAgICAgICByZXR1cm4gdGhpcy50ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEphdmFkb2NTbmlwcGV0IHRoYXQgPSAoSmF2YWRvY1NuaXBwZXQpIG87CisKKyAgICAgICAgcmV0dXJuIHRleHQuZXF1YWxzKHRoYXQudGV4dCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gdGV4dC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YWRvY1NuaXBwZXR7IiArCisgICAgICAgICAgICAgICAgInRleHQ9JyIgKyB0ZXh0ICsgJ1wnJyArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQW5ub3RhdGlvbkRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Fubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTdmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Fubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEFubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbCB7CisKKyAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbi5jbGFzcywgIkFubm90YXRpb25EZWNsYXJhdGlvbiIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGU4OTJhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Bbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmNsYXNzLCAiQW5ub3RhdGlvbkV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHN1cGVyKHN1cGVyTm9kZU1ldGFNb2RlbCwgdHlwZSwgbmFtZSwgcGFja2FnZU5hbWUsIGlzQWJzdHJhY3QsIGhhc1dpbGRjYXJkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1Yjk2NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsIHsKKworICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmNsYXNzLCAiQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGRlZmF1bHRWYWx1ZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0FycmF5QWNjZXNzRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRkMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBBcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIEFycmF5QWNjZXNzRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLmNsYXNzLCAiQXJyYXlBY2Nlc3NFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGluZGV4UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjBmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0FycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIEFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5jbGFzcywgIkFycmF5Q3JlYXRpb25FeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGVsZW1lbnRUeXBlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaW5pdGlhbGl6ZXJQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBsZXZlbHNQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0FycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OWY5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0FycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEFycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgQXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsLmNsYXNzLCAiQXJyYXlDcmVhdGlvbkxldmVsIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBhbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGRpbWVuc2lvblByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTkxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0FycmF5SW5pdGlhbGl6ZXJFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIEFycmF5SW5pdGlhbGl6ZXJFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwci5jbGFzcywgIkFycmF5SW5pdGlhbGl6ZXJFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHZhbHVlc1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9BcnJheVR5cGVNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQXJyYXlUeXBlTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmM2Y2MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQXJyYXlUeXBlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQXJyYXlUeXBlTWV0YU1vZGVsIGV4dGVuZHMgUmVmZXJlbmNlVHlwZU1ldGFNb2RlbCB7CisKKyAgICBBcnJheVR5cGVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5jbGFzcywgIkFycmF5VHlwZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBjb21wb25lbnRUeXBlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgb3JpZ2luUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Fzc2VydFN0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQXNzZXJ0U3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTA4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Fzc2VydFN0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBBc3NlcnRTdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIEFzc2VydFN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuY2xhc3MsICJBc3NlcnRTdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNoZWNrUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbWVzc2FnZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Bc3NpZ25FeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Fzc2lnbkV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBkZTlhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Bc3NpZ25FeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQXNzaWduRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgQXNzaWduRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5jbGFzcywgIkFzc2lnbkV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgb3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0YXJnZXRQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB2YWx1ZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CYXNlTm9kZU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CYXNlTm9kZU1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jhc2VOb2RlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxODAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5kZWNhcGl0YWxpemU7CisKKy8qKgorICogTWV0YS1kYXRhIGFib3V0IGFsbCBjbGFzc2VzIGluIHRoZSBBU1QuIFRoZXNlIGFyZSBhbGwgTm9kZXMsIGV4Y2VwdCBOb2RlTGlzdC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlTWV0YU1vZGVsIHsKKyAgICBwcml2YXRlIGZpbmFsIE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlck5vZGVNZXRhTW9kZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5TWV0YU1vZGVsPiBkZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gZGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gY29uc3RydWN0b3JQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Fic3RyYWN0OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNXaWxkY2FyZDsKKworICAgIHB1YmxpYyBCYXNlTm9kZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHRoaXMuc3VwZXJOb2RlTWV0YU1vZGVsID0gc3VwZXJOb2RlTWV0YU1vZGVsOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgICAgIHRoaXMuaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7CisgICAgICAgIHRoaXMuaGFzV2lsZGNhcmQgPSBoYXNXaWxkY2FyZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlzIHRoaXMgdGhlIG1ldGEgbW9kZWwgZm9yIHRoaXMgbm9kZSBjbGFzcz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpcyhDbGFzczw/IGV4dGVuZHMgTm9kZT4gYykgeworICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBwYWNrYWdlIG5hbWUgKyBjbGFzcyBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBwYWNrYWdlTmFtZSArICIuIiArIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbWV0YSBtb2RlbCBmb3IgdGhlIG5vZGUgdGhhdCB0aGlzIG5vZGUgZXh0ZW5kcy4gTm90ZSB0aGF0IHRoaXMgaXMgdG8gYmUgdXNlZCB0byBmaW5kIHByb3BlcnRpZXMKKyAgICAgKiBkZWZpbmVkIGluIHN1cGVyY2xhc3NlcyBvZiBhIE5vZGUuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBnZXRTdXBlck5vZGVNZXRhTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBzdXBlck5vZGVNZXRhTW9kZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMgZGVjbGFyZWQgZGlyZWN0bHkgaW4gdGhpcyBub2RlIChub3QgaXRzIHBhcmVudCBub2Rlcy4pIFRoZXNlIGFyZSBhbHNvIGF2YWlsYWJsZQorICAgICAqIGFzIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKSB7CisgICAgICAgIHJldHVybiBkZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVsczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gZ2V0RGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscygpIHsKKyAgICAgICAgcmV0dXJuIGRlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMgdGhhdCBkZXNjcmliZSB0aGUgcGFyYW1ldGVycyB0byB0aGUgYWxsLWZpZWxkcyAoYnV0IG5vdCAicmFuZ2UiIGFuZCAiY29tbWVudCIpCisgICAgICogY29uc3RydWN0b3IsIGluIHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoaXMgbm9kZSBhbmQgaXRzIHBhcmVudHMuIE5vdGUgdGhhdCBhIG5ldyBsaXN0IGlzIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCkgeworICAgICAgICBMaXN0PFByb3BlcnR5TWV0YU1vZGVsPiBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMgPSBuZXcgQXJyYXlMaXN0PD4oZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKSk7CisgICAgICAgIEJhc2VOb2RlTWV0YU1vZGVsIHdhbGtOb2RlID0gdGhpczsKKyAgICAgICAgd2hpbGUgKHdhbGtOb2RlLmdldFN1cGVyTm9kZU1ldGFNb2RlbCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLmdldFN1cGVyTm9kZU1ldGFNb2RlbCgpLmdldCgpOworICAgICAgICAgICAgYWxsUHJvcGVydHlNZXRhTW9kZWxzLmFkZEFsbCh3YWxrTm9kZS5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsUHJvcGVydHlNZXRhTW9kZWxzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5zdGFuY2VPZk1ldGFNb2RlbChCYXNlTm9kZU1ldGFNb2RlbCBiYXNlTWV0YU1vZGVsKSB7CisgICAgICAgIGlmICh0aGlzID09IGJhc2VNZXRhTW9kZWwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpc1Jvb3ROb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0U3VwZXJOb2RlTWV0YU1vZGVsKCkuZ2V0KCkuaXNJbnN0YW5jZU9mTWV0YU1vZGVsKGJhc2VNZXRhTW9kZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIEFTVCBub2RlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBOb2RlPiBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhpcyBBU1Qgbm9kZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgQVNUIG5vZGUgaXMgYWJzdHJhY3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKyAgICAgICAgcmV0dXJuIGlzQWJzdHJhY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgQVNUIG5vZGUgaGFzIGEgJmx0Oz8mZ3Q7IGF0IHRoZSBlbmQgb2YgaXRzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzV2lsZGNhcmQoKSB7CisgICAgICAgIHJldHVybiBoYXNXaWxkY2FyZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBBU1Qgbm9kZSBpcyB0aGUgcm9vdCBub2RlLCBtZWFuaW5nIHRoYXQgaXQgaXMgdGhlIG1ldGEgbW9kZWwgZm9yICJOb2RlIjogIk5vZGVNZXRhTW9kZWwiLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdE5vZGUoKSB7CisgICAgICAgIHJldHVybiAhc3VwZXJOb2RlTWV0YU1vZGVsLmlzUHJlc2VudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEJhc2VOb2RlTWV0YU1vZGVsIGNsYXNzTWV0YU1vZGVsID0gKEJhc2VOb2RlTWV0YU1vZGVsKSBvOworCisgICAgICAgIGlmICghdHlwZS5lcXVhbHMoY2xhc3NNZXRhTW9kZWwudHlwZSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gdHlwZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgbmFtZSwgd2l0aCBnZW5lcmljcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lR2VuZXJpZmllZCgpIHsKKyAgICAgICAgaWYgKGhhc1dpbGRjYXJkKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZU5hbWUoKSArICI8Pz4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJhdyB0eXBlIG5hbWUsIHNvIG5vdGhpbmcgYnV0IHRoZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiB0eXBlLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gSmF2YVBhcnNlck1ldGFNb2RlbCBmb3IgdGhpcyBub2RlIG1ldGEgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRhTW9kZWxGaWVsZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBkZWNhcGl0YWxpemUoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQmluYXJ5RXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CaW5hcnlFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2MGFjOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQmluYXJ5RXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEJpbmFyeUV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIEJpbmFyeUV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuY2xhc3MsICJCaW5hcnlFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGxlZnRQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBvcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHJpZ2h0UHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jsb2NrQ29tbWVudE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CbG9ja0NvbW1lbnRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjYzOTdkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CbG9ja0NvbW1lbnRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBCbG9ja0NvbW1lbnRNZXRhTW9kZWwgZXh0ZW5kcyBDb21tZW50TWV0YU1vZGVsIHsKKworICAgIEJsb2NrQ29tbWVudE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudC5jbGFzcywgIkJsb2NrQ29tbWVudCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jsb2NrU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CbG9ja1N0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc4MDlkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CbG9ja1N0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBCbG9ja1N0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgQmxvY2tTdG10TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuY2xhc3MsICJCbG9ja1N0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Cb2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZDU5NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworcHVibGljIGNsYXNzIEJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uY2xhc3MsICJCb2R5RGVjbGFyYXRpb24iLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5IiwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHN1cGVyKHN1cGVyTm9kZU1ldGFNb2RlbCwgdHlwZSwgbmFtZSwgcGFja2FnZU5hbWUsIGlzQWJzdHJhY3QsIGhhc1dpbGRjYXJkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQm9vbGVhbkxpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjkxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEJvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbCBleHRlbmRzIExpdGVyYWxFeHByTWV0YU1vZGVsIHsKKworICAgIEJvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByLmNsYXNzLCAiQm9vbGVhbkxpdGVyYWxFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHZhbHVlUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0JyZWFrU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CcmVha1N0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY3MjMyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9CcmVha1N0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBCcmVha1N0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgQnJlYWtTdG10TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQuY2xhc3MsICJCcmVha1N0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbGFiZWxQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwNzYyZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK3B1YmxpYyBjbGFzcyBDYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsIHsKKworICAgIENhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uY2xhc3MsICJDYWxsYWJsZURlY2xhcmF0aW9uIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keSIsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlck5vZGVNZXRhTW9kZWwsIENsYXNzPD8gZXh0ZW5kcyBOb2RlPiB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGlzQWJzdHJhY3QsIGJvb2xlYW4gaGFzV2lsZGNhcmQpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJOb2RlTWV0YU1vZGVsLCB0eXBlLCBuYW1lLCBwYWNrYWdlTmFtZSwgaXNBYnN0cmFjdCwgaGFzV2lsZGNhcmQpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBtb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgcGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHJlY2VpdmVyUGFyYW1ldGVyUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdGhyb3duRXhjZXB0aW9uc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Nhc3RFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Nhc3RFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MWQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2FzdEV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBDYXN0RXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgQ2FzdEV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLmNsYXNzLCAiQ2FzdEV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHR5cGVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2F0Y2hDbGF1c2VNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2F0Y2hDbGF1c2VNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNkMTAyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DYXRjaENsYXVzZU1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIENhdGNoQ2xhdXNlTWV0YU1vZGVsIGV4dGVuZHMgTm9kZU1ldGFNb2RlbCB7CisKKyAgICBDYXRjaENsYXVzZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UuY2xhc3MsICJDYXRjaENsYXVzZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBib2R5UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgcGFyYW1ldGVyUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NoYXJMaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DaGFyTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg1OTViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DaGFyTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBDaGFyTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBMaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsIHsKKworICAgIENoYXJMaXRlcmFsRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2hhckxpdGVyYWxFeHByLmNsYXNzLCAiQ2hhckxpdGVyYWxFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DbGFzc0V4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2xhc3NFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhM2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2xhc3NFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQ2xhc3NFeHByTWV0YU1vZGVsIGV4dGVuZHMgRXhwcmVzc2lvbk1ldGFNb2RlbCB7CisKKyAgICBDbGFzc0V4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwci5jbGFzcywgIkNsYXNzRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBlZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwgZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb25NZXRhTW9kZWwgeworCisgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MsICJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZXh0ZW5kZWRUeXBlc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGltcGxlbWVudGVkVHlwZXNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpc0ludGVyZmFjZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3NDdlZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBDbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbCBleHRlbmRzIFJlZmVyZW5jZVR5cGVNZXRhTW9kZWwgeworCisgICAgQ2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmNsYXNzLCAiQ2xhc3NPckludGVyZmFjZVR5cGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHNjb3BlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHVzaW5nRGlhbW9uZE9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbW1lbnRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ29tbWVudE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZGQ3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbW1lbnRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitwdWJsaWMgY2xhc3MgQ29tbWVudE1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgQ29tbWVudE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuY2xhc3MsICJDb21tZW50IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbW1lbnRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyTm9kZU1ldGFNb2RlbCwgQ2xhc3M8PyBleHRlbmRzIE5vZGU+IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICBzdXBlcihzdXBlck5vZGVNZXRhTW9kZWwsIHR5cGUsIG5hbWUsIHBhY2thZ2VOYW1lLCBpc0Fic3RyYWN0LCBoYXNXaWxkY2FyZCk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNvbnRlbnRQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWFjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgQ29tcGlsYXRpb25Vbml0TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmNsYXNzLCAiQ29tcGlsYXRpb25Vbml0IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpbXBvcnRzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbW9kdWxlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgcGFja2FnZURlY2xhcmF0aW9uUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZXNQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbmRpdGlvbmFsRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzkxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbmRpdGlvbmFsRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgQ29uZGl0aW9uYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuY2xhc3MsICJDb25kaXRpb25hbEV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgY29uZGl0aW9uUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZWxzZUV4cHJQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0aGVuRXhwclByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0NvbnN0cnVjdG9yRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBiOWYzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIENhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwgeworCisgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcywgIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYm9keVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Db250aW51ZVN0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ29udGludWVTdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ZGI3MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQ29udGludWVTdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgQ29udGludWVTdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIENvbnRpbnVlU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10LmNsYXNzLCAiQ29udGludWVTdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGxhYmVsUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Rlcml2ZWRQcm9wZXJ0eS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9EZXJpdmVkUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI5ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9EZXJpdmVkUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKKy8qKgorICogSW5kaWNhdGUgYSBkZXJpdmVkIHByb3BlcnR5IG9mIGEgTm9kZSwKKyAqIG1lYW5pbmcgaXQgZG9lcyBzdXBwbHkgdXNlZnVsIGluZm9ybWF0aW9uLAorICogYnV0IGl0IGRvZXMgc28gYnkgdGFraW5nIGluZm9ybWF0aW9uIGZyb20gb3RoZXIgcHJvcGVydGllcy4KKyAqIChVc2VkIGR1cmluZyBnZW5lcmF0aW9uIG9mIHRoZSBtZXRhIG1vZGVsLikKKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldChNRVRIT0QpCitwdWJsaWMgQGludGVyZmFjZSBEZXJpdmVkUHJvcGVydHkgeworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Eb1N0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRG9TdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0NTFjNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRG9TdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgRG9TdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIERvU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LmNsYXNzLCAiRG9TdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGJvZHlQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBjb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRG91YmxlTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRG91YmxlTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc3MjczCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Eb3VibGVMaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIERvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsIGV4dGVuZHMgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbCB7CisKKyAgICBEb3VibGVMaXRlcmFsRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRG91YmxlTGl0ZXJhbEV4cHIuY2xhc3MsICJEb3VibGVMaXRlcmFsRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRW1wdHlTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0VtcHR5U3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDMzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0VtcHR5U3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEVtcHR5U3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBFbXB0eVN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdC5jbGFzcywgIkVtcHR5U3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRW5jbG9zZWRFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0VuY2xvc2VkRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDk5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0VuY2xvc2VkRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEVuY2xvc2VkRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgRW5jbG9zZWRFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FbmNsb3NlZEV4cHIuY2xhc3MsICJFbmNsb3NlZEV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaW5uZXJQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDY3ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsIHsKKworICAgIEVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5jbGFzcywgIkVudW1Db25zdGFudERlY2xhcmF0aW9uIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNsYXNzQm9keVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRW51bURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0VudW1EZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZWQ4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0VudW1EZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbCB7CisKKyAgICBFbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5jbGFzcywgIkVudW1EZWNsYXJhdGlvbiIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBlbnRyaWVzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaW1wbGVtZW50ZWRUeXBlc1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0N2I0MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmNsYXNzLCAiRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpc1RoaXNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRXhwcmVzc2lvbk1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9FeHByZXNzaW9uTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NzM2OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRXhwcmVzc2lvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uTWV0YU1vZGVsIGV4dGVuZHMgTm9kZU1ldGFNb2RlbCB7CisKKyAgICBFeHByZXNzaW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCAiRXhwcmVzc2lvbiIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb25NZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyTm9kZU1ldGFNb2RlbCwgQ2xhc3M8PyBleHRlbmRzIE5vZGU+IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICBzdXBlcihzdXBlck5vZGVNZXRhTW9kZWwsIHR5cGUsIG5hbWUsIHBhY2thZ2VOYW1lLCBpc0Fic3RyYWN0LCBoYXNXaWxkY2FyZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9FeHByZXNzaW9uU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9FeHByZXNzaW9uU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDdhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0V4cHJlc3Npb25TdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvblN0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgRXhwcmVzc2lvblN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmNsYXNzLCAiRXhwcmVzc2lvblN0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9GaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllODIwZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgRmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsIGV4dGVuZHMgRXhwcmVzc2lvbk1ldGFNb2RlbCB7CisKKyAgICBGaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5jbGFzcywgIkZpZWxkQWNjZXNzRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9GaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxMmZhZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEZpZWxkRGVjbGFyYXRpb25NZXRhTW9kZWwgZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb25NZXRhTW9kZWwgeworCisgICAgRmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5jbGFzcywgIkZpZWxkRGVjbGFyYXRpb24iLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdmFyaWFibGVzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbWF4aW11bUNvbW1vblR5cGVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRm9yU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Gb3JTdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzMDM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvRm9yU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEZvclN0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgRm9yU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5jbGFzcywgIkZvclN0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYm9keVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNvbXBhcmVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpbml0aWFsaXphdGlvblByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHVwZGF0ZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Gb3JlYWNoU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Gb3JlYWNoU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOGRjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0ZvcmVhY2hTdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgRm9yZWFjaFN0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgRm9yZWFjaFN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmNsYXNzLCAiRm9yZWFjaFN0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYm9keVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGl0ZXJhYmxlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdmFyaWFibGVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSWZTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0lmU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjQwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0lmU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIElmU3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBJZlN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5jbGFzcywgIklmU3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBjb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBlbHNlU3RtdFByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHRoZW5TdG10UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgY2FzY2FkaW5nSWZTdG10UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZWxzZUJsb2NrUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZWxzZUJyYW5jaFByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHRoZW5CbG9ja1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9JbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9JbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWU0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0ltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgSW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwgZXh0ZW5kcyBOb2RlTWV0YU1vZGVsIHsKKworICAgIEltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uY2xhc3MsICJJbXBvcnREZWNsYXJhdGlvbiIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaXNBc3Rlcmlza1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGlzU3RhdGljUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Jbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0luaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzUwMzhjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Jbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCB7CisKKyAgICBJbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLmNsYXNzLCAiSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBib2R5UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaXNTdGF0aWNQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQ1MzRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9JbnN0YW5jZU9mRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEluc3RhbmNlT2ZFeHByTWV0YU1vZGVsIGV4dGVuZHMgRXhwcmVzc2lvbk1ldGFNb2RlbCB7CisKKyAgICBJbnN0YW5jZU9mRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuY2xhc3MsICJJbnN0YW5jZU9mRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBleHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9JbnRlZ2VyTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5MzIxNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgSW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsIGV4dGVuZHMgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbCB7CisKKyAgICBJbnRlZ2VyTGl0ZXJhbEV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwci5jbGFzcywgIkludGVnZXJMaXRlcmFsRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW50ZXJuYWxQcm9wZXJ0eS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9JbnRlcm5hbFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNTk3MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW50ZXJuYWxQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCisvKioKKyAqIEluZGljYXRlIGFuIGludGVybmFsIHByb3BlcnR5IG9mIGEgTm9kZSwKKyAqIG1lYW5pbmcgaXQgaXMgbm90IHBhcnQgb2YgdGhlIG1ldGEgbW9kZWwuCisgKiAoVXNlZCBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgbWV0YSBtb2RlbC4pCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoRklFTEQpCitwdWJsaWMgQGludGVyZmFjZSBJbnRlcm5hbFByb3BlcnR5IHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW50ZXJzZWN0aW9uVHlwZU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9JbnRlcnNlY3Rpb25UeXBlTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhZDM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSW50ZXJzZWN0aW9uVHlwZU1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIEludGVyc2VjdGlvblR5cGVNZXRhTW9kZWwgZXh0ZW5kcyBUeXBlTWV0YU1vZGVsIHsKKworICAgIEludGVyc2VjdGlvblR5cGVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuY2xhc3MsICJJbnRlcnNlY3Rpb25UeXBlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGVsZW1lbnRzUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0phdmFQYXJzZXJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvSmF2YVBhcnNlck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZmJkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0phdmFQYXJzZXJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDk3NyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRoZSBtb2RlbCBjb250YWlucyBtZXRhLWRhdGEgYWJvdXQgYWxsIG5vZGVzIGluIHRoZSBBU1QuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXZhUGFyc2VyTWV0YU1vZGVsIHsKKworICAgIHByaXZhdGUgSmF2YVBhcnNlck1ldGFNb2RlbCgpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PEJhc2VOb2RlTWV0YU1vZGVsPiBub2RlTWV0YU1vZGVscyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplQ29uc3RydWN0b3JQYXJhbWV0ZXJzKCkgeworICAgICAgICBib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC50eXBlUGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLnBhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwudGhyb3duRXhjZXB0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5yZWNlaXZlclBhcmFtZXRlclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHlwZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZU1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFubm90YXRpb25FeHByTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1lbWJlcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHJlZmVyZW5jZVR5cGVNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVNZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwudmFsdWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHN0cmluZ0xpdGVyYWxFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwuaXNPcGVuUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kdWxlU3RtdHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsLmRpbWVuc2lvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChhcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLnBhY2thZ2VEZWNsYXJhdGlvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjb21waWxhdGlvblVuaXRNZXRhTW9kZWwuaW1wb3J0c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjb21waWxhdGlvblVuaXRNZXRhTW9kZWwudHlwZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLm1vZHVsZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChwYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHBhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQocGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1lbWJlcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLmRlZmF1bHRWYWx1ZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuaXNJbnRlcmZhY2VQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5leHRlbmRlZFR5cGVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5pbXBsZW1lbnRlZFR5cGVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tZW1iZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwucGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC50aHJvd25FeGNlcHRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwucmVjZWl2ZXJQYXJhbWV0ZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwuYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwuY2xhc3NCb2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbC5pbXBsZW1lbnRlZFR5cGVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbC5lbnRyaWVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tZW1iZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLnZhcmlhYmxlc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5pc1N0YXRpY1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwucGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwudGhyb3duRXhjZXB0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLnJlY2VpdmVyUGFyYW1ldGVyUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlck1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHBhcmFtZXRlck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQocGFyYW1ldGVyTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlck1ldGFNb2RlbC5pc1ZhckFyZ3NQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHBhcmFtZXRlck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQocGFyYW1ldGVyTWV0YU1vZGVsLnZhckFyZ3NBbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcGFyYW1ldGVyTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChwYXJhbWV0ZXJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICByZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQocmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsLnR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsLmluaXRpYWxpemVyUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb21tZW50TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjb21tZW50TWV0YU1vZGVsLmNvbnRlbnRQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJsb2NrQ29tbWVudE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY29tbWVudE1ldGFNb2RlbC5jb250ZW50UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBqYXZhZG9jQ29tbWVudE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY29tbWVudE1ldGFNb2RlbC5jb250ZW50UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBsaW5lQ29tbWVudE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY29tbWVudE1ldGFNb2RlbC5jb250ZW50UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFycmF5QWNjZXNzRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFycmF5QWNjZXNzRXhwck1ldGFNb2RlbC5pbmRleFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLmVsZW1lbnRUeXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwubGV2ZWxzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwuaW5pdGlhbGl6ZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFycmF5SW5pdGlhbGl6ZXJFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChhcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbC52YWx1ZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFzc2lnbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFzc2lnbkV4cHJNZXRhTW9kZWwudGFyZ2V0UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhc3NpZ25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChhc3NpZ25FeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhc3NpZ25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChhc3NpZ25FeHByTWV0YU1vZGVsLm9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBiaW5hcnlFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChiaW5hcnlFeHByTWV0YU1vZGVsLmxlZnRQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJpbmFyeUV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGJpbmFyeUV4cHJNZXRhTW9kZWwucmlnaHRQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJpbmFyeUV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGJpbmFyeUV4cHJNZXRhTW9kZWwub3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYm9vbGVhbkxpdGVyYWxFeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjYXN0RXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoY2FzdEV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FzdEV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNhc3RFeHByTWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNoYXJMaXRlcmFsRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbC52YWx1ZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2xhc3NFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjbGFzc0V4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwuY29uZGl0aW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbC50aGVuRXhwclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwuZWxzZUV4cHJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGRvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbmNsb3NlZEV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGVuY2xvc2VkRXhwck1ldGFNb2RlbC5pbm5lclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChmaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwuc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLnR5cGVBcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGluc3RhbmNlT2ZFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChpbnN0YW5jZU9mRXhwck1ldGFNb2RlbC5leHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpbnN0YW5jZU9mRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBsYW1iZGFFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChsYW1iZGFFeHByTWV0YU1vZGVsLnBhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGxhbWJkYUV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGxhbWJkYUV4cHJNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFtYmRhRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobGFtYmRhRXhwck1ldGFNb2RlbC5pc0VuY2xvc2luZ1BhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGxvbmdMaXRlcmFsRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbC52YWx1ZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWFya2VyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFubm90YXRpb25FeHByTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2RDYWxsRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChtZXRob2RDYWxsRXhwck1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2RDYWxsRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLmFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC5zY29wZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLmlkZW50aWZpZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG5hbWVFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChuYW1lRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBuYW1lTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChuYW1lTWV0YU1vZGVsLnF1YWxpZmllclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbmFtZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobmFtZU1ldGFNb2RlbC5pZGVudGlmaWVyUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBuYW1lTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChuYW1lTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBub3JtYWxBbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbm9ybWFsQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsLnBhaXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC5zY29wZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgb2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgb2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwudHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgb2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC5hbm9ueW1vdXNDbGFzc0JvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHNpbXBsZU5hbWVNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHNpbXBsZU5hbWVNZXRhTW9kZWwuaWRlbnRpZmllclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgc2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFubm90YXRpb25FeHByTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHNpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChzaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5tZW1iZXJWYWx1ZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgc3VwZXJFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChzdXBlckV4cHJNZXRhTW9kZWwuY2xhc3NFeHByUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0aGlzRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodGhpc0V4cHJNZXRhTW9kZWwuY2xhc3NFeHByUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlRXhwck1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZUV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdW5hcnlFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh1bmFyeUV4cHJNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdW5hcnlFeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh1bmFyeUV4cHJNZXRhTW9kZWwub3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLnZhcmlhYmxlc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChpbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbC5pc1N0YXRpY1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmlzQXN0ZXJpc2tQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFzc2VydFN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFzc2VydFN0bXRNZXRhTW9kZWwuY2hlY2tQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFzc2VydFN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGFzc2VydFN0bXRNZXRhTW9kZWwubWVzc2FnZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYmxvY2tTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChibG9ja1N0bXRNZXRhTW9kZWwuc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYnJlYWtTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChicmVha1N0bXRNZXRhTW9kZWwubGFiZWxQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhdGNoQ2xhdXNlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYXRjaENsYXVzZU1ldGFNb2RlbC5wYXJhbWV0ZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhdGNoQ2xhdXNlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjYXRjaENsYXVzZU1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb250aW51ZVN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNvbnRpbnVlU3RtdE1ldGFNb2RlbC5sYWJlbFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZG9TdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChkb1N0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZG9TdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChkb1N0bXRNZXRhTW9kZWwuY29uZGl0aW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5pc1RoaXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLmFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZXhwcmVzc2lvblN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGV4cHJlc3Npb25TdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZvcmVhY2hTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChmb3JlYWNoU3RtdE1ldGFNb2RlbC52YXJpYWJsZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZm9yZWFjaFN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGZvcmVhY2hTdG10TWV0YU1vZGVsLml0ZXJhYmxlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmb3JlYWNoU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZm9yZWFjaFN0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZm9yU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZm9yU3RtdE1ldGFNb2RlbC5pbml0aWFsaXphdGlvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZm9yU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZm9yU3RtdE1ldGFNb2RlbC5jb21wYXJlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmb3JTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChmb3JTdG10TWV0YU1vZGVsLnVwZGF0ZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZm9yU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoZm9yU3RtdE1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpZlN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGlmU3RtdE1ldGFNb2RlbC5jb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGlmU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoaWZTdG10TWV0YU1vZGVsLnRoZW5TdG10UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpZlN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGlmU3RtdE1ldGFNb2RlbC5lbHNlU3RtdFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFiZWxlZFN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGxhYmVsZWRTdG10TWV0YU1vZGVsLmxhYmVsUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBsYWJlbGVkU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobGFiZWxlZFN0bXRNZXRhTW9kZWwuc3RhdGVtZW50UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICByZXR1cm5TdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChyZXR1cm5TdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoc3dpdGNoRW50cnlTdG10TWV0YU1vZGVsLmxhYmVsUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbC5zdGF0ZW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzd2l0Y2hTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChzd2l0Y2hTdG10TWV0YU1vZGVsLnNlbGVjdG9yUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzd2l0Y2hTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChzd2l0Y2hTdG10TWV0YU1vZGVsLmVudHJpZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgc3luY2hyb25pemVkU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoc3luY2hyb25pemVkU3RtdE1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0aHJvd1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHRocm93U3RtdE1ldGFNb2RlbC5leHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0cnlTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh0cnlTdG10TWV0YU1vZGVsLnJlc291cmNlc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHJ5U3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHJ5U3RtdE1ldGFNb2RlbC50cnlCbG9ja1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHJ5U3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHJ5U3RtdE1ldGFNb2RlbC5jYXRjaENsYXVzZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHRyeVN0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHRyeVN0bXRNZXRhTW9kZWwuZmluYWxseUJsb2NrUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBsb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChsb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsLmNsYXNzRGVjbGFyYXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHdoaWxlU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQod2hpbGVTdG10TWV0YU1vZGVsLmNvbmRpdGlvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgd2hpbGVTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh3aGlsZVN0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlUeXBlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChhcnJheVR5cGVNZXRhTW9kZWwuY29tcG9uZW50VHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlUeXBlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChhcnJheVR5cGVNZXRhTW9kZWwub3JpZ2luUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheVR5cGVNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVNZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5zY29wZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZU1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW50ZXJzZWN0aW9uVHlwZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoaW50ZXJzZWN0aW9uVHlwZU1ldGFNb2RlbC5lbGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcHJpbWl0aXZlVHlwZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQocHJpbWl0aXZlVHlwZU1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwcmltaXRpdmVUeXBlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh0eXBlTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlUGFyYW1ldGVyTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh0eXBlUGFyYW1ldGVyTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwudHlwZUJvdW5kUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlUGFyYW1ldGVyTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh0eXBlTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB1bmlvblR5cGVNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHVuaW9uVHlwZU1ldGFNb2RlbC5lbGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgd2lsZGNhcmRUeXBlTWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZCh3aWxkY2FyZFR5cGVNZXRhTW9kZWwuZXh0ZW5kZWRUeXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB3aWxkY2FyZFR5cGVNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKHdpbGRjYXJkVHlwZU1ldGFNb2RlbC5zdXBlclR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHdpbGRjYXJkVHlwZU1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQodHlwZU1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlUmVxdWlyZXNTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChtb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbC5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQobW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1vZHVsZUV4cG9ydHNTdG10TWV0YU1vZGVsLm1vZHVsZU5hbWVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbC53aXRoVHlwZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1vZHVsZVVzZXNTdG10TWV0YU1vZGVsLmdldENvbnN0cnVjdG9yUGFyYW1ldGVycygpLmFkZChtb2R1bGVVc2VzU3RtdE1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWwuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCkuYWRkKG1vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbC5tb2R1bGVOYW1lc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8QmFzZU5vZGVNZXRhTW9kZWw+IGdldE5vZGVNZXRhTW9kZWxzKCkgeworICAgICAgICByZXR1cm4gbm9kZU1ldGFNb2RlbHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplTm9kZU1ldGFNb2RlbHMoKSB7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChhbm5vdGF0aW9uRGVjbGFyYXRpb25NZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGFycmF5QWNjZXNzRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChhcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoYXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoYXJyYXlUeXBlTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGFzc2VydFN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoYXNzaWduRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChiaW5hcnlFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGJsb2NrQ29tbWVudE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChibG9ja1N0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGJvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChicmVha1N0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjYXN0RXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjYXRjaENsYXVzZU1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjaGFyTGl0ZXJhbEV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoY2xhc3NFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjb21tZW50TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoY29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChjb250aW51ZVN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoZG9TdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGRvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGVtcHR5U3RtdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChlbmNsb3NlZEV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoZW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoZW51bURlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChleHByZXNzaW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGV4cHJlc3Npb25TdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGZvclN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoZm9yZWFjaFN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoaWZTdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoaW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGludGVyc2VjdGlvblR5cGVNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoamF2YWRvY0NvbW1lbnRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobGFiZWxlZFN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobGFtYmRhRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChsaW5lQ29tbWVudE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChsaXRlcmFsRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKGxvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobG9uZ0xpdGVyYWxFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG1hcmtlckFubm90YXRpb25FeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChtZXRob2RDYWxsRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChtZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG1vZHVsZUV4cG9ydHNTdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG1vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobW9kdWxlUmVxdWlyZXNTdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG1vZHVsZVN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobmFtZUV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQobmFtZU1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChub2RlTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKG51bGxMaXRlcmFsRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQocGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHBhcmFtZXRlck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChwcmltaXRpdmVUeXBlTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHJlZmVyZW5jZVR5cGVNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQocmV0dXJuU3RtdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChzaW1wbGVOYW1lTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHNpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHN0YXRlbWVudE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChzdHJpbmdMaXRlcmFsRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZChzdXBlckV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoc3dpdGNoRW50cnlTdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHN3aXRjaFN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQoc3luY2hyb25pemVkU3RtdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh0aGlzRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh0aHJvd1N0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodHJ5U3RtdE1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodHlwZUV4cHJNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodHlwZU1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh0eXBlUGFyYW1ldGVyTWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHVuYXJ5RXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh1bmlvblR5cGVNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodW5rbm93blR5cGVNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodW5wYXJzYWJsZVN0bXRNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodmFyVHlwZU1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbCk7CisgICAgICAgIG5vZGVNZXRhTW9kZWxzLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQodm9pZFR5cGVNZXRhTW9kZWwpOworICAgICAgICBub2RlTWV0YU1vZGVscy5hZGQod2hpbGVTdG10TWV0YU1vZGVsKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbHMuYWRkKHdpbGRjYXJkVHlwZU1ldGFNb2RlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsaXplUHJvcGVydHlNZXRhTW9kZWxzKCkgeworICAgICAgICBub2RlTWV0YU1vZGVsLmNvbW1lbnRQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChub2RlTWV0YU1vZGVsLCAiY29tbWVudCIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudC5jbGFzcywgT3B0aW9uYWwub2YoY29tbWVudE1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbm9kZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChub2RlTWV0YU1vZGVsLmNvbW1lbnRQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCwgImFubm90YXRpb25zIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmNsYXNzLCBPcHRpb25hbC5vZihhbm5vdGF0aW9uRXhwck1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAibW9kaWZpZXJzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwucGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJwYXJhbWV0ZXJzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5jbGFzcywgT3B0aW9uYWwub2YocGFyYW1ldGVyTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwucGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5yZWNlaXZlclBhcmFtZXRlclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJyZWNlaXZlclBhcmFtZXRlciIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5SZWNlaXZlclBhcmFtZXRlci5jbGFzcywgT3B0aW9uYWwub2YocmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5yZWNlaXZlclBhcmFtZXRlclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC50aHJvd25FeGNlcHRpb25zUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCwgInRocm93bkV4Y2VwdGlvbnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZS5jbGFzcywgT3B0aW9uYWwub2YocmVmZXJlbmNlVHlwZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLnRocm93bkV4Y2VwdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwudHlwZVBhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAidHlwZVBhcmFtZXRlcnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5jbGFzcywgT3B0aW9uYWwub2YodHlwZVBhcmFtZXRlck1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodHlwZU1ldGFNb2RlbCwgImFubm90YXRpb25zIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmNsYXNzLCBPcHRpb25hbC5vZihhbm5vdGF0aW9uRXhwck1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdHlwZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh0eXBlTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChhbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwubWVtYmVyc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbCwgIm1lbWJlcnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmNsYXNzLCBPcHRpb25hbC5vZihib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgdHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5tZW1iZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAibW9kaWZpZXJzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKHNpbXBsZU5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwudmFsdWVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLCAidmFsdWUiLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwudmFsdWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJhbm5vdGF0aW9ucyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5jbGFzcywgT3B0aW9uYWwub2YoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5pc09wZW5Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbCwgImlzT3BlbiIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmlzT3BlblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kdWxlU3RtdHNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbCwgIm1vZHVsZVN0bXRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLk1vZHVsZVN0bXQuY2xhc3MsIE9wdGlvbmFsLm9mKG1vZHVsZVN0bXRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZHVsZVN0bXRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChhcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwsICJhbm5vdGF0aW9ucyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5jbGFzcywgT3B0aW9uYWwub2YoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChhcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbC5kaW1lbnNpb25Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChhcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwsICJkaW1lbnNpb24iLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbC5kaW1lbnNpb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5pbXBvcnRzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLCAiaW1wb3J0cyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uY2xhc3MsIE9wdGlvbmFsLm9mKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjb21waWxhdGlvblVuaXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLmltcG9ydHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5tb2R1bGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjb21waWxhdGlvblVuaXRNZXRhTW9kZWwsICJtb2R1bGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuTW9kdWxlRGVjbGFyYXRpb24uY2xhc3MsIE9wdGlvbmFsLm9mKG1vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjb21waWxhdGlvblVuaXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLm1vZHVsZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLnBhY2thZ2VEZWNsYXJhdGlvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbCwgInBhY2thZ2VEZWNsYXJhdGlvbiIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzLCBPcHRpb25hbC5vZihwYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjb21waWxhdGlvblVuaXRNZXRhTW9kZWwucGFja2FnZURlY2xhcmF0aW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb21waWxhdGlvblVuaXRNZXRhTW9kZWwudHlwZXNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjb21waWxhdGlvblVuaXRNZXRhTW9kZWwsICJ0eXBlcyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uY2xhc3MsIE9wdGlvbmFsLm9mKHR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICBjb21waWxhdGlvblVuaXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsLnR5cGVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChwYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJhbm5vdGF0aW9ucyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5jbGFzcywgT3B0aW9uYWwub2YoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHBhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChwYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwuYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHBhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lLmNsYXNzLCBPcHRpb25hbC5vZihuYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHBhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwuZGVmYXVsdFZhbHVlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLCAiZGVmYXVsdFZhbHVlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwuZGVmYXVsdFZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLCAibW9kaWZpZXJzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKHNpbXBsZU5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLCAidHlwZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZXh0ZW5kZWRUeXBlc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbCwgImV4dGVuZGVkVHlwZXMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLmV4dGVuZGVkVHlwZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5pbXBsZW1lbnRlZFR5cGVzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAiaW1wbGVtZW50ZWRUeXBlcyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5jbGFzcywgT3B0aW9uYWwub2YoY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuaW1wbGVtZW50ZWRUeXBlc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLmlzSW50ZXJmYWNlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLCAiaXNJbnRlcmZhY2UiLCBib29sZWFuLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLmlzSW50ZXJmYWNlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwudHlwZVBhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwsICJ0eXBlUGFyYW1ldGVycyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlUGFyYW1ldGVyTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsLCAiYm9keSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuY2xhc3MsIE9wdGlvbmFsLm9mKGJsb2NrU3RtdE1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5hcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbCwgImFyZ3VtZW50cyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbC5hcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLmNsYXNzQm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLCAiY2xhc3NCb2R5IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5jbGFzcywgT3B0aW9uYWwub2YoYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLmNsYXNzQm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGVudW1Db25zdGFudERlY2xhcmF0aW9uTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZW51bUNvbnN0YW50RGVjbGFyYXRpb25NZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZW51bURlY2xhcmF0aW9uTWV0YU1vZGVsLmVudHJpZXNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwsICJlbnRyaWVzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmNsYXNzLCBPcHRpb25hbC5vZihlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZW51bURlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbC5lbnRyaWVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuaW1wbGVtZW50ZWRUeXBlc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbCwgImltcGxlbWVudGVkVHlwZXMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZW51bURlY2xhcmF0aW9uTWV0YU1vZGVsLmltcGxlbWVudGVkVHlwZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZpZWxkRGVjbGFyYXRpb25NZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbCwgIm1vZGlmaWVycyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC52YXJpYWJsZXNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLCAidmFyaWFibGVzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5jbGFzcywgT3B0aW9uYWwub2YodmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsKSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZpZWxkRGVjbGFyYXRpb25NZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC52YXJpYWJsZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZpZWxkRGVjbGFyYXRpb25NZXRhTW9kZWwubWF4aW11bUNvbW1vblR5cGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsLCAibWF4aW11bUNvbW1vblR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZXJpdmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGZpZWxkRGVjbGFyYXRpb25NZXRhTW9kZWwubWF4aW11bUNvbW1vblR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwsICJib2R5IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5jbGFzcywgT3B0aW9uYWwub2YoYmxvY2tTdG10TWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChpbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwuaXNTdGF0aWNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChpbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsLCAiaXNTdGF0aWMiLCBib29sZWFuLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBpbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwuaXNTdGF0aWNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbCwgImJvZHkiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmNsYXNzLCBPcHRpb25hbC5vZihibG9ja1N0bXRNZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbCwgInR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsLnR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHBhcmFtZXRlck1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHBhcmFtZXRlck1ldGFNb2RlbCwgImFubm90YXRpb25zIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmNsYXNzLCBPcHRpb25hbC5vZihhbm5vdGF0aW9uRXhwck1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcGFyYW1ldGVyTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHBhcmFtZXRlck1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcGFyYW1ldGVyTWV0YU1vZGVsLmlzVmFyQXJnc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHBhcmFtZXRlck1ldGFNb2RlbCwgImlzVmFyQXJncyIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHBhcmFtZXRlck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChwYXJhbWV0ZXJNZXRhTW9kZWwuaXNWYXJBcmdzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocGFyYW1ldGVyTWV0YU1vZGVsLCAibW9kaWZpZXJzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQocGFyYW1ldGVyTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgcGFyYW1ldGVyTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChwYXJhbWV0ZXJNZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKHNpbXBsZU5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQocGFyYW1ldGVyTWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHBhcmFtZXRlck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocGFyYW1ldGVyTWV0YU1vZGVsLCAidHlwZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcGFyYW1ldGVyTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHBhcmFtZXRlck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBwYXJhbWV0ZXJNZXRhTW9kZWwudmFyQXJnc0Fubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocGFyYW1ldGVyTWV0YU1vZGVsLCAidmFyQXJnc0Fubm90YXRpb25zIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmNsYXNzLCBPcHRpb25hbC5vZihhbm5vdGF0aW9uRXhwck1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcGFyYW1ldGVyTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHBhcmFtZXRlck1ldGFNb2RlbC52YXJBcmdzQW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwsICJhbm5vdGF0aW9ucyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5jbGFzcywgT3B0aW9uYWwub2YoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsLmFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICByZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICByZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChyZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICByZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwocmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwsICJ0eXBlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICByZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChyZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwuaW5pdGlhbGl6ZXJQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwsICJpbml0aWFsaXplciIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwuaW5pdGlhbGl6ZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbCwgInR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29tbWVudE1ldGFNb2RlbC5jb250ZW50UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY29tbWVudE1ldGFNb2RlbCwgImNvbnRlbnQiLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjb21tZW50TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNvbW1lbnRNZXRhTW9kZWwuY29udGVudFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlBY2Nlc3NFeHByTWV0YU1vZGVsLmluZGV4UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXJyYXlBY2Nlc3NFeHByTWV0YU1vZGVsLCAiaW5kZXgiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFycmF5QWNjZXNzRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChhcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwuaW5kZXhQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFycmF5QWNjZXNzRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXJyYXlBY2Nlc3NFeHByTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYXJyYXlBY2Nlc3NFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFycmF5QWNjZXNzRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5lbGVtZW50VHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLCAiZWxlbWVudFR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLmVsZW1lbnRUeXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5pbml0aWFsaXplclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLCAiaW5pdGlhbGl6ZXIiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuY2xhc3MsIE9wdGlvbmFsLm9mKGFycmF5SW5pdGlhbGl6ZXJFeHByTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChhcnJheUNyZWF0aW9uRXhwck1ldGFNb2RlbC5pbml0aWFsaXplclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwubGV2ZWxzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwsICJsZXZlbHMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5jbGFzcywgT3B0aW9uYWwub2YoYXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsKSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFycmF5Q3JlYXRpb25FeHByTWV0YU1vZGVsLmxldmVsc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwudmFsdWVzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwsICJ2YWx1ZXMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYXJyYXlJbml0aWFsaXplckV4cHJNZXRhTW9kZWwudmFsdWVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhc3NpZ25FeHByTWV0YU1vZGVsLm9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXNzaWduRXhwck1ldGFNb2RlbCwgIm9wZXJhdG9yIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuT3BlcmF0b3IuY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFzc2lnbkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYXNzaWduRXhwck1ldGFNb2RlbC5vcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYXNzaWduRXhwck1ldGFNb2RlbC50YXJnZXRQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChhc3NpZ25FeHByTWV0YU1vZGVsLCAidGFyZ2V0IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhc3NpZ25FeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFzc2lnbkV4cHJNZXRhTW9kZWwudGFyZ2V0UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhc3NpZ25FeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXNzaWduRXhwck1ldGFNb2RlbCwgInZhbHVlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhc3NpZ25FeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFzc2lnbkV4cHJNZXRhTW9kZWwudmFsdWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJpbmFyeUV4cHJNZXRhTW9kZWwubGVmdFByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGJpbmFyeUV4cHJNZXRhTW9kZWwsICJsZWZ0IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBiaW5hcnlFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGJpbmFyeUV4cHJNZXRhTW9kZWwubGVmdFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYmluYXJ5RXhwck1ldGFNb2RlbC5vcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGJpbmFyeUV4cHJNZXRhTW9kZWwsICJvcGVyYXRvciIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBiaW5hcnlFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGJpbmFyeUV4cHJNZXRhTW9kZWwub3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGJpbmFyeUV4cHJNZXRhTW9kZWwucmlnaHRQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChiaW5hcnlFeHByTWV0YU1vZGVsLCAicmlnaHQiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGJpbmFyeUV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYmluYXJ5RXhwck1ldGFNb2RlbC5yaWdodFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYm9vbGVhbkxpdGVyYWxFeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYm9vbGVhbkxpdGVyYWxFeHByTWV0YU1vZGVsLCAidmFsdWUiLCBib29sZWFuLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBib29sZWFuTGl0ZXJhbEV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYm9vbGVhbkxpdGVyYWxFeHByTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjYXN0RXhwck1ldGFNb2RlbC5leHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2FzdEV4cHJNZXRhTW9kZWwsICJleHByZXNzaW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjYXN0RXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjYXN0RXhwck1ldGFNb2RlbC5leHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjYXN0RXhwck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2FzdEV4cHJNZXRhTW9kZWwsICJ0eXBlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjYXN0RXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjYXN0RXhwck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc0V4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNsYXNzRXhwck1ldGFNb2RlbCwgInR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNsYXNzRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjbGFzc0V4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmNvbmRpdGlvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbCwgImNvbmRpdGlvbiIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbC5jb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbC5lbHNlRXhwclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbCwgImVsc2VFeHByIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmVsc2VFeHByUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwudGhlbkV4cHJQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjb25kaXRpb25hbEV4cHJNZXRhTW9kZWwsICJ0aGVuRXhwciIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNvbmRpdGlvbmFsRXhwck1ldGFNb2RlbC50aGVuRXhwclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZW5jbG9zZWRFeHByTWV0YU1vZGVsLmlubmVyUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZW5jbG9zZWRFeHByTWV0YU1vZGVsLCAiaW5uZXIiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGVuY2xvc2VkRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChlbmNsb3NlZEV4cHJNZXRhTW9kZWwuaW5uZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwuc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwsICJzY29wZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC5zY29wZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLnR5cGVBcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwsICJ0eXBlQXJndW1lbnRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwudXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwsICJ1c2luZ0RpYW1vbmRPcGVyYXRvciIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC5nZXREZXJpdmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbC51c2luZ0RpYW1vbmRPcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGluc3RhbmNlT2ZFeHByTWV0YU1vZGVsLCAiZXhwcmVzc2lvbiIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGluc3RhbmNlT2ZFeHByTWV0YU1vZGVsLCAidHlwZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlLmNsYXNzLCBPcHRpb25hbC5vZihyZWZlcmVuY2VUeXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoaW5zdGFuY2VPZkV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFtYmRhRXhwck1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobGFtYmRhRXhwck1ldGFNb2RlbCwgImJvZHkiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBsYW1iZGFFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGxhbWJkYUV4cHJNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFtYmRhRXhwck1ldGFNb2RlbC5pc0VuY2xvc2luZ1BhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChsYW1iZGFFeHByTWV0YU1vZGVsLCAiaXNFbmNsb3NpbmdQYXJhbWV0ZXJzIiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbGFtYmRhRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChsYW1iZGFFeHByTWV0YU1vZGVsLmlzRW5jbG9zaW5nUGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFtYmRhRXhwck1ldGFNb2RlbC5wYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobGFtYmRhRXhwck1ldGFNb2RlbCwgInBhcmFtZXRlcnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmNsYXNzLCBPcHRpb25hbC5vZihwYXJhbWV0ZXJNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGxhbWJkYUV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobGFtYmRhRXhwck1ldGFNb2RlbC5wYXJhbWV0ZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBsYW1iZGFFeHByTWV0YU1vZGVsLmV4cHJlc3Npb25Cb2R5UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobGFtYmRhRXhwck1ldGFNb2RlbCwgImV4cHJlc3Npb25Cb2R5IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGxhbWJkYUV4cHJNZXRhTW9kZWwuZ2V0RGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChsYW1iZGFFeHByTWV0YU1vZGVsLmV4cHJlc3Npb25Cb2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbCwgIm5hbWUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZS5jbGFzcywgT3B0aW9uYWwub2Yoc2ltcGxlTmFtZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsLnZhbHVlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsLCAidmFsdWUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwudmFsdWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLmFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLCAiYXJndW1lbnRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLmFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtZXRob2RDYWxsRXhwck1ldGFNb2RlbCwgInNjb3BlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1ldGhvZENhbGxFeHByTWV0YU1vZGVsLnNjb3BlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2RDYWxsRXhwck1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwsICJ0eXBlQXJndW1lbnRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwudHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwudXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtZXRob2RDYWxsRXhwck1ldGFNb2RlbCwgInVzaW5nRGlhbW9uZE9wZXJhdG9yIiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuZ2V0RGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtZXRob2RDYWxsRXhwck1ldGFNb2RlbC51c2luZ0RpYW1vbmRPcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC5pZGVudGlmaWVyUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbCwgImlkZW50aWZpZXIiLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC5pZGVudGlmaWVyUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLnNjb3BlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbCwgInNjb3BlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwuc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwudHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwsICJ0eXBlQXJndW1lbnRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLnR5cGVBcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwudXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLCAidXNpbmdEaWFtb25kT3BlcmF0b3IiLCBib29sZWFuLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLmdldERlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbC51c2luZ0RpYW1vbmRPcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbmFtZUV4cHJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG5hbWVFeHByTWV0YU1vZGVsLCAibmFtZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbmFtZUV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobmFtZUV4cHJNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbmFtZU1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG5hbWVNZXRhTW9kZWwsICJhbm5vdGF0aW9ucyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5jbGFzcywgT3B0aW9uYWwub2YoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG5hbWVNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobmFtZU1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbmFtZU1ldGFNb2RlbC5pZGVudGlmaWVyUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobmFtZU1ldGFNb2RlbCwgImlkZW50aWZpZXIiLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG5hbWVNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobmFtZU1ldGFNb2RlbC5pZGVudGlmaWVyUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBuYW1lTWV0YU1vZGVsLnF1YWxpZmllclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG5hbWVNZXRhTW9kZWwsICJxdWFsaWZpZXIiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZS5jbGFzcywgT3B0aW9uYWwub2YobmFtZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbmFtZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChuYW1lTWV0YU1vZGVsLnF1YWxpZmllclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbm9ybWFsQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwucGFpcnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChub3JtYWxBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCwgInBhaXJzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5jbGFzcywgT3B0aW9uYWwub2YobWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBub3JtYWxBbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChub3JtYWxBbm5vdGF0aW9uRXhwck1ldGFNb2RlbC5wYWlyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgb2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmFub255bW91c0NsYXNzQm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbCwgImFub255bW91c0NsYXNzQm9keSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uY2xhc3MsIE9wdGlvbmFsLm9mKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuYW5vbnltb3VzQ2xhc3NCb2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwob2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLCAiYXJndW1lbnRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwsICJzY29wZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQob2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLnNjb3BlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbCwgInR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgb2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC50eXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwudHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbCwgInR5cGVBcmd1bWVudHMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQob2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLnR5cGVBcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC51c2luZ0RpYW1vbmRPcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbCwgInVzaW5nRGlhbW9uZE9wZXJhdG9yIiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgb2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmdldERlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQob2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLnVzaW5nRGlhbW9uZE9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzaW1wbGVOYW1lTWV0YU1vZGVsLmlkZW50aWZpZXJQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChzaW1wbGVOYW1lTWV0YU1vZGVsLCAiaWRlbnRpZmllciIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgc2ltcGxlTmFtZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChzaW1wbGVOYW1lTWV0YU1vZGVsLmlkZW50aWZpZXJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHNpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsLm1lbWJlclZhbHVlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoc2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwsICJtZW1iZXJWYWx1ZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgc2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoc2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwubWVtYmVyVmFsdWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHN1cGVyRXhwck1ldGFNb2RlbC5jbGFzc0V4cHJQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChzdXBlckV4cHJNZXRhTW9kZWwsICJjbGFzc0V4cHIiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgc3VwZXJFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHN1cGVyRXhwck1ldGFNb2RlbC5jbGFzc0V4cHJQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHRoaXNFeHByTWV0YU1vZGVsLmNsYXNzRXhwclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHRoaXNFeHByTWV0YU1vZGVsLCAiY2xhc3NFeHByIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRoaXNFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHRoaXNFeHByTWV0YU1vZGVsLmNsYXNzRXhwclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHlwZUV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHR5cGVFeHByTWV0YU1vZGVsLCAidHlwZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdHlwZUV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodHlwZUV4cHJNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdW5hcnlFeHByTWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh1bmFyeUV4cHJNZXRhTW9kZWwsICJleHByZXNzaW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB1bmFyeUV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodW5hcnlFeHByTWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHVuYXJ5RXhwck1ldGFNb2RlbC5vcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHVuYXJ5RXhwck1ldGFNb2RlbCwgIm9wZXJhdG9yIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5PcGVyYXRvci5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdW5hcnlFeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHVuYXJ5RXhwck1ldGFNb2RlbC5vcGVyYXRvclByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdW5hcnlFeHByTWV0YU1vZGVsLnBvc3RmaXhQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh1bmFyeUV4cHJNZXRhTW9kZWwsICJwb3N0Zml4IiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdW5hcnlFeHByTWV0YU1vZGVsLmdldERlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodW5hcnlFeHByTWV0YU1vZGVsLnBvc3RmaXhQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHVuYXJ5RXhwck1ldGFNb2RlbC5wcmVmaXhQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh1bmFyeUV4cHJNZXRhTW9kZWwsICJwcmVmaXgiLCBib29sZWFuLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB1bmFyeUV4cHJNZXRhTW9kZWwuZ2V0RGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh1bmFyeUV4cHJNZXRhTW9kZWwucHJlZml4UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLCAiYW5ub3RhdGlvbnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuY2xhc3MsIE9wdGlvbmFsLm9mKGFubm90YXRpb25FeHByTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5hbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwsICJtb2RpZmllcnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLm1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwudmFyaWFibGVzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwsICJ2YXJpYWJsZXMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmNsYXNzLCBPcHRpb25hbC5vZih2YXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwpLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwudmFyaWFibGVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5tYXhpbXVtQ29tbW9uVHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsLCAibWF4aW11bUNvbW1vblR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwuZ2V0RGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5tYXhpbXVtQ29tbW9uVHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwuaXNBc3Rlcmlza1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLCAiaXNBc3RlcmlzayIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmlzQXN0ZXJpc2tQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmlzU3RhdGljUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoaW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwsICJpc1N0YXRpYyIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGltcG9ydERlY2xhcmF0aW9uTWV0YU1vZGVsLmlzU3RhdGljUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoaW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBpbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChpbXBvcnREZWNsYXJhdGlvbk1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhc3NlcnRTdG10TWV0YU1vZGVsLmNoZWNrUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXNzZXJ0U3RtdE1ldGFNb2RlbCwgImNoZWNrIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFzc2VydFN0bXRNZXRhTW9kZWwuY2hlY2tQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFzc2VydFN0bXRNZXRhTW9kZWwubWVzc2FnZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGFzc2VydFN0bXRNZXRhTW9kZWwsICJtZXNzYWdlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoYXNzZXJ0U3RtdE1ldGFNb2RlbC5tZXNzYWdlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBibG9ja1N0bXRNZXRhTW9kZWwuc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGJsb2NrU3RtdE1ldGFNb2RlbCwgInN0YXRlbWVudHMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGJsb2NrU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChibG9ja1N0bXRNZXRhTW9kZWwuc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgYnJlYWtTdG10TWV0YU1vZGVsLmxhYmVsUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYnJlYWtTdG10TWV0YU1vZGVsLCAibGFiZWwiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZS5jbGFzcywgT3B0aW9uYWwub2Yoc2ltcGxlTmFtZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYnJlYWtTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGJyZWFrU3RtdE1ldGFNb2RlbC5sYWJlbFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2F0Y2hDbGF1c2VNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNhdGNoQ2xhdXNlTWV0YU1vZGVsLCAiYm9keSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuY2xhc3MsIE9wdGlvbmFsLm9mKGJsb2NrU3RtdE1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNhdGNoQ2xhdXNlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNhdGNoQ2xhdXNlTWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNhdGNoQ2xhdXNlTWV0YU1vZGVsLnBhcmFtZXRlclByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNhdGNoQ2xhdXNlTWV0YU1vZGVsLCAicGFyYW1ldGVyIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5jbGFzcywgT3B0aW9uYWwub2YocGFyYW1ldGVyTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgY2F0Y2hDbGF1c2VNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY2F0Y2hDbGF1c2VNZXRhTW9kZWwucGFyYW1ldGVyUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjb250aW51ZVN0bXRNZXRhTW9kZWwubGFiZWxQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChjb250aW51ZVN0bXRNZXRhTW9kZWwsICJsYWJlbCIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCBPcHRpb25hbC5vZihzaW1wbGVOYW1lTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjb250aW51ZVN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY29udGludWVTdG10TWV0YU1vZGVsLmxhYmVsUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBkb1N0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGRvU3RtdE1ldGFNb2RlbCwgImJvZHkiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBkb1N0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZG9TdG10TWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGRvU3RtdE1ldGFNb2RlbC5jb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChkb1N0bXRNZXRhTW9kZWwsICJjb25kaXRpb24iLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGRvU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChkb1N0bXRNZXRhTW9kZWwuY29uZGl0aW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLCAiYXJndW1lbnRzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbCwgImV4cHJlc3Npb24iLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5leHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuaXNUaGlzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLCAiaXNUaGlzIiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5pc1RoaXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC50eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLCAidHlwZUFyZ3VtZW50cyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwudHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLnVzaW5nRGlhbW9uZE9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsLCAidXNpbmdEaWFtb25kT3BlcmF0b3IiLCBib29sZWFuLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwuZ2V0RGVyaXZlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwudXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGV4cHJlc3Npb25TdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChleHByZXNzaW9uU3RtdE1ldGFNb2RlbCwgImV4cHJlc3Npb24iLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGV4cHJlc3Npb25TdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGV4cHJlc3Npb25TdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZvcmVhY2hTdG10TWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmb3JlYWNoU3RtdE1ldGFNb2RlbCwgImJvZHkiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBmb3JlYWNoU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChmb3JlYWNoU3RtdE1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmb3JlYWNoU3RtdE1ldGFNb2RlbC5pdGVyYWJsZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGZvcmVhY2hTdG10TWV0YU1vZGVsLCAiaXRlcmFibGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZvcmVhY2hTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGZvcmVhY2hTdG10TWV0YU1vZGVsLml0ZXJhYmxlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmb3JlYWNoU3RtdE1ldGFNb2RlbC52YXJpYWJsZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGZvcmVhY2hTdG10TWV0YU1vZGVsLCAidmFyaWFibGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuY2xhc3MsIE9wdGlvbmFsLm9mKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZm9yZWFjaFN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZm9yZWFjaFN0bXRNZXRhTW9kZWwudmFyaWFibGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZvclN0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGZvclN0bXRNZXRhTW9kZWwsICJib2R5IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudC5jbGFzcywgT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZm9yU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChmb3JTdG10TWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGZvclN0bXRNZXRhTW9kZWwuY29tcGFyZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGZvclN0bXRNZXRhTW9kZWwsICJjb21wYXJlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZvclN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZm9yU3RtdE1ldGFNb2RlbC5jb21wYXJlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBmb3JTdG10TWV0YU1vZGVsLmluaXRpYWxpemF0aW9uUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoZm9yU3RtdE1ldGFNb2RlbCwgImluaXRpYWxpemF0aW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZvclN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZm9yU3RtdE1ldGFNb2RlbC5pbml0aWFsaXphdGlvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgZm9yU3RtdE1ldGFNb2RlbC51cGRhdGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChmb3JTdG10TWV0YU1vZGVsLCAidXBkYXRlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGZvclN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoZm9yU3RtdE1ldGFNb2RlbC51cGRhdGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGlmU3RtdE1ldGFNb2RlbC5jb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChpZlN0bXRNZXRhTW9kZWwsICJjb25kaXRpb24iLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbi5jbGFzcywgT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChpZlN0bXRNZXRhTW9kZWwuY29uZGl0aW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpZlN0bXRNZXRhTW9kZWwuZWxzZVN0bXRQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChpZlN0bXRNZXRhTW9kZWwsICJlbHNlU3RtdCIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQuY2xhc3MsIE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaWZTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGlmU3RtdE1ldGFNb2RlbC5lbHNlU3RtdFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaWZTdG10TWV0YU1vZGVsLnRoZW5TdG10UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoaWZTdG10TWV0YU1vZGVsLCAidGhlblN0bXQiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBpZlN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoaWZTdG10TWV0YU1vZGVsLnRoZW5TdG10UHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpZlN0bXRNZXRhTW9kZWwuY2FzY2FkaW5nSWZTdG10UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoaWZTdG10TWV0YU1vZGVsLCAiY2FzY2FkaW5nSWZTdG10IiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaWZTdG10TWV0YU1vZGVsLmdldERlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoaWZTdG10TWV0YU1vZGVsLmNhc2NhZGluZ0lmU3RtdFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgaWZTdG10TWV0YU1vZGVsLmVsc2VCbG9ja1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGlmU3RtdE1ldGFNb2RlbCwgImVsc2VCbG9jayIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmU3RtdE1ldGFNb2RlbC5nZXREZXJpdmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGlmU3RtdE1ldGFNb2RlbC5lbHNlQmxvY2tQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGlmU3RtdE1ldGFNb2RlbC5lbHNlQnJhbmNoUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoaWZTdG10TWV0YU1vZGVsLCAiZWxzZUJyYW5jaCIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmU3RtdE1ldGFNb2RlbC5nZXREZXJpdmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGlmU3RtdE1ldGFNb2RlbC5lbHNlQnJhbmNoUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBpZlN0bXRNZXRhTW9kZWwudGhlbkJsb2NrUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoaWZTdG10TWV0YU1vZGVsLCAidGhlbkJsb2NrIiwgYm9vbGVhbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaWZTdG10TWV0YU1vZGVsLmdldERlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoaWZTdG10TWV0YU1vZGVsLnRoZW5CbG9ja1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFiZWxlZFN0bXRNZXRhTW9kZWwubGFiZWxQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChsYWJlbGVkU3RtdE1ldGFNb2RlbCwgImxhYmVsIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKHNpbXBsZU5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBsYWJlbGVkU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChsYWJlbGVkU3RtdE1ldGFNb2RlbC5sYWJlbFByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbGFiZWxlZFN0bXRNZXRhTW9kZWwuc3RhdGVtZW50UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobGFiZWxlZFN0bXRNZXRhTW9kZWwsICJzdGF0ZW1lbnQiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBsYWJlbGVkU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChsYWJlbGVkU3RtdE1ldGFNb2RlbC5zdGF0ZW1lbnRQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHJldHVyblN0bXRNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHJldHVyblN0bXRNZXRhTW9kZWwsICJleHByZXNzaW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHJldHVyblN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQocmV0dXJuU3RtdE1ldGFNb2RlbC5leHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwubGFiZWxQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwsICJsYWJlbCIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoc3dpdGNoRW50cnlTdG10TWV0YU1vZGVsLmxhYmVsUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwuc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbCwgInN0YXRlbWVudHMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50LmNsYXNzLCBPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwuc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgc3dpdGNoU3RtdE1ldGFNb2RlbC5lbnRyaWVzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoc3dpdGNoU3RtdE1ldGFNb2RlbCwgImVudHJpZXMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmNsYXNzLCBPcHRpb25hbC5vZihzd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN3aXRjaFN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoc3dpdGNoU3RtdE1ldGFNb2RlbC5lbnRyaWVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBzd2l0Y2hTdG10TWV0YU1vZGVsLnNlbGVjdG9yUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoc3dpdGNoU3RtdE1ldGFNb2RlbCwgInNlbGVjdG9yIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBzd2l0Y2hTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHN3aXRjaFN0bXRNZXRhTW9kZWwuc2VsZWN0b3JQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwsICJib2R5IiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5jbGFzcywgT3B0aW9uYWwub2YoYmxvY2tTdG10TWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgc3luY2hyb25pemVkU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChzeW5jaHJvbml6ZWRTdG10TWV0YU1vZGVsLmJvZHlQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwsICJleHByZXNzaW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBzeW5jaHJvbml6ZWRTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwuZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdGhyb3dTdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh0aHJvd1N0bXRNZXRhTW9kZWwsICJleHByZXNzaW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0aHJvd1N0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodGhyb3dTdG10TWV0YU1vZGVsLmV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHRyeVN0bXRNZXRhTW9kZWwuY2F0Y2hDbGF1c2VzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodHJ5U3RtdE1ldGFNb2RlbCwgImNhdGNoQ2xhdXNlcyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5jbGFzcywgT3B0aW9uYWwub2YoY2F0Y2hDbGF1c2VNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRyeVN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodHJ5U3RtdE1ldGFNb2RlbC5jYXRjaENsYXVzZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHRyeVN0bXRNZXRhTW9kZWwuZmluYWxseUJsb2NrUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodHJ5U3RtdE1ldGFNb2RlbCwgImZpbmFsbHlCbG9jayIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuY2xhc3MsIE9wdGlvbmFsLm9mKGJsb2NrU3RtdE1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdHJ5U3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh0cnlTdG10TWV0YU1vZGVsLmZpbmFsbHlCbG9ja1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHJ5U3RtdE1ldGFNb2RlbC5yZXNvdXJjZXNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh0cnlTdG10TWV0YU1vZGVsLCAicmVzb3VyY2VzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24uY2xhc3MsIE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRyeVN0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodHJ5U3RtdE1ldGFNb2RlbC5yZXNvdXJjZXNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHRyeVN0bXRNZXRhTW9kZWwudHJ5QmxvY2tQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh0cnlTdG10TWV0YU1vZGVsLCAidHJ5QmxvY2siLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmNsYXNzLCBPcHRpb25hbC5vZihibG9ja1N0bXRNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0cnlTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHRyeVN0bXRNZXRhTW9kZWwudHJ5QmxvY2tQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGxvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwuY2xhc3NEZWNsYXJhdGlvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGxvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwsICJjbGFzc0RlY2xhcmF0aW9uIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcywgT3B0aW9uYWwub2YoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChsb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsLmNsYXNzRGVjbGFyYXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHdoaWxlU3RtdE1ldGFNb2RlbC5ib2R5UHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwod2hpbGVTdG10TWV0YU1vZGVsLCAiYm9keSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQuY2xhc3MsIE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHdoaWxlU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh3aGlsZVN0bXRNZXRhTW9kZWwuYm9keVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgd2hpbGVTdG10TWV0YU1vZGVsLmNvbmRpdGlvblByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHdoaWxlU3RtdE1ldGFNb2RlbCwgImNvbmRpdGlvbiIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uLmNsYXNzLCBPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgd2hpbGVTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHdoaWxlU3RtdE1ldGFNb2RlbC5jb25kaXRpb25Qcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGFycmF5VHlwZU1ldGFNb2RlbC5jb21wb25lbnRUeXBlUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXJyYXlUeXBlTWV0YU1vZGVsLCAiY29tcG9uZW50VHlwZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgYXJyYXlUeXBlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGFycmF5VHlwZU1ldGFNb2RlbC5jb21wb25lbnRUeXBlUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBhcnJheVR5cGVNZXRhTW9kZWwub3JpZ2luUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoYXJyYXlUeXBlTWV0YU1vZGVsLCAib3JpZ2luIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5PcmlnaW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFycmF5VHlwZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChhcnJheVR5cGVNZXRhTW9kZWwub3JpZ2luUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKHNpbXBsZU5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5zY29wZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLCAic2NvcGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZU1ldGFNb2RlbC5zY29wZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwudHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLCAidHlwZUFyZ3VtZW50cyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLnR5cGVBcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLnVzaW5nRGlhbW9uZE9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwoY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwsICJ1c2luZ0RpYW1vbmRPcGVyYXRvciIsIGJvb2xlYW4uY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsLmdldERlcml2ZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQoY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwudXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIGludGVyc2VjdGlvblR5cGVNZXRhTW9kZWwuZWxlbWVudHNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChpbnRlcnNlY3Rpb25UeXBlTWV0YU1vZGVsLCAiZWxlbWVudHMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZS5jbGFzcywgT3B0aW9uYWwub2YocmVmZXJlbmNlVHlwZU1ldGFNb2RlbCksIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBpbnRlcnNlY3Rpb25UeXBlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKGludGVyc2VjdGlvblR5cGVNZXRhTW9kZWwuZWxlbWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHByaW1pdGl2ZVR5cGVNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHByaW1pdGl2ZVR5cGVNZXRhTW9kZWwsICJ0eXBlIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBwcmltaXRpdmVUeXBlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHByaW1pdGl2ZVR5cGVNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgdHlwZVBhcmFtZXRlck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwodHlwZVBhcmFtZXRlck1ldGFNb2RlbCwgIm5hbWUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZS5jbGFzcywgT3B0aW9uYWwub2Yoc2ltcGxlTmFtZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQodHlwZVBhcmFtZXRlck1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB0eXBlUGFyYW1ldGVyTWV0YU1vZGVsLnR5cGVCb3VuZFByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKHR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwsICJ0eXBlQm91bmQiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuY2xhc3MsIE9wdGlvbmFsLm9mKGNsYXNzT3JJbnRlcmZhY2VUeXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0eXBlUGFyYW1ldGVyTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwudHlwZUJvdW5kUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICB1bmlvblR5cGVNZXRhTW9kZWwuZWxlbWVudHNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh1bmlvblR5cGVNZXRhTW9kZWwsICJlbGVtZW50cyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlLmNsYXNzLCBPcHRpb25hbC5vZihyZWZlcmVuY2VUeXBlTWV0YU1vZGVsKSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHVuaW9uVHlwZU1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZCh1bmlvblR5cGVNZXRhTW9kZWwuZWxlbWVudHNQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHdpbGRjYXJkVHlwZU1ldGFNb2RlbC5leHRlbmRlZFR5cGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh3aWxkY2FyZFR5cGVNZXRhTW9kZWwsICJleHRlbmRlZFR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZS5jbGFzcywgT3B0aW9uYWwub2YocmVmZXJlbmNlVHlwZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgd2lsZGNhcmRUeXBlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHdpbGRjYXJkVHlwZU1ldGFNb2RlbC5leHRlbmRlZFR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIHdpbGRjYXJkVHlwZU1ldGFNb2RlbC5zdXBlclR5cGVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbCh3aWxkY2FyZFR5cGVNZXRhTW9kZWwsICJzdXBlclR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZS5jbGFzcywgT3B0aW9uYWwub2YocmVmZXJlbmNlVHlwZU1ldGFNb2RlbCksIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgd2lsZGNhcmRUeXBlTWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKHdpbGRjYXJkVHlwZU1ldGFNb2RlbC5zdXBlclR5cGVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgICAgIG1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbC5tb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwsICJtb2RpZmllcnMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwubW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbCwgIm5hbWUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZS5jbGFzcywgT3B0aW9uYWwub2YobmFtZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwubmFtZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWwubW9kdWxlTmFtZXNQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbCwgIm1vZHVsZU5hbWVzIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZUV4cG9ydHNTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1vZHVsZUV4cG9ydHNTdG10TWV0YU1vZGVsLm1vZHVsZU5hbWVzUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbC5uYW1lUHJvcGVydHlNZXRhTW9kZWwpOworICAgICAgICBtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbCwgInR5cGUiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5jbGFzcywgT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbC5nZXREZWNsYXJlZFByb3BlcnR5TWV0YU1vZGVscygpLmFkZChtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlUHJvdmlkZXNTdG10TWV0YU1vZGVsLndpdGhUeXBlc1Byb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbCwgIndpdGhUeXBlcyIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobW9kdWxlUHJvdmlkZXNTdG10TWV0YU1vZGVsLndpdGhUeXBlc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG1vZHVsZVVzZXNTdG10TWV0YU1vZGVsLCAidHlwZSIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmNsYXNzLCBPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwudHlwZVByb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsLm1vZHVsZU5hbWVzUHJvcGVydHlNZXRhTW9kZWwgPSBuZXcgUHJvcGVydHlNZXRhTW9kZWwobW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsLCAibW9kdWxlTmFtZXMiLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZS5jbGFzcywgT3B0aW9uYWwub2YobmFtZU1ldGFNb2RlbCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKG1vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbC5tb2R1bGVOYW1lc1Byb3BlcnR5TWV0YU1vZGVsKTsKKyAgICAgICAgbW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChtb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWwsICJuYW1lIiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsIE9wdGlvbmFsLm9mKG5hbWVNZXRhTW9kZWwpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBtb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWwuZ2V0RGVjbGFyZWRQcm9wZXJ0eU1ldGFNb2RlbHMoKS5hZGQobW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsLm5hbWVQcm9wZXJ0eU1ldGFNb2RlbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gZ2V0Tm9kZU1ldGFNb2RlbChDbGFzczw/IGV4dGVuZHMgTm9kZT4gYykgeworICAgICAgICBmb3IgKEJhc2VOb2RlTWV0YU1vZGVsIG5vZGVNZXRhTW9kZWwgOiBub2RlTWV0YU1vZGVscykgeworICAgICAgICAgICAgaWYgKG5vZGVNZXRhTW9kZWwuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCkuZXF1YWxzKGMuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5vZGVNZXRhTW9kZWwgbm9kZU1ldGFNb2RlbCA9IG5ldyBOb2RlTWV0YU1vZGVsKE9wdGlvbmFsLmVtcHR5KCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5RGVjbGFyYXRpb25NZXRhTW9kZWwgYm9keURlY2xhcmF0aW9uTWV0YU1vZGVsID0gbmV3IEJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENhbGxhYmxlRGVjbGFyYXRpb25NZXRhTW9kZWwgY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCA9IG5ldyBDYWxsYWJsZURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdGF0ZW1lbnRNZXRhTW9kZWwgc3RhdGVtZW50TWV0YU1vZGVsID0gbmV3IFN0YXRlbWVudE1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25NZXRhTW9kZWwgZXhwcmVzc2lvbk1ldGFNb2RlbCA9IG5ldyBFeHByZXNzaW9uTWV0YU1vZGVsKE9wdGlvbmFsLm9mKG5vZGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZU1ldGFNb2RlbCB0eXBlTWV0YU1vZGVsID0gbmV3IFR5cGVNZXRhTW9kZWwoT3B0aW9uYWwub2Yobm9kZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCBhbm5vdGF0aW9uRXhwck1ldGFNb2RlbCA9IG5ldyBBbm5vdGF0aW9uRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbCB0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwgPSBuZXcgVHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZWZlcmVuY2VUeXBlTWV0YU1vZGVsIHJlZmVyZW5jZVR5cGVNZXRhTW9kZWwgPSBuZXcgUmVmZXJlbmNlVHlwZU1ldGFNb2RlbChPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpdGVyYWxFeHByTWV0YU1vZGVsIGxpdGVyYWxFeHByTWV0YU1vZGVsID0gbmV3IExpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbCBsaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsID0gbmV3IExpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YobGl0ZXJhbEV4cHJNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHJNZXRhTW9kZWwgc3RyaW5nTGl0ZXJhbEV4cHJNZXRhTW9kZWwgPSBuZXcgU3RyaW5nTGl0ZXJhbEV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YobGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbCBtb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbCA9IG5ldyBNb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1vZHVsZVN0bXRNZXRhTW9kZWwgbW9kdWxlU3RtdE1ldGFNb2RlbCA9IG5ldyBNb2R1bGVTdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKG5vZGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsTWV0YU1vZGVsIGFycmF5Q3JlYXRpb25MZXZlbE1ldGFNb2RlbCA9IG5ldyBBcnJheUNyZWF0aW9uTGV2ZWxNZXRhTW9kZWwoT3B0aW9uYWwub2Yobm9kZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblVuaXRNZXRhTW9kZWwgY29tcGlsYXRpb25Vbml0TWV0YU1vZGVsID0gbmV3IENvbXBpbGF0aW9uVW5pdE1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbCBwYWNrYWdlRGVjbGFyYXRpb25NZXRhTW9kZWwgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsLm9mKG5vZGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uTWV0YU1vZGVsIGFubm90YXRpb25EZWNsYXJhdGlvbk1ldGFNb2RlbCA9IG5ldyBBbm5vdGF0aW9uRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWwub2YodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbk1ldGFNb2RlbCBhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25NZXRhTW9kZWwgPSBuZXcgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25NZXRhTW9kZWwgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uTWV0YU1vZGVsID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbC5vZih0eXBlRGVjbGFyYXRpb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbk1ldGFNb2RlbCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uTWV0YU1vZGVsID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWwub2YoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbCBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbCA9IG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbC5vZihib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW51bURlY2xhcmF0aW9uTWV0YU1vZGVsIGVudW1EZWNsYXJhdGlvbk1ldGFNb2RlbCA9IG5ldyBFbnVtRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWwub2YodHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpZWxkRGVjbGFyYXRpb25NZXRhTW9kZWwgZmllbGREZWNsYXJhdGlvbk1ldGFNb2RlbCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGJvZHlEZWNsYXJhdGlvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uTWV0YU1vZGVsIGluaXRpYWxpemVyRGVjbGFyYXRpb25NZXRhTW9kZWwgPSBuZXcgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbC5vZihib2R5RGVjbGFyYXRpb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwgbWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWwub2YoY2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJNZXRhTW9kZWwgcGFyYW1ldGVyTWV0YU1vZGVsID0gbmV3IFBhcmFtZXRlck1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsIHJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsID0gbmV3IFJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsKE9wdGlvbmFsLm9mKG5vZGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yTWV0YU1vZGVsIHZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwoT3B0aW9uYWwub2Yobm9kZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21tZW50TWV0YU1vZGVsIGNvbW1lbnRNZXRhTW9kZWwgPSBuZXcgQ29tbWVudE1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJsb2NrQ29tbWVudE1ldGFNb2RlbCBibG9ja0NvbW1lbnRNZXRhTW9kZWwgPSBuZXcgQmxvY2tDb21tZW50TWV0YU1vZGVsKE9wdGlvbmFsLm9mKGNvbW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YWRvY0NvbW1lbnRNZXRhTW9kZWwgamF2YWRvY0NvbW1lbnRNZXRhTW9kZWwgPSBuZXcgSmF2YWRvY0NvbW1lbnRNZXRhTW9kZWwoT3B0aW9uYWwub2YoY29tbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaW5lQ29tbWVudE1ldGFNb2RlbCBsaW5lQ29tbWVudE1ldGFNb2RlbCA9IG5ldyBMaW5lQ29tbWVudE1ldGFNb2RlbChPcHRpb25hbC5vZihjb21tZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycmF5QWNjZXNzRXhwck1ldGFNb2RlbCBhcnJheUFjY2Vzc0V4cHJNZXRhTW9kZWwgPSBuZXcgQXJyYXlBY2Nlc3NFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwgYXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwgPSBuZXcgQXJyYXlDcmVhdGlvbkV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbCBhcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbCA9IG5ldyBBcnJheUluaXRpYWxpemVyRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFzc2lnbkV4cHJNZXRhTW9kZWwgYXNzaWduRXhwck1ldGFNb2RlbCA9IG5ldyBBc3NpZ25FeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmluYXJ5RXhwck1ldGFNb2RlbCBiaW5hcnlFeHByTWV0YU1vZGVsID0gbmV3IEJpbmFyeUV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHJNZXRhTW9kZWwgYm9vbGVhbkxpdGVyYWxFeHByTWV0YU1vZGVsID0gbmV3IEJvb2xlYW5MaXRlcmFsRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihsaXRlcmFsRXhwck1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDYXN0RXhwck1ldGFNb2RlbCBjYXN0RXhwck1ldGFNb2RlbCA9IG5ldyBDYXN0RXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJMaXRlcmFsRXhwck1ldGFNb2RlbCBjaGFyTGl0ZXJhbEV4cHJNZXRhTW9kZWwgPSBuZXcgQ2hhckxpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NFeHByTWV0YU1vZGVsIGNsYXNzRXhwck1ldGFNb2RlbCA9IG5ldyBDbGFzc0V4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb25kaXRpb25hbEV4cHJNZXRhTW9kZWwgY29uZGl0aW9uYWxFeHByTWV0YU1vZGVsID0gbmV3IENvbmRpdGlvbmFsRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsIGRvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsID0gbmV3IERvdWJsZUxpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5jbG9zZWRFeHByTWV0YU1vZGVsIGVuY2xvc2VkRXhwck1ldGFNb2RlbCA9IG5ldyBFbmNsb3NlZEV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGaWVsZEFjY2Vzc0V4cHJNZXRhTW9kZWwgZmllbGRBY2Nlc3NFeHByTWV0YU1vZGVsID0gbmV3IEZpZWxkQWNjZXNzRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEluc3RhbmNlT2ZFeHByTWV0YU1vZGVsIGluc3RhbmNlT2ZFeHByTWV0YU1vZGVsID0gbmV3IEluc3RhbmNlT2ZFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlckxpdGVyYWxFeHByTWV0YU1vZGVsIGludGVnZXJMaXRlcmFsRXhwck1ldGFNb2RlbCA9IG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YobGl0ZXJhbFN0cmluZ1ZhbHVlRXhwck1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMYW1iZGFFeHByTWV0YU1vZGVsIGxhbWJkYUV4cHJNZXRhTW9kZWwgPSBuZXcgTGFtYmRhRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdMaXRlcmFsRXhwck1ldGFNb2RlbCBsb25nTGl0ZXJhbEV4cHJNZXRhTW9kZWwgPSBuZXcgTG9uZ0xpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGxpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwgbWFya2VyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwgPSBuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoYW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsIG1lbWJlclZhbHVlUGFpck1ldGFNb2RlbCA9IG5ldyBNZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwoT3B0aW9uYWwub2Yobm9kZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsRXhwck1ldGFNb2RlbCBtZXRob2RDYWxsRXhwck1ldGFNb2RlbCA9IG5ldyBNZXRob2RDYWxsRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwgbWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbCA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmFtZUV4cHJNZXRhTW9kZWwgbmFtZUV4cHJNZXRhTW9kZWwgPSBuZXcgTmFtZUV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lTWV0YU1vZGVsIG5hbWVNZXRhTW9kZWwgPSBuZXcgTmFtZU1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsIG5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsID0gbmV3IE5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGFubm90YXRpb25FeHByTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE51bGxMaXRlcmFsRXhwck1ldGFNb2RlbCBudWxsTGl0ZXJhbEV4cHJNZXRhTW9kZWwgPSBuZXcgTnVsbExpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGxpdGVyYWxFeHByTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbCBvYmplY3RDcmVhdGlvbkV4cHJNZXRhTW9kZWwgPSBuZXcgT2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlTmFtZU1ldGFNb2RlbCBzaW1wbGVOYW1lTWV0YU1vZGVsID0gbmV3IFNpbXBsZU5hbWVNZXRhTW9kZWwoT3B0aW9uYWwub2Yobm9kZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihhbm5vdGF0aW9uRXhwck1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdXBlckV4cHJNZXRhTW9kZWwgc3VwZXJFeHByTWV0YU1vZGVsID0gbmV3IFN1cGVyRXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRoaXNFeHByTWV0YU1vZGVsIHRoaXNFeHByTWV0YU1vZGVsID0gbmV3IFRoaXNFeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUV4cHJNZXRhTW9kZWwgdHlwZUV4cHJNZXRhTW9kZWwgPSBuZXcgVHlwZUV4cHJNZXRhTW9kZWwoT3B0aW9uYWwub2YoZXhwcmVzc2lvbk1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmFyeUV4cHJNZXRhTW9kZWwgdW5hcnlFeHByTWV0YU1vZGVsID0gbmV3IFVuYXJ5RXhwck1ldGFNb2RlbChPcHRpb25hbC5vZihleHByZXNzaW9uTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsLm9mKGV4cHJlc3Npb25NZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwgaW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwgPSBuZXcgSW1wb3J0RGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWwub2Yobm9kZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NlcnRTdG10TWV0YU1vZGVsIGFzc2VydFN0bXRNZXRhTW9kZWwgPSBuZXcgQXNzZXJ0U3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmxvY2tTdG10TWV0YU1vZGVsIGJsb2NrU3RtdE1ldGFNb2RlbCA9IG5ldyBCbG9ja1N0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJyZWFrU3RtdE1ldGFNb2RlbCBicmVha1N0bXRNZXRhTW9kZWwgPSBuZXcgQnJlYWtTdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDYXRjaENsYXVzZU1ldGFNb2RlbCBjYXRjaENsYXVzZU1ldGFNb2RlbCA9IG5ldyBDYXRjaENsYXVzZU1ldGFNb2RlbChPcHRpb25hbC5vZihub2RlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbnRpbnVlU3RtdE1ldGFNb2RlbCBjb250aW51ZVN0bXRNZXRhTW9kZWwgPSBuZXcgQ29udGludWVTdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEb1N0bXRNZXRhTW9kZWwgZG9TdG10TWV0YU1vZGVsID0gbmV3IERvU3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW1wdHlTdG10TWV0YU1vZGVsIGVtcHR5U3RtdE1ldGFNb2RlbCA9IG5ldyBFbXB0eVN0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdE1ldGFNb2RlbCBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXRNZXRhTW9kZWwgPSBuZXcgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uU3RtdE1ldGFNb2RlbCBleHByZXNzaW9uU3RtdE1ldGFNb2RlbCA9IG5ldyBFeHByZXNzaW9uU3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRm9yZWFjaFN0bXRNZXRhTW9kZWwgZm9yZWFjaFN0bXRNZXRhTW9kZWwgPSBuZXcgRm9yZWFjaFN0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZvclN0bXRNZXRhTW9kZWwgZm9yU3RtdE1ldGFNb2RlbCA9IG5ldyBGb3JTdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJZlN0bXRNZXRhTW9kZWwgaWZTdG10TWV0YU1vZGVsID0gbmV3IElmU3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGFiZWxlZFN0bXRNZXRhTW9kZWwgbGFiZWxlZFN0bXRNZXRhTW9kZWwgPSBuZXcgTGFiZWxlZFN0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJldHVyblN0bXRNZXRhTW9kZWwgcmV0dXJuU3RtdE1ldGFNb2RlbCA9IG5ldyBSZXR1cm5TdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTd2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwgc3dpdGNoRW50cnlTdG10TWV0YU1vZGVsID0gbmV3IFN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3dpdGNoU3RtdE1ldGFNb2RlbCBzd2l0Y2hTdG10TWV0YU1vZGVsID0gbmV3IFN3aXRjaFN0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwgc3luY2hyb25pemVkU3RtdE1ldGFNb2RlbCA9IG5ldyBTeW5jaHJvbml6ZWRTdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaHJvd1N0bXRNZXRhTW9kZWwgdGhyb3dTdG10TWV0YU1vZGVsID0gbmV3IFRocm93U3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHJ5U3RtdE1ldGFNb2RlbCB0cnlTdG10TWV0YU1vZGVsID0gbmV3IFRyeVN0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwgbG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdE1ldGFNb2RlbCA9IG5ldyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKHN0YXRlbWVudE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBXaGlsZVN0bXRNZXRhTW9kZWwgd2hpbGVTdG10TWV0YU1vZGVsID0gbmV3IFdoaWxlU3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihzdGF0ZW1lbnRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVW5wYXJzYWJsZVN0bXRNZXRhTW9kZWwgdW5wYXJzYWJsZVN0bXRNZXRhTW9kZWwgPSBuZXcgVW5wYXJzYWJsZVN0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2Yoc3RhdGVtZW50TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycmF5VHlwZU1ldGFNb2RlbCBhcnJheVR5cGVNZXRhTW9kZWwgPSBuZXcgQXJyYXlUeXBlTWV0YU1vZGVsKE9wdGlvbmFsLm9mKHJlZmVyZW5jZVR5cGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwgY2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwgPSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGVNZXRhTW9kZWwoT3B0aW9uYWwub2YocmVmZXJlbmNlVHlwZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlcnNlY3Rpb25UeXBlTWV0YU1vZGVsIGludGVyc2VjdGlvblR5cGVNZXRhTW9kZWwgPSBuZXcgSW50ZXJzZWN0aW9uVHlwZU1ldGFNb2RlbChPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByaW1pdGl2ZVR5cGVNZXRhTW9kZWwgcHJpbWl0aXZlVHlwZU1ldGFNb2RlbCA9IG5ldyBQcmltaXRpdmVUeXBlTWV0YU1vZGVsKE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVBhcmFtZXRlck1ldGFNb2RlbCB0eXBlUGFyYW1ldGVyTWV0YU1vZGVsID0gbmV3IFR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwoT3B0aW9uYWwub2YocmVmZXJlbmNlVHlwZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVbmlvblR5cGVNZXRhTW9kZWwgdW5pb25UeXBlTWV0YU1vZGVsID0gbmV3IFVuaW9uVHlwZU1ldGFNb2RlbChPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVua25vd25UeXBlTWV0YU1vZGVsIHVua25vd25UeXBlTWV0YU1vZGVsID0gbmV3IFVua25vd25UeXBlTWV0YU1vZGVsKE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVm9pZFR5cGVNZXRhTW9kZWwgdm9pZFR5cGVNZXRhTW9kZWwgPSBuZXcgVm9pZFR5cGVNZXRhTW9kZWwoT3B0aW9uYWwub2YodHlwZU1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBXaWxkY2FyZFR5cGVNZXRhTW9kZWwgd2lsZGNhcmRUeXBlTWV0YU1vZGVsID0gbmV3IFdpbGRjYXJkVHlwZU1ldGFNb2RlbChPcHRpb25hbC5vZih0eXBlTWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZhclR5cGVNZXRhTW9kZWwgdmFyVHlwZU1ldGFNb2RlbCA9IG5ldyBWYXJUeXBlTWV0YU1vZGVsKE9wdGlvbmFsLm9mKHR5cGVNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTW9kdWxlUmVxdWlyZXNTdG10TWV0YU1vZGVsIG1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbCA9IG5ldyBNb2R1bGVSZXF1aXJlc1N0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2YobW9kdWxlU3RtdE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbCBtb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbCA9IG5ldyBNb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihtb2R1bGVTdG10TWV0YU1vZGVsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbCBtb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwgPSBuZXcgTW9kdWxlUHJvdmlkZXNTdG10TWV0YU1vZGVsKE9wdGlvbmFsLm9mKG1vZHVsZVN0bXRNZXRhTW9kZWwpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwgbW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwgPSBuZXcgTW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwoT3B0aW9uYWwub2YobW9kdWxlU3RtdE1ldGFNb2RlbCkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNb2R1bGVPcGVuc1N0bXRNZXRhTW9kZWwgbW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsID0gbmV3IE1vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbChPcHRpb25hbC5vZihtb2R1bGVTdG10TWV0YU1vZGVsKSk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbml0aWFsaXplTm9kZU1ldGFNb2RlbHMoKTsKKyAgICAgICAgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVscygpOworICAgICAgICBpbml0aWFsaXplQ29uc3RydWN0b3JQYXJhbWV0ZXJzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9KYXZhZG9jQ29tbWVudE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9KYXZhZG9jQ29tbWVudE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTIwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0phdmFkb2NDb21tZW50TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgSmF2YWRvY0NvbW1lbnRNZXRhTW9kZWwgZXh0ZW5kcyBDb21tZW50TWV0YU1vZGVsIHsKKworICAgIEphdmFkb2NDb21tZW50TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQuY2xhc3MsICJKYXZhZG9jQ29tbWVudCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xhYmVsZWRTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xhYmVsZWRTdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1MzJlZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTGFiZWxlZFN0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBMYWJlbGVkU3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBMYWJlbGVkU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQuY2xhc3MsICJMYWJlbGVkU3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBsYWJlbFByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHN0YXRlbWVudFByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9MYW1iZGFFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xhbWJkYUV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDUwYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9MYW1iZGFFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTGFtYmRhRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgTGFtYmRhRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5jbGFzcywgIkxhbWJkYUV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYm9keVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGlzRW5jbG9zaW5nUGFyYW1ldGVyc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHBhcmFtZXRlcnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBleHByZXNzaW9uQm9keVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9MaW5lQ29tbWVudE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9MaW5lQ29tbWVudE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzhiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xpbmVDb21tZW50TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTGluZUNvbW1lbnRNZXRhTW9kZWwgZXh0ZW5kcyBDb21tZW50TWV0YU1vZGVsIHsKKworICAgIExpbmVDb21tZW50TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQuY2xhc3MsICJMaW5lQ29tbWVudCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmOWZjZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitwdWJsaWMgY2xhc3MgTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIExpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsRXhwci5jbGFzcywgIkxpdGVyYWxFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGl0ZXJhbEV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyTm9kZU1ldGFNb2RlbCwgQ2xhc3M8PyBleHRlbmRzIE5vZGU+IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICBzdXBlcihzdXBlck5vZGVNZXRhTW9kZWwsIHR5cGUsIG5hbWUsIHBhY2thZ2VOYW1lLCBpc0Fic3RyYWN0LCBoYXNXaWxkY2FyZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9MaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ4NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9MaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworcHVibGljIGNsYXNzIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBMaXRlcmFsRXhwck1ldGFNb2RlbCB7CisKKyAgICBMaXRlcmFsU3RyaW5nVmFsdWVFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsU3RyaW5nVmFsdWVFeHByLmNsYXNzLCAiTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyTm9kZU1ldGFNb2RlbCwgQ2xhc3M8PyBleHRlbmRzIE5vZGU+IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICBzdXBlcihzdXBlck5vZGVNZXRhTW9kZWwsIHR5cGUsIG5hbWUsIHBhY2thZ2VOYW1lLCBpc0Fic3RyYWN0LCBoYXNXaWxkY2FyZCk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHZhbHVlUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzZlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQuY2xhc3MsICJMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNsYXNzRGVjbGFyYXRpb25Qcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTG9uZ0xpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xvbmdMaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDA2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0xvbmdMaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIExvbmdMaXRlcmFsRXhwck1ldGFNb2RlbCBleHRlbmRzIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwgeworCisgICAgTG9uZ0xpdGVyYWxFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHIuY2xhc3MsICJMb25nTGl0ZXJhbEV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01hcmtlckFubm90YXRpb25FeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01hcmtlckFubm90YXRpb25FeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3MWI1MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWFya2VyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBNYXJrZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCBleHRlbmRzIEFubm90YXRpb25FeHByTWV0YU1vZGVsIHsKKworICAgIE1hcmtlckFubm90YXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwci5jbGFzcywgIk1hcmtlckFubm90YXRpb25FeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9NZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyMTgxOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTWVtYmVyVmFsdWVQYWlyTWV0YU1vZGVsIGV4dGVuZHMgTm9kZU1ldGFNb2RlbCB7CisKKyAgICBNZW1iZXJWYWx1ZVBhaXJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5jbGFzcywgIk1lbWJlclZhbHVlUGFpciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdmFsdWVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWV0aG9kQ2FsbEV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg0MDdjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9NZXRob2RDYWxsRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE1ldGhvZENhbGxFeHByTWV0YU1vZGVsIGV4dGVuZHMgRXhwcmVzc2lvbk1ldGFNb2RlbCB7CisKKyAgICBNZXRob2RDYWxsRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuY2xhc3MsICJNZXRob2RDYWxsRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBhcmd1bWVudHNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlQXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdXNpbmdEaWFtb25kT3BlcmF0b3JQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTWV0aG9kRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFhZWFlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9NZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE1ldGhvZERlY2xhcmF0aW9uTWV0YU1vZGVsIGV4dGVuZHMgQ2FsbGFibGVEZWNsYXJhdGlvbk1ldGFNb2RlbCB7CisKKyAgICBNZXRob2REZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsICJNZXRob2REZWNsYXJhdGlvbiIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBib2R5UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9NZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01ldGhvZFJlZmVyZW5jZUV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY4MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9NZXRob2RSZWZlcmVuY2VFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgTWV0aG9kUmVmZXJlbmNlRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5jbGFzcywgIk1ldGhvZFJlZmVyZW5jZUV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaWRlbnRpZmllclByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHNjb3BlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHVzaW5nRGlhbW9uZE9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmM2MzZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBNb2R1bGVEZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgTW9kdWxlRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLk1vZHVsZURlY2xhcmF0aW9uLmNsYXNzLCAiTW9kdWxlRGVjbGFyYXRpb24iLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpc09wZW5Qcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBtb2R1bGVTdG10c1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTW9kdWxlRXhwb3J0c1N0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZhZjdlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Nb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE1vZHVsZUV4cG9ydHNTdG10TWV0YU1vZGVsIGV4dGVuZHMgTW9kdWxlU3RtdE1ldGFNb2RlbCB7CisKKyAgICBNb2R1bGVFeHBvcnRzU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuTW9kdWxlRXhwb3J0c1N0bXQuY2xhc3MsICJNb2R1bGVFeHBvcnRzU3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBtb2R1bGVOYW1lc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTVhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE1vZHVsZU9wZW5zU3RtdE1ldGFNb2RlbCBleHRlbmRzIE1vZHVsZVN0bXRNZXRhTW9kZWwgeworCisgICAgTW9kdWxlT3BlbnNTdG10TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy5Nb2R1bGVPcGVuc1N0bXQuY2xhc3MsICJNb2R1bGVPcGVuc1N0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbW9kdWxlTmFtZXNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Nb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNiZmZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Nb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBNb2R1bGVQcm92aWRlc1N0bXRNZXRhTW9kZWwgZXh0ZW5kcyBNb2R1bGVTdG10TWV0YU1vZGVsIHsKKworICAgIE1vZHVsZVByb3ZpZGVzU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuTW9kdWxlUHJvdmlkZXNTdG10LmNsYXNzLCAiTW9kdWxlUHJvdmlkZXNTdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcyIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHR5cGVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB3aXRoVHlwZXNQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTW9kdWxlUmVxdWlyZXNTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGE4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE1vZHVsZVJlcXVpcmVzU3RtdE1ldGFNb2RlbCBleHRlbmRzIE1vZHVsZVN0bXRNZXRhTW9kZWwgeworCisgICAgTW9kdWxlUmVxdWlyZXNTdG10TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcy5Nb2R1bGVSZXF1aXJlc1N0bXQuY2xhc3MsICJNb2R1bGVSZXF1aXJlc1N0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbW9kaWZpZXJzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Nb2R1bGVTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZVN0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2NhMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Nb2R1bGVTdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworcHVibGljIGNsYXNzIE1vZHVsZVN0bXRNZXRhTW9kZWwgZXh0ZW5kcyBOb2RlTWV0YU1vZGVsIHsKKworICAgIE1vZHVsZVN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLk1vZHVsZVN0bXQuY2xhc3MsICJNb2R1bGVTdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QubW9kdWxlcyIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTW9kdWxlU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHN1cGVyKHN1cGVyTm9kZU1ldGFNb2RlbCwgdHlwZSwgbmFtZSwgcGFja2FnZU5hbWUsIGlzQWJzdHJhY3QsIGhhc1dpbGRjYXJkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZVVzZXNTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL01vZHVsZVVzZXNTdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjOTA0MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBNb2R1bGVVc2VzU3RtdE1ldGFNb2RlbCBleHRlbmRzIE1vZHVsZVN0bXRNZXRhTW9kZWwgeworCisgICAgTW9kdWxlVXNlc1N0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLk1vZHVsZVVzZXNTdG10LmNsYXNzLCAiTW9kdWxlVXNlc1N0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9OYW1lRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9OYW1lRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDI5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL05hbWVFeHByTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTmFtZUV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIE5hbWVFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5jbGFzcywgIk5hbWVFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTmFtZU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9OYW1lTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1NDA4NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTmFtZU1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE5hbWVNZXRhTW9kZWwgZXh0ZW5kcyBOb2RlTWV0YU1vZGVsIHsKKworICAgIE5hbWVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuY2xhc3MsICJOYW1lIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgaWRlbnRpZmllclByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHF1YWxpZmllclByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Ob2RlTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL05vZGVNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzJkZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Ob2RlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworcHVibGljIGNsYXNzIE5vZGVNZXRhTW9kZWwgZXh0ZW5kcyBCYXNlTm9kZU1ldGFNb2RlbCB7CisKKyAgICBOb2RlTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5jbGFzcywgIk5vZGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdCIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTm9kZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHN1cGVyKHN1cGVyTm9kZU1ldGFNb2RlbCwgdHlwZSwgbmFtZSwgcGFja2FnZU5hbWUsIGlzQWJzdHJhY3QsIGhhc1dpbGRjYXJkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgY29tbWVudFByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Ob25FbXB0eVByb3BlcnR5LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL05vbkVtcHR5UHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU3ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Ob25FbXB0eVByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBJbmRpY2F0ZSB0aGF0IGxlYXZpbmcgdGhpcyBwcm9wZXJ0eSBlbXB0eSBkb2VzIG5vdCBsZWFkIHRvIGEgY29ycmVjdCBBU1QuCisgKiBFbXB0eSBtZWFucyBlaXRoZXIgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGNvbGxlY3Rpb24uCisgKiAoVXNlZCBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgbWV0YSBtb2RlbC4pCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoe0ZJRUxELCBNRVRIT0R9KQorcHVibGljIEBpbnRlcmZhY2UgTm9uRW1wdHlQcm9wZXJ0eSB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL05vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL05vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4YTc3NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvTm9ybWFsQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBOb3JtYWxBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCBleHRlbmRzIEFubm90YXRpb25FeHByTWV0YU1vZGVsIHsKKworICAgIE5vcm1hbEFubm90YXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwci5jbGFzcywgIk5vcm1hbEFubm90YXRpb25FeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHBhaXJzUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL051bGxMaXRlcmFsRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9OdWxsTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OThmYjMwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9OdWxsTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBOdWxsTGl0ZXJhbEV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBMaXRlcmFsRXhwck1ldGFNb2RlbCB7CisKKyAgICBOdWxsTGl0ZXJhbEV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk51bGxMaXRlcmFsRXhwci5jbGFzcywgIk51bGxMaXRlcmFsRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvT2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL09iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDlkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL09iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIE9iamVjdENyZWF0aW9uRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgT2JqZWN0Q3JlYXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuY2xhc3MsICJPYmplY3RDcmVhdGlvbkV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYW5vbnltb3VzQ2xhc3NCb2R5UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYXJndW1lbnRzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgc2NvcGVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZUFyZ3VtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHVzaW5nRGlhbW9uZE9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL09wdGlvbmFsUHJvcGVydHkuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvT3B0aW9uYWxQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTJlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL09wdGlvbmFsUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBJbmRpY2F0ZSBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiBhIE5vZGUuCisgKiAoVXNlZCBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgbWV0YSBtb2RlbC4pCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoRklFTEQpCitwdWJsaWMgQGludGVyZmFjZSBPcHRpb25hbFByb3BlcnR5IHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvUGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1BhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTUyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1BhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFBhY2thZ2VEZWNsYXJhdGlvbk1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgUGFja2FnZURlY2xhcmF0aW9uTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzLCAiUGFja2FnZURlY2xhcmF0aW9uIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBhbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvUGFyYW1ldGVyTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1BhcmFtZXRlck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNGI1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1BhcmFtZXRlck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFBhcmFtZXRlck1ldGFNb2RlbCBleHRlbmRzIE5vZGVNZXRhTW9kZWwgeworCisgICAgUGFyYW1ldGVyTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuY2xhc3MsICJQYXJhbWV0ZXIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpc1ZhckFyZ3NQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBtb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHZhckFyZ3NBbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9QcmltaXRpdmVUeXBlTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1ByaW1pdGl2ZVR5cGVNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVlMjhjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9QcmltaXRpdmVUeXBlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgUHJpbWl0aXZlVHlwZU1ldGFNb2RlbCBleHRlbmRzIFR5cGVNZXRhTW9kZWwgeworCisgICAgUHJpbWl0aXZlVHlwZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5jbGFzcywgIlByaW1pdGl2ZVR5cGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Qcm9wZXJ0eU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Qcm9wZXJ0eU1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkY2Y0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1Byb3BlcnR5TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwyNDggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5nZXR0ZXJOYW1lOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5zZXR0ZXJOYW1lOworCisvKioKKyAqIE1ldGEtZGF0YSBhYm91dCBhIHByb3BlcnR5IG9mIGEgbm9kZSBpbiB0aGUgQVNULgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlNZXRhTW9kZWwgeworICAgIHByaXZhdGUgZmluYWwgQmFzZU5vZGVNZXRhTW9kZWwgY29udGFpbmluZ05vZGVNZXRhTW9kZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gbm9kZVJlZmVyZW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNPcHRpb25hbDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNOb25FbXB0eTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNOb2RlTGlzdDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbnVtU2V0OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNXaWxkY2FyZDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbChCYXNlTm9kZU1ldGFNb2RlbCBjb250YWluaW5nTm9kZU1ldGFNb2RlbCwgU3RyaW5nIG5hbWUsIENsYXNzPD8+IHR5cGUsIE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBub2RlUmVmZXJlbmNlLCBib29sZWFuIGlzT3B0aW9uYWwsIGJvb2xlYW4gaXNOb25FbXB0eSwgYm9vbGVhbiBpc05vZGVMaXN0LCBib29sZWFuIGlzRW51bVNldCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICB0aGlzLmNvbnRhaW5pbmdOb2RlTWV0YU1vZGVsID0gY29udGFpbmluZ05vZGVNZXRhTW9kZWw7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMubm9kZVJlZmVyZW5jZSA9IG5vZGVSZWZlcmVuY2U7CisgICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IGlzT3B0aW9uYWw7CisgICAgICAgIHRoaXMuaXNOb25FbXB0eSA9IGlzTm9uRW1wdHk7CisgICAgICAgIHRoaXMuaXNOb2RlTGlzdCA9IGlzTm9kZUxpc3Q7CisgICAgICAgIHRoaXMuaXNFbnVtU2V0ID0gaXNFbnVtU2V0OworICAgICAgICB0aGlzLmhhc1dpbGRjYXJkID0gaGFzV2lsZGNhcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBpcyB0aGlzIHRoZSBmaWVsZCBmaWVsZE5hbWUgb24gY2xhc3MgYz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpcyhDbGFzczw/IGV4dGVuZHMgTm9kZT4gYywgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICByZXR1cm4gY29udGFpbmluZ05vZGVNZXRhTW9kZWwuaXMoYykgJiYgbmFtZS5lcXVhbHMoZmllbGROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlzIHRoaXMgZmllbGRzIGNhbGxlZCBmaWVsZE5hbWU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXMoU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMoZmllbGROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHVzZWQgaW4gdGhlIEFTVCBmb3IgdGhlIHNldHRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTWV0aG9kTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHNldHRlck5hbWUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbmFtZSB1c2VkIGluIHRoZSBBU1QgZm9yIHRoZSBnZXR0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdldHRlck1ldGhvZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXR0ZXJOYW1lKHR5cGUsIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIE5vZGVNZXRhTW9kZWwgdGhhdCAiaGFzIiB0aGlzIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBCYXNlTm9kZU1ldGFNb2RlbCBnZXRDb250YWluaW5nTm9kZU1ldGFNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5pbmdOb2RlTWV0YU1vZGVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIGlzIGVxdWFsIHRvIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgQVNULgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBpZiB0aGlzIHByb3BlcnR5IGlzIGEgU3RyaW5nIG9yIGEgTm9kZUxpc3Q6IHdoZXRoZXIgaXQgbWF5IGJlIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTm9uRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBpc05vbkVtcHR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBpZiB0aGlzIHByb3BlcnR5IGlzIGEgTm9kZSwgdGhpcyB3aWxsIGdldCB0aGUgbm9kZSBtZXRhIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gZ2V0Tm9kZVJlZmVyZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5vZGVSZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKKyAgICAgICAgcmV0dXJuIGlzT3B0aW9uYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgbm90IG9wdGlvbmFsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7CisgICAgICAgIHJldHVybiAhaXNPcHRpb25hbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBjb250YWluZWQgaW4gYSBOb2RlTGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vZGVMaXN0KCkgeworICAgICAgICByZXR1cm4gaXNOb2RlTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBjb250YWluZWQgaW4gYW4gRW51bVNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW1TZXQoKSB7CisgICAgICAgIHJldHVybiBpc0VudW1TZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgcHJvcGVydHkgaGFzIGEgd2lsZGNhcmQgZm9sbG93aW5nIGl0LCBsaWtlIEJvZHlEZWNsYXJhdGlvbiZsdDs/Jmd0Oy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaWxkY2FyZCgpIHsKKyAgICAgICAgcmV0dXJuIGhhc1dpbGRjYXJkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ3VsYXIoKSB7CisgICAgICAgIHJldHVybiAhKGlzTm9kZUxpc3QgfHwgaXNFbnVtU2V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIigiICsgZ2V0VHlwZU5hbWUoKSArICIpXHQiICsgY29udGFpbmluZ05vZGVNZXRhTW9kZWwgKyAiIyIgKyBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFByb3BlcnR5TWV0YU1vZGVsIHRoYXQgPSAoUHJvcGVydHlNZXRhTW9kZWwpIG87CisKKyAgICAgICAgaWYgKCFuYW1lLmVxdWFscyh0aGF0Lm5hbWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdHlwZS5lcXVhbHModGhhdC50eXBlKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgdHlwZS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgYSBzaW5nbGUgZWxlbWVudCBvZiB0aGlzIHByb3BlcnR5LCBzbyBubyBPcHRpb25hbCBvciBOb2RlTGlzdCBvciBFbnVtU2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCkgeworICAgICAgICBpZiAoaGFzV2lsZGNhcmQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUeXBlTmFtZSgpICsgIjw/PiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGVOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcmF3IHR5cGUgb2YgYSBzaW5nbGUgZWxlbWVudCBvZiB0aGlzIHByb3BlcnR5LCBzbyBub3RoaW5nIGJ1dCB0aGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworICAgICAgICByZXR1cm4gdHlwZS5nZXRTaW1wbGVOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdHlwZSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0dGVycyBpbiB0aGUgQVNULgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVGb3JHZXR0ZXIoKSB7CisgICAgICAgIGlmIChpc09wdGlvbmFsKSB7CisgICAgICAgICAgICByZXR1cm4gIk9wdGlvbmFsPCIgKyBnZXRUeXBlTmFtZUZvclNldHRlcigpICsgIj4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlTmFtZUZvclNldHRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgdGhhdCBpcyBwYXNzZWQgdG8gc2V0dGVycyBpbiB0aGUgQVNULgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVGb3JTZXR0ZXIoKSB7CisgICAgICAgIGlmIChpc05vZGVMaXN0KSB7CisgICAgICAgICAgICByZXR1cm4gIk5vZGVMaXN0PCIgKyBnZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSArICI+IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNFbnVtU2V0KSB7CisgICAgICAgICAgICByZXR1cm4gIkVudW1TZXQ8IiArIGdldFR5cGVOYW1lR2VuZXJpZmllZCgpICsgIj4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlTmFtZUdlbmVyaWZpZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlzIHRoaXMgcHJvcGVydHkgYW4gQVNUIE5vZGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0Tm9kZVJlZmVyZW5jZSgpLmlzUHJlc2VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgY29udGFpbmluZyBCYXNlTm9kZU1ldGFNb2RlbCBmb3IgdGhpcyBwcm9wZXJ0eSBtZXRhIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0YU1vZGVsRmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0TmFtZSgpICsgIlByb3BlcnR5TWV0YU1vZGVsIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlzIHRoaXMgcHJvcGVydHkgYW4gYXR0cmlidXRlLCBtZWFuaW5nOiBub3QgYSBub2RlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlKCkgeworICAgICAgICByZXR1cm4gIWlzTm9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludHJvc3BlY3RzIHRoZSBub2RlIHRvIGdldCB0aGUgdmFsdWUgZnJvbSB0aGlzIGZpZWxkLgorICAgICAqIE5vdGUgdGhhdCBhbiBvcHRpb25hbCBlbXB0eSBmaWVsZCB3aWxsIHJldHVybiBudWxsIGhlcmUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gYyA9IG5vZGUuZ2V0Q2xhc3MoKTsgYyAhPSBudWxsOyBjID0gYy5nZXRTdXBlcmNsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEZpZWxkIGNsYXNzRmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRmllbGQuZ2V0TmFtZSgpLmVxdWFscyhnZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0ZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NGaWVsZC5nZXQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRmllbGRFcnJvcihnZXROYW1lKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9SZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9SZWNlaXZlclBhcmFtZXRlck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmI0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1JlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgUmVjZWl2ZXJQYXJhbWV0ZXJNZXRhTW9kZWwgZXh0ZW5kcyBOb2RlTWV0YU1vZGVsIHsKKworICAgIFJlY2VpdmVyUGFyYW1ldGVyTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5SZWNlaXZlclBhcmFtZXRlci5jbGFzcywgIlJlY2VpdmVyUGFyYW1ldGVyIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGFubm90YXRpb25zUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHR5cGVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvUmVmZXJlbmNlVHlwZU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9SZWZlcmVuY2VUeXBlTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzYxYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvUmVmZXJlbmNlVHlwZU1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK3B1YmxpYyBjbGFzcyBSZWZlcmVuY2VUeXBlTWV0YU1vZGVsIGV4dGVuZHMgVHlwZU1ldGFNb2RlbCB7CisKKyAgICBSZWZlcmVuY2VUeXBlTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlLmNsYXNzLCAiUmVmZXJlbmNlVHlwZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlZmVyZW5jZVR5cGVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyTm9kZU1ldGFNb2RlbCwgQ2xhc3M8PyBleHRlbmRzIE5vZGU+IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICBzdXBlcihzdXBlck5vZGVNZXRhTW9kZWwsIHR5cGUsIG5hbWUsIHBhY2thZ2VOYW1lLCBpc0Fic3RyYWN0LCBoYXNXaWxkY2FyZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9SZXR1cm5TdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1JldHVyblN0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmNWVjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9SZXR1cm5TdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgUmV0dXJuU3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBSZXR1cm5TdG10TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10LmNsYXNzLCAiUmV0dXJuU3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBleHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1NpbXBsZU5hbWVNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU2ltcGxlTmFtZU1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDQyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1NpbXBsZU5hbWVNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVOYW1lTWV0YU1vZGVsIGV4dGVuZHMgTm9kZU1ldGFNb2RlbCB7CisKKyAgICBTaW1wbGVOYW1lTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmNsYXNzLCAiU2ltcGxlTmFtZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBpZGVudGlmaWVyUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyMjNjZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwck1ldGFNb2RlbCBleHRlbmRzIEFubm90YXRpb25FeHByTWV0YU1vZGVsIHsKKworICAgIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci5jbGFzcywgIlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG1lbWJlclZhbHVlUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1N0YXRlbWVudE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9TdGF0ZW1lbnRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMzYWIwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9TdGF0ZW1lbnRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitwdWJsaWMgY2xhc3MgU3RhdGVtZW50TWV0YU1vZGVsIGV4dGVuZHMgTm9kZU1ldGFNb2RlbCB7CisKKyAgICBTdGF0ZW1lbnRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudC5jbGFzcywgIlN0YXRlbWVudCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHN1cGVyKHN1cGVyTm9kZU1ldGFNb2RlbCwgdHlwZSwgbmFtZSwgcGFja2FnZU5hbWUsIGlzQWJzdHJhY3QsIGhhc1dpbGRjYXJkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1N0cmluZ0xpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1N0cmluZ0xpdGVyYWxFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjMGFjZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU3RyaW5nTGl0ZXJhbEV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdMaXRlcmFsRXhwck1ldGFNb2RlbCBleHRlbmRzIExpdGVyYWxTdHJpbmdWYWx1ZUV4cHJNZXRhTW9kZWwgeworCisgICAgU3RyaW5nTGl0ZXJhbEV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmNsYXNzLCAiU3RyaW5nTGl0ZXJhbEV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1N1cGVyRXhwck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9TdXBlckV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDVkZjhiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9TdXBlckV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBTdXBlckV4cHJNZXRhTW9kZWwgZXh0ZW5kcyBFeHByZXNzaW9uTWV0YU1vZGVsIHsKKworICAgIFN1cGVyRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLmNsYXNzLCAiU3VwZXJFeHByIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwciIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNsYXNzRXhwclByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Td2l0Y2hFbnRyeVN0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU3dpdGNoRW50cnlTdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlNjI1MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU3dpdGNoRW50cnlTdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgU3dpdGNoRW50cnlTdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIFN3aXRjaEVudHJ5U3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmNsYXNzLCAiU3dpdGNoRW50cnlTdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGxhYmVsUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgc3RhdGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Td2l0Y2hTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1N3aXRjaFN0bXRNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlkZjBlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Td2l0Y2hTdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgU3dpdGNoU3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBTd2l0Y2hTdG10TWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LmNsYXNzLCAiU3dpdGNoU3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBlbnRyaWVzUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgc2VsZWN0b3JQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU3luY2hyb25pemVkU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9TeW5jaHJvbml6ZWRTdG10TWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhODcwOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvU3luY2hyb25pemVkU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgU3luY2hyb25pemVkU3RtdE1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5jbGFzcywgIlN5bmNocm9uaXplZFN0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYm9keVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGV4cHJlc3Npb25Qcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVGhpc0V4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVGhpc0V4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZkNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9UaGlzRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFRoaXNFeHByTWV0YU1vZGVsIGV4dGVuZHMgRXhwcmVzc2lvbk1ldGFNb2RlbCB7CisKKyAgICBUaGlzRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuY2xhc3MsICJUaGlzRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBjbGFzc0V4cHJQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVGhyb3dTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1Rocm93U3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmQyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1Rocm93U3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFRocm93U3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBUaHJvd1N0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdC5jbGFzcywgIlRocm93U3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBleHByZXNzaW9uUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1RyeVN0bXRNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVHJ5U3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzU2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1RyeVN0bXRNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBUcnlTdG10TWV0YU1vZGVsIGV4dGVuZHMgU3RhdGVtZW50TWV0YU1vZGVsIHsKKworICAgIFRyeVN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuY2xhc3MsICJUcnlTdG10IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGNhdGNoQ2xhdXNlc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGZpbmFsbHlCbG9ja1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHJlc291cmNlc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHRyeUJsb2NrUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1R5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9UeXBlRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YwZDAwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9UeXBlRGVjbGFyYXRpb25NZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitwdWJsaWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uTWV0YU1vZGVsIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uTWV0YU1vZGVsIHsKKworICAgIFR5cGVEZWNsYXJhdGlvbk1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmNsYXNzLCAiVHlwZURlY2xhcmF0aW9uIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keSIsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb25NZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyTm9kZU1ldGFNb2RlbCwgQ2xhc3M8PyBleHRlbmRzIE5vZGU+IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gaXNBYnN0cmFjdCwgYm9vbGVhbiBoYXNXaWxkY2FyZCkgeworICAgICAgICBzdXBlcihzdXBlck5vZGVNZXRhTW9kZWwsIHR5cGUsIG5hbWUsIHBhY2thZ2VOYW1lLCBpc0Fic3RyYWN0LCBoYXNXaWxkY2FyZCk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG1lbWJlcnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBtb2RpZmllcnNQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBuYW1lUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1R5cGVFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1R5cGVFeHByTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYjkwZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVHlwZUV4cHJNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBUeXBlRXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgVHlwZUV4cHJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByLmNsYXNzLCAiVHlwZUV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgdHlwZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9UeXBlTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1R5cGVNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmIwODRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9UeXBlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworcHVibGljIGNsYXNzIFR5cGVNZXRhTW9kZWwgZXh0ZW5kcyBOb2RlTWV0YU1vZGVsIHsKKworICAgIFR5cGVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuY2xhc3MsICJUeXBlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZSIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVHlwZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJOb2RlTWV0YU1vZGVsLCBDbGFzczw/IGV4dGVuZHMgTm9kZT4gdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBpc0Fic3RyYWN0LCBib29sZWFuIGhhc1dpbGRjYXJkKSB7CisgICAgICAgIHN1cGVyKHN1cGVyTm9kZU1ldGFNb2RlbCwgdHlwZSwgbmFtZSwgcGFja2FnZU5hbWUsIGlzQWJzdHJhY3QsIGhhc1dpbGRjYXJkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgYW5ub3RhdGlvbnNQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVHlwZVBhcmFtZXRlck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9UeXBlUGFyYW1ldGVyTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4NzQwMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVHlwZVBhcmFtZXRlck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwgZXh0ZW5kcyBSZWZlcmVuY2VUeXBlTWV0YU1vZGVsIHsKKworICAgIFR5cGVQYXJhbWV0ZXJNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuY2xhc3MsICJUeXBlUGFyYW1ldGVyIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG5hbWVQcm9wZXJ0eU1ldGFNb2RlbDsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCB0eXBlQm91bmRQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVW5hcnlFeHByTWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1VuYXJ5RXhwck1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOWFmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1VuYXJ5RXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFVuYXJ5RXhwck1ldGFNb2RlbCBleHRlbmRzIEV4cHJlc3Npb25NZXRhTW9kZWwgeworCisgICAgVW5hcnlFeHByTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuY2xhc3MsICJVbmFyeUV4cHIiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgZXhwcmVzc2lvblByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG9wZXJhdG9yUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgcG9zdGZpeFByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHByZWZpeFByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9VbmlvblR5cGVNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVW5pb25UeXBlTWV0YU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlODFiZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVW5pb25UeXBlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgVW5pb25UeXBlTWV0YU1vZGVsIGV4dGVuZHMgVHlwZU1ldGFNb2RlbCB7CisKKyAgICBVbmlvblR5cGVNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5jbGFzcywgIlVuaW9uVHlwZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBlbGVtZW50c1Byb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Vbmtub3duVHlwZU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Vbmtub3duVHlwZU1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzUxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1Vua25vd25UeXBlTWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgVW5rbm93blR5cGVNZXRhTW9kZWwgZXh0ZW5kcyBUeXBlTWV0YU1vZGVsIHsKKworICAgIFVua25vd25UeXBlTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZS5jbGFzcywgIlVua25vd25UeXBlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9VbnBhcnNhYmxlU3RtdE1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9VbnBhcnNhYmxlU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMThmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1VucGFyc2FibGVTdG10TWV0YU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgVW5wYXJzYWJsZVN0bXRNZXRhTW9kZWwgZXh0ZW5kcyBTdGF0ZW1lbnRNZXRhTW9kZWwgeworCisgICAgVW5wYXJzYWJsZVN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlVucGFyc2FibGVTdG10LmNsYXNzLCAiVW5wYXJzYWJsZVN0bXQiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10IiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1ZhclR5cGVNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVmFyVHlwZU1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGE4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1ZhclR5cGVNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBWYXJUeXBlTWV0YU1vZGVsIGV4dGVuZHMgVHlwZU1ldGFNb2RlbCB7CisKKyAgICBWYXJUeXBlTWV0YU1vZGVsKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlckJhc2VOb2RlTWV0YU1vZGVsKSB7CisgICAgICAgIHN1cGVyKHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5WYXJUeXBlLmNsYXNzLCAiVmFyVHlwZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMzMGMwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9WYXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByTWV0YU1vZGVsIGV4dGVuZHMgRXhwcmVzc2lvbk1ldGFNb2RlbCB7CisKKyAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuY2xhc3MsICJWYXJpYWJsZURlY2xhcmF0aW9uRXhwciIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBhbm5vdGF0aW9uc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG1vZGlmaWVyc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHZhcmlhYmxlc1Byb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIG1heGltdW1Db21tb25UeXBlUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1ZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9WYXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2YxMmFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9WYXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBWYXJpYWJsZURlY2xhcmF0b3JNZXRhTW9kZWwgZXh0ZW5kcyBOb2RlTWV0YU1vZGVsIHsKKworICAgIFZhcmlhYmxlRGVjbGFyYXRvck1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmNsYXNzLCAiVmFyaWFibGVEZWNsYXJhdG9yIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGluaXRpYWxpemVyUHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgbmFtZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHR5cGVQcm9wZXJ0eU1ldGFNb2RlbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVm9pZFR5cGVNZXRhTW9kZWwuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvVm9pZFR5cGVNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjkyZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Wb2lkVHlwZU1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFZvaWRUeXBlTWV0YU1vZGVsIGV4dGVuZHMgVHlwZU1ldGFNb2RlbCB7CisKKyAgICBWb2lkVHlwZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGUuY2xhc3MsICJWb2lkVHlwZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvV2hpbGVTdG10TWV0YU1vZGVsLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1doaWxlU3RtdE1ldGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYTEyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1doaWxlU3RtdE1ldGFNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworcHVibGljIGNsYXNzIFdoaWxlU3RtdE1ldGFNb2RlbCBleHRlbmRzIFN0YXRlbWVudE1ldGFNb2RlbCB7CisKKyAgICBXaGlsZVN0bXRNZXRhTW9kZWwoT3B0aW9uYWw8QmFzZU5vZGVNZXRhTW9kZWw+IHN1cGVyQmFzZU5vZGVNZXRhTW9kZWwpIHsKKyAgICAgICAgc3VwZXIoc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5jbGFzcywgIldoaWxlU3RtdCIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1ldGFNb2RlbCBib2R5UHJvcGVydHlNZXRhTW9kZWw7CisKKyAgICBwdWJsaWMgUHJvcGVydHlNZXRhTW9kZWwgY29uZGl0aW9uUHJvcGVydHlNZXRhTW9kZWw7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1dpbGRjYXJkVHlwZU1ldGFNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9XaWxkY2FyZFR5cGVNZXRhTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRiOWZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9XaWxkY2FyZFR5cGVNZXRhTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK3B1YmxpYyBjbGFzcyBXaWxkY2FyZFR5cGVNZXRhTW9kZWwgZXh0ZW5kcyBUeXBlTWV0YU1vZGVsIHsKKworICAgIFdpbGRjYXJkVHlwZU1ldGFNb2RlbChPcHRpb25hbDxCYXNlTm9kZU1ldGFNb2RlbD4gc3VwZXJCYXNlTm9kZU1ldGFNb2RlbCkgeworICAgICAgICBzdXBlcihzdXBlckJhc2VOb2RlTWV0YU1vZGVsLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLmNsYXNzLCAiV2lsZGNhcmRUeXBlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIGV4dGVuZGVkVHlwZVByb3BlcnR5TWV0YU1vZGVsOworCisgICAgcHVibGljIFByb3BlcnR5TWV0YU1vZGVsIHN1cGVyVHlwZVByb3BlcnR5TWV0YU1vZGVsOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvQ29uY3JldGVTeW50YXhNb2RlbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvQ29uY3JldGVTeW50YXhNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWVkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Db25jcmV0ZVN5bnRheE1vZGVsLmphdmEKQEAgLTAsMCArMSw5NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLkphdmFQYXJzZXJNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21Db25kaXRpb25hbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5jb25jcmV0ZXN5bnRheG1vZGVsLkNzbUVsZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21NaXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHkuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21Db25kaXRpb25hbC5Db25kaXRpb24uKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21FbGVtZW50Lio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CisKKy8qKgorICogVGhlIENvbmNyZXRlIFN5bnRheCBNb2RlbCBmb3IgYSBzaW5nbGUgbm9kZSB0eXBlLiBJdCBrbm93cyB0aGUgc3ludGF4IHVzZWQgdG8gcmVwcmVzZW50IGEgY2VydGFpbiBlbGVtZW50IGluIEphdmEKKyAqIGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25jcmV0ZVN5bnRheE1vZGVsIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgQ3NtRWxlbWVudD4gY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8U3RyaW5nPiBpbml0aWFsaXphdGlvbkVycm9yOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ3NtRWxlbWVudCBtb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5NT0RJRklFUlMsIHNwYWNlKCksIG5vbmUoKSwgc3BhY2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgYSBtaXggY29sbGVjdGluZyBhbGwgdGhlIGVsZW1lbnRzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDc21FbGVtZW50IG1peChDc21FbGVtZW50Li4uIGVsZW1lbnRzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtTWl4KEFycmF5cy5hc0xpc3QoZWxlbWVudHMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDc21FbGVtZW50IG1lbWJlckFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuQU5OT1RBVElPTlMsIG5ld2xpbmUoKSwgbm9uZSgpLCBuZXdsaW5lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENzbUVsZW1lbnQgYW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgc3BhY2UoKSwgbm9uZSgpLCBuZXdsaW5lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENzbUVsZW1lbnQgdHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFX1BBUkFNRVRFUlMsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5jb21tYSgpLCBDc21FbGVtZW50LnNwYWNlKCkpLCBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFQpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkdUKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ3NtRWxlbWVudCB0eXBlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRV9BUkdVTUVOVFMsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5jb21tYSgpLCBDc21FbGVtZW50LnNwYWNlKCkpLCBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFQpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkdUKSkpOworICAgIH0KKworICAgIHN0YXRpYyB7CisKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBCb2R5CisgICAgICAgIC8vLworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChBbm5vdGF0aW9uRGVjbGFyYXRpb24uY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgbWVtYmVyQW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5JTlRFUkZBQ0UpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihMQlJBQ0UpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuaW5kZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5saXN0KE9ic2VydmFibGVQcm9wZXJ0eS5NRU1CRVJTLCBDc21FbGVtZW50Lm5ld2xpbmUoKSwgQ3NtRWxlbWVudC5ub25lKCksIENzbUVsZW1lbnQubm9uZSgpLCBDc21FbGVtZW50Lm5ld2xpbmUoKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC51bmluZGVudCgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oUkJSQUNFKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29tbWVudCgpLAorICAgICAgICAgICAgICAgIG1lbWJlckFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKFJQQVJFTiksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuREVGQVVMVF9WQUxVRSwgSVNfUFJFU0VOVCwgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LnNwYWNlKCksIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5fREVGQVVMVCksIENzbUVsZW1lbnQuc3BhY2UoKSwgQ3NtRWxlbWVudC5jaGlsZChERUZBVUxUX1ZBTFVFKSkpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VtaWNvbG9uKCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LkFOTk9UQVRJT05TLCBuZXdsaW5lKCksIG5vbmUoKSwgbmV3bGluZSgpKSwKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuSU5URVJGQUNFLCBGTEFHLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklOVEVSRkFDRSksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQ0xBU1MpKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBsaXN0KFRZUEVfUEFSQU1FVEVSUywgc2VxdWVuY2UoY29tbWEoKSwgc3BhY2UoKSksIHN0cmluZyhHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxUKSwgc3RyaW5nKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuR1QpKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5FWFRFTkRFRF9UWVBFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKHN0cmluZyhHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkNPTU1BKSwgc3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZShzcGFjZSgpLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkVYVEVORFMpLCBzcGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbmUoKSksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuSU1QTEVNRU5URURfVFlQRVMsIHNlcXVlbmNlKHN0cmluZyhHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkNPTU1BKSwgc3BhY2UoKSksIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSU1QTEVNRU5UUyksCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSgpKSwgbm9uZSgpKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGJsb2NrKHNlcXVlbmNlKG5ld2xpbmUoKSwgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuTUVNQkVSUywgc2VxdWVuY2UobmV3bGluZSgpLCBuZXdsaW5lKCkpLCBDc21FbGVtZW50Lm5ld2xpbmUoKSwgbmV3bGluZSgpKSkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgbWVtYmVyQW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycygpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuUEFSQU1FVEVSUywgc2VxdWVuY2UoY29tbWEoKSwgc3BhY2UoKSksIG5vbmUoKSwgbm9uZSgpKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTiksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuVEhST1dOX0VYQ0VQVElPTlMsIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpLCBzZXF1ZW5jZShzcGFjZSgpLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlRIUk9XUyksIHNwYWNlKCkpLCBub25lKCkpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIG1lbWJlckFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LkFSR1VNRU5UUywgc2VxdWVuY2UoY29tbWEoKSwgc3BhY2UoKSksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFBBUkVOKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChDTEFTU19CT0RZLCBJU19OT1RfRU1QVFksIHNlcXVlbmNlKHNwYWNlKCksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSwgQ3NtRWxlbWVudC5uZXdsaW5lKCksIENzbUVsZW1lbnQuaW5kZW50KCksIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuQ0xBU1NfQk9EWSwgbmV3bGluZSgpLCBuZXdsaW5lKCksIG5vbmUoKSwgQ3NtRWxlbWVudC5uZXdsaW5lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pbmRlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKFJCUkFDRSksIENzbUVsZW1lbnQubmV3bGluZSgpKSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEVudW1EZWNsYXJhdGlvbi5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5FTlVNKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5JTVBMRU1FTlRFRF9UWVBFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2Uoc3BhY2UoKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5JTVBMRU1FTlRTKSwgc3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBub25lKCkpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuaW5kZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5uZXdsaW5lKCksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuRU5UUklFUywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5ub25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBub25lKCkpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5NRU1CRVJTLCBJU19FTVBUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5FTlRSSUVTLCBJU19OT1RfRU1QVFksIG5ld2xpbmUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZShDc21FbGVtZW50LnNlbWljb2xvbigpLCBuZXdsaW5lKCksIENzbUVsZW1lbnQubmV3bGluZSgpLCBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5NRU1CRVJTLCBuZXdsaW5lKCksIG5ld2xpbmUoKSwgbm9uZSgpLCBDc21FbGVtZW50Lm5ld2xpbmUoKSkpKSwKKyAgICAgICAgICAgICAgICB1bmluZGVudCgpLAorICAgICAgICAgICAgICAgIHRva2VuKFJCUkFDRSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEZpZWxkRGVjbGFyYXRpb24uY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIG9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpcygpLAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgIG1vZGlmaWVycygpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5WQVJJQUJMRVMsIElTX05PVF9FTVBUWSwgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk1BWElNVU1fQ09NTU9OX1RZUEUpKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LlZBUklBQkxFUywgc2VxdWVuY2UoY29tbWEoKSwgc3BhY2UoKSkpLAorICAgICAgICAgICAgICAgIHNlbWljb2xvbigpKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEluaXRpYWxpemVyRGVjbGFyYXRpb24uY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuU1RBVElDLCBGTEFHLCBzZXF1ZW5jZSh0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNUQVRJQyksIHNwYWNlKCkpKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSkpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIG9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpcygpLAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBtaXgobWVtYmVyQW5ub3RhdGlvbnMoKSwgbW9kaWZpZXJzKCkpLAorICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzKCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuUkVDRUlWRVJfUEFSQU1FVEVSLCBJU19QUkVTRU5ULCBzZXF1ZW5jZShjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuUkVDRUlWRVJfUEFSQU1FVEVSKSwgY29tbWEoKSwgc3BhY2UoKSkpLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LlBBUkFNRVRFUlMsIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpLCBub25lKCksIG5vbmUoKSksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LlRIUk9XTl9FWENFUFRJT05TLCBzZXF1ZW5jZShjb21tYSgpLCBzcGFjZSgpKSwgc2VxdWVuY2Uoc3BhY2UoKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5USFJPV1MpLCBzcGFjZSgpKSwgbm9uZSgpKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSwgSVNfUFJFU0VOVCwgc2VxdWVuY2Uoc3BhY2UoKSwgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFkpKSwgc2VtaWNvbG9uKCkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChQYXJhbWV0ZXIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50Lm5vbmUoKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSwKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LlZBUl9BUkdTLCBGTEFHLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuVkFSX0FSR1NfQU5OT1RBVElPTlMsIENzbUVsZW1lbnQuc3BhY2UoKSwgQ3NtRWxlbWVudC5ub25lKCksIENzbUVsZW1lbnQubm9uZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuRUxMSVBTSVMpKSksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSkpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoUmVjZWl2ZXJQYXJhbWV0ZXIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50Lm5vbmUoKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSkpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoVmFyaWFibGVEZWNsYXJhdG9yLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpLAorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgaW50cm9kdWNlIGEgZGVyaXZlZCBwcm9wZXJ0eQorICAgICAgICAgICAgICAgIC8vIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LkVYVFJBX0FSUkFZX0xFVkVMUyksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LklOSVRJQUxJWkVSLCBJU19QUkVTRU5ULCBzZXF1ZW5jZShzcGFjZSgpLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFTU0lHTiksIHNwYWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuSU5JVElBTElaRVIpKSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBFeHByZXNzaW9ucworICAgICAgICAvLy8KKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQXJyYXlBY2Nlc3NFeHByLmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29tbWVudCgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0tFVCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuSU5ERVgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0tFVCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEFycmF5Q3JlYXRpb25FeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ORVcpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRUxFTUVOVF9UWVBFKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5MRVZFTFMpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5JTklUSUFMSVpFUiwgSVNfUFJFU0VOVCwgc2VxdWVuY2Uoc3BhY2UoKSwgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LklOSVRJQUxJWkVSKSkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChBcnJheUluaXRpYWxpemVyRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5WQUxVRVMsIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpLCBzcGFjZSgpLCBzcGFjZSgpKSwKKyAgICAgICAgICAgICAgICBvcnBoYW5Db21tZW50c0VuZGluZygpLAorICAgICAgICAgICAgICAgIHRva2VuKFJCUkFDRSkpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQXNzaWduRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5UQVJHRVQpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgYXR0cmlidXRlKE9ic2VydmFibGVQcm9wZXJ0eS5PUEVSQVRPUiksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVkFMVUUpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChCaW5hcnlFeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkxFRlQpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgYXR0cmlidXRlKE9ic2VydmFibGVQcm9wZXJ0eS5PUEVSQVRPUiksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuUklHSFQpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChCb29sZWFuTGl0ZXJhbEV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwgYXR0cmlidXRlKFZBTFVFKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQ2FzdEV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5FWFBSRVNTSU9OKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQ2hhckxpdGVyYWxFeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgY2hhclRva2VuKE9ic2VydmFibGVQcm9wZXJ0eS5WQUxVRSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KENsYXNzRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuRE9UKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5DTEFTUykpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQ29uZGl0aW9uYWxFeHByLmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29tbWVudCgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkNPTkRJVElPTiksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5IT09LKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVEhFTl9FWFBSKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkNPTE9OKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRUxTRV9FWFBSKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoRG91YmxlTGl0ZXJhbEV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoT2JzZXJ2YWJsZVByb3BlcnR5LlZBTFVFKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoRW5jbG9zZWRFeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5JTk5FUiksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChGaWVsZEFjY2Vzc0V4cHIuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChTQ09QRSksIAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ET1QpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoSW5zdGFuY2VPZkV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTiksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklOU1RBTkNFT0YpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChJbnRlZ2VyTGl0ZXJhbEV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUoT2JzZXJ2YWJsZVByb3BlcnR5LlZBTFVFKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTGFtYmRhRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5FTkNMT1NJTkdfUEFSQU1FVEVSUywgRkxBRywgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5QQVJBTUVURVJTLCBzZXF1ZW5jZShjb21tYSgpLCBzcGFjZSgpKSksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkVOQ0xPU0lOR19QQVJBTUVURVJTLCBGTEFHLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTikpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5BUlJPVyksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTl9CT0RZLCBJU19QUkVTRU5ULCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTl9CT0RZKSwgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFkpKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTG9uZ0xpdGVyYWxFeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgYXR0cmlidXRlKE9ic2VydmFibGVQcm9wZXJ0eS5WQUxVRSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KE1hcmtlckFubm90YXRpb25FeHByLmNsYXNzLCBzZXF1ZW5jZShjb21tZW50KCksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpLCBhdHRyaWJ1dGUoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KE1lbWJlclZhbHVlUGFpci5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFTU0lHTiksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlZBTFVFKSkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChNZXRob2RDYWxsRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5TQ09QRSwgSVNfUFJFU0VOVCwgc2VxdWVuY2UoY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlNDT1BFKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ET1QpKSksCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cygpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuQVJHVU1FTlRTLCBzZXF1ZW5jZShjb21tYSgpLCBzcGFjZSgpKSwgbm9uZSgpLCBub25lKCkpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTWV0aG9kUmVmZXJlbmNlRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5TQ09QRSksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ET1VCTEVDT0xPTiksCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cygpLAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZShPYnNlcnZhYmxlUHJvcGVydHkuSURFTlRJRklFUikKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KE5hbWUuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuUVVBTElGSUVSLCBJU19QUkVTRU5ULCBzZXF1ZW5jZShjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuUVVBTElGSUVSKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ET1QpKSksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuQU5OT1RBVElPTlMsIENzbUVsZW1lbnQuc3BhY2UoKSwgQ3NtRWxlbWVudC5ub25lKCksIENzbUVsZW1lbnQuc3BhY2UoKSksCisgICAgICAgICAgICAgICAgYXR0cmlidXRlKE9ic2VydmFibGVQcm9wZXJ0eS5JREVOVElGSUVSKSwKKyAgICAgICAgICAgICAgICBvcnBoYW5Db21tZW50c0VuZGluZygpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChOYW1lRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBvcnBoYW5Db21tZW50c0VuZGluZygpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChOb3JtYWxBbm5vdGF0aW9uRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuUEFJUlMsIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTikKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KE51bGxMaXRlcmFsRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTlVMTCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KE9iamVjdENyZWF0aW9uRXhwci5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5TQ09QRSwgSVNfUFJFU0VOVCwgc2VxdWVuY2UoY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlNDT1BFKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ET1QpKSksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ORVcpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRV9BUkdVTUVOVFMsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5jb21tYSgpLCBDc21FbGVtZW50LnNwYWNlKCkpLCBDc21FbGVtZW50LnRva2VuKExUKSwgQ3NtRWxlbWVudC50b2tlbihHVCkpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFX0FSR1VNRU5UUywgSVNfTk9UX0VNUFRZLCBzcGFjZSgpKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LkFSR1VNRU5UUywgc2VxdWVuY2UoY29tbWEoKSwgc3BhY2UoKSksIG5vbmUoKSwgbm9uZSgpKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTiksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkFOT05ZTU9VU19DTEFTU19CT0RZLCBJU19QUkVTRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50LnRva2VuKExCUkFDRSksIENzbUVsZW1lbnQubmV3bGluZSgpLCBDc21FbGVtZW50LmluZGVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50Lmxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LkFOT05ZTU9VU19DTEFTU19CT0RZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC51bmluZGVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKFJCUkFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChTaW1wbGVOYW1lLmNsYXNzLCBhdHRyaWJ1dGUoT2JzZXJ2YWJsZVByb3BlcnR5LklERU5USUZJRVIpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFUKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5NRU1CRVJfVkFMVUUpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFN0cmluZ0xpdGVyYWxFeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgc3RyaW5nVG9rZW4oT2JzZXJ2YWJsZVByb3BlcnR5LlZBTFVFKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoU3VwZXJFeHByLmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29tbWVudCgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkNMQVNTX0VYUFIsIElTX1BSRVNFTlQsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQ0xBU1NfRVhQUiksIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5ET1QpKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNVUEVSKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoVGhpc0V4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuQ0xBU1NfRVhQUiwgSVNfUFJFU0VOVCwgc2VxdWVuY2UoY2hpbGQoQ0xBU1NfRVhQUiksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuRE9UKSkpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuVEhJUykKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFR5cGVFeHByLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChVbmFyeUV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5QUkVGSVgsIEZMQUcsIGF0dHJpYnV0ZShPYnNlcnZhYmxlUHJvcGVydHkuT1BFUkFUT1IpKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTiksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LlBPU1RGSVgsIEZMQUcsIGF0dHJpYnV0ZShPYnNlcnZhYmxlUHJvcGVydHkuT1BFUkFUT1IpKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUywgQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50Lm5vbmUoKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSwKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTUFYSU1VTV9DT01NT05fVFlQRSksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5WQVJJQUJMRVMsIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpKQorICAgICAgICApKTsKKworICAgICAgICAvLy8KKyAgICAgICAgLy8vIFN0YXRlbWVudHMKKyAgICAgICAgLy8vCisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEFzc2VydFN0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFTU0VSVCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkNIRUNLKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5NRVNTQUdFLCBJU19QUkVTRU5ULCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkNPTE9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc3BhY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk1FU1NBR0UpCisgICAgICAgICAgICAgICAgKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZW1pY29sb24oKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQmxvY2tTdG10LmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBvcnBoYW5Db21tZW50c0JlZm9yZVRoaXMoKSwKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpLAorICAgICAgICAgICAgICAgIG5ld2xpbmUoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5TVEFURU1FTlRTLCBuZXdsaW5lKCksIGluZGVudCgpLCBzZXF1ZW5jZShuZXdsaW5lKCksIHVuaW5kZW50KCkpKSwKKyAgICAgICAgICAgICAgICBvcnBoYW5Db21tZW50c0VuZGluZygpLAorICAgICAgICAgICAgICAgIHRva2VuKFJCUkFDRSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEJyZWFrU3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQlJFQUspLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkxBQkVMLCBJU19QUkVTRU5ULCBDc21FbGVtZW50LnNlcXVlbmNlKENzbUVsZW1lbnQuc3BhY2UoKSwgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTEFCRUwpKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZW1pY29sb24oKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQ2F0Y2hDbGF1c2UuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5DQVRDSCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5QQVJBTUVURVIpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oUlBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChCT0RZKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQ29udGludWVTdG10LmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29tbWVudCgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5DT05USU5VRSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuTEFCRUwsIElTX1BSRVNFTlQsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5MQUJFTCkpKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlbWljb2xvbigpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChEb1N0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkRPKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5XSElMRSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5DT05ESVRJT04pLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VtaWNvbG9uKCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEVtcHR5U3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuU0VNSUNPTE9OKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoVW5wYXJzYWJsZVN0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNFTUlDT0xPTikKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5USElTLCBGTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZXF1ZW5jZSh0eXBlQXJndW1lbnRzKCksIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5USElTKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5FWFBSRVNTSU9OLCBJU19QUkVTRU5ULCBDc21FbGVtZW50LnNlcXVlbmNlKENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkVYUFJFU1NJT04pLCBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuRE9UKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TVVBFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubGlzdChPYnNlcnZhYmxlUHJvcGVydHkuQVJHVU1FTlRTLCBDc21FbGVtZW50LnNlcXVlbmNlKENzbUVsZW1lbnQuY29tbWEoKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTiksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZW1pY29sb24oKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoRXhwcmVzc2lvblN0bXQuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIG9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpcygpLAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTiksCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uKCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KEZvcmVhY2hTdG10LmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5GT1IpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5WQVJJQUJMRSksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkNPTE9OKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5JVEVSQUJMRSksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkJPRFkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChGb3JTdG10LmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5GT1IpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LklOSVRJQUxJWkFUSU9OLCBzZXF1ZW5jZShjb21tYSgpLCBzcGFjZSgpKSksCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uKCksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQ09NUEFSRSksCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uKCksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5VUERBVEUsIHNlcXVlbmNlKGNvbW1hKCksIHNwYWNlKCkpKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTiksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KElmU3RtdC5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSUYpLAorICAgICAgICAgICAgICAgIHNwYWNlKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5DT05ESVRJT04pLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuVEhFTl9CTE9DSywgQ3NtQ29uZGl0aW9uYWwuQ29uZGl0aW9uLkZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZShzcGFjZSgpLCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVEhFTl9TVE1UKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkVMU0VfU1RNVCwgSVNfUFJFU0VOVCwgc3BhY2UoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UobmV3bGluZSgpLCBDc21FbGVtZW50LmluZGVudCgpLCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVEhFTl9TVE1UKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkVMU0VfU1RNVCwgSVNfUFJFU0VOVCwgbmV3bGluZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pbmRlbnQoKSkpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5FTFNFX1NUTVQsIElTX1BSRVNFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSh0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkVMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbChBcnJheXMuYXNMaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5FTFNFX0JMT0NLLCBPYnNlcnZhYmxlUHJvcGVydHkuQ0FTQ0FESU5HX0lGX1NUTVQpLCBDc21Db25kaXRpb25hbC5Db25kaXRpb24uRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZShzcGFjZSgpLCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRUxTRV9TVE1UKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UobmV3bGluZSgpLCBDc21FbGVtZW50LmluZGVudCgpLCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRUxTRV9TVE1UKSwgdW5pbmRlbnQoKSkpKSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KExhYmVsZWRTdG10LmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29tbWVudCgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkxBQkVMKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQ09MT04pLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuU1RBVEVNRU5UKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5DTEFTU19ERUNMQVJBVElPTikKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFJldHVyblN0bXQuY2xhc3MsIHNlcXVlbmNlKGNvbW1lbnQoKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SRVRVUk4pLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5FWFBSRVNTSU9OLCBJU19QUkVTRU5ULCBzZXF1ZW5jZShzcGFjZSgpLCBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTikpKSwKKyAgICAgICAgICAgICAgICBzZW1pY29sb24oKSkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChTd2l0Y2hFbnRyeVN0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuTEFCRUwsIElTX1BSRVNFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlcXVlbmNlKENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5DQVNFKSwgQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5MQUJFTCksIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5DT0xPTikpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuX0RFRkFVTFQpLCBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQ09MT04pKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5uZXdsaW5lKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5pbmRlbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50Lmxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LlNUQVRFTUVOVFMsIENzbUVsZW1lbnQubmV3bGluZSgpLCBDc21FbGVtZW50Lm5vbmUoKSwgQ3NtRWxlbWVudC5uZXdsaW5lKCkpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudW5pbmRlbnQoKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoU3dpdGNoU3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuU1dJVENIKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5TRUxFQ1RPUiksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTiksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubGlzdChPYnNlcnZhYmxlUHJvcGVydHkuRU5UUklFUywgQ3NtRWxlbWVudC5ub25lKCksIENzbUVsZW1lbnQuaW5kZW50KCksIENzbUVsZW1lbnQudW5pbmRlbnQoKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJCUkFDRSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFN5bmNocm9uaXplZFN0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNZTkNIUk9OSVpFRCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKEVYUFJFU1NJT04pLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oUlBBUkVOKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChCT0RZKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoVGhyb3dTdG10LmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5USFJPVyksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuRVhQUkVTU0lPTiksCisgICAgICAgICAgICAgICAgc2VtaWNvbG9uKCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFRyeVN0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb21tZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlRSWSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LlJFU09VUkNFUywgQ3NtQ29uZGl0aW9uYWwuQ29uZGl0aW9uLklTX05PVF9FTVBUWSwgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oTFBBUkVOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LlJFU09VUkNFUywgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LnNlbWljb2xvbigpLCBDc21FbGVtZW50Lm5ld2xpbmUoKSksIENzbUVsZW1lbnQuaW5kZW50KCksIENzbUVsZW1lbnQudW5pbmRlbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKFJQQVJFTiksCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCkpKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5UUllfQkxPQ0spLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubGlzdChPYnNlcnZhYmxlUHJvcGVydHkuQ0FUQ0hfQ0xBVVNFUyksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuRklOQUxMWV9CTE9DSywgSVNfUFJFU0VOVCwgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LnNwYWNlKCksIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5GSU5BTExZKSwgQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5GSU5BTExZX0JMT0NLKSkpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChXaGlsZVN0bXQuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLldISUxFKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFBBUkVOKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQ09ORElUSU9OKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTiksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQk9EWSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBUeXBlcworICAgICAgICAvLy8KKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoQXJyYXlUeXBlLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuQ09NUE9ORU5UX1RZUEUpLAorICAgICAgICAgICAgICAgIGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5LkFOTk9UQVRJT05TKSwKKyAgICAgICAgICAgICAgICBzdHJpbmcoR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0tFVCksCisgICAgICAgICAgICAgICAgc3RyaW5nKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUkJSQUNLRVQpKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KENsYXNzT3JJbnRlcmZhY2VUeXBlLmNsYXNzLCBzZXF1ZW5jZShjb21tZW50KCksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoU0NPUEUsIElTX1BSRVNFTlQsIHNlcXVlbmNlKGNoaWxkKFNDT1BFKSwgc3RyaW5nKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuRE9UKSkpLAorICAgICAgICAgICAgICAgIGxpc3QoQU5OT1RBVElPTlMsIHNwYWNlKCkpLAorICAgICAgICAgICAgICAgIGNoaWxkKE5BTUUpLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eS5VU0lOR19ESUFNT05EX09QRVJBVE9SLCBGTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2Uoc3RyaW5nKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTFQpLCBzdHJpbmcoR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5HVCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChUWVBFX0FSR1VNRU5UUywgc2VxdWVuY2UoY29tbWEoKSwgc3BhY2UoKSksIHN0cmluZyhHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxUKSwgc3RyaW5nKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuR1QpKSkpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoSW50ZXJzZWN0aW9uVHlwZS5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubGlzdChPYnNlcnZhYmxlUHJvcGVydHkuRUxFTUVOVFMsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQklUX0FORCksIENzbUVsZW1lbnQuc3BhY2UoKSkpKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFByaW1pdGl2ZVR5cGUuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUyksCisgICAgICAgICAgICAgICAgYXR0cmlidXRlKE9ic2VydmFibGVQcm9wZXJ0eS5UWVBFKSkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChUeXBlUGFyYW1ldGVyLmNsYXNzLCBzZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBjb21tZW50KCksCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSksCisgICAgICAgICAgICAgICAgbGlzdChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRV9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkJJVF9BTkQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkVYVEVORFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbmUoKSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFVuaW9uVHlwZS5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubGlzdChPYnNlcnZhYmxlUHJvcGVydHkuRUxFTUVOVFMsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5zcGFjZSgpLCBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQklUX09SKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFVua25vd25UeXBlLmNsYXNzLCBub25lKCkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChWb2lkVHlwZS5jbGFzcywgc2VxdWVuY2UoY29tbWVudCgpLCBhbm5vdGF0aW9ucygpLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlZPSUQpKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFZhclR5cGUuY2xhc3MsIHNlcXVlbmNlKGNvbW1lbnQoKSwgYW5ub3RhdGlvbnMoKSwgc3RyaW5nKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSURFTlRJRklFUiwgInZhciIpKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KFdpbGRjYXJkVHlwZS5jbGFzcywgc2VxdWVuY2UoY29tbWVudCgpLCBhbm5vdGF0aW9ucygpLCB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkhPT0spLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LkVYVEVOREVEX1RZUEUsIElTX1BSRVNFTlQsIENzbUVsZW1lbnQuc2VxdWVuY2Uoc3BhY2UoKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5FWFRFTkRTKSwgc3BhY2UoKSwgQ3NtRWxlbWVudC5jaGlsZChFWFRFTkRFRF9UWVBFKSkpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5LlNVUEVSX1RZUEUsIElTX1BSRVNFTlQsIENzbUVsZW1lbnQuc2VxdWVuY2Uoc3BhY2UoKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TVVBFUiksIHNwYWNlKCksIENzbUVsZW1lbnQuY2hpbGQoU1VQRVJfVFlQRSkpKSkpOworCisgICAgICAgIC8vLworICAgICAgICAvLy8gVG9wIExldmVsCisgICAgICAgIC8vLworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChBcnJheUNyZWF0aW9uTGV2ZWwuY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0tFVCksCisgICAgICAgICAgICAgICAgY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LkRJTUVOU0lPTiksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0tFVCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KENvbXBpbGF0aW9uVW5pdC5jbGFzcywgc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgY29tbWVudCgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5QQUNLQUdFX0RFQ0xBUkFUSU9OKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5JTVBPUlRTLCBub25lKCksIG5vbmUoKSwgbmV3bGluZSgpKSwKKyAgICAgICAgICAgICAgICBsaXN0KFRZUEVTLCBuZXdsaW5lKCksIENzbUVsZW1lbnQubmV3bGluZSgpLCBDc21FbGVtZW50Lm5vbmUoKSwgQ3NtRWxlbWVudC5uZXdsaW5lKCkpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5NT0RVTEUpLAorICAgICAgICAgICAgICAgIG9ycGhhbkNvbW1lbnRzRW5kaW5nKCkpKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoSW1wb3J0RGVjbGFyYXRpb24uY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICB0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklNUE9SVCksCisgICAgICAgICAgICAgICAgc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkuU1RBVElDLCBGTEFHLCBzZXF1ZW5jZSh0b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNUQVRJQyksIHNwYWNlKCkpKSwKKyAgICAgICAgICAgICAgICBjaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSksCisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwoQVNURVJJU0ssIEZMQUcsIHNlcXVlbmNlKHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuRE9UKSwgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TVEFSKSkpLAorICAgICAgICAgICAgICAgIHNlbWljb2xvbigpLAorICAgICAgICAgICAgICAgIG5ld2xpbmUoKSwKKyAgICAgICAgICAgICAgICBvcnBoYW5Db21tZW50c0VuZGluZygpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChQYWNrYWdlRGVjbGFyYXRpb24uY2xhc3MsIHNlcXVlbmNlKAorICAgICAgICAgICAgICAgIGNvbW1lbnQoKSwKKyAgICAgICAgICAgICAgICBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eS5BTk5PVEFUSU9OUyksCisgICAgICAgICAgICAgICAgdG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5QQUNLQUdFKSwKKyAgICAgICAgICAgICAgICBzcGFjZSgpLAorICAgICAgICAgICAgICAgIGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBzZW1pY29sb24oKSwKKyAgICAgICAgICAgICAgICBuZXdsaW5lKCksCisgICAgICAgICAgICAgICAgbmV3bGluZSgpLAorICAgICAgICAgICAgICAgIG9ycGhhbkNvbW1lbnRzRW5kaW5nKCkpKTsKKworICAgICAgICAvLy8KKyAgICAgICAgLy8vIE1vZHVsZSBpbmZvCisgICAgICAgIC8vLworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChNb2R1bGVEZWNsYXJhdGlvbi5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5Lk9QRU4sIEZMQUcsIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLk9QRU4pLCBDc21FbGVtZW50LnNwYWNlKCkpKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTU9EVUxFKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuTkFNRSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuaW5kZW50KCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5saXN0KE9ic2VydmFibGVQcm9wZXJ0eS5NT0RVTEVfU1RNVFMpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudW5pbmRlbnQoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUkJSQUNFKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50Lm5ld2xpbmUoKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTW9kdWxlRXhwb3J0c1N0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkVYUE9SVFMpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50Lmxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5Lk1PRFVMRV9OQU1FUywKKyAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VxdWVuY2UoQ3NtRWxlbWVudC5jb21tYSgpLCBDc21FbGVtZW50LnNwYWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LnNwYWNlKCksIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5UTyksIENzbUVsZW1lbnQuc3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50Lm5vbmUoKSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZW1pY29sb24oKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50Lm5ld2xpbmUoKQorICAgICAgICApKTsKKworICAgICAgICBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5wdXQoTW9kdWxlT3BlbnNTdG10LmNsYXNzLCBDc21FbGVtZW50LnNlcXVlbmNlKAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5PUEVOUyksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubGlzdChPYnNlcnZhYmxlUHJvcGVydHkuTU9EVUxFX05BTUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LmNvbW1hKCksIENzbUVsZW1lbnQuc3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlcXVlbmNlKENzbUVsZW1lbnQuc3BhY2UoKSwgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlRPKSwgQ3NtRWxlbWVudC5zcGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubm9uZSgpKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlbWljb2xvbigpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChNb2R1bGVQcm92aWRlc1N0bXQuY2xhc3MsIENzbUVsZW1lbnQuc2VxdWVuY2UoCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBST1ZJREVTKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNwYWNlKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5jaGlsZChPYnNlcnZhYmxlUHJvcGVydHkuVFlQRSksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5saXN0KE9ic2VydmFibGVQcm9wZXJ0eS5XSVRIX1RZUEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zZXF1ZW5jZShDc21FbGVtZW50LmNvbW1hKCksIENzbUVsZW1lbnQuc3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlcXVlbmNlKENzbUVsZW1lbnQuc3BhY2UoKSwgQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLldJVEgpLCBDc21FbGVtZW50LnNwYWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5ub25lKCkpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VtaWNvbG9uKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5uZXdsaW5lKCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MucHV0KE1vZHVsZVJlcXVpcmVzU3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUkVRVUlSRVMpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc3BhY2UoKSwKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LmNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FKSwKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnNlbWljb2xvbigpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQubmV3bGluZSgpCisgICAgICAgICkpOworCisgICAgICAgIGNvbmNyZXRlU3ludGF4TW9kZWxCeUNsYXNzLnB1dChNb2R1bGVVc2VzU3RtdC5jbGFzcywgQ3NtRWxlbWVudC5zZXF1ZW5jZSgKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50LnRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuVVNFUyksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5zcGFjZSgpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuY2hpbGQoT2JzZXJ2YWJsZVByb3BlcnR5LlRZUEUpLAorICAgICAgICAgICAgICAgIENzbUVsZW1lbnQuc2VtaWNvbG9uKCksCisgICAgICAgICAgICAgICAgQ3NtRWxlbWVudC5uZXdsaW5lKCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHVuc3VwcG9ydGVkTm9kZUNsYXNzTmFtZXMgPSBKYXZhUGFyc2VyTWV0YU1vZGVsLmdldE5vZGVNZXRhTW9kZWxzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gIWMuaXNBYnN0cmFjdCgpICYmICFDb21tZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYy5nZXRUeXBlKCkpICYmICFjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5jb250YWluc0tleShjLmdldFR5cGUoKSkpCisgICAgICAgICAgICAgICAgLm1hcChubSAtPiBubS5nZXRUeXBlKCkuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBpZiAodW5zdXBwb3J0ZWROb2RlQ2xhc3NOYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemF0aW9uRXJyb3IgPSBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25FcnJvciA9IE9wdGlvbmFsLm9mKCJUaGUgQ1NNIHNob3VsZCBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZXNlIGNsYXNzZXM6ICIgKyBTdHJpbmcuam9pbigiLCAiLCB1bnN1cHBvcnRlZE5vZGVDbGFzc05hbWVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbmNyZXRlU3ludGF4TW9kZWwoKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJpY1ByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIGZvckNsYXNzKG5vZGUuZ2V0Q2xhc3MoKSkucHJldHR5UHJpbnQobm9kZSwgcHJpbnRlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJpY1ByZXR0eVByaW50KE5vZGUgbm9kZSkgeworICAgICAgICBTb3VyY2VQcmludGVyIHNvdXJjZVByaW50ZXIgPSBuZXcgU291cmNlUHJpbnRlcigiICAgICIsIEVPTCk7CisgICAgICAgIGZvckNsYXNzKG5vZGUuZ2V0Q2xhc3MoKSkucHJldHR5UHJpbnQobm9kZSwgc291cmNlUHJpbnRlcik7CisgICAgICAgIHJldHVybiBzb3VyY2VQcmludGVyLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ3NtRWxlbWVudCBmb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgTm9kZT4gbm9kZUNsYXp6KSB7CisgICAgICAgIGluaXRpYWxpemF0aW9uRXJyb3IuaWZQcmVzZW50KHMgLT4geworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzKTsKKyAgICAgICAgfSk7CisgICAgICAgIGlmICghY29uY3JldGVTeW50YXhNb2RlbEJ5Q2xhc3MuY29udGFpbnNLZXkobm9kZUNsYXp6KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGVDbGF6ei5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25jcmV0ZVN5bnRheE1vZGVsQnlDbGFzcy5nZXQobm9kZUNsYXp6KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0RvdFByaW50ZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0RvdFByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE5MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvRG90UHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsNCisNCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOw0KK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Ob2RlTWV0YU1vZGVsOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLlByb3BlcnR5TWV0YU1vZGVsOw0KKw0KKy8qKg0KKyAqIE91dHB1dHMgYSBHcmFwaHZpeiBkaWFncmFtIG9mIHRoZSBBU1QuDQorICovDQorcHVibGljIGNsYXNzIERvdFByaW50ZXIgew0KKw0KKyAgICBwcml2YXRlIGludCBub2RlQ291bnQ7DQorICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBvdXRwdXROb2RlVHlwZTsNCisNCisgICAgcHVibGljIERvdFByaW50ZXIoYm9vbGVhbiBvdXRwdXROb2RlVHlwZSkgew0KKyAgICAgICAgdGhpcy5vdXRwdXROb2RlVHlwZSA9IG91dHB1dE5vZGVUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0KE5vZGUgbm9kZSkgew0KKyAgICAgICAgbm9kZUNvdW50ID0gMDsNCisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIG91dHB1dC5hcHBlbmQoImRpZ3JhcGggeyIpOw0KKyAgICAgICAgb3V0cHV0KG5vZGUsIG51bGwsICJyb290Iiwgb3V0cHV0KTsNCisgICAgICAgIG91dHB1dC5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSArICJ9Iik7DQorICAgICAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgb3V0cHV0KE5vZGUgbm9kZSwgU3RyaW5nIHBhcmVudE5vZGVOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nQnVpbGRlciBidWlsZGVyKSB7DQorICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUpOw0KKyAgICAgICAgTm9kZU1ldGFNb2RlbCBtZXRhTW9kZWwgPSBub2RlLmdldE1ldGFNb2RlbCgpOw0KKyAgICAgICAgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gYWxsUHJvcGVydHlNZXRhTW9kZWxzID0gbWV0YU1vZGVsLmdldEFsbFByb3BlcnR5TWV0YU1vZGVscygpOw0KKyAgICAgICAgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gYXR0cmlidXRlcyA9IGFsbFByb3BlcnR5TWV0YU1vZGVscy5zdHJlYW0oKS5maWx0ZXIoUHJvcGVydHlNZXRhTW9kZWw6OmlzQXR0cmlidXRlKQ0KKyAgICAgICAgICAgICAgICAuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc1Npbmd1bGFyKS5jb2xsZWN0KHRvTGlzdCgpKTsNCisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IHN1Yk5vZGVzID0gYWxsUHJvcGVydHlNZXRhTW9kZWxzLnN0cmVhbSgpLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNOb2RlKQ0KKyAgICAgICAgICAgICAgICAuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc1Npbmd1bGFyKS5jb2xsZWN0KHRvTGlzdCgpKTsNCisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IHN1Ykxpc3RzID0gYWxsUHJvcGVydHlNZXRhTW9kZWxzLnN0cmVhbSgpLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNOb2RlTGlzdCkNCisgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9MaXN0KCkpOw0KKw0KKyAgICAgICAgU3RyaW5nIG5kTmFtZSA9IG5leHROb2RlTmFtZSgpOw0KKyAgICAgICAgaWYgKG91dHB1dE5vZGVUeXBlKQ0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBuZE5hbWUgKyAiIFtsYWJlbD1cIiIgKyBuYW1lICsgIiAoIiArIG1ldGFNb2RlbC5nZXRUeXBlTmFtZSgpDQorICAgICAgICAgICAgICAgICAgICArICIpXCJdOyIpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBuZE5hbWUgKyAiIFtsYWJlbD1cIiIgKyBuYW1lICsgIlwiXTsiKTsNCisNCisgICAgICAgIGlmIChwYXJlbnROb2RlTmFtZSAhPSBudWxsKQ0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBwYXJlbnROb2RlTmFtZSArICIgLT4gIiArIG5kTmFtZSArICI7Iik7DQorDQorICAgICAgICBmb3IgKFByb3BlcnR5TWV0YU1vZGVsIGEgOiBhdHRyaWJ1dGVzKSB7DQorICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbmV4dE5vZGVOYW1lKCk7DQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSArIGF0dHJOYW1lICsgIiBbbGFiZWw9XCIiICsgYS5nZXROYW1lKCkgKyAiPSciDQorICAgICAgICAgICAgICAgICAgICArIGEuZ2V0VmFsdWUobm9kZSkudG9TdHJpbmcoKSArICInXCJdOyIpOw0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBuZE5hbWUgKyAiIC0+ICIgKyBhdHRyTmFtZSArICI7Iik7DQorDQorICAgICAgICB9DQorDQorICAgICAgICBmb3IgKFByb3BlcnR5TWV0YU1vZGVsIHNuIDogc3ViTm9kZXMpIHsNCisgICAgICAgICAgICBOb2RlIG5kID0gKE5vZGUpIHNuLmdldFZhbHVlKG5vZGUpOw0KKyAgICAgICAgICAgIGlmIChuZCAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICBvdXRwdXQobmQsIG5kTmFtZSwgc24uZ2V0TmFtZSgpLCBidWlsZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgc2wgOiBzdWJMaXN0cykgew0KKyAgICAgICAgICAgIE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPiBubCA9IChOb2RlTGlzdDw/IGV4dGVuZHMgTm9kZT4pIHNsLmdldFZhbHVlKG5vZGUpOw0KKyAgICAgICAgICAgIGlmIChubCAhPSBudWxsICYmIG5sLmlzTm9uRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbmRMc3ROYW1lID0gbmV4dE5vZGVOYW1lKCk7DQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBuZExzdE5hbWUgKyAiIFtsYWJlbD1cIiIgKyBzbC5nZXROYW1lKCkgKyAiXCJdOyIpOw0KKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgbmROYW1lICsgIiAtPiAiICsgbmRMc3ROYW1lICsgIjsiKTsNCisgICAgICAgICAgICAgICAgU3RyaW5nIHNsTmFtZSA9IHNsLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgc2wuZ2V0TmFtZSgpLmxlbmd0aCgpIC0gMSk7DQorICAgICAgICAgICAgICAgIGZvciAoTm9kZSBuZCA6IG5sKQ0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KG5kLCBuZExzdE5hbWUsIHNsTmFtZSwgYnVpbGRlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgU3RyaW5nIG5leHROb2RlTmFtZSgpIHsNCisgICAgICAgIHJldHVybiAibiIgKyAobm9kZUNvdW50KyspOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0pzb25QcmludGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Kc29uUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzA1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Kc29uUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vZGVNZXRhTW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0OworCisvKioKKyAqIE91dHB1dHMgYSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgQVNUIG1lYW50IGZvciBpbnNwZWN0aW5nIGl0LgorICovCitwdWJsaWMgY2xhc3MgSnNvblByaW50ZXIgeworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBvdXRwdXROb2RlVHlwZTsKKworICAgIHB1YmxpYyBKc29uUHJpbnRlcihib29sZWFuIG91dHB1dE5vZGVUeXBlKSB7CisgICAgICAgIHRoaXMub3V0cHV0Tm9kZVR5cGUgPSBvdXRwdXROb2RlVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG91dHB1dChOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dChub2RlLCBudWxsLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG91dHB1dChOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBpbnQgbGV2ZWwpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChub2RlKTsKKyAgICAgICAgTm9kZU1ldGFNb2RlbCBtZXRhTW9kZWwgPSBub2RlLmdldE1ldGFNb2RlbCgpOworICAgICAgICBMaXN0PFByb3BlcnR5TWV0YU1vZGVsPiBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMgPSBtZXRhTW9kZWwuZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCk7CisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IGF0dHJpYnV0ZXMgPSBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMuc3RyZWFtKCkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc0F0dHJpYnV0ZSkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc1Npbmd1bGFyKS5jb2xsZWN0KHRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gc3ViTm9kZXMgPSBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMuc3RyZWFtKCkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc05vZGUpLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNTaW5ndWxhcikuY29sbGVjdCh0b0xpc3QoKSk7CisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IHN1Ykxpc3RzID0gYWxsUHJvcGVydHlNZXRhTW9kZWxzLnN0cmVhbSgpLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNOb2RlTGlzdCkuY29sbGVjdCh0b0xpc3QoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBpZiAob3V0cHV0Tm9kZVR5cGUpIHsKKyAgICAgICAgICAgIGNvbnRlbnQuYWRkKHEoInR5cGUiKSArICI6IiArIHEobWV0YU1vZGVsLmdldFR5cGVOYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgYXR0cmlidXRlTWV0YU1vZGVsIDogYXR0cmlidXRlcykgeworICAgICAgICAgICAgY29udGVudC5hZGQocShhdHRyaWJ1dGVNZXRhTW9kZWwuZ2V0TmFtZSgpKSArICI6IiArIHEoYXR0cmlidXRlTWV0YU1vZGVsLmdldFZhbHVlKG5vZGUpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgc3ViTm9kZU1ldGFNb2RlbCA6IHN1Yk5vZGVzKSB7CisgICAgICAgICAgICBOb2RlIHZhbHVlID0gKE5vZGUpIHN1Yk5vZGVNZXRhTW9kZWwuZ2V0VmFsdWUobm9kZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRlbnQuYWRkKG91dHB1dCh2YWx1ZSwgc3ViTm9kZU1ldGFNb2RlbC5nZXROYW1lKCksIGxldmVsICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBzdWJMaXN0TWV0YU1vZGVsIDogc3ViTGlzdHMpIHsKKyAgICAgICAgICAgIE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPiBzdWJMaXN0ID0gKE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPikgc3ViTGlzdE1ldGFNb2RlbC5nZXRWYWx1ZShub2RlKTsKKyAgICAgICAgICAgIGlmIChzdWJMaXN0ICE9IG51bGwgJiYgIXN1Ykxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3RDb250ZW50ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgZm9yIChOb2RlIHN1Ykxpc3ROb2RlIDogc3ViTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGVudC5hZGQob3V0cHV0KHN1Ykxpc3ROb2RlLCBudWxsLCBsZXZlbCArIDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGVudC5hZGQobGlzdENvbnRlbnQuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiLCBxKHN1Ykxpc3RNZXRhTW9kZWwuZ2V0TmFtZSgpKSArICI6WyIsICJdIikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50LnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIiwgInsiLCAifSIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudC5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIsIHEobmFtZSkgKyAiOnsiLCAifSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICJcIiIgKyB2YWx1ZS5yZXBsYWNlKCJcIiIsICJcXFwiIikucmVwbGFjZSgiXG4iLCAiXFxuIikucmVwbGFjZSgiXHIiLCAiXFxyIikgKyAiXCIiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50VmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvUHJldHR5UHJpbnRWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExZDZiNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50VmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTYwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVmFyaWFibGVzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5QYXJzZWRuZXNzLlVOUEFSU0FCTEU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb247CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMubm9ybWFsaXplRW9sSW5UZXh0QmxvY2s7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy50cmltVHJhaWxpbmdTcGFjZXM7CisKKy8qKgorICogT3V0cHV0cyB0aGUgQVNUIGFzIGZvcm1hdHRlZCBKYXZhIHNvdXJjZSBjb2RlLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgUHJldHR5UHJpbnRWaXNpdG9yIGltcGxlbWVudHMgVm9pZFZpc2l0b3I8Vm9pZD4geworICAgIHByb3RlY3RlZCBmaW5hbCBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworICAgIHByb3RlY3RlZCBmaW5hbCBTb3VyY2VQcmludGVyIHByaW50ZXI7CisgICAgcHJpdmF0ZSBEZXF1ZTxQb3NpdGlvbj4gbWV0aG9kQ2hhaW5Qb3NpdGlvbnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBwdWJsaWMgUHJldHR5UHJpbnRWaXNpdG9yKFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKSB7CisgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBwcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbjsKKyAgICAgICAgcHJpbnRlciA9IG5ldyBTb3VyY2VQcmludGVyKGNvbmZpZ3VyYXRpb24uZ2V0SW5kZW50KCksIGNvbmZpZ3VyYXRpb24uZ2V0RW5kT2ZMaW5lQ2hhcmFjdGVyKCkpOworICAgICAgICBwdXNoTWV0aG9kQ2hhaW5Qb3NpdGlvbihwcmludGVyLmdldEN1cnNvcigpKTsgLy8gaW5pdGlhbGl6ZSBhIGRlZmF1bHQgcG9zaXRpb24gZm9yIG1ldGhvZENoYWluUG9zaXRpb25zLCBpdCBpcyBleHBlY3RlZCBieSBtZXRob2QgI3Jlc2V0TWV0aG9kQ2hhaW5Qb3NpdGlvbigpCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBwcmludGVyLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0TWV0aG9kQ2hhaW5Qb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgeworICAgICAgICB0aGlzLm1ldGhvZENoYWluUG9zaXRpb25zLnBvcCgpOworICAgICAgICB0aGlzLm1ldGhvZENoYWluUG9zaXRpb25zLnB1c2gocG9zaXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2hNZXRob2RDaGFpblBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7CisgICAgICAgIHRoaXMubWV0aG9kQ2hhaW5Qb3NpdGlvbnMucHVzaChwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIFBvc2l0aW9uIHBlZWtNZXRob2RDaGFpblBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tZXRob2RDaGFpblBvc2l0aW9ucy5wZWVrKCk7CisgICAgfQorCisgICAgcHVibGljIFBvc2l0aW9uIHBvcE1ldGhvZENoYWluUG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1ldGhvZENoYWluUG9zaXRpb25zLnBvcCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KG1vZGlmaWVycy5zdHJlYW0oKS5tYXAoTW9kaWZpZXI6OmFzU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiICIpKSArICIgIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRNZW1iZXJzKGZpbmFsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbWVtYmVycykgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE1lbWJlckFubm90YXRpb25zKGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBhLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gcHJlZml4V2l0aEFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeFdpdGhBU3BhY2UpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgYW5ub3RhdGlvbi5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFR5cGVBcmdzKGZpbmFsIE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/PiBub2RlV2l0aFR5cGVBcmd1bWVudHMsIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBub2RlV2l0aFR5cGVBcmd1bWVudHMuZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KHR5cGVBcmd1bWVudHMpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI8Iik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGU+IGkgPSB0eXBlQXJndW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHQgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIj4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFR5cGVQYXJhbWV0ZXJzKGZpbmFsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IGFyZ3MsIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShhcmdzKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiPCIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxUeXBlUGFyYW1ldGVyPiBpID0gYXJncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZVBhcmFtZXRlciB0ID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgdC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJncywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKCIpOworICAgICAgICBQb3NpdGlvbiBjdXJzb3JSZWYgPSBwcmludGVyLmdldEN1cnNvcigpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYXJncykpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNDb2x1bW5BbGlnblBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlci53cmFwVG9Db2x1bW4oY3Vyc29yUmVmLmNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFByZVBvc3RGaXhPcHRpb25hbExpc3QoZmluYWwgTm9kZUxpc3Q8PyBleHRlbmRzIFZpc2l0YWJsZT4gYXJncywgZmluYWwgVm9pZCBhcmcsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBzZXBhcmF0b3IsIFN0cmluZyBwb3N0Zml4KSB7CisgICAgICAgIGlmICghYXJncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQocHJlZml4KTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIFZpc2l0YWJsZT4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpc2l0YWJsZSB2ID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgdi5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQocG9zdGZpeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRQcmVQb3N0Rml4UmVxdWlyZWRMaXN0KGZpbmFsIE5vZGVMaXN0PD8gZXh0ZW5kcyBWaXNpdGFibGU+IGFyZ3MsIGZpbmFsIFZvaWQgYXJnLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgc2VwYXJhdG9yLCBTdHJpbmcgcG9zdGZpeCkgeworICAgICAgICBwcmludGVyLnByaW50KHByZWZpeCk7CisgICAgICAgIGlmICghYXJncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIFZpc2l0YWJsZT4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpc2l0YWJsZSB2ID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgdi5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KHBvc3RmaXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludENvbW1lbnQoZmluYWwgT3B0aW9uYWw8Q29tbWVudD4gY29tbWVudCwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgY29tbWVudC5pZlByZXNlbnQoYyAtPiBjLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRQYXJzZWQoKSA9PSBVTlBBUlNBQkxFKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIj8/PyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBuLmdldEltcG9ydHMoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKCFuLmdldEltcG9ydHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxUeXBlRGVjbGFyYXRpb248Pz4+IGkgPSBuLmdldFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgaS5uZXh0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbi5nZXRNb2R1bGUoKS5pZlByZXNlbnQobSAtPiBtLmFjY2VwdCh0aGlzLCBhcmcpKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgicGFja2FnZSAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiOyIpOworICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOYW1lIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0UXVhbGlmaWVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0UXVhbGlmaWVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0SWRlbnRpZmllcigpKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFNpbXBsZU5hbWUgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldElkZW50aWZpZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisgICAgICAgIGlmIChuLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImludGVyZmFjZSAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImNsYXNzICIpOworICAgICAgICB9CisKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisKKyAgICAgICAgaWYgKCFuLmdldEV4dGVuZGVkVHlwZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0RXh0ZW5kZWRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgYy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIGltcGxlbWVudHMgIik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpID0gbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZXIucHJpbnRsbigiIHsiKTsKKyAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0TWVtYmVycygpKSkgeworICAgICAgICAgICAgcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKworICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIn0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc1ByaW50Q29tbWVudHMoKSAmJiBjb25maWd1cmF0aW9uLmlzUHJpbnRKYXZhZG9jKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiLyoqIik7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWVudENvbnRlbnQgPSBub3JtYWxpemVFb2xJblRleHRCbG9jayhuLmdldENvbnRlbnQoKSwgY29uZmlndXJhdGlvbi5nZXRFbmRPZkxpbmVDaGFyYWN0ZXIoKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IGNvbW1lbnRDb250ZW50LnNwbGl0KCJcXFIiKTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2tpcHBpbmdMZWFkaW5nRW1wdHlMaW5lcyA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIHByZXBlbmRFbXB0eUxpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpOworICAgICAgICAgICAgICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRyaW1tZWRMaW5lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZSA9IHRyaW1UcmFpbGluZ1NwYWNlcyhsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwcGluZ0xlYWRpbmdFbXB0eUxpbmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kRW1wdHlMaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBwaW5nTGVhZGluZ0VtcHR5TGluZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXBlbmRFbXB0eUxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiICoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRFbXB0eUxpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiAqIiArIGxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiICovIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFlIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBhZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCisgICAgICAgIGlmIChuLmlzVXNpbmdEaWFtb25kT3BlcmF0b3IoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiPD4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50VHlwZUFyZ3MobiwgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFubiA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgYW5uLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUeXBlQm91bmQoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0VHlwZUJvdW5kKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgJiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRUeXBlKCkuYXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QXJyYXlUeXBlPiBhcnJheVR5cGVCdWZmZXIgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFR5cGUgdHlwZSA9IG47CisgICAgICAgIHdoaWxlICh0eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKKyAgICAgICAgICAgIGFycmF5VHlwZUJ1ZmZlci5hZGQoYXJyYXlUeXBlKTsKKyAgICAgICAgICAgIHR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgdHlwZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgZm9yIChBcnJheVR5cGUgYXJyYXlUeXBlIDogYXJyYXlUeXBlQnVmZmVyKSB7CisgICAgICAgICAgICBwcmludEFubm90YXRpb25zKGFycmF5VHlwZS5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiW10iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25MZXZlbCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgdHJ1ZSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiWyIpOworICAgICAgICBpZiAobi5nZXREaW1lbnNpb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXREaW1lbnNpb24oKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCJdIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgJiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgdHJ1ZSwgYXJnKTsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgfCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIj8iKTsKKyAgICAgICAgaWYgKG4uZ2V0RXh0ZW5kZWRUeXBlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgbi5nZXRFeHRlbmRlZFR5cGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTdXBlclR5cGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIHN1cGVyICIpOworICAgICAgICAgICAgbi5nZXRTdXBlclR5cGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gcHJpbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pOworCisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBpZiAoIW4uZ2V0VmFyaWFibGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBPcHRpb25hbDxUeXBlPiBtYXhpbXVtQ29tbW9uVHlwZSA9IG4uZ2V0TWF4aW11bUNvbW1vblR5cGUoKTsKKyAgICAgICAgICAgIG1heGltdW1Db21tb25UeXBlLmlmUHJlc2VudCh0IC0+IHQuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICAgICAgaWYgKCFtYXhpbXVtQ29tbW9uVHlwZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIj8/PyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRvcj4gaSA9IG4uZ2V0VmFyaWFibGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHZhciA9IGkubmV4dCgpOworICAgICAgICAgICAgdmFyLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBuLmdldEFuY2VzdG9yT2ZUeXBlKE5vZGVXaXRoVmFyaWFibGVzLmNsYXNzKS5pZlByZXNlbnQoYW5jZXN0b3IgLT4geworICAgICAgICAgICAgKChOb2RlV2l0aFZhcmlhYmxlczw/PikgYW5jZXN0b3IpLmdldE1heGltdW1Db21tb25UeXBlKCkuaWZQcmVzZW50KGNvbW1vblR5cGUgLT4geworCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlID0gbi5nZXRUeXBlKCk7CisKKyAgICAgICAgICAgICAgICBBcnJheVR5cGUgYXJyYXlUeXBlID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb21tb25UeXBlLmdldEFycmF5TGV2ZWwoKTsgaSA8IHR5cGUuZ2V0QXJyYXlMZXZlbCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5VHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludEFubm90YXRpb25zKGFycmF5VHlwZS5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpOworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCJbXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKworICAgICAgICBpZiAobi5nZXRJbml0aWFsaXplcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgIG4uZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgieyIpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRWYWx1ZXMoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IG4uZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZXhwciA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGV4cHIuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisgICAgICAgIHByaW50ZXIucHJpbnQoIn0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgidm9pZCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhclR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInZhciIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJbIik7CisgICAgICAgIG4uZ2V0SW5kZXgoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiXSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgibmV3ICIpOworICAgICAgICBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGZvciAoQXJyYXlDcmVhdGlvbkxldmVsIGxldmVsIDogbi5nZXRMZXZlbHMoKSkgeworICAgICAgICAgICAgbGV2ZWwuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICAgICAgbi5nZXRJbml0aWFsaXplcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldE9wZXJhdG9yKCkuYXNTdHJpbmcoKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0T3BlcmF0b3IoKS5hc1N0cmluZygpKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiLmNsYXNzIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uZGl0aW9uYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiID8gIik7CisgICAgICAgIG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiIDogIik7CisgICAgICAgIG4uZ2V0RWxzZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgaW5zdGFuY2VvZiAiKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiJyIpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiciKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiXCIiKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworICAgICAgICBwcmludGVyLnByaW50KCJcIiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoU3RyaW5nLnZhbHVlT2Yobi5nZXRWYWx1ZSgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgibnVsbCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgidGhpcyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldENsYXNzRXhwcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldENsYXNzRXhwcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoInN1cGVyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kQ2FsbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc0NvbHVtbkFsaWduRmlyc3RNZXRob2RDaGFpbigpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobi5nZXRTY29wZSgpLmdldCgpIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpIHx8ICghKChNZXRob2RDYWxsRXhwcikgbi5nZXRTY29wZSgpLmdldCgpKS5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXNldE1ldGhvZENoYWluUG9zaXRpb24ocHJpbnRlci5nZXRDdXJzb3IoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci53cmFwVG9Db2x1bW4ocGVla01ldGhvZENoYWluUG9zaXRpb24oKS5jb2x1bW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwdXNoTWV0aG9kQ2hhaW5Qb3NpdGlvbihwcmludGVyLmdldEN1cnNvcigpKTsKKyAgICAgICAgcHJpbnRBcmd1bWVudHMobi5nZXRBcmd1bWVudHMoKSwgYXJnKTsKKyAgICAgICAgcG9wTWV0aG9kQ2hhaW5Qb3NpdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZXIucHJpbnQoIm5ldyAiKTsKKworICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVBcmd1bWVudHMoKS5vckVsc2UobnVsbCkpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBwcmludEFyZ3VtZW50cyhuLmdldEFyZ3VtZW50cygpLCBhcmcpOworCisgICAgICAgIGlmIChuLmdldEFub255bW91c0NsYXNzQm9keSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiB7Iik7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgcHJpbnRNZW1iZXJzKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuZ2V0KCksIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRPcGVyYXRvcigpLmlzUHJlZml4KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRPcGVyYXRvcigpLmFzU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgaWYgKG4uZ2V0T3BlcmF0b3IoKS5pc1Bvc3RmaXgoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludChuLmdldE9wZXJhdG9yKCkuYXNTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisgICAgICAgIHByaW50VHlwZVBhcmFtZXRlcnMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworICAgICAgICBpZiAobi5pc0dlbmVyaWMoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgaWYgKCFuLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8UGFyYW1ldGVyPiBpID0gbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlciBwID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgcC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworCisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFRocm93bkV4Y2VwdGlvbnMoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiB0aHJvd3MgIik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFJlZmVyZW5jZVR5cGU+IGkgPSBuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVmZXJlbmNlVHlwZSBuYW1lID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKTsKKworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVQYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIG4uZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKS5pZlByZXNlbnQocnAgLT4geworICAgICAgICAgICAgcnAuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0UGFyYW1ldGVycygpKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBwLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIpIik7CisKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIHRocm93cyAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8UmVmZXJlbmNlVHlwZT4gaSA9IG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWZlcmVuY2VUeXBlIG5hbWUgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW4uZ2V0Qm9keSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgICAgICBuLmdldEJvZHkoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBpZiAobi5pc1ZhckFyZ3MoKSkgeworICAgICAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldFZhckFyZ3NBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4uLiIpOworICAgICAgICB9CisgICAgICAgIGlmICghKG4uZ2V0VHlwZSgpIGluc3RhbmNlb2YgVW5rbm93blR5cGUpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUmVjZWl2ZXJQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmlzVGhpcygpKSB7CisgICAgICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJ0aGlzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobi5nZXRFeHByZXNzaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJzdXBlciIpOworICAgICAgICB9CisgICAgICAgIHByaW50QXJndW1lbnRzKG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKyAgICAgICAgaWYgKCFuLmdldFZhcmlhYmxlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbi5nZXRNYXhpbXVtQ29tbW9uVHlwZSgpLmlmUHJlc2VudCh0IC0+IHQuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKworICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRvcj4gaSA9IG4uZ2V0VmFyaWFibGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHYgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIHYuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0Q2xhc3NEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJhc3NlcnQgIik7CisgICAgICAgIG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0TWVzc2FnZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgOiAiKTsKKyAgICAgICAgICAgIG4uZ2V0TWVzc2FnZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCJ7Iik7CisgICAgICAgIGlmIChuLmdldFN0YXRlbWVudHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RhdGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgcy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjogIik7CisgICAgICAgIG4uZ2V0U3RhdGVtZW50KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pOworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInN3aXRjaCgiKTsKKyAgICAgICAgbi5nZXRTZWxlY3RvcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50bG4oIikgeyIpOworICAgICAgICBpZiAobi5nZXRFbnRyaWVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3dpdGNoRW50cnlTdG10IGUgOiBuLmdldEVudHJpZXMoKSkgeworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImNhc2UgIik7CisgICAgICAgICAgICBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI6Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJkZWZhdWx0OiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICBpZiAobi5nZXRTdGF0ZW1lbnRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RhdGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgcy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiYnJlYWsiKTsKKyAgICAgICAgbi5nZXRMYWJlbCgpLmlmUHJlc2VudChsIC0+IHByaW50ZXIucHJpbnQoIiAiKS5wcmludChsLmdldElkZW50aWZpZXIoKSkpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInJldHVybiIpOworICAgICAgICBpZiAobi5nZXRFeHByZXNzaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKyAgICAgICAgcHJpbnRlci5wcmludCgiZW51bSAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgaWYgKCFuLmdldEltcGxlbWVudGVkVHlwZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBpbXBsZW1lbnRzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgYy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcmludGVyLnByaW50bG4oIiB7Iik7CisgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgIGlmIChuLmdldEVudHJpZXMoKS5pc05vbkVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxpZ25WZXJ0aWNhbGx5ID0KKyAgICAgICAgICAgICAgICAgICAgLy8gRWl0aGVyIHdlIGhpdCB0aGUgY29uc3RhbnQgYW1vdW50IGxpbWl0IGluIHRoZSBjb25maWd1cmF0aW9ucywgb3IuLi4KKyAgICAgICAgICAgICAgICAgICAgbi5nZXRFbnRyaWVzKCkuc2l6ZSgpID4gY29uZmlndXJhdGlvbi5nZXRNYXhFbnVtQ29uc3RhbnRzVG9BbGlnbkhvcml6b250YWxseSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG9mIHRoZSBjb25zdGFudHMgaGFzIGEgY29tbWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEVudHJpZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChlIC0+IGUuZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gaSA9IG4uZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWduVmVydGljYWxseSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbi5nZXRNZW1iZXJzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgIHByaW50TWVtYmVycyhuLmdldE1lbWJlcnMoKSwgYXJnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbi5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgaWYgKCFuLmdldEFyZ3VtZW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRBcmd1bWVudHMobi5nZXRBcmd1bWVudHMoKSwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbi5nZXRDbGFzc0JvZHkoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiIHsiKTsKKyAgICAgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRDbGFzc0JvZHkoKSwgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigifSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmlzU3RhdGljKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJpZiAoIik7CisgICAgICAgIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gdGhlbkJsb2NrID0gbi5nZXRUaGVuU3RtdCgpIGluc3RhbmNlb2YgQmxvY2tTdG10OworICAgICAgICBpZiAodGhlbkJsb2NrKSAvLyBibG9jayBzdGF0ZW1lbnQgc2hvdWxkIHN0YXJ0IG9uIHRoZSBzYW1lIGxpbmUKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIpIik7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKCF0aGVuQmxvY2spCisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIGlmIChuLmdldEVsc2VTdG10KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGlmICh0aGVuQmxvY2spCisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbHNlSWYgPSBuLmdldEVsc2VTdG10KCkub3JFbHNlKG51bGwpIGluc3RhbmNlb2YgSWZTdG10OworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbHNlQmxvY2sgPSBuLmdldEVsc2VTdG10KCkub3JFbHNlKG51bGwpIGluc3RhbmNlb2YgQmxvY2tTdG10OworICAgICAgICAgICAgaWYgKGVsc2VJZiB8fCBlbHNlQmxvY2spIC8vIHB1dCBjaGFpbmVkIGlmIGFuZCBzdGFydCBvZiBibG9jayBzdGF0ZW1lbnQgb24gYSBzYW1lIGxldmVsCisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiZWxzZSAiKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiZWxzZSIpOworICAgICAgICAgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobi5nZXRFbHNlU3RtdCgpLmlzUHJlc2VudCgpKQorICAgICAgICAgICAgICAgIG4uZ2V0RWxzZVN0bXQoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmICghKGVsc2VJZiB8fCBlbHNlQmxvY2spKQorICAgICAgICAgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFdoaWxlU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIndoaWxlICgiKTsKKyAgICAgICAgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKSAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiY29udGludWUiKTsKKyAgICAgICAgbi5nZXRMYWJlbCgpLmlmUHJlc2VudChsIC0+IHByaW50ZXIucHJpbnQoIiAiKS5wcmludChsLmdldElkZW50aWZpZXIoKSkpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiZG8gIik7CisgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgd2hpbGUgKCIpOworICAgICAgICBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiZm9yICgiKTsKKyAgICAgICAgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgOiAiKTsKKyAgICAgICAgbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiZm9yICgiKTsKKyAgICAgICAgaWYgKG4uZ2V0SW5pdGlhbGl6YXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPEV4cHJlc3Npb24+IGkgPSBuLmdldEluaXRpYWxpemF0aW9uKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsgIik7CisgICAgICAgIGlmIChuLmdldENvbXBhcmUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRDb21wYXJlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiOyAiKTsKKyAgICAgICAgaWYgKG4uZ2V0VXBkYXRlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRVcGRhdGUoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBlID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhyb3dTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgidGhyb3cgIik7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInN5bmNocm9uaXplZCAoIik7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgidHJ5ICIpOworICAgICAgICBpZiAoIW4uZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgICAgICBJdGVyYXRvcjxFeHByZXNzaW9uPiByZXNvdXJjZXMgPSBuLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLm5leHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLmdldFJlc291cmNlcygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgZm9yIChmaW5hbCBDYXRjaENsYXVzZSBjIDogbi5nZXRDYXRjaENsYXVzZXMoKSkgeworICAgICAgICAgICAgYy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRGaW5hbGx5QmxvY2soKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIGZpbmFsbHkgIik7CisgICAgICAgICAgICBuLmdldEZpbmFsbHlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgY2F0Y2ggKCIpOworICAgICAgICBuLmdldFBhcmFtZXRlcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKyAgICAgICAgcHJpbnRlci5wcmludCgiQGludGVyZmFjZSAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiIHsiKTsKKyAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgaWYgKG4uZ2V0TWVtYmVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50TWVtYmVycyhuLmdldE1lbWJlcnMoKSwgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIn0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigpIik7CisgICAgICAgIGlmIChuLmdldERlZmF1bHRWYWx1ZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgZGVmYXVsdCAiKTsKKyAgICAgICAgICAgIG4uZ2V0RGVmYXVsdFZhbHVlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiQCIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIkAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJAIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIGlmIChuLmdldFBhaXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxNZW1iZXJWYWx1ZVBhaXI+IGkgPSBuLmdldFBhaXJzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lbWJlclZhbHVlUGFpciBtID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgbS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgPSAiKTsKKyAgICAgICAgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzSWdub3JlQ29tbWVudHMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIKKyAgICAgICAgICAgICAgICAucHJpbnQoIi8vICIpCisgICAgICAgICAgICAgICAgLnByaW50bG4obm9ybWFsaXplRW9sSW5UZXh0QmxvY2sobi5nZXRDb250ZW50KCksICIiKS50cmltKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc0lnbm9yZUNvbW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWVudENvbnRlbnQgPSBub3JtYWxpemVFb2xJblRleHRCbG9jayhuLmdldENvbnRlbnQoKSwgY29uZmlndXJhdGlvbi5nZXRFbmRPZkxpbmVDaGFyYWN0ZXIoKSk7CisgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gY29tbWVudENvbnRlbnQuc3BsaXQoIlxcUiIsIC0xKTsgLy8gYXMgQmxvY2tDb21tZW50IHNob3VsZCBub3QgYmUgZm9ybWF0dGVkLCAtMSB0byBwcmVzZXJ2ZSBhbnkgdHJhaWxpbmcgZW1wdHkgbGluZSBpZiBwcmVzZW50CisgICAgICAgIHByaW50ZXIucHJpbnQoIi8qIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGxpbmVzLmxlbmd0aCAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQobGluZXNbaV0pOworICAgICAgICAgICAgcHJpbnRlci5wcmludChjb25maWd1cmF0aW9uLmdldEVuZE9mTGluZUNoYXJhY3RlcigpKTsgLy8gQXZvaWRzIGludHJvZHVjaW5nIGluZGVudGF0aW9uIGluIGJsb2NrY29tbWVudHMuIGllOiBkbyBub3QgdXNlIHByaW50bG4oKSBhcyBpdCB3b3VsZCB0cmlnZ2VyIGluZGVudGF0aW9uIGF0IHRoZSBuZXh0IHByaW50IGNhbGwuCisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludChsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSk7IC8vIGxhc3QgbGluZSBpcyBub3QgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLCBhbmQgc2ltcGx5IHRlcm1pbmF0ZWQgd2l0aCBgKi9gCisgICAgICAgIHByaW50ZXIucHJpbnRsbigiKi8iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChMYW1iZGFFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKworICAgICAgICBmaW5hbCBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwcmludFBhciA9IG4uaXNFbmNsb3NpbmdQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgaWYgKHByaW50UGFyKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwID0gaS5uZXh0KCk7CisgICAgICAgICAgICBwLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHJpbnRQYXIpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZXIucHJpbnQoIiAtPiAiKTsKKyAgICAgICAgZmluYWwgU3RhdGVtZW50IGJvZHkgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RtdCkgeworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gZGlyZWN0bHkKKyAgICAgICAgICAgICgoRXhwcmVzc2lvblN0bXQpIGJvZHkpLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvZHkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IG4uZ2V0U2NvcGUoKTsKKyAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBuLmdldElkZW50aWZpZXIoKTsKKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZXIucHJpbnQoIjo6Iik7CisgICAgICAgIHByaW50VHlwZUFyZ3MobiwgYXJnKTsKKyAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludChpZGVudGlmaWVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNPcmRlckltcG9ydHMoKSAmJiBuLnNpemUoKSA+IDAgJiYgbi5nZXQoMCkgaW5zdGFuY2VvZiBJbXBvcnREZWNsYXJhdGlvbikgeworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgICAgICBOb2RlTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gbW9kaWZpYWJsZUxpc3QgPSBuZXcgTm9kZUxpc3Q8PihuKTsKKyAgICAgICAgICAgIG1vZGlmaWFibGVMaXN0LnNvcnQoKGxlZnQsIHJpZ2h0KSAtPiB7CisgICAgICAgICAgICAgICAgaW50IHNvcnQgPSBJbnRlZ2VyLmNvbXBhcmUobGVmdC5pc1N0YXRpYygpID8gMCA6IDEsIHJpZ2h0LmlzU3RhdGljKCkgPyAwIDogMSk7CisgICAgICAgICAgICAgICAgaWYgKHNvcnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzb3J0ID0gbGVmdC5nZXROYW1lQXNTdHJpbmcoKS5jb21wYXJlVG8ocmlnaHQuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc29ydDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZm9yIChPYmplY3Qgbm9kZSA6IG1vZGlmaWFibGVMaXN0KSB7CisgICAgICAgICAgICAgICAgKChOb2RlKSBub2RlKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG5vZGUgOiBuKSB7CisgICAgICAgICAgICAgICAgKChOb2RlKSBub2RlKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiaW1wb3J0ICIpOworICAgICAgICBpZiAobi5pc1N0YXRpYygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJzdGF0aWMgIik7CisgICAgICAgIH0KKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGlmIChuLmlzQXN0ZXJpc2soKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLioiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50bG4oIjsiKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTW9kdWxlRGVjbGFyYXRpb24gbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgaWYgKG4uaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIm9wZW4gIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgibW9kdWxlICIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIgeyIpLmluZGVudCgpOworICAgICAgICBuLmdldE1vZHVsZVN0bXRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKS5wcmludGxuKCJ9Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTW9kdWxlUmVxdWlyZXNTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50ZXIucHJpbnQoInJlcXVpcmVzICIpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1vZHVsZUV4cG9ydHNTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50ZXIucHJpbnQoImV4cG9ydHMgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludFByZVBvc3RGaXhPcHRpb25hbExpc3Qobi5nZXRNb2R1bGVOYW1lcygpLCBhcmcsICIgdG8gIiwgIiwgIiwgIiIpOworICAgICAgICBwcmludGVyLnByaW50bG4oIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChNb2R1bGVQcm92aWRlc1N0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludCgicHJvdmlkZXMgIik7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludFByZVBvc3RGaXhSZXF1aXJlZExpc3Qobi5nZXRXaXRoVHlwZXMoKSwgYXJnLCAiIHdpdGggIiwgIiwgIiwgIiIpOworICAgICAgICBwcmludGVyLnByaW50bG4oIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChNb2R1bGVVc2VzU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICBwcmludGVyLnByaW50KCJ1c2VzICIpOworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTW9kdWxlT3BlbnNTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50ZXIucHJpbnQoIm9wZW5zICIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRQcmVQb3N0Rml4T3B0aW9uYWxMaXN0KG4uZ2V0TW9kdWxlTmFtZXMoKSwgYXJnLCAiIHRvICIsICIsICIsICIiKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoVW5wYXJzYWJsZVN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludCgiPz8/OyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShmaW5hbCBOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNJZ25vcmVDb21tZW50cygpKSByZXR1cm47CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgcmV0dXJuOworCisgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHJldHVybjsKKyAgICAgICAgTGlzdDxOb2RlPiBldmVyeXRoaW5nID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBldmVyeXRoaW5nLmFkZEFsbChwYXJlbnQuZ2V0Q2hpbGROb2RlcygpKTsKKyAgICAgICAgc29ydEJ5QmVnaW5Qb3NpdGlvbihldmVyeXRoaW5nKTsKKyAgICAgICAgaW50IHBvc2l0aW9uT2ZUaGVDaGlsZCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZXJ5dGhpbmcuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChldmVyeXRoaW5nLmdldChpKSA9PSBub2RlKSBwb3NpdGlvbk9mVGhlQ2hpbGQgPSBpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3NpdGlvbk9mVGhlQ2hpbGQgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiSSBhbSBub3QgYSBjaGlsZCBvZiBteSBwYXJlbnQuIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbk9mVGhlQ2hpbGQgLSAxOyBpID49IDAgJiYgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgPT0gLTE7IGktLSkgeworICAgICAgICAgICAgaWYgKCEoZXZlcnl0aGluZy5nZXQoaSkgaW5zdGFuY2VvZiBDb21tZW50KSkgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgPSBpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCArIDE7IGkgPCBwb3NpdGlvbk9mVGhlQ2hpbGQ7IGkrKykgeworICAgICAgICAgICAgTm9kZSBub2RlVG9QcmludCA9IGV2ZXJ5dGhpbmcuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCEobm9kZVRvUHJpbnQgaW5zdGFuY2VvZiBDb21tZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb21tZW50LCBpbnN0ZWFkICIgKyBub2RlVG9QcmludC5nZXRDbGFzcygpICsgIi4gUG9zaXRpb24gb2YgcHJldmlvdXMgY2hpbGQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCArICIsIHBvc2l0aW9uIG9mIGNoaWxkICIgKyBwb3NpdGlvbk9mVGhlQ2hpbGQpOworICAgICAgICAgICAgbm9kZVRvUHJpbnQuYWNjZXB0KHRoaXMsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcoZmluYWwgTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzSWdub3JlQ29tbWVudHMoKSkgcmV0dXJuOworCisgICAgICAgIExpc3Q8Tm9kZT4gZXZlcnl0aGluZyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZXZlcnl0aGluZy5hZGRBbGwobm9kZS5nZXRDaGlsZE5vZGVzKCkpOworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKGV2ZXJ5dGhpbmcpOworICAgICAgICBpZiAoZXZlcnl0aGluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb21tZW50c0F0RW5kID0gMDsKKyAgICAgICAgYm9vbGVhbiBmaW5kaW5nQ29tbWVudHMgPSB0cnVlOworICAgICAgICB3aGlsZSAoZmluZGluZ0NvbW1lbnRzICYmIGNvbW1lbnRzQXRFbmQgPCBldmVyeXRoaW5nLnNpemUoKSkgeworICAgICAgICAgICAgTm9kZSBsYXN0ID0gZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSAxIC0gY29tbWVudHNBdEVuZCk7CisgICAgICAgICAgICBmaW5kaW5nQ29tbWVudHMgPSAobGFzdCBpbnN0YW5jZW9mIENvbW1lbnQpOworICAgICAgICAgICAgaWYgKGZpbmRpbmdDb21tZW50cykgeworICAgICAgICAgICAgICAgIGNvbW1lbnRzQXRFbmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1lbnRzQXRFbmQ7IGkrKykgeworICAgICAgICAgICAgZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSBjb21tZW50c0F0RW5kICsgaSkuYWNjZXB0KHRoaXMsIG51bGwpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNDU3YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworLyoqCisgKiBQcmV0dHkgcHJpbnRlciBmb3IgQVNUIG5vZGVzLgorICovCitwdWJsaWMgY2xhc3MgUHJldHR5UHJpbnRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgICAgcHVibGljIFByZXR0eVByaW50ZXIoKSB7CisgICAgICAgIHRoaXMobmV3IFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBQcmV0dHlQcmludGVyKFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50KE5vZGUgbm9kZSkgeworICAgICAgICBmaW5hbCBQcmV0dHlQcmludFZpc2l0b3IgdmlzaXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0VmlzaXRvckZhY3RvcnkoKS5hcHBseShjb25maWd1cmF0aW9uKTsKKyAgICAgICAgbm9kZS5hY2NlcHQodmlzaXRvciwgbnVsbCk7CisgICAgICAgIHJldHVybiB2aXNpdG9yLmdldFNvdXJjZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjUwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgUHJldHR5UHJpbnRlcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfRU5VTV9DT05TVEFOVFNfVE9fQUxJR05fSE9SSVpPTlRBTExZID0gNTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gb3JkZXJJbXBvcnRzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHByaW50Q29tbWVudHMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBwcmludEphdmFkb2MgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBjb2x1bW5BbGlnblBhcmFtZXRlcnMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29sdW1uQWxpZ25GaXJzdE1ldGhvZENoYWluID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgaW5kZW50ID0gIiAgICAiOworICAgIHByaXZhdGUgU3RyaW5nIGVuZE9mTGluZUNoYXJhY3RlciA9IEVPTDsKKyAgICBwcml2YXRlIEZ1bmN0aW9uPFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uLCBQcmV0dHlQcmludFZpc2l0b3I+IHZpc2l0b3JGYWN0b3J5ID0gUHJldHR5UHJpbnRWaXNpdG9yOjpuZXc7CisgICAgcHJpdmF0ZSBpbnQgbWF4RW51bUNvbnN0YW50c1RvQWxpZ25Ib3Jpem9udGFsbHkgPSBERUZBVUxUX01BWF9FTlVNX0NPTlNUQU5UU19UT19BTElHTl9IT1JJWk9OVEFMTFk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmluZyB0byB1c2UgZm9yIGluZGVudGluZy4gRm9yIGV4YW1wbGU6ICJcdCIsICIgICAgIiwgIiIuCisgICAgICovCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7CisgICAgICAgIHRoaXMuaW5kZW50ID0gYXNzZXJ0Tm90TnVsbChpbmRlbnQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09yZGVySW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVySW1wb3J0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGlzIGFsd2F5cyBvbi4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzTm9ybWFsaXplRW9sSW5Db21tZW50KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGlzIGFsd2F5cyBvbi4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBzZXROb3JtYWxpemVFb2xJbkNvbW1lbnQoYm9vbGVhbiBub3JtYWxpemVFb2xJbkNvbW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmludENvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gcHJpbnRDb21tZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZUNvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gIXByaW50Q29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmludEphdmFkb2MoKSB7CisgICAgICAgIHJldHVybiBwcmludEphdmFkb2M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb2x1bW5BbGlnblBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBjb2x1bW5BbGlnblBhcmFtZXRlcnM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb2x1bW5BbGlnbkZpcnN0TWV0aG9kQ2hhaW4oKSB7CisgICAgICAgIHJldHVybiBjb2x1bW5BbGlnbkZpcnN0TWV0aG9kQ2hhaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB0cnVlLCBhbGwgY29tbWVudHMgd2lsbCBiZSBwcmludGVkLCB1bmxlc3MgcHJpbnRKYXZhZG9jIGlzIGZhbHNlLCB0aGVuIG9ubHkgbGluZSBhbmQgYmxvY2sgY29tbWVudHMgd2lsbCBiZQorICAgICAqIHByaW50ZWQuCisgICAgICovCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldFByaW50Q29tbWVudHMoYm9vbGVhbiBwcmludENvbW1lbnRzKSB7CisgICAgICAgIHRoaXMucHJpbnRDb21tZW50cyA9IHByaW50Q29tbWVudHM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdHJ1ZSwgSmF2YWRvYyB3aWxsIGJlIHByaW50ZWQuCisgICAgICovCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldFByaW50SmF2YWRvYyhib29sZWFuIHByaW50SmF2YWRvYykgeworICAgICAgICB0aGlzLnByaW50SmF2YWRvYyA9IHByaW50SmF2YWRvYzsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldENvbHVtbkFsaWduUGFyYW1ldGVycyhib29sZWFuIGNvbHVtbkFsaWduUGFyYW1ldGVycykgeworICAgICAgICB0aGlzLmNvbHVtbkFsaWduUGFyYW1ldGVycyA9IGNvbHVtbkFsaWduUGFyYW1ldGVyczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldENvbHVtbkFsaWduRmlyc3RNZXRob2RDaGFpbihib29sZWFuIGNvbHVtbkFsaWduRmlyc3RNZXRob2RDaGFpbikgeworICAgICAgICB0aGlzLmNvbHVtbkFsaWduRmlyc3RNZXRob2RDaGFpbiA9IGNvbHVtbkFsaWduRmlyc3RNZXRob2RDaGFpbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZ1bmN0aW9uPFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uLCBQcmV0dHlQcmludFZpc2l0b3I+IGdldFZpc2l0b3JGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gdmlzaXRvckZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgUHJldHR5UHJpbnRWaXNpdG9yLiBCeSBjaGFuZ2luZyB0aGlzIHlvdSBjYW4gbWFrZSB0aGUgUHJldHR5UHJpbnRlciB1c2UgYSBjdXN0b20KKyAgICAgKiBQcmV0dHlQcmludGVyVmlzaXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24gc2V0VmlzaXRvckZhY3RvcnkoRnVuY3Rpb248UHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24sIFByZXR0eVByaW50VmlzaXRvcj4gdmlzaXRvckZhY3RvcnkpIHsKKyAgICAgICAgdGhpcy52aXNpdG9yRmFjdG9yeSA9IGFzc2VydE5vdE51bGwodmlzaXRvckZhY3RvcnkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZE9mTGluZUNoYXJhY3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGVuZE9mTGluZUNoYXJhY3RlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNoYXJhY3RlciB0byBhcHBlbmQgd2hlbiBhIGxpbmUgc2hvdWxkIGVuZC4gRXhhbXBsZSB2YWx1ZXM6ICJcbiIsICJcclxuIiwgIiIuCisgICAgICovCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldEVuZE9mTGluZUNoYXJhY3RlcihTdHJpbmcgZW5kT2ZMaW5lQ2hhcmFjdGVyKSB7CisgICAgICAgIHRoaXMuZW5kT2ZMaW5lQ2hhcmFjdGVyID0gYXNzZXJ0Tm90TnVsbChlbmRPZkxpbmVDaGFyYWN0ZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRydWUsIG9yZGVycyBpbXBvcnRzIGJ5IGFscGhhYmV0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBzZXRPcmRlckltcG9ydHMoYm9vbGVhbiBvcmRlckltcG9ydHMpIHsKKyAgICAgICAgdGhpcy5vcmRlckltcG9ydHMgPSBvcmRlckltcG9ydHM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4RW51bUNvbnN0YW50c1RvQWxpZ25Ib3Jpem9udGFsbHkoKSB7CisgICAgICAgIHJldHVybiBtYXhFbnVtQ29uc3RhbnRzVG9BbGlnbkhvcml6b250YWxseTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCeSBkZWZhdWx0IGVudW0gY29uc3RhbnRzIGdldCBhbGlnbmVkIGxpa2UgdGhpczoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBlbnVtIFggeworICAgICAqICAgICAgICBBLCBCLCBDLCBECisgICAgICogICAgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiB1bnRpbCB0aGUgYW1vdW50IG9mIGNvbnN0YW50cyBwYXNzZXMgdGhpcyB2YWx1ZSAoNSBieSBkZWZhdWx0KS4KKyAgICAgKiBUaGVuIHRoZXkgZ2V0IGFsaWduZWQgbGlrZSB0aGlzOgorICAgICAqIDxwcmU+CisgICAgICogICAgIGVudW0gWCB7CisgICAgICogICAgICAgIEEsCisgICAgICogICAgICAgIEIsCisgICAgICogICAgICAgIEMsCisgICAgICogICAgICAgIEQsCisgICAgICogICAgICAgIEUsCisgICAgICogICAgICAgIEYsCisgICAgICogICAgICAgIEcKKyAgICAgKiAgICAgfQorICAgICAqIDwvcHJlPgorICAgICAqIFNldCBpdCB0byBhIGxhcmdlIG51bWJlciB0byBhbHdheXMgYWxpZ24gaG9yaXpvbnRhbGx5LgorICAgICAqIFNldCBpdCB0byAxIG9yIGxlc3MgdG8gYWx3YXlzIGFsaWduIHZlcnRpY2FsbHkuCisgICAgICovCisgICAgcHVibGljIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHNldE1heEVudW1Db25zdGFudHNUb0FsaWduSG9yaXpvbnRhbGx5KGludCBtYXhFbnVtQ29uc3RhbnRzVG9BbGlnbkhvcml6b250YWxseSkgeworICAgICAgICB0aGlzLm1heEVudW1Db25zdGFudHNUb0FsaWduSG9yaXpvbnRhbGx5ID0gbWF4RW51bUNvbnN0YW50c1RvQWxpZ25Ib3Jpem9udGFsbHk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByaW50YWJsZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvUHJpbnRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwYmFhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByaW50YWJsZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworLyoqCisgKiBTb21ldGhpbmcgdGhhdCBoYXMgYSBwcmludGFibGUgZm9ybS4gSS5lLiwgaXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHVzZXItZmFjaW5nIFN0cmluZy4KKyAqLworcHVibGljIGludGVyZmFjZSBQcmludGFibGUgeworICAgIFN0cmluZyBhc1N0cmluZygpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvU291cmNlUHJpbnRlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvU291cmNlUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2Q5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Tb3VyY2VQcmludGVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlsczsKKworcHVibGljIGNsYXNzIFNvdXJjZVByaW50ZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW5kZW50YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZW50YXRpb25MZW5ndGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW5kT2ZMaW5lQ2hhcmFjdGVyOworICAgIHByaXZhdGUgaW50IGxldmVsID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5kZW50ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBwcml2YXRlIFBvc2l0aW9uIGN1cnNvciA9IG5ldyBQb3NpdGlvbigxLCAwKTsKKworICAgIFNvdXJjZVByaW50ZXIoZmluYWwgU3RyaW5nIGluZGVudGF0aW9uLCBmaW5hbCBTdHJpbmcgZW5kT2ZMaW5lQ2hhcmFjdGVyKSB7CisgICAgICAgIHRoaXMuaW5kZW50YXRpb24gPSBpbmRlbnRhdGlvbjsKKyAgICAgICAgdGhpcy5pbmRlbnRhdGlvbkxlbmd0aCA9IGluZGVudGF0aW9uLmxlbmd0aCgpOworICAgICAgICB0aGlzLmVuZE9mTGluZUNoYXJhY3RlciA9IGVuZE9mTGluZUNoYXJhY3RlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlUHJpbnRlciBpbmRlbnQoKSB7CisgICAgICAgIGxldmVsKys7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTb3VyY2VQcmludGVyIHVuaW5kZW50KCkgeworICAgICAgICBsZXZlbC0tOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUluZGVudCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGluZGVudGF0aW9uKTsKKyAgICAgICAgICAgIGN1cnNvciA9IFBvc2l0aW9uLnBvcyhjdXJzb3IubGluZSwgY3Vyc29yLmNvbHVtbiArIGluZGVudGF0aW9uTGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgc291cmNlIHN0cmluZyBwYXNzZWQgYXMgYXJndW1lbnQgdG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBJZiB0aGlzIGlzIGJlaW5nIGFwcGVuZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLCBwZXJmb3JtcyBpbmRlbnRhdGlvbiBmaXJzdC4KKyAgICAgKiA8cD4gCisgICAgICogVGhlIHNvdXJjZSBsaW5lIHRvIGJlIHByaW50ZWQgc2hvdWxkIG5vdCBjb250YWluIG5ld2xpbmUvY2FycmlhZ2UtcmV0dXJuIGNoYXJhY3RlcnM7CisgICAgICogdXNlIHtAbGluayAjcHJpbnRsbihTdHJpbmcpfSB0byBhdXRvbWF0aWNhbGx5IGFwcGVuZCBhIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgc291cmNlIHN0cmluZy4KKyAgICAgKiBJZiB0aGUgc291cmNlIGxpbmUgcGFzc2VkIGFzIGFyZ3VtZW50IGNvbnRhaW5zIG5ld2xpbmUvY2FycmlhZ2UtcmV0dXJuIGNoYXJhY3RlcnMgd291bGQKKyAgICAgKiBpbXByZWRpY3RhYmx5IGFmZmVjdCBhIGNvcnJlY3QgY29tcHV0YXRpb24gb2YgdGhlIGN1cnJlbnQge0BsaW5rICNnZXRDdXJzb3IoKX0gcG9zaXRpb24uIAorICAgICAqIAorICAgICAqIEBzZWUgU291cmNlUHJpbnRlciNwcmludGxuKFN0cmluZykgCisgICAgICogQHBhcmFtIGFyZyBzb3VyY2UgbGluZSB0byBiZSBwcmludGVkIChzaG91bGQgbm90IGNvbnRhaW4gbmV3bGluZS9jYXJyaWFnZS1yZXR1cm4gY2hhcmFjdGVycykKKyAgICAgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UsIGZvciBuZXN0aW5nIGNhbGxzIHRvIG1ldGhvZCBhcyBmbHVlbnQgaW50ZXJmYWNlCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVByaW50ZXIgcHJpbnQoZmluYWwgU3RyaW5nIGFyZykgeworICAgICAgICBpZiAoIWluZGVudGVkKSB7CisgICAgICAgICAgICBtYWtlSW5kZW50KCk7CisgICAgICAgICAgICBpbmRlbnRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZChhcmcpOworICAgICAgICBjdXJzb3IgPSBQb3NpdGlvbi5wb3MoY3Vyc29yLmxpbmUsIGN1cnNvci5jb2x1bW4gKyBhcmcubGVuZ3RoKCkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIHNvdXJjZSBzdHJpbmcgcGFzc2VkIGFzIGFyZ3VtZW50IHRvIHRoZSBidWZmZXIsIHRoZW4gYXBwZW5kIGEgbmV3bGluZS4KKyAgICAgKiBJZiB0aGlzIGlzIGJlaW5nIGFwcGVuZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLCBwZXJmb3JtcyBpbmRlbnRhdGlvbiBmaXJzdC4KKyAgICAgKiA8cD4gIAorICAgICAqIFRoZSBzb3VyY2UgbGluZSB0byBiZSBwcmludGVkIHNob3VsZCBub3QgY29udGFpbiBuZXdsaW5lL2NhcnJpYWdlLXJldHVybiBjaGFyYWN0ZXJzLgorICAgICAqIElmIHRoZSBzb3VyY2UgbGluZSBwYXNzZWQgYXMgYXJndW1lbnQgY29udGFpbnMgbmV3bGluZS9jYXJyaWFnZS1yZXR1cm4gY2hhcmFjdGVycyB3b3VsZAorICAgICAqIGltcHJlZGljdGFibHkgYWZmZWN0IGEgY29ycmVjdCBjb21wdXRhdGlvbiBvZiB0aGUgY3VycmVudCB7QGxpbmsgI2dldEN1cnNvcigpfSBwb3NpdGlvbi4gCisgICAgICogCisgICAgICogQHBhcmFtIGFyZyBzb3VyY2UgbGluZSB0byBiZSBwcmludGVkIChzaG91bGQgbm90IGNvbnRhaW4gbmV3bGluZS9jYXJyaWFnZS1yZXR1cm4gY2hhcmFjdGVycykKKyAgICAgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UsIGZvciBuZXN0aW5nIGNhbGxzIHRvIG1ldGhvZCBhcyBmbHVlbnQgaW50ZXJmYWNlCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVByaW50ZXIgcHJpbnRsbihmaW5hbCBTdHJpbmcgYXJnKSB7CisgICAgICAgIHByaW50KGFyZyk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGEgbmV3bGluZSB0byB0aGUgYnVmZmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSwgZm9yIG5lc3RpbmcgY2FsbHMgdG8gbWV0aG9kIGFzIGZsdWVudCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlUHJpbnRlciBwcmludGxuKCkgeworICAgICAgICBidWYuYXBwZW5kKGVuZE9mTGluZUNoYXJhY3Rlcik7CisgICAgICAgIGN1cnNvciA9IFBvc2l0aW9uLnBvcyhjdXJzb3IubGluZSArIDEsIDApOworICAgICAgICBpbmRlbnRlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIChsaW5lLCBjb2x1bW4pIGluIHRoZSBzb3VyY2UgcHJpbnRlciBidWZmZXIuCisgICAgICogPHA+IAorICAgICAqIFBsZWFzZSBub3RpY2UgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIGEgY29ycmVjdCBjb21wdXRhdGlvbiBvZiB0aGUgY3Vyc29yIHBvc2l0aW9uLAorICAgICAqIHRoaXMgcHJpbnRlciBleHBlY3QgdGhlIGNvbnRyYWN0cyBvZiB0aGUgbWV0aG9kcyB7QGxpbmsgI3ByaW50KFN0cmluZyl9IGFuZCB7QGxpbmsgI3ByaW50bG4oU3RyaW5nKX0KKyAgICAgKiBoYXMgYmVlbiByZXNwZWN0ZWQgdGhyb3VnaCBhbGwgbWV0aG9kIGNhbGxzLCBtZWFuaW5nIHRoZSBzb3VyY2Ugc3RyaW5nIHBhc3NlZCBhcyBhcmd1bWVudCB0byB0aG9zZSBtZXRob2QKKyAgICAgKiBjYWxscyBkaWQgbm90IGNvbnRhaW4gbmV3bGluZS9jYXJyaWFnZS1yZXR1cm4gY2hhcmFjdGVycy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiAobGluZSwgY29sdW1uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUG9zaXRpb24gZ2V0Q3Vyc29yKCkgeworICAgICAgICByZXR1cm4gY3Vyc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgbmV3IGxpbmUgYW5kIGluZGVudCwgdGhlbiBwcmludHMgZW5vdWdoIHNwYWNlIGNoYXJhY3RlcnMgdW50aWwgYWxpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gdG8gYWxpZ24gdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cmFwVG9Db2x1bW4oaW50IGNvbHVtbikgeworICAgICAgICBwcmludGxuKCk7CisgICAgICAgIGlmICghaW5kZW50ZWQpIHsKKyAgICAgICAgICAgIG1ha2VJbmRlbnQoKTsKKyAgICAgICAgICAgIGluZGVudGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIGN1cnNvci5jb2x1bW4gPCBjb2x1bW4gKSB7CisgICAgICAgICAgICBwcmludCgiICIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0U291cmNlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBub3JtYWxpemVFb2xJblRleHRCbG9jayhTdHJpbmcgY29udGVudCkgeworICAgICAgICByZXR1cm4gVXRpbHMubm9ybWFsaXplRW9sSW5UZXh0QmxvY2soY29udGVudCwgZW5kT2ZMaW5lQ2hhcmFjdGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9YbWxQcmludGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9YbWxQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2OWM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1htbFByaW50ZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Ob2RlTWV0YU1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuUHJvcGVydHlNZXRhTW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKKworLyoqCisgKiBPdXRwdXRzIGFuIFhNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIEFTVCBtZWFudCBmb3IgaW5zcGVjdGluZyBpdC4KKyAqLworcHVibGljIGNsYXNzIFhtbFByaW50ZXIgeworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBvdXRwdXROb2RlVHlwZTsKKworICAgIHB1YmxpYyBYbWxQcmludGVyKGJvb2xlYW4gb3V0cHV0Tm9kZVR5cGUpIHsKKyAgICAgICAgdGhpcy5vdXRwdXROb2RlVHlwZSA9IG91dHB1dE5vZGVUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0KE5vZGUgbm9kZSkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG91dHB1dChub2RlLCAicm9vdCIsIDAsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdXRwdXQoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgaW50IGxldmVsLCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChub2RlKTsKKyAgICAgICAgTm9kZU1ldGFNb2RlbCBtZXRhTW9kZWwgPSBub2RlLmdldE1ldGFNb2RlbCgpOworICAgICAgICBMaXN0PFByb3BlcnR5TWV0YU1vZGVsPiBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMgPSBtZXRhTW9kZWwuZ2V0QWxsUHJvcGVydHlNZXRhTW9kZWxzKCk7CisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IGF0dHJpYnV0ZXMgPSBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMuc3RyZWFtKCkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc0F0dHJpYnV0ZSkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc1Npbmd1bGFyKS5jb2xsZWN0KHRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxQcm9wZXJ0eU1ldGFNb2RlbD4gc3ViTm9kZXMgPSBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMuc3RyZWFtKCkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc05vZGUpLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNTaW5ndWxhcikuY29sbGVjdCh0b0xpc3QoKSk7CisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IHN1Ykxpc3RzID0gYWxsUHJvcGVydHlNZXRhTW9kZWxzLnN0cmVhbSgpLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNOb2RlTGlzdCkuY29sbGVjdCh0b0xpc3QoKSk7CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjwiKS5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChvdXRwdXROb2RlVHlwZSkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYXR0cmlidXRlKCJ0eXBlIiwgbWV0YU1vZGVsLmdldFR5cGVOYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgYXR0cmlidXRlTWV0YU1vZGVsIDogYXR0cmlidXRlcykgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYXR0cmlidXRlKGF0dHJpYnV0ZU1ldGFNb2RlbC5nZXROYW1lKCksIGF0dHJpYnV0ZU1ldGFNb2RlbC5nZXRWYWx1ZShub2RlKS50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIj4iKTsKKworICAgICAgICBmb3IgKFByb3BlcnR5TWV0YU1vZGVsIHN1Yk5vZGVNZXRhTW9kZWwgOiBzdWJOb2RlcykgeworICAgICAgICAgICAgTm9kZSB2YWx1ZSA9IChOb2RlKSBzdWJOb2RlTWV0YU1vZGVsLmdldFZhbHVlKG5vZGUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQodmFsdWUsIHN1Yk5vZGVNZXRhTW9kZWwuZ2V0TmFtZSgpLCBsZXZlbCArIDEsIGJ1aWxkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBzdWJMaXN0TWV0YU1vZGVsIDogc3ViTGlzdHMpIHsKKyAgICAgICAgICAgIE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPiBzdWJMaXN0ID0gKE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPikgc3ViTGlzdE1ldGFNb2RlbC5nZXRWYWx1ZShub2RlKTsKKyAgICAgICAgICAgIGlmIChzdWJMaXN0ICE9IG51bGwgJiYgIXN1Ykxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpc3ROYW1lID0gc3ViTGlzdE1ldGFNb2RlbC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjwiKS5hcHBlbmQobGlzdE5hbWUpLmFwcGVuZCgiPiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBzaW5ndWxhciA9IGxpc3ROYW1lLnN1YnN0cmluZygwLCBsaXN0TmFtZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIGZvciAoTm9kZSBzdWJMaXN0Tm9kZSA6IHN1Ykxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KHN1Ykxpc3ROb2RlLCBzaW5ndWxhciwgbGV2ZWwgKyAxLCBidWlsZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2xvc2UobGlzdE5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLmFwcGVuZChjbG9zZShuYW1lKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsb3NlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAiPC8iICsgbmFtZSArICI+IjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICIgIiArIG5hbWUgKyAiPSciICsgdmFsdWUgKyAiJyI7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9ZYW1sUHJpbnRlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvWWFtbFByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQxOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvWWFtbFByaW50ZXIuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7DQorDQoraW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsNCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuTm9kZU1ldGFNb2RlbDsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5Qcm9wZXJ0eU1ldGFNb2RlbDsNCisNCisvKioNCisgKiBPdXRwdXRzIGEgWUFNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIEFTVCBtZWFudCBmb3IgaW5zcGVjdGluZyBpdC4NCisgKi8NCitwdWJsaWMgY2xhc3MgWWFtbFByaW50ZXIgew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NQQUNFU19GT1JfSU5ERU5UID0gNDsNCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG91dHB1dE5vZGVUeXBlOw0KKw0KKyAgICBwdWJsaWMgWWFtbFByaW50ZXIoYm9vbGVhbiBvdXRwdXROb2RlVHlwZSkgew0KKyAgICAgICAgdGhpcy5vdXRwdXROb2RlVHlwZSA9IG91dHB1dE5vZGVUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0KE5vZGUgbm9kZSkgew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiLS0tIik7DQorICAgICAgICBvdXRwdXQobm9kZSwgInJvb3QiLCAwLCBvdXRwdXQpOw0KKyAgICAgICAgb3V0cHV0LmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgIi4uLiIpOw0KKyAgICAgICAgcmV0dXJuIG91dHB1dC50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIG91dHB1dChOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBpbnQgbGV2ZWwsIFN0cmluZ0J1aWxkZXIgYnVpbGRlcikgew0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChub2RlKTsNCisgICAgICAgIE5vZGVNZXRhTW9kZWwgbWV0YU1vZGVsID0gbm9kZS5nZXRNZXRhTW9kZWwoKTsNCisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IGFsbFByb3BlcnR5TWV0YU1vZGVscyA9IG1ldGFNb2RlbC5nZXRBbGxQcm9wZXJ0eU1ldGFNb2RlbHMoKTsNCisgICAgICAgIExpc3Q8UHJvcGVydHlNZXRhTW9kZWw+IGF0dHJpYnV0ZXMgPSBhbGxQcm9wZXJ0eU1ldGFNb2RlbHMuc3RyZWFtKCkuZmlsdGVyKFByb3BlcnR5TWV0YU1vZGVsOjppc0F0dHJpYnV0ZSkNCisgICAgICAgICAgICAgICAgLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNTaW5ndWxhcikuY29sbGVjdCh0b0xpc3QoKSk7DQorICAgICAgICBMaXN0PFByb3BlcnR5TWV0YU1vZGVsPiBzdWJOb2RlcyA9IGFsbFByb3BlcnR5TWV0YU1vZGVscy5zdHJlYW0oKS5maWx0ZXIoUHJvcGVydHlNZXRhTW9kZWw6OmlzTm9kZSkNCisgICAgICAgICAgICAgICAgLmZpbHRlcihQcm9wZXJ0eU1ldGFNb2RlbDo6aXNTaW5ndWxhcikuY29sbGVjdCh0b0xpc3QoKSk7DQorICAgICAgICBMaXN0PFByb3BlcnR5TWV0YU1vZGVsPiBzdWJMaXN0cyA9IGFsbFByb3BlcnR5TWV0YU1vZGVscy5zdHJlYW0oKS5maWx0ZXIoUHJvcGVydHlNZXRhTW9kZWw6OmlzTm9kZUxpc3QpDQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKTsNCisNCisgICAgICAgIGlmIChvdXRwdXROb2RlVHlwZSkNCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgaW5kZW50KGxldmVsKSArIG5hbWUgKyAiKFR5cGU9IiArIG1ldGFNb2RlbC5nZXRUeXBlTmFtZSgpICsgIik6ICIpOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBpbmRlbnQobGV2ZWwpICsgbmFtZSArICI6ICIpOw0KKw0KKyAgICAgICAgbGV2ZWwrKzsNCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgYSA6IGF0dHJpYnV0ZXMpIHsNCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgaW5kZW50KGxldmVsKSArIGEuZ2V0TmFtZSgpICsgIjogXCIiDQorICAgICAgICAgICAgICAgICAgICArIGEuZ2V0VmFsdWUobm9kZSkudG9TdHJpbmcoKSArICJcIiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZm9yIChQcm9wZXJ0eU1ldGFNb2RlbCBzbiA6IHN1Yk5vZGVzKSB7DQorICAgICAgICAgICAgTm9kZSBuZCA9IChOb2RlKSBzbi5nZXRWYWx1ZShub2RlKTsNCisgICAgICAgICAgICBpZiAobmQgIT0gbnVsbCkNCisgICAgICAgICAgICAgICAgb3V0cHV0KG5kLCBzbi5nZXROYW1lKCksIGxldmVsLCBidWlsZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoUHJvcGVydHlNZXRhTW9kZWwgc2wgOiBzdWJMaXN0cykgew0KKyAgICAgICAgICAgIE5vZGVMaXN0PD8gZXh0ZW5kcyBOb2RlPiBubCA9IChOb2RlTGlzdDw/IGV4dGVuZHMgTm9kZT4pIHNsLmdldFZhbHVlKG5vZGUpOw0KKyAgICAgICAgICAgIGlmIChubCAhPSBudWxsICYmIG5sLmlzTm9uRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgaW5kZW50KGxldmVsKSArIHNsLmdldE5hbWUoKSArICI6ICIpOw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgc2xOYW1lID0gc2wuZ2V0TmFtZSgpOw0KKyAgICAgICAgICAgICAgICBzbE5hbWUgPSBzbE5hbWUuZW5kc1dpdGgoInMiKSA/IHNsTmFtZS5zdWJzdHJpbmcoMCwgc2wuZ2V0TmFtZSgpLmxlbmd0aCgpIC0gMSkgOiBzbE5hbWU7DQorICAgICAgICAgICAgICAgIGZvciAoTm9kZSBuZCA6IG5sKQ0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KG5kLCAiLSAiICsgc2xOYW1lLCBsZXZlbCArIDEsIGJ1aWxkZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBpbmRlbnQoaW50IGxldmVsKSB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykNCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE5VTV9TUEFDRVNfRk9SX0lOREVOVDsgaisrKQ0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsNCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtQXR0cmlidXRlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDY3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Tb3VyY2VQcmludGVyOworCitwdWJsaWMgY2xhc3MgQ3NtQXR0cmlidXRlIGltcGxlbWVudHMgQ3NtRWxlbWVudCB7CisgICAgcHVibGljIE9ic2VydmFibGVQcm9wZXJ0eSBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5OworCisgICAgcHVibGljIENzbUF0dHJpYnV0ZShPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnR5LmdldFJhd1ZhbHVlKG5vZGUpOworICAgICAgICBwcmludGVyLnByaW50KFByaW50aW5nSGVscGVyLnByaW50VG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gdGhlIHRva2VuIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWMgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gdGhlIGF0dHJpYnV0ZSAiT3BlcmF0b3IiIGRpZmZlcmVudCB0b2tlbiBjb3VsZCBjb3JyZXNwb25kIGxpa2UgUExVUyBvciBNSU5VUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRva2VuVHlwZShOb2RlIG5vZGUsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5JREVOVElGSUVSOworICAgICAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZEltYWdlID0gIlwiIiArIHRleHQudG9Mb3dlckNhc2UoKSArICJcIiI7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8R2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy50b2tlbkltYWdlLmxlbmd0aDtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMudG9rZW5JbWFnZVtpXS5lcXVhbHMoZXhwZWN0ZWRJbWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRyaWJ1dGUgJ3R5cGUnIGRvZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYW55IGV4cGVjdGVkIHZhbHVlLiBUZXh0OiAiICsgdGV4dCk7CisgICAgICAgICAgICBjYXNlIE9QRVJBVE9SOgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSW50ZWdlcikoR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKHRleHQpLmdldChudWxsKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnxOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRyaWJ1dGUgJ29wZXJhdG9yJyBkb2VzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGFueSBleHBlY3RlZCB2YWx1ZS4gVGV4dDogIiArIHRleHQsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVkFMVUU6CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJbnRlZ2VyTGl0ZXJhbEV4cHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSU5URUdFUl9MSVRFUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5JREVOVElGSUVSOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2V0VG9rZW5UeXBlIGRvZXMgbm90IGtub3cgaG93IHRvIGhhbmRsZSBwcm9wZXJ0eSAiCisgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eSArICIgd2l0aCB0ZXh0OiAiICsgdGV4dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21DaGFyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUNoYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjIyODk5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21DaGFyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Tb3VyY2VQcmludGVyOworCitwdWJsaWMgY2xhc3MgQ3NtQ2hhciBpbXBsZW1lbnRzIENzbUVsZW1lbnQgeworICAgIHByaXZhdGUgZmluYWwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5OworCisgICAgcHVibGljIENzbUNoYXIoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICBwcmludGVyLnByaW50KCInIik7CisgICAgICAgIHByaW50ZXIucHJpbnQocHJvcGVydHkuZ2V0VmFsdWVBc1N0cmluZ0F0dHJpYnV0ZShub2RlKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiciKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUNvbW1lbnQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtQ29tbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjg0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUNvbW1lbnQuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5jb25jcmV0ZXN5bnRheG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuU291cmNlUHJpbnRlcjsKKworcHVibGljIGNsYXNzIENzbUNvbW1lbnQgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3MoQ29tbWVudCBjb21tZW50LCBTb3VyY2VQcmludGVyIHByaW50ZXIpIHsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBwcmludGVyLm5vcm1hbGl6ZUVvbEluVGV4dEJsb2NrKGNvbW1lbnQuZ2V0Q29udGVudCgpKTsKKyAgICAgICAgaWYgKGNvbW1lbnQgaW5zdGFuY2VvZiBCbG9ja0NvbW1lbnQpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi8qIik7CisgICAgICAgICAgICBwcmludGVyLnByaW50KGNvbnRlbnQpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIqLyIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1lbnQgaW5zdGFuY2VvZiBKYXZhZG9jQ29tbWVudCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLyoqIik7CisgICAgICAgICAgICBwcmludGVyLnByaW50KGNvbnRlbnQpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIqLyIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1lbnQgaW5zdGFuY2VvZiBMaW5lQ29tbWVudCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLy8iKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoY29udGVudCk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihjb21tZW50LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIG5vZGUuZ2V0Q29tbWVudCgpLmlmUHJlc2VudChjIC0+IHByb2Nlc3MoYywgcHJpbnRlcikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21Db25kaXRpb25hbC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21Db25kaXRpb25hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2E3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUNvbmRpdGlvbmFsLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Tb3VyY2VQcmludGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENzbUNvbmRpdGlvbmFsIGltcGxlbWVudHMgQ3NtRWxlbWVudCB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gY29uZGl0aW9uOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPYnNlcnZhYmxlUHJvcGVydHk+IHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBDc21FbGVtZW50IHRoZW5FbGVtZW50OworICAgIHByaXZhdGUgZmluYWwgQ3NtRWxlbWVudCBlbHNlRWxlbWVudDsKKworICAgIHB1YmxpYyBDb25kaXRpb24gZ2V0Q29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gY29uZGl0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBPYnNlcnZhYmxlUHJvcGVydHkgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoMCk7CisgICAgfQorCisgICAgcHVibGljIENzbUVsZW1lbnQgZ2V0VGhlbkVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiB0aGVuRWxlbWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtRWxlbWVudCBnZXRFbHNlRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGVsc2VFbGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyBlbnVtIENvbmRpdGlvbiB7CisgICAgICAgIElTX0VNUFRZLAorICAgICAgICBJU19OT1RfRU1QVFksCisgICAgICAgIElTX1BSRVNFTlQsCisgICAgICAgIEZMQUc7CisKKyAgICAgICAgYm9vbGVhbiBldmFsdWF0ZShOb2RlIG5vZGUsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSl7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBJU19QUkVTRU5UKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFwcm9wZXJ0eS5pc051bGxPck5vdFByZXNlbnQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcyA9PSBGTEFHKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFZhbHVlQXNCb29sZWFuQXR0cmlidXRlKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMgPT0gSVNfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlQXNNdWx0aXBsZVJlZmVyZW5jZShub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5pc0VtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcyA9PSBJU19OT1RfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlQXNNdWx0aXBsZVJlZmVyZW5jZShub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNFbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtQ29uZGl0aW9uYWwoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBDb25kaXRpb24gY29uZGl0aW9uLCBDc21FbGVtZW50IHRoZW5FbGVtZW50LCBDc21FbGVtZW50IGVsc2VFbGVtZW50KSB7CisgICAgICAgIHRoaXMucHJvcGVydGllcyA9IEFycmF5cy5hc0xpc3QocHJvcGVydHkpOworICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgdGhpcy50aGVuRWxlbWVudCA9IHRoZW5FbGVtZW50OworICAgICAgICB0aGlzLmVsc2VFbGVtZW50ID0gZWxzZUVsZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIENzbUNvbmRpdGlvbmFsKExpc3Q8T2JzZXJ2YWJsZVByb3BlcnR5PiBwcm9wZXJ0aWVzLCBDb25kaXRpb24gY29uZGl0aW9uLCBDc21FbGVtZW50IHRoZW5FbGVtZW50LCBDc21FbGVtZW50IGVsc2VFbGVtZW50KSB7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgdGhpcy50aGVuRWxlbWVudCA9IHRoZW5FbGVtZW50OworICAgICAgICB0aGlzLmVsc2VFbGVtZW50ID0gZWxzZUVsZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIENzbUNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgQ29uZGl0aW9uIGNvbmRpdGlvbiwgQ3NtRWxlbWVudCB0aGVuRWxlbWVudCkgeworICAgICAgICB0aGlzKHByb3BlcnR5LCBjb25kaXRpb24sIHRoZW5FbGVtZW50LCBuZXcgQ3NtTm9uZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICBib29sZWFuIHRlc3QgPSBmYWxzZTsKKyAgICAgICAgZm9yIChPYnNlcnZhYmxlUHJvcGVydHkgcHJvcCA6IHByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHRlc3QgPSB0ZXN0IHx8IGNvbmRpdGlvbi5ldmFsdWF0ZShub2RlLCBwcm9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVzdCkgeworICAgICAgICAgICAgdGhlbkVsZW1lbnQucHJldHR5UHJpbnQobm9kZSwgcHJpbnRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbHNlRWxlbWVudC5wcmV0dHlQcmludChub2RlLCBwcmludGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtRWxlbWVudC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21FbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1NjZkMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5jb25jcmV0ZXN5bnRheG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlNvdXJjZVByaW50ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblR5cGVzLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ3NtRWxlbWVudCB7CisKKyAgICB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKTsKKworICAgIHN0YXRpYyBDc21FbGVtZW50IGNoaWxkKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gbmV3IENzbVNpbmdsZVJlZmVyZW5jZShwcm9wZXJ0eSk7CisgICAgfQorCisgICAgc3RhdGljIENzbUVsZW1lbnQgYXR0cmlidXRlKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gbmV3IENzbUF0dHJpYnV0ZShwcm9wZXJ0eSk7CisgICAgfQorCisgICAgc3RhdGljIENzbUVsZW1lbnQgc2VxdWVuY2UoQ3NtRWxlbWVudC4uLiBlbGVtZW50cykgeworICAgICAgICByZXR1cm4gbmV3IENzbVNlcXVlbmNlKEFycmF5cy5hc0xpc3QoZWxlbWVudHMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBzdHJpbmcoaW50IHRva2VuVHlwZSwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21Ub2tlbih0b2tlblR5cGUsIGNvbnRlbnQpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IHN0cmluZyhpbnQgdG9rZW5UeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtVG9rZW4odG9rZW5UeXBlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBzdHJpbmdUb2tlbihPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21TdHJpbmcocHJvcGVydHkpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IGNoYXJUb2tlbihPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21DaGFyKHByb3BlcnR5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCB0b2tlbihpbnQgdG9rZW5UeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtVG9rZW4odG9rZW5UeXBlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCB0b2tlbihpbnQgdG9rZW5UeXBlLCBDc21Ub2tlbi5Ub2tlbkNvbnRlbnRDYWxjdWxhdG9yIHRva2VuQ29udGVudENhbGN1bGF0b3IpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21Ub2tlbih0b2tlblR5cGUsIHRva2VuQ29udGVudENhbGN1bGF0b3IpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IGNvbmRpdGlvbmFsKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgQ3NtQ29uZGl0aW9uYWwuQ29uZGl0aW9uIGNvbmRpdGlvbiwgQ3NtRWxlbWVudCB0aGVuRWxlbWVudCkgeworICAgICAgICByZXR1cm4gbmV3IENzbUNvbmRpdGlvbmFsKHByb3BlcnR5LCBjb25kaXRpb24sIHRoZW5FbGVtZW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBjb25kaXRpb25hbChPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIENzbUNvbmRpdGlvbmFsLkNvbmRpdGlvbiBjb25kaXRpb24sIENzbUVsZW1lbnQgdGhlbkVsZW1lbnQsIENzbUVsZW1lbnQgZWxzZUVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21Db25kaXRpb25hbChwcm9wZXJ0eSwgY29uZGl0aW9uLCB0aGVuRWxlbWVudCwgZWxzZUVsZW1lbnQpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IGNvbmRpdGlvbmFsKExpc3Q8T2JzZXJ2YWJsZVByb3BlcnR5PiBwcm9wZXJ0aWVzLCBDc21Db25kaXRpb25hbC5Db25kaXRpb24gY29uZGl0aW9uLCBDc21FbGVtZW50IHRoZW5FbGVtZW50LCBDc21FbGVtZW50IGVsc2VFbGVtZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtQ29uZGl0aW9uYWwocHJvcGVydGllcywgY29uZGl0aW9uLCB0aGVuRWxlbWVudCwgZWxzZUVsZW1lbnQpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IHNwYWNlKCkgeworICAgICAgICByZXR1cm4gbmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCksICIgIik7CisgICAgfQorCisgICAgc3RhdGljIENzbUVsZW1lbnQgc2VtaWNvbG9uKCkgeworICAgICAgICByZXR1cm4gbmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuU0VNSUNPTE9OKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBjb21tZW50KCkgeyByZXR1cm4gbmV3IENzbUNvbW1lbnQoKTsgfQorCisgICAgc3RhdGljIENzbUVsZW1lbnQgbmV3bGluZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSwgRU9MKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBub25lKCkgeworICAgICAgICByZXR1cm4gbmV3IENzbU5vbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBjb21tYSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkNPTU1BKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBsaXN0KE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gbmV3IENzbUxpc3QocHJvcGVydHkpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBDc21FbGVtZW50IHNlcGFyYXRvcikgeworICAgICAgICByZXR1cm4gbmV3IENzbUxpc3QocHJvcGVydHksIENzbUVsZW1lbnQubm9uZSgpLCBzZXBhcmF0b3IsIG5ldyBDc21Ob25lKCksIG5ldyBDc21Ob25lKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBDc21FbGVtZW50IHNlcGFyYXRvciwgQ3NtRWxlbWVudCBwcmVjZWVkaW5nLCBDc21FbGVtZW50IGZvbGxvd2luZykgeworICAgICAgICByZXR1cm4gbmV3IENzbUxpc3QocHJvcGVydHksIG5vbmUoKSwgc2VwYXJhdG9yLCBwcmVjZWVkaW5nLCBmb2xsb3dpbmcpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IGxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBDc21FbGVtZW50IHNlcGFyYXRvclByZSwgQ3NtRWxlbWVudCBzZXBhcmF0b3JQb3N0LCBDc21FbGVtZW50IHByZWNlZWRpbmcsIENzbUVsZW1lbnQgZm9sbG93aW5nKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtTGlzdChwcm9wZXJ0eSwgc2VwYXJhdG9yUHJlLCBzZXBhcmF0b3JQb3N0LCBwcmVjZWVkaW5nLCBmb2xsb3dpbmcpOworICAgIH0KKworICAgIHN0YXRpYyBDc21FbGVtZW50IG9ycGhhbkNvbW1lbnRzRW5kaW5nKCkgeworICAgICAgICByZXR1cm4gbmV3IENzbU9ycGhhbkNvbW1lbnRzRW5kaW5nKCk7CisgICAgfQorCisgICAgc3RhdGljIENzbUVsZW1lbnQgb3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzKCkgeworICAgICAgICAvLyBGSVhNRQorICAgICAgICByZXR1cm4gbmV3IENzbU5vbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBpbmRlbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtSW5kZW50KCk7CisgICAgfQorCisgICAgc3RhdGljIENzbUVsZW1lbnQgdW5pbmRlbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3NtVW5pbmRlbnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQ3NtRWxlbWVudCBibG9jayhDc21FbGVtZW50IGNvbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIHNlcXVlbmNlKHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSwgaW5kZW50KCksIGNvbnRlbnQsIHVuaW5kZW50KCksIHRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUkJSQUNFKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21JbmRlbnQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtSW5kZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliZTk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtSW5kZW50LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Tb3VyY2VQcmludGVyOworCitwdWJsaWMgY2xhc3MgQ3NtSW5kZW50IGltcGxlbWVudHMgQ3NtRWxlbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBDc21JbmRlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21MaXN0LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGZhZTdlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21MaXN0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5jb25jcmV0ZXN5bnRheG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuQ29uY3JldGVTeW50YXhNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Tb3VyY2VQcmludGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgQ3NtTGlzdCBpbXBsZW1lbnRzIENzbUVsZW1lbnQgeworICAgIHByaXZhdGUgZmluYWwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5OworICAgIHByaXZhdGUgZmluYWwgQ3NtRWxlbWVudCBzZXBhcmF0b3JQb3N0OworICAgIHByaXZhdGUgZmluYWwgQ3NtRWxlbWVudCBzZXBhcmF0b3JQcmU7CisgICAgcHJpdmF0ZSBmaW5hbCBDc21FbGVtZW50IHByZWNlZWRpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBDc21FbGVtZW50IGZvbGxvd2luZzsKKworICAgIHB1YmxpYyBPYnNlcnZhYmxlUHJvcGVydHkgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtRWxlbWVudCBnZXRTZXBhcmF0b3JQb3N0KCkgeworICAgICAgICByZXR1cm4gc2VwYXJhdG9yUG9zdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtRWxlbWVudCBnZXRTZXBhcmF0b3JQcmUoKSB7CisgICAgICAgIHJldHVybiBzZXBhcmF0b3JQcmU7CisgICAgfQorCisgICAgcHVibGljIENzbUVsZW1lbnQgZ2V0UHJlY2VlZGluZygpIHsKKyAgICAgICAgcmV0dXJuIHByZWNlZWRpbmc7CisgICAgfQorCisgICAgcHVibGljIENzbUVsZW1lbnQgZ2V0Rm9sbG93aW5nKCkgeworICAgICAgICByZXR1cm4gZm9sbG93aW5nOworICAgIH0KKworICAgIHB1YmxpYyBDc21MaXN0KE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgQ3NtRWxlbWVudCBzZXBhcmF0b3IpIHsKKyAgICAgICAgdGhpcyhwcm9wZXJ0eSwgbmV3IENzbU5vbmUoKSwgc2VwYXJhdG9yLCBuZXcgQ3NtTm9uZSgpLCBuZXcgQ3NtTm9uZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtTGlzdChPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcyhwcm9wZXJ0eSwgbmV3IENzbU5vbmUoKSwgbmV3IENzbU5vbmUoKSwgbmV3IENzbU5vbmUoKSwgbmV3IENzbU5vbmUoKSk7CisgICAgfQorCisgICAgcHVibGljIENzbUxpc3QoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBDc21FbGVtZW50IHNlcGFyYXRvclByZSwgQ3NtRWxlbWVudCBzZXBhcmF0b3JQb3N0LCBDc21FbGVtZW50IHByZWNlZWRpbmcsIENzbUVsZW1lbnQgZm9sbG93aW5nKSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgdGhpcy5zZXBhcmF0b3JQcmUgPSBzZXBhcmF0b3JQcmU7CisgICAgICAgIHRoaXMuc2VwYXJhdG9yUG9zdCA9IHNlcGFyYXRvclBvc3Q7CisgICAgICAgIHRoaXMucHJlY2VlZGluZyA9IHByZWNlZWRpbmc7CisgICAgICAgIHRoaXMuZm9sbG93aW5nID0gZm9sbG93aW5nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIGlmIChwcm9wZXJ0eS5pc0Fib3V0Tm9kZXMoKSkgeworICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwcm9wZXJ0eS5nZXRWYWx1ZUFzTXVsdGlwbGVSZWZlcmVuY2Uobm9kZSk7CisgICAgICAgICAgICBpZiAobm9kZUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbm9kZUxpc3QuaXNFbXB0eSgpICYmIHByZWNlZWRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByZWNlZWRpbmcucHJldHR5UHJpbnQobm9kZSwgcHJpbnRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvclByZSAhPSBudWxsICYmIGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JQcmUucHJldHR5UHJpbnQobm9kZSwgcHJpbnRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbmNyZXRlU3ludGF4TW9kZWwuZ2VuZXJpY1ByZXR0eVByaW50KG5vZGVMaXN0LmdldChpKSwgcHJpbnRlcik7CisgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvclBvc3QgIT0gbnVsbCAmJiBpICE9IChub2RlTGlzdC5zaXplKCkgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JQb3N0LnByZXR0eVByaW50KG5vZGUsIHByaW50ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbm9kZUxpc3QuaXNFbXB0eSgpICYmIGZvbGxvd2luZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9sbG93aW5nLnByZXR0eVByaW50KG5vZGUsIHByaW50ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29sbGVjdGlvbjw/PiB2YWx1ZXMgPSBwcm9wZXJ0eS5nZXRWYWx1ZUFzQ29sbGVjdGlvbihub2RlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdmFsdWVzLmlzRW1wdHkoKSAmJiBwcmVjZWVkaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcmVjZWVkaW5nLnByZXR0eVByaW50KG5vZGUsIHByaW50ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3JQcmUgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yUHJlLnByZXR0eVByaW50KG5vZGUsIHByaW50ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KFByaW50aW5nSGVscGVyLnByaW50VG9TdHJpbmcoaXQubmV4dCgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvclBvc3QgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yUG9zdC5wcmV0dHlQcmludChub2RlLCBwcmludGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXZhbHVlcy5pc0VtcHR5KCkgJiYgZm9sbG93aW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb2xsb3dpbmcucHJldHR5UHJpbnQobm9kZSwgcHJpbnRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbU1peC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21NaXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U1NDYxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21NaXguamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuU291cmNlUHJpbnRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBBIGdyb3VwIG9mIGVsZW1lbnRzIHRoYXQgY291bGQgYmUgaW4gYW55IG9yZGVyLgorICovCitwdWJsaWMgY2xhc3MgQ3NtTWl4IGltcGxlbWVudHMgQ3NtRWxlbWVudCB7CisgICAgcHJpdmF0ZSBMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzOworCisgICAgcHVibGljIENzbU1peChMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzKSB7CisgICAgICAgIGlmIChlbGVtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudHMuc3RyZWFtKCkuYW55TWF0Y2goT2JqZWN0czo6aXNOdWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBlbGVtZW50IGluIHRoZSBtaXgiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8Q3NtRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGUgLT4gZS5wcmV0dHlQcmludChub2RlLCBwcmludGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQ3NtTWl4IGNzbU1peCA9IChDc21NaXgpIG87CisKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzICE9IG51bGwgPyBlbGVtZW50cy5lcXVhbHMoY3NtTWl4LmVsZW1lbnRzKSA6IGNzbU1peC5lbGVtZW50cyA9PSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50cyAhPSBudWxsID8gZWxlbWVudHMuaGFzaENvZGUoKSA6IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDc21NaXhbIiArIFN0cmluZy5qb2luKCIsICIsIGVsZW1lbnRzLnN0cmVhbSgpLm1hcChlIC0+IGVsZW1lbnRzLnRvU3RyaW5nKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpICsgIl0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtTm9uZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21Ob25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyYmY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtTm9uZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuU291cmNlUHJpbnRlcjsKKworcHVibGljIGNsYXNzIENzbU5vbmUgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtT3JwaGFuQ29tbWVudHNFbmRpbmcuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtT3JwaGFuQ29tbWVudHNFbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21PcnBoYW5Db21tZW50c0VuZGluZy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlNvdXJjZVByaW50ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uOworCitwdWJsaWMgY2xhc3MgQ3NtT3JwaGFuQ29tbWVudHNFbmRpbmcgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIExpc3Q8Tm9kZT4gZXZlcnl0aGluZyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZXZlcnl0aGluZy5hZGRBbGwobm9kZS5nZXRDaGlsZE5vZGVzKCkpOworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKGV2ZXJ5dGhpbmcpOworICAgICAgICBpZiAoZXZlcnl0aGluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb21tZW50c0F0RW5kID0gMDsKKyAgICAgICAgYm9vbGVhbiBmaW5kaW5nQ29tbWVudHMgPSB0cnVlOworICAgICAgICB3aGlsZSAoZmluZGluZ0NvbW1lbnRzICYmIGNvbW1lbnRzQXRFbmQgPCBldmVyeXRoaW5nLnNpemUoKSkgeworICAgICAgICAgICAgTm9kZSBsYXN0ID0gZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSAxIC0gY29tbWVudHNBdEVuZCk7CisgICAgICAgICAgICBmaW5kaW5nQ29tbWVudHMgPSAobGFzdCBpbnN0YW5jZW9mIENvbW1lbnQpOworICAgICAgICAgICAgaWYgKGZpbmRpbmdDb21tZW50cykgeworICAgICAgICAgICAgICAgIGNvbW1lbnRzQXRFbmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1lbnRzQXRFbmQ7IGkrKykgeworICAgICAgICAgICAgQ29tbWVudCBjID0gKENvbW1lbnQpZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSBjb21tZW50c0F0RW5kICsgaSk7CisgICAgICAgICAgICBDc21Db21tZW50LnByb2Nlc3MoYywgcHJpbnRlcik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtU2VxdWVuY2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtU2VxdWVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZkOWFkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21TZXF1ZW5jZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuU291cmNlUHJpbnRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitwdWJsaWMgY2xhc3MgQ3NtU2VxdWVuY2UgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKyAgICBwcml2YXRlIExpc3Q8Q3NtRWxlbWVudD4gZWxlbWVudHM7CisKKyAgICBwdWJsaWMgQ3NtU2VxdWVuY2UoTGlzdDxDc21FbGVtZW50PiBlbGVtZW50cykgeworICAgICAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnRzLnN0cmVhbSgpLmFueU1hdGNoKE9iamVjdHM6OmlzTnVsbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8Q3NtRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGUgLT4gZS5wcmV0dHlQcmludChub2RlLCBwcmludGVyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21TaW5nbGVSZWZlcmVuY2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtU2luZ2xlUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyMTFhMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2NvbmNyZXRlc3ludGF4bW9kZWwvQ3NtU2luZ2xlUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Db25jcmV0ZVN5bnRheE1vZGVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlNvdXJjZVByaW50ZXI7CisKK3B1YmxpYyBjbGFzcyBDc21TaW5nbGVSZWZlcmVuY2UgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eTsKKworICAgIHB1YmxpYyBPYnNlcnZhYmxlUHJvcGVydHkgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtU2luZ2xlUmVmZXJlbmNlKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJldHR5UHJpbnQoTm9kZSBub2RlLCBTb3VyY2VQcmludGVyIHByaW50ZXIpIHsKKyAgICAgICAgTm9kZSBjaGlsZCA9IHByb3BlcnR5LmdldFZhbHVlQXNTaW5nbGVSZWZlcmVuY2Uobm9kZSk7CisgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICBDb25jcmV0ZVN5bnRheE1vZGVsLmdlbmVyaWNQcmV0dHlQcmludChjaGlsZCwgcHJpbnRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbVN0cmluZy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21TdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmEwMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21TdHJpbmcuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5jb25jcmV0ZXN5bnRheG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlNvdXJjZVByaW50ZXI7CisKK3B1YmxpYyBjbGFzcyBDc21TdHJpbmcgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eTsKKworICAgIHB1YmxpYyBDc21TdHJpbmcoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICBwcmludGVyLnByaW50KCJcIiIpOworICAgICAgICBwcmludGVyLnByaW50KHByb3BlcnR5LmdldFZhbHVlQXNTdHJpbmdBdHRyaWJ1dGUobm9kZSkpOworICAgICAgICBwcmludGVyLnByaW50KCJcIiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJDc21TdHJpbmcocHJvcGVydHk6JXMpIiwgcHJvcGVydHkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21Ub2tlbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21Ub2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzQ1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbVRva2VuLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuU291cmNlUHJpbnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5UeXBlczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuVHlwZXMuaXNFbmRPZkxpbmVUb2tlbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuVHlwZXMuaXNTcGFjZU9yVGFiOworCitwdWJsaWMgY2xhc3MgQ3NtVG9rZW4gaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIGludCB0b2tlblR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudDsKKyAgICBwcml2YXRlIFRva2VuQ29udGVudENhbGN1bGF0b3IgdG9rZW5Db250ZW50Q2FsY3VsYXRvcjsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgVG9rZW5Db250ZW50Q2FsY3VsYXRvciB7CisgICAgICAgIFN0cmluZyBjYWxjdWxhdGUoTm9kZSBub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRva2VuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoTm9kZSBub2RlKSB7CisgICAgICAgIGlmICh0b2tlbkNvbnRlbnRDYWxjdWxhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbkNvbnRlbnRDYWxjdWxhdG9yLmNhbGN1bGF0ZShub2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtVG9rZW4oaW50IHRva2VuVHlwZSkgeworICAgICAgICB0aGlzLnRva2VuVHlwZSA9IHRva2VuVHlwZTsKKyAgICAgICAgdGhpcy5jb250ZW50ID0gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy50b2tlbkltYWdlW3Rva2VuVHlwZV07CisgICAgICAgIGlmIChjb250ZW50LnN0YXJ0c1dpdGgoIlwiIikpIHsKKyAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZygxLCBjb250ZW50Lmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzRW5kT2ZMaW5lVG9rZW4odG9rZW5UeXBlKSkgeworICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLkVPTDsKKyAgICAgICAgfSBlbHNlIGlmIChpc1NwYWNlT3JUYWIodG9rZW5UeXBlKSkgeworICAgICAgICAgICAgY29udGVudCA9ICIgIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDc21Ub2tlbihpbnQgdG9rZW5UeXBlLCBTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzLnRva2VuVHlwZSA9IHRva2VuVHlwZTsKKyAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3NtVG9rZW4oaW50IHRva2VuVHlwZSwgVG9rZW5Db250ZW50Q2FsY3VsYXRvciB0b2tlbkNvbnRlbnRDYWxjdWxhdG9yKSB7CisgICAgICAgIHRoaXMudG9rZW5UeXBlID0gdG9rZW5UeXBlOworICAgICAgICB0aGlzLnRva2VuQ29udGVudENhbGN1bGF0b3IgPSB0b2tlbkNvbnRlbnRDYWxjdWxhdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIGlmIChpc0VuZE9mTGluZVRva2VuKHRva2VuVHlwZSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci5wcmludChnZXRDb250ZW50KG5vZGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAidG9rZW4oIiArIGNvbnRlbnQgKyAiKSI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQ3NtVG9rZW4gY3NtVG9rZW4gPSAoQ3NtVG9rZW4pIG87CisKKyAgICAgICAgaWYgKHRva2VuVHlwZSAhPSBjc21Ub2tlbi50b2tlblR5cGUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCA/ICFjb250ZW50LmVxdWFscyhjc21Ub2tlbi5jb250ZW50KSA6IGNzbVRva2VuLmNvbnRlbnQgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdG9rZW5Db250ZW50Q2FsY3VsYXRvciAhPSBudWxsID8gdG9rZW5Db250ZW50Q2FsY3VsYXRvci5lcXVhbHMoY3NtVG9rZW4udG9rZW5Db250ZW50Q2FsY3VsYXRvcikgOiBjc21Ub2tlbi50b2tlbkNvbnRlbnRDYWxjdWxhdG9yID09IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRva2VuVHlwZTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoY29udGVudCAhPSBudWxsID8gY29udGVudC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHRva2VuQ29udGVudENhbGN1bGF0b3IgIT0gbnVsbCA/IHRva2VuQ29udGVudENhbGN1bGF0b3IuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIFRva2VuVHlwZXMuaXNXaGl0ZXNwYWNlKHRva2VuVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgeworICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5pc0VuZE9mTGluZVRva2VuKHRva2VuVHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21VbmluZGVudC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9Dc21VbmluZGVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGEwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL0NzbVVuaW5kZW50LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Tb3VyY2VQcmludGVyOworCitwdWJsaWMgY2xhc3MgQ3NtVW5pbmRlbnQgaW1wbGVtZW50cyBDc21FbGVtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXR0eVByaW50KE5vZGUgbm9kZSwgU291cmNlUHJpbnRlciBwcmludGVyKSB7CisgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQ3NtVW5pbmRlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9QcmludGluZ0hlbHBlci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvY29uY3JldGVzeW50YXhtb2RlbC9QcmludGluZ0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmIwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9jb25jcmV0ZXN5bnRheG1vZGVsL1ByaW50aW5nSGVscGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlByaW50YWJsZTsKKworY2xhc3MgUHJpbnRpbmdIZWxwZXIgeworCisgICAgc3RhdGljIFN0cmluZyBwcmludFRvU3RyaW5nKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcmludGFibGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFByaW50YWJsZSl2YWx1ZSkuYXNTdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbnVtKSB7CisgICAgICAgICAgICByZXR1cm4gKChFbnVtKSB2YWx1ZSkubmFtZSgpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0NoaWxkVGV4dEVsZW1lbnQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vQ2hpbGRUZXh0RWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODkwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0NoaWxkVGV4dEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CisKKy8qKgorICogUmVwcmVzZW50IHRoZSBwb3NpdGlvbiBvZiBhIGNoaWxkIG5vZGUgaW4gdGhlIE5vZGVUZXh0IG9mIGl0cyBwYXJlbnQuCisgKi8KK2NsYXNzIENoaWxkVGV4dEVsZW1lbnQgZXh0ZW5kcyBUZXh0RWxlbWVudCB7CisgICAgcHJpdmF0ZSBmaW5hbCBOb2RlIGNoaWxkOworCisgICAgQ2hpbGRUZXh0RWxlbWVudChOb2RlIGNoaWxkKSB7CisgICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKKyAgICB9CisKKyAgICBTdHJpbmcgZXhwYW5kKCkgeworICAgICAgICByZXR1cm4gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGNoaWxkKTsKKyAgICB9CisKKyAgICBOb2RlIGdldENoaWxkKCkgeworICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiBpc1Rva2VuKGludCB0b2tlbktpbmQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gaXNOb2RlKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZSA9PSBjaGlsZDsKKyAgICB9CisKKyAgICBOb2RlVGV4dCBnZXROb2RlVGV4dEZvcldyYXBwZWROb2RlKCkgeworICAgICAgICByZXR1cm4gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmdldE9yQ3JlYXRlTm9kZVRleHQoY2hpbGQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIENoaWxkVGV4dEVsZW1lbnQgdGhhdCA9IChDaGlsZFRleHRFbGVtZW50KSBvOworCisgICAgICAgIHJldHVybiBjaGlsZC5lcXVhbHModGhhdC5jaGlsZCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY2hpbGQuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkNoaWxkVGV4dEVsZW1lbnR7IiArIGNoaWxkICsgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU3BhY2VPclRhYigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTmV3bGluZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgQ29tbWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoaWxkT2ZDbGFzcyhDbGFzczw/IGV4dGVuZHMgTm9kZT4gbm9kZUNsYXNzKSB7CisgICAgICAgIHJldHVybiBub2RlQ2xhc3MuaXNJbnN0YW5jZShjaGlsZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9EaWZmZXJlbmNlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0RpZmZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBmOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9EaWZmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw4ODUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuVHlwZXM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLio7CisKKy8qKgorICogQSBEaWZmZXJlbmNlIHNob3VsZCBnaXZlIG1lIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgSSBzaG91bGQgZmluZCAodG8gaW5kaWNhdGUgdGhlIGNvbnRleHQpIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBlbGVtZW50cworICogdG8gcmVtb3ZlIG9yIHRvIGFkZCBhbmQgZm9sbG93IGJ5IGFub3RoZXIgc2VxdWVuY2Ugb2YgZWxlbWVudHMuCisgKgorICogSSBzaG91bGQgbGF0ZXIgYmUgYWJsZSB0byBhcHBseSBzdWNoIGRpZmZlcmVuY2UgdG8gYSBub2RlVGV4dC4KKyAqLworcHVibGljIGNsYXNzIERpZmZlcmVuY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQU5EQVJEX0lOREVOVEFUSU9OX1NJWkUgPSA0OworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PERpZmZlcmVuY2VFbGVtZW50PiBlbGVtZW50czsKKworICAgIHByaXZhdGUgRGlmZmVyZW5jZShMaXN0PERpZmZlcmVuY2VFbGVtZW50PiBlbGVtZW50cykgeworICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CisgICAgfQorCisgICAgaW50ZXJmYWNlIERpZmZlcmVuY2VFbGVtZW50IHsKKyAgICAgICAgc3RhdGljIERpZmZlcmVuY2VFbGVtZW50IGFkZGVkKENzbUVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRlZChlbGVtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBEaWZmZXJlbmNlRWxlbWVudCByZW1vdmVkKENzbUVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVkKGVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIERpZmZlcmVuY2VFbGVtZW50IGtlcHQoQ3NtRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEtlcHQoZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBDc21FbGVtZW50IGNvbnNpZGVyZWQgaW4gdGhpcyBEaWZmZXJlbmNlRWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIENzbUVsZW1lbnQgZ2V0RWxlbWVudCgpOworCisgICAgICAgIGJvb2xlYW4gaXNBZGRlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFkZGVkIGltcGxlbWVudHMgRGlmZmVyZW5jZUVsZW1lbnQgeworICAgICAgICBmaW5hbCBDc21FbGVtZW50IGVsZW1lbnQ7CisKKyAgICAgICAgcHVibGljIEFkZGVkKENzbUVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJBZGRlZHsiICsgZWxlbWVudCArICd9JzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBBZGRlZCBhZGRlZCA9IChBZGRlZCkgbzsKKworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZXF1YWxzKGFkZGVkLmVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDc21FbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FkZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbGVtZW50cyBpbiBhIENzbU1peCBoYXZlIGJlZW4gcmVzaHVmZmxlZC4gSXQgY291bGQgYWxzbyBtZWFuIHRoYXQKKyAgICAgKiBzb21lIG5ldyBlbGVtZW50cyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZCB0byB0aGUgbWl4LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlc2h1ZmZsZWQgaW1wbGVtZW50cyBEaWZmZXJlbmNlRWxlbWVudCB7CisgICAgICAgIGZpbmFsIENzbU1peCBwcmV2aW91c09yZGVyOworICAgICAgICBmaW5hbCBDc21NaXggZWxlbWVudDsKKworICAgICAgICBwdWJsaWMgUmVzaHVmZmxlZChDc21NaXggcHJldmlvdXNPcmRlciwgQ3NtTWl4IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNPcmRlciA9IHByZXZpb3VzT3JkZXI7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlc2h1ZmZsZWR7IiArIGVsZW1lbnQgKyAiLCBwcmV2aW91cz0iKyBwcmV2aW91c09yZGVyKyAnfSc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgUmVzaHVmZmxlZCB0aGF0ID0gKFJlc2h1ZmZsZWQpIG87CisKKyAgICAgICAgICAgIGlmICghcHJldmlvdXNPcmRlci5lcXVhbHModGhhdC5wcmV2aW91c09yZGVyKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZXF1YWxzKHRoYXQuZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBwcmV2aW91c09yZGVyLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENzbU1peCBnZXRFbGVtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZGRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtlcHQgaW1wbGVtZW50cyBEaWZmZXJlbmNlRWxlbWVudCB7CisgICAgICAgIGZpbmFsIENzbUVsZW1lbnQgZWxlbWVudDsKKworICAgICAgICBwdWJsaWMgS2VwdChDc21FbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiS2VwdHsiICsgZWxlbWVudCArICd9JzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBLZXB0IGtlcHQgPSAoS2VwdCkgbzsKKworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZXF1YWxzKGtlcHQuZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENzbUVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW1vdmVkIGltcGxlbWVudHMgRGlmZmVyZW5jZUVsZW1lbnQgeworICAgICAgICBmaW5hbCBDc21FbGVtZW50IGVsZW1lbnQ7CisKKyAgICAgICAgcHVibGljIFJlbW92ZWQoQ3NtRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlbW92ZWR7IiArIGVsZW1lbnQgKyAnfSc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgUmVtb3ZlZCByZW1vdmVkID0gKFJlbW92ZWQpIG87CisKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmVxdWFscyhyZW1vdmVkLmVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDc21FbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FkZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGluZyhDc21FbGVtZW50IGEsIENzbUVsZW1lbnQgYikgeworICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIENzbUNoaWxkKSB7CisgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIENzbUNoaWxkKSB7CisgICAgICAgICAgICAgICAgQ3NtQ2hpbGQgY2hpbGRBID0gKENzbUNoaWxkKSBhOworICAgICAgICAgICAgICAgIENzbUNoaWxkIGNoaWxkQiA9IChDc21DaGlsZCkgYjsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRBLmdldENoaWxkKCkuZXF1YWxzKGNoaWxkQi5nZXRDaGlsZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgQ3NtSW5kZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgQ3NtVW5pbmRlbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihhLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKyAiICIrYi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICAgICAgQ3NtVG9rZW4gY2hpbGRBID0gKENzbVRva2VuKWE7CisgICAgICAgICAgICAgICAgQ3NtVG9rZW4gY2hpbGRCID0gKENzbVRva2VuKWI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkQS5nZXRUb2tlblR5cGUoKSA9PSBjaGlsZEIuZ2V0VG9rZW5UeXBlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBDc21DaGlsZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIENzbUluZGVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIENzbVVuaW5kZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oYS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSsgIiAiK2IuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBDc21JbmRlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBiIGluc3RhbmNlb2YgQ3NtSW5kZW50OworICAgICAgICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBDc21VbmluZGVudCkgeworICAgICAgICAgICAgcmV0dXJuIGIgaW5zdGFuY2VvZiBDc21VbmluZGVudDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oYS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSsgIiAiK2IuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVwbGFjZW1lbnQoQ3NtRWxlbWVudCBhLCBDc21FbGVtZW50IGIpIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBDc21JbmRlbnQgfHwgYiBpbnN0YW5jZW9mIENzbUluZGVudCB8fCBhIGluc3RhbmNlb2YgQ3NtVW5pbmRlbnQgfHwgYiBpbnN0YW5jZW9mIENzbVVuaW5kZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBDc21DaGlsZCkgeworICAgICAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBDc21DaGlsZCkgeworICAgICAgICAgICAgICAgIENzbUNoaWxkIGNoaWxkQSA9IChDc21DaGlsZCkgYTsKKyAgICAgICAgICAgICAgICBDc21DaGlsZCBjaGlsZEIgPSAoQ3NtQ2hpbGQpIGI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkQS5nZXRDaGlsZCgpLmdldENsYXNzKCkuZXF1YWxzKGNoaWxkQi5nZXRDaGlsZCgpLmdldENsYXNzKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgQ3NtVG9rZW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihhLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKyAiICIrYi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICAgICAgQ3NtVG9rZW4gY2hpbGRBID0gKENzbVRva2VuKWE7CisgICAgICAgICAgICAgICAgQ3NtVG9rZW4gY2hpbGRCID0gKENzbVRva2VuKWI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkQS5nZXRUb2tlblR5cGUoKSA9PSBjaGlsZEIuZ2V0VG9rZW5UeXBlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBDc21DaGlsZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oYS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSsgIiAiK2IuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHBvc2l0aW9ucyBvZiBhbGwgdGhlIGdpdmVuIGNoaWxkcmVuLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1hcDxOb2RlLCBJbnRlZ2VyPiBmaW5kQ2hpbGRyZW5Qb3NpdGlvbnMoTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjYWxjdWxhdGVkU3ludGF4TW9kZWwpIHsKKyAgICAgICAgTWFwPE5vZGUsIEludGVnZXI+IHBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8Y2FsY3VsYXRlZFN5bnRheE1vZGVsLmVsZW1lbnRzLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IGNhbGN1bGF0ZWRTeW50YXhNb2RlbC5lbGVtZW50cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENzbUNoaWxkKSB7CisgICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1dCgoKENzbUNoaWxkKWVsZW1lbnQpLmdldENoaWxkKCksIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3NpdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBEaWZmZXJlbmNlIGJldHdlZW4gdHdvIENhbGN1bGF0ZWRTeW50YXhNb2RlbCBlbGVtZW50cywgZGV0ZXJtaW5pbmcgd2hpY2ggZWxlbWVudHMgd2VyZSBrZXB0LAorICAgICAqIHdoaWNoIHdlcmUgYWRkZWQgYW5kIHdoaWNoIHdlcmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgRGlmZmVyZW5jZSBjYWxjdWxhdGUoTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBvcmlnaW5hbCwgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBhZnRlcikgeworICAgICAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSB1c2UgdGhlIHBvc2l0aW9ucyBvZiBtYXRjaGluZyBjaGlsZHJlbgorICAgICAgICAvLyB0byBndWlkZSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3VwcG9zZSB3ZSBoYXZlOgorICAgICAgICAvLyAgIHF3ZXJ0eVtBXXVpb3AKKyAgICAgICAgLy8gICBxd2VyW0FddWlvcAorICAgICAgICAvLworICAgICAgICAvLyB3aXRoIFtBXSBiZWluZyBhIGNoaWxkIGFuZCBsb3dlcmNhc2UgbGV0dGVycyBiZWluZyB0b2tlbnMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2Ugd291bGQgY2FsY3VsYXRlIHRoZSBEaWZmZXJlbmNlIGJldHdlZW4gInF3ZXJ0eSIgYW5kICJxd2VyIiB0aGVuIHdlIGtub3cgdGhlIEEgaXMga2VwLCBhbmQgdGhlbiB3ZQorICAgICAgICAvLyB3b3VsZCBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAidWlvcCIgYW5kICJ1aW9wIgorCisgICAgICAgIE1hcDxOb2RlLCBJbnRlZ2VyPiBjaGlsZHJlbkluT3JpZ2luYWwgPSBmaW5kQ2hpbGRyZW5Qb3NpdGlvbnMob3JpZ2luYWwpOworICAgICAgICBNYXA8Tm9kZSwgSW50ZWdlcj4gY2hpbGRyZW5JbkFmdGVyID0gZmluZENoaWxkcmVuUG9zaXRpb25zKGFmdGVyKTsKKworICAgICAgICBMaXN0PE5vZGU+IGNvbW1vbkNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8PihjaGlsZHJlbkluT3JpZ2luYWwua2V5U2V0KCkpOworICAgICAgICBjb21tb25DaGlsZHJlbi5yZXRhaW5BbGwoY2hpbGRyZW5JbkFmdGVyLmtleVNldCgpKTsKKyAgICAgICAgY29tbW9uQ2hpbGRyZW4uc29ydChDb21wYXJhdG9yLmNvbXBhcmluZ0ludChjaGlsZHJlbkluT3JpZ2luYWw6OmdldCkpOworCisgICAgICAgIExpc3Q8RGlmZmVyZW5jZUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIGludCBvcmlnaW5hbEluZGV4ID0gMDsKKyAgICAgICAgaW50IGFmdGVySW5kZXggPSAwOworICAgICAgICBpbnQgY29tbW9uQ2hpbGRyZW5JbmRleCA9IDA7CisgICAgICAgIHdoaWxlIChjb21tb25DaGlsZHJlbkluZGV4IDwgY29tbW9uQ2hpbGRyZW4uc2l6ZSgpKSB7CisgICAgICAgICAgICBOb2RlIGNoaWxkID0gY29tbW9uQ2hpbGRyZW4uZ2V0KGNvbW1vbkNoaWxkcmVuSW5kZXgrKyk7CisgICAgICAgICAgICBpbnQgcG9zT2ZOZXh0Q2hpbGRJbk9yaWdpbmFsID0gY2hpbGRyZW5Jbk9yaWdpbmFsLmdldChjaGlsZCk7CisgICAgICAgICAgICBpbnQgcG9zT2ZOZXh0Q2hpbGRJbkFmdGVyICAgID0gY2hpbGRyZW5JbkFmdGVyLmdldChjaGlsZCk7CisgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA8IHBvc09mTmV4dENoaWxkSW5PcmlnaW5hbCB8fCBhZnRlckluZGV4IDwgcG9zT2ZOZXh0Q2hpbGRJbkFmdGVyKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkQWxsKGNhbGN1bGF0ZUltcGwob3JpZ2luYWwuc3ViKG9yaWdpbmFsSW5kZXgsIHBvc09mTmV4dENoaWxkSW5PcmlnaW5hbCksIGFmdGVyLnN1YihhZnRlckluZGV4LCBwb3NPZk5leHRDaGlsZEluQWZ0ZXIpKS5lbGVtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IEtlcHQobmV3IENzbUNoaWxkKGNoaWxkKSkpOworICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IHBvc09mTmV4dENoaWxkSW5PcmlnaW5hbCArIDE7CisgICAgICAgICAgICBhZnRlckluZGV4ID0gcG9zT2ZOZXh0Q2hpbGRJbkFmdGVyICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcmlnaW5hbEluZGV4IDwgb3JpZ2luYWwuZWxlbWVudHMuc2l6ZSgpIHx8IGFmdGVySW5kZXggPCBhZnRlci5lbGVtZW50cy5zaXplKCkpIHsKKyAgICAgICAgICAgIGVsZW1lbnRzLmFkZEFsbChjYWxjdWxhdGVJbXBsKG9yaWdpbmFsLnN1YihvcmlnaW5hbEluZGV4LCBvcmlnaW5hbC5lbGVtZW50cy5zaXplKCkpLCBhZnRlci5zdWIoYWZ0ZXJJbmRleCwgYWZ0ZXIuZWxlbWVudHMuc2l6ZSgpKSkuZWxlbWVudHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRGlmZmVyZW5jZShlbGVtZW50cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlmZmVyZW5jZSBjYWxjdWxhdGVJbXBsKExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgb3JpZ2luYWwsIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgYWZ0ZXIpIHsKKyAgICAgICAgTGlzdDxEaWZmZXJlbmNlRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgaW50IG9yaWdpbmFsSW5kZXggPSAwOworICAgICAgICBpbnQgYWZ0ZXJJbmRleCA9IDA7CisKKyAgICAgICAgLy8gV2UgbW92ZSB0aHJvdWdoIHRoZSB0d28gQ2FsY3VsYXRlZFN5bnRheE1vZGVsLCBtb3ZpbmcgYm90aCBmb3J3YXJkIHdoZW4gd2UgaGF2ZSBhIG1hdGNoCisgICAgICAgIC8vIGFuZCBtb3ZpbmcganVzdCBvbmUgc2lkZSBmb3J3YXJkIHdoZW4gd2UgaGF2ZSBhbiBlbGVtZW50IGtlcHQgb3IgcmVtb3ZlZAorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChvcmlnaW5hbEluZGV4IDwgb3JpZ2luYWwuZWxlbWVudHMuc2l6ZSgpICYmIGFmdGVySW5kZXggPj0gYWZ0ZXIuZWxlbWVudHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBSZW1vdmVkKG9yaWdpbmFsLmVsZW1lbnRzLmdldChvcmlnaW5hbEluZGV4KSkpOworICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXgrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxJbmRleCA+PSBvcmlnaW5hbC5lbGVtZW50cy5zaXplKCkgJiYgYWZ0ZXJJbmRleCA8IGFmdGVyLmVsZW1lbnRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChuZXcgQWRkZWQoYWZ0ZXIuZWxlbWVudHMuZ2V0KGFmdGVySW5kZXgpKSk7CisgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50IG5leHRPcmlnaW5hbCA9IG9yaWdpbmFsLmVsZW1lbnRzLmdldChvcmlnaW5hbEluZGV4KTsKKyAgICAgICAgICAgICAgICBDc21FbGVtZW50IG5leHRBZnRlciA9IGFmdGVyLmVsZW1lbnRzLmdldChhZnRlckluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmICgobmV4dE9yaWdpbmFsIGluc3RhbmNlb2YgQ3NtTWl4KSAmJiAobmV4dEFmdGVyIGluc3RhbmNlb2YgQ3NtTWl4KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChDc21NaXgpIG5leHRBZnRlcikuZ2V0RWxlbWVudHMoKS5lcXVhbHMoKChDc21NaXgpIG5leHRPcmlnaW5hbCkuZ2V0RWxlbWVudHMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHJlYXNvbiB0byBkZWFsIHdpdGggYSByZXNodWZmbGVkLCB3ZSBhcmUganVzdCBnb2luZyB0byBrZWVwIGV2ZXJ5dGhpbmcgYXMgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ3NtTWl4KSBuZXh0QWZ0ZXIpLmdldEVsZW1lbnRzKCkuZm9yRWFjaChlbCAtPiBlbGVtZW50cy5hZGQobmV3IEtlcHQoZWwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IFJlc2h1ZmZsZWQoKENzbU1peCluZXh0T3JpZ2luYWwsIChDc21NaXgpbmV4dEFmdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCsrOworICAgICAgICAgICAgICAgICAgICBhZnRlckluZGV4Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGluZyhuZXh0T3JpZ2luYWwsIG5leHRBZnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBLZXB0KG5leHRPcmlnaW5hbCkpOworICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIGFmdGVySW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50KG5leHRPcmlnaW5hbCwgbmV4dEFmdGVyKSkgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IFJlbW92ZWQobmV4dE9yaWdpbmFsKSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChuZXcgQWRkZWQobmV4dEFmdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB0cnkgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IG9yIGFkZCBpdCBhbmQgbG9vayB3aGljaCBvbmUgbGVhZHMgdG8gdGhlIGxvd2VyIGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgRGlmZmVyZW5jZSBhZGRpbmcgPSBjYWxjdWxhdGUob3JpZ2luYWwuZnJvbShvcmlnaW5hbEluZGV4KSwgYWZ0ZXIuZnJvbShhZnRlckluZGV4ICsgMSkpOworICAgICAgICAgICAgICAgICAgICBEaWZmZXJlbmNlIHJlbW92aW5nID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGluZy5jb3N0KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmluZyA9IGNhbGN1bGF0ZShvcmlnaW5hbC5mcm9tKG9yaWdpbmFsSW5kZXggKyAxKSwgYWZ0ZXIuZnJvbShhZnRlckluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZpbmcgPT0gbnVsbCB8fCByZW1vdmluZy5jb3N0KCkgPiBhZGRpbmcuY29zdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IEFkZGVkKG5leHRBZnRlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBSZW1vdmVkKG5leHRPcmlnaW5hbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChvcmlnaW5hbEluZGV4IDwgb3JpZ2luYWwuZWxlbWVudHMuc2l6ZSgpIHx8IGFmdGVySW5kZXggPCBhZnRlci5lbGVtZW50cy5zaXplKCkpOworCisgICAgICAgIHJldHVybiBuZXcgRGlmZmVyZW5jZShlbGVtZW50cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXh0RWxlbWVudCB0b1RleHRFbGVtZW50KENzbUVsZW1lbnQgY3NtRWxlbWVudCkgeworICAgICAgICBpZiAoY3NtRWxlbWVudCBpbnN0YW5jZW9mIENzbUNoaWxkKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENoaWxkVGV4dEVsZW1lbnQoKChDc21DaGlsZCkgY3NtRWxlbWVudCkuZ2V0Q2hpbGQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY3NtRWxlbWVudCBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuVGV4dEVsZW1lbnQoKChDc21Ub2tlbikgY3NtRWxlbWVudCkuZ2V0VG9rZW5UeXBlKCksICgoQ3NtVG9rZW4pIGNzbUVsZW1lbnQpLmdldENvbnRlbnQobnVsbCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGNzbUVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRleHRFbGVtZW50PiBwcm9jZXNzSW5kZW50YXRpb24oTGlzdDxUb2tlblRleHRFbGVtZW50PiBpbmRlbnRhdGlvbiwgTGlzdDxUZXh0RWxlbWVudD4gcHJldkVsZW1lbnRzKSB7CisgICAgICAgIExpc3Q8VGV4dEVsZW1lbnQ+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgcmVzLmFkZEFsbChpbmRlbnRhdGlvbik7CisgICAgICAgIGJvb2xlYW4gYWZ0ZXJObCA9IGZhbHNlOworICAgICAgICBmb3IgKFRleHRFbGVtZW50IGUgOiBwcmV2RWxlbWVudHMpIHsKKyAgICAgICAgICAgIGlmIChlLmlzTmV3bGluZSgpIHx8IGUuaXNUb2tlbihTSU5HTEVfTElORV9DT01NRU5UKSkgeworICAgICAgICAgICAgICAgIHJlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGFmdGVyTmwgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJObCAmJiBlIGluc3RhbmNlb2YgVG9rZW5UZXh0RWxlbWVudCAmJiBUb2tlblR5cGVzLmlzV2hpdGVzcGFjZSgoKFRva2VuVGV4dEVsZW1lbnQpZSkuZ2V0VG9rZW5LaW5kKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5hZGQoZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXJObCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxUZXh0RWxlbWVudD4gaW5kZW50YXRpb25CbG9jaygpIHsKKyAgICAgICAgTGlzdDxUZXh0RWxlbWVudD4gcmVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICByZXMuYWRkKG5ldyBUb2tlblRleHRFbGVtZW50KFNQQUNFKSk7CisgICAgICAgIHJlcy5hZGQobmV3IFRva2VuVGV4dEVsZW1lbnQoU1BBQ0UpKTsKKyAgICAgICAgcmVzLmFkZChuZXcgVG9rZW5UZXh0RWxlbWVudChTUEFDRSkpOworICAgICAgICByZXMuYWRkKG5ldyBUb2tlblRleHRFbGVtZW50KFNQQUNFKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY29uc2lkZXJDbGVhbmluZ1RoZUxpbmUoTm9kZVRleHQgbm9kZVRleHQsIGludCBub2RlVGV4dEluZGV4KSB7CisgICAgICAgIHdoaWxlIChub2RlVGV4dEluZGV4ID49MSAmJiBub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4IC0gMSkuaXNXaGl0ZVNwYWNlKCkgJiYgIW5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KG5vZGVUZXh0SW5kZXggLSAxKS5pc05ld2xpbmUoKSkgeworICAgICAgICAgICAgbm9kZVRleHQucmVtb3ZlRWxlbWVudChub2RlVGV4dEluZGV4IC0gMSk7CisgICAgICAgICAgICBub2RlVGV4dEluZGV4LS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVUZXh0SW5kZXg7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQWZ0ZXJMQnJhY2UoTm9kZVRleHQgbm9kZVRleHQsIGludCBub2RlVGV4dEluZGV4KSB7CisgICAgICAgIGlmIChub2RlVGV4dEluZGV4ID4gMCAmJiBub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4IC0gMSkuaXNUb2tlbihMQlJBQ0UpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZVRleHRJbmRleCA+IDAgJiYgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQobm9kZVRleHRJbmRleCAtIDEpLmlzV2hpdGVTcGFjZSgpICYmICFub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4IC0gMSkuaXNOZXdsaW5lKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0FmdGVyTEJyYWNlKG5vZGVUZXh0LCBub2RlVGV4dEluZGV4IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHdlIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgd2l0aCBqdXN0IHNwYWNlcyBvciB0YWJzIGJlZm9yZSB1cyB3ZSBzaG91bGQgZm9yY2UgdGhlIHNwYWNlIHRvIGJlCisgICAgICogdGhlIHNhbWUgYXMgdGhlIGluZGVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNvbnNpZGVyRW5mb3JjaW5nSW5kZW50YXRpb24oTm9kZVRleHQgbm9kZVRleHQsIGludCBub2RlVGV4dEluZGV4KSB7CisgICAgICAgIGJvb2xlYW4gaGFzT25seVdzQmVmb3JlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaT1ub2RlVGV4dEluZGV4OyBpID49IDAgJiYgaGFzT25seVdzQmVmb3JlICYmIGkgPCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnNpemUoKTsgaS0tKSB7CisgICAgICAgICAgICBpZiAobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaSkuaXNOZXdsaW5lKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaSkuaXNTcGFjZU9yVGFiKCkpIHsKKyAgICAgICAgICAgICAgICBoYXNPbmx5V3NCZWZvcmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzT25seVdzQmVmb3JlKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW5vZGVUZXh0SW5kZXg7IGkgPj0gMCAmJiBpIDwgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zaXplKCk7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpKS5pc05ld2xpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZVRleHQucmVtb3ZlRWxlbWVudChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZVRleHRJbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb2RlIHRoYXQgd2UgaGF2ZSBjYWxjdWxhdGUgdGhlIERpZmZlcmVuY2Ugd2UgY2FuIGFwcGx5IHRvIGEgY29uY3JldGUgTm9kZVRleHQsIG1vZGlmeWluZyBpdCBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGUgZGlmZmVyZW5jZSAoYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgZWxlbWVudHMgcHJvdmlkZWQpLgorICAgICAqLworICAgIHZvaWQgYXBwbHkoTm9kZVRleHQgbm9kZVRleHQsIE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZVRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBhZGRlZEluZGVudGF0aW9uID0gZmFsc2U7CisgICAgICAgIExpc3Q8VG9rZW5UZXh0RWxlbWVudD4gaW5kZW50YXRpb24gPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZmluZEluZGVudGF0aW9uKG5vZGUpOworICAgICAgICBpbnQgZGlmZkluZGV4ID0gMDsKKyAgICAgICAgaW50IG5vZGVUZXh0SW5kZXggPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoZGlmZkluZGV4IDwgdGhpcy5lbGVtZW50cy5zaXplKCkgJiYgbm9kZVRleHRJbmRleCA+PSBub2RlVGV4dC5nZXRFbGVtZW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgIERpZmZlcmVuY2VFbGVtZW50IGRpZmZFbCA9IGVsZW1lbnRzLmdldChkaWZmSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChkaWZmRWwgaW5zdGFuY2VvZiBLZXB0KSB7CisgICAgICAgICAgICAgICAgICAgIEtlcHQga2VwdCA9IChLZXB0KSBkaWZmRWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXB0LmVsZW1lbnQgaW5zdGFuY2VvZiBDc21Ub2tlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3NtVG9rZW4gY3NtVG9rZW4gPSAoQ3NtVG9rZW4pIGtlcHQuZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUb2tlblR5cGVzLmlzV2hpdGVzcGFjZU9yQ29tbWVudChjc21Ub2tlbi5nZXRUb2tlblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGtlZXAgZWxlbWVudCBiZWNhdXNlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiBub2RldGV4dDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBub2RlVGV4dCArICIuIERpZmZlcmVuY2U6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBrZWVwIGVsZW1lbnQgYmVjYXVzZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygbm9kZXRleHQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBub2RlVGV4dCArICIuIERpZmZlcmVuY2U6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZkVsIGluc3RhbmNlb2YgQWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZVRleHQuYWRkRWxlbWVudChub2RlVGV4dEluZGV4LCB0b1RleHRFbGVtZW50KCgoQWRkZWQpIGRpZmZFbCkuZWxlbWVudCkpOworICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihkaWZmRWwuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZkluZGV4ID49IHRoaXMuZWxlbWVudHMuc2l6ZSgpICYmIG5vZGVUZXh0SW5kZXggPCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgIFRleHRFbGVtZW50IG5vZGVUZXh0RWwgPSBub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAobm9kZVRleHRFbC5pc1doaXRlU3BhY2VPckNvbW1lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb2RlVGV4dDogIiArIG5vZGVUZXh0ICsgIi4gRGlmZmVyZW5jZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcyArICIgIiArIG5vZGVUZXh0RWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRGlmZmVyZW5jZUVsZW1lbnQgZGlmZkVsID0gZWxlbWVudHMuZ2V0KGRpZmZJbmRleCk7CisgICAgICAgICAgICAgICAgVGV4dEVsZW1lbnQgbm9kZVRleHRFbCA9IG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KG5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChkaWZmRWwgaW5zdGFuY2VvZiBBZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50IGFkZGVkRWxlbWVudCA9ICgoQWRkZWQpIGRpZmZFbCkuZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkRWxlbWVudCBpbnN0YW5jZW9mIENzbUluZGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8U1RBTkRBUkRfSU5ERU5UQVRJT05fU0laRTtpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLmFkZChuZXcgVG9rZW5UZXh0RWxlbWVudChHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNQQUNFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEluZGVudGF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkRWxlbWVudCBpbnN0YW5jZW9mIENzbVVuaW5kZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxTVEFOREFSRF9JTkRFTlRBVElPTl9TSVpFICYmICFpbmRlbnRhdGlvbi5pc0VtcHR5KCk7aSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbi5yZW1vdmUoaW5kZW50YXRpb24uc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEluZGVudGF0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRleHRFbGVtZW50IHRleHRFbGVtZW50ID0gdG9UZXh0RWxlbWVudChhZGRlZEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVUZXh0SW5kZXggPiAwICYmIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KG5vZGVUZXh0SW5kZXggLSAxKS5pc05ld2xpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChUZXh0RWxlbWVudCBlIDogcHJvY2Vzc0luZGVudGF0aW9uKGluZGVudGF0aW9uLCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN1Ykxpc3QoMCwgbm9kZVRleHRJbmRleCAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZEVsZW1lbnQobm9kZVRleHRJbmRleCsrLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FmdGVyTEJyYWNlKG5vZGVUZXh0LCBub2RlVGV4dEluZGV4KSAmJiAhaXNBUmVwbGFjZW1lbnQoZGlmZkluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRFbGVtZW50LmlzTmV3bGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRFbGVtZW50KG5vZGVUZXh0SW5kZXgrKywgbmV3IFRva2VuVGV4dEVsZW1lbnQoVG9rZW5UeXBlcy5lb2xUb2tlbktpbmQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZW1vdmUgdGhlIHNwYWNlIGluICJ7IH0iIHdoZW4gYWRkaW5nIGEgbmV3IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4KS5pc1NwYWNlT3JUYWIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkucmVtb3ZlKG5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChUZXh0RWxlbWVudCBlIDogcHJvY2Vzc0luZGVudGF0aW9uKGluZGVudGF0aW9uLCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN1Ykxpc3QoMCwgbm9kZVRleHRJbmRleCAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZEVsZW1lbnQobm9kZVRleHRJbmRleCsrLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGVudGF0aW9uIGlzIHBhaW5mdWwuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB3ZSB3YW50IHRvIGZvcmNlIGluZGVudGF0aW9uOiB0aGlzIGlzIHRoZSBjYXNlIHdoZW4gaW5kZW50YXRpb24gd2FzIGV4cGVjdGVkIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGFjdHVhbGx5IG5vdCB0aGVyZS4gRm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSAieyB9IiB3ZSB3b3VsZCBleHBlY3QgaW5kZW50YXRpb24gYnV0IGl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGhlcmUsIHNvIHdoZW4gYWRkaW5nIG5ldyBlbGVtZW50cyB3ZSBmb3JjZSBpdC4gSG93ZXZlciBpZiB0aGUgaW5kZW50YXRpb24gaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydGVkIGJ5IHVzIGluIHRoaXMgdHJhbnNmb3JtYXRpb24gd2UgZG8gbm90IHdhbnQgdG8gaW5zZXJ0IGl0IGFnYWluCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZGVkSW5kZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFRleHRFbGVtZW50IGUgOiBpbmRlbnRhdGlvbkJsb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHQuYWRkRWxlbWVudChub2RlVGV4dEluZGV4KyssIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZEVsZW1lbnQobm9kZVRleHRJbmRleCwgdGV4dEVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0RWxlbWVudC5pc05ld2xpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb2xsb3dlZEJ5VW5pbmRlbnQgPSAoZGlmZkluZGV4ICsgMSkgPCBlbGVtZW50cy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudHMuZ2V0KGRpZmZJbmRleCArIDEpLmlzQWRkZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50cy5nZXQoZGlmZkluZGV4ICsgMSkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQ3NtVW5pbmRlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4ID0gYWRqdXN0SW5kZW50YXRpb24oaW5kZW50YXRpb24sIG5vZGVUZXh0LCBub2RlVGV4dEluZGV4LCBmb2xsb3dlZEJ5VW5pbmRlbnQvKiAmJiAhYWRkZWRJbmRlbnRhdGlvbiovKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkaWZmSW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmZFbCBpbnN0YW5jZW9mIEtlcHQpIHsKKyAgICAgICAgICAgICAgICAgICAgS2VwdCBrZXB0ID0gKEtlcHQpZGlmZkVsOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVRleHRFbC5pc0NvbW1lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChrZXB0LmVsZW1lbnQgaW5zdGFuY2VvZiBDc21DaGlsZCkgJiYgbm9kZVRleHRFbCBpbnN0YW5jZW9mIENoaWxkVGV4dEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChrZXB0LmVsZW1lbnQgaW5zdGFuY2VvZiBDc21DaGlsZCkgJiYgbm9kZVRleHRFbCBpbnN0YW5jZW9mIFRva2VuVGV4dEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVGV4dEVsLmlzV2hpdGVTcGFjZU9yQ29tbWVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2VwdC5lbGVtZW50IGluc3RhbmNlb2YgQ3NtQ2hpbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NtQ2hpbGQga2VwdENoaWxkID0gKENzbUNoaWxkKWtlcHQuZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtlcHRDaGlsZC5nZXRDaGlsZCgpIGluc3RhbmNlb2YgUHJpbWl0aXZlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImtlcHQgIiArIGtlcHQuZWxlbWVudCArICIgdnMgIiArIG5vZGVUZXh0RWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJrZXB0ICIgKyBrZXB0LmVsZW1lbnQgKyAiIHZzICIgKyBub2RlVGV4dEVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGtlcHQuZWxlbWVudCBpbnN0YW5jZW9mIENzbVRva2VuKSAmJiBub2RlVGV4dEVsIGluc3RhbmNlb2YgVG9rZW5UZXh0RWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3NtVG9rZW4gY3NtVG9rZW4gPSAoQ3NtVG9rZW4pIGtlcHQuZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuVGV4dEVsZW1lbnQgbm9kZVRleHRUb2tlbiA9IChUb2tlblRleHRFbGVtZW50KSBub2RlVGV4dEVsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzbVRva2VuLmdldFRva2VuVHlwZSgpID09IG5vZGVUZXh0VG9rZW4uZ2V0VG9rZW5LaW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRva2VuVHlwZXMuaXNXaGl0ZXNwYWNlT3JDb21tZW50KGNzbVRva2VuLmdldFRva2VuVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlVGV4dFRva2VuLmlzV2hpdGVTcGFjZU9yQ29tbWVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNzbSB0b2tlbiAiICsgY3NtVG9rZW4gKyAiIE5vZGVUZXh0IFRPS0VOICIgKyBub2RlVGV4dFRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoa2VwdC5lbGVtZW50IGluc3RhbmNlb2YgQ3NtVG9rZW4pICYmICgoQ3NtVG9rZW4pIGtlcHQuZWxlbWVudCkuaXNXaGl0ZVNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtlcHQuZWxlbWVudCBpbnN0YW5jZW9mIENzbUluZGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2VwdC5lbGVtZW50IGluc3RhbmNlb2YgQ3NtVW5pbmRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8sIGJlc2lkZSBjb25zaWRlcmluZyBpbmRlbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNUQU5EQVJEX0lOREVOVEFUSU9OX1NJWkUgJiYgbm9kZVRleHRJbmRleCA+PSAxICYmIG5vZGVUZXh0LmdldFRleHRFbGVtZW50KG5vZGVUZXh0SW5kZXggLSAxKS5pc1NwYWNlT3JUYWIoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHQucmVtb3ZlRWxlbWVudCgtLW5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJrZXB0ICIgKyBrZXB0LmVsZW1lbnQgKyAiIHZzICIgKyBub2RlVGV4dEVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZkVsIGluc3RhbmNlb2YgUmVtb3ZlZCkgeworICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIHJlbW92ZWQgPSAoUmVtb3ZlZClkaWZmRWw7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZC5lbGVtZW50IGluc3RhbmNlb2YgQ3NtQ2hpbGQpICYmIG5vZGVUZXh0RWwgaW5zdGFuY2VvZiBDaGlsZFRleHRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDaGlsZFRleHRFbGVtZW50IGFjdHVhbENoaWxkID0gKENoaWxkVGV4dEVsZW1lbnQpbm9kZVRleHRFbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxDaGlsZC5pc0NvbW1lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUNoaWxkIGNzbUNoaWxkID0gKENzbUNoaWxkKXJlbW92ZWQuZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBleHBlY3RlZCB0byByZW1vdmUgYSBwcm9wZXIgbm9kZSBidXQgd2UgZm91bmQgYSBjb21tZW50IGluIGJldHdlZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbW1lbnQgaXMgYXNzb2NpYXRlZCB0byB0aGUgbm9kZSB3ZSB3YW50IHRvIHJlbW92ZSB3ZSByZW1vdmUgaXQgYXMgd2VsbCwgb3RoZXJ3aXNlIHdlIGtlZXAgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudClhY3R1YWxDaGlsZC5nZXRDaGlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tbWVudC5pc09ycGhhbigpICYmIGNvbW1lbnQuZ2V0Q29tbWVudGVkTm9kZSgpLmlzUHJlc2VudCgpICYmIGNvbW1lbnQuZ2V0Q29tbWVudGVkTm9kZSgpLmdldCgpLmVxdWFscyhjc21DaGlsZC5nZXRDaGlsZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5yZW1vdmVFbGVtZW50KG5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LnJlbW92ZUVsZW1lbnQobm9kZVRleHRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVUZXh0SW5kZXggPCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnNpemUoKSAmJiBub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4KS5pc05ld2xpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4ID0gY29uc2lkZXJDbGVhbmluZ1RoZUxpbmUobm9kZVRleHQsIG5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmSW5kZXggKyAxID49IHRoaXMuZ2V0RWxlbWVudHMoKS5zaXplKCkgfHwgISh0aGlzLmdldEVsZW1lbnRzKCkuZ2V0KGRpZmZJbmRleCArIDEpIGluc3RhbmNlb2YgQWRkZWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4ID0gY29uc2lkZXJFbmZvcmNpbmdJbmRlbnRhdGlvbihub2RlVGV4dCwgbm9kZVRleHRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaW4gZnJvbnQgd2UgaGF2ZSBvbmUgc3BhY2UgYW5kIGJlZm9yZSBhbHNvIHdlIGhhZCBzcGFjZSBsZXQncyBkcm9wIG9uZSBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zaXplKCkgPiBub2RlVGV4dEluZGV4ICYmIG5vZGVUZXh0SW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQobm9kZVRleHRJbmRleCkuaXNXaGl0ZVNwYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQobm9kZVRleHRJbmRleCAtIDEpLmlzV2hpdGVTcGFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGF0IHdoZW4gd2UgYXJlIGFib3V0IHRvIGFkZGluZyBvciByZW1vdmluZyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZGlmZkluZGV4ICsgMSkgPT0gdGhpcy5lbGVtZW50cy5zaXplKCkgfHwgKGVsZW1lbnRzLmdldChkaWZmSW5kZXggKyAxKSBpbnN0YW5jZW9mIEtlcHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkucmVtb3ZlKG5vZGVUZXh0SW5kZXgtLSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChyZW1vdmVkLmVsZW1lbnQgaW5zdGFuY2VvZiBDc21Ub2tlbikgJiYgbm9kZVRleHRFbCBpbnN0YW5jZW9mIFRva2VuVGV4dEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKENzbVRva2VuKXJlbW92ZWQuZWxlbWVudCkuZ2V0VG9rZW5UeXBlKCkgPT0gKChUb2tlblRleHRFbGVtZW50KW5vZGVUZXh0RWwpLmdldFRva2VuS2luZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5yZW1vdmVFbGVtZW50KG5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZVRleHRFbCBpbnN0YW5jZW9mIFRva2VuVGV4dEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBub2RlVGV4dEVsLmlzV2hpdGVTcGFjZU9yQ29tbWVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVtb3ZlZC5lbGVtZW50IGluc3RhbmNlb2YgQ3NtQ2hpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKENzbUNoaWxkKXJlbW92ZWQuZWxlbWVudCkuZ2V0Q2hpbGQoKSBpbnN0YW5jZW9mIFByaW1pdGl2ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZVR5cGUobm9kZVRleHRFbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5yZW1vdmVFbGVtZW50KG5vZGVUZXh0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInJlbW92ZWQgIiArIHJlbW92ZWQuZWxlbWVudCArICIgdnMgIiArIG5vZGVUZXh0RWwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbW92ZWQuZWxlbWVudCBpbnN0YW5jZW9mIENzbVRva2VuICYmICgoQ3NtVG9rZW4pcmVtb3ZlZC5lbGVtZW50KS5pc1doaXRlU3BhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZVRleHRFbC5pc1doaXRlU3BhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJyZW1vdmVkICIgKyByZW1vdmVkLmVsZW1lbnQgKyAiIHZzICIgKyBub2RlVGV4dEVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZkVsIGluc3RhbmNlb2YgUmVzaHVmZmxlZCkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBsZXQncyBzZWUgaG93IG1hbnkgdG9rZW5zIHdlIG5lZWQgdG8gYXR0cmlidXRlIHRvIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBvZiB0aGUgQ3NtTWl4CisgICAgICAgICAgICAgICAgICAgIFJlc2h1ZmZsZWQgcmVzaHVmZmxlZCA9IChSZXNodWZmbGVkKWRpZmZFbDsKKyAgICAgICAgICAgICAgICAgICAgQ3NtTWl4IGVsZW1lbnRzRnJvbVByZXZpb3VzT3JkZXIgPSByZXNodWZmbGVkLnByZXZpb3VzT3JkZXI7CisgICAgICAgICAgICAgICAgICAgIENzbU1peCBlbGVtZW50c0Zyb21OZXh0T3JkZXIgPSByZXNodWZmbGVkLmVsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb250YWlucyBpbmRleGVzIGZyb20gZWxlbWVudHNGcm9tTmV4dE9yZGVyIHRvIGluZGV4ZXMgZnJvbSBlbGVtZW50c0Zyb21QcmV2aW91c09yZGVyCisgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBjb3JyZXNwb25kYW5jZUJldHdlZW5OZXh0T3JkZXJBbmRQcmV2aW91c09yZGVyID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuaT0wO25pPGVsZW1lbnRzRnJvbU5leHRPcmRlci5nZXRFbGVtZW50cygpLnNpemUoKTtuaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBDc21FbGVtZW50IG5lID0gZWxlbWVudHNGcm9tTmV4dE9yZGVyLmdldEVsZW1lbnRzKCkuZ2V0KG5pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHBpPTA7cGk8ZWxlbWVudHNGcm9tUHJldmlvdXNPcmRlci5nZXRFbGVtZW50cygpLnNpemUoKSAmJiAhZm91bmQ7cGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQgcGUgPSBlbGVtZW50c0Zyb21QcmV2aW91c09yZGVyLmdldEVsZW1lbnRzKCkuZ2V0KHBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcnJlc3BvbmRhbmNlQmV0d2Vlbk5leHRPcmRlckFuZFByZXZpb3VzT3JkZXIudmFsdWVzKCkuY29udGFpbnMocGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXRjaGluZyhuZSwgcGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGFuY2VCZXR3ZWVuTmV4dE9yZGVyQW5kUHJldmlvdXNPcmRlci5wdXQobmksIHBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBub3cgZmluZCBvdXQgd2hpY2ggTm9kZSBUZXh0IGVsZW1lbnRzIGNvcnJlc3BvbmRzIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgQ1NNCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdGFydE5vZGVUZXh0SW5kZXggPSBub2RlVGV4dEluZGV4OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8SW50ZWdlcj4gdXNlZEluZGV4ZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gbm9kZVRleHRJbmRleE9mUHJldmlvdXNFbGVtZW50cyA9IGVsZW1lbnRzRnJvbVByZXZpb3VzT3JkZXIuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaXQgLT4gZmluZEluZGV4T2ZDb3JyZXNwb25kaW5nTm9kZVRleHRFbGVtZW50KGl0LCBub2RlVGV4dCwgc3RhcnROb2RlVGV4dEluZGV4LCB1c2VkSW5kZXhlcywgbm9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBub2RlVGV4dEluZGV4VG9QcmV2aW91c0NTTUluZGV4ID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxub2RlVGV4dEluZGV4T2ZQcmV2aW91c0VsZW1lbnRzLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IG5vZGVUZXh0SW5kZXhPZlByZXZpb3VzRWxlbWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHRJbmRleFRvUHJldmlvdXNDU01JbmRleC5wdXQodmFsdWUsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0Tm9kZVRleHRJbmRleCA9IG5vZGVUZXh0SW5kZXhPZlByZXZpb3VzRWxlbWVudHMuc3RyZWFtKCkubWF4KEludGVnZXI6OmNvbXBhcmVUbykub3JFbHNlKC0xKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50cyB0byBiZSBhZGRlZCBhdCB0aGUgZW5kCisgICAgICAgICAgICAgICAgICAgIExpc3Q8Q3NtRWxlbWVudD4gZWxlbWVudHNUb0JlQWRkZWRBdFRoZUVuZCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIExpc3Q8Q3NtRWxlbWVudD4+IGVsZW1lbnRzVG9BZGRCZWZvcmVHaXZlbk9yaWdpbmFsQ1NNRWxlbWVudCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbmk9MDtuaTxlbGVtZW50c0Zyb21OZXh0T3JkZXIuZ2V0RWxlbWVudHMoKS5zaXplKCk7bmkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaGFzIGEgbWFwcGluZywgdGhlbiBpdCBpcyBrZXB0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcnJlc3BvbmRhbmNlQmV0d2Vlbk5leHRPcmRlckFuZFByZXZpb3VzT3JkZXIuY29udGFpbnNLZXkobmkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2ssIGl0IGlzIHNvbWV0aGluZyBuZXcuIFdoZXJlIHRvIHB1dCBpdD8gTGV0J3Mgc2VlIHdoYXQgaXMgdGhlIGZpcnN0IGZvbGxvd2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgdGhhdCBoYXMgYSBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yaWdpbmFsQ3NtSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuaj1uaSArIDE7bmo8ZWxlbWVudHNGcm9tTmV4dE9yZGVyLmdldEVsZW1lbnRzKCkuc2l6ZSgpICYmIG9yaWdpbmFsQ3NtSW5kZXg9PS0xO25qKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcnJlc3BvbmRhbmNlQmV0d2Vlbk5leHRPcmRlckFuZFByZXZpb3VzT3JkZXIuY29udGFpbnNLZXkobmopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbENzbUluZGV4ID0gY29ycmVzcG9uZGFuY2VCZXR3ZWVuTmV4dE9yZGVyQW5kUHJldmlvdXNPcmRlci5nZXQobmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50c1RvQWRkQmVmb3JlR2l2ZW5PcmlnaW5hbENTTUVsZW1lbnQuY29udGFpbnNLZXkob3JpZ2luYWxDc21JbmRleCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9BZGRCZWZvcmVHaXZlbk9yaWdpbmFsQ1NNRWxlbWVudC5wdXQob3JpZ2luYWxDc21JbmRleCwgbmV3IExpbmtlZExpc3Q8PigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9BZGRCZWZvcmVHaXZlbk9yaWdpbmFsQ1NNRWxlbWVudC5nZXQob3JpZ2luYWxDc21JbmRleCkuYWRkKGVsZW1lbnRzRnJvbU5leHRPcmRlci5nZXRFbGVtZW50cygpLmdldChuaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGRvZXMgbm90IHByZWNlZWQgYW55dGhpbmcsIHNvIGl0IGdvZXMgYXQgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbENzbUluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9CZUFkZGVkQXRUaGVFbmQuYWRkKGVsZW1lbnRzRnJvbU5leHRPcmRlci5nZXRFbGVtZW50cygpLmdldChuaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdvIG92ZXIgdGhlIG9yaWdpbmFsIG5vZGUgdGV4dCBlbGVtZW50cywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBOb2RlVGV4dC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgYW4gb3JpZ2luYWwgbm9kZSB0ZXh0IGVsZW1lbnQgKE9ORSkKKyAgICAgICAgICAgICAgICAgICAgLy8gKiB3ZSB2ZXJpZnkgaWYgaXQgY29ycmVzcG9uZHMgdG8gYSBDU00gZWxlbWVudC4gSWYgaXQgZG9lcyBub3Qgd2UganVzdCBtb3ZlIG9uLCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gICB3ZSBmaW5kIHRoZSBjb3JyZXNwb25kIE9DRSAoT3JpZ2luYWwgQ1NNIEVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIC8vICogd2UgZmlyc3QgYWRkIG5ldyBlbGVtZW50cyB0aGF0IGFyZSBtYXJrZWQgdG8gYmUgYWRkZWQgYmVmb3JlIE9DRQorICAgICAgICAgICAgICAgICAgICAvLyAqIGlmIE9DRSBpcyBtYXJrZWQgdG8gYmUgcHJlc2VudCBhbHNvIGluIHRoZSAiYWZ0ZXIiIENTTSB3ZSBhZGQgYSBrZXB0IGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIC8vICAgb3RoZXJ3aXNlIHdlIGFkZCBhIHJlbW92ZWQgZWxlbWVudAorCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudHMoKS5yZW1vdmUoZGlmZkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZmZFbEl0ZXJhdG9yID0gZGlmZkluZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE5vZGVUZXh0SW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG50SW5kZXggPSBzdGFydE5vZGVUZXh0SW5kZXg7IG50SW5kZXg8PWxhc3ROb2RlVGV4dEluZGV4OyBudEluZGV4KyspIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVGV4dEluZGV4VG9QcmV2aW91c0NTTUluZGV4LmNvbnRhaW5zS2V5KG50SW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE9mT3JpZ2luYWxDU01FbGVtZW50ID0gbm9kZVRleHRJbmRleFRvUHJldmlvdXNDU01JbmRleC5nZXQobnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1RvQWRkQmVmb3JlR2l2ZW5PcmlnaW5hbENTTUVsZW1lbnQuY29udGFpbnNLZXkoaW5kZXhPZk9yaWdpbmFsQ1NNRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ3NtRWxlbWVudCBlbGVtZW50VG9BZGQgOiBlbGVtZW50c1RvQWRkQmVmb3JlR2l2ZW5PcmlnaW5hbENTTUVsZW1lbnQuZ2V0KGluZGV4T2ZPcmlnaW5hbENTTUVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKGRpZmZFbEl0ZXJhdG9yKyssIG5ldyBBZGRlZChlbGVtZW50VG9BZGQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENzbUVsZW1lbnQgb3JpZ2luYWxDU01FbGVtZW50ID0gZWxlbWVudHNGcm9tUHJldmlvdXNPcmRlci5nZXRFbGVtZW50cygpLmdldChpbmRleE9mT3JpZ2luYWxDU01FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0b0JlS2VwdCA9IGNvcnJlc3BvbmRhbmNlQmV0d2Vlbk5leHRPcmRlckFuZFByZXZpb3VzT3JkZXIuY29udGFpbnNWYWx1ZShpbmRleE9mT3JpZ2luYWxDU01FbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQmVLZXB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoZGlmZkVsSXRlcmF0b3IrKywgbmV3IEtlcHQob3JpZ2luYWxDU01FbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoZGlmZkVsSXRlcmF0b3IrKywgbmV3IFJlbW92ZWQob3JpZ2luYWxDU01FbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSB3ZSBoYXZlIGEgc2ltcGxlIG5vZGUgdGV4dCBlbGVtZW50LCB3aXRob3V0IGFzc29jaWF0ZWQgY3NtIGVsZW1lbnQsIGp1c3Qga2VlcCBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsbHkgd2UgbG9vayBmb3IgdGhlIHJlbWFpbmluZyBuZXcgZWxlbWVudHMgdGhhdCB3ZXJlIG5vdCB5ZXQgYWRkZWQgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhbGwgb2YgdGhlbQorICAgICAgICAgICAgICAgICAgICBmb3IgKENzbUVsZW1lbnQgZWxlbWVudFRvQWRkIDogZWxlbWVudHNUb0JlQWRkZWRBdFRoZUVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKGRpZmZFbEl0ZXJhdG9yKyssIG5ldyBBZGRlZChlbGVtZW50VG9BZGQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiIiArIGRpZmZFbCArICIgdnMgIiArIG5vZGVUZXh0RWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoZGlmZkluZGV4IDwgdGhpcy5lbGVtZW50cy5zaXplKCkgfHwgbm9kZVRleHRJbmRleCA8IG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBmaW5kSW5kZXhPZkNvcnJlc3BvbmRpbmdOb2RlVGV4dEVsZW1lbnQoQ3NtRWxlbWVudCBjc21FbGVtZW50LCBOb2RlVGV4dCBub2RlVGV4dCwgaW50IHN0YXJ0SW5kZXgsIFNldDxJbnRlZ2VyPiB1c2VkSW5kZXhlcywgTm9kZSBub2RlKSB7CisgICAgICAgIGZvciAoaW50IGk9c3RhcnRJbmRleDtpPG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc2l6ZSgpO2krKyl7CisgICAgICAgICAgICBpZiAoIXVzZWRJbmRleGVzLmNvbnRhaW5zKGkpKSB7CisgICAgICAgICAgICAgICAgVGV4dEVsZW1lbnQgdGV4dEVsZW1lbnQgPSBub2RlVGV4dC5nZXRUZXh0RWxlbWVudChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY3NtRWxlbWVudCBpbnN0YW5jZW9mIENzbVRva2VuKSB7CisgICAgICAgICAgICAgICAgICAgIENzbVRva2VuIGNzbVRva2VuID0gKENzbVRva2VuKWNzbUVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0RWxlbWVudCBpbnN0YW5jZW9mIFRva2VuVGV4dEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuVGV4dEVsZW1lbnQgdG9rZW5UZXh0RWxlbWVudCA9IChUb2tlblRleHRFbGVtZW50KXRleHRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuVGV4dEVsZW1lbnQuZ2V0VG9rZW5LaW5kKCkgPT0gY3NtVG9rZW4uZ2V0VG9rZW5UeXBlKCkgJiYgdG9rZW5UZXh0RWxlbWVudC5nZXRUZXh0KCkuZXF1YWxzKGNzbVRva2VuLmdldENvbnRlbnQobm9kZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEluZGV4ZXMuYWRkKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc21FbGVtZW50IGluc3RhbmNlb2YgQ3NtQ2hpbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgQ3NtQ2hpbGQgY3NtQ2hpbGQgPSAoQ3NtQ2hpbGQpY3NtRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRFbGVtZW50IGluc3RhbmNlb2YgQ2hpbGRUZXh0RWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRUZXh0RWxlbWVudCBjaGlsZFRleHRFbGVtZW50ID0gKENoaWxkVGV4dEVsZW1lbnQpdGV4dEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRUZXh0RWxlbWVudC5nZXRDaGlsZCgpID09IGNzbUNoaWxkLmdldENoaWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkSW5kZXhlcy5hZGQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGFkanVzdEluZGVudGF0aW9uKExpc3Q8VG9rZW5UZXh0RWxlbWVudD4gaW5kZW50YXRpb24sIE5vZGVUZXh0IG5vZGVUZXh0LCBpbnQgbm9kZVRleHRJbmRleCwgYm9vbGVhbiBmb2xsb3dlZEJ5VW5pbmRlbnQpIHsKKyAgICAgICAgTGlzdDxUZXh0RWxlbWVudD4gaW5kZW50YXRpb25BZGogPSBwcm9jZXNzSW5kZW50YXRpb24oaW5kZW50YXRpb24sIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc3ViTGlzdCgwLCBub2RlVGV4dEluZGV4IC0gMSkpOworICAgICAgICBpZiAobm9kZVRleHRJbmRleCA8IG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc2l6ZSgpICYmIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KG5vZGVUZXh0SW5kZXgpLmlzVG9rZW4oUkJSQUNFKSkgeworICAgICAgICAgICAgaW5kZW50YXRpb25BZGogPSBpbmRlbnRhdGlvbkFkai5zdWJMaXN0KDAsIGluZGVudGF0aW9uQWRqLnNpemUoKSAtIE1hdGgubWluKFNUQU5EQVJEX0lOREVOVEFUSU9OX1NJWkUsIGluZGVudGF0aW9uQWRqLnNpemUoKSkpOworICAgICAgICB9IGVsc2UgaWYgKGZvbGxvd2VkQnlVbmluZGVudCkgeworICAgICAgICAgICAgaW5kZW50YXRpb25BZGogPSBpbmRlbnRhdGlvbkFkai5zdWJMaXN0KDAsIE1hdGgubWF4KDAsIGluZGVudGF0aW9uQWRqLnNpemUoKSAtIFNUQU5EQVJEX0lOREVOVEFUSU9OX1NJWkUpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFRleHRFbGVtZW50IGUgOiBpbmRlbnRhdGlvbkFkaikgeworICAgICAgICAgICAgaWYgKChub2RlVGV4dEluZGV4PG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc2l6ZSgpKSAmJiBub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChub2RlVGV4dEluZGV4KS5pc1NwYWNlT3JUYWIoKSkgeworICAgICAgICAgICAgICAgIG5vZGVUZXh0SW5kZXgrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5hZGQobm9kZVRleHRJbmRleCsrLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZVRleHRJbmRleDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBUmVwbGFjZW1lbnQoaW50IGRpZmZJbmRleCkgeworICAgICAgICByZXR1cm4gKGRpZmZJbmRleCA+IDApICYmIGdldEVsZW1lbnRzKCkuZ2V0KGRpZmZJbmRleCkgaW5zdGFuY2VvZiBBZGRlZCAmJiBnZXRFbGVtZW50cygpLmdldChkaWZmSW5kZXggLSAxKSBpbnN0YW5jZW9mIFJlbW92ZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCkgeworICAgICAgICBpZiAodGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBUb2tlblRleHRFbGVtZW50KSB7CisgICAgICAgICAgICBUb2tlblRleHRFbGVtZW50IHRva2VuVGV4dEVsZW1lbnQgPSAoVG9rZW5UZXh0RWxlbWVudCl0ZXh0RWxlbWVudDsKKyAgICAgICAgICAgIGludCB0b2tlbktpbmQgPSB0b2tlblRleHRFbGVtZW50LmdldFRva2VuS2luZCgpOworICAgICAgICAgICAgcmV0dXJuIHRva2VuS2luZCA9PSBCWVRFCisgICAgICAgICAgICAgICAgfHwgdG9rZW5LaW5kID09IENIQVIKKyAgICAgICAgICAgICAgICB8fCB0b2tlbktpbmQgPT0gU0hPUlQKKyAgICAgICAgICAgICAgICB8fCB0b2tlbktpbmQgPT0gSU5UCisgICAgICAgICAgICAgICAgfHwgdG9rZW5LaW5kID09IExPTkcKKyAgICAgICAgICAgICAgICB8fCB0b2tlbktpbmQgPT0gRkxPQVQKKyAgICAgICAgICAgICAgICB8fCB0b2tlbktpbmQgPT0gRE9VQkxFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNvc3QoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50cy5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhKGUgaW5zdGFuY2VvZiBLZXB0KSkuY291bnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkRpZmZlcmVuY2V7IiArIGVsZW1lbnRzICsgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PERpZmZlcmVuY2VFbGVtZW50PiBnZXRFbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBmcm9tIHRoZSBkaWZmZXJlbmNlIGFsbCB0aGUgZWxlbWVudHMgcmVsYXRlZCB0byBpbmRlbnRhdGlvbi4KKyAgICAgKiBUaGlzIGlzIG1haW5seSBpbnRlbmRlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUluZGVudGF0aW9uRWxlbWVudHMoKSB7CisgICAgICAgIGVsZW1lbnRzLnJlbW92ZUlmKGVsIC0+IGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENzbUluZGVudCB8fCBlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBDc21VbmluZGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9MZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2M2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSwzMzIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLkNvbmNyZXRlU3ludGF4TW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuUHJpbnRhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlNvdXJjZVByaW50ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uY2hhbmdlcy4qOworCitpbXBvcnQgamF2YS51dGlsLio7CisKK2NsYXNzIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uY3JldGVTeW50YXhNb2RlbCByZXByZXNlbnRzIHRoZSBnZW5lcmFsIGZvcm1hdC4gVGhpcyBtb2RlbCBpcyBhIGNhbGN1bGF0ZWQgdmVyc2lvbiBvZiB0aGUgQ29uY3JldGVTeW50YXhNb2RlbCwKKyAgICAgKiB3aXRoIG5vIGNvbmRpdGlvbiwgbm8gbGlzdHMsIGp1c3QgdG9rZW5zIGFuZCBub2RlIGNoaWxkcmVuLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBDYWxjdWxhdGVkU3ludGF4TW9kZWwgeworICAgICAgICBmaW5hbCBMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzOworCisgICAgICAgIENhbGN1bGF0ZWRTeW50YXhNb2RlbChMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzKSB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGZyb20oaW50IGluZGV4KSB7CisgICAgICAgICAgICBMaXN0PENzbUVsZW1lbnQ+IG5ld0xpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICBuZXdMaXN0LmFkZEFsbChlbGVtZW50cy5zdWJMaXN0KGluZGV4LCBlbGVtZW50cy5zaXplKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlZFN5bnRheE1vZGVsKG5ld0xpc3QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkNhbGN1bGF0ZWRTeW50YXhNb2RlbHsiICsKKyAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRzPSIgKyBlbGVtZW50cyArCisgICAgICAgICAgICAgICAgICAgICd9JzsKKyAgICAgICAgfQorCisgICAgICAgIENhbGN1bGF0ZWRTeW50YXhNb2RlbCBzdWIoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0ZWRTeW50YXhNb2RlbChlbGVtZW50cy5zdWJMaXN0KHN0YXJ0LCBlbmQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVtb3ZlSW5kZW50YXRpb25FbGVtZW50cygpIHsKKyAgICAgICAgICAgIGVsZW1lbnRzLnJlbW92ZUlmKGVsIC0+IGVsIGluc3RhbmNlb2YgQ3NtSW5kZW50IHx8IGVsIGluc3RhbmNlb2YgQ3NtVW5pbmRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENzbUNoaWxkIGltcGxlbWVudHMgQ3NtRWxlbWVudCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTm9kZSBjaGlsZDsKKworICAgICAgICBwdWJsaWMgTm9kZSBnZXRDaGlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIENzbUNoaWxkKE5vZGUgY2hpbGQpIHsKKyAgICAgICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwcmV0dHlQcmludChOb2RlIG5vZGUsIFNvdXJjZVByaW50ZXIgcHJpbnRlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiY2hpbGQoIiArIGNoaWxkLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKyIpIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBDc21DaGlsZCBjc21DaGlsZCA9IChDc21DaGlsZCkgbzsKKworICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmVxdWFscyhjc21DaGlsZC5jaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZC5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgRGlmZmVyZW5jZSBjYWxjdWxhdGVMaXN0UmVtb3ZhbERpZmZlcmVuY2UoT2JzZXJ2YWJsZVByb3BlcnR5IG9ic2VydmFibGVQcm9wZXJ0eSwgTm9kZUxpc3Qgbm9kZUxpc3QsIGludCBpbmRleCkgeworICAgICAgICBOb2RlIGNvbnRhaW5lciA9IG5vZGVMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpOworICAgICAgICBDc21FbGVtZW50IGVsZW1lbnQgPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGNvbnRhaW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIG9yaWdpbmFsID0gY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShlbGVtZW50LCBjb250YWluZXIpOworICAgICAgICBDYWxjdWxhdGVkU3ludGF4TW9kZWwgYWZ0ZXIgPSBjYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlckxpc3RSZW1vdmFsKGVsZW1lbnQsIG9ic2VydmFibGVQcm9wZXJ0eSwgbm9kZUxpc3QsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIERpZmZlcmVuY2UuY2FsY3VsYXRlKG9yaWdpbmFsLCBhZnRlcik7CisgICAgfQorCisgICAgRGlmZmVyZW5jZSBjYWxjdWxhdGVMaXN0QWRkaXRpb25EaWZmZXJlbmNlKE9ic2VydmFibGVQcm9wZXJ0eSBvYnNlcnZhYmxlUHJvcGVydHksIE5vZGVMaXN0IG5vZGVMaXN0LCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkKSB7CisgICAgICAgIE5vZGUgY29udGFpbmVyID0gbm9kZUxpc3QuZ2V0UGFyZW50Tm9kZUZvckNoaWxkcmVuKCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoY29udGFpbmVyLmdldENsYXNzKCkpOworICAgICAgICBDYWxjdWxhdGVkU3ludGF4TW9kZWwgb3JpZ2luYWwgPSBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGVsZW1lbnQsIGNvbnRhaW5lcik7CisgICAgICAgIENhbGN1bGF0ZWRTeW50YXhNb2RlbCBhZnRlciA9IGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdEFkZGl0aW9uKGVsZW1lbnQsIG9ic2VydmFibGVQcm9wZXJ0eSwgbm9kZUxpc3QsIGluZGV4LCBub2RlQWRkZWQpOworICAgICAgICByZXR1cm4gRGlmZmVyZW5jZS5jYWxjdWxhdGUob3JpZ2luYWwsIGFmdGVyKTsKKyAgICB9CisKKyAgICBEaWZmZXJlbmNlIGNhbGN1bGF0ZUxpc3RSZXBsYWNlbWVudERpZmZlcmVuY2UoT2JzZXJ2YWJsZVByb3BlcnR5IG9ic2VydmFibGVQcm9wZXJ0eSwgTm9kZUxpc3Qgbm9kZUxpc3QsIGludCBpbmRleCwgTm9kZSBuZXdWYWx1ZSkgeworICAgICAgICBOb2RlIGNvbnRhaW5lciA9IG5vZGVMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpOworICAgICAgICBDc21FbGVtZW50IGVsZW1lbnQgPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGNvbnRhaW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIG9yaWdpbmFsID0gY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShlbGVtZW50LCBjb250YWluZXIpOworICAgICAgICBDYWxjdWxhdGVkU3ludGF4TW9kZWwgYWZ0ZXIgPSBjYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlckxpc3RSZXBsYWNlbWVudChlbGVtZW50LCBvYnNlcnZhYmxlUHJvcGVydHksIG5vZGVMaXN0LCBpbmRleCwgbmV3VmFsdWUpOworICAgICAgICByZXR1cm4gRGlmZmVyZW5jZS5jYWxjdWxhdGUob3JpZ2luYWwsIGFmdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVQcm9wZXJ0eUNoYW5nZShOb2RlVGV4dCBub2RlVGV4dCwgTm9kZSBvYnNlcnZlZE5vZGUsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgaWYgKG5vZGVUZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3Mob2JzZXJ2ZWROb2RlLmdldENsYXNzKCkpOworICAgICAgICBDYWxjdWxhdGVkU3ludGF4TW9kZWwgb3JpZ2luYWwgPSBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGVsZW1lbnQsIG9ic2VydmVkTm9kZSk7CisgICAgICAgIENhbGN1bGF0ZWRTeW50YXhNb2RlbCBhZnRlciA9IGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoZWxlbWVudCwgb2JzZXJ2ZWROb2RlLCBwcm9wZXJ0eSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKyAgICAgICAgRGlmZmVyZW5jZSBkaWZmZXJlbmNlID0gRGlmZmVyZW5jZS5jYWxjdWxhdGUob3JpZ2luYWwsIGFmdGVyKTsKKyAgICAgICAgZGlmZmVyZW5jZS5hcHBseShub2RlVGV4dCwgb2JzZXJ2ZWROb2RlKTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoQ3NtRWxlbWVudCBjc20sIE5vZGUgbm9kZSkgeworICAgICAgICBMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGNzbSwgbm9kZSwgZWxlbWVudHMsIG5ldyBOb0NoYW5nZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdGVkU3ludGF4TW9kZWwoZWxlbWVudHMpOworICAgIH0KKworICAgIENhbGN1bGF0ZWRTeW50YXhNb2RlbCBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKG5vZGUuZ2V0Q2xhc3MoKSksIG5vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKENzbUVsZW1lbnQgY3NtLCBOb2RlIG5vZGUsIExpc3Q8Q3NtRWxlbWVudD4gZWxlbWVudHMsIENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgaWYgKGNzbSBpbnN0YW5jZW9mIENzbVNlcXVlbmNlKSB7CisgICAgICAgICAgICBDc21TZXF1ZW5jZSBjc21TZXF1ZW5jZSA9IChDc21TZXF1ZW5jZSkgY3NtOworICAgICAgICAgICAgY3NtU2VxdWVuY2UuZ2V0RWxlbWVudHMoKS5mb3JFYWNoKGUgLT4gY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShlLCBub2RlLCBlbGVtZW50cywgY2hhbmdlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY3NtIGluc3RhbmNlb2YgQ3NtQ29tbWVudCkgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICB9IGVsc2UgaWYgKGNzbSBpbnN0YW5jZW9mIENzbVNpbmdsZVJlZmVyZW5jZSkgeworICAgICAgICAgICAgQ3NtU2luZ2xlUmVmZXJlbmNlIGNzbVNpbmdsZVJlZmVyZW5jZSA9IChDc21TaW5nbGVSZWZlcmVuY2UpY3NtOworICAgICAgICAgICAgTm9kZSBjaGlsZDsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZSAmJiAoKFByb3BlcnR5Q2hhbmdlKWNoYW5nZSkuZ2V0UHJvcGVydHkoKSA9PSBjc21TaW5nbGVSZWZlcmVuY2UuZ2V0UHJvcGVydHkoKSkgeworICAgICAgICAgICAgICAgIGNoaWxkID0gKE5vZGUpKChQcm9wZXJ0eUNoYW5nZSljaGFuZ2UpLmdldE5ld1ZhbHVlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoaWxkID0gY3NtU2luZ2xlUmVmZXJlbmNlLmdldFByb3BlcnR5KCkuZ2V0VmFsdWVBc1NpbmdsZVJlZmVyZW5jZShub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBDc21DaGlsZChjaGlsZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNzbSBpbnN0YW5jZW9mIENzbU5vbmUpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfSBlbHNlIGlmIChjc20gaW5zdGFuY2VvZiBDc21Ub2tlbikgeworICAgICAgICAgICAgZWxlbWVudHMuYWRkKGNzbSk7CisgICAgICAgIH0gZWxzZSBpZiAoY3NtIGluc3RhbmNlb2YgQ3NtT3JwaGFuQ29tbWVudHNFbmRpbmcpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfSBlbHNlIGlmIChjc20gaW5zdGFuY2VvZiBDc21MaXN0KSB7CisgICAgICAgICAgICBDc21MaXN0IGNzbUxpc3QgPSAoQ3NtTGlzdCkgY3NtOworICAgICAgICAgICAgaWYgKGNzbUxpc3QuZ2V0UHJvcGVydHkoKS5pc0Fib3V0Tm9kZXMoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCByYXdWYWx1ZSA9IGNoYW5nZS5nZXRWYWx1ZShjc21MaXN0LmdldFByb3BlcnR5KCksIG5vZGUpOworICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0OworICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZSBpbnN0YW5jZW9mIE9wdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIG9wdGlvbmFsID0gKE9wdGlvbmFsKXJhd1ZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9wdGlvbmFsLmdldCgpIGluc3RhbmNlb2YgTm9kZUxpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgTm9kZUxpc3QsIGZvdW5kICIgKyBvcHRpb25hbC5nZXQoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGlzdCA9IChOb2RlTGlzdCkgb3B0aW9uYWwuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocmF3VmFsdWUgaW5zdGFuY2VvZiBOb2RlTGlzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIE5vZGVMaXN0LCBmb3VuZCAiICsgcmF3VmFsdWUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGVMaXN0ID0gKE5vZGVMaXN0KSByYXdWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFub2RlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShjc21MaXN0LmdldFByZWNlZWRpbmcoKSwgbm9kZSwgZWxlbWVudHMsIGNoYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGNzbUxpc3QuZ2V0U2VwYXJhdG9yUHJlKCksIG5vZGUsIGVsZW1lbnRzLCBjaGFuZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBDc21DaGlsZChub2RlTGlzdC5nZXQoaSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IChub2RlTGlzdC5zaXplKCkgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtTGlzdC5nZXRTZXBhcmF0b3JQb3N0KCksIG5vZGUsIGVsZW1lbnRzLCBjaGFuZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShjc21MaXN0LmdldEZvbGxvd2luZygpLCBub2RlLCBlbGVtZW50cywgY2hhbmdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBjaGFuZ2UuZ2V0VmFsdWUoY3NtTGlzdC5nZXRQcm9wZXJ0eSgpLCBub2RlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtTGlzdC5nZXRQcmVjZWVkaW5nKCksIG5vZGUsIGVsZW1lbnRzLCBjaGFuZ2UpOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtTGlzdC5nZXRTZXBhcmF0b3JQcmUoKSwgbm9kZSwgZWxlbWVudHMsIGNoYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNb2RpZmllcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVyIG1vZGlmaWVyID0gKE1vZGlmaWVyKXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChuZXcgQ3NtVG9rZW4odG9Ub2tlbihtb2RpZmllcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGl0Lm5leHQoKS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShjc21MaXN0LmdldFNlcGFyYXRvclBvc3QoKSwgbm9kZSwgZWxlbWVudHMsIGNoYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtTGlzdC5nZXRGb2xsb3dpbmcoKSwgbm9kZSwgZWxlbWVudHMsIGNoYW5nZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNzbSBpbnN0YW5jZW9mIENzbUNvbmRpdGlvbmFsKSB7CisgICAgICAgICAgICBDc21Db25kaXRpb25hbCBjc21Db25kaXRpb25hbCA9IChDc21Db25kaXRpb25hbCkgY3NtOworICAgICAgICAgICAgYm9vbGVhbiBzYXRpc2ZpZWQgPSBjaGFuZ2UuZXZhbHVhdGUoY3NtQ29uZGl0aW9uYWwsIG5vZGUpOworICAgICAgICAgICAgaWYgKHNhdGlzZmllZCkgeworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtQ29uZGl0aW9uYWwuZ2V0VGhlbkVsZW1lbnQoKSwgbm9kZSwgZWxlbWVudHMsIGNoYW5nZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtQ29uZGl0aW9uYWwuZ2V0RWxzZUVsZW1lbnQoKSwgbm9kZSwgZWxlbWVudHMsIGNoYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY3NtIGluc3RhbmNlb2YgQ3NtSW5kZW50KSB7CisgICAgICAgICAgICBlbGVtZW50cy5hZGQoY3NtKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc20gaW5zdGFuY2VvZiBDc21VbmluZGVudCkgeworICAgICAgICAgICAgZWxlbWVudHMuYWRkKGNzbSk7CisgICAgICAgIH0gZWxzZSBpZiAoY3NtIGluc3RhbmNlb2YgQ3NtQXR0cmlidXRlKSB7CisgICAgICAgICAgICBDc21BdHRyaWJ1dGUgY3NtQXR0cmlidXRlID0gKENzbUF0dHJpYnV0ZSkgY3NtOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY2hhbmdlLmdldFZhbHVlKGNzbUF0dHJpYnV0ZS5nZXRQcm9wZXJ0eSgpLCBub2RlKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByaW50YWJsZSkgeworICAgICAgICAgICAgICAgIHRleHQgPSAoKFByaW50YWJsZSkgdmFsdWUpLmFzU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IENzbVRva2VuKGNzbUF0dHJpYnV0ZS5nZXRUb2tlblR5cGUobm9kZSwgdmFsdWUudG9TdHJpbmcoKSksIHRleHQpKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY3NtIGluc3RhbmNlb2YgQ3NtU3RyaW5nKSAmJiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWxFeHByKSkgeworICAgICAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNUUklOR19MSVRFUkFMLAorICAgICAgICAgICAgICAgICAgICAiXCIiICsgKChTdHJpbmdMaXRlcmFsRXhwcikgbm9kZSkuZ2V0VmFsdWUoKSArICJcIiIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc20gaW5zdGFuY2VvZiBDc21NaXgpIHsKKyAgICAgICAgICAgIENzbU1peCBjc21NaXggPSAoQ3NtTWl4KWNzbTsKKyAgICAgICAgICAgIExpc3Q8Q3NtRWxlbWVudD4gbWl4RWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICBjc21NaXguZ2V0RWxlbWVudHMoKS5mb3JFYWNoKGUgLT4gY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShlLCBub2RlLCBtaXhFbGVtZW50cywgY2hhbmdlKSk7CisgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IENzbU1peChtaXhFbGVtZW50cykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGNzbS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSsgIiAiICsgY3NtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHRvVG9rZW4oTW9kaWZpZXIgbW9kaWZpZXIpIHsKKyAgICAgICAgc3dpdGNoIChtb2RpZmllcikgeworICAgICAgICAgICAgY2FzZSBQVUJMSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUFVCTElDOworICAgICAgICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBSSVZBVEU7CisgICAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5QUk9URUNURUQ7CisgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TVEFUSUM7CisgICAgICAgICAgICBjYXNlIEZJTkFMOgorICAgICAgICAgICAgICAgIHJldHVybiBHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkZJTkFMOworICAgICAgICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5BQlNUUkFDVDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG1vZGlmaWVyLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gTWV0aG9kcyB0aGF0IGNhbGN1bGF0ZSBDYWxjdWxhdGVkU3ludGF4TW9kZWwKKyAgICAvLy8KKworICAgIC8vIFZpc2libGUgZm9yIHRlc3RpbmcKKyAgICBDYWxjdWxhdGVkU3ludGF4TW9kZWwgY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJQcm9wZXJ0eUNoYW5nZShOb2RlIG5vZGUsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoQ29uY3JldGVTeW50YXhNb2RlbC5mb3JDbGFzcyhub2RlLmdldENsYXNzKCkpLCBub2RlLCBwcm9wZXJ0eSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoQ3NtRWxlbWVudCBjc20sIE5vZGUgbm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGNzbSwgbm9kZSwgZWxlbWVudHMsIG5ldyBQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7CisgICAgICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlZFN5bnRheE1vZGVsKGVsZW1lbnRzKTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdFJlbW92YWwoQ3NtRWxlbWVudCBjc20sIE9ic2VydmFibGVQcm9wZXJ0eSBvYnNlcnZhYmxlUHJvcGVydHksIE5vZGVMaXN0IG5vZGVMaXN0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgTGlzdDxDc21FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgTm9kZSBjb250YWluZXIgPSBub2RlTGlzdC5nZXRQYXJlbnROb2RlRm9yQ2hpbGRyZW4oKTsKKyAgICAgICAgY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShjc20sIGNvbnRhaW5lciwgZWxlbWVudHMsIG5ldyBMaXN0UmVtb3ZhbENoYW5nZShvYnNlcnZhYmxlUHJvcGVydHksIGluZGV4KSk7CisgICAgICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlZFN5bnRheE1vZGVsKGVsZW1lbnRzKTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdEFkZGl0aW9uKENzbUVsZW1lbnQgY3NtLCBPYnNlcnZhYmxlUHJvcGVydHkgb2JzZXJ2YWJsZVByb3BlcnR5LCBOb2RlTGlzdCBub2RlTGlzdCwgaW50IGluZGV4LCBOb2RlIG5vZGVBZGRlZCkgeworICAgICAgICBMaXN0PENzbUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBOb2RlIGNvbnRhaW5lciA9IG5vZGVMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpOworICAgICAgICBjYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGNzbSwgY29udGFpbmVyLCBlbGVtZW50cywgbmV3IExpc3RBZGRpdGlvbkNoYW5nZShvYnNlcnZhYmxlUHJvcGVydHksIGluZGV4LCBub2RlQWRkZWQpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdGVkU3ludGF4TW9kZWwoZWxlbWVudHMpOworICAgIH0KKworICAgIC8vIFZpc2libGUgZm9yIHRlc3RpbmcKKyAgICBDYWxjdWxhdGVkU3ludGF4TW9kZWwgY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJMaXN0QWRkaXRpb24oTm9kZSBjb250YWluZXIsIE9ic2VydmFibGVQcm9wZXJ0eSBvYnNlcnZhYmxlUHJvcGVydHksIGludCBpbmRleCwgTm9kZSBub2RlQWRkZWQpIHsKKyAgICAgICAgQ3NtRWxlbWVudCBjc20gPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGNvbnRhaW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgT2JqZWN0IHJhd1ZhbHVlID0gb2JzZXJ2YWJsZVByb3BlcnR5LmdldFJhd1ZhbHVlKGNvbnRhaW5lcik7CisgICAgICAgIGlmICghKHJhd1ZhbHVlIGluc3RhbmNlb2YgTm9kZUxpc3QpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBOb2RlTGlzdCwgZm91bmQgIiArIHJhd1ZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IChOb2RlTGlzdClyYXdWYWx1ZTsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdEFkZGl0aW9uKGNzbSwgb2JzZXJ2YWJsZVByb3BlcnR5LCBub2RlTGlzdCwgaW5kZXgsIG5vZGVBZGRlZCk7CisgICAgfQorCisgICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZworICAgIENhbGN1bGF0ZWRTeW50YXhNb2RlbCBjYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlckxpc3RSZW1vdmFsKE5vZGUgY29udGFpbmVyLCBPYnNlcnZhYmxlUHJvcGVydHkgb2JzZXJ2YWJsZVByb3BlcnR5LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgQ3NtRWxlbWVudCBjc20gPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGNvbnRhaW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgT2JqZWN0IHJhd1ZhbHVlID0gb2JzZXJ2YWJsZVByb3BlcnR5LmdldFJhd1ZhbHVlKGNvbnRhaW5lcik7CisgICAgICAgIGlmICghKHJhd1ZhbHVlIGluc3RhbmNlb2YgTm9kZUxpc3QpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBOb2RlTGlzdCwgZm91bmQgIiArIHJhd1ZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IChOb2RlTGlzdClyYXdWYWx1ZTsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdFJlbW92YWwoY3NtLCBvYnNlcnZhYmxlUHJvcGVydHksIG5vZGVMaXN0LCBpbmRleCk7CisgICAgfQorCisgICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZworICAgIHByaXZhdGUgQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdFJlcGxhY2VtZW50KENzbUVsZW1lbnQgY3NtLCBPYnNlcnZhYmxlUHJvcGVydHkgb2JzZXJ2YWJsZVByb3BlcnR5LCBOb2RlTGlzdCBub2RlTGlzdCwgaW50IGluZGV4LCBOb2RlIG5ld1ZhbHVlKSB7CisgICAgICAgIExpc3Q8Q3NtRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIE5vZGUgY29udGFpbmVyID0gbm9kZUxpc3QuZ2V0UGFyZW50Tm9kZUZvckNoaWxkcmVuKCk7CisgICAgICAgIGNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoY3NtLCBjb250YWluZXIsIGVsZW1lbnRzLCBuZXcgTGlzdFJlcGxhY2VtZW50Q2hhbmdlKG9ic2VydmFibGVQcm9wZXJ0eSwgaW5kZXgsIG5ld1ZhbHVlKSk7CisgICAgICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlZFN5bnRheE1vZGVsKGVsZW1lbnRzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0xleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjQ3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0xleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5EYXRhS2V5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhWYXJpYWJsZXM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5Bc3RPYnNlcnZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLlByb3BhZ2F0aW5nQXN0T2JzZXJ2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlRyZWVWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLkNvbmNyZXRlU3ludGF4TW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21FbGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWwuQ3NtTWl4OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWwuQ3NtVG9rZW47CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuVHlwZXMuZW9sVG9rZW5LaW5kOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmRlY2FwaXRhbGl6ZTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbXBhcmF0b3IuKjsKKworLyoqCisgKiBBIExleGljYWwgUHJlc2VydmluZyBQcmludGVyIGlzIHVzZWQgdG8gY2FwdHVyZSBhbGwgdGhlIGxleGljYWwgaW5mb3JtYXRpb24gd2hpbGUgcGFyc2luZywgdXBkYXRlIHRoZW0gd2hlbgorICogb3BlcmF0aW5nIG9uIHRoZSBBU1QgYW5kIHRoZW4gdXNlZCB0aGVtIHRvIHJlcHJvZHVjZSB0aGUgc291cmNlIGNvZGUKKyAqIGluIGl0cyBvcmlnaW5hbCBmb3JtYXR0aW5nIGluY2x1ZGluZyB0aGUgQVNUIGNoYW5nZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIgeworCisgICAgLyoqCisgICAgICogVGhlIG5vZGV0ZXh0IGZvciBhIG5vZGUgaXMgc3RvcmVkIGluIHRoZSBub2RlJ3MgZGF0YSBmaWVsZC4gVGhpcyBpcyB0aGUga2V5IHRvIHNldCBhbmQgcmV0cmlldmUgaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhS2V5PE5vZGVUZXh0PiBOT0RFX1RFWFRfREFUQSA9IG5ldyBEYXRhS2V5PE5vZGVUZXh0PigpIHsKKyAgICB9OworCisgICAgLy8KKyAgICAvLyBGYWN0b3J5IG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGNvZGUgYW5kIHNldHVwIHRoZSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0dXAoTm9kZSkgYW5kIHRoZSBzdGF0aWMgbWV0aG9kcyBvbiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPE4gZXh0ZW5kcyBOb2RlPiBQYWlyPFBhcnNlUmVzdWx0PE4+LCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXI+IHNldHVwKFBhcnNlU3RhcnQ8Tj4gcGFyc2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBQYXJzZVJlc3VsdDxOPiBwYXJzZVJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKCkucGFyc2UocGFyc2VTdGFydCwgcHJvdmlkZXIpOworICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFyc2luZyBmYWlsZWQsIHVuYWJsZSB0byBzZXR1cCB0aGUgbGV4aWNhbCBwcmVzZXJ2YXRpb24gcHJpbnRlcjogIgorICAgICAgICAgICAgICAgICAgICArIHBhcnNlUmVzdWx0LmdldFByb2JsZW1zKCkpOworICAgICAgICB9CisgICAgICAgIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlciBsZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIgPSBuZXcgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyKHBhcnNlUmVzdWx0LmdldFJlc3VsdCgpLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWlyPD4ocGFyc2VSZXN1bHQsIGxleGljYWxQcmVzZXJ2aW5nUHJpbnRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIG5vZGUgc28gaXQgY2FuIGJlIHVzZWQgaW4gdGhlIHByaW50IG1ldGhvZHMuCisgICAgICogVGhlIGNvcnJlY3Qgb3JkZXIgaXM6CisgICAgICogPG9sPgorICAgICAqIDxsaT5QYXJzZSBzb21lIGNvZGU8L2xpPgorICAgICAqIDxsaT5DYWxsIHRoaXMgc2V0dXAgbWV0aG9kIG9uIHRoZSByZXN1bHQ8L2xpPgorICAgICAqIDxsaT5NYWtlIGNoYW5nZXMgdG8gdGhlIEFTVCBhcyBkZXNpcmVkPC9saT4KKyAgICAgKiA8bGk+VXNlIG9uZSBvZiB0aGUgcHJpbnQgbWV0aG9kcyBvbiB0aGlzIGNsYXNzIHRvIHByaW50IG91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUgd2l0aCB5b3VyIGNoYW5nZXMgYWRkZWQ8L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBub2RlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBmb3IgeW91ciBjb252ZW5pZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxOIGV4dGVuZHMgTm9kZT4gTiBzZXR1cChOIG5vZGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChub2RlKTsKKworICAgICAgICBub2RlLmdldFRva2VuUmFuZ2UoKS5pZlByZXNlbnQociAtPiB7CisgICAgICAgICAgICBzdG9yZUluaXRpYWxUZXh0KG5vZGUpOworCisgICAgICAgICAgICAvLyBTZXR1cCBvYnNlcnZlcgorICAgICAgICAgICAgQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBjcmVhdGVPYnNlcnZlcigpOworCisgICAgICAgICAgICBub2RlLnJlZ2lzdGVyRm9yU3VidHJlZShvYnNlcnZlcik7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIGFuZCBzZXR1cAorICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0dXAoTm9kZSkgdG8gcHJlcGFyZSBhIG5vZGUgZm9yIGxleGljYWwgcHJlc2VydmF0aW9uLAorICAgICAqIHRoZW4gdXNlIHRoZSBzdGF0aWMgbWV0aG9kcyBvbiB0aGlzIGNsYXNzIHRvIHByaW50IGl0LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlcihOb2RlIG5vZGUpIHsKKyAgICAgICAgc2V0dXAobm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQXN0T2JzZXJ2ZXIgY3JlYXRlT2JzZXJ2ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvcGFnYXRpbmdBc3RPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29uY3JldGVQcm9wZXJ0eUNoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgIC8vIE5vdCByZWFsbHkgYSBjaGFuZ2UsIGlnbm9yaW5nCisgICAgICAgICAgICAgICAgaWYgKChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpIHx8IChvbGRWYWx1ZSA9PSBudWxsICYmIG5ld1ZhbHVlID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IE9ic2VydmFibGVQcm9wZXJ0eS5SQU5HRSB8fCBwcm9wZXJ0eSA9PSBPYnNlcnZhYmxlUHJvcGVydHkuQ09NTUVOVEVEX05PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gT2JzZXJ2YWJsZVByb3BlcnR5LkNPTU1FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYnNlcnZlZE5vZGUuZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBnZXRPckNyZWF0ZU5vZGVUZXh0KG9ic2VydmVkTm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbW1lbnQgbm9kZSBhbmQgcHV0IGluIGZyb250IG9mIGl0IHRoZSBjb21tZW50IGFuZCBhIG5ld2xpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG5vZGVUZXh0LmZpbmRDaGlsZChvYnNlcnZlZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVRleHQuYWRkQ2hpbGQoaW5kZXgsIChDb21tZW50KSBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRUb2tlbihpbmRleCArIDEsIGVvbFRva2VuS2luZCgpLCBVdGlscy5FT0wpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQgPSAoSmF2YWRvY0NvbW1lbnQpIG9sZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VG9rZW5UZXh0RWxlbWVudD4gbWF0Y2hpbmdUb2tlbnMgPSBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLmZpbHRlcihlIC0+IGUuaXNUb2tlbihKQVZBRE9DX0NPTU1FTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKFRva2VuVGV4dEVsZW1lbnQpIGUpLmdldFRleHQoKS5lcXVhbHMoIi8qKiIgKyBqYXZhZG9jQ29tbWVudC5nZXRDb250ZW50KCkgKyAiKi8iKSkubWFwKGUgLT4gKFRva2VuVGV4dEVsZW1lbnQpIGUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nVG9rZW5zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbm9kZVRleHQuZmluZEVsZW1lbnQobWF0Y2hpbmdUb2tlbnMuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5yZW1vdmVFbGVtZW50KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgpLmlzTmV3bGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LnJlbW92ZUVsZW1lbnQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBKYXZhZG9jQ29tbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFkb2NDb21tZW50IG9sZEphdmFkb2NDb21tZW50ID0gKEphdmFkb2NDb21tZW50KSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFRva2VuVGV4dEVsZW1lbnQ+IG1hdGNoaW5nVG9rZW5zID0gbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5maWx0ZXIoZSAtPiBlLmlzVG9rZW4oSkFWQURPQ19DT01NRU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChUb2tlblRleHRFbGVtZW50KSBlKS5nZXRUZXh0KCkuZXF1YWxzKCIvKioiICsgb2xkSmF2YWRvY0NvbW1lbnQuZ2V0Q29udGVudCgpICsgIiovIikpLm1hcChlIC0+IChUb2tlblRleHRFbGVtZW50KSBlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1Rva2Vucy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFkb2NDb21tZW50IG5ld0phdmFkb2NDb21tZW50ID0gKEphdmFkb2NDb21tZW50KSBuZXdWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5yZXBsYWNlKG1hdGNoaW5nVG9rZW5zLmdldCgwKSwgbmV3IFRva2VuVGV4dEVsZW1lbnQoSkFWQURPQ19DT01NRU5ULCAiLyoqIiArIG5ld0phdmFkb2NDb21tZW50LmdldENvbnRlbnQoKSArICIqLyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBnZXRPckNyZWF0ZU5vZGVUZXh0KG9ic2VydmVkTm9kZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobm9kZVRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24ob2JzZXJ2ZWROb2RlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlUHJvcGVydHlDaGFuZ2Uobm9kZVRleHQsIG9ic2VydmVkTm9kZSwgcHJvcGVydHksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29uY3JldGVMaXN0Q2hhbmdlKE5vZGVMaXN0IGNoYW5nZWRMaXN0LCBMaXN0Q2hhbmdlVHlwZSB0eXBlLCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKSB7CisgICAgICAgICAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBnZXRPckNyZWF0ZU5vZGVUZXh0KGNoYW5nZWRMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBMaXN0Q2hhbmdlVHlwZS5SRU1PVkFMKSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVMaXN0UmVtb3ZhbERpZmZlcmVuY2UoZmluZE5vZGVMaXN0TmFtZShjaGFuZ2VkTGlzdCksIGNoYW5nZWRMaXN0LCBpbmRleCkuYXBwbHkobm9kZVRleHQsIGNoYW5nZWRMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTGlzdENoYW5nZVR5cGUuQURESVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZUxpc3RBZGRpdGlvbkRpZmZlcmVuY2UoZmluZE5vZGVMaXN0TmFtZShjaGFuZ2VkTGlzdCksIGNoYW5nZWRMaXN0LCBpbmRleCwgbm9kZUFkZGVkT3JSZW1vdmVkKS5hcHBseShub2RlVGV4dCwgY2hhbmdlZExpc3QuZ2V0UGFyZW50Tm9kZUZvckNoaWxkcmVuKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb25jcmV0ZUxpc3RSZXBsYWNlbWVudChOb2RlTGlzdCBjaGFuZ2VkTGlzdCwgaW50IGluZGV4LCBOb2RlIG9sZFZhbHVlLCBOb2RlIG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBnZXRPckNyZWF0ZU5vZGVUZXh0KGNoYW5nZWRMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlTGlzdFJlcGxhY2VtZW50RGlmZmVyZW5jZShmaW5kTm9kZUxpc3ROYW1lKGNoYW5nZWRMaXN0KSwgY2hhbmdlZExpc3QsIGluZGV4LCBuZXdWYWx1ZSkuYXBwbHkobm9kZVRleHQsIGNoYW5nZWRMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0b3JlSW5pdGlhbFRleHQoTm9kZSByb290KSB7CisgICAgICAgIE1hcDxOb2RlLCBMaXN0PEphdmFUb2tlbj4+IHRva2Vuc0J5Tm9kZSA9IG5ldyBJZGVudGl0eUhhc2hNYXA8PigpOworCisgICAgICAgIC8vIFdlIGdvIG92ZXIgdG9rZW5zIGFuZCBmaW5kIHRvIHdoaWNoIG5vZGVzIHRoZXkgYmVsb25nLiBOb3RlIHRoYXQgd2UgZG8gbm90IHRyYXZlcnNlIHRoZSB0b2tlbnMgYXMgdGhleSB3ZXJlCisgICAgICAgIC8vIG9uIGEgbGlzdCBidXQgYXMgdGhleSB3ZXJlIG9yZ2FuaXplZCBpbiBhIHRyZWUuIEF0IGVhY2ggdGltZSB3ZSBzZWxlY3Qgb25seSB0aGUgYnJhbmNoIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICAgIC8vIHJhbmdlIG9mIGludGVyZXN0IGFuZCBpZ25vcmUgYWxsIG90aGVyIGJyYW5jaGVzCisgICAgICAgIGZvciAoSmF2YVRva2VuIHRva2VuIDogcm9vdC5nZXRUb2tlblJhbmdlKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgIFJhbmdlIHRva2VuUmFuZ2UgPSB0b2tlbi5nZXRSYW5nZSgpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiB3aXRob3V0IHJhbmdlOiAiICsgdG9rZW4pKTsKKyAgICAgICAgICAgIE5vZGUgb3duZXIgPSBmaW5kTm9kZUZvclRva2VuKHJvb3QsIHRva2VuUmFuZ2UpOworICAgICAgICAgICAgaWYgKG93bmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4gd2l0aG91dCBub2RlIG93bmluZyBpdDogIiArIHRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdG9rZW5zQnlOb2RlLmNvbnRhaW5zS2V5KG93bmVyKSkgeworICAgICAgICAgICAgICAgIHRva2Vuc0J5Tm9kZS5wdXQob3duZXIsIG5ldyBMaW5rZWRMaXN0PD4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b2tlbnNCeU5vZGUuZ2V0KG93bmVyKS5hZGQodG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGUgdG9rZW5zIHdlIHVzZSB0aGVtIHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBOb2RlVGV4dCBmb3IgZWFjaCBub2RlCisgICAgICAgIG5ldyBUcmVlVmlzaXRvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVBoYW50b21Ob2RlTG9naWMuaXNQaGFudG9tTm9kZShub2RlKSkgeworICAgICAgICAgICAgICAgICAgICBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuc3RvcmVJbml0aWFsVGV4dEZvck9uZU5vZGUobm9kZSwgdG9rZW5zQnlOb2RlLmdldChub2RlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LnZpc2l0QnJlYWR0aEZpcnN0KHJvb3QpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZmluZE5vZGVGb3JUb2tlbihOb2RlIG5vZGUsIFJhbmdlIHRva2VuUmFuZ2UpIHsKKyAgICAgICAgaWYgKFBoYW50b21Ob2RlTG9naWMuaXNQaGFudG9tTm9kZShub2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUuZ2V0UmFuZ2UoKS5nZXQoKS5jb250YWlucyh0b2tlblJhbmdlKSkgeworICAgICAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogbm9kZS5nZXRDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgICAgICBOb2RlIGZvdW5kID0gZmluZE5vZGVGb3JUb2tlbihjaGlsZCwgdG9rZW5SYW5nZSk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0b3JlSW5pdGlhbFRleHRGb3JPbmVOb2RlKE5vZGUgbm9kZSwgTGlzdDxKYXZhVG9rZW4+IG5vZGVUb2tlbnMpIHsKKyAgICAgICAgaWYgKG5vZGVUb2tlbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbm9kZVRva2VucyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIExpc3Q8UGFpcjxSYW5nZSwgVGV4dEVsZW1lbnQ+PiBlbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogbm9kZS5nZXRDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghUGhhbnRvbU5vZGVMb2dpYy5pc1BoYW50b21Ob2RlKGNoaWxkKSkgeworICAgICAgICAgICAgICAgIGlmICghY2hpbGQuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmFuZ2Ugbm90IHByZXNlbnQgb24gbm9kZSAiICsgY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmV3IFBhaXI8PihjaGlsZC5nZXRSYW5nZSgpLmdldCgpLCBuZXcgQ2hpbGRUZXh0RWxlbWVudChjaGlsZCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKEphdmFUb2tlbiB0b2tlbiA6IG5vZGVUb2tlbnMpIHsKKyAgICAgICAgICAgIGVsZW1lbnRzLmFkZChuZXcgUGFpcjw+KHRva2VuLmdldFJhbmdlKCkuZ2V0KCksIG5ldyBUb2tlblRleHRFbGVtZW50KHRva2VuKSkpOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnRzLnNvcnQoY29tcGFyaW5nKGUgLT4gZS5hLmJlZ2luKSk7CisgICAgICAgIG5vZGUuc2V0RGF0YShOT0RFX1RFWFRfREFUQSwgbmV3IE5vZGVUZXh0KGVsZW1lbnRzLnN0cmVhbSgpLm1hcChwIC0+IHAuYikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gSXRlcmF0b3JzCisgICAgLy8KKworICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPFRva2VuVGV4dEVsZW1lbnQ+IHRva2Vuc1ByZWNlZWRpbmcoZmluYWwgTm9kZSBub2RlKSB7CisgICAgICAgIGlmICghbm9kZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dEVsZW1lbnRJdGVyYXRvcnNGYWN0b3J5LkVtcHR5SXRlcmF0b3I8PigpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIGlzIHRoZSBhd2Z1bGx5IHBhaW5mdWwgY2FzZSBvZiB0aGUgZmFrZSB0eXBlcyBpbnZvbHZlZCBpbiB2YXJpYWJsZSBkZWNsYXJhdG9ycyBhbmQKKyAgICAgICAgLy8gZmllbGRzIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRoYXQgYXJlLCBvZiBjb3Vyc2UsIGFuIGV4Y2VwdGlvbi4uLgorCisgICAgICAgIE5vZGVUZXh0IHBhcmVudE5vZGVUZXh0ID0gZ2V0T3JDcmVhdGVOb2RlVGV4dChub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSk7CisgICAgICAgIGludCBpbmRleCA9IHBhcmVudE5vZGVUZXh0LnRyeVRvRmluZENoaWxkKG5vZGUpOworICAgICAgICBpZiAoaW5kZXggPT0gTm9kZVRleHQuTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0b3IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zUHJlY2VlZGluZyhub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJJIGNvdWxkIG5vdCBmaW5kIGNoaWxkICclcycgaW4gcGFyZW50ICclcycuIHBhcmVudE5vZGVUZXh0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLCBwYXJlbnROb2RlVGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBUZXh0RWxlbWVudEl0ZXJhdG9yc0ZhY3RvcnkuQ2FzY2FkaW5nSXRlcmF0b3I8PigKKyAgICAgICAgICAgICAgICBUZXh0RWxlbWVudEl0ZXJhdG9yc0ZhY3RvcnkucGFydGlhbFJldmVyc2VJdGVyYXRvcihwYXJlbnROb2RlVGV4dCwgaW5kZXggLSAxKSwKKyAgICAgICAgICAgICAgICAoKSAtPiB0b2tlbnNQcmVjZWVkaW5nKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBQcmludGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFByaW50IGEgTm9kZSBpbnRvIGEgU3RyaW5nLCBwcmVzZXJ2aW5nIHRoZSBsZXhpY2FsIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50KE5vZGUgbm9kZSkgeworICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJpbnQobm9kZSwgd3JpdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gb24gYSBTdHJpbmdXcml0ZXIiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBOb2RlIGludG8gYSBXcml0ZXIsIHByZXNlcnZpbmcgdGhlIGxleGljYWwgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE5vZGUgbm9kZSwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFub2RlLmNvbnRhaW5zRGF0YShOT0RFX1RFWFRfREFUQSkpIHsKKyAgICAgICAgICAgIGdldE9yQ3JlYXRlTm9kZVRleHQobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTm9kZVRleHQgdGV4dCA9IG5vZGUuZ2V0RGF0YShOT0RFX1RFWFRfREFUQSk7CisgICAgICAgIHdyaXRlci5hcHBlbmQodGV4dC5leHBhbmQoKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNZXRob2RzIHRvIGhhbmRsZSB0cmFuc2Zvcm1hdGlvbnMKKyAgICAvLworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmV0dHlQcmludGluZ1RleHROb2RlKE5vZGUgbm9kZSwgTm9kZVRleHQgbm9kZVRleHQpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQcmltaXRpdmVUeXBlKSB7CisgICAgICAgICAgICBQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUgPSAoUHJpbWl0aXZlVHlwZSkgbm9kZTsKKyAgICAgICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVHlwZS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZFRva2VuKEJPT0xFQU4sIG5vZGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgICAgICAgICAgICAgbm9kZVRleHQuYWRkVG9rZW4oQ0hBUiwgbm9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRUb2tlbihCWVRFLCBub2RlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRUb2tlbihTSE9SVCwgbm9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZFRva2VuKElOVCwgbm9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMT05HOgorICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRUb2tlbihMT05HLCBub2RlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRUb2tlbihGTE9BVCwgbm9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZFRva2VuKERPVUJMRSwgbm9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSmF2YWRvY0NvbW1lbnQpIHsKKyAgICAgICAgICAgIG5vZGVUZXh0LmFkZFRva2VuKEpBVkFET0NfQ09NTUVOVCwgIi8qKiIgKyAoKEphdmFkb2NDb21tZW50KSBub2RlKS5nZXRDb250ZW50KCkgKyAiKi8iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludGVycHJldChub2RlLCBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKG5vZGUuZ2V0Q2xhc3MoKSksIG5vZGVUZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlVGV4dCBpbnRlcnByZXQoTm9kZSBub2RlLCBDc21FbGVtZW50IGNzbSwgTm9kZVRleHQgbm9kZVRleHQpIHsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjYWxjdWxhdGVkU3ludGF4TW9kZWwgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShjc20sIG5vZGUpOworCisgICAgICAgIExpc3Q8VG9rZW5UZXh0RWxlbWVudD4gaW5kZW50YXRpb24gPSBmaW5kSW5kZW50YXRpb24obm9kZSk7CisKKyAgICAgICAgYm9vbGVhbiBwZW5kaW5nSW5kZW50YXRpb24gPSBmYWxzZTsKKyAgICAgICAgZm9yIChDc21FbGVtZW50IGVsZW1lbnQgOiBjYWxjdWxhdGVkU3ludGF4TW9kZWwuZWxlbWVudHMpIHsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nSW5kZW50YXRpb24gJiYgIShlbGVtZW50IGluc3RhbmNlb2YgQ3NtVG9rZW4gJiYgKChDc21Ub2tlbikgZWxlbWVudCkuaXNOZXdMaW5lKCkpKSB7CisgICAgICAgICAgICAgICAgaW5kZW50YXRpb24uZm9yRWFjaChub2RlVGV4dDo6YWRkRWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nSW5kZW50YXRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKSB7CisgICAgICAgICAgICAgICAgbm9kZVRleHQuYWRkQ2hpbGQoKChMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQpIGVsZW1lbnQpLmdldENoaWxkKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3NtVG9rZW4pIHsKKyAgICAgICAgICAgICAgICBDc21Ub2tlbiBjc21Ub2tlbiA9IChDc21Ub2tlbikgZWxlbWVudDsKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRUb2tlbihjc21Ub2tlbi5nZXRUb2tlblR5cGUoKSwgY3NtVG9rZW4uZ2V0Q29udGVudChub2RlKSk7CisgICAgICAgICAgICAgICAgaWYgKGNzbVRva2VuLmlzTmV3TGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbmRlbnRhdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3NtTWl4KSB7CisgICAgICAgICAgICAgICAgQ3NtTWl4IGNzbU1peCA9IChDc21NaXgpIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgY3NtTWl4LmdldEVsZW1lbnRzKCkuZm9yRWFjaChlIC0+IGludGVycHJldChub2RlLCBlLCBub2RlVGV4dCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZWxlbWVudC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQXJyYXkgYnJhY2tldHMgYXJlIGEgcGFpbi4uLiB3ZSBkbyBub3QgaGF2ZSBhIHdheSB0byByZXByZXNlbnQgdGhlbSBleHBsaWNpdGx5IGluIHRoZSBBU1QKKyAgICAgICAgLy8gc28gdGhleSBoYXZlIHRvIGJlIGhhbmRsZWQgaW4gYSBzcGVjaWFsIHdheQorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRvcikgeworICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlRGVjbGFyYXRvciA9IChWYXJpYWJsZURlY2xhcmF0b3IpIG5vZGU7CisgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0UGFyZW50Tm9kZSgpLmlmUHJlc2VudChwYXJlbnQgLT4KKyAgICAgICAgICAgICAgICAgICAgKChOb2RlV2l0aFZhcmlhYmxlczw/PikgcGFyZW50KS5nZXRNYXhpbXVtQ29tbW9uVHlwZSgpLmlmUHJlc2VudChtY3QgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhQXJyYXlMZXZlbHMgPSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpLmdldEFycmF5TGV2ZWwoKSAtIG1jdC5nZXRBcnJheUxldmVsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhQXJyYXlMZXZlbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUZXh0LmFkZEVsZW1lbnQobmV3IFRva2VuVGV4dEVsZW1lbnQoTEJSQUNLRVQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5hZGRFbGVtZW50KG5ldyBUb2tlblRleHRFbGVtZW50KFJCUkFDS0VUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlVGV4dDsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgc3RhdGljIE5vZGVUZXh0IGdldE9yQ3JlYXRlTm9kZVRleHQoTm9kZSBub2RlKSB7CisgICAgICAgIGlmICghbm9kZS5jb250YWluc0RhdGEoTk9ERV9URVhUX0RBVEEpKSB7CisgICAgICAgICAgICBOb2RlVGV4dCBub2RlVGV4dCA9IG5ldyBOb2RlVGV4dCgpOworICAgICAgICAgICAgbm9kZS5zZXREYXRhKE5PREVfVEVYVF9EQVRBLCBub2RlVGV4dCk7CisgICAgICAgICAgICBwcmV0dHlQcmludGluZ1RleHROb2RlKG5vZGUsIG5vZGVUZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZS5nZXREYXRhKE5PREVfVEVYVF9EQVRBKTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgc3RhdGljIExpc3Q8VG9rZW5UZXh0RWxlbWVudD4gZmluZEluZGVudGF0aW9uKE5vZGUgbm9kZSkgeworICAgICAgICBMaXN0PFRva2VuVGV4dEVsZW1lbnQ+IGZvbGxvd2luZ05ld2xpbmVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBJdGVyYXRvcjxUb2tlblRleHRFbGVtZW50PiBpdCA9IHRva2Vuc1ByZWNlZWRpbmcobm9kZSk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRva2VuVGV4dEVsZW1lbnQgdHRlID0gaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKHR0ZS5nZXRUb2tlbktpbmQoKSA9PSBTSU5HTEVfTElORV9DT01NRU5UCisgICAgICAgICAgICAgICAgICAgIHx8IHR0ZS5pc05ld2xpbmUoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb2xsb3dpbmdOZXdsaW5lcy5hZGQodHRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGZvbGxvd2luZ05ld2xpbmVzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xsb3dpbmdOZXdsaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCFmb2xsb3dpbmdOZXdsaW5lcy5nZXQoaSkuaXNTcGFjZU9yVGFiKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZm9sbG93aW5nTmV3bGluZXMuc3ViTGlzdCgwLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9sbG93aW5nTmV3bGluZXM7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBIZWxwZXIgbWV0aG9kcworICAgIC8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmV0dXJuaW5nT3B0aW9uYWxOb2RlTGlzdChNZXRob2QgbSkgeworICAgICAgICBpZiAoIW0uZ2V0UmV0dXJuVHlwZSgpLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMoT3B0aW9uYWwuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghKG0uZ2V0R2VuZXJpY1JldHVyblR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBtLmdldEdlbmVyaWNSZXR1cm5UeXBlKCk7CisgICAgICAgIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgb3B0aW9uYWxBcmd1bWVudCA9IHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKyAgICAgICAgcmV0dXJuIChvcHRpb25hbEFyZ3VtZW50LmdldFR5cGVOYW1lKCkuc3RhcnRzV2l0aChOb2RlTGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYnNlcnZhYmxlUHJvcGVydHkgZmluZE5vZGVMaXN0TmFtZShOb2RlTGlzdCBub2RlTGlzdCkgeworICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGVMaXN0LmdldFBhcmVudE5vZGVGb3JDaGlsZHJlbigpOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogcGFyZW50LmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICBpZiAobS5nZXRQYXJhbWV0ZXJDb3VudCgpID09IDAgJiYgbS5nZXRSZXR1cm5UeXBlKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhOb2RlTGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJhdyA9IG0uaW52b2tlKHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHJhdyBpbnN0YW5jZW9mIE5vZGVMaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgTm9kZUxpc3QsIGZvdW5kICIgKyByYXcuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IHJlc3VsdCA9IChOb2RlTGlzdCkgcmF3OworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG5vZGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoImdldCIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGVQcm9wZXJ0eS5mcm9tQ2FtZWxDYXNlTmFtZShkZWNhcGl0YWxpemUobmFtZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG0uZ2V0UGFyYW1ldGVyQ291bnQoKSA9PSAwICYmIGlzUmV0dXJuaW5nT3B0aW9uYWxOb2RlTGlzdChtKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPE5vZGVMaXN0PD8+PiByYXcgPSAoT3B0aW9uYWw8Tm9kZUxpc3Q8Pz4+KSBtLmludm9rZShwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmF3LmlzUHJlc2VudCgpICYmIHJhdy5nZXQoKSA9PSBub2RlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKCJnZXQiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYnNlcnZhYmxlUHJvcGVydHkuZnJvbUNhbWVsQ2FzZU5hbWUoZGVjYXBpdGFsaXplKG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGxpc3QgbmFtZSBvZiBOb2RlTGlzdCBvZiBzaXplICIgKyBub2RlTGlzdC5zaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTm9kZVRleHQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTm9kZVRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUyNjRlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9Ob2RlVGV4dC5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjb250YWlucyB0aGUgbGV4aWNhbCBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgbm9kZS4KKyAqIEl0IGlzIGJhc2ljYWxseSBhIGxpc3Qgb2YgdG9rZW5zIGFuZCBjaGlsZHJlbi4KKyAqLworY2xhc3MgTm9kZVRleHQgeworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXh0RWxlbWVudD4gZWxlbWVudHM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfRk9VTkQgPSAtMTsKKworICAgIGVudW0gT3B0aW9uIHsKKyAgICAgICAgUkVNT1ZFX1NQQUNFX0lNTUVESUFURUxZX0FGVEVSLAorICAgICAgICBFWENMVURFX1NUQVJULAorICAgICAgICBFWENMVURFX0VORAorICAgIH0KKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIE5vZGVUZXh0KExpc3Q8VGV4dEVsZW1lbnQ+IGVsZW1lbnRzKSB7CisgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHdpdGggYW4gZW1wdHkgbGlzdCBvZiBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBOb2RlVGV4dCgpIHsKKyAgICAgICAgdGhpcyhuZXcgTGlua2VkTGlzdDw+KCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQWRkaW5nIGVsZW1lbnRzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbGVtZW50IGF0IHRoZSBlbmQuCisgICAgICovCisgICAgdm9pZCBhZGRFbGVtZW50KFRleHRFbGVtZW50IG5vZGVUZXh0RWxlbWVudCkgeworICAgICAgICB0aGlzLmVsZW1lbnRzLmFkZChub2RlVGV4dEVsZW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEVsZW1lbnQoaW50IGluZGV4LCBUZXh0RWxlbWVudCBub2RlVGV4dEVsZW1lbnQpIHsKKyAgICAgICAgdGhpcy5lbGVtZW50cy5hZGQoaW5kZXgsIG5vZGVUZXh0RWxlbWVudCk7CisgICAgfQorCisgICAgdm9pZCBhZGRDaGlsZChOb2RlIGNoaWxkKSB7CisgICAgICAgIGFkZEVsZW1lbnQobmV3IENoaWxkVGV4dEVsZW1lbnQoY2hpbGQpKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZENoaWxkKGludCBpbmRleCwgTm9kZSBjaGlsZCkgeworICAgICAgICBhZGRFbGVtZW50KGluZGV4LCBuZXcgQ2hpbGRUZXh0RWxlbWVudChjaGlsZCkpOworICAgIH0KKworICAgIHZvaWQgYWRkVG9rZW4oaW50IHRva2VuS2luZCwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgZWxlbWVudHMuYWRkKG5ldyBUb2tlblRleHRFbGVtZW50KHRva2VuS2luZCwgdGV4dCkpOworICAgIH0KKworICAgIHZvaWQgYWRkVG9rZW4oaW50IGluZGV4LCBpbnQgdG9rZW5LaW5kLCBTdHJpbmcgdGV4dCkgeworICAgICAgICBlbGVtZW50cy5hZGQoaW5kZXgsIG5ldyBUb2tlblRleHRFbGVtZW50KHRva2VuS2luZCwgdGV4dCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZGluZyBlbGVtZW50cworICAgIC8vCisKKyAgICBpbnQgZmluZEVsZW1lbnQoVGV4dEVsZW1lbnRNYXRjaGVyIG1hdGNoZXIpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRFbGVtZW50KG1hdGNoZXIsIDApOworICAgIH0KKworICAgIGludCBmaW5kRWxlbWVudChUZXh0RWxlbWVudE1hdGNoZXIgbWF0Y2hlciwgaW50IGZyb20pIHsKKyAgICAgICAgaW50IHJlcyA9IHRyeVRvRmluZEVsZW1lbnQobWF0Y2hlciwgZnJvbSk7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJJIGNvdWxkIG5vdCBmaW5kIGNoaWxkICclcycgZnJvbSBwb3NpdGlvbiAlZC4gRWxlbWVudHM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyLCBmcm9tLCBlbGVtZW50cykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCB0cnlUb0ZpbmRFbGVtZW50KFRleHRFbGVtZW50TWF0Y2hlciBtYXRjaGVyLCBpbnQgZnJvbSkgeworICAgICAgICBmb3IgKGludCBpPWZyb207IGk8ZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFRleHRFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaChlbGVtZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBOT1RfRk9VTkQ7CisgICAgfQorCisgICAgaW50IGZpbmRDaGlsZChOb2RlIGNoaWxkKSB7CisgICAgICAgIHJldHVybiBmaW5kQ2hpbGQoY2hpbGQsIDApOworICAgIH0KKworICAgIGludCBmaW5kQ2hpbGQoTm9kZSBjaGlsZCwgaW50IGZyb20pIHsKKyAgICAgICAgcmV0dXJuIGZpbmRFbGVtZW50KFRleHRFbGVtZW50TWF0Y2hlcnMuYnlOb2RlKGNoaWxkKSwgZnJvbSk7CisgICAgfQorCisgICAgaW50IHRyeVRvRmluZENoaWxkKE5vZGUgY2hpbGQpIHsKKyAgICAgICAgcmV0dXJuIHRyeVRvRmluZENoaWxkKGNoaWxkLCAwKTsKKyAgICB9CisKKyAgICBpbnQgdHJ5VG9GaW5kQ2hpbGQoTm9kZSBjaGlsZCwgaW50IGZyb20pIHsKKyAgICAgICAgcmV0dXJuIHRyeVRvRmluZEVsZW1lbnQoVGV4dEVsZW1lbnRNYXRjaGVycy5ieU5vZGUoY2hpbGQpLCBmcm9tKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJlbW92aW5nIHNpbmdsZSBlbGVtZW50cworICAgIC8vCisKKyAgICB2b2lkIHJlbW92ZShUZXh0RWxlbWVudE1hdGNoZXIgbWF0Y2hlcikgeworICAgICAgICBlbGVtZW50cy5yZW1vdmVJZihtYXRjaGVyOjptYXRjaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFRleHRFbGVtZW50TWF0Y2hlciBtYXRjaGVyLCBib29sZWFuIHBvdGVudGlhbGx5Rm9sbG93aW5nV2hpdGVzcGFjZSkgeworICAgICAgICBpbnQgaT0wOworICAgICAgICBmb3IgKFRleHRFbGVtZW50IGUgOiBlbGVtZW50cykgeworICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2goZSkpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50cy5yZW1vdmUoZSk7CisgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbGx5Rm9sbG93aW5nV2hpdGVzcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGVsZW1lbnRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmdldChpKS5pc1doaXRlU3BhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZW1vdmluZyBzZXF1ZW5jZXMKKyAgICAvLworCisgICAgdm9pZCByZW1vdmVFbGVtZW50KGludCBpbmRleCkgeworICAgICAgICBlbGVtZW50cy5yZW1vdmUoaW5kZXgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gUmVwbGFjaW5nIGVsZW1lbnRzCisgICAgLy8KKworICAgIHZvaWQgcmVwbGFjZShUZXh0RWxlbWVudE1hdGNoZXIgcG9zaXRpb24sIFRleHRFbGVtZW50IG5ld0VsZW1lbnQpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZmluZEVsZW1lbnQocG9zaXRpb24sIDApOworICAgICAgICBlbGVtZW50cy5yZW1vdmUoaW5kZXgpOworICAgICAgICBlbGVtZW50cy5hZGQoaW5kZXgsIG5ld0VsZW1lbnQpOworICAgIH0KKworICAgIC8vCisgICAgLy8gT3RoZXIgbWV0aG9kcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuCisgICAgICovCisgICAgU3RyaW5nIGV4cGFuZCgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZSAtPiBzYi5hcHBlbmQoZS5leHBhbmQoKSkpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgaW50IG51bWJlck9mRWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50cy5zaXplKCk7CisgICAgfQorCisgICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZworICAgIFRleHRFbGVtZW50IGdldFRleHRFbGVtZW50KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nCisgICAgTGlzdDxUZXh0RWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk5vZGVUZXh0eyIgKyBlbGVtZW50cyArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1BoYW50b21Ob2RlTG9naWMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vUGhhbnRvbU5vZGVMb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2Y3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1BoYW50b21Ob2RlTG9naWMuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuQXN0T2JzZXJ2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5Bc3RPYnNlcnZlckFkYXB0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVua25vd25UeXBlOworCitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXA7CisKKy8qKgorICogV2Ugd2FudCB0byByZWNvZ25pemUgYW5kIGlnbm9yZSAicGhhbnRvbSIgbm9kZXMsIGxpa2UgdGhlIGZha2UgdHlwZSBvZiB2YXJpYWJsZSBpbiBGaWVsZERlY2xhcmF0aW9uCisgKi8KK2NsYXNzIFBoYW50b21Ob2RlTG9naWMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFVkVMU19UT19FWFBMT1JFID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxOb2RlLCBCb29sZWFuPiBpc1BoYW50b21Ob2RlQ2FjaGUgPSBzeW5jaHJvbml6ZWRNYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXN0T2JzZXJ2ZXIgY2FjaGVDbGVhbmVyID0gbmV3IEFzdE9ic2VydmVyQWRhcHRlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcmVudENoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgTm9kZSBwcmV2aW91c1BhcmVudCwgTm9kZSBuZXdQYXJlbnQpIHsKKyAgICAgICAgICAgIGlzUGhhbnRvbU5vZGVDYWNoZS5yZW1vdmUob2JzZXJ2ZWROb2RlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc1BoYW50b21Ob2RlKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAoaXNQaGFudG9tTm9kZUNhY2hlLmNvbnRhaW5zS2V5KG5vZGUpKSB7CisgICAgICAgICAgICByZXR1cm4gaXNQaGFudG9tTm9kZUNhY2hlLmdldChub2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVW5rbm93blR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcmVzID0gKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpICYmCisgICAgICAgICAgICAgICAgICAgICFub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKS5nZXRSYW5nZSgpLmdldCgpLmNvbnRhaW5zKG5vZGUuZ2V0UmFuZ2UoKS5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgaW5QaGFudG9tTm9kZShub2RlLCBMRVZFTFNfVE9fRVhQTE9SRSkpOworICAgICAgICAgICAgaXNQaGFudG9tTm9kZUNhY2hlLnB1dChub2RlLCByZXMpOworICAgICAgICAgICAgbm9kZS5yZWdpc3RlcihjYWNoZUNsZWFuZXIpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbm9kZSBjb250YWluZWQgaW4gYSBwaGFudG9tIG5vZGUgaXMgYWxzbyBhIHBoYW50b20gbm9kZS4gV2UgbGltaXQgaG93IG1hbnkgbGV2ZWxzIHVwIHdlIGNoZWNrIGp1c3QgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpblBoYW50b21Ob2RlKE5vZGUgbm9kZSwgaW50IGxldmVscykgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkgJiYKKyAgICAgICAgICAgICAgICAoaXNQaGFudG9tTm9kZShub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGluUGhhbnRvbU5vZGUobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCksIGxldmVscyAtIDEpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1RleHRFbGVtZW50LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1RleHRFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3YjhmMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVGV4dEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGV4dEVsZW1lbnQgaW1wbGVtZW50cyBUZXh0RWxlbWVudE1hdGNoZXIgeworCisgICAgYWJzdHJhY3QgU3RyaW5nIGV4cGFuZCgpOworCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpc1Rva2VuKGludCB0b2tlbktpbmQpOworCisgICAgZmluYWwgYm9vbGVhbiBpc0NvbW1lbnRUb2tlbigpIHsKKyAgICAgICAgcmV0dXJuIGlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5KQVZBRE9DX0NPTU1FTlQpCisgICAgICAgICAgICAgICAgfHwgaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNJTkdMRV9MSU5FX0NPTU1FTlQpCisgICAgICAgICAgICAgICAgfHwgaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLk1VTFRJX0xJTkVfQ09NTUVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goVGV4dEVsZW1lbnQgdGV4dEVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKHRleHRFbGVtZW50KTsKKyAgICB9CisKKyAgICBhYnN0cmFjdCBib29sZWFuIGlzTm9kZShOb2RlIG5vZGUpOworCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NwYWNlT3JUYWIoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTmV3bGluZSgpOworCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21tZW50KCk7CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1doaXRlU3BhY2VPckNvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBpc1doaXRlU3BhY2UoKSB8fCBpc0NvbW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIFRleHRFbGVtZW50IHJlcHJlc2VudGluZyBhIGNoaWxkIG9mIHRoZSBnaXZlbiBjbGFzcz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NoaWxkT2ZDbGFzcyhDbGFzczw/IGV4dGVuZHMgTm9kZT4gbm9kZUNsYXNzKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVGV4dEVsZW1lbnRJdGVyYXRvcnNGYWN0b3J5LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1RleHRFbGVtZW50SXRlcmF0b3JzRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTI5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1RleHRFbGVtZW50SXRlcmF0b3JzRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBUZXh0RWxlbWVudEl0ZXJhdG9yc0ZhY3RvcnkgeworCisgICAgc3RhdGljIGNsYXNzIENhc2NhZGluZ0l0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4geworICAgICAgICBpbnRlcmZhY2UgUHJvdmlkZXI8RT4geworICAgICAgICAgICAgSXRlcmF0b3I8RT4gcHJvdmlkZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxFPiBuZXh0UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8RT4gY3VycmVudDsKKyAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxFPiBuZXh0OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGFzdFJldHVybmVkRnJvbUN1cnJlbnQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxhc3RSZXR1cm5lZEZyb21OZXh0ID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIENhc2NhZGluZ0l0ZXJhdG9yKEl0ZXJhdG9yPEU+IGN1cnJlbnQsIFByb3ZpZGVyPEU+IG5leHRQcm92aWRlcikgeworICAgICAgICAgICAgdGhpcy5uZXh0UHJvdmlkZXIgPSBuZXh0UHJvdmlkZXI7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBjdXJyZW50OworICAgICAgICB9CisKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0UHJvdmlkZXIucHJvdmlkZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFzTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIG5leHQoKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBsYXN0UmV0dXJuZWRGcm9tQ3VycmVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgbGFzdFJldHVybmVkRnJvbU5leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudC5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IG5leHRQcm92aWRlci5wcm92aWRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0UmV0dXJuZWRGcm9tQ3VycmVudCA9IGZhbHNlOworICAgICAgICAgICAgbGFzdFJldHVybmVkRnJvbU5leHQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG5leHQubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRGcm9tQ3VycmVudCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3RSZXR1cm5lZEZyb21OZXh0KSB7CisgICAgICAgICAgICAgICAgbmV4dC5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRW1wdHlJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEUgbmV4dCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXR1cm5lZDsKKworICAgICAgICBTaW5nbGVFbGVtZW50SXRlcmF0b3IoRSBlbGVtZW50KSB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gIXJldHVybmVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDb21wb3NlZEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4geworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SXRlcmF0b3I8RT4+IGVsZW1lbnRzOworICAgICAgICBwcml2YXRlIGludCBjdXJySW5kZXg7CisKKyAgICAgICAgQ29tcG9zZWRJdGVyYXRvcihMaXN0PEl0ZXJhdG9yPEU+PiBlbGVtZW50cykgeworICAgICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOworICAgICAgICAgICAgY3VyckluZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgaWYgKGN1cnJJbmRleCA+PSBlbGVtZW50cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZWxlbWVudHMuZ2V0KGN1cnJJbmRleCkuaGFzTmV4dCgpKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJJbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIGhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRSBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudHMuZ2V0KGN1cnJJbmRleCkubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGVsZW1lbnRzLmdldChjdXJySW5kZXgpLnJlbW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8VG9rZW5UZXh0RWxlbWVudD4gcmV2ZXJzZUl0ZXJhdG9yKE5vZGVUZXh0IG5vZGVUZXh0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgVGV4dEVsZW1lbnQgdGV4dEVsZW1lbnQgPSBub2RlVGV4dC5nZXRUZXh0RWxlbWVudChpbmRleCk7CisgICAgICAgIGlmICh0ZXh0RWxlbWVudCBpbnN0YW5jZW9mIFRva2VuVGV4dEVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFRva2VuVGV4dEVsZW1lbnQ+KChUb2tlblRleHRFbGVtZW50KXRleHRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICBub2RlVGV4dC5yZW1vdmVFbGVtZW50KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgaWYgKHRleHRFbGVtZW50IGluc3RhbmNlb2YgQ2hpbGRUZXh0RWxlbWVudCkgeworICAgICAgICAgICAgQ2hpbGRUZXh0RWxlbWVudCBjaGlsZFRleHRFbGVtZW50ID0gKENoaWxkVGV4dEVsZW1lbnQpdGV4dEVsZW1lbnQ7CisgICAgICAgICAgICBOb2RlVGV4dCB0ZXh0Rm9yQ2hpbGQgPSBjaGlsZFRleHRFbGVtZW50LmdldE5vZGVUZXh0Rm9yV3JhcHBlZE5vZGUoKTsKKyAgICAgICAgICAgIHJldHVybiByZXZlcnNlSXRlcmF0b3IodGV4dEZvckNoaWxkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8VG9rZW5UZXh0RWxlbWVudD4gcmV2ZXJzZUl0ZXJhdG9yKE5vZGVUZXh0IG5vZGVUZXh0KSB7CisgICAgICAgIHJldHVybiBwYXJ0aWFsUmV2ZXJzZUl0ZXJhdG9yKG5vZGVUZXh0LCBub2RlVGV4dC5udW1iZXJPZkVsZW1lbnRzKCkgLSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFRva2VuVGV4dEVsZW1lbnQ+IHBhcnRpYWxSZXZlcnNlSXRlcmF0b3IoTm9kZVRleHQgbm9kZVRleHQsIGludCBmcm9tSW5kZXgpIHsKKyAgICAgICAgTGlzdDxJdGVyYXRvcjxUb2tlblRleHRFbGVtZW50Pj4gZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGk9ZnJvbUluZGV4O2k+PTA7aS0tKSB7CisgICAgICAgICAgICBlbGVtZW50cy5hZGQocmV2ZXJzZUl0ZXJhdG9yKG5vZGVUZXh0LCBpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NlZEl0ZXJhdG9yPD4oZWxlbWVudHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9UZXh0RWxlbWVudE1hdGNoZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVGV4dEVsZW1lbnRNYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyMjAwOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVGV4dEVsZW1lbnRNYXRjaGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbjsKKworcHVibGljIGludGVyZmFjZSBUZXh0RWxlbWVudE1hdGNoZXIgeworCisgICAgYm9vbGVhbiBtYXRjaChUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCk7CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVGV4dEVsZW1lbnRNYXRjaGVycy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9UZXh0RWxlbWVudE1hdGNoZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlOTViNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVGV4dEVsZW1lbnRNYXRjaGVycy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK2NsYXNzIFRleHRFbGVtZW50TWF0Y2hlcnMgeworCisgICAgc3RhdGljIFRleHRFbGVtZW50TWF0Y2hlciBieVRva2VuVHlwZShpbnQgdG9rZW5UeXBlKSB7CisgICAgICAgIHJldHVybiB0ZXh0RWxlbWVudCAtPiB0ZXh0RWxlbWVudC5pc1Rva2VuKHRva2VuVHlwZSk7CisgICAgfQorCisgICAgc3RhdGljIFRleHRFbGVtZW50TWF0Y2hlciBieU5vZGUoZmluYWwgTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBuZXcgVGV4dEVsZW1lbnRNYXRjaGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChUZXh0RWxlbWVudCB0ZXh0RWxlbWVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0RWxlbWVudC5pc05vZGUobm9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm1hdGNoIG5vZGUgIiArIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9Ub2tlblRleHRFbGVtZW50LmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL1Rva2VuVGV4dEVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdiMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9Ub2tlblRleHRFbGVtZW50LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVRva2VuOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblR5cGVzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworY2xhc3MgVG9rZW5UZXh0RWxlbWVudCBleHRlbmRzIFRleHRFbGVtZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIEphdmFUb2tlbiB0b2tlbjsKKworICAgIFRva2VuVGV4dEVsZW1lbnQoSmF2YVRva2VuIHRva2VuKSB7CisgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKKyAgICB9CisKKyAgICBUb2tlblRleHRFbGVtZW50KGludCB0b2tlbktpbmQsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHRoaXMobmV3IEphdmFUb2tlbih0b2tlbktpbmQsIHRleHQpKTsKKyAgICB9CisKKyAgICBUb2tlblRleHRFbGVtZW50KGludCB0b2tlbktpbmQpIHsKKyAgICAgICAgdGhpcyhuZXcgSmF2YVRva2VuKHRva2VuS2luZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIFN0cmluZyBleHBhbmQoKSB7CisgICAgICAgIHJldHVybiB0b2tlbi5nZXRUZXh0KCk7CisgICAgfQorCisgICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZworICAgIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VG9rZW5LaW5kKCkgeworICAgICAgICByZXR1cm4gdG9rZW4uZ2V0S2luZCgpOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhVG9rZW4gZ2V0VG9rZW4oKSB7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBUb2tlblRleHRFbGVtZW50IHRoYXQgPSAoVG9rZW5UZXh0RWxlbWVudCkgbzsKKworICAgICAgICByZXR1cm4gdG9rZW4uZXF1YWxzKHRoYXQudG9rZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB0b2tlbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0b2tlbi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gaXNUb2tlbihpbnQgdG9rZW5LaW5kKSB7CisgICAgICAgIHJldHVybiB0b2tlbi5nZXRLaW5kKCkgPT0gdG9rZW5LaW5kOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gaXNOb2RlKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgeworICAgICAgICByZXR1cm4gdG9rZW4uZ2V0Q2F0ZWdvcnkoKS5pc1doaXRlc3BhY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlT3JUYWIoKSB7CisgICAgICAgIHJldHVybiB0b2tlbi5nZXRDYXRlZ29yeSgpLmlzV2hpdGVzcGFjZUJ1dE5vdEVuZE9mTGluZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuLmdldENhdGVnb3J5KCkuaXNDb21tZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXdsaW5lKCkgeworICAgICAgICByZXR1cm4gdG9rZW4uZ2V0Q2F0ZWdvcnkoKS5pc0VuZE9mTGluZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRPZkNsYXNzKENsYXNzPD8gZXh0ZW5kcyBOb2RlPiBub2RlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9DaGFuZ2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9DaGFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZlMDlkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9jaGFuZ2VzL0NoYW5nZS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi5jaGFuZ2VzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWwuQ3NtQ29uZGl0aW9uYWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzOworCisvKioKKyAqIFRoaXMgcmVwcmVzZW50IGEgY2hhbmdlIGhhcHBlbmVkIHRvIGEgc3BlY2lmaWMgTm9kZS4KKyAqLworcHVibGljIGludGVyZmFjZSBDaGFuZ2UgeworCisgICAgZGVmYXVsdCBib29sZWFuIGV2YWx1YXRlKENzbUNvbmRpdGlvbmFsIGNzbUNvbmRpdGlvbmFsLCBOb2RlIG5vZGUpIHsKKyAgICAgICAgc3dpdGNoIChjc21Db25kaXRpb25hbC5nZXRDb25kaXRpb24oKSkgeworICAgICAgICAgICAgY2FzZSBGTEFHOgorICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgZ2V0VmFsdWUoY3NtQ29uZGl0aW9uYWwuZ2V0UHJvcGVydHkoKSwgbm9kZSk7CisgICAgICAgICAgICBjYXNlIElTX05PVF9FTVBUWToKKyAgICAgICAgICAgICAgICByZXR1cm4gIVV0aWxzLnZhbHVlSXNOdWxsT3JFbXB0eShnZXRWYWx1ZShjc21Db25kaXRpb25hbC5nZXRQcm9wZXJ0eSgpLCBub2RlKSk7CisgICAgICAgICAgICBjYXNlIElTX0VNUFRZOgorICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy52YWx1ZUlzTnVsbE9yRW1wdHkoZ2V0VmFsdWUoY3NtQ29uZGl0aW9uYWwuZ2V0UHJvcGVydHkoKSwgbm9kZSkpOworICAgICAgICAgICAgY2FzZSBJU19QUkVTRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAhVXRpbHMudmFsdWVJc051bGxPckVtcHR5KGdldFZhbHVlKGNzbUNvbmRpdGlvbmFsLmdldFByb3BlcnR5KCksIG5vZGUpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCIiICsgY3NtQ29uZGl0aW9uYWwuZ2V0UHJvcGVydHkoKSArICIgIiArIGNzbUNvbmRpdGlvbmFsLmdldENvbmRpdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9iamVjdCBnZXRWYWx1ZShPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE5vZGUgbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvTGlzdEFkZGl0aW9uQ2hhbmdlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvTGlzdEFkZGl0aW9uQ2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxNWNjNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9MaXN0QWRkaXRpb25DaGFuZ2UuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uY2hhbmdlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworCisvKioKKyAqIFRoZSBBZGRpdGlvbiBvZiBhbiBlbGVtZW50IHRvIGEgbGlzdC4KKyAqLworcHVibGljIGNsYXNzIExpc3RBZGRpdGlvbkNoYW5nZSBpbXBsZW1lbnRzIENoYW5nZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBPYnNlcnZhYmxlUHJvcGVydHkgb2JzZXJ2YWJsZVByb3BlcnR5OworICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OworICAgIHByaXZhdGUgZmluYWwgTm9kZSBub2RlQWRkZWQ7CisKKyAgICBwdWJsaWMgTGlzdEFkZGl0aW9uQ2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eSBvYnNlcnZhYmxlUHJvcGVydHksIGludCBpbmRleCwgTm9kZSBub2RlQWRkZWQpIHsKKyAgICAgICAgdGhpcy5vYnNlcnZhYmxlUHJvcGVydHkgPSBvYnNlcnZhYmxlUHJvcGVydHk7CisgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgICAgdGhpcy5ub2RlQWRkZWQgPSBub2RlQWRkZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE5vZGUgbm9kZSkgeworICAgICAgICBpZiAocHJvcGVydHkgPT0gb2JzZXJ2YWJsZVByb3BlcnR5KSB7CisgICAgICAgICAgICBOb2RlTGlzdDxOb2RlPiBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdDw+KCk7CisgICAgICAgICAgICBPYmplY3QgY3VycmVudFJhd1ZhbHVlID0gbmV3IE5vQ2hhbmdlKCkuZ2V0VmFsdWUocHJvcGVydHksIG5vZGUpOworICAgICAgICAgICAgaWYgKCEoY3VycmVudFJhd1ZhbHVlIGluc3RhbmNlb2YgTm9kZUxpc3QpKXsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBOb2RlTGlzdCwgZm91bmQgIiArIGN1cnJlbnRSYXdWYWx1ZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2RlTGlzdDw/PiBjdXJyZW50Tm9kZUxpc3QgPSAoTm9kZUxpc3Q8Pz4pKGN1cnJlbnRSYXdWYWx1ZSk7CisgICAgICAgICAgICBub2RlTGlzdC5hZGRBbGwoY3VycmVudE5vZGVMaXN0KTsKKyAgICAgICAgICAgIG5vZGVMaXN0LmFkZChpbmRleCwgbm9kZUFkZGVkKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlTGlzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTm9DaGFuZ2UoKS5nZXRWYWx1ZShwcm9wZXJ0eSwgbm9kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvTGlzdFJlbW92YWxDaGFuZ2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9MaXN0UmVtb3ZhbENoYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWVmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvTGlzdFJlbW92YWxDaGFuZ2UuamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uY2hhbmdlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworCisvKioKKyAqIFRoZSByZW1vdmFsIG9mIGFuIGVsZW1lbnQgaW4gYSBsaXN0LgorICovCitwdWJsaWMgY2xhc3MgTGlzdFJlbW92YWxDaGFuZ2UgaW1wbGVtZW50cyBDaGFuZ2UgeworICAgIHByaXZhdGUgZmluYWwgT2JzZXJ2YWJsZVByb3BlcnR5IG9ic2VydmFibGVQcm9wZXJ0eTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKKworICAgIHB1YmxpYyBMaXN0UmVtb3ZhbENoYW5nZShPYnNlcnZhYmxlUHJvcGVydHkgb2JzZXJ2YWJsZVByb3BlcnR5LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhpcy5vYnNlcnZhYmxlUHJvcGVydHkgPSBvYnNlcnZhYmxlUHJvcGVydHk7CisgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBvYnNlcnZhYmxlUHJvcGVydHkpIHsKKyAgICAgICAgICAgIE5vZGVMaXN0PE5vZGU+IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICAgICAgICAgIE9iamVjdCBjdXJyZW50UmF3VmFsdWUgPSBuZXcgTm9DaGFuZ2UoKS5nZXRWYWx1ZShwcm9wZXJ0eSwgbm9kZSk7CisgICAgICAgICAgICBpZiAoIShjdXJyZW50UmF3VmFsdWUgaW5zdGFuY2VvZiBOb2RlTGlzdCkpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIE5vZGVMaXN0LCBmb3VuZCAiICsgY3VycmVudFJhd1ZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vZGVMaXN0PD8+IGN1cnJlbnROb2RlTGlzdCA9IChOb2RlTGlzdDw/PiljdXJyZW50UmF3VmFsdWU7CisgICAgICAgICAgICBub2RlTGlzdC5hZGRBbGwoY3VycmVudE5vZGVMaXN0KTsKKyAgICAgICAgICAgIG5vZGVMaXN0LnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gbm9kZUxpc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vQ2hhbmdlKCkuZ2V0VmFsdWUocHJvcGVydHksIG5vZGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9jaGFuZ2VzL0xpc3RSZXBsYWNlbWVudENoYW5nZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9jaGFuZ2VzL0xpc3RSZXBsYWNlbWVudENoYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjBlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvTGlzdFJlcGxhY2VtZW50Q2hhbmdlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLmNoYW5nZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUGFpcjsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGUgcmVwbGFjZW1lbnQgb2YgYW4gZWxlbWVudCBpbiBhIGxpc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0UmVwbGFjZW1lbnRDaGFuZ2UgaW1wbGVtZW50cyBDaGFuZ2UgeworICAgIHByaXZhdGUgZmluYWwgT2JzZXJ2YWJsZVByb3BlcnR5IG9ic2VydmFibGVQcm9wZXJ0eTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKKyAgICBwcml2YXRlIGZpbmFsIE5vZGUgbmV3VmFsdWU7CisKKyAgICBwdWJsaWMgTGlzdFJlcGxhY2VtZW50Q2hhbmdlKE9ic2VydmFibGVQcm9wZXJ0eSBvYnNlcnZhYmxlUHJvcGVydHksIGludCBpbmRleCwgTm9kZSBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLm9ic2VydmFibGVQcm9wZXJ0eSA9IG9ic2VydmFibGVQcm9wZXJ0eTsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE5vZGUgbm9kZSkgeworICAgICAgICBpZiAocHJvcGVydHkgPT0gb2JzZXJ2YWJsZVByb3BlcnR5KSB7CisgICAgICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnRSYXdWYWx1ZSA9IG5ldyBOb0NoYW5nZSgpLmdldFZhbHVlKHByb3BlcnR5LCBub2RlKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50UmF3VmFsdWUgaW5zdGFuY2VvZiBPcHRpb25hbCkgeworICAgICAgICAgICAgICAgIE9wdGlvbmFsIG9wdGlvbmFsID0gKE9wdGlvbmFsKWN1cnJlbnRSYXdWYWx1ZTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UmF3VmFsdWUgPSBvcHRpb25hbC5vckVsc2VHZXQobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShjdXJyZW50UmF3VmFsdWUgaW5zdGFuY2VvZiBOb2RlTGlzdCkpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIE5vZGVMaXN0LCBmb3VuZCAiICsgY3VycmVudFJhd1ZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vZGVMaXN0IGN1cnJlbnROb2RlTGlzdCA9IChOb2RlTGlzdCljdXJyZW50UmF3VmFsdWU7CisgICAgICAgICAgICBub2RlTGlzdC5hZGRBbGwoY3VycmVudE5vZGVMaXN0KTsKKyAgICAgICAgICAgIG5vZGVMaXN0LnNldChpbmRleCwgbmV3VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG5vZGVMaXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOb0NoYW5nZSgpLmdldFZhbHVlKHByb3BlcnR5LCBub2RlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9Ob0NoYW5nZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9jaGFuZ2VzL05vQ2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyOWUzZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9Ob0NoYW5nZS5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi5jaGFuZ2VzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworCisvKioKKyAqIE5vIGNoYW5nZS4gVGhlIE5vZGUgaXMgbm90IG11dGF0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBOb0NoYW5nZSBpbXBsZW1lbnRzIENoYW5nZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eS5nZXRSYXdWYWx1ZShub2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvUHJvcGVydHlDaGFuZ2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vY2hhbmdlcy9Qcm9wZXJ0eUNoYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjNhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL2NoYW5nZXMvUHJvcGVydHlDaGFuZ2UuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uY2hhbmdlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKKworLyoqCisgKiBUaGUgY2hhbmdlIGluIHZhbHVlIG9mIGEgcHJvcGVydHkuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZSBpbXBsZW1lbnRzIENoYW5nZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHk7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7CisKKyAgICBwdWJsaWMgT2JzZXJ2YWJsZVByb3BlcnR5IGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG9sZFZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlDaGFuZ2UoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKKyAgICAgICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5ID09IHRoaXMucHJvcGVydHkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS5nZXRSYXdWYWx1ZShub2RlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL01ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vTWV0aG9kQW1iaWd1aXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MzJjNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL01ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uOworCisvKioKKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWNpZGUgaG93IHRvIHJlc29sdmUgYSBtZXRob2QgaW52b2NhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIGZyb20gYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIHdoeSB0aGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgc3VwZXIoZGVzY3JpcHRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vTWV0aG9kVXNhZ2UuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL01ldGhvZFVzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzYTA2YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL01ldGhvZFVzYWdlLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMucGFyYW1ldHJpemF0aW9uLlJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXA7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMucGFyYW1ldHJpemF0aW9uLlJlc29sdmVkVHlwZVBhcmFtZXRyaXplZDsKKworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYSBNZXRob2REZWNsYXJhdGlvbiB3aXRoIHNvbWUgVHlwZVBhcmFtZXRlcnMgZGVmaW5lZC4KKyAqIFRoZSBkZWZpbmVkIFR5cGVQYXJhbWV0ZXJzIGNhbiBjb21lcyBmcm9tIHRoZSBNZXRob2QgaXRzZWxmIG9yIGZyb20gdGhlIHN1cnJvdW5kaW5nIHR5cGVzLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kVXNhZ2UgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGVQYXJhbWV0cml6ZWQgeworICAgIHByaXZhdGUgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKKyAgICBwcml2YXRlIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbVR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFJlc29sdmVkVHlwZT4gZXhjZXB0aW9uVHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSByZXR1cm5UeXBlOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcCB0eXBlUGFyYW1ldGVyc01hcDsKKworICAgIHB1YmxpYyBNZXRob2RVc2FnZShSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnNNYXAgPSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwLmVtcHR5KCk7CisgICAgICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpOyBpKyspIHsKKyAgICAgICAgICAgIHBhcmFtVHlwZXMuYWRkKGRlY2xhcmF0aW9uLmdldFBhcmFtKGkpLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbi5nZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKTsgaSsrKSB7CisgICAgICAgICAgICBleGNlcHRpb25UeXBlcy5hZGQoZGVjbGFyYXRpb24uZ2V0U3BlY2lmaWVkRXhjZXB0aW9uKGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm5UeXBlID0gZGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RVc2FnZShSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1UeXBlcywgUmVzb2x2ZWRUeXBlIHJldHVyblR5cGUpIHsKKyAgICAgICAgdGhpcyhkZWNsYXJhdGlvbiwgcGFyYW1UeXBlcywgcmV0dXJuVHlwZSwgZGVjbGFyYXRpb24uZ2V0U3BlY2lmaWVkRXhjZXB0aW9ucygpLAorICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAuZW1wdHkoKSk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFVzYWdlKFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbVR5cGVzLCBSZXNvbHZlZFR5cGUgcmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGV4Y2VwdGlvblR5cGVzKSB7CisgICAgICAgIHRoaXMoZGVjbGFyYXRpb24sIHBhcmFtVHlwZXMsIHJldHVyblR5cGUsIGV4Y2VwdGlvblR5cGVzLCBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwLmVtcHR5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kVXNhZ2UoUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtVHlwZXMsIFJlc29sdmVkVHlwZSByZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGV4Y2VwdGlvblR5cGVzLCBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwIHR5cGVQYXJhbWV0ZXJzTWFwKSB7CisgICAgICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKKyAgICAgICAgdGhpcy5wYXJhbVR5cGVzID0gcGFyYW1UeXBlczsKKyAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKyAgICAgICAgdGhpcy5leGNlcHRpb25UeXBlcyA9IGV4Y2VwdGlvblR5cGVzOworICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzTWFwID0gdHlwZVBhcmFtZXRlcnNNYXA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJNZXRob2RVc2FnZXsiICsKKyAgICAgICAgICAgICAgICAiZGVjbGFyYXRpb249IiArIGRlY2xhcmF0aW9uICsKKyAgICAgICAgICAgICAgICAiLCBwYXJhbVR5cGVzPSIgKyBwYXJhbVR5cGVzICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUoKSB7CisgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSByZXR1cm5UeXBlKCkgeworICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGU+IGdldFBhcmFtVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbVR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RVc2FnZSByZXBsYWNlUGFyYW1UeXBlKGludCBpLCBSZXNvbHZlZFR5cGUgcmVwbGFjZWQpIHsKKyAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gZ2V0Tm9QYXJhbXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbVR5cGVzLmdldChpKSA9PSByZXBsYWNlZCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IG5ld1BhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PD4ocGFyYW1UeXBlcyk7CisgICAgICAgIG5ld1BhcmFtcy5zZXQoaSwgcmVwbGFjZWQpOworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlKGRlY2xhcmF0aW9uLCBuZXdQYXJhbXMsIHJldHVyblR5cGUsIGV4Y2VwdGlvblR5cGVzLCB0eXBlUGFyYW1ldGVyc01hcCk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFVzYWdlIHJlcGxhY2VFeGNlcHRpb25UeXBlKGludCBpLCBSZXNvbHZlZFR5cGUgcmVwbGFjZWQpIHsKKyAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gZXhjZXB0aW9uVHlwZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2VwdGlvblR5cGVzLmdldChpKSA9PSByZXBsYWNlZCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IG5ld1R5cGVzID0gbmV3IExpbmtlZExpc3Q8PihleGNlcHRpb25UeXBlcyk7CisgICAgICAgIG5ld1R5cGVzLnNldChpLCByZXBsYWNlZCk7CisgICAgICAgIHJldHVybiBuZXcgTWV0aG9kVXNhZ2UoZGVjbGFyYXRpb24sIHBhcmFtVHlwZXMsIHJldHVyblR5cGUsIG5ld1R5cGVzLCB0eXBlUGFyYW1ldGVyc01hcCk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFVzYWdlIHJlcGxhY2VSZXR1cm5UeXBlKFJlc29sdmVkVHlwZSByZXR1cm5UeXBlKSB7CisgICAgICAgIGlmIChyZXR1cm5UeXBlID09IHRoaXMucmV0dXJuVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlKGRlY2xhcmF0aW9uLCBwYXJhbVR5cGVzLCByZXR1cm5UeXBlLCBleGNlcHRpb25UeXBlcywgdHlwZVBhcmFtZXRlcnNNYXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZm9ybWFsIGFyZ3VtZW50cyBhY2NlcHRlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5vUGFyYW1zKCkgeworICAgICAgICByZXR1cm4gcGFyYW1UeXBlcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmb3JtYWwgYXJndW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0UGFyYW1UeXBlKGludCBpKSB7CisgICAgICAgIHJldHVybiBwYXJhbVR5cGVzLmdldChpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kVXNhZ2UgcmVwbGFjZVR5cGVQYXJhbWV0ZXIoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlciwgUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyBpZiB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIGhhcyBhIHR5cGUgcGFyYW0gd2l0aCB0aGF0IG5hbWUgaWdub3JlIHRoaXMgY2FsbAorICAgICAgICBNZXRob2RVc2FnZSByZXMgPSBuZXcgTWV0aG9kVXNhZ2UoZGVjbGFyYXRpb24sIHBhcmFtVHlwZXMsIHJldHVyblR5cGUsIGV4Y2VwdGlvblR5cGVzLAorICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzTWFwLnRvQnVpbGRlcigpLnNldFZhbHVlKHR5cGVQYXJhbWV0ZXIsIHR5cGUpLmJ1aWxkKCkpOworCisgICAgICAgIE1hcDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPiBpbmZlcnJlZFR5cGVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBvcmlnaW5hbFBhcmFtVHlwZSA9IHBhcmFtVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIG5ld1BhcmFtVHlwZSA9IG9yaWdpbmFsUGFyYW1UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHR5cGVQYXJhbWV0ZXIsIHR5cGUsIGluZmVycmVkVHlwZXMpOworICAgICAgICAgICAgcmVzID0gcmVzLnJlcGxhY2VQYXJhbVR5cGUoaSwgbmV3UGFyYW1UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvblR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgb3JpZ2luYWxUeXBlID0gZXhjZXB0aW9uVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIG5ld1R5cGUgPSBvcmlnaW5hbFR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXModHlwZVBhcmFtZXRlciwgdHlwZSwgaW5mZXJyZWRUeXBlcyk7CisgICAgICAgICAgICByZXMgPSByZXMucmVwbGFjZUV4Y2VwdGlvblR5cGUoaSwgbmV3VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgUmVzb2x2ZWRUeXBlIG9sZFJldHVyblR5cGUgPSByZXMucmV0dXJuVHlwZTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIG5ld1JldHVyblR5cGUgPSBvbGRSZXR1cm5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHR5cGVQYXJhbWV0ZXIsIHR5cGUsIGluZmVycmVkVHlwZXMpOworICAgICAgICByZXMgPSByZXMucmVwbGFjZVJldHVyblR5cGUobmV3UmV0dXJuVHlwZSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAgdHlwZVBhcmFtZXRlcnNNYXAoKSB7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyc01hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFNpZ25hdHVyZSgpIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgdGhlIHR5cGUgcGFyYW1ldGVycworICAgICAgICByZXR1cm4gdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZT4gZXhjZXB0aW9uVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBleGNlcHRpb25UeXBlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9SZXNvbHZhYmxlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9SZXNvbHZhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMmExYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL1Jlc29sdmFibGUuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbjsKKworcHVibGljIGludGVyZmFjZSBSZXNvbHZhYmxlPFQ+IHsKKyAgICBUIHJlc29sdmUoKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL1N5bWJvbFJlc29sdmVyLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9TeW1ib2xSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjhhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9TeW1ib2xSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworcHVibGljIGludGVyZmFjZSBTeW1ib2xSZXNvbHZlciB7CisgICAgLyoqCisgICAgICogRm9yIGEgcmVmZXJlbmNlIGl0IHdvdWxkIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBkZWNsYXJhdGlvbi4KKyAgICAgKi8KKyAgICA8VD4gVCByZXNvbHZlRGVjbGFyYXRpb24oTm9kZSBub2RlLCBDbGFzczxUPiByZXN1bHRDbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgdHlwZXMgaXQgd291bGQgZmluZCB0aGUgY29ycmVzcG9uZGluZyByZXNvbHZlZCB0eXBlcy4KKyAgICAgKi8KKyAgICA8VD4gVCB0b1Jlc29sdmVkVHlwZShUeXBlIGphdmFwYXJzZXJUeXBlLCBDbGFzczxUPiByZXN1bHRDbGFzcyk7CisKKyAgICBSZXNvbHZlZFR5cGUgY2FsY3VsYXRlVHlwZShFeHByZXNzaW9uIGV4cHJlc3Npb24pOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL1Vuc29sdmVkU3ltYm9sRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxNTA5NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL1Vuc29sdmVkU3ltYm9sRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb247CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYSBzeW1ib2wgY2Fubm90IGJlIHJlc29sdmVkLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoIlVuc29sdmVkIHN5bWJvbCBpbiAiICsgY29udGV4dCArICIgOiAiICsgbmFtZSk7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKCJVbnNvbHZlZCBzeW1ib2wgOiAiICsgbmFtZSk7CisgICAgICAgIHRoaXMuY29udGV4dCA9ICJ1bmtub3duIjsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlVuc29sdmVkU3ltYm9sRXhjZXB0aW9ueyIgKworICAgICAgICAgICAgICAgICJjb250ZXh0PSciICsgY29udGV4dCArICdcJycgKworICAgICAgICAgICAgICAgICIsIG5hbWU9JyIgKyBuYW1lICsgJ1wnJysKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL0hhc0FjY2Vzc1NwZWNpZmllci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL0hhc0FjY2Vzc1NwZWNpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkN2U1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvSGFzQWNjZXNzU3BlY2lmaWVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CisKKy8qKgorICogQW55dGhpbmcgd2hpY2ggY2FuIGhhdmUgYW4gQWNjZXNzU3BlY2lmaWVyLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhhc0FjY2Vzc1NwZWNpZmllciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNjZXNzIHNwZWNpZmllciBvZiB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpOworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRBbm5vdGF0aW9uRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEFubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTI0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRBbm5vdGF0aW9uRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZEFubm90YXRpb25EZWNsYXJhdGlvbiBleHRlbmRzIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHsKKworICAgIExpc3Q8UmVzb2x2ZWRBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+IGdldEFubm90YXRpb25NZW1iZXJzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmY4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbiB7CisKKyAgICBFeHByZXNzaW9uIGdldERlZmF1bHRWYWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YThkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRGVjbGFyYXRpb24gb2YgYSBDbGFzcyAobm90IGFuIGludGVyZmFjZSBvciBhbiBlbnVtKS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUsIEhhc0FjY2Vzc1NwZWNpZmllciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgYm9vbGVhbiBpc0NsYXNzKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgUmVmZXJlbmNlVHlwZVVzYWdlIGJlY2F1c2UgaXQgY291bGQgY29udGFpbiB0eXBlIHR5cGVQYXJhbWV0ZXJzVmFsdWVzLgorICAgICAqIEZvciBleGFtcGxlOiBjbGFzcyBBIGV4dGVuZHMgQjxJbnRlZ2VyLCBTdHJpbmc+LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBvbmx5IHRoZSBPYmplY3QgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgc3VwZXJjbGFzcyBhbmQgdGhlcmVmb3JlCisgICAgICogcmV0dXJuIG51bGwuCisgICAgICovCisgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGdldFN1cGVyQ2xhc3MoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgZGlyZWN0bHkgYnkgdGhpcyBjbGFzcy4KKyAgICAgKiBJdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHN1cGVyY2xhc3NlcyBvciBleHRlbmRlZAorICAgICAqIGJ5IHRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkLgorICAgICAqLworICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRJbnRlcmZhY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHN1cGVyY2xhc3Nlcywgd2l0aCBhbGwgdGhlIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgZXhwcmVzc2VkIGFzIGZ1bmN0aW9ucyBvZiB0aGUgdHlwZQorICAgICAqIHR5cGVQYXJhbWV0ZXJzVmFsdWVzIG9mIHRoaXMgZGVjbGFyYXRpb24uCisgICAgICovCisgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFsbFN1cGVyQ2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgaW5jbHVkaW5nIHRoZSBpbnRlcmZhY2VzCisgICAgICogZXh0ZW5kZWQgYnkgaW50ZXJmYWNlcyBpdCBpbXBsZW1lbnRzLgorICAgICAqIDxwPgorICAgICAqIEdldCBhbGwgaW50ZXJmYWNlcywgd2l0aCBhbGwgdGhlIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgZXhwcmVzc2VkIGFzIGZ1bmN0aW9ucyBvZiB0aGUgdHlwZQorICAgICAqIHR5cGVQYXJhbWV0ZXJzVmFsdWVzIG9mIHRoaXMgZGVjbGFyYXRpb24uCisgICAgICovCisgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFsbEludGVyZmFjZXMoKTsKKworICAgIC8vLworICAgIC8vLyBDb25zdHJ1Y3RvcnMKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgY29uc3RydWN0b3JzIGF2YWlsYWJsZSBmb3IgdGhlIGNsYXNzLgorICAgICAqIFRoaXMgbGlzdCBzaG91bGQgYWxzbyBpbmNsdWRlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIExpc3Q8UmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBnZXRDb25zdHJ1Y3RvcnMoKTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjQ4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCisvKioKKyAqIEEgZGVjbGFyYXRpb24gb2YgYSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIGNhbiBiZSBkZWNsYXJlZCBpbiBhIGNsYXNzIG9yIGFuIGVudW0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiZWU4MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCisvKioKKyAqIEEgZ2VuZXJpYyBkZWNsYXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZERlY2xhcmF0aW9uIHsKKworICAgIC8qKgorICAgICAqIEFub255bW91cyBjbGFzc2VzIGRvIG5vdCBoYXZlIGEgbmFtZSwgZm9yIGV4YW1wbGUuCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGhhc05hbWUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3VsZCByZXR1cm4gdGhlIG5hbWUgb3IgdGhyb3cgYSBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyBkZWNsYXJhdGlvbiByZXByZXNlbnRzIGEgY2xhc3MgZmllbGQ/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgZGVjbGFyYXRpb24gcmVwcmVzZW50cyBhIG1ldGhvZCBwYXJhbWV0ZXI/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGlzIGRlY2xhcmF0aW9uIHJlcHJlc2VudHMgYSB0eXBlPworICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgZGVjbGFyYXRpb24gcmVwcmVzZW50cyBhIG1ldGhvZD8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBhcyBhIEZpZWxkRGVjbGFyYXRpb24gb3IgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiBhc0ZpZWxkKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgRmllbGREZWNsYXJhdGlvbiIsIHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBhcyBhIFBhcmFtZXRlckRlY2xhcmF0aW9uIG9yIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIGFzUGFyYW1ldGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgUGFyYW1ldGVyRGVjbGFyYXRpb24iLCB0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgYXMgYSBUeXBlRGVjbGFyYXRpb24gb3IgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIGFzVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBhcyBhIE1ldGhvZERlY2xhcmF0aW9uIG9yIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIGFzTWV0aG9kKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgTWV0aG9kRGVjbGFyYXRpb24iLCB0aGlzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViMGRlZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24geworCisgICAgU3RyaW5nIGdldE5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEVudW1EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkRW51bURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxYTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEVudW1EZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERlY2xhcmF0aW9uIG9mIGFuIEVudW0uCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwKKyAgICAgICAgSGFzQWNjZXNzU3BlY2lmaWVyIHsKKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgYm9vbGVhbiBpc0VudW0oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gYXNFbnVtKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBMaXN0PFJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGdldEVudW1Db25zdGFudHMoKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRjODkyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkRmllbGREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9uczsKKworLyoqCisgKiBEZWNsYXJhdGlvbiBvZiBhIGZpZWxkLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbiwgSGFzQWNjZXNzU3BlY2lmaWVyIHsKKworICAgIC8qKgorICAgICAqIElzIHRoZSBmaWVsZCBzdGF0aWM/CisgICAgICovCisgICAgYm9vbGVhbiBpc1N0YXRpYygpOworCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGFzRmllbGQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9uIHdoaWNoIHRoaXMgZmllbGQgaGFzIGJlZW4gZGVjbGFyZWQKKyAgICAgKi8KKyAgICBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKCk7CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjUzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIGRlY2xhcmF0aW9uLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkSW50ZXJmYWNlRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUsIEhhc0FjY2Vzc1NwZWNpZmllciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIGV4dGVuZGVkIGRpcmVjdGx5IGJ5IHRoaXMgb25lLgorICAgICAqLworICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRJbnRlcmZhY2VzRXh0ZW5kZWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIGV4dGVuZGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgdGhpcyBvbmUuCisgICAgICovCisgICAgZGVmYXVsdCBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QWxsSW50ZXJmYWNlc0V4dGVuZGVkKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBpbnRlcmZhY2VEZWNsYXJhdGlvbiA6IGdldEludGVyZmFjZXNFeHRlbmRlZCgpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChpbnRlcmZhY2VEZWNsYXJhdGlvbik7CisgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZEFsbChpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzQW5jZXN0b3JzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworLyoqCisgKiBBIGRlY2xhcmF0aW9uIG9mIGEgbWV0aG9kIChlaXRoZXIgaW4gYW4gaW50ZXJmYWNlLCBhIGNsYXNzLCBhbiBlbnVtIG9yIGFuIGFubm90YXRpb24pLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGN1cnJlbnQgbWV0aG9kLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSBpbnZva2VkCisgICAgICogZm9yIG1ldGhvZHMgcmV0dXJuaW5nIHZvaWQuCisgICAgICovCisgICAgUmVzb2x2ZWRUeXBlIGdldFJldHVyblR5cGUoKTsKKworICAgIC8qKgorICAgICAqIElzIHRoZSBtZXRob2QgYWJzdHJhY3Q/IEFsbCBpbnRlcmZhY2UgbWV0aG9kcyBub3QgbWFya2VkIGFzIGRlZmF1bHQgYXJlIGFic3RyYWN0LgorICAgICAqLworICAgIGJvb2xlYW4gaXNBYnN0cmFjdCgpOworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBhIGRlZmF1bHQgbWV0aG9kPworICAgICAqLworICAgIGJvb2xlYW4gaXNEZWZhdWx0TWV0aG9kKCk7CisKKyAgICAvKgorICAgICAqIElzIHRoaXMgbWV0aG9kIHN0YXRpYz8KKyAgICAgKi8KKyAgICBib29sZWFuIGlzU3RhdGljKCk7CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmMzVmNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRoaXMgaXMgYSBjb21tb24gaW50ZXJmYWNlIGZvciBNZXRob2REZWNsYXJhdGlvbiBhbmQgQ29uc3RydWN0b3JEZWNsYXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbiBleHRlbmRzIFJlc29sdmVkRGVjbGFyYXRpb24sCisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlLCBIYXNBY2Nlc3NTcGVjaWZpZXIgeworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGRlY2xhcmluZyB0eXBlLgorICAgICAqLworICAgIGRlZmF1bHQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gZGVjbGFyaW5nVHlwZSgpLmdldFBhY2thZ2VOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzKGVzKSB3cmFwcGluZyB0aGUgZGVjbGFyaW5nIHR5cGUuCisgICAgICovCisgICAgZGVmYXVsdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gZGVjbGFyaW5nVHlwZSgpLmdldENsYXNzTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWV0aG9kIGNvbXBvc2VkIGJ5IHRoZSBxdWFsZmllZCBuYW1lIG9mIHRoZSBkZWNsYXJpbmcgdHlwZQorICAgICAqIGZvbGxvd2VkIGJ5IGEgZG90IGFuZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIGRlZmF1bHQgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBkZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIi4iICsgdGhpcy5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIGRlZmF1bHQgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIigiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROdW1iZXJPZlBhcmFtcygpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0UGFyYW0oaSkuZGVzY3JpYmVUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVhbGlmaWVkIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLiBJdCBpcyBjb21wb3NlZCBieSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRlY2xhcmluZyB0eXBlCisgICAgICogZm9sbG93ZWQgYnkgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIGRlZmF1bHQgU3RyaW5nIGdldFF1YWxpZmllZFNpZ25hdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlY2xhcmluZ1R5cGUoKS5nZXRJZCgpICsgIi4iICsgdGhpcy5nZXRTaWduYXR1cmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBpbiB3aGljaCB0aGUgbWV0aG9kIGlzIGRlY2xhcmVkLgorICAgICAqLworICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUoKTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwYXJhbXMuCisgICAgICovCisgICAgaW50IGdldE51bWJlck9mUGFyYW1zKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFBhcmFtZXRlckRlY2xhcmF0aW9uIGF0IHRoZSBjb3JyZXNwb25kaW5nIHBvc2l0aW9uIG9yIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIGdldFBhcmFtKGludCBpKTsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgbGFzdCBQYXJhbWV0ZXJEZWNsYXJhdGlvbi4gSXQgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBtZXRob2QKKyAgICAgKiBoYXMgbm8gcGFyYW1ldGVycy4KKyAgICAgKiBUaGUgbGFzdCBwYXJhbWV0ZXIgY2FuIGJlIHZhcmlhZGljIGFuZCBzb21ldGltZXMgaXQgbmVlZHMgdG8gYmUgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5LgorICAgICAqLworICAgIGRlZmF1bHQgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBnZXRMYXN0UGFyYW0oKSB7CisgICAgICAgIGlmIChnZXROdW1iZXJPZlBhcmFtcygpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaGFzIG5vIHR5cGVQYXJhbWV0ZXJzVmFsdWVzLCB0aGVyZWZvcmUgaXQgaGFzIG5vIGEgbGFzdCBwYXJhbWV0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UGFyYW0oZ2V0TnVtYmVyT2ZQYXJhbXMoKSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgbWV0aG9kIG9yIGNvbnN0cnVjb3IgYSB2YXJpYWRpYyBwYXJhbWV0ZXI/CisgICAgICogTm90ZSB0aGF0IHdoZW4gYSBtZXRob2QgaGFzIGEgdmFyaWFkaWMgcGFyYW1ldGVyIGl0IHNob3VsZCBoYXZlIGFuIGFycmF5IHR5cGUuCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGhhc1ZhcmlhZGljUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAoZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UGFyYW0oZ2V0TnVtYmVyT2ZQYXJhbXMoKSAtIDEpLmlzVmFyaWFkaWMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGZpbmRUeXBlUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiB0aGlzLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGlmICh0cC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVjbGFyaW5nVHlwZSgpLmZpbmRUeXBlUGFyYW1ldGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBleGNlcHRpb25zIGxpc3RlZCBpbiB0aGUgdGhyb3dzIGNsYXVzZS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSB0aHJvd3MgY2xhdXNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG5lZ2F0aXZlIG9yIGl0IGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGZvciB0aG9zZSB0eXBlcyBvZiBtZXRob2RzIG9mIGNvbnN0cnVjdG9yIHRoYXQgZG8gbm90IGRlY2xhcmUgZXhjZXB0aW9ucworICAgICAqLworICAgIFJlc29sdmVkVHlwZSBnZXRTcGVjaWZpZWRFeGNlcHRpb24oaW50IGluZGV4KTsKKworICAgIGRlZmF1bHQgTGlzdDxSZXNvbHZlZFR5cGU+IGdldFNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIGlmIChnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gZXhjZXB0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGdldE51bWJlck9mU3BlY2lmaWVkRXhjZXB0aW9ucygpO2krKykgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuYWRkKGdldFNwZWNpZmllZEV4Y2VwdGlvbihpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODY1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9uczsKKworLyoqCisgKiBEZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIGFzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHBhcmFtZXRlciBkZWNsYXJlZCBhcyB2YXJpYWRpYz8KKyAgICAgKi8KKyAgICBib29sZWFuIGlzVmFyaWFkaWMoKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaWJlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuIEluIHByYWN0aWNlIGFkZCB0aHJlZSBkb3RzIHRvIHRoZSB0eXBlIG5hbWUKKyAgICAgKiBpcyB0aGUgcGFyYW1ldGVyIGlzIHZhcmlhZGljLgorICAgICAqLworICAgIGRlZmF1bHQgU3RyaW5nIGRlc2NyaWJlVHlwZSgpIHsKKyAgICAgICAgaWYgKGlzVmFyaWFkaWMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5kZXNjcmliZSgpICsgIi4uLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLmRlc2NyaWJlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTUyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24sCisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIHsKKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gYXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gQW5jZXN0b3JzCisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBhbGwgdGhlIGRpcmVjdCBhbmNlc3RvcnMgb2YgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24uCisgICAgICogTm90ZSB0aGF0IHRoZSBhbmNlc3RvciBjYW4gYmUgcGFyYW1ldHJpemVkIHR5cGVzIHdpdGggdmFsdWVzIHNwZWNpZmllZC4gRm9yIGV4YW1wbGU6CisgICAgICogPHA+CisgICAgICogY2xhc3MgQSBpbXBsZW1lbnRzIENvbXBhcmFibGUmbHQ7U3RyaW5nJmd0OyB7fQorICAgICAqIDxwPgorICAgICAqIEluIHRoaXMgY2FzZSB0aGUgYW5jZXN0b3IgaXMgQ29tcGFyYWJsZSZsdDtTdHJpbmcmZ3Q7CisgICAgICovCisgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFuY2VzdG9ycygpOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgYWxsIHRoZSBhbmNlc3RvcnMgb2YgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24sIGRpcmVjdCBhbmQgaW5kaXJlY3QuCisgICAgICogVGhpcyBsaXN0IGRvZXMgbm90IGNvbnRhaW5zIGR1cGxpY2F0ZXMgd2l0aCB0aGUgZXhhY3Rpbmcgc2FtZSB0eXBlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgZGVmYXVsdCBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QWxsQW5jZXN0b3JzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIC8vIFdlIHdhbnQgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgT2JqZWN0IGhhdmluZyBPYmplY3QgYXMgYW5jZXN0b3IKKyAgICAgICAgaWYgKCEoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMoZ2V0UXVhbGlmaWVkTmFtZSgpKSkpIHsgICAgICAgCisgICAgICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA6IGdldEFuY2VzdG9ycygpKSB7CisgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChhbmNlc3Rvcik7ICAgIAorICAgICAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGluaGVyaXRlZEFuY2VzdG9yIDogYW5jZXN0b3IuZ2V0QWxsQW5jZXN0b3JzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmNlc3RvcnMuY29udGFpbnMoaW5oZXJpdGVkQW5jZXN0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKGluaGVyaXRlZEFuY2VzdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5jZXN0b3JzOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBGaWVsZHMKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgc2hvdWxkIGJlIGV4cHJlc3NlZCB1c2luZyB0aGUgdHlwZSB2YXJpYWJsZXMgb2YgdGhpcyBwYXJ0aWN1bGFyIHR5cGUuCisgICAgICogQ29uc2lkZXIgZm9yIGV4YW1wbGU6CisgICAgICogPHA+CisgICAgICogY2xhc3MgRm9vPEU+IHsgRSBmaWVsZDsgfQorICAgICAqIDxwPgorICAgICAqIGNsYXNzIEJhciBleHRlbmRzIEZvbzxTdHJpbmc+IHsgfQorICAgICAqIDxwPgorICAgICAqIFdoZW4gY2FsbGluZyBnZXRGaWVsZCgiZmllbGQiKSBvbiBGb28gSSBzaG91bGQgZ2V0IGEgRmllbGREZWNsYXJhdGlvbiB3aXRoIHR5cGUgRSwgd2hpbGUgY2FsbGluZyBpdCBvbgorICAgICAqIEJhciBJIHNob3VsZCBnZXQgYSBGaWVsZERlY2xhcmF0aW9uIHdpdGggdHlwZSBTdHJpbmcuCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gZ2V0RmllbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBmaWVsZCA9IHRoaXMuZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKTsKKyAgICAgICAgaWYgKGZpZWxkLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIkZpZWxkIG5vdCBmb3VuZDogIiArIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc2lkZXIgb25seSBmaWVsZCBvciBpbmhlcml0ZWQgZmllbGQgd2hpY2ggaXMgbm90IHByaXZhdGUuCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gZ2V0VmlzaWJsZUZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE9wdGlvbmFsPFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZmllbGQgPSBnZXRWaXNpYmxlRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKTsKKyAgICAgICAgaWYgKGZpZWxkLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyB0eXBlIGEgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaGFzRmllbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKS5pc1ByZXNlbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFaXRoZXIgYSBkZWNsYXJlZCBmaWVsZCBvciBpbmhlcml0ZWQgZmllbGQgd2hpY2ggaXMgbm90IHByaXZhdGUuCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGhhc1Zpc2libGVGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0VmlzaWJsZUZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihmIC0+IGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCkuaXNQcmVzZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgZmllbGRzLCBlaXRoZXIgZGVjbGFyZWQgaW4gdGhpcyBkZWNsYXJhdGlvbiBvciBpbmhlcml0ZWQuCisgICAgICovCisgICAgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgZmllbGRzIGRlY2xhcmVkIGFuZCB0aGUgaW5oZXJpdGVkIG9uZXMgd2hpY2ggYXJlIG5vdCBwcml2YXRlLgorICAgICAqLworICAgIGRlZmF1bHQgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldFZpc2libGVGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiBnZXRBbGxGaWVsZHMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoZiAtPiBmLmRlY2xhcmluZ1R5cGUoKS5lcXVhbHModGhpcykgfHwgZi5hY2Nlc3NTcGVjaWZpZXIoKSAhPSBBY2Nlc3NTcGVjaWZpZXIuUFJJVkFURSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbm9uIHN0YXRpYyBmaWVsZHMsIGVpdGhlciBkZWNsYXJlZCBvciBpbmhlcml0ZWQuCisgICAgICovCisgICAgZGVmYXVsdCBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZ2V0QWxsTm9uU3RhdGljRmllbGRzKCkgeworICAgICAgICByZXR1cm4gZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGl0IC0+ICFpdC5pc1N0YXRpYygpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBzdGF0aWMgZmllbGRzLCBlaXRoZXIgZGVjbGFyZWQgb3IgaW5oZXJpdGVkLgorICAgICAqLworICAgIGRlZmF1bHQgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbFN0YXRpY0ZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEFsbEZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5pc1N0YXRpYygpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhpcyB0eXBlLgorICAgICAqLworICAgIGRlZmF1bHQgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldERlY2xhcmVkRmllbGRzKCkgeworICAgICAgICByZXR1cm4gZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGl0IC0+IGl0LmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGdldFF1YWxpZmllZE5hbWUoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIE1ldGhvZHMKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBtZXRob2RzIGRlY2xhcmVkIGluIHRoaXMgdHlwZSBkZWNsYXJhdGlvbi4KKyAgICAgKi8KKyAgICBTZXQ8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbWV0aG9kcyBkZWNsYXJlZCBvZiB0aGlzIHR5cGUgZGVjbGFyYXRpb24sIGVpdGhlciBkZWNsYXJlZCBvciBpbmhlcml0ZWQuCisgICAgICogTm90ZSB0aGF0IGl0IHNob3VsZCBub3QgaW5jbHVkZSBvdmVycmlkZGVuIG1ldGhvZHMuCisgICAgICovCisgICAgU2V0PE1ldGhvZFVzYWdlPiBnZXRBbGxNZXRob2RzKCk7CisKKyAgICAvLy8KKyAgICAvLy8gQXNzaWduYWJpbGl0eQorICAgIC8vLworCisgICAgLyoqCisgICAgICogQ2FuIHdlIGFzc2lnbiBpbnN0YW5jZXMgb2YgdGhlIGdpdmVuIHR5cGUgdG8gdmFyaWFibGVzIGhhdmluZyB0aGUgdHlwZSBkZWZpbmVkCisgICAgICogYnkgdGhpcyBkZWNsYXJhdGlvbj8KKyAgICAgKi8KKyAgICBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSB0eXBlKTsKKworICAgIC8qKgorICAgICAqIENhbiB3ZSBhc3NpZ24gaW5zdGFuY2VzIG9mIHRoZSB0eXBlIGRlZmluZWQgYnkgdGhpcyBkZWNsYXJhdGlvbiB0byB2YXJpYWJsZXMgaGF2aW5nIHRoZSB0eXBlIGRlZmluZWQKKyAgICAgKiBieSB0aGUgZ2l2ZW4gdHlwZT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gY2FuQmVBc3NpZ25lZFRvKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIG90aGVyKSB7CisgICAgICAgIHJldHVybiBvdGhlci5pc0Fzc2lnbmFibGVCeSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW4gd2UgYXNzaWduIGluc3RhbmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZSB0byB2YXJpYWJsZXMgaGF2aW5nIHRoZSB0eXBlIGRlZmluZWQKKyAgICAgKiBieSB0aGlzIGRlY2xhcmF0aW9uPworICAgICAqLworICAgIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpOworCisgICAgLy8vCisgICAgLy8vIEFubm90YXRpb25zCisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhlIHR5cGUgYXQgbGVhc3Qgb25lIGFubm90YXRpb24gZGVjbGFyZWQgaGF2aW5nIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWU/CisgICAgICovCisgICAgYm9vbGVhbiBoYXNEaXJlY3RseUFubm90YXRpb24oU3RyaW5nIHF1YWxpZmllZE5hbWUpOworCisgICAgLyoqCisgICAgICogSGFzIHRoZSB0eXBlIGF0IGxlYXN0IG9uZSBhbm5vdGF0aW9uIGRlY2xhcmVkIG9yIGluaGVyaXRlZCBoYXZpbmcgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaGFzQW5ub3RhdGlvbihTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworICAgICAgICBpZiAoaGFzRGlyZWN0bHlBbm5vdGF0aW9uKHF1YWxpZmllZE5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0QWxsQW5jZXN0b3JzKCkuc3RyZWFtKCkuYW55TWF0Y2goaXQgLT4gaXQuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaGFzRGlyZWN0bHlBbm5vdGF0aW9uKHF1YWxpZmllZE5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHR5cGUgaGFzIGEgZnVuY3Rpb25hbCBtZXRob2QuIENvbmNlcHR1YWxseSwgYSBmdW5jdGlvbmFsIGludGVyZmFjZSBoYXMgZXhhY3RseSBvbmUgYWJzdHJhY3QgbWV0aG9kLgorICAgICAqIFR5cGljYWxseSB0aGVzZSBjbGFzc2VzIGhhcyB0aGUgRnVuY3Rpb25JbnRlcmZhY2UgYW5ub3RhdGlvbiBidXQgdGhpcyBpcyBub3QgbWFuZGF0b3J5LgorICAgICAqLworICAgIGJvb2xlYW4gaXNGdW5jdGlvbmFsSW50ZXJmYWNlKCk7CisKKyAgICAvLy8KKyAgICAvLy8gVHlwZSBwYXJhbWV0ZXJzCisgICAgLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IE9wdGlvbmFsPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBmaW5kVHlwZVBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwIDogdGhpcy5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBpZiAodHAuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0cCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyVHlwZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJUeXBlKCkuZ2V0KCkuZmluZFR5cGVQYXJhbWV0ZXIobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkVHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjcxNWZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkVHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBkZWNsYXJhdGlvbiBvZiBhIHR5cGUuIEl0IGNvdWxkIGJlIGEgcHJpbWl0aXZlIHR5cGUsIGFuIGVudW0sIGEgY2xhc3MsIGFuIGludGVyZmFjZQorICogb3IgYSB0eXBlIHZhcmlhYmxlLgorICogSXQgY2Fubm90IGJlIGFuIGFubm90YXRpb24gb3IgYW4gYXJyYXkuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZERlY2xhcmF0aW9uIHsKKworICAgIC8vLworICAgIC8vLyBDb250YWlubWVudAorICAgIC8vLworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIHR5cGVzIGRlZmluZWQgaW5zaWRlIHRoZSBjdXJyZW50IHR5cGUuCisgICAgICovCisgICAgZGVmYXVsdCBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGludGVybmFsVHlwZXMoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW50ZXJuYWxUeXBlcyBub3QgYXZhaWxhYmxlIGZvciAiICsgdGhpcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHR5cGUgZGVjbGFyYXRpb24gZm9yIHRoZSBpbnRlcm5hbCB0eXBlIGJhc2VkIG9uIG5hbWUuCisgICAgICogKERvZXMgbm90IGluY2x1ZGUgaW50ZXJuYWwgdHlwZXMgaW5zaWRlIGludGVybmFsIHR5cGVzKS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGdldEludGVybmFsVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHlwZSA9CisgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKTsKKyAgICAgICAgcmV0dXJuIHR5cGUub3JFbHNlVGhyb3coKCkgLT4KKyAgICAgICAgICAgICAgICBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIkludGVybmFsIHR5cGUgbm90IGZvdW5kOiAiICsgbmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyB0eXBlIGNvbnRhaW4gYW4gaW50ZXJuYWwgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lPworICAgICAqIChEb2VzIG5vdCBpbmNsdWRlIGludGVybmFsIHR5cGVzIGluc2lkZSBpbnRlcm5hbCB0eXBlcykuCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGhhc0ludGVybmFsVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuYW55TWF0Y2goZiAtPiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGVuY2xvc2luZyB0aGlzIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCk7CisKKyAgICAvLy8KKyAgICAvLy8gTWlzYworICAgIC8vLworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB0aGUgZGVjbGFyYXRpb24gb2YgYSBjbGFzcz8KKyAgICAgKiBOb3RlIHRoYXQgYW4gRW51bSBpcyBub3QgY29uc2lkZXJlZCBhIENsYXNzIGluIHRoaXMgY2FzZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGludGVyZmFjZT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBlbnVtPworICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc0VudW0oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHR5cGUgcGFyYW1ldGVyPworICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHR5cGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byBhbiBhbm9ueW1vdXMgY2xhc3M/CisgICAgICoKKyAgICAgKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYW5vbnltb3VzIGNsYXNzOgorICAgICAqIDxwcmU+CisgICAgICogSGVsbG9Xb3JsZCBmcmVuY2hHcmVldGluZyA9IG5ldyBIZWxsb1dvcmxkKCkgeworICAgICAqICAgICBTdHJpbmcgbmFtZSA9ICJ0b3V0IGxlIG1vbmRlIjsKKyAgICAgKgorICAgICAqICAgICBwdWJsaWMgdm9pZCBncmVldCgpIHsKKyAgICAgKiAgICAgICAgIGdyZWV0U29tZW9uZSgidG91dCBsZSBtb25kZSIpOworICAgICAqICAgICB9CisgICAgICoKKyAgICAgKiAgICAgcHVibGljIHZvaWQgZ3JlZXRTb21lb25lKFN0cmluZyBzb21lb25lKSB7CisgICAgICogICAgICAgICBuYW1lID0gc29tZW9uZTsKKyAgICAgKiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2FsdXQgIiArIG5hbWUpOworICAgICAqICAgICB9CisgICAgICogfTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNBbm9ueW1vdXNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGRlZmF1bHQgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gYXNUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBhcyBhIENsYXNzRGVjbGFyYXRpb24gb3IgdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYXNDbGFzcygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIGNsYXNzIiwgdGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGlzIGFzIGEgSW50ZXJmYWNlRGVjbGFyYXRpb24gb3IgdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIGFzSW50ZXJmYWNlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGFuIGludGVyZmFjZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBhcyBhIEVudW1EZWNsYXJhdGlvbiBvciB0aHJvdyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkRW51bURlY2xhcmF0aW9uIGFzRW51bSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhbiBlbnVtIiwgdGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGlzIGFzIGEgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIG9yIHRocm93IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqLworICAgIGRlZmF1bHQgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgdHlwZSBwYXJhbWV0ZXIiLCB0aGlzKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBhc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSByZWZlcmVuY2UgdHlwZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBuYW1lIG9mIHRoZSB0eXBlLgorICAgICAqLworICAgIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzKGVzKSB3cmFwcGluZyB0aGlzIHR5cGUuCisgICAgICovCisgICAgU3RyaW5nIGdldENsYXNzTmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIGRlY2xhcmVkLgorICAgICAqLworICAgIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSUQgY29ycmVzcG9uZHMgbW9zdCBvZiB0aGUgdHlwZSB0byB0aGUgcXVhbGlmaWVkIG5hbWUuIEl0IGRpZmZlcnMgb25seSBmb3IgbG9jYWwKKyAgICAgKiBjbGFzc2VzIHdoaWNoIGRvIG5vdCBoYXZlIGEgcXVhbGlmaWVkIG5hbWUgYnV0IGhhdmUgYW4gSUQuCisgICAgICovCisgICAgZGVmYXVsdCBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIFN0cmluZyBxbmFtZSA9IGdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgaWYgKHFuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCI8bG9jYWxDbGFzcz46JXMiLCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxbmFtZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzMjZkYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnM7CisKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBEZWNsYXJhdGlvbiBvZiBhIHR5cGUgcGFyYW1ldGVyLgorICogRm9yIGV4YW1wbGU6CisgKiA8cD4KKyAqIGNsYXNzIEEmbHQ7RSBleHRlbmRzIFN0cmluZyZndDt7fQorICogPC9wPgorICogPHA+CisgKiBJbiB0aGlzIGNhc2UgPGI+RTwvYj4gd291bGQgYmUgYSB0eXBlIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBleHRlbmRzIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIHsKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlIGEgVHlwZVBhcmFtZXRlciBkZWZpbmVkIG9uIGEgVHlwZSB3aXRoIHRoZSBnaXZlbiBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBvblR5cGUoZmluYWwgU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc1FOYW1lLCBMaXN0PEJvdW5kPiBib3VuZHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkT25UeXBlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkT25NZXRob2QoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkT25Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc1FOYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVySWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzUU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxCb3VuZD4gZ2V0Qm91bmRzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBib3VuZHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlR5cGVQYXJhbWV0ZXIgb25UeXBlICIgKyBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogSXMgdGhlIHR5cGUgcGFyYW1ldGVyIGJlZW4gZGVmaW5lZCBvbiBhIHR5cGU/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGRlY2xhcmVkT25UeXBlKCkgeworICAgICAgICByZXR1cm4gKGdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZSB0eXBlIHBhcmFtZXRlciBiZWVuIGRlZmluZWQgb24gYSBtZXRob2Q/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGRlY2xhcmVkT25NZXRob2QoKSB7CisgICAgICAgIHJldHVybiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgdHlwZSBwYXJhbWV0ZXIgYmVlbiBkZWZpbmVkIG9uIGEgY29uc3RydWN0b3I/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGRlY2xhcmVkT25Db25zdHJ1Y3RvcigpIHsKKyAgICAgICAgcmV0dXJuIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgdHlwZSBib3VuZChzKS4KKyAgICAgKiBUaGlzIGlzIHVuc3VwcG9ydGVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gcGFja2FnZSBmb3IgYSBUeXBlIFBhcmFtZXRlciwgb25seSBmb3IgaXRzIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzKGVzKSB3cmFwcGluZyB0aGUgdHlwZSBib3VuZChzKS4KKyAgICAgKiBUaGlzIGlzIHVuc3VwcG9ydGVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gY2xhc3MgZm9yIGEgVHlwZSBQYXJhbWV0ZXIsIG9ubHkgZm9yIGl0cyBjb250YWluZXIuCisgICAgICovCisgICAgZGVmYXVsdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFR5cGUgUGFyYW1ldGVyLgorICAgICAqIEl0IGlzIGNvbXBvc2VkIGJ5IHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY29udGFpbmVyIGZvbGxvd2VkIGJ5IGEgZG90IGFuZCB0aGUgbmFtZSBvZiB0aGUgVHlwZSBQYXJhbWV0ZXIuCisgICAgICogVGhlIHF1YWxpZmllZCBuYW1lIG9mIGEgbWV0aG9kIGlzIGl0cyBxdWFsaWZpZWQgc2lnbmF0dXJlLgorICAgICAqLworICAgIGRlZmF1bHQgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIGdldENvbnRhaW5lcklkKCksIGdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgU3RyaW5nIGdldENvbnRhaW5lclF1YWxpZmllZE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBJRCBvZiB0aGUgY29udGFpbmVyLiBTZWUgVHlwZUNvbnRhaW5lci5nZXRJZAorICAgICAqLworICAgIFN0cmluZyBnZXRDb250YWluZXJJZCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBUeXBlUGFyYW1ldHJpemFibGUgb2YgdGhlIGNvbnRhaW5lci4gQ2FuIGJlIGVpdGhlciBhIFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvciBhIE1ldGhvZExpa2VEZWNsYXJhdGlvbgorICAgICAqLworICAgIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIGdldENvbnRhaW5lcigpOworCisgICAgLyoqCisgICAgICogVGhlIGJvdW5kcyBzcGVjaWZpZWQgZm9yIHRoZSB0eXBlIHBhcmFtZXRlci4KKyAgICAgKiBGb3IgZXhhbXBsZToKKyAgICAgKiAiZXh0ZW5kcyBBIiBvciAic3VwZXIgQiIKKyAgICAgKi8KKyAgICBMaXN0PEJvdW5kPiBnZXRCb3VuZHMoKTsKKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgdHlwZSBwYXJhbWV0ZXIgYSBsb3dlciBib3VuZD8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaGFzTG93ZXJCb3VuZCgpIHsKKyAgICAgICAgZm9yIChCb3VuZCBiIDogZ2V0Qm91bmRzKCkpIHsKKyAgICAgICAgICAgIGlmIChiLmlzRXh0ZW5kcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgdHlwZSBwYXJhbWV0ZXIgYW4gdXBwZXIgYm91bmQ/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGhhc1VwcGVyQm91bmQoKSB7CisgICAgICAgIGZvciAoQm91bmQgYiA6IGdldEJvdW5kcygpKSB7CisgICAgICAgICAgICBpZiAoYi5pc1N1cGVyKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlIHVzZWQgYXMgbG93ZXIgYm91bmQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBsb3dlciBib3VuZAorICAgICAqLworICAgIGRlZmF1bHQgUmVzb2x2ZWRUeXBlIGdldExvd2VyQm91bmQoKSB7CisgICAgICAgIGZvciAoQm91bmQgYiA6IGdldEJvdW5kcygpKSB7CisgICAgICAgICAgICBpZiAoYi5pc0V4dGVuZHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBiLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlIHVzZWQgYXMgdXBwZXIgYm91bmQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyB1cHBlciBib3VuZAorICAgICAqLworICAgIGRlZmF1bHQgUmVzb2x2ZWRUeXBlIGdldFVwcGVyQm91bmQoKSB7CisgICAgICAgIGZvciAoQm91bmQgYiA6IGdldEJvdW5kcygpKSB7CisgICAgICAgICAgICBpZiAoYi5pc1N1cGVyKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYi5nZXRUeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgQm91bmQgb24gYSBUeXBlIFBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBjbGFzcyBCb3VuZCB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBleHRlbmRzQm91bmQ7CisgICAgICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHR5cGU7CisKKyAgICAgICAgcHJpdmF0ZSBCb3VuZChib29sZWFuIGV4dGVuZHNCb3VuZCwgUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0ZW5kc0JvdW5kID0gZXh0ZW5kc0JvdW5kOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gZXh0ZW5kcyBib3VuZCB3aXRoIHRoZSBnaXZlbiB0eXBlOgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogZXh0ZW5kcyAiZ2l2ZW4gdHlwZSIKKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBCb3VuZCBleHRlbmRzQm91bmQoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQm91bmQodHJ1ZSwgdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgc3VwZXIgYm91bmQgd2l0aCB0aGUgZ2l2ZW4gdHlwZToKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIHN1cGVyICJnaXZlbiB0eXBlIgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEJvdW5kIHN1cGVyQm91bmQoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQm91bmQoZmFsc2UsIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdHlwZSB1c2VkIGluIHRoZSBCb3VuZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIHRoaXMgYW4gZXh0ZW5kcyBib3VuZD8KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5kcygpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRlbmRzQm91bmQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSXMgdGhpcyBhIHN1cGVyIGJvdW5kPworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAhaXNFeHRlbmRzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQm91bmR7IiArCisgICAgICAgICAgICAgICAgICAgICJleHRlbmRzQm91bmQ9IiArIGV4dGVuZHNCb3VuZCArCisgICAgICAgICAgICAgICAgICAgICIsIHR5cGU9IiArIHR5cGUgKworICAgICAgICAgICAgICAgICAgICAnfSc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgQm91bmQgYm91bmQgPSAoQm91bmQpIG87CisKKyAgICAgICAgICAgIGlmIChleHRlbmRzQm91bmQgIT0gYm91bmQuZXh0ZW5kc0JvdW5kKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHlwZSAhPSBudWxsID8gdHlwZS5lcXVhbHMoYm91bmQudHlwZSkgOiBib3VuZC50eXBlID09IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAoZXh0ZW5kc0JvdW5kID8gMSA6IDApOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodHlwZSAhPSBudWxsID8gdHlwZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL2RlY2xhcmF0aW9ucy9SZXNvbHZlZFR5cGVQYXJhbWV0cml6YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmI5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQW4gZW50aXR5IHdoaWNoIGhhcyB0eXBlIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZFR5cGVQYXJhbWV0cml6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiB0eXBlIHBhcmFtZXRlcnMgZGVmaW5lZCBvbiB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGNsb3Nlc3QgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICogSXQgZmlyc3QgbG9vayBvbiB0aGlzIGVsZW1lbnQgaXRzZWxmIGFuZCB0aGVuIG9uIHRoZSBjb250YWluZXJzLgorICAgICAqLworICAgIE9wdGlvbmFsPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBmaW5kVHlwZVBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNHZW5lcmljKCkgeworICAgICAgICByZXR1cm4gIWdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkVmFsdWVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vZGVjbGFyYXRpb25zL1Jlc29sdmVkVmFsdWVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjIzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi9kZWNsYXJhdGlvbnMvUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zOworCisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKKy8qKgorICogRGVjbGFyYXRpb24gb2YgYSB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24gZXh0ZW5kcyBSZXNvbHZlZERlY2xhcmF0aW9uIHsKKworICAgIC8qKgorICAgICAqIFR5cGUgb2YgdGhlIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIFJlc29sdmVkVHlwZSBnZXRUeXBlKCk7CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkQXJyYXlUeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZEFycmF5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDIyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZEFycmF5VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQXJyYXkgVHlwZS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFJlc29sdmVkQXJyYXlUeXBlIGltcGxlbWVudHMgUmVzb2x2ZWRUeXBlIHsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIGJhc2VUeXBlOworCisgICAgcHVibGljIFJlc29sdmVkQXJyYXlUeXBlKFJlc29sdmVkVHlwZSBiYXNlVHlwZSkgeworICAgICAgICB0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIE9iamVjdCBtZXRob2RzCisgICAgLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSZXNvbHZlZEFycmF5VHlwZSB0aGF0ID0gKFJlc29sdmVkQXJyYXlUeXBlKSBvOworCisgICAgICAgIGlmICghYmFzZVR5cGUuZXF1YWxzKHRoYXQuYmFzZVR5cGUpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJSZXNvbHZlZEFycmF5VHlwZXsiICsgYmFzZVR5cGUgKyAifSI7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFR5cGUgbWV0aG9kcworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkQXJyYXlUeXBlIGFzQXJyYXlUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gYmFzZVR5cGUuZGVzY3JpYmUoKSArICJbXSI7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRDb21wb25lbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gYmFzZVR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlci5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmIChiYXNlVHlwZS5pc1ByaW1pdGl2ZSgpICYmIG90aGVyLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmVxdWFscyhvdGhlci5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmFzZVR5cGUuaXNBc3NpZ25hYmxlQnkob3RoZXIuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpOworICAgICAgICB9IGVsc2UgaWYgKG90aGVyLmlzTnVsbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSByZXBsYWNlVHlwZVZhcmlhYmxlcyhSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cFRvUmVwbGFjZSwgUmVzb2x2ZWRUeXBlIHJlcGxhY2VkLCBNYXA8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gaW5mZXJyZWRUeXBlcykgeworICAgICAgICBSZXNvbHZlZFR5cGUgYmFzZVR5cGVSZXBsYWNlZCA9IGJhc2VUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwVG9SZXBsYWNlLCByZXBsYWNlZCwgaW5mZXJyZWRUeXBlcyk7CisgICAgICAgIGlmIChiYXNlVHlwZVJlcGxhY2VkID09IGJhc2VUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRBcnJheVR5cGUoYmFzZVR5cGVSZXBsYWNlZCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkSW50ZXJzZWN0aW9uVHlwZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRJbnRlcnNlY3Rpb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwOGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkSW50ZXJzZWN0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEFuIGludGVyc2VjdGlvbiB0eXBlIGlzIGRlZmluZWQgaW4gamF2YSBhcyBsaXN0IG9mIHR5cGVzIHNlcGFyYXRlcyBieSBhbXBlcnNhbmRzLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgUmVzb2x2ZWRJbnRlcnNlY3Rpb25UeXBlIGltcGxlbWVudHMgUmVzb2x2ZWRUeXBlIHsKKyAgICBwcml2YXRlIExpc3Q8UmVzb2x2ZWRUeXBlPiBlbGVtZW50czsKKworICAgIHB1YmxpYyBSZXNvbHZlZEludGVyc2VjdGlvblR5cGUoQ29sbGVjdGlvbjxSZXNvbHZlZFR5cGU+IGVsZW1lbnRzKSB7CisgICAgICAgIGlmIChlbGVtZW50cy5zaXplKCkgPCAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbiBpbnRlcnNlY3Rpb24gdHlwZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIFRoaXMgaGFzICIgKyBlbGVtZW50cy5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KGVsZW1lbnRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSZXNvbHZlZEludGVyc2VjdGlvblR5cGUgdGhhdCA9IChSZXNvbHZlZEludGVyc2VjdGlvblR5cGUpIG87CisKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oZWxlbWVudHMpLmVxdWFscyhuZXcgSGFzaFNldDw+KHRoYXQuZWxlbWVudHMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8PihlbGVtZW50cykuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmpvaW4oIiAmICIsIGVsZW1lbnRzLnN0cmVhbSgpLm1hcChSZXNvbHZlZFR5cGU6OmRlc2NyaWJlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnN0cmVhbSgpLmFsbE1hdGNoKGUgLT4gZS5pc0Fzc2lnbmFibGVCeShvdGhlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgcmVwbGFjZVR5cGVWYXJpYWJsZXMoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAsIFJlc29sdmVkVHlwZSByZXBsYWNlZCwgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IGluZmVycmVkVHlwZXMpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGVsZW1lbnRzUmVwbGFjZWQgPSBlbGVtZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5tYXAoZSAtPiBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCByZXBsYWNlZCwgaW5mZXJyZWRUeXBlcykpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGlmIChlbGVtZW50c1JlcGxhY2VkLmVxdWFscyhlbGVtZW50cykpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEludGVyc2VjdGlvblR5cGUoZWxlbWVudHNSZXBsYWNlZCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNkNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRMYW1iZGFDb25zdHJhaW50VHlwZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzOworCitwdWJsaWMgY2xhc3MgUmVzb2x2ZWRMYW1iZGFDb25zdHJhaW50VHlwZSBpbXBsZW1lbnRzIFJlc29sdmVkVHlwZSB7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgYm91bmQ7CisKKyAgICBwcml2YXRlIFJlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUoUmVzb2x2ZWRUeXBlIGJvdW5kKSB7CisgICAgICAgIHRoaXMuYm91bmQgPSBib3VuZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gIj8gc3VwZXIgIiArIGJvdW5kLmRlc2NyaWJlKCk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRCb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIGJvdW5kOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3RyYWludCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUgYXNDb25zdHJhaW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZExhbWJkYUNvbnN0cmFpbnRUeXBlIGJvdW5kKFJlc29sdmVkVHlwZSBib3VuZCl7CisgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRMYW1iZGFDb25zdHJhaW50VHlwZShib3VuZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKSB7CisgICAgICAgIHJldHVybiBib3VuZC5pc0Fzc2lnbmFibGVCeShvdGhlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJMYW1iZGFDb25zdHJhaW50VHlwZXsiICsKKyAgICAgICAgICAgICAgICAiYm91bmQ9IiArIGJvdW5kICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkUHJpbWl0aXZlVHlwZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRQcmltaXRpdmVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3ZTI5MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkUHJpbWl0aXZlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgZW51bSBSZXNvbHZlZFByaW1pdGl2ZVR5cGUgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGUgeworCisKKyAgICBCWVRFKCJieXRlIiwgQnl0ZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKSwKKyAgICBTSE9SVCgic2hvcnQiLCBTaG9ydC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQllURSkpLAorICAgIENIQVIoImNoYXIiLCBDaGFyYWN0ZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSksCisgICAgSU5UKCJpbnQiLCBJbnRlZ2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgQXJyYXlzLmFzTGlzdChCWVRFLCBTSE9SVCwgQ0hBUikpLAorICAgIExPTkcoImxvbmciLCBMb25nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgQXJyYXlzLmFzTGlzdChCWVRFLCBTSE9SVCwgSU5ULCBDSEFSKSksCisgICAgQk9PTEVBTigiYm9vbGVhbiIsIEJvb2xlYW4uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSksCisgICAgRkxPQVQoImZsb2F0IiwgRmxvYXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBBcnJheXMuYXNMaXN0KExPTkcsIElOVCwgU0hPUlQsIEJZVEUsIENIQVIpKSwKKyAgICBET1VCTEUoImRvdWJsZSIsIERvdWJsZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIEFycmF5cy5hc0xpc3QoRkxPQVQsIExPTkcsIElOVCwgU0hPUlQsIEJZVEUsIENIQVIpKTsKKworICAgIC8vLworICAgIC8vLyBGaWVsZHMKKyAgICAvLy8KKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYm94VHlwZVFOYW1lOworICAgIHByaXZhdGUgTGlzdDxSZXNvbHZlZFByaW1pdGl2ZVR5cGU+IHByb21vdGlvblR5cGVzOworCisgICAgcHJpdmF0ZSBSZXNvbHZlZFByaW1pdGl2ZVR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBib3hUeXBlUU5hbWUsIExpc3Q8UmVzb2x2ZWRQcmltaXRpdmVUeXBlPiBwcm9tb3Rpb25UeXBlcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmJveFR5cGVRTmFtZSA9IGJveFR5cGVRTmFtZTsKKyAgICAgICAgdGhpcy5wcm9tb3Rpb25UeXBlcyA9IHByb21vdGlvblR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRUeXBlIGJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBmb3IgKFJlc29sdmVkUHJpbWl0aXZlVHlwZSBwdHUgOiB2YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKHB0dS5kZXNjcmliZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwdHU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSAiICsgbmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJQcmltaXRpdmVUeXBlVXNhZ2V7IiArCisgICAgICAgICAgICAgICAgIm5hbWU9JyIgKyBuYW1lICsgJ1wnJyArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFByaW1pdGl2ZVR5cGUgYXNQcmltaXRpdmUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBkZXNjcmliZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHByb21vdGlvblR5cGVzLmNvbnRhaW5zKG90aGVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChvdGhlci5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgaWYgKG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYm94VHlwZVFOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChSZXNvbHZlZFByaW1pdGl2ZVR5cGUgcHJvbW90aW9uIDogcHJvbW90aW9uVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXIuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhwcm9tb3Rpb24uYm94VHlwZVFOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAob3RoZXIuaXNDb25zdHJhaW50KCkpeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNBc3NpZ25hYmxlQnkob3RoZXIuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRCb3hUeXBlUU5hbWUoKSB7CisgICAgICAgIHJldHVybiBib3hUeXBlUU5hbWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFJlZmVyZW5jZVR5cGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkUmVmZXJlbmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFJlZmVyZW5jZVR5cGUuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbi5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbi5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbi5SZXNvbHZlZFR5cGVQYXJhbWV0cml6ZWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQSBSZWZlcmVuY2VUeXBlIGxpa2UgYSBjbGFzcywgYW4gaW50ZXJmYWNlIG9yIGFuIGVudW0uIE5vdGUgdGhhdCB0aGlzIHR5cGUgY2FuIGNvbnRhaW4gYWxzbyB0aGUgdmFsdWVzCisgKiBzcGVjaWZpZWQgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGUsCisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRyaXplZCwgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlciB7CisKKyAgICAvLworICAgIC8vIEZpZWxkcworICAgIC8vCisKKyAgICBwcm90ZWN0ZWQgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOworICAgIHByb3RlY3RlZCBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwIHR5cGVQYXJhbWV0ZXJzTWFwOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgdGhpcyh0eXBlRGVjbGFyYXRpb24sIGRlcml2ZVBhcmFtcyh0eXBlRGVjbGFyYXRpb24pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbi5pc1R5cGVQYXJhbWV0ZXIoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWW91IHNob3VsZCB1c2Ugb25seSBDbGFzc2VzLCBJbnRlcmZhY2VzIGFuZCBlbnVtcyIpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDAgJiYgdHlwZUFyZ3VtZW50cy5zaXplKCkgIT0gdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBlaXRoZXIgemVybyB0eXBlIGFyZ3VtZW50cyBvciBoYXMgbWFueSBhcyBkZWZpbmVkIGluIHRoZSBkZWNsYXJhdGlvbiAoJWQpLiBGb3VuZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSwgdHlwZUFyZ3VtZW50cy5zaXplKCkpKTsKKyAgICAgICAgfQorICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwLkJ1aWxkZXIgdHlwZVBhcmFtZXRlcnNNYXBCdWlsZGVyID0gbmV3IFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAuQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzTWFwQnVpbGRlci5zZXRWYWx1ZSh0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoaSksIHR5cGVBcmd1bWVudHMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzTWFwID0gdHlwZVBhcmFtZXRlcnNNYXBCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIHRoaXMudHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uOworICAgIH0KKworICAgIC8vCisgICAgLy8gUHVibGljIE9iamVjdCBtZXRob2RzCisgICAgLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSB0aGF0ID0gKFJlc29sdmVkUmVmZXJlbmNlVHlwZSkgbzsKKworICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5lcXVhbHModGhhdC50eXBlRGVjbGFyYXRpb24pKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdHlwZVBhcmFtZXRlcnNNYXAuZXF1YWxzKHRoYXQudHlwZVBhcmFtZXRlcnNNYXApKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHR5cGVEZWNsYXJhdGlvbi5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHR5cGVQYXJhbWV0ZXJzTWFwLmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJSZWZlcmVuY2VUeXBleyIgKyBnZXRRdWFsaWZpZWROYW1lKCkgKworICAgICAgICAgICAgICAgICIsIHR5cGVQYXJhbWV0ZXJzTWFwPSIgKyB0eXBlUGFyYW1ldGVyc01hcCArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBSZWxhdGlvbiB3aXRoIG90aGVyIHR5cGVzCisgICAgLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBEb3duY2FzdGluZworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBOYW1pbmcKKyAgICAvLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpYmUoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoaGFzTmFtZSgpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQodHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjxhbm9ueW1vdXMgY2xhc3M+Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyc01hcCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCI8Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmpvaW4oIiwgIiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcCh0cCAtPiB0eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHRwKS5kZXNjcmliZSgpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI+Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFR5cGVQYXJhbWV0ZXJzCisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgdHJhbnNmb3JtYXRpb24gb24gYWxsIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhpcyBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXNvbHZlZFR5cGUgdHJhbnNmb3JtVHlwZVBhcmFtZXRlcnMoUmVzb2x2ZWRUeXBlVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSByZXBsYWNlVHlwZVZhcmlhYmxlcyhSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cFRvUmVwbGFjZSwgUmVzb2x2ZWRUeXBlIHJlcGxhY2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPiBpbmZlcnJlZFR5cGVzKSB7CisgICAgICAgIGlmIChyZXBsYWNlZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgcmVzdWx0ID0gdGhpczsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFJlc29sdmVkVHlwZSB0cCA6IHRoaXMudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHRyYW5zZm9ybWVkVHAgPSB0cC5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cFRvUmVwbGFjZSwgcmVwbGFjZWQsIGluZmVycmVkVHlwZXMpOworICAgICAgICAgICAgLy8gSWRlbnRpdHkgY29tcGFyaXNvbiBvbiBwdXJwb3NlCisgICAgICAgICAgICBpZiAodHAuaXNUeXBlVmFyaWFibGUoKSAmJiB0cC5hc1R5cGVWYXJpYWJsZSgpLmRlc2NyaWJlKCkuZXF1YWxzKHRwVG9SZXBsYWNlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBpbmZlcnJlZFR5cGVzLnB1dCh0cC5hc1R5cGVQYXJhbWV0ZXIoKSwgcmVwbGFjZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUUKKyAgICAgICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbWV0ZXJzQ29ycmVjdGVkID0gcmVzdWx0LmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCk7CisgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnNDb3JyZWN0ZWQuc2V0KGksIHRyYW5zZm9ybWVkVHApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZSh0eXBlRGVjbGFyYXRpb24sIHR5cGVQYXJhbWV0ZXJzQ29ycmVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiB2YWx1ZXMgPSByZXN1bHQudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKTsKKyAgICAgICAgLy8gRklYTUUKKyAgICAgICAgaWYodmFsdWVzLmNvbnRhaW5zKHRwVG9SZXBsYWNlKSl7CisgICAgICAgICAgICBpbnQgaW5kZXggPSB2YWx1ZXMuaW5kZXhPZih0cFRvUmVwbGFjZSk7CisgICAgICAgICAgICB2YWx1ZXMuc2V0KGluZGV4LCByZXBsYWNlZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlKHJlc3VsdC5nZXRUeXBlRGVjbGFyYXRpb24oKSwgdmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIEFzc2lnbmFiaWxpdHkKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBUaGlzVHlwZSB0ID0gbmV3IE90aGVyVHlwZSgpIHdvdWxkIGNvbXBpbGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKTsKKworICAgIC8vLworICAgIC8vLyBBbmNlc3RvcnMKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgYW5jZXN0b3JzLCB0aGF0IG1lYW5zIGFsbCBzdXBlcmNsYXNzZXMgYW5kIGludGVyZmFjZXMuCisgICAgICogVGhpcyBsaXN0IHNob3VsZCBhbHdheXMgaW5jbHVkZSBPYmplY3QgKHVubGVzcyB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIE9iamVjdCkuCisgICAgICogVGhlIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiB0aGlzIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMuCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIGdpdmVuOgorICAgICAqIDxwPgorICAgICAqIGNsYXNzIEZvbyZsdDtBLCBCJmd0OyB7fQorICAgICAqIGNsYXNzIEJhciZsdDtDJmd0OyBleHRlbmRzIEZvbyZsdDtDLCBTdHJpbmcmZ3Q7IHt9CisgICAgICogPHA+CisgICAgICogYSBjYWxsIHRvIGdldEFsbEFuY2VzdG9ycyBvbiBhIHJlZmVyZW5jZSB0byBCYXIgaGF2aW5nIHR5cGUgcGFyYW1ldGVyIEJvb2xlYW4gc2hvdWxkIGluY2x1ZGUKKyAgICAgKiBGb28mbHQ7Qm9vbGVhbiwgU3RyaW5nJmd0Oy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFsbEFuY2VzdG9ycygpOworCisgICAgcHVibGljIGZpbmFsIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbGxJbnRlcmZhY2VzQW5jZXN0b3JzKCkgeworICAgICAgICByZXR1cm4gZ2V0QWxsQW5jZXN0b3JzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGl0IC0+IGl0LmdldFR5cGVEZWNsYXJhdGlvbigpLmlzSW50ZXJmYWNlKCkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbGxDbGFzc2VzQW5jZXN0b3JzKCkgeworICAgICAgICByZXR1cm4gZ2V0QWxsQW5jZXN0b3JzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGl0IC0+IGl0LmdldFR5cGVEZWNsYXJhdGlvbigpLmlzQ2xhc3MoKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVHlwZSBwYXJhbWV0ZXJzCisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIHBhcmFtZXRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqIEl0IHJldHVybnMgT3B0aW9uYWwuZW1wdHkgdW5sZXNzIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGRlY2xhcmVzIGEgdHlwZSBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBnZXRHZW5lcmljUGFyYW1ldGVyQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgaWYgKHRwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcy50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHRwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZXMgZm9yIGFsbCB0eXBlIHBhcmFtZXRlcnMgZGVjbGFyZWQgb24gdGhpcyB0eXBlLgorICAgICAqIFRoZSBsaXN0IGNhbiBiZSBlbXB0eSBmb3IgcmF3IHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVQYXJhbWV0ZXJzTWFwLmlzRW1wdHkoKSA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHRwIC0+IHR5cGVQYXJhbWV0ZXJzTWFwLmdldFZhbHVlKHRwKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlcyBmb3IgYWxsIHR5cGUgcGFyYW1ldGVycyBkZWNsYXJlZCBvbiB0aGlzIHR5cGUuCisgICAgICogSW4gY2FzZSBvZiByYXcgdHlwZXMgdGhlIHZhbHVlcyBjb3JyZXNwb25kIHRvIFR5cGVWYXJpYWJsZXMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFpcjxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPj4gZ2V0VHlwZVBhcmFtZXRlcnNNYXAoKSB7CisgICAgICAgIExpc3Q8UGFpcjxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPj4gdHlwZVBhcmFtZXRlcnNNYXAgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaWYgKCFpc1Jhd1R5cGUoKSkgeworCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCk7IGkrKykgeworCSAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzTWFwLmFkZChuZXcgUGFpcjw+KHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSwgdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSkpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZVBhcmFtZXRlcnNNYXA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAgdHlwZVBhcmFtZXRlcnNNYXAoKSB7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyc01hcDsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gT3RoZXIgbWV0aG9kcyBpbnRyb2R1Y2VkIGJ5IFJlZmVyZW5jZVR5cGUKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIENvcnJlc3BvbmRpbmcgVHlwZURlY2xhcmF0aW9uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZmllbGQgY291bGQgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbiB0aGUgY29ycmVzcG9uZGluZyBGaWVsZERlY2xhcmF0aW9uIGJlY2F1c2UKKyAgICAgKiB0eXBlIHZhcmlhYmxlcyB3b3VsZCBiZSBzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gZ2V0RmllbGRUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICghdHlwZURlY2xhcmF0aW9uLmhhc0ZpZWxkKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IHR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZChuYW1lKS5nZXRUeXBlKCk7CisgICAgICAgIHR5cGUgPSB1c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZSh0eXBlKTsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgVHlwZURlY2xhcmF0aW9uIGEgbmFtZT8gQW5vbnltb3VzIGNsYXNzZXMgZG8gbm90IGhhdmUgb25lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7CisgICAgICAgIHJldHVybiB0eXBlRGVjbGFyYXRpb24uaGFzTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1YWxpZmllZCBuYW1lIG9mIHRoZSBkZWNsYXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0eXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElkIG9mIHRoZSBkZWNsYXJhdGlvbi4gSXQgY29ycmVzcG9uZHMgdG8gdGhlIHF1YWxpZmllZCBuYW1lLCB1bmxlc3MgZm9yIGxvY2FsIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5nZXRJZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZHMgZGVjbGFyZWQgb24gdGhpcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTZXQ8TWV0aG9kVXNhZ2U+IGdldERlY2xhcmVkTWV0aG9kcygpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNSYXdUeXBlKCkgeworICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzTWFwKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogdHlwZVBhcmFtZXRlcnNNYXAoKS5nZXROYW1lcygpKSB7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiB2YWx1ZSA9IHR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuaXNQcmVzZW50KCkgJiYgdmFsdWUuZ2V0KCkuaXNUeXBlVmFyaWFibGUoKSAmJiB2YWx1ZS5nZXQoKS5hc1R5cGVWYXJpYWJsZSgpLnF1YWxpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtVmFsdWUoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB7CisgICAgICAgIGlmICh0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPbk1ldGhvZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHR5cGVJZCA9IHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0SWQoKTsKKyAgICAgICAgaWYgKHR5cGVJZC5lcXVhbHModHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldENvbnRhaW5lcklkKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGhpcy50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikpOworICAgICAgICB9CisgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yIDogdGhpcy5nZXRBbGxBbmNlc3RvcnMoKSkgeworICAgICAgICAgICAgaWYgKGFuY2VzdG9yLmdldElkKCkuZXF1YWxzKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRDb250YWluZXJJZCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXNvbHZlZFR5cGUgdG9SYXdUeXBlKCk7CisKKyAgICAvLworICAgIC8vIFByb3RlY3RlZCBtZXRob2RzCisgICAgLy8KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgY3JlYXRlKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbWV0ZXJzKTsKKworICAgIHByb3RlY3RlZCBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgY3JlYXRlKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcCB0eXBlUGFyYW1ldGVyc01hcCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKHR5cGVEZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKHR5cGVQYXJhbWV0ZXJzTWFwOjpnZXRWYWx1ZSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlc29sdmVkUmVmZXJlbmNlVHlwZSBjcmVhdGUoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ycmVzcG9uZGluZ0JveGluZ1R5cGUoU3RyaW5nIHR5cGVOYW1lKSB7CisgICAgICAgIHN3aXRjaCAodHlwZU5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEJvb2xlYW4uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIGNhc2UgImNoYXIiOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKENoYXJhY3Rlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgY2FzZSAiYnl0ZSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoQnl0ZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgY2FzZSAic2hvcnQiOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNob3J0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICBjYXNlICJpbnQiOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEludGVnZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIGNhc2UgImxvbmciOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKExvbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIGNhc2UgImZsb2F0IjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhGbG9hdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgY2FzZSAiZG91YmxlIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhEb3VibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHR5cGVOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVDb25zaWRlcmluZ1R5cGVQYXJhbWV0ZXJzKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIuZXF1YWxzKHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmlzUmF3VHlwZSgpIHx8IG90aGVyLmlzUmF3VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSAhPSBvdGhlci50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0aGlzUGFyYW0gPSB0eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgb3RoZXJQYXJhbSA9IG90aGVyLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICghdGhpc1BhcmFtLmVxdWFscyhvdGhlclBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1BhcmFtIGluc3RhbmNlb2YgUmVzb2x2ZWRXaWxkY2FyZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRXaWxkY2FyZCB0aGlzUGFyYW1Bc1dpbGRjYXJkID0gKFJlc29sdmVkV2lsZGNhcmQpIHRoaXNQYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzUGFyYW1Bc1dpbGRjYXJkLmlzU3VwZXIoKSAmJiBvdGhlclBhcmFtLmlzQXNzaWduYWJsZUJ5KHRoaXNQYXJhbUFzV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvaworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzUGFyYW1Bc1dpbGRjYXJkLmlzRXh0ZW5kcygpICYmIHRoaXNQYXJhbUFzV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKS5pc0Fzc2lnbmFibGVCeShvdGhlclBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzUGFyYW1Bc1dpbGRjYXJkLmlzQm91bmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNQYXJhbSBpbnN0YW5jZW9mIFJlc29sdmVkVHlwZVZhcmlhYmxlICYmIG90aGVyUGFyYW0gaW5zdGFuY2VvZiBSZXNvbHZlZFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiB0aGlzQm91bmRzID0gdGhpc1BhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKCkuc3RyZWFtKCkubWFwKGJvdW5kIC0+IGJvdW5kLmdldFR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gb3RoZXJCb3VuZHMgPSBvdGhlclBhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKCkuc3RyZWFtKCkubWFwKGJvdW5kIC0+IGJvdW5kLmdldFR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc0JvdW5kcy5zaXplKCkgPT0gb3RoZXJCb3VuZHMuc2l6ZSgpICYmIG90aGVyQm91bmRzLmNvbnRhaW5zQWxsKHRoaXNCb3VuZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFByaXZhdGUgbWV0aG9kcworICAgIC8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFJlc29sdmVkVHlwZT4gZGVyaXZlUGFyYW1zKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKCh0cCkgLT4gbmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKHRwKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGRlcml2ZVR5cGVQYXJhbWV0ZXJzKFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAgdHlwZVBhcmFtZXRlcnNNYXApOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRUeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzg3YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRUeXBlLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBIHJlc29sdmVkIHR5cGUuIEl0IGNvdWxkIGJlIGEgcHJpbWl0aXZlIHR5cGUgb3IgYSByZWZlcmVuY2UgdHlwZSAoZW51bSwgY2xhc3MsIGludGVyZmFjZSkuIEluIHRoZSBsYXRlciBjYXNlIGl0CisgKiBjb3VsZCB0YWtlIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgKG90aGVyIFR5cGVVc2FnZXMpLiBJdCBjb3VsZCBhbHNvIGJlIGEgVHlwZVZhcmlhYmxlLCBsaWtlIGluOgorICogPHA+CisgKiBjbGFzcyBBJmx0O0JndDsgeyB9CisgKiA8cD4KKyAqIHdoZXJlIEIgaXMgYSBUeXBlVmFyaWFibGUuIEl0IGNvdWxkIGFsc28gYmUgV2lsZGNhcmQgVHlwZSwgcG9zc2libHkgd2l0aCBjb25zdHJhaW50cy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZFR5cGUgeworCisgICAgLy8vCisgICAgLy8vIFJlbGF0aW9uIHdpdGggb3RoZXIgdHlwZXMKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyB0eXBlIHJlcHJlc2VudCBhbiBhcnJheT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlZmF1bHQgaW50IGFycmF5TGV2ZWwoKSB7CisgICAgICAgIGlmIChpc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAxICsgdGhpcy5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5hcnJheUxldmVsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYSBwcmltaXRpdmUgdHlwZT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHRoZSBudWxsIHR5cGU/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYSB1bmlvbiB0eXBlIChhcyB0aGUgb25lcyB1c2VkIGluIG11bHRpIGNhdGNoIGNsYXVzZXMpPworICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1VuaW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYSBub24gcHJpbWl0aXZlIHZhbHVlPworICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1JlZmVyZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlVHlwZSgpIHx8IGlzQXJyYXkoKSB8fCBpc1R5cGVWYXJpYWJsZSgpIHx8IGlzTnVsbCgpIHx8IGlzV2lsZGNhcmQoKSB8fCBpc1VuaW9uVHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYSBsYW1iZGEgY29uc3RyYWludCB0eXBlPworICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBpc0NvbnN0cmFpbnQoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLyoqCisgICAgICogQ2FuIHRoaXMgYmUgc2VlbiBhcyBhIFJlZmVyZW5jZVR5cGVVc2FnZT8KKyAgICAgKiBJbiBvdGhlciB3b3JkczogaXMgdGhpcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzLCBhbiBpbnRlcmZhY2Ugb3IgYW4gZW51bT8KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGVmYXVsdCBib29sZWFuIGlzVm9pZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1dpbGRjYXJkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIERvd25jYXN0aW5nCisgICAgLy8vCisKKyAgICBkZWZhdWx0IFJlc29sdmVkQXJyYXlUeXBlIGFzQXJyYXlUeXBlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGFuIEFycmF5IiwgdGhpcykpOworICAgIH0KKworICAgIGRlZmF1bHQgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFzUmVmZXJlbmNlVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIFJlZmVyZW5jZSBUeXBlIiwgdGhpcykpOworICAgIH0KKworICAgIGRlZmF1bHQgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgVHlwZSBwYXJhbWV0ZXIiLCB0aGlzKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBSZXNvbHZlZFR5cGVWYXJpYWJsZSBhc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIFR5cGUgdmFyaWFibGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUgYXNQcmltaXRpdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSBQcmltaXRpdmUgdHlwZSIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBkZWZhdWx0IFJlc29sdmVkV2lsZGNhcmQgYXNXaWxkY2FyZCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIFdpbGRjYXJkIiwgdGhpcykpOworICAgIH0KKworICAgIGRlZmF1bHQgUmVzb2x2ZWRMYW1iZGFDb25zdHJhaW50VHlwZSBhc0NvbnN0cmFpbnRUeXBlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgY29uc3RyYWludCB0eXBlIiwgdGhpcykpOworICAgIH0KKworICAgIGRlZmF1bHQgUmVzb2x2ZWRVbmlvblR5cGUgYXNVbmlvblR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSB1bmlvbiB0eXBlIiwgdGhpcykpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBOYW1pbmcKKyAgICAvLy8KKworICAgIFN0cmluZyBkZXNjcmliZSgpOworCisgICAgLy8vCisgICAgLy8vIFR5cGVQYXJhbWV0ZXJzCisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGFsbCB2YXJpYWJsZXMgcmVmZXJyaW5nIHRvIHRoZSBnaXZlbiBUeXBlUGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIEJ5IHJlcGxhY2luZyB0aGVzZSB2YWx1ZXMgSSBjb3VsZCBhbHNvIGluZmVyIHNvbWUgdHlwZSBlcXVpdmFsZW5jZS4KKyAgICAgKiBUaG9zZSB3b3VsZCBiZSBjb2xsZWN0ZWQgaW4gdGhlIGdpdmVuIG1hcC4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkVHlwZSByZXBsYWNlVHlwZVZhcmlhYmxlcyhSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCwgUmVzb2x2ZWRUeXBlIHJlcGxhY2VkLCBNYXA8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gaW5mZXJyZWRUeXBlcykgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGxpa2UgKHtAbGluayAjcmVwbGFjZVR5cGVWYXJpYWJsZXMoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZSwgTWFwKX0gYnV0IGlnbm9yZXMgdGhlIGluZmVycmVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkVHlwZSByZXBsYWNlVHlwZVZhcmlhYmxlcyhSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCwgUmVzb2x2ZWRUeXBlIHJlcGxhY2VkKSB7CisgICAgICAgIHJldHVybiByZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgcmVwbGFjZWQsIG5ldyBIYXNoTWFwPD4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGlzIHR5cGUgbWVudGlvbiBhdCBhbGwsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHRoZSBnaXZlbiB0eXBlIHBhcmFtZXRlcnM/CisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIG1lbnRpb24oTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBBc3NpZ25hYmlsaXR5CisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgVGhpc1R5cGUgdCA9IG5ldyBPdGhlclR5cGUoKSB3b3VsZCBjb21waWxlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRUeXBlVHJhbnNmb3JtZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkVHlwZVRyYW5zZm9ybWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlYWViZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkVHlwZVRyYW5zZm9ybWVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK0BGdW5jdGlvbmFsSW50ZXJmYWNlCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkVHlwZVRyYW5zZm9ybWVyIHsKKyAgICBSZXNvbHZlZFR5cGUgdHJhbnNmb3JtKFJlc29sdmVkVHlwZSB0eXBlKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkVHlwZVZhcmlhYmxlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFR5cGVWYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOTEwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFR5cGVWYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRnJvbSBKTFMgNC40OiBBIHR5cGUgdmFyaWFibGUgaXMgaW50cm9kdWNlZCBieSB0aGUgZGVjbGFyYXRpb24gb2YgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMgY2xhc3MsCisgKiBpbnRlcmZhY2UsIG1ldGhvZCwgb3IgY29uc3RydWN0b3IgKMKnOC4xLjIsIMKnOS4xLjIsIMKnOC40LjQsIMKnOC44LjQpLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgUmVzb2x2ZWRUeXBlVmFyaWFibGUgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGUgeworCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyOworCisgICAgcHVibGljIFJlc29sdmVkVHlwZVZhcmlhYmxlKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAgICAgdGhpcy50eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlR5cGVWYXJpYWJsZSB7IiArIHR5cGVQYXJhbWV0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIn0iOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZVBhcmFtZXRlci5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlVmFyaWFibGUgdGhhdCA9IChSZXNvbHZlZFR5cGVWYXJpYWJsZSkgbzsKKworICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpLmVxdWFscyh0aGF0LnR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodHlwZVBhcmFtZXRlci5kZWNsYXJlZE9uVHlwZSgpICE9IHRoYXQudHlwZVBhcmFtZXRlci5kZWNsYXJlZE9uVHlwZSgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0eXBlUGFyYW1ldGVyLmRlY2xhcmVkT25NZXRob2QoKSAhPSB0aGF0LnR5cGVQYXJhbWV0ZXIuZGVjbGFyZWRPbk1ldGhvZCgpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXIuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHJlcGxhY2VUeXBlVmFyaWFibGVzKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwVG9CZVJlcGxhY2VkLCBSZXNvbHZlZFR5cGUgcmVwbGFjZWQsIE1hcDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPiBpbmZlcnJlZFR5cGVzKSB7CisgICAgICAgIGlmKHRwVG9CZVJlcGxhY2VkLmdldE5hbWUoKS5lcXVhbHModGhpcy50eXBlUGFyYW1ldGVyLmdldE5hbWUoKSkpeworICAgICAgICAgICAgaW5mZXJyZWRUeXBlcy5wdXQodGhpcy5hc1R5cGVQYXJhbWV0ZXIoKSwgcmVwbGFjZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gdHlwZVBhcmFtZXRlci5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGFzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVZhcmlhYmxlIGFzVHlwZVZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlci5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpYmUoKS5lcXVhbHMob3RoZXIuZGVzY3JpYmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG1lbnRpb24oTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzLmNvbnRhaW5zKHR5cGVQYXJhbWV0ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkVW5pb25UeXBlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFVuaW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTM2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFVuaW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEEgdW5pb24gdHlwZSBpcyBkZWZpbmVkIGluIGphdmEgYXMgbGlzdCBvZiB0eXBlcyBzZXBhcmF0ZXMgYnkgcGlwZXMuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvbHZlZFVuaW9uVHlwZSBpbXBsZW1lbnRzIFJlc29sdmVkVHlwZSB7CisgICAgcHJpdmF0ZSBMaXN0PFJlc29sdmVkVHlwZT4gZWxlbWVudHM7CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRVbmlvblR5cGUoTGlzdDxSZXNvbHZlZFR5cGU+IGVsZW1lbnRzKSB7CisgICAgICAgIGlmIChlbGVtZW50cy5zaXplKCkgPCAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbiB1bmlvbiB0eXBlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cy4gVGhpcyBoYXMgIiArIGVsZW1lbnRzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oZWxlbWVudHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlc29sdmVkVW5pb25UeXBlIHRoYXQgPSAoUmVzb2x2ZWRVbmlvblR5cGUpIG87CisKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oZWxlbWVudHMpLmVxdWFscyhuZXcgSGFzaFNldDw+KHRoYXQuZWxlbWVudHMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8PihlbGVtZW50cykuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmpvaW4oIiB8ICIsIGVsZW1lbnRzLnN0cmVhbSgpLm1hcChSZXNvbHZlZFR5cGU6OmRlc2NyaWJlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnN0cmVhbSgpLmFsbE1hdGNoKGUgLT4gZS5pc0Fzc2lnbmFibGVCeShvdGhlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVW5pb25UeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRVbmlvblR5cGUgYXNVbmlvblR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkVm9pZFR5cGUuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkVm9pZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGYyMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRWb2lkVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzOworCisvKioKKyAqIFRoZSBzcGVjaWFsIHR5cGUgdm9pZC4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFJlc29sdmVkVm9pZFR5cGUgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVzb2x2ZWRUeXBlIElOU1RBTkNFID0gbmV3IFJlc29sdmVkVm9pZFR5cGUoKTsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRWb2lkVHlwZSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gInZvaWQiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSBvdGhlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkV2lsZGNhcmQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL1Jlc29sdmVkV2lsZGNhcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZkMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRXaWxkY2FyZC5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSB3aWxkY2FyZCBjYW4gYmU6CisgKiAtIHVuYm91bmRlZCAoPykKKyAqIC0gaGF2ZSBhIGxvd2VyIGJvdW5kICg/IHN1cGVyIE51bWJlcikKKyAqIC0gaGF2ZSBhbiB1cHBlciBib3VuZCAoPyBleHRlbmRzIE51bWJlcikKKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGJvdGggYSBsb3dlciBhbmQgYW4gdXBwZXIgYm91bmQgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFJlc29sdmVkV2lsZGNhcmQgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGUgeworCisgICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZFdpbGRjYXJkIFVOQk9VTkRFRCA9IG5ldyBSZXNvbHZlZFdpbGRjYXJkKG51bGwsIG51bGwpOworCisgICAgcHJpdmF0ZSBCb3VuZFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBib3VuZGVkVHlwZTsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRXaWxkY2FyZChCb3VuZFR5cGUgdHlwZSwgUmVzb2x2ZWRUeXBlIGJvdW5kZWRUeXBlKSB7CisgICAgICAgIGlmICh0eXBlID09IG51bGwgJiYgYm91bmRlZFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgYm91bmRlZFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuYm91bmRlZFR5cGUgPSBib3VuZGVkVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc29sdmVkV2lsZGNhcmQgc3VwZXJCb3VuZChSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkV2lsZGNhcmQoQm91bmRUeXBlLlNVUEVSLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc29sdmVkV2lsZGNhcmQgZXh0ZW5kc0JvdW5kKFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRXaWxkY2FyZChCb3VuZFR5cGUuRVhURU5EUywgdHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJXaWxkY2FyZFVzYWdleyIgKworICAgICAgICAgICAgICAgICJ0eXBlPSIgKyB0eXBlICsKKyAgICAgICAgICAgICAgICAiLCBib3VuZGVkVHlwZT0iICsgYm91bmRlZFR5cGUgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dpbGRjYXJkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRXaWxkY2FyZCBhc1dpbGRjYXJkKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBSZXNvbHZlZFdpbGRjYXJkKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlc29sdmVkV2lsZGNhcmQgdGhhdCA9IChSZXNvbHZlZFdpbGRjYXJkKSBvOworCisgICAgICAgIGlmIChib3VuZGVkVHlwZSAhPSBudWxsID8gIWJvdW5kZWRUeXBlLmVxdWFscyh0aGF0LmJvdW5kZWRUeXBlKSA6IHRoYXQuYm91bmRlZFR5cGUgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodHlwZSAhPSB0aGF0LnR5cGUpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gdHlwZSAhPSBudWxsID8gdHlwZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoYm91bmRlZFR5cGUgIT0gbnVsbCA/IGJvdW5kZWRUeXBlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIj8iOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQm91bmRUeXBlLlNVUEVSKSB7CisgICAgICAgICAgICByZXR1cm4gIj8gc3VwZXIgIiArIGJvdW5kZWRUeXBlLmRlc2NyaWJlKCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBCb3VuZFR5cGUuRVhURU5EUykgeworICAgICAgICAgICAgcmV0dXJuICI/IGV4dGVuZHMgIiArIGJvdW5kZWRUeXBlLmRlc2NyaWJlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3VwZXIoKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IEJvdW5kVHlwZS5TVVBFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZHMoKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IEJvdW5kVHlwZS5FWFRFTkRTOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzU3VwZXIoKSB8fCBpc0V4dGVuZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldEJvdW5kZWRUeXBlKCkgeworICAgICAgICBpZiAoYm91bmRlZFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBib3VuZGVkVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgb3RoZXIpIHsKKyAgICAgICAgaWYgKGJvdW5kZWRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vcmV0dXJuIG90aGVyLmlzUmVmZXJlbmNlVHlwZSgpICYmIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBCb3VuZFR5cGUuU1VQRVIpIHsKKyAgICAgICAgICAgIHJldHVybiBib3VuZGVkVHlwZS5pc0Fzc2lnbmFibGVCeShvdGhlcik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBCb3VuZFR5cGUuRVhURU5EUykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgcmVwbGFjZVR5cGVWYXJpYWJsZXMoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHBUb1JlcGxhY2UsIFJlc29sdmVkVHlwZSByZXBsYWNlZCwgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IGluZmVycmVkVHlwZXMpIHsKKyAgICAgICAgaWYgKHJlcGxhY2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm91bmRlZFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgUmVzb2x2ZWRUeXBlIGJvdW5kZWRUeXBlUmVwbGFjZWQgPSBib3VuZGVkVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cFRvUmVwbGFjZSwgcmVwbGFjZWQsIGluZmVycmVkVHlwZXMpOworICAgICAgICBpZiAoYm91bmRlZFR5cGVSZXBsYWNlZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChib3VuZGVkVHlwZVJlcGxhY2VkICE9IGJvdW5kZWRUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkV2lsZGNhcmQodHlwZSwgYm91bmRlZFR5cGVSZXBsYWNlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG1lbnRpb24oTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIGJvdW5kZWRUeXBlICE9IG51bGwgJiYgYm91bmRlZFR5cGUubWVudGlvbih0eXBlUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNVcHBlckJvdW5kZWQoKSB7CisgICAgICAgIHJldHVybiBpc1N1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMb3dlckJvdW5kZWQoKSB7CisgICAgICAgIHJldHVybiBpc0V4dGVuZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBCb3VuZFR5cGUgeworICAgICAgICBTVVBFUiwKKyAgICAgICAgRVhURU5EUworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvcGFyYW1ldHJpemF0aW9uL1Jlc29sdmVkVHlwZVBhcmFtZXRlclZhbHVlUHJvdmlkZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL3BhcmFtZXRyaXphdGlvbi9SZXNvbHZlZFR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxMGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL3BhcmFtZXRyaXphdGlvbi9SZXNvbHZlZFR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMucGFyYW1ldHJpemF0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFdpbGRjYXJkOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc29sdmVkVHlwZVBhcmFtZXRlclZhbHVlUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVyLgorICAgICAqIEl0IGNvdWxkIGJlIGluaGVyaXRlZC4KKyAgICAgKi8KKyAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbVZhbHVlKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSB0eXBlIHR5cGVQYXJhbWV0ZXJzVmFsdWVzIHByZXNlbnQgaW4gdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgb25lcyBmb3Igd2hpY2ggdGhpcyB0eXBlCisgICAgICogaGFzIGEgdmFsdWUuCisgICAgICovCisgICAgZGVmYXVsdCBSZXNvbHZlZFR5cGUgdXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUoKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlciA9IHR5cGUuYXNUeXBlUGFyYW1ldGVyKCk7CisgICAgICAgICAgICBpZiAodHlwZVBhcmFtZXRlci5kZWNsYXJlZE9uVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW0gPSB0eXBlUGFyYW1WYWx1ZSh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZVBhcmFtLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUuaXNXaWxkY2FyZCgpICYmIHR5cGUuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpKSB7CisgICAgICAgICAgICBpZiAodHlwZS5hc1dpbGRjYXJkKCkuaXNFeHRlbmRzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQodXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUodHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRXaWxkY2FyZC5zdXBlckJvdW5kKHVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICB0eXBlID0gdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0aGlzOjp1c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IGdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUoU3RyaW5nIG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvcGFyYW1ldHJpemF0aW9uL1Jlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL3BhcmFtZXRyaXphdGlvbi9SZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjYjE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL3BhcmFtZXRyaXphdGlvbi9SZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBIG1hcCBvZiB2YWx1ZXMgYXNzb2NpYXRlZCB0byBUeXBlUGFyYW1ldGVycy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvbHZlZFR5cGU+IG5hbWVUb1ZhbHVlOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBuYW1lVG9EZWNsYXJhdGlvbjsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgICAgIG5hbWVUb1ZhbHVlID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgbmFtZVRvRGVjbGFyYXRpb24gPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoTWFwPFN0cmluZywgUmVzb2x2ZWRUeXBlPiBuYW1lVG9WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBuYW1lVG9EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgdGhpcy5uYW1lVG9WYWx1ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIHRoaXMubmFtZVRvVmFsdWUucHV0QWxsKG5hbWVUb1ZhbHVlKTsKKyAgICAgICAgICAgIHRoaXMubmFtZVRvRGVjbGFyYXRpb24gPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICB0aGlzLm5hbWVUb0RlY2xhcmF0aW9uLnB1dEFsbChuYW1lVG9EZWNsYXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcCBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcChuYW1lVG9WYWx1ZSwgbmFtZVRvRGVjbGFyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VmFsdWUoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHZhbHVlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGRuJ3QganVzdCBzaWxlbnRseSBvdmVyd3JpdGUgZXhpc3RpbmcgdHlwZXMhCisgICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHR5cGVQYXJhbWV0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpOworICAgICAgICAgICAgbmFtZVRvVmFsdWUucHV0KHF1YWxpZmllZE5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIG5hbWVUb0RlY2xhcmF0aW9uLnB1dChxdWFsaWZpZWROYW1lLCB0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwIHRoYXQgPSAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcCkgbzsKKworICAgICAgICByZXR1cm4gbmFtZVRvVmFsdWUuZXF1YWxzKHRoYXQubmFtZVRvVmFsdWUpICYmIG5hbWVUb0RlY2xhcmF0aW9uLmVxdWFscyh0aGF0Lm5hbWVUb0RlY2xhcmF0aW9uKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBuYW1lVG9WYWx1ZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVHlwZVBhcmFtZXRlcnNNYXB7IiArCisgICAgICAgICAgICAgICAgIm5hbWVUb1ZhbHVlPSIgKyBuYW1lVG9WYWx1ZSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVzb2x2ZWRUeXBlPiBuYW1lVG9WYWx1ZTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBuYW1lVG9EZWNsYXJhdGlvbjsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyc01hcCBlbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAoTWFwPFN0cmluZywgUmVzb2x2ZWRUeXBlPiBuYW1lVG9WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IG5hbWVUb0RlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMubmFtZVRvVmFsdWUgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHRoaXMubmFtZVRvVmFsdWUucHV0QWxsKG5hbWVUb1ZhbHVlKTsKKyAgICAgICAgdGhpcy5uYW1lVG9EZWNsYXJhdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGhpcy5uYW1lVG9EZWNsYXJhdGlvbi5wdXRBbGwobmFtZVRvRGVjbGFyYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VmFsdWUoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlcikgeworICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHR5cGVQYXJhbWV0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpOworICAgICAgICBpZiAobmFtZVRvVmFsdWUuY29udGFpbnNLZXkocXVhbGlmaWVkTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lVG9WYWx1ZS5nZXQocXVhbGlmaWVkTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gZ2V0VmFsdWVCeVNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKSB7CisgICAgICAgIGlmIChuYW1lVG9WYWx1ZS5jb250YWluc0tleShzaWduYXR1cmUpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobmFtZVRvVmFsdWUuZ2V0KHNpZ25hdHVyZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKCl7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obmFtZVRvVmFsdWUua2V5U2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZT4gZ2V0VHlwZXMoKXsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihuYW1lVG9WYWx1ZS52YWx1ZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIobmFtZVRvVmFsdWUsIG5hbWVUb0RlY2xhcmF0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gbmFtZVRvVmFsdWUuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgcmVwbGFjZUFsbChSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICBNYXA8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gaW5mZXJyZWRUeXBlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gOiB0aGlzLm5hbWVUb0RlY2xhcmF0aW9uLnZhbHVlcygpKSB7CisgICAgICAgICAgICB0eXBlID0gdHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldFZhbHVlKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiksIGluZmVycmVkVHlwZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL3BhcmFtZXRyaXphdGlvbi9SZXNvbHZlZFR5cGVQYXJhbWV0cml6ZWQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9yZXNvbHV0aW9uL3R5cGVzL3BhcmFtZXRyaXphdGlvbi9SZXNvbHZlZFR5cGVQYXJhbWV0cml6ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE3OTJhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvcGFyYW1ldHJpemF0aW9uL1Jlc29sdmVkVHlwZVBhcmFtZXRyaXplZC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbjsKKworLyoqCisgKiBTb21ldGhpbmcgd2hpY2ggY2FuIGhhdmUgdmFsdWVzIGZvciBUeXBlUGFyYW1ldGVycy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvbHZlZFR5cGVQYXJhbWV0cml6ZWQgeworICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAgdHlwZVBhcmFtZXRlcnNNYXAoKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9DbGFzc1V0aWxzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ2xhc3NVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYmRmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ2xhc3NVdGlscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBDbGFzc1V0aWxzIHsKKyAgICAvKioKKyAgICAgKiBNYXBzIHByaW1pdGl2ZSB7QGNvZGUgQ2xhc3N9ZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB3cmFwcGVyIHtAY29kZSBDbGFzc30uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8+LCBDbGFzczw/Pj4gcHJpbWl0aXZlV3JhcHBlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEJvb2xlYW4uVFlQRSwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEJ5dGUuVFlQRSwgQnl0ZS5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KENoYXJhY3Rlci5UWVBFLCBDaGFyYWN0ZXIuY2xhc3MpOworICAgICAgICBwcmltaXRpdmVXcmFwcGVyTWFwLnB1dChTaG9ydC5UWVBFLCBTaG9ydC5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEludGVnZXIuVFlQRSwgSW50ZWdlci5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KExvbmcuVFlQRSwgTG9uZy5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KERvdWJsZS5UWVBFLCBEb3VibGUuY2xhc3MpOworICAgICAgICBwcmltaXRpdmVXcmFwcGVyTWFwLnB1dChGbG9hdC5UWVBFLCBGbG9hdC5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KFZvaWQuVFlQRSwgVm9pZC5UWVBFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHdyYXBwZXIge0Bjb2RlIENsYXNzfWVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJpbWl0aXZlIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+IHdyYXBwZXJQcmltaXRpdmVNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IHByaW1pdGl2ZUNsYXNzIDogcHJpbWl0aXZlV3JhcHBlck1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzID0gcHJpbWl0aXZlV3JhcHBlck1hcC5nZXQocHJpbWl0aXZlQ2xhc3MpOworICAgICAgICAgICAgaWYgKCFwcmltaXRpdmVDbGFzcy5lcXVhbHMod3JhcHBlckNsYXNzKSkgeworICAgICAgICAgICAgICAgIHdyYXBwZXJQcmltaXRpdmVNYXAucHV0KHdyYXBwZXJDbGFzcywgcHJpbWl0aXZlQ2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB7QGNvZGUgdHlwZX0gaXMgYSBwcmltaXRpdmUgb3IgcHJpbWl0aXZlIHdyYXBwZXIgKHtAbGluayBCb29sZWFufSwge0BsaW5rIEJ5dGV9LAorICAgICAqIHtAbGluayBDaGFyYWN0ZXJ9LAorICAgICAqIHtAbGluayBTaG9ydH0sIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIExvbmd9LCB7QGxpbmsgRG91YmxlfSwge0BsaW5rIEZsb2F0fSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUgY2xhc3MgdG8gcXVlcnkgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHtAY29kZSB0eXBlfSBpcyBhIHByaW1pdGl2ZSBvciBwcmltaXRpdmUgd3JhcHBlciAoe0BsaW5rIEJvb2xlYW59LCB7QGxpbmsgQnl0ZX0sIHtAbGluaworICAgICAqIENoYXJhY3Rlcn0sIHtAbGluayBTaG9ydH0sIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIExvbmd9LCB7QGxpbmsgRG91YmxlfSwge0BsaW5rIEZsb2F0fSkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlT3JXcmFwcGVyKGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlLmlzUHJpbWl0aXZlKCkgfHwgaXNQcmltaXRpdmVXcmFwcGVyKHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4ge0Bjb2RlIHR5cGV9IGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIgKHtAbGluayBCb29sZWFufSwge0BsaW5rIEJ5dGV9LCB7QGxpbmsgQ2hhcmFjdGVyfSwKKyAgICAgKiB7QGxpbmsgU2hvcnR9LAorICAgICAqIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIExvbmd9LCB7QGxpbmsgRG91YmxlfSwge0BsaW5rIEZsb2F0fSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUgY2xhc3MgdG8gcXVlcnkgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHtAY29kZSB0eXBlfSBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyICh7QGxpbmsgQm9vbGVhbn0sIHtAbGluayBCeXRlfSwge0BsaW5rIENoYXJhY3Rlcn0sCisgICAgICoge0BsaW5rIFNob3J0fSwge0BsaW5rIEludGVnZXJ9LCB7QGxpbmsgTG9uZ30sIHtAbGluayBEb3VibGV9LCB7QGxpbmsgRmxvYXR9KS4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcihmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVyUHJpbWl0aXZlTWFwLmNvbnRhaW5zS2V5KHR5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Db2RlR2VuZXJhdGlvblV0aWxzLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ29kZUdlbmVyYXRpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ODkyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ29kZUdlbmVyYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmNhcGl0YWxpemU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5kZWNhcGl0YWxpemU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb2RlR2VuZXJhdGlvblV0aWxzIHsKKyAgICBwcml2YXRlIENvZGVHZW5lcmF0aW9uVXRpbHMoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0dGVyTmFtZShDbGFzczw/PiB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhCb29sZWFuLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuICJpcyIgKyBjYXBpdGFsaXplKG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiZ2V0IiArIGNhcGl0YWxpemUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0dGVyVG9Qcm9wZXJ0eU5hbWUoU3RyaW5nIGdldHRlck5hbWUpIHsKKyAgICAgICAgaWYgKGdldHRlck5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgeworICAgICAgICAgICAgcmV0dXJuIGRlY2FwaXRhbGl6ZShnZXR0ZXJOYW1lLnN1YnN0cmluZygiaXMiLmxlbmd0aCgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0dGVyTmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeworICAgICAgICAgICAgcmV0dXJuIGRlY2FwaXRhbGl6ZShnZXR0ZXJOYW1lLnN1YnN0cmluZygiZ2V0Ii5sZW5ndGgoKSkpOworICAgICAgICB9IGVsc2UgaWYgKGdldHRlck5hbWUuc3RhcnRzV2l0aCgiaGFzIikpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWNhcGl0YWxpemUoZ2V0dGVyTmFtZS5zdWJzdHJpbmcoImhhcyIubGVuZ3RoKCkpKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIGdldHRlck5hbWUgJyIgKyBnZXR0ZXJOYW1lICsgIiciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXR0ZXJOYW1lKFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgaWYgKGZpZWxkTmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7CisgICAgICAgICAgICByZXR1cm4gInNldCIgKyBmaWVsZE5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAic2V0IiArIGNhcGl0YWxpemUoZmllbGROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25hbE9mKFN0cmluZyB0ZXh0LCBib29sZWFuIGlzT3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzT3B0aW9uYWwpIHsKKyAgICAgICAgICAgIHJldHVybiBmKCJPcHRpb25hbC5vZiglcykiLCB0ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiT3B0aW9uYWwuZW1wdHkoKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNob3J0Y3V0IHRvIFN0cmluZy5mb3JtYXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KGZvcm1hdCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIGEgZmlsZSBpbiBhIHBhY2thZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHBhY2thZ2UgcmVzaWRlcworICAgICAqIEBwYXJhbSBwa2cgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIGZpbGUgcmVzaWRlcywgbGlrZSAiY29tLmxhYW1lbGxhLnBhcnNlciIKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgaW4gdGhlIHBhY2thZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXRoIGZpbGVJblBhY2thZ2VBYnNvbHV0ZVBhdGgoU3RyaW5nIHJvb3QsIFN0cmluZyBwa2csIFN0cmluZyBmaWxlKSB7CisgICAgICAgIHBrZyA9IHBhY2thZ2VUb1BhdGgocGtnKTsKKyAgICAgICAgcmV0dXJuIFBhdGhzLmdldChyb290LCBwa2csIGZpbGUpLm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBmaWxlSW5QYWNrYWdlQWJzb2x1dGVQYXRoKFBhdGggcm9vdCwgU3RyaW5nIHBrZywgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVJblBhY2thZ2VBYnNvbHV0ZVBhdGgocm9vdC50b1N0cmluZygpLCBwa2csIGZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR1cm5zIGEgcGFja2FnZSBhbmQgYSBmaWxlIGludG8gYSByZWxhdGl2ZSBwYXRoLiAiY29tLmxhYW1lbGxhIiBhbmQgIlNpbXBsZS5qYXZhIiB3aWxsIGJlY29tZQorICAgICAqICJjb20vbGFhbWVsbGEvU2ltcGxlLmphdmEiCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXRoIGZpbGVJblBhY2thZ2VSZWxhdGl2ZVBhdGgoU3RyaW5nIHBrZywgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgcGtnID0gcGFja2FnZVRvUGF0aChwa2cpOworICAgICAgICByZXR1cm4gUGF0aHMuZ2V0KHBrZywgZmlsZSkubm9ybWFsaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBwYWNrYWdlIG5hbWUgbGlrZSAiY29tLmxhYW1lbGxhLnBhcnNlciIgdG8gYSBwYXRoIGxpa2UgImNvbS9sYWFtZWxsYS9wYXJzZXIiCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZVRvUGF0aChTdHJpbmcgcGtnKSB7CisgICAgICAgIHJldHVybiBwa2cucmVwbGFjZSgiLiIsIEZpbGUuc2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHRoZSBwYXRoIG9mIGEgcGFja2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IHRoZSByb290IGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgcGFja2FnZSByZXNpZGVzCisgICAgICogQHBhcmFtIHBrZyB0aGUgcGFja2FnZSwgbGlrZSAiY29tLmxhYW1lbGxhLnBhcnNlciIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhdGggcGFja2FnZUFic29sdXRlUGF0aChTdHJpbmcgcm9vdCwgU3RyaW5nIHBrZykgeworICAgICAgICBwa2cgPSBwYWNrYWdlVG9QYXRoKHBrZyk7CisgICAgICAgIHJldHVybiBQYXRocy5nZXQocm9vdCwgcGtnKS5ub3JtYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhdGggcGFja2FnZUFic29sdXRlUGF0aChQYXRoIHJvb3QsIFN0cmluZyBwa2cpIHsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VBYnNvbHV0ZVBhdGgocm9vdC50b1N0cmluZygpLCBwa2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBjbGFzc2xvYWRlciBmb3IgY2xhc3MgYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhdGggY2xhc3NMb2FkZXJSb290KENsYXNzPD8+IGMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBQYXRocy5nZXQoYy5nZXRQcm90ZWN0aW9uRG9tYWluKCkuZ2V0Q29kZVNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9VUkkoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkJ1ZyBpbiBKYXZhUGFyc2VyLCBwbGVhc2UgcmVwb3J0LiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZnVsIGZvciBsb2NhdGluZyBzb3VyY2UgY29kZSBpbiB5b3VyIE1hdmVuIHByb2plY3QuIEZpbmRzIHRoZSBjbGFzc3BhdGggZm9yIGNsYXNzIGMsIHRoZW4gYmFja3MgdXAgb3V0IG9mCisgICAgICogInRhcmdldC8odGVzdC0pY2xhc3NlcyIsIGdpdmluZyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBvbS54bWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXRoIG1hdmVuTW9kdWxlUm9vdChDbGFzczw/PiBjKSB7CisgICAgICAgIHJldHVybiBjbGFzc0xvYWRlclJvb3QoYykucmVzb2x2ZShQYXRocy5nZXQoIi4uIiwgIi4uIikpLm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0ZW5zIHBhdGggImZ1bGwiIGJ5IGN1dHRpbmcgImRpZmZlcmVuY2UiIG9mZiB0aGUgZW5kIG9mIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBzdWJ0cmFjdFBhdGhzKFBhdGggZnVsbCwgUGF0aCBkaWZmZXJlbmNlKSB7CisgICAgICAgIHdoaWxlIChkaWZmZXJlbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlLmdldEZpbGVOYW1lKCkuZXF1YWxzKGZ1bGwuZ2V0RmlsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBkaWZmZXJlbmNlID0gZGlmZmVyZW5jZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBmdWxsID0gZnVsbC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZigiJyVzJyBjb3VsZCBub3QgYmUgc3VidHJhY3RlZCBmcm9tICclcyciLCBkaWZmZXJlbmNlLCBmdWxsKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL0xvZy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL0xvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTljZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvTG9nLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CisKKy8qKgorICogVG8gYXZvaWQgZGVwZW5kZW5jaWVzIG9uIGxvZ2dpbmcgZnJhbWV3b3Jrcywgd2UgaGF2ZSBpbnZlbnRlZCB5ZXQgYW5vdGhlciBsb2dnaW5nIGZyYW1ld29yayA6LSkKKyAqLworcHVibGljIGNsYXNzIExvZyB7CisgICAgLyoqCisgICAgICogVGhpcyBhZGFwdGVyIGxvZ3MgdG8gc3RhbmRhcmQgb3V0IGFuZCBzdGFuZGFyZCBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YW5kYXJkT3V0U3RhbmRhcmRFcnJvckFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFRocm93YWJsZSB0aHJvd2FibGUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHByaW50U3RhY2tUcmFjZSh0aHJvd2FibGUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UgKyAiOiIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBwcmludFN0YWNrVHJhY2UodGhyb3dhYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludFN0YWNrVHJhY2UoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgdHJ5IChTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7IFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KSkgeworICAgICAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHcpOworICAgICAgICAgICAgICAgIHRyYWNlKHN3LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXJyb3IgaW4gbG9nZ2luZyBsaWJyYXJ5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGFkYXB0ZXIgbG9ncyBub3RoaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2lsZW50QWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5mbyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSwgU3RyaW5nIGYpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlciB7CisKKyAgICAgICAgdm9pZCBpbmZvKFN0cmluZyBtZXNzYWdlKTsKKworICAgICAgICB2b2lkIHRyYWNlKFN0cmluZyBtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQm90aCBjYW4gYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSwgU3RyaW5nIGYpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFkYXB0ZXIgQ1VSUkVOVF9BREFQVEVSID0gbmV3IFNpbGVudEFkYXB0ZXIoKTsKKworICAgIC8qKgorICAgICAqIENoYW5nZSBob3cgbG9nZ2luZyBpcyBoYW5kbGVkLiBZb3UgY2FuIHNldCB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiB0aGF0IGZvcndhcmRzIHRvIHlvdXIgbG9nZ2luZyBsaWJyYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBZGFwdGVyKEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBDVVJSRU5UX0FEQVBURVIgPSBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBsb2dnaW5nIGluZm9ybWF0aW9uIHRoYXQgbWF5IGhlbHAgc29sdmluZyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIENVUlJFTlRfQURBUFRFUi50cmFjZShmKGZvcm1hdCwgYXJncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBsb2dnaW5nIHRoaW5ncyB0aGF0IGFyZSBuaWNlIHRvIHNlZSBzY3JvbGxpbmcgYnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluZm8oU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgQ1VSUkVOVF9BREFQVEVSLmluZm8oZihmb3JtYXQsIGFyZ3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgZHJhd2luZyBhdHRlbnRpb24gdG8gYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgQ1VSUkVOVF9BREFQVEVSLmVycm9yKHRocm93YWJsZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIGRyYXdpbmcgYXR0ZW50aW9uIHRvIGFuIGVycm9yIHRoYXQgeW91IGRvbid0IGhhdmUgYW4gZXhjZXB0aW9uIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoVGhyb3dhYmxlIHRocm93YWJsZSwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgQ1VSUkVOVF9BREFQVEVSLmVycm9yKHRocm93YWJsZSwgZihmb3JtYXQsIGFyZ3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgZHJhd2luZyBhdHRlbnRpb24gdG8gYW4gZXJyb3IgdGhhdCB5b3UgZG9uJ3QgaGF2ZSBhbiBleGNlcHRpb24gZm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBDVVJSRU5UX0FEQVBURVIuZXJyb3IobnVsbCwgZihmb3JtYXQsIGFyZ3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvUGFpci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1BhaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjg0YTdiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1BhaXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKKworLyoqCisgKiBTaW1wbHkgYSBwYWlyIG9mIG9iamVjdHMuCisgKgorICogQHBhcmFtIDxBPiB0eXBlIG9mIG9iamVjdCBhLgorICogQHBhcmFtIDxCPiB0eXBlIG9mIG9iamVjdCBiLgorICovCitwdWJsaWMgY2xhc3MgUGFpcjxBLCBCPiB7CisgICAgcHVibGljIGZpbmFsIEEgYTsKKyAgICBwdWJsaWMgZmluYWwgQiBiOworCisgICAgcHVibGljIFBhaXIoQSBhLCBCIGIpIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgdGhpcy5iID0gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBQYWlyPD8sID8+IHBhaXIgPSAoUGFpcjw/LCA/PikgbzsKKworICAgICAgICBpZiAoYSAhPSBudWxsID8gIWEuZXF1YWxzKHBhaXIuYSkgOiBwYWlyLmEgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoYiAhPSBudWxsID8gIWIuZXF1YWxzKHBhaXIuYikgOiBwYWlyLmIgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBhICE9IG51bGwgPyBhLmhhc2hDb2RlKCkgOiAwOworICAgICAgICByZXR1cm4gMzEgKiByZXN1bHQgKyAoYiAhPSBudWxsID8gYi5oYXNoQ29kZSgpIDogMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGYoIjwlcywgJXM+IiwgYSwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Bvc2l0aW9uVXRpbHMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Qb3NpdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MmIyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Qb3NpdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIuc2lnbnVtOworCitwdWJsaWMgZmluYWwgY2xhc3MgUG9zaXRpb25VdGlscyB7CisKKyAgICBwcml2YXRlIFBvc2l0aW9uVXRpbHMoKSB7CisgICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBOb2RlPiB2b2lkIHNvcnRCeUJlZ2luUG9zaXRpb24oTGlzdDxUPiBub2RlcykgeworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKG5vZGVzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5vZGU+IHZvaWQgc29ydEJ5QmVnaW5Qb3NpdGlvbihOb2RlTGlzdDxUPiBub2RlcykgeworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKG5vZGVzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5vZGU+IHZvaWQgc29ydEJ5QmVnaW5Qb3NpdGlvbihMaXN0PFQ+IG5vZGVzLCBmaW5hbCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgbm9kZXMuc29ydCgobzEsIG8yKSAtPiBQb3NpdGlvblV0aWxzLmNvbXBhcmUobzEsIG8yLCBpZ25vcmluZ0Fubm90YXRpb25zKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUluT3JkZXIoTm9kZSBhLCBOb2RlIGIpIHsKKyAgICAgICAgcmV0dXJuIGFyZUluT3JkZXIoYSwgYiwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVJbk9yZGVyKE5vZGUgYSwgTm9kZSBiLCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgaWdub3JpbmdBbm5vdGF0aW9ucykgPD0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZShOb2RlIGEsIE5vZGUgYiwgYm9vbGVhbiBpZ25vcmluZ0Fubm90YXRpb25zKSB7CisgICAgICAgIGlmKGEuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSAmJiAhYi5nZXRSYW5nZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYoIWEuZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSAmJiBiLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICghYS5nZXRSYW5nZSgpLmlzUHJlc2VudCgpICYmICFiLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChpZ25vcmluZ0Fubm90YXRpb25zKSB7CisgICAgICAgICAgICBpbnQgc2lnbkxpbmUgPSBzaWdudW0oYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihhKSAtIGJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oYikpOworICAgICAgICAgICAgaWYgKHNpZ25MaW5lID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lnbnVtKGJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihhKSAtIGJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzaWduTGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFBvc2l0aW9uIGFCZWdpbiA9IGEuZ2V0QmVnaW4oKS5nZXQoKTsKKyAgICAgICAgUG9zaXRpb24gYkJlZ2luID0gYi5nZXRCZWdpbigpLmdldCgpOworCisgICAgICAgIGludCBzaWduTGluZSA9IHNpZ251bShhQmVnaW4ubGluZSAtIGJCZWdpbi5saW5lKTsKKyAgICAgICAgaWYgKHNpZ25MaW5lID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzaWdudW0oYUJlZ2luLmNvbHVtbiAtIGJCZWdpbi5jb2x1bW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNpZ25MaW5lOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRXhwciBnZXRMYXN0QW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlV2l0aEFubm90YXRpb25zKSB7CisgICAgICAgICAgICBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBOb2RlTGlzdC5ub2RlTGlzdCgoKE5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4pIG5vZGUpLmdldEFubm90YXRpb25zKCkpOworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc29ydEJ5QmVnaW5Qb3NpdGlvbihhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnMuZ2V0KGFubm90YXRpb25zLnNpemUoKSAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKG5vZGUpLmdldFJhbmdlKCkuZ2V0KCkuYmVnaW4ubGluZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGludCBiZWdpbkNvbHVtbldpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBiZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhub2RlKS5nZXRSYW5nZSgpLmdldCgpLmJlZ2luLmNvbHVtbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBOb2RlV2l0aFR5cGU8PywgVHlwZT4gY2FzdGVkID0gKE5vZGVXaXRoVHlwZTw/LCBUeXBlPikgbm9kZTsKKyAgICAgICAgICAgIHJldHVybiBjYXN0ZWQuZ2V0VHlwZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjYXN0ZWQgPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBub2RlOworICAgICAgICAgICAgcmV0dXJuIGNhc3RlZC5nZXROYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBub2RlQ29udGFpbnMoTm9kZSBjb250YWluZXIsIE5vZGUgY29udGFpbmVkLCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgY29udGFpbmVkUmFuZ2UgPSBjb250YWluZWQuZ2V0UmFuZ2UoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgUmFuZ2UgY29udGFpbmVyUmFuZ2UgPSBjb250YWluZXIuZ2V0UmFuZ2UoKS5nZXQoKTsKKyAgICAgICAgaWYgKCFpZ25vcmluZ0Fubm90YXRpb25zIHx8IFBvc2l0aW9uVXRpbHMuZ2V0TGFzdEFubm90YXRpb24oY29udGFpbmVyKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zV2l0aGluKGNvbnRhaW5lZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb250YWluZXIuY29udGFpbnNXaXRoaW4oY29udGFpbmVkKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHRoZSBub2RlIGlzIGNvbnRhaW5lZCwgYnV0IGl0IGNvbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBhbm5vdGF0aW9ucywKKyAgICAgICAgLy8gbGV0J3Mgbm90IGNvbnNpZGVyIGl0IGNvbnRhaW5lZAorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTm9kZVdpdGhBbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaW50IGJsID0gYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihjb250YWluZXIpOworICAgICAgICAgICAgaW50IGJjID0gYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcik7CisgICAgICAgICAgICBpZiAoYmwgPiBjb250YWluZWRSYW5nZS5iZWdpbi5saW5lKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoYmwgPT0gY29udGFpbmVkUmFuZ2UuYmVnaW4ubGluZSAmJiBiYyA+IGNvbnRhaW5lZFJhbmdlLmJlZ2luLmNvbHVtbikgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJhbmdlLmVuZC5saW5lIDwgY29udGFpbmVkUmFuZ2UuZW5kLmxpbmUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vIFRPRE8gPCBvciA8PSA/CisgICAgICAgICAgICByZXR1cm4gIShjb250YWluZXJSYW5nZS5lbmQubGluZSA9PSBjb250YWluZWRSYW5nZS5lbmQubGluZSAmJiBjb250YWluZXJSYW5nZS5lbmQuY29sdW1uIDwgY29udGFpbmVkUmFuZ2UuZW5kLmNvbHVtbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9TZXBhcmF0ZWRJdGVtU3RyaW5nQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWY3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworLyoqCisgKiBCdWlsZHMgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBhIHByZWZpeCwgYSBwb3N0Zml4LCBhbmQgYSBzZXBhcmF0b3IuCisgKiA8YnIvPkV4YW1wbGU6ICgxLDIsMykgd2hpY2ggaGFzIHByZWZpeCAiKCIsIHNlcGFyYXRvciAiLCIsIHBvc3RmaXggIikiIGFuZCB0aGUgaXRlbXMgMSB0aHJvdWdoIDMuCisgKiA8cC8+SmF2YSA4IG9mZmVycyB0aGUgdmVyeSBuaWNlIENvbGxlY3RvcnMuam9pbmluZyhTdHJpbmcsIFN0cmluZywgU3RyaW5nKSB3aGljaCBkb2VzIHRoZSBzYW1lIHRoaW5nLgorICovCitwdWJsaWMgY2xhc3MgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlcGFyYXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwb3N0Zml4OworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJdGVtcyA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBidWlsZGVyOworCisgICAgcHVibGljIFNlcGFyYXRlZEl0ZW1TdHJpbmdCdWlsZGVyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzZXBhcmF0b3IsIFN0cmluZyBwb3N0Zml4KSB7CisgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihwcmVmaXgpOworICAgICAgICB0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvcjsKKyAgICAgICAgdGhpcy5wb3N0Zml4ID0gcG9zdGZpeDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBvbmUgaXRlbS4gRWl0aGVyIHBhc3MgYSBzdHJpbmcsIG9yIGEgZm9ybWF0IGZvciBTdHJpbmcuZm9ybWF0IGFuZCBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VwYXJhdGVkSXRlbVN0cmluZ0J1aWxkZXIgYXBwZW5kKENoYXJTZXF1ZW5jZSBmb3JtYXQsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGlmIChoYXNJdGVtcykgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoc2VwYXJhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KGZvcm1hdC50b1N0cmluZygpLCBhcmdzKSk7CisgICAgICAgIGhhc0l0ZW1zID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzSXRlbXMoKSB7CisgICAgICAgIHJldHVybiBoYXNJdGVtczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBidWlsZGVyIGludG8gaXRzIGZpbmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAvLyBUaGlzIG9yZGVyIG9mIHRvU3RyaW5naW5nIGF2b2lkcyBkZWJ1Z2dlcnMgZnJvbSBtYWtpbmcgYSBtZXNzLgorICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpICsgcG9zdGZpeDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlUm9vdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1NvdXJjZVJvb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE5MGZmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1NvdXJjZVJvb3QuamF2YQpAQCAtMCwwICsxLDU3NyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VQcm9ibGVtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5QcmV0dHlQcmludGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdFJlc3VsdDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZvcmtKb2luUG9vbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWN1cnNpdmVBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklUOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5maWxlSW5QYWNrYWdlUmVsYXRpdmVQYXRoOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5wYWNrYWdlQWJzb2x1dGVQYXRoOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdC5DYWxsYmFjay5SZXN1bHQuU0FWRTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5maWxlLkZpbGVWaXNpdFJlc3VsdC5TS0lQX1NVQlRSRUU7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIEphdmEgc291cmNlIGZpbGVzIGxvY2F0ZWQgaW4gb25lIGRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzIG9uIHRoZSBmaWxlIHN5c3RlbS4gRmlsZXMgY2FuIGJlCisgKiBwYXJzZWQgYW5kIHdyaXR0ZW4gYmFjayBvbmUgYnkgb25lIG9yIGFsbCB0b2dldGhlci4gPGI+Tm90ZSB0aGF0PC9iPiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlZCBpcyB0aHJlYWQtc2FmZS4KKyAqIDx1bD4KKyAqIDxsaT5tZXRob2RzIGNhbGxlZCAidHJ5VG9QYXJzZS4uLiIgd2lsbCByZXR1cm4gdGhlaXIgcmVzdWx0IGluc2lkZSBhICJQYXJzZVJlc3VsdCIsIHdoaWNoIHN1cHBvcnRzIHBhcnNlIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMuPC9saT4KKyAqIDxsaT5tZXRob2RzIGNhbGxlZCAicGFyc2UuLi4iIHdpbGwgcmV0dXJuICJDb21waWxhdGlvblVuaXQicy4gSWYgYSBmaWxlIGZhaWxzIHRvIHBhcnNlLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLjwvbGk+CisgKiA8bGk+bWV0aG9kcyBlbmRpbmcgaW4gIi4uLlBhcmFsbGVsaXplZCIgd2lsbCBzcGVlZCB1cCBwYXJzaW5nIGJ5IHVzaW5nIG11bHRpcGxlIHRocmVhZHMuPC9saT4KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBjbGFzcyBTb3VyY2VSb290IHsKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgeworICAgICAgICBlbnVtIFJlc3VsdCB7CisgICAgICAgICAgICBTQVZFLCBET05UX1NBVkUKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gbG9jYWxQYXRoIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgd2FzIHBhcnNlZCwgcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290IHBhdGguCisgICAgICAgICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCB3YXMgcGFyc2VkLgorICAgICAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgb2Ygb2YgcGFyc2luZyB0aGUgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdCBwcm9jZXNzKFBhdGggbG9jYWxQYXRoLCBQYXRoIGFic29sdXRlUGF0aCwgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUGF0aCByb290OworICAgIHByaXZhdGUgZmluYWwgTWFwPFBhdGgsIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4+IGNhY2hlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbiA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCk7CisgICAgcHJpdmF0ZSBGdW5jdGlvbjxDb21waWxhdGlvblVuaXQsIFN0cmluZz4gcHJpbnRlciA9IG5ldyBQcmV0dHlQcmludGVyKCk6OnByaW50OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSkFWQV9JREVOVElGSUVSID0gUGF0dGVybi5jb21waWxlKCJcXHB7amF2YUphdmFJZGVudGlmaWVyU3RhcnR9XFxwe2phdmFKYXZhSWRlbnRpZmllclBhcnR9KiIpOworCisgICAgcHVibGljIFNvdXJjZVJvb3QoUGF0aCByb290KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwocm9vdCk7CisgICAgICAgIGlmICghRmlsZXMuaXNEaXJlY3Rvcnkocm9vdCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgZGlyZWN0b3JpZXMgYXJlIGFsbG93ZWQgYXMgcm9vdCBwYXRoISIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Qubm9ybWFsaXplKCk7CisgICAgICAgIExvZy5pbmZvKCJOZXcgc291cmNlIHJvb3QgYXQgXCIlc1wiIiwgdGhpcy5yb290KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlUm9vdChQYXRoIHJvb3QsIFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbikgeworICAgICAgICB0aGlzKHJvb3QpOworICAgICAgICBzZXRQYXJzZXJDb25maWd1cmF0aW9uKHBhcnNlckNvbmZpZ3VyYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHBhcnNlIGEgLmphdmEgZmlsZXMgdW5kZXIgdGhlIHNvdXJjZSByb290IGFuZCByZXR1cm5zIHRoZSBQYXJzZVJlc3VsdC4gSXQga2VlcHMgdHJhY2sgb2YgdGhlIHBhcnNlZCBmaWxlCisgICAgICogc28geW91IGNhbiB3cml0ZSBpdCBvdXQgd2l0aCB0aGUgc2F2ZUFsbCgpIGNhbGwuIE5vdGUgdGhhdCB0aGUgY2FjaGUgZ3Jvd3Mgd2l0aCBldmVyeSBmaWxlIHBhcnNlZCwgc28gaWYgeW91CisgICAgICogZG9uJ3QgbmVlZCBzYXZlQWxsKCksIG9yIHlvdSBkb24ndCBhc2sgU291cmNlUm9vdCB0byBwYXJzZSBmaWxlcyBtdWx0aXBsZSB0aW1lcyAod2hlcmUgdGhlIGNhY2hlIGlzIHVzZWZ1bCkgeW91CisgICAgICogbWlnaHQgd2FudCB0byB1c2UgdGhlIHBhcnNlIG1ldGhvZCB3aXRoIGEgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRQYWNrYWdlIGZpbGVzIGluIHRoaXMgcGFja2FnZSBhbmQgZGVlcGVyIGFyZSBwYXJzZWQuIFBhc3MgIiIgdG8gcGFyc2UgYWxsIGZpbGVzLgorICAgICAqIEBkZXByZWNhdGVkIHBhc3MgUGFyc2VyQ29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIEphdmFQYXJzZXIKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHRyeVRvUGFyc2UoU3RyaW5nIHN0YXJ0UGFja2FnZSwgU3RyaW5nIGZpbGVuYW1lLCBKYXZhUGFyc2VyIGphdmFQYXJzZXIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdHJ5VG9QYXJzZShzdGFydFBhY2thZ2UsIGZpbGVuYW1lLCBqYXZhUGFyc2VyLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcGFyc2UgYSAuamF2YSBmaWxlcyB1bmRlciB0aGUgc291cmNlIHJvb3QgYW5kIHJldHVybnMgdGhlIFBhcnNlUmVzdWx0LiBJdCBrZWVwcyB0cmFjayBvZiB0aGUgcGFyc2VkIGZpbGUKKyAgICAgKiBzbyB5b3UgY2FuIHdyaXRlIGl0IG91dCB3aXRoIHRoZSBzYXZlQWxsKCkgY2FsbC4gTm90ZSB0aGF0IHRoZSBjYWNoZSBncm93cyB3aXRoIGV2ZXJ5IGZpbGUgcGFyc2VkLCBzbyBpZiB5b3UKKyAgICAgKiBkb24ndCBuZWVkIHNhdmVBbGwoKSwgb3IgeW91IGRvbid0IGFzayBTb3VyY2VSb290IHRvIHBhcnNlIGZpbGVzIG11bHRpcGxlIHRpbWVzICh3aGVyZSB0aGUgY2FjaGUgaXMgdXNlZnVsKSB5b3UKKyAgICAgKiBtaWdodCB3YW50IHRvIHVzZSB0aGUgcGFyc2UgbWV0aG9kIHdpdGggYSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydFBhY2thZ2UgZmlsZXMgaW4gdGhpcyBwYWNrYWdlIGFuZCBkZWVwZXIgYXJlIHBhcnNlZC4gUGFzcyAiIiB0byBwYXJzZSBhbGwgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gdHJ5VG9QYXJzZShTdHJpbmcgc3RhcnRQYWNrYWdlLCBTdHJpbmcgZmlsZW5hbWUsIFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGFydFBhY2thZ2UpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGVuYW1lKTsKKyAgICAgICAgZmluYWwgUGF0aCByZWxhdGl2ZVBhdGggPSBmaWxlSW5QYWNrYWdlUmVsYXRpdmVQYXRoKHN0YXJ0UGFja2FnZSwgZmlsZW5hbWUpOworICAgICAgICBpZiAoY2FjaGUuY29udGFpbnNLZXkocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgTG9nLnRyYWNlKCJSZXRyaWV2aW5nIGNhY2hlZCAlcyIsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KHJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGF0aCBwYXRoID0gcm9vdC5yZXNvbHZlKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIExvZy50cmFjZSgiUGFyc2luZyAlcyIsIHBhdGgpOworICAgICAgICBmaW5hbCBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKHBhdGgpKTsKKyAgICAgICAgcmVzdWx0LmdldFJlc3VsdCgpLmlmUHJlc2VudChjdSAtPiBjdS5zZXRTdG9yYWdlKHBhdGgpKTsKKyAgICAgICAgY2FjaGUucHV0KHJlbGF0aXZlUGF0aCwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBwYXJzZSBhIC5qYXZhIGZpbGVzIHVuZGVyIHRoZSBzb3VyY2Ugcm9vdCBhbmQgcmV0dXJucyB0aGUgUGFyc2VSZXN1bHQuIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSBwYXJzZWQgZmlsZQorICAgICAqIHNvIHlvdSBjYW4gd3JpdGUgaXQgb3V0IHdpdGggdGhlIHNhdmVBbGwoKSBjYWxsLiBOb3RlIHRoYXQgdGhlIGNhY2hlIGdyb3dzIHdpdGggZXZlcnkgZmlsZSBwYXJzZWQsIHNvIGlmIHlvdQorICAgICAqIGRvbid0IG5lZWQgc2F2ZUFsbCgpLCBvciB5b3UgZG9uJ3QgYXNrIFNvdXJjZVJvb3QgdG8gcGFyc2UgZmlsZXMgbXVsdGlwbGUgdGltZXMgKHdoZXJlIHRoZSBjYWNoZSBpcyB1c2VmdWwpIHlvdQorICAgICAqIG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSBwYXJzZSBtZXRob2Qgd2l0aCBhIGNhbGxiYWNrLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0UGFja2FnZSBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgYW5kIGRlZXBlciBhcmUgcGFyc2VkLiBQYXNzICIiIHRvIHBhcnNlIGFsbCBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiB0cnlUb1BhcnNlKFN0cmluZyBzdGFydFBhY2thZ2UsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRyeVRvUGFyc2Uoc3RhcnRQYWNrYWdlLCBmaWxlbmFtZSwgcGFyc2VyQ29uZmlndXJhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcGFyc2UgYWxsIC5qYXZhIGZpbGVzIGluIGEgcGFja2FnZSByZWN1cnNpdmVseSwgYW5kIHJldHVybnMgYWxsIGZpbGVzIGV2ZXIgcGFyc2VkIHdpdGggdGhpcyBzb3VyY2Ugcm9vdC4KKyAgICAgKiBJdCBrZWVwcyB0cmFjayBvZiBhbGwgcGFyc2VkIGZpbGVzIHNvIHlvdSBjYW4gd3JpdGUgdGhlbSBvdXQgd2l0aCBhIHNpbmdsZSBzYXZlQWxsKCkgY2FsbC4gTm90ZSB0aGF0IHRoZSBjYWNoZQorICAgICAqIGdyb3dzIHdpdGggZXZlcnkgZmlsZSBwYXJzZWQsIHNvIGlmIHlvdSBkb24ndCBuZWVkIHNhdmVBbGwoKSwgb3IgeW91IGRvbid0IGFzayBTb3VyY2VSb290IHRvIHBhcnNlIGZpbGVzIG11bHRpcGxlCisgICAgICogdGltZXMgKHdoZXJlIHRoZSBjYWNoZSBpcyB1c2VmdWwpIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgcGFyc2UgbWV0aG9kIHdpdGggYSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydFBhY2thZ2UgZmlsZXMgaW4gdGhpcyBwYWNrYWdlIGFuZCBkZWVwZXIgYXJlIHBhcnNlZC4gUGFzcyAiIiB0byBwYXJzZSBhbGwgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4gdHJ5VG9QYXJzZShTdHJpbmcgc3RhcnRQYWNrYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXJ0UGFja2FnZSk7CisgICAgICAgIGxvZ1BhY2thZ2Uoc3RhcnRQYWNrYWdlKTsKKyAgICAgICAgZmluYWwgUGF0aCBwYXRoID0gcGFja2FnZUFic29sdXRlUGF0aChyb290LCBzdGFydFBhY2thZ2UpOworICAgICAgICBGaWxlcy53YWxrRmlsZVRyZWUocGF0aCwgbmV3IFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZShQYXRoIGZpbGUsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKCFhdHRycy5pc0RpcmVjdG9yeSgpICYmIGZpbGUudG9TdHJpbmcoKS5lbmRzV2l0aCgiLmphdmEiKSkgeworICAgICAgICAgICAgICAgICAgICBQYXRoIHJlbGF0aXZlID0gcm9vdC5yZWxhdGl2aXplKGZpbGUuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgICAgICAgICB0cnlUb1BhcnNlKHJlbGF0aXZlLnRvU3RyaW5nKCksIGZpbGUuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIENPTlRJTlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgcHJlVmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2Vuc2libGVEaXJlY3RvcnlUb0VudGVyKGRpcikgPyBDT05USU5VRSA6IFNLSVBfU1VCVFJFRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBnZXRDYWNoZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTZW5zaWJsZURpcmVjdG9yeVRvRW50ZXIoUGF0aCBkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBkaXJUb0VudGVyID0gZGlyLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkaXJlY3RvcnlJc0FWYWxpZEphdmFJZGVudGlmaWVyID0gSkFWQV9JREVOVElGSUVSLm1hdGNoZXIoZGlyVG9FbnRlcikubWF0Y2hlcygpOworICAgICAgICBpZiAoRmlsZXMuaXNIaWRkZW4oZGlyKSB8fCAhZGlyZWN0b3J5SXNBVmFsaWRKYXZhSWRlbnRpZmllcikgeworICAgICAgICAgICAgTG9nLnRyYWNlKCJOb3QgcHJvY2Vzc2luZyBkaXJlY3RvcnkgXCIlc1wiIiwgZGlyVG9FbnRlcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcGFyc2UgYWxsIC5qYXZhIGZpbGVzIHVuZGVyIHRoZSBzb3VyY2Ugcm9vdCByZWN1cnNpdmVseSwgYW5kIHJldHVybnMgYWxsIGZpbGVzIGV2ZXIgcGFyc2VkIHdpdGggdGhpcworICAgICAqIHNvdXJjZSByb290LiBJdCBrZWVwcyB0cmFjayBvZiBhbGwgcGFyc2VkIGZpbGVzIHNvIHlvdSBjYW4gd3JpdGUgdGhlbSBvdXQgd2l0aCBhIHNpbmdsZSBzYXZlQWxsKCkgY2FsbC4gTm90ZSB0aGF0CisgICAgICogdGhlIGNhY2hlIGdyb3dzIHdpdGggZXZlcnkgZmlsZSBwYXJzZWQsIHNvIGlmIHlvdSBkb24ndCBuZWVkIHNhdmVBbGwoKSwgb3IgeW91IGRvbid0IGFzayBTb3VyY2VSb290IHRvIHBhcnNlCisgICAgICogZmlsZXMgbXVsdGlwbGUgdGltZXMgKHdoZXJlIHRoZSBjYWNoZSBpcyB1c2VmdWwpIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgcGFyc2UgbWV0aG9kIHdpdGggYSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+PiB0cnlUb1BhcnNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRyeVRvUGFyc2UoIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHBhcnNlIGFsbCAuamF2YSBmaWxlcyBpbiBhIHBhY2thZ2UgcmVjdXJzaXZlbHkgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcywgYW5kIHJldHVybnMgYWxsIGZpbGVzIGV2ZXIgcGFyc2VkCisgICAgICogd2l0aCB0aGlzIHNvdXJjZSByb290LiBBIG5ldyB0aHJlYWQgaXMgZm9ya2VkIGVhY2ggdGltZSBhIG5ldyBkaXJlY3RvcnkgaXMgdmlzaXRlZCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcKKyAgICAgKiBhbGwgLmphdmEgZmlsZXMgaW4gdGhhdCBkaXJlY3RvcnkuIDxiPk5vdGUgdGhhdDwvYj4gdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGEgbmV3IHBhcnNlciBpbnN0YW5jZSBpcyBjcmVhdGVkIGZvcgorICAgICAqIGV2ZXJ5IGZpbGUgd2l0aCB0aGUgaW50ZXJuYWwgcGFyc2VyJ3MgKGkuZS4ge0BsaW5rICNzZXRKYXZhUGFyc2VyfSkgY29uZmlndXJhdGlvbi4gSXQga2VlcHMgdHJhY2sgb2YgYWxsIHBhcnNlZAorICAgICAqIGZpbGVzIHNvIHlvdSBjYW4gd3JpdGUgdGhlbSBvdXQgd2l0aCBhIHNpbmdsZSBzYXZlQWxsKCkgY2FsbC4gTm90ZSB0aGF0IHRoZSBjYWNoZSBncm93cyB3aXRoIGV2ZXJ5IGZpbGUgcGFyc2VkLAorICAgICAqIHNvIGlmIHlvdSBkb24ndCBuZWVkIHNhdmVBbGwoKSwgb3IgeW91IGRvbid0IGFzayBTb3VyY2VSb290IHRvIHBhcnNlIGZpbGVzIG11bHRpcGxlIHRpbWVzICh3aGVyZSB0aGUgY2FjaGUgaXMKKyAgICAgKiB1c2VmdWwpIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgcGFyc2UgbWV0aG9kIHdpdGggYSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydFBhY2thZ2UgZmlsZXMgaW4gdGhpcyBwYWNrYWdlIGFuZCBkZWVwZXIgYXJlIHBhcnNlZC4gUGFzcyAiIiB0byBwYXJzZSBhbGwgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4gdHJ5VG9QYXJzZVBhcmFsbGVsaXplZChTdHJpbmcgc3RhcnRQYWNrYWdlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3RhcnRQYWNrYWdlKTsKKyAgICAgICAgbG9nUGFja2FnZShzdGFydFBhY2thZ2UpOworICAgICAgICBmaW5hbCBQYXRoIHBhdGggPSBwYWNrYWdlQWJzb2x1dGVQYXRoKHJvb3QsIHN0YXJ0UGFja2FnZSk7CisgICAgICAgIFBhcmFsbGVsUGFyc2UgcGFyc2UgPSBuZXcgUGFyYWxsZWxQYXJzZShwYXRoLCAoZmlsZSwgYXR0cnMpIC0+IHsKKyAgICAgICAgICAgIGlmICghYXR0cnMuaXNEaXJlY3RvcnkoKSAmJiBmaWxlLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgICAgICBQYXRoIHJlbGF0aXZlID0gcm9vdC5yZWxhdGl2aXplKGZpbGUuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRyeVRvUGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ09OVElOVUU7CisgICAgICAgIH0pOworICAgICAgICBGb3JrSm9pblBvb2wgcG9vbCA9IG5ldyBGb3JrSm9pblBvb2woKTsKKyAgICAgICAgcG9vbC5pbnZva2UocGFyc2UpOworICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBwYXJzZSBhbGwgLmphdmEgZmlsZXMgdW5kZXIgdGhlIHNvdXJjZSByb290IHJlY3Vyc2l2ZWx5IHVzaW5nIG11bHRpcGxlIHRocmVhZHMsIGFuZCByZXR1cm5zIGFsbCBmaWxlcworICAgICAqIGV2ZXIgcGFyc2VkIHdpdGggdGhpcyBzb3VyY2Ugcm9vdC4gQSBuZXcgdGhyZWFkIGlzIGZvcmtlZCBlYWNoIHRpbWUgYSBuZXcgZGlyZWN0b3J5IGlzIHZpc2l0ZWQgYW5kIGlzIHJlc3BvbnNpYmxlCisgICAgICogZm9yIHBhcnNpbmcgYWxsIC5qYXZhIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5LiA8Yj5Ob3RlIHRoYXQ8L2I+IHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBhIG5ldyBwYXJzZXIgaW5zdGFuY2UgaXMKKyAgICAgKiBjcmVhdGVkIGZvciBldmVyeSBmaWxlIHdpdGggdGhlIGludGVybmFsIHBhcnNlcidzIChpLmUuIHtAbGluayAjc2V0SmF2YVBhcnNlcn0pIGNvbmZpZ3VyYXRpb24uIEl0IGtlZXBzIHRyYWNrIG9mCisgICAgICogYWxsIHBhcnNlZCBmaWxlcyBzbyB5b3UgY2FuIHdyaXRlIHRoZW0gb3V0IHdpdGggYSBzaW5nbGUgc2F2ZUFsbCgpIGNhbGwuIE5vdGUgdGhhdCB0aGUgY2FjaGUgZ3Jvd3Mgd2l0aCBldmVyeQorICAgICAqIGZpbGUgcGFyc2VkLCBzbyBpZiB5b3UgZG9uJ3QgbmVlZCBzYXZlQWxsKCksIG9yIHlvdSBkb24ndCBhc2sgU291cmNlUm9vdCB0byBwYXJzZSBmaWxlcyBtdWx0aXBsZSB0aW1lcyAod2hlcmUgdGhlCisgICAgICogY2FjaGUgaXMgdXNlZnVsKSB5b3UgbWlnaHQgd2FudCB0byB1c2UgdGhlIHBhcnNlIG1ldGhvZCB3aXRoIGEgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4gdHJ5VG9QYXJzZVBhcmFsbGVsaXplZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnlUb1BhcnNlUGFyYWxsZWxpemVkKCIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSAuamF2YSBmaWxlcyB1bmRlciB0aGUgc291cmNlIHJvb3QgYW5kIHJldHVybnMgaXRzIENvbXBpbGF0aW9uVW5pdC4gSXQga2VlcHMgdHJhY2sgb2YgdGhlIHBhcnNlZCBmaWxlIHNvCisgICAgICogeW91IGNhbiB3cml0ZSBpdCBvdXQgd2l0aCB0aGUgc2F2ZUFsbCgpIGNhbGwuIE5vdGUgdGhhdCB0aGUgY2FjaGUgZ3Jvd3Mgd2l0aCBldmVyeSBmaWxlIHBhcnNlZCwgc28gaWYgeW91IGRvbid0CisgICAgICogbmVlZCBzYXZlQWxsKCksIG9yIHlvdSBkb24ndCBhc2sgU291cmNlUm9vdCB0byBwYXJzZSBmaWxlcyBtdWx0aXBsZSB0aW1lcyAod2hlcmUgdGhlIGNhY2hlIGlzIHVzZWZ1bCkgeW91IG1pZ2h0CisgICAgICogd2FudCB0byB1c2UgdGhlIHBhcnNlIG1ldGhvZCB3aXRoIGEgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRQYWNrYWdlIGZpbGVzIGluIHRoaXMgcGFja2FnZSBhbmQgZGVlcGVyIGFyZSBwYXJzZWQuIFBhc3MgIiIgdG8gcGFyc2UgYWxsIGZpbGVzLgorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcuCisgICAgICovCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShTdHJpbmcgc3RhcnRQYWNrYWdlLCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGFydFBhY2thZ2UpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGVuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gdHJ5VG9QYXJzZShzdGFydFBhY2thZ2UsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFJlc3VsdCgpLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlUHJvYmxlbUV4Y2VwdGlvbihyZXN1bHQuZ2V0UHJvYmxlbXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZVByb2JsZW1FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBwYXJzZSBhbGwgLmphdmEgZmlsZXMgaW4gYSBwYWNrYWdlIHJlY3Vyc2l2ZWx5IGFuZCBwYXNzZXMgdGhlbSBvbmUgYnkgb25lIHRvIHRoZSBjYWxsYmFjay4gSW4gY29tcGFyaXNvbgorICAgICAqIHRvIHRoZSBvdGhlciBwYXJzZSBtZXRob2RzLCB0aGlzIGlzIG11Y2ggbW9yZSBtZW1vcnkgZWZmaWNpZW50LCBidXQgc2F2ZUFsbCgpIHdvbid0IHdvcmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRQYWNrYWdlIGZpbGVzIGluIHRoaXMgcGFja2FnZSBhbmQgZGVlcGVyIGFyZSBwYXJzZWQuIFBhc3MgIiIgdG8gcGFyc2UgYWxsIGZpbGVzLgorICAgICAqIEBkZXByZWNhdGVkIHBhc3MgUGFyc2VyQ29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIEphdmFQYXJzZXIKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBTb3VyY2VSb290IHBhcnNlKFN0cmluZyBzdGFydFBhY2thZ2UsIEphdmFQYXJzZXIgamF2YVBhcnNlciwgQ2FsbGJhY2sgY2FsbGJhY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwYXJzZShzdGFydFBhY2thZ2UsIGphdmFQYXJzZXIuZ2V0UGFyc2VyQ29uZmlndXJhdGlvbigpLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcGFyc2UgYWxsIC5qYXZhIGZpbGVzIGluIGEgcGFja2FnZSByZWN1cnNpdmVseSBhbmQgcGFzc2VzIHRoZW0gb25lIGJ5IG9uZSB0byB0aGUgY2FsbGJhY2suIEluIGNvbXBhcmlzb24KKyAgICAgKiB0byB0aGUgb3RoZXIgcGFyc2UgbWV0aG9kcywgdGhpcyBpcyBtdWNoIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgYnV0IHNhdmVBbGwoKSB3b24ndCB3b3JrLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0UGFja2FnZSBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgYW5kIGRlZXBlciBhcmUgcGFyc2VkLiBQYXNzICIiIHRvIHBhcnNlIGFsbCBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlUm9vdCBwYXJzZShTdHJpbmcgc3RhcnRQYWNrYWdlLCBQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIENhbGxiYWNrIGNhbGxiYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXJ0UGFja2FnZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlndXJhdGlvbik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY2FsbGJhY2spOworICAgICAgICBsb2dQYWNrYWdlKHN0YXJ0UGFja2FnZSk7CisgICAgICAgIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKGNvbmZpZ3VyYXRpb24pOworICAgICAgICBmaW5hbCBQYXRoIHBhdGggPSBwYWNrYWdlQWJzb2x1dGVQYXRoKHJvb3QsIHN0YXJ0UGFja2FnZSk7CisgICAgICAgIEZpbGVzLndhbGtGaWxlVHJlZShwYXRoLCBuZXcgU2ltcGxlRmlsZVZpc2l0b3I8UGF0aD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKFBhdGggYWJzb2x1dGVQYXRoLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmICghYXR0cnMuaXNEaXJlY3RvcnkoKSAmJiBhYnNvbHV0ZVBhdGgudG9TdHJpbmcoKS5lbmRzV2l0aCgiLmphdmEiKSkgeworICAgICAgICAgICAgICAgICAgICBQYXRoIGxvY2FsUGF0aCA9IHJvb3QucmVsYXRpdml6ZShhYnNvbHV0ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICBMb2cudHJhY2UoIlBhcnNpbmcgJXMiLCBsb2NhbFBhdGgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcihhYnNvbHV0ZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3VsdCgpLmlmUHJlc2VudChjdSAtPiBjdS5zZXRTdG9yYWdlKGFic29sdXRlUGF0aCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sucHJvY2Vzcyhsb2NhbFBhdGgsIGFic29sdXRlUGF0aCwgcmVzdWx0KSA9PSBTQVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldFJlc3VsdCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZShyZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCksIHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBDT05USU5VRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHByZVZpc2l0RGlyZWN0b3J5KFBhdGggZGlyLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbnNpYmxlRGlyZWN0b3J5VG9FbnRlcihkaXIpID8gQ09OVElOVUUgOiBTS0lQX1NVQlRSRUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nUGFja2FnZShTdHJpbmcgc3RhcnRQYWNrYWdlKSB7CisgICAgICAgIGlmIChzdGFydFBhY2thZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9nLmluZm8oIlBhcnNpbmcgcGFja2FnZSBcIiVzXCIiLCBzdGFydFBhY2thZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHBhcnNlIGFsbCAuamF2YSBmaWxlcyBpbiBhIHBhY2thZ2UgcmVjdXJzaXZlbHkgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcywgYW5kIHBhc3NlcyB0aGVtIG9uZSBieSBvbmUgdG8gdGhlCisgICAgICogY2FsbGJhY2suIEEgbmV3IHRocmVhZCBpcyBmb3JrZWQgZWFjaCB0aW1lIGEgbmV3IGRpcmVjdG9yeSBpcyB2aXNpdGVkIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbGwgLmphdmEKKyAgICAgKiBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4gPGI+Tm90ZSB0aGF0PC9iPiB0aGUgcHJvdmlkZWQge0BsaW5rIENhbGxiYWNrfSBjb2RlIG11c3QgYmUgbWFkZSB0aHJlYWQtc2FmZS4gPGI+Tm90ZQorICAgICAqIHRoYXQ8L2I+IHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBhIG5ldyBwYXJzZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgZmlsZSB3aXRoIHRoZSBwcm92aWRlZCB7QGxpbmsKKyAgICAgKiBQYXJzZXJDb25maWd1cmF0aW9ufS4gSW4gY29tcGFyaXNvbiB0byB0aGUgb3RoZXIgcGFyc2UgbWV0aG9kcywgdGhpcyBpcyBtdWNoIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgYnV0IHNhdmVBbGwoKQorICAgICAqIHdvbid0IHdvcmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRQYWNrYWdlIGZpbGVzIGluIHRoaXMgcGFja2FnZSBhbmQgZGVlcGVyIGFyZSBwYXJzZWQuIFBhc3MgIiIgdG8gcGFyc2UgYWxsIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VSb290IHBhcnNlUGFyYWxsZWxpemVkKFN0cmluZyBzdGFydFBhY2thZ2UsIFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGFydFBhY2thZ2UpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZ3VyYXRpb24pOworICAgICAgICBhc3NlcnROb3ROdWxsKGNhbGxiYWNrKTsKKyAgICAgICAgbG9nUGFja2FnZShzdGFydFBhY2thZ2UpOworICAgICAgICBmaW5hbCBQYXRoIHBhdGggPSBwYWNrYWdlQWJzb2x1dGVQYXRoKHJvb3QsIHN0YXJ0UGFja2FnZSk7CisgICAgICAgIFBhcmFsbGVsUGFyc2UgcGFyc2UgPSBuZXcgUGFyYWxsZWxQYXJzZShwYXRoLCAoZmlsZSwgYXR0cnMpIC0+IHsKKyAgICAgICAgICAgIGlmICghYXR0cnMuaXNEaXJlY3RvcnkoKSAmJiBmaWxlLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgICAgICBQYXRoIGxvY2FsUGF0aCA9IHJvb3QucmVsYXRpdml6ZShmaWxlKTsKKyAgICAgICAgICAgICAgICBMb2cudHJhY2UoIlBhcnNpbmcgJXMiLCBsb2NhbFBhdGgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gbmV3IEphdmFQYXJzZXIoY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoZmlsZSkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmVzdWx0KCkuaWZQcmVzZW50KGN1IC0+IGN1LnNldFN0b3JhZ2UoZmlsZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sucHJvY2Vzcyhsb2NhbFBhdGgsIGZpbGUsIHJlc3VsdCkgPT0gU0FWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXN1bHQoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmUocmVzdWx0LmdldFJlc3VsdCgpLmdldCgpLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDT05USU5VRTsKKyAgICAgICAgfSk7CisgICAgICAgIEZvcmtKb2luUG9vbCBwb29sID0gbmV3IEZvcmtKb2luUG9vbCgpOworICAgICAgICBwb29sLmludm9rZShwYXJzZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHBhcnNlIGFsbCAuamF2YSBmaWxlcyBpbiBhIHBhY2thZ2UgcmVjdXJzaXZlbHkgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcywgYW5kIHBhc3NlcyB0aGVtIG9uZSBieSBvbmUgdG8gdGhlCisgICAgICogY2FsbGJhY2suIEEgbmV3IHRocmVhZCBpcyBmb3JrZWQgZWFjaCB0aW1lIGEgbmV3IGRpcmVjdG9yeSBpcyB2aXNpdGVkIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbGwgLmphdmEKKyAgICAgKiBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4gPGI+Tm90ZSB0aGF0PC9iPiB0aGUgcHJvdmlkZWQge0BsaW5rIENhbGxiYWNrfSBjb2RlIG11c3QgYmUgbWFkZSB0aHJlYWQtc2FmZS4gPGI+Tm90ZQorICAgICAqIHRoYXQ8L2I+IHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBhIG5ldyBwYXJzZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgZmlsZS4gSW4gY29tcGFyaXNvbiB0byB0aGUgb3RoZXIKKyAgICAgKiBwYXJzZSBtZXRob2RzLCB0aGlzIGlzIG11Y2ggbW9yZSBtZW1vcnkgZWZmaWNpZW50LCBidXQgc2F2ZUFsbCgpIHdvbid0IHdvcmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRQYWNrYWdlIGZpbGVzIGluIHRoaXMgcGFja2FnZSBhbmQgZGVlcGVyIGFyZSBwYXJzZWQuIFBhc3MgIiIgdG8gcGFyc2UgYWxsIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VSb290IHBhcnNlUGFyYWxsZWxpemVkKFN0cmluZyBzdGFydFBhY2thZ2UsIENhbGxiYWNrIGNhbGxiYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFyc2VQYXJhbGxlbGl6ZWQoc3RhcnRQYWNrYWdlLCBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcGFyc2UgYWxsIC5qYXZhIGZpbGVzIHJlY3Vyc2l2ZWx5IHVzaW5nIG11bHRpcGxlIHRocmVhZHMsIGFuZCBwYXNzZXMgdGhlbSBvbmUgYnkgb25lIHRvIHRoZSBjYWxsYmFjay4gQQorICAgICAqIG5ldyB0aHJlYWQgaXMgZm9ya2VkIGVhY2ggdGltZSBhIG5ldyBkaXJlY3RvcnkgaXMgdmlzaXRlZCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgYWxsIC5qYXZhIGZpbGVzIGluIHRoYXQKKyAgICAgKiBkaXJlY3RvcnkuIDxiPk5vdGUgdGhhdDwvYj4gdGhlIHByb3ZpZGVkIHtAbGluayBDYWxsYmFja30gY29kZSBtdXN0IGJlIG1hZGUgdGhyZWFkLXNhZmUuIDxiPk5vdGUgdGhhdDwvYj4gdG8KKyAgICAgKiBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgYSBuZXcgcGFyc2VyIGluc3RhbmNlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IGZpbGUuIEluIGNvbXBhcmlzb24gdG8gdGhlIG90aGVyIHBhcnNlIG1ldGhvZHMsCisgICAgICogdGhpcyBpcyBtdWNoIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgYnV0IHNhdmVBbGwoKSB3b24ndCB3b3JrLgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VSb290IHBhcnNlUGFyYWxsZWxpemVkKENhbGxiYWNrIGNhbGxiYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFyc2VQYXJhbGxlbGl6ZWQoIiIsIG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCksIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXdseSBjcmVhdGVkIEphdmEgZmlsZSB0byB0aGUgY2FjaGUgb2YgdGhpcyBzb3VyY2Ugcm9vdC4gSXQgd2lsbCBiZSBzYXZlZCB3aGVuIHNhdmVBbGwgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0UGFja2FnZSBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgYW5kIGRlZXBlciBhcmUgcGFyc2VkLiBQYXNzICIiIHRvIHBhcnNlIGFsbCBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlUm9vdCBhZGQoU3RyaW5nIHN0YXJ0UGFja2FnZSwgU3RyaW5nIGZpbGVuYW1lLCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3RhcnRQYWNrYWdlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWxlbmFtZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsYXRpb25Vbml0KTsKKyAgICAgICAgTG9nLnRyYWNlKCJBZGRpbmcgbmV3IGZpbGUgJXMuJXMiLCBzdGFydFBhY2thZ2UsIGZpbGVuYW1lKTsKKyAgICAgICAgZmluYWwgUGF0aCBwYXRoID0gZmlsZUluUGFja2FnZVJlbGF0aXZlUGF0aChzdGFydFBhY2thZ2UsIGZpbGVuYW1lKTsKKyAgICAgICAgZmluYWwgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiBwYXJzZVJlc3VsdCA9IG5ldyBQYXJzZVJlc3VsdDw+KAorICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCwKKyAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICBjYWNoZS5wdXQocGF0aCwgcGFyc2VSZXN1bHQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXdseSBjcmVhdGVkIEphdmEgZmlsZSB0byB0aGUgY2FjaGUgb2YgdGhpcyBzb3VyY2Ugcm9vdC4gSXQgd2lsbCBiZSBzYXZlZCB3aGVuIHNhdmVBbGwgaXMgY2FsbGVkLiBJdCBuZWVkcworICAgICAqIHRvIGhhdmUgaXRzIHBhdGggc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VSb290IGFkZChDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsYXRpb25Vbml0KTsKKyAgICAgICAgaWYgKGNvbXBpbGF0aW9uVW5pdC5nZXRTdG9yYWdlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhdGggcGF0aCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRTdG9yYWdlKCkuZ2V0KCkuZ2V0UGF0aCgpOworICAgICAgICAgICAgTG9nLnRyYWNlKCJBZGRpbmcgbmV3IGZpbGUgJXMiLCBwYXRoKTsKKyAgICAgICAgICAgIGZpbmFsIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcGFyc2VSZXN1bHQgPSBuZXcgUGFyc2VSZXN1bHQ8PigKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LAorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICBjYWNoZS5wdXQocGF0aCwgcGFyc2VSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJGaWxlcyBhZGRlZCB3aXRoIHRoaXMgbWV0aG9kIHNob3VsZCBoYXZlIHRoZWlyIHBhdGggc2V0LiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIGdpdmVuIHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBTb3VyY2VSb290IHNhdmUoQ29tcGlsYXRpb25Vbml0IGN1LCBQYXRoIHBhdGgpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjdSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGF0aCk7CisgICAgICAgIGN1LnNldFN0b3JhZ2UocGF0aCk7CisgICAgICAgIGN1LmdldFN0b3JhZ2UoKS5nZXQoKS5zYXZlKHByaW50ZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFsbCBwcmV2aW91c2x5IHBhcnNlZCBmaWxlcyBiYWNrIHRvIGEgbmV3IHBhdGguCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVJvb3Qgc2F2ZUFsbChQYXRoIHJvb3QpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyb290KTsKKyAgICAgICAgTG9nLmluZm8oIlNhdmluZyBhbGwgZmlsZXMgKCVzKSB0byAlcyIsIGNhY2hlLnNpemUoKSwgcm9vdCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFBhdGgsIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4+IGN1IDogY2FjaGUuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgUGF0aCBwYXRoID0gcm9vdC5yZXNvbHZlKGN1LmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChjdS5nZXRWYWx1ZSgpLmdldFJlc3VsdCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgTG9nLnRyYWNlKCJTYXZpbmcgJXMiLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBzYXZlKGN1LmdldFZhbHVlKCkuZ2V0UmVzdWx0KCkuZ2V0KCksIHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYWxsIHByZXZpb3VzbHkgcGFyc2VkIGZpbGVzIGJhY2sgdG8gd2hlcmUgdGhleSB3ZXJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VSb290IHNhdmVBbGwoKSB7CisgICAgICAgIHJldHVybiBzYXZlQWxsKHJvb3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHBhcnNlZCBieSB0aGlzIHNvdXJjZSByb290IG9iamVjdCwgb3IgaGF2ZSBiZWVuIGFkZGVkIG1hbnVhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4+IGdldENhY2hlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KGNhY2hlLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29tcGlsYXRpb25Vbml0cyBvZiB0aGUgSmF2YSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBwYXJzZWQgc3VjY2VzZnVsbHkgYnkgdGhpcyBzb3VyY2Ugcm9vdCBvYmplY3QsIG9yIGhhdmUgYmVlbgorICAgICAqIGFkZGVkIG1hbnVhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tcGlsYXRpb25Vbml0cygpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlLnZhbHVlcygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihQYXJzZVJlc3VsdDo6aXNTdWNjZXNzZnVsKQorICAgICAgICAgICAgICAgIC5tYXAocCAtPiBwLmdldFJlc3VsdCgpLmdldCgpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Um9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgc3RvcmUgUGFyc2VyQ29uZmlndXJhdGlvbiBub3cKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBKYXZhUGFyc2VyIGdldEphdmFQYXJzZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF2YVBhcnNlcihwYXJzZXJDb25maWd1cmF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcnNlciB0aGF0IGlzIHVzZWQgZm9yIHBhcnNpbmcgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHN0b3JlIFBhcnNlckNvbmZpZ3VyYXRpb24gbm93CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU291cmNlUm9vdCBzZXRKYXZhUGFyc2VyKEphdmFQYXJzZXIgamF2YVBhcnNlcikgeworICAgICAgICBhc3NlcnROb3ROdWxsKGphdmFQYXJzZXIpOworICAgICAgICB0aGlzLnBhcnNlckNvbmZpZ3VyYXRpb24gPSBqYXZhUGFyc2VyLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFBhcnNlckNvbmZpZ3VyYXRpb24gZ2V0UGFyc2VyQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlckNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJzZXIgY29uZmlndXJhdGlvbiB0aGF0IGlzIHVzZWQgZm9yIHBhcnNpbmcgd2hlbiBubyBjb25maWd1cmF0aW9uIGlzIHBhc3NlZCB0byBhIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlUm9vdCBzZXRQYXJzZXJDb25maWd1cmF0aW9uKFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbikgeworICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnNlckNvbmZpZ3VyYXRpb24pOworICAgICAgICB0aGlzLnBhcnNlckNvbmZpZ3VyYXRpb24gPSBwYXJzZXJDb25maWd1cmF0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByaW50aW5nIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyBjb21waWxhdGlvbiB1bml0cyBpbnRvIGEgc3RyaW5nIHRvIHNhdmUuCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVJvb3Qgc2V0UHJpbnRlcihGdW5jdGlvbjxDb21waWxhdGlvblVuaXQsIFN0cmluZz4gcHJpbnRlcikgeworICAgICAgICBhc3NlcnROb3ROdWxsKHByaW50ZXIpOworICAgICAgICB0aGlzLnByaW50ZXIgPSBwcmludGVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByaW50aW5nIGZ1bmN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBGdW5jdGlvbjxDb21waWxhdGlvblVuaXQsIFN0cmluZz4gZ2V0UHJpbnRlcigpIHsKKyAgICAgICAgcmV0dXJuIHByaW50ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSByZWN1cnNpdmUgZmlsZSB0cmVlIHdhbGsgdXNpbmcgdGhyZWFkcy4gQSBuZXcgdGhyZWFkIGlzIGludm9rZWQgZm9yIGVhY2ggbmV3IGRpcmVjdG9yeSBkaXNjb3ZlcmVkCisgICAgICogZHVyaW5nIHRoZSB3YWxrLiBGb3IgZWFjaCBmaWxlIHZpc2l0ZWQsIHRoZSB1c2VyLXByb3ZpZGVkIHtAbGluayBWaXNpdEZpbGVDYWxsYmFja30gaXMgY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiBwYXRoIGFuZCBmaWxlIGF0dHJpYnV0ZXMuIEFueSBzaGFyZWQgcmVzb3VyY2VzIGFjY2Vzc2VkIGluIGEge0BsaW5rIFZpc2l0RmlsZUNhbGxiYWNrfSBzaG91bGQgYmUgbWFkZQorICAgICAqIHRocmVhZC1zYWZlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhcmFsbGVsUGFyc2UgZXh0ZW5kcyBSZWN1cnNpdmVBY3Rpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggcGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWaXNpdEZpbGVDYWxsYmFjayBjYWxsYmFjazsKKworICAgICAgICBQYXJhbGxlbFBhcnNlKFBhdGggcGF0aCwgVmlzaXRGaWxlQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFyYWxsZWxQYXJzZT4gd2Fsa3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZXMud2Fsa0ZpbGVUcmVlKHBhdGgsIG5ldyBTaW1wbGVGaWxlVmlzaXRvcjxQYXRoPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgcHJlVmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVNvdXJjZVJvb3QuaXNTZW5zaWJsZURpcmVjdG9yeVRvRW50ZXIoZGlyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1NVQlRSRUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRpci5lcXVhbHMoUGFyYWxsZWxQYXJzZS50aGlzLnBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWxsZWxQYXJzZSB3ID0gbmV3IFBhcmFsbGVsUGFyc2UoZGlyLCBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5mb3JrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa3MuYWRkKHcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1NVQlRSRUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT05USU5VRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZShQYXRoIGZpbGUsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5wcm9jZXNzKGZpbGUsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChQYXJhbGxlbFBhcnNlIHcgOiB3YWxrcykgeworICAgICAgICAgICAgICAgIHcuam9pbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJmYWNlIFZpc2l0RmlsZUNhbGxiYWNrIHsKKyAgICAgICAgICAgIEZpbGVWaXNpdFJlc3VsdCBwcm9jZXNzKFBhdGggZmlsZSwgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlWmlwLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlWmlwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNjRmNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Tb3VyY2VaaXAuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOw0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0Ow0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsNCitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOw0KKw0KK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVDsNCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7DQoraW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsNCisNCisvKioNCisgKiBBIGNvbGxlY3Rpb24gb2YgSmF2YSBzb3VyY2UgZmlsZXMgYW5kIGl0cyBzdWItZGlyZWN0b3JpZXMgbG9jYXRlZCBpbiBhIFpJUCBvciBKQVIgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW0uDQorICogRmlsZXMgY2FuIGJlIHBhcnNlZCB3aXRoIGEgY2FsbGJhY2suDQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgU291cmNlWmlwIHsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBQYXRoIHppcFBhdGg7DQorICAgIHByaXZhdGUgUGFyc2VyQ29uZmlndXJhdGlvbiBwYXJzZXJDb25maWd1cmF0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlIGEgbmV3IFpJUCBwYXJzZXIuIEFuIGluc3RhbmNlIG9mIHtAbGluayBKYXZhUGFyc2VyfSB3aXRoIHRoZSBkZWZhdWx0IHtAbGluayBQYXJzZXJDb25maWd1cmF0aW9ufSB3aWxsIGJlDQorICAgICAqIHVzZWQgdG8gcGFyc2UgdGhlIFpJUC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHppcFBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgWklQIGZpbGUgdG8gcGFyc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgU291cmNlWmlwKFBhdGggemlwUGF0aCkgew0KKyAgICAgICAgdGhpcyh6aXBQYXRoLCBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlIGEgbmV3IFpJUCBwYXJzZXIuIEFuIGluc3RhbmNlIG9mIHtAbGluayBKYXZhUGFyc2VyfSB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIHdpbGwgYmUgdXNlZCB0byBwYXJzZQ0KKyAgICAgKiB0aGUgWklQLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gemlwUGF0aCBUaGUgYWJzb2x1dGUgcGF0aCBvZiBaSVAgZmlsZSB0byBwYXJzZS4NCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gdG8gaW5pdGlhdGUgdGhlIGRlZmF1bHQgcGFyc2VyIHdpdGguDQorICAgICAqLw0KKyAgICBwdWJsaWMgU291cmNlWmlwKFBhdGggemlwUGF0aCwgUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7DQorICAgICAgICBhc3NlcnROb3ROdWxsKHppcFBhdGgpOw0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWd1cmF0aW9uKTsNCisgICAgICAgIHRoaXMuemlwUGF0aCA9IHppcFBhdGgubm9ybWFsaXplKCk7DQorICAgICAgICB0aGlzLnBhcnNlckNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOw0KKyAgICAgICAgTG9nLmluZm8oIk5ldyBzb3VyY2UgemlwIGF0IFwiJXNcIiIsIHRoaXMuemlwUGF0aCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRyaWVzIHRvIHBhcnNlIGFsbCAnLmphdmEnIGZpbGVzIGluIHRoZSBaSVAgbG9jYXRlZCBhdCB0aGlzIDxpPlNvdXJjZVppcDwvaT4ncyBwYXRoIGFuZCByZXR1cm5zIHRoZSBwYXJzZQ0KKyAgICAgKiByZXN1bHRzIGluIGEgbGlzdC4NCisgICAgICoNCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgcGF0aC1jb21waWxhdGlvbiB1bml0IHBhaXJzLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gcGFyc2UgdGhlIGdpdmVuIHNvdXJjZS4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0PFBhaXI8UGF0aCwgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4+IHBhcnNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIExvZy5pbmZvKCJQYXJzaW5nIHppcCBhdCBcIiVzXCIiLCB6aXBQYXRoKTsNCisgICAgICAgIExpc3Q8UGFpcjxQYXRoLCBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+Pj4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICAgICAgcGFyc2UoKHBhdGgsIHJlc3VsdCkgLT4gcmVzdWx0cy5hZGQobmV3IFBhaXI8PihwYXRoLCByZXN1bHQpKSk7DQorICAgICAgICByZXR1cm4gcmVzdWx0czsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVHJpZXMgdG8gcGFyc2UgYWxsICcuamF2YScgZmlsZXMgaW4gdGhlIFpJUCBsb2NhdGVkIGF0IHRoaXMgPGk+U291cmNlWmlwPC9pPidzIHBhdGggYW5kIHJldHVybnMgdGhlIHBhcnNlDQorICAgICAqIHJlc3VsdHMgaW4gYSBsaXN0Lg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBwYXRoLWNvbXBpbGF0aW9uIHVuaXQgcGFpcnMuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBwYXJzZSB0aGUgZ2l2ZW4gc291cmNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIFNvdXJjZVppcCBwYXJzZShDYWxsYmFjayBjYWxsYmFjaykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIExvZy5pbmZvKCJQYXJzaW5nIHppcCBhdCBcIiVzXCIiLCB6aXBQYXRoKTsNCisgICAgICAgIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKHBhcnNlckNvbmZpZ3VyYXRpb24pOw0KKyAgICAgICAgdHJ5IChaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZSh6aXBQYXRoLnRvRmlsZSgpKSkgew0KKyAgICAgICAgICAgIGZvciAoWmlwRW50cnkgZW50cnkgOiBDb2xsZWN0aW9ucy5saXN0KHppcEZpbGUuZW50cmllcygpKSkgew0KKyAgICAgICAgICAgICAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7DQorICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbygiUGFyc2luZyB6aXAgZW50cnkgXCIlc1wiIiwgZW50cnkuZ2V0TmFtZSgpKTsNCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcih6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSkpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJvY2VzcyhQYXRocy5nZXQoZW50cnkuZ2V0TmFtZSgpKSwgcmVzdWx0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBbiBpbnRlcmZhY2UgdG8gZGVmaW5lIGEgY2FsbGJhY2sgZm9yIGVhY2ggZmlsZSB0aGF0J3MgcGFyc2VkLg0KKyAgICAgKi8NCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UNCisgICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHBhcnNlIHJlc3VsdC4NCisgICAgICAgICAqDQorICAgICAgICAgKiBAcGFyYW0gcmVsYXRpdmVaaXBFbnRyeVBhdGggVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGVudHJ5IGluIHRoZSBaSVAgZmlsZSB0aGF0IHdhcyBwYXJzZWQuDQorICAgICAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBwYXJzZSByZXN1bHQgb2YgZmlsZSBsb2NhdGVkIGF0IDxpPmFic29sdXRlUGF0aDwvaT4uDQorICAgICAgICAgKi8NCisgICAgICAgIHZvaWQgcHJvY2VzcyhQYXRoIHJlbGF0aXZlWmlwRW50cnlQYXRoLCBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgcGF0aCBvZiB0aGUgWklQIGZpbGUgdG8gYmUgcGFyc2VkLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoaXMgWklQIGZpbGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgUGF0aCBnZXRaaXBQYXRoKCkgew0KKyAgICAgICAgcmV0dXJuIHppcFBhdGg7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBAZGVwcmVjYXRlZCBzdG9yZSBQYXJzZXJDb25maWd1cmF0aW9uIG5vdw0KKyAgICAgKi8NCisgICAgQERlcHJlY2F0ZWQNCisgICAgcHVibGljIEphdmFQYXJzZXIgZ2V0SmF2YVBhcnNlcigpIHsNCisgICAgICAgIHJldHVybiBuZXcgSmF2YVBhcnNlcihwYXJzZXJDb25maWd1cmF0aW9uKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBwYXJzZXIgdGhhdCBpcyB1c2VkIGZvciBwYXJzaW5nIGJ5IGRlZmF1bHQuDQorICAgICAqDQorICAgICAqIEBkZXByZWNhdGVkIHN0b3JlIFBhcnNlckNvbmZpZ3VyYXRpb24gbm93DQorICAgICAqLw0KKyAgICBARGVwcmVjYXRlZA0KKyAgICBwdWJsaWMgU291cmNlWmlwIHNldEphdmFQYXJzZXIoSmF2YVBhcnNlciBqYXZhUGFyc2VyKSB7DQorICAgICAgICBhc3NlcnROb3ROdWxsKGphdmFQYXJzZXIpOw0KKyAgICAgICAgdGhpcy5wYXJzZXJDb25maWd1cmF0aW9uID0gamF2YVBhcnNlci5nZXRQYXJzZXJDb25maWd1cmF0aW9uKCk7DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUGFyc2VyQ29uZmlndXJhdGlvbiBnZXRQYXJzZXJDb25maWd1cmF0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIHBhcnNlckNvbmZpZ3VyYXRpb247DQorICAgIH0NCisNCisgICAgcHVibGljIFNvdXJjZVppcCBzZXRQYXJzZXJDb25maWd1cmF0aW9uKFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbikgew0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJzZXJDb25maWd1cmF0aW9uKTsNCisgICAgICAgIHRoaXMucGFyc2VyQ29uZmlndXJhdGlvbiA9IHBhcnNlckNvbmZpZ3VyYXRpb247DQorICAgICAgICByZXR1cm4gdGhpczsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU3RyaW5nRXNjYXBlVXRpbHMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9TdHJpbmdFc2NhcGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzMyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU3RyaW5nRXNjYXBlVXRpbHMuamF2YQpAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCisvKioKKyAqIEFkYXB0ZWQgZnJvbSBhcGFjaGUgY29tbW9ucy1sYW5nMyBwcm9qZWN0LgorICogPHA+CisgKiBVbmVzY2FwZXMgZXNjYXBlZCBjaGFycyBpbiBzdHJpbmdzLgorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nRXNjYXBlVXRpbHMgeworCisgICAgcHJpdmF0ZSBTdHJpbmdFc2NhcGVVdGlscygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Fc2NhcGVzIHRoZSBjaGFyYWN0ZXJzIGluIGEge0Bjb2RlIFN0cmluZ30gdXNpbmcgSmF2YSBTdHJpbmcgcnVsZXMuPC9wPgorICAgICAqIDxwPgorICAgICAqIDxwPkRlYWxzIGNvcnJlY3RseSB3aXRoIHF1b3RlcyBhbmQgY29udHJvbC1jaGFycyAodGFiLCBiYWNrc2xhc2gsIGNyLCBmZiwgZXRjLikgPC9wPgorICAgICAqIDxwPgorICAgICAqIDxwPlNvIGEgdGFiIGJlY29tZXMgdGhlIGNoYXJhY3RlcnMge0Bjb2RlICdcXCd9IGFuZAorICAgICAqIHtAY29kZSAndCd9LjwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gSmF2YSBzdHJpbmdzIGFuZCBKYXZhU2NyaXB0IHN0cmluZ3MKKyAgICAgKiBpcyB0aGF0IGluIEphdmFTY3JpcHQsIGEgc2luZ2xlIHF1b3RlIGFuZCBmb3J3YXJkLXNsYXNoICgvKSBhcmUgZXNjYXBlZC48L3A+CisgICAgICogPHA+CisgICAgICogPHA+RXhhbXBsZTo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiBpbnB1dCBzdHJpbmc6IEhlIGRpZG4ndCBzYXksICJTdG9wISIKKyAgICAgKiBvdXRwdXQgc3RyaW5nOiBIZSBkaWRuJ3Qgc2F5LCBcIlN0b3AhXCIKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBTdHJpbmcgdG8gZXNjYXBlIHZhbHVlcyBpbiwgbWF5IGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIFN0cmluZyB3aXRoIGVzY2FwZWQgdmFsdWVzLCB7QGNvZGUgbnVsbH0gaWYgbnVsbCBzdHJpbmcgaW5wdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVKYXZhKGZpbmFsIFN0cmluZyBpbnB1dCkgeworICAgICAgICByZXR1cm4gRVNDQVBFX0pBVkEudHJhbnNsYXRlKGlucHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5VbmVzY2FwZXMgYW55IEphdmEgbGl0ZXJhbHMgZm91bmQgaW4gdGhlIHtAY29kZSBTdHJpbmd9LgorICAgICAqIEZvciBleGFtcGxlLCBpdCB3aWxsIHR1cm4gYSBzZXF1ZW5jZSBvZiB7QGNvZGUgJ1wnfSBhbmQKKyAgICAgKiB7QGNvZGUgJ24nfSBpbnRvIGEgbmV3bGluZSBjaGFyYWN0ZXIsIHVubGVzcyB0aGUge0Bjb2RlICdcJ30KKyAgICAgKiBpcyBwcmVjZWRlZCBieSBhbm90aGVyIHtAY29kZSAnXCd9LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUge0Bjb2RlIFN0cmluZ30gdG8gdW5lc2NhcGUsIG1heSBiZSBudWxsCisgICAgICogQHJldHVybiBhIG5ldyB1bmVzY2FwZWQge0Bjb2RlIFN0cmluZ30sIHtAY29kZSBudWxsfSBpZiBudWxsIHN0cmluZyBpbnB1dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlSmF2YShmaW5hbCBTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIFVORVNDQVBFX0pBVkEudHJhbnNsYXRlKGlucHV0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIEpBVkFfQ1RSTF9DSEFSU19VTkVTQ0FQRSA9IHsKKyAgICAgICAgICAgIHsiXFxiIiwgIlxiIn0sCisgICAgICAgICAgICB7IlxcbiIsICJcbiJ9LAorICAgICAgICAgICAgeyJcXHQiLCAiXHQifSwKKyAgICAgICAgICAgIHsiXFxmIiwgIlxmIn0sCisgICAgICAgICAgICB7IlxcciIsICJcciJ9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gSkFWQV9DVFJMX0NIQVJTX0VTQ0FQRSA9IHsKKyAgICAgICAgICAgIHsiXGIiLCAiXFxiIn0sCisgICAgICAgICAgICB7IlxuIiwgIlxcbiJ9LAorICAgICAgICAgICAgeyJcdCIsICJcXHQifSwKKyAgICAgICAgICAgIHsiXGYiLCAiXFxmIn0sCisgICAgICAgICAgICB7IlxyIiwgIlxcciJ9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJTZXF1ZW5jZVRyYW5zbGF0b3IgRVNDQVBFX0pBVkEgPQorICAgICAgICAgICAgbmV3IEFnZ3JlZ2F0ZVRyYW5zbGF0b3IoCisgICAgICAgICAgICAgICAgICAgIG5ldyBMb29rdXBUcmFuc2xhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXVtdeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJcIiIsICJcXFwiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlxcIiwgIlxcXFwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvb2t1cFRyYW5zbGF0b3IoSkFWQV9DVFJMX0NIQVJTX0VTQ0FQRS5jbG9uZSgpKQorICAgICAgICAgICAgKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJTZXF1ZW5jZVRyYW5zbGF0b3IgVU5FU0NBUEVfSkFWQSA9CisgICAgICAgICAgICBuZXcgQWdncmVnYXRlVHJhbnNsYXRvcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IE9jdGFsVW5lc2NhcGVyKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBVbmljb2RlVW5lc2NhcGVyKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBMb29rdXBUcmFuc2xhdG9yKEpBVkFfQ1RSTF9DSEFSU19VTkVTQ0FQRS5jbG9uZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvb2t1cFRyYW5zbGF0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdW117CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlxcXFwiLCAiXFwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiXFxcIiIsICJcIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJcXCciLCAiJyJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJcXCIsICIifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICApOworCisgICAgLyoqCisgICAgICogQWRhcHRlZCBmcm9tIGFwYWNoZSBjb21tb25zLWxhbmczIHByb2plY3QuCisgICAgICogPHA+CisgICAgICogQW4gQVBJIGZvciB0cmFuc2xhdGluZyB0ZXh0LgorICAgICAqIEl0cyBjb3JlIHVzZSBpcyB0byBlc2NhcGUgYW5kIHVuZXNjYXBlIHRleHQuIEJlY2F1c2UgZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcKKyAgICAgKiBpcyBjb21wbGV0ZWx5IGNvbnRleHR1YWwsIHRoZSBBUEkgZG9lcyBub3QgcHJlc2VudCB0d28gc2VwYXJhdGUgc2lnbmF0dXJlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNsYXRlIGEgc2V0IG9mIGNvZGVwb2ludHMsIHJlcHJlc2VudGVkIGJ5IGFuIGludCBpbmRleCBpbnRvIGEgQ2hhclNlcXVlbmNlLAorICAgICAgICAgKiBpbnRvIGFub3RoZXIgc2V0IG9mIGNvZGVwb2ludHMuIFRoZSBudW1iZXIgb2YgY29kZXBvaW50cyBjb25zdW1lZCBtdXN0IGJlIHJldHVybmVkLAorICAgICAgICAgKiBhbmQgdGhlIG9ubHkgSU9FeGNlcHRpb25zIHRocm93biBtdXN0IGJlIGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgV3JpdGVyIHNvIHRoYXQKKyAgICAgICAgICogdGhlIHRvcCBsZXZlbCBBUEkgbWF5IHJlbGlhYmx5IGlnbm9yZSBTdHJpbmdXcml0ZXIgSU9FeGNlcHRpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5wdXQgQ2hhclNlcXVlbmNlIHRoYXQgaXMgYmVpbmcgdHJhbnNsYXRlZAorICAgICAgICAgKiBAcGFyYW0gaW5kZXggaW50IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBwb2ludCBvZiB0cmFuc2xhdGlvbgorICAgICAgICAgKiBAcGFyYW0gb3V0IFdyaXRlciB0byB0cmFuc2xhdGUgdGhlIHRleHQgdG8KKyAgICAgICAgICogQHJldHVybiBpbnQgY291bnQgb2YgY29kZXBvaW50cyBjb25zdW1lZAorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuZCBvbmx5IGlmIHRoZSBXcml0ZXIgcHJvZHVjZXMgYW4gSU9FeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgdHJhbnNsYXRlKENoYXJTZXF1ZW5jZSBpbnB1dCwgaW50IGluZGV4LCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhlbHBlciBmb3Igbm9uLVdyaXRlciB1c2FnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlucHV0IENoYXJTZXF1ZW5jZSB0byBiZSB0cmFuc2xhdGVkCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIG91dHB1dCBvZiB0cmFuc2xhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0cmFuc2xhdGUoZmluYWwgQ2hhclNlcXVlbmNlIGlucHV0KSB7CisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcihpbnB1dC5sZW5ndGgoKSAqIDIpOworICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShpbnB1dCwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBuZXZlciBldmVyIGhhcHBlbiB3aGlsZSB3cml0aW5nIHRvIGEgU3RyaW5nV3JpdGVyCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2xhdGUgYW4gaW5wdXQgb250byBhIFdyaXRlci4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGZpbmFsIGFzIGl0cyBhbGdvcml0aG0gaXMKKyAgICAgICAgICogdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIGFic3RyYWN0IG1ldGhvZCBvZiB0aGlzIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5wdXQgQ2hhclNlcXVlbmNlIHRoYXQgaXMgYmVpbmcgdHJhbnNsYXRlZAorICAgICAgICAgKiBAcGFyYW0gb3V0IFdyaXRlciB0byB0cmFuc2xhdGUgdGhlIHRleHQgdG8KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbmQgb25seSBpZiB0aGUgV3JpdGVyIHByb2R1Y2VzIGFuIElPRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCB0cmFuc2xhdGUoZmluYWwgQ2hhclNlcXVlbmNlIGlucHV0LCBmaW5hbCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFdyaXRlciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IGlucHV0Lmxlbmd0aCgpOworICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbikgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb25zdW1lZCA9IHRyYW5zbGF0ZShpbnB1dCwgcG9zLCBvdXQpOworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZWQgaW1wbGVtZW50YXRpb24gb2YgQ2hhcmFjdGVyLnRvQ2hhcnMoQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGlucHV0LCBwb3MpKQorICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZHMgYWxsb2NhdGluZyB0ZW1wIGNoYXIgYXJyYXlzIGFuZCBkdXBsaWNhdGUgY2hlY2tzCisgICAgICAgICAgICAgICAgICAgIGNoYXIgYzEgPSBpbnB1dC5jaGFyQXQocG9zKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMxKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKGMxKSAmJiBwb3MgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYzIgPSBpbnB1dC5jaGFyQXQocG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dTdXJyb2dhdGUoYzIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY29udHJhY3Qgd2l0aCB0cmFuc2xhdG9ycyBpcyB0aGF0IHRoZXkgaGF2ZSB0byB1bmRlcnN0YW5kIGNvZGVwb2ludHMKKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhleSBqdXN0IHRvb2sgY2FyZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyCisgICAgICAgICAgICAgICAgZm9yIChpbnQgcHQgPSAwOyBwdCA8IGNvbnN1bWVkOyBwdCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcyArPSBDaGFyYWN0ZXIuY2hhckNvdW50KENoYXJhY3Rlci5jb2RlUG9pbnRBdChpbnB1dCwgcG9zKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgbWVyZ2VyIG9mIHRoaXMgdHJhbnNsYXRvciB3aXRoIGFub3RoZXIgc2V0IG9mCisgICAgICAgICAqIHRyYW5zbGF0b3JzLiBVc2VmdWwgaW4gY3VzdG9taXppbmcgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2xhdG9ycyBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIGFycmF5IG9mIHRyYW5zbGF0b3JzIHRvIG1lcmdlIHdpdGggdGhpcyBvbmUKKyAgICAgICAgICogQHJldHVybiBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIG1lcmdpbmcgdGhpcyB0cmFuc2xhdG9yIHdpdGggdGhlIG90aGVycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIENoYXJTZXF1ZW5jZVRyYW5zbGF0b3Igd2l0aChmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yLi4uIHRyYW5zbGF0b3JzKSB7CisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yW10gbmV3QXJyYXkgPSBuZXcgQ2hhclNlcXVlbmNlVHJhbnNsYXRvclt0cmFuc2xhdG9ycy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIG5ld0FycmF5WzBdID0gdGhpczsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodHJhbnNsYXRvcnMsIDAsIG5ld0FycmF5LCAxLCB0cmFuc2xhdG9ycy5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVUcmFuc2xhdG9yKG5ld0FycmF5KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQWRhcHRlZCBmcm9tIGFwYWNoZSBjb21tb25zLWxhbmczIHByb2plY3QuCisgICAgICogPHA+CisgICAgICogVHJhbnNsYXRlcyBhIHZhbHVlIHVzaW5nIGEgbG9va3VwIHRhYmxlLgorICAgICAqCisgICAgICogQHNpbmNlIDMuMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvb2t1cFRyYW5zbGF0b3IgZXh0ZW5kcyBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGxvb2t1cE1hcDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PENoYXJhY3Rlcj4gcHJlZml4U2V0OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBzaG9ydGVzdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbG9uZ2VzdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lIHRoZSBsb29rdXAgdGFibGUgdG8gYmUgdXNlZCBpbiB0cmFuc2xhdGlvbgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSB0aGF0LCBhcyBvZiBMYW5nIDMuMSwgdGhlIGtleSB0byB0aGUgbG9va3VwIHRhYmxlIGlzIGNvbnZlcnRlZCB0byBhCisgICAgICAgICAqIGphdmEubGFuZy5TdHJpbmcuIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRoZSBrZXkgdG8gc3VwcG9ydCBoYXNoQ29kZSBhbmQKKyAgICAgICAgICogZXF1YWxzKE9iamVjdCksIGFsbG93aW5nIGl0IHRvIGJlIHRoZSBrZXkgZm9yIGEgSGFzaE1hcC4gU2VlIExBTkctODgyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbG9va3VwIENoYXJTZXF1ZW5jZVtdW10gdGFibGUgb2Ygc2l6ZSBbKl1bMl0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb29rdXBUcmFuc2xhdG9yKGZpbmFsIENoYXJTZXF1ZW5jZVtdLi4uIGxvb2t1cCkgeworICAgICAgICAgICAgbG9va3VwTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgcHJlZml4U2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgaW50IF9zaG9ydGVzdCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgaW50IF9sb25nZXN0ID0gMDsKKyAgICAgICAgICAgIGlmIChsb29rdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgQ2hhclNlcXVlbmNlW10gc2VxIDogbG9va3VwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9va3VwTWFwLnB1dChzZXFbMF0udG9TdHJpbmcoKSwgc2VxWzFdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFNldC5hZGQoc2VxWzBdLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzeiA9IHNlcVswXS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN6IDwgX3Nob3J0ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfc2hvcnRlc3QgPSBzejsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3ogPiBfbG9uZ2VzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgX2xvbmdlc3QgPSBzejsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3J0ZXN0ID0gX3Nob3J0ZXN0OworICAgICAgICAgICAgbG9uZ2VzdCA9IF9sb25nZXN0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zbGF0ZShmaW5hbCBDaGFyU2VxdWVuY2UgaW5wdXQsIGZpbmFsIGludCBpbmRleCwgZmluYWwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRyYW5zbGF0aW9uIGV4aXN0cyBmb3IgdGhlIGlucHV0IGF0IHBvc2l0aW9uIGluZGV4CisgICAgICAgICAgICBpZiAocHJlZml4U2V0LmNvbnRhaW5zKGlucHV0LmNoYXJBdChpbmRleCkpKSB7CisgICAgICAgICAgICAgICAgaW50IG1heCA9IGxvbmdlc3Q7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgbG9uZ2VzdCA+IGlucHV0Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGlucHV0Lmxlbmd0aCgpIC0gaW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudCBncmVlZHkgYWxnb3JpdGhtIGJ5IHRyeWluZyBtYXhpbXVtIG1hdGNoIGZpcnN0CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1heDsgaSA+PSBzaG9ydGVzdDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBzdWJTZXEgPSBpbnB1dC5zdWJTZXF1ZW5jZShpbmRleCwgaW5kZXggKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGxvb2t1cE1hcC5nZXQoc3ViU2VxLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRhcHRlZCBmcm9tIGFwYWNoZSBjb21tb25zLWxhbmczIHByb2plY3QuCisgICAgICogPHA+CisgICAgICogRXhlY3V0ZXMgYSBzZXF1ZW5jZSBvZiB0cmFuc2xhdG9ycyBvbmUgYWZ0ZXIgdGhlIG90aGVyLiBFeGVjdXRpb24gZW5kcyB3aGVuZXZlcgorICAgICAqIHRoZSBmaXJzdCB0cmFuc2xhdG9yIGNvbnN1bWVzIGNvZGVwb2ludHMgZnJvbSB0aGUgaW5wdXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMy4wCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWdncmVnYXRlVHJhbnNsYXRvciBleHRlbmRzIENoYXJTZXF1ZW5jZVRyYW5zbGF0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlVHJhbnNsYXRvcltdIHRyYW5zbGF0b3JzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTcGVjaWZ5IHRoZSB0cmFuc2xhdG9ycyB0byBiZSB1c2VkIGF0IGNyZWF0aW9uIHRpbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2xhdG9ycyBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIGFycmF5IHRvIGFnZ3JlZ2F0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZVRyYW5zbGF0b3IoZmluYWwgQ2hhclNlcXVlbmNlVHJhbnNsYXRvci4uLiB0cmFuc2xhdG9ycykgeworICAgICAgICAgICAgdGhpcy50cmFuc2xhdG9ycyA9IHRyYW5zbGF0b3JzID09IG51bGwgPyBudWxsIDogdHJhbnNsYXRvcnMuY2xvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmlyc3QgdHJhbnNsYXRvciB0byBjb25zdW1lIGNvZGVwb2ludHMgZnJvbSB0aGUgaW5wdXQgaXMgdGhlICd3aW5uZXInLgorICAgICAgICAgKiBFeGVjdXRpb24gc3RvcHMgd2l0aCB0aGUgbnVtYmVyIG9mIGNvbnN1bWVkIGNvZGVwb2ludHMgYmVpbmcgcmV0dXJuZWQuCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zbGF0ZShmaW5hbCBDaGFyU2VxdWVuY2UgaW5wdXQsIGZpbmFsIGludCBpbmRleCwgZmluYWwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQ2hhclNlcXVlbmNlVHJhbnNsYXRvciB0cmFuc2xhdG9yIDogdHJhbnNsYXRvcnMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29uc3VtZWQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZShpbnB1dCwgaW5kZXgsIG91dCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGFwdGVkIGZyb20gYXBhY2hlIGNvbW1vbnMtbGFuZzMgcHJvamVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2xhdGUgZXNjYXBlZCBvY3RhbCBTdHJpbmdzIGJhY2sgdG8gdGhlaXIgb2N0YWwgdmFsdWVzLgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCAiXDQ1IiBzaG91bGQgZ28gYmFjayB0byBiZWluZyB0aGUgc3BlY2lmaWMgdmFsdWUgKGEgJSkuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdGhlIHZpYWJsZSByYW5nZSBvZiBvY3RhbCBmb3IgSmF2YTsgbmFtZWx5CisgICAgICogMSB0byAzNzcuIFRoaXMgaXMgYmVjYXVzZSBwYXJzaW5nIEphdmEgaXMgdGhlIG1haW4gdXNlIGNhc2UuCisgICAgICoKKyAgICAgKiBAc2luY2UgMy4wCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT2N0YWxVbmVzY2FwZXIgZXh0ZW5kcyBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIHsKKworICAgICAgICAvKioKKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNsYXRlKGZpbmFsIENoYXJTZXF1ZW5jZSBpbnB1dCwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgaW50IHJlbWFpbmluZyA9IGlucHV0Lmxlbmd0aCgpIC0gaW5kZXggLSAxOyAvLyBob3cgbWFueSBjaGFyYWN0ZXJzIGxlZnQsIGlnbm9yaW5nIHRoZSBmaXJzdCBcCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJBdChpbmRleCkgPT0gJ1xcJyAmJiByZW1haW5pbmcgPiAwICYmIGlzT2N0YWxEaWdpdChpbnB1dC5jaGFyQXQoaW5kZXggKyAxKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV4dCA9IGluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV4dDIgPSBpbmRleCArIDI7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IG5leHQzID0gaW5kZXggKyAzOworCisgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGlzIGlzIGdvb2QgYXMgd2UgY2hlY2tlZCBpdCBpbiB0aGUgaWYgYmxvY2sgYWJvdmUKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpbnB1dC5jaGFyQXQobmV4dCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+IDEgJiYgaXNPY3RhbERpZ2l0KGlucHV0LmNoYXJBdChuZXh0MikpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGlucHV0LmNoYXJBdChuZXh0MikpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMiAmJiBpc1plcm9Ub1RocmVlKGlucHV0LmNoYXJBdChuZXh0KSkgJiYgaXNPY3RhbERpZ2l0KGlucHV0LmNoYXJBdChuZXh0MykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpbnB1dC5jaGFyQXQobmV4dDMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG91dC53cml0ZShJbnRlZ2VyLnBhcnNlSW50KGJ1aWxkZXIudG9TdHJpbmcoKSwgOCkpOworICAgICAgICAgICAgICAgIHJldHVybiAxICsgYnVpbGRlci5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gY2hhciBpcyBhbiBvY3RhbCBkaWdpdC4gT2N0YWwgZGlnaXRzIGFyZSB0aGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZGlnaXRzIDAgdG8KKyAgICAgICAgICogNy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNoIHRoZSBjaGFyIHRvIGNoZWNrCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhciBpcyB0aGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIG9uZSBvZiB0aGUgZGlnaXRzIGZyb20gMCB0byA3CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNPY3RhbERpZ2l0KGZpbmFsIGNoYXIgY2gpIHsKKyAgICAgICAgICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzcnOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gY2hhciBpcyB0aGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIG9uZSBvZiB0aGUgZGlnaXQgZnJvbSAwIHRvIDMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjaCB0aGUgY2hhciB0byBjaGVjaworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNoYXIgaXMgdGhlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiBvbmUgb2YgdGhlIGRpZ2l0cyBmcm9tIDAgdG8gMworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzWmVyb1RvVGhyZWUoZmluYWwgY2hhciBjaCkgeworICAgICAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnMyc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGFwdGVkIGZyb20gYXBhY2hlIGNvbW1vbnMtbGFuZzMgcHJvamVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2xhdGVzIGVzY2FwZWQgVW5pY29kZSB2YWx1ZXMgb2YgdGhlIGZvcm0gXFx1K1xkXGRcZFxkIGJhY2sgdG8KKyAgICAgKiBVbmljb2RlLiBJdCBzdXBwb3J0cyBtdWx0aXBsZSAndScgY2hhcmFjdGVycyBhbmQgd2lsbCB3b3JrIHdpdGggb3IKKyAgICAgKiB3aXRob3V0IHRoZSArLgorICAgICAqCisgICAgICogQHNpbmNlIDMuMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFVuaWNvZGVVbmVzY2FwZXIgZXh0ZW5kcyBDaGFyU2VxdWVuY2VUcmFuc2xhdG9yIHsKKworICAgICAgICAvKioKKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNsYXRlKGZpbmFsIENoYXJTZXF1ZW5jZSBpbnB1dCwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJBdChpbmRleCkgPT0gJ1xcJyAmJiBpbmRleCArIDEgPCBpbnB1dC5sZW5ndGgoKSAmJiBpbnB1dC5jaGFyQXQoaW5kZXggKyAxKSA9PSAndScpIHsKKyAgICAgICAgICAgICAgICAvLyBjb25zdW1lIG9wdGlvbmFsIGFkZGl0aW9uYWwgJ3UnIGNoYXJzCisgICAgICAgICAgICAgICAgaW50IGkgPSAyOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCArIGkgPCBpbnB1dC5sZW5ndGgoKSAmJiBpbnB1dC5jaGFyQXQoaW5kZXggKyBpKSA9PSAndScpIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmRleCArIGkgPCBpbnB1dC5sZW5ndGgoKSAmJiBpbnB1dC5jaGFyQXQoaW5kZXggKyBpKSA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmRleCArIGkgKyA0IDw9IGlucHV0Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCA0IGhleCBkaWdpdHMKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHVuaWNvZGUgPSBpbnB1dC5zdWJTZXF1ZW5jZShpbmRleCArIGksIGluZGV4ICsgaSArIDQpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHVuaWNvZGUudG9TdHJpbmcoKSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKChjaGFyKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSB1bmljb2RlIHZhbHVlOiAiICsgdW5pY29kZSwgbmZlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArIDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxlc3MgdGhhbiA0IGhleCBkaWdpdHMgaW4gdW5pY29kZSB2YWx1ZTogJyIgKyBpbnB1dC5zdWJTZXF1ZW5jZShpbmRleCwgaW5wdXQubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICArICInIGR1ZSB0byBlbmQgb2YgQ2hhclNlcXVlbmNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9VdGlscy5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiMDBlNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuKjsKKworLyoqCisgKiBBbnkga2luZCBvZiB1dGlsaXR5LgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFN0cmluZz4gU1RSSU5HX05PVF9FTVBUWSA9IHMgLT4gIXMuaXNFbXB0eSgpOworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IEphdmFQYXJzZXIsIHBsZWFzZSB3cml0ZSB5b3VyIG93biByZXBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IGVuc3VyZU5vdE51bGwoTGlzdDxUPiBsaXN0KSB7CisgICAgICAgIHJldHVybiBsaXN0ID09IG51bGwgPyBuZXcgQXJyYXlMaXN0PD4oKSA6IGxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBpc051bGxPckVtcHR5KENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbiA9PSBudWxsIHx8IGNvbGxlY3Rpb24uaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgYXNzZXJ0Tm90TnVsbChUIG8pIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJBIHJlZmVyZW5jZSB3YXMgdW5leHBlY3RlZGx5IG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzZXJ0Tm9uRW1wdHkoU3RyaW5nIHN0cmluZykgeworICAgICAgICBpZiAoc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJBIHN0cmluZyB3YXMgdW5leHBlY3RlZGx5IGVtcHR5LiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBzdHJpbmcgd2l0aCBBU0NJSSBjaGFyYWN0ZXJzIDEwIGFuZCAxMyByZXBsYWNlZCBieSB0aGUgdGV4dCAiXG4iIGFuZCAiXHIiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZUVuZE9mTGluZXMoU3RyaW5nIHN0cmluZykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGVzY2FwZWRTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGNoYXIgYyA6IHN0cmluZy50b0NoYXJBcnJheSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlc2NhcGVkU3RyaW5nLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGVyVG9TdHJpbmcoUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmaW5hbCBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbOCAqIDEwMjRdOworICAgICAgICBpbnQgbnVtQ2hhcnM7CisKKyAgICAgICAgd2hpbGUgKChudW1DaGFycyA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpID4gMCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIsIDAsIG51bUNoYXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHZhcmFyZ3MgaW4gYSBtdXRhYmxlIGxpc3QuCisgICAgICogVGhpcyBkb2VzIG5vdCBoYXZlIHRoZSBkaXNhZHZhbnRhZ2Ugb2YgQXJyYXlzI2FzTGlzdCB0aGF0IGl0IGhhcyBhIHN0YXRpYyBzaXplLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IEphdmFQYXJzZXIsIHBsZWFzZSB3cml0ZSB5b3VyIG93biByZXBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gYXJyYXlUb0xpc3QoVFtdIGFycmF5KSB7CisgICAgICAgIExpc3Q8VD4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGxpc3QsIGFycmF5KTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHNjcmVhbWluZ1RvQ2FtZWxDYXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9DYW1lbENhc2UoU3RyaW5nIG9yaWdpbmFsKSB7CisgICAgICAgIHJldHVybiBzY3JlYW1pbmdUb0NhbWVsQ2FzZShvcmlnaW5hbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGEgc3RyaW5nIHRvIHRoZSBjYW1lbCBjYXNlIGNvbnZlcnNpb24uCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUgIkFCQ19ERUYiIGJlY29tZXMgImFiY0RlZiIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzY3JlYW1pbmdUb0NhbWVsQ2FzZShTdHJpbmcgb3JpZ2luYWwpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gb3JpZ2luYWwudG9Mb3dlckNhc2UoKS5zcGxpdCgiXyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoaSA9PSAwID8gcGFydHNbaV0gOiBjYXBpdGFsaXplKHBhcnRzW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaW5wdXQgImFDYW1lbENhc2VTdHJpbmciCisgICAgICogQHJldHVybiAiQV9DQU1FTF9DQVNFX1NUUklORyIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYW1lbENhc2VUb1NjcmVhbWluZyhTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgaWYgKGlucHV0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2NyZWFtID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpOworICAgICAgICBmb3IgKGNoYXIgYyA6IGlucHV0LnN1YnN0cmluZygxKS50b0NoYXJBcnJheSgpKSB7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKSB7CisgICAgICAgICAgICAgICAgc2NyZWFtLmFwcGVuZCgiXyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NyZWFtLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY3JlYW0udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5leHQgd29yZCBvZiB0aGUgc3RyaW5nLCBpbiBvdGhlciB3b3JkcyBpdCBzdG9wcyB3aGVuIGEgc3BhY2UgaXMgZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmV4dFdvcmQoU3RyaW5nIHN0cmluZykgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICB3aGlsZSAoaW5kZXggPCBzdHJpbmcubGVuZ3RoKCkgJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFuIGluZGVudCBieSBhcHBlbmRpbmcgaW5kZW50TGV2ZWwgdGFiIGNoYXJhY3RlcnMgdG8gdGhlIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGluZGVudChTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRlbnRMZXZlbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudExldmVsOyBpKyspIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcGl0YWxpemVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBzdHJpbmdUcmFuc2Zvcm1lcihzLCAiY2FwaXRhbGl6ZSIsIFN0cmluZzo6dG9VcHBlckNhc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvd2VyLWNhc2VzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNhcGl0YWxpemUoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZ1RyYW5zZm9ybWVyKHMsICJkZWNhcGl0YWxpemUiLCBTdHJpbmc6OnRvTG93ZXJDYXNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaW5nVHJhbnNmb3JtZXIoU3RyaW5nIHMsIFN0cmluZyBvcGVyYXRpb25EZXNjcmlwdGlvbiwgRnVuY3Rpb248U3RyaW5nLCBTdHJpbmc+IHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIGlmIChzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJZb3UgY2Fubm90ICVzIGFuIGVtcHR5IHN0cmluZyIsIG9wZXJhdGlvbkRlc2NyaXB0aW9uKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWF0aW9uLmFwcGx5KHMuc3Vic3RyaW5nKDAsIDEpKSArCisgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBudWxsLCBhbiBlbXB0eSBPcHRpb25hbCwgb3IgYW4gZW1wdHkgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZUlzTnVsbE9yRW1wdHkoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcHRpb25hbCkgeworICAgICAgICAgICAgaWYgKCgoT3B0aW9uYWwpIHZhbHVlKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gKChPcHRpb25hbCkgdmFsdWUpLmdldCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoKChDb2xsZWN0aW9uKSB2YWx1ZSkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgdGhlIGl0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiBzZXQoVC4uLiBpdGVtcykgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Pihhc0xpc3QoaXRlbXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGNvbnRlbnQgd2l0aCBhbGwga2luZHMgb2YgRU9MIGNoYXJhY3RlcnMgcmVwbGFjZWQgYnkgZW5kT2ZMaW5lQ2hhcmFjdGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplRW9sSW5UZXh0QmxvY2soU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBlbmRPZkxpbmVDaGFyYWN0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXFxSIiwgZW5kT2ZMaW5lQ2hhcmFjdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBsYXN0ICIuIiBhbmQgZXZlcnl0aGluZyBmb2xsb3dpbmcgaXQgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVGaWxlRXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBpbnQgZXh0ZW5zaW9uSW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICBpZiAoZXh0ZW5zaW9uSW5kZXggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWU7CisKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cmluZygwLCBleHRlbnNpb25JbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgU3RyaW5nI3RyaW0oKX0sIGJ1dCBvbmx5IHRoZSB0cmFpbGluZyBzcGFjZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJpbVRyYWlsaW5nU3BhY2VzKFN0cmluZyBsaW5lKSB7CisgICAgICAgIHdoaWxlIChsaW5lLmxlbmd0aCgpID4gMCAmJiBsaW5lLmNoYXJBdChsaW5lLmxlbmd0aCgpIC0gMSkgPD0gMHgyMCkgeworICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yTGlzdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Zpc2l0b3JMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMTc4NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yTGlzdC5qYXZhCkBAIC0wLDAgKzEsMzAzIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uDQorICoNCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLg0KKyAqDQorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mDQorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3INCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlDQorICoNCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZA0KKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuDQorICoNCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICovDQorDQorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7DQorDQorLyoqDQorICogQSBsaXN0IHRoYXQgb3ZlcnJpZGVzIHRoZSBlcXVhbHMgYW5kIGhhc2hjb2RlIGNhbGN1bGF0aW9uIG9mIHRoZSBhZGRlZCBub2Rlcw0KKyAqIGJ5IHVzaW5nIGFub3RoZXIgZXF1YWxzIGFuZCBoYXNoY29kZSB2aXNpdG9yIGZvciB0aG9zZSBtZXRob2RzLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBWaXNpdG9yTGlzdDxOIGV4dGVuZHMgTm9kZT4gaW1wbGVtZW50cyBMaXN0PE4+IHsNCisNCisgICAgcHJvdGVjdGVkIExpc3Q8RXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlPiBpbm5lckxpc3Q7DQorICAgIHByb3RlY3RlZCBmaW5hbCBHZW5lcmljVmlzaXRvcjxJbnRlZ2VyLCBWb2lkPiBoYXNoY29kZVZpc2l0b3I7DQorICAgIHByb3RlY3RlZCBmaW5hbCBHZW5lcmljVmlzaXRvcjxCb29sZWFuLCBWaXNpdGFibGU+IGVxdWFsc1Zpc2l0b3I7DQorDQorICAgIC8qKg0KKyAgICAgKiBQYXNzIHRoZSB2aXNpdG9ycyB0byB1c2UgZm9yIGVxdWFscyBhbmQgaGFzaGNvZGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgVmlzaXRvckxpc3QoR2VuZXJpY1Zpc2l0b3I8SW50ZWdlciwgVm9pZD4gaGFzaGNvZGVWaXNpdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpY1Zpc2l0b3I8Qm9vbGVhbiwgVmlzaXRhYmxlPiBlcXVhbHNWaXNpdG9yKSB7DQorICAgICAgICB0aGlzLmhhc2hjb2RlVmlzaXRvciA9IGhhc2hjb2RlVmlzaXRvcjsNCisgICAgICAgIHRoaXMuZXF1YWxzVmlzaXRvciA9IGVxdWFsc1Zpc2l0b3I7DQorICAgICAgICBpbm5lckxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE4gZWxlbSkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5hZGQobmV3IEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZShlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIE4gZWxlbSkgew0KKyAgICAgICAgaW5uZXJMaXN0LmFkZChpbmRleCwgbmV3IEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZShlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBOPiBjb2wpIHsNCisgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsNCisgICAgICAgIGZvciAoTiBlbGVtIDogY29sKQ0KKyAgICAgICAgICAgIGlmIChhZGQoZWxlbSkpDQorICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiBtb2RpZmllZDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTj4gY29sKSB7DQorICAgICAgICBpZiAoY29sLmlzRW1wdHkoKSkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBmb3IgKE4gZWxlbSA6IGNvbCkgew0KKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBzaXplKCkpDQorICAgICAgICAgICAgICAgIGFkZChlbGVtKTsNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGFkZChpbmRleCwgZWxlbSk7DQorICAgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsNCisgICAgICAgIGlubmVyTGlzdC5jbGVhcigpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgZWxlbSkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5jb250YWlucyhuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sKSB7DQorICAgICAgICBmb3IgKE9iamVjdCBlbGVtIDogY29sKQ0KKyAgICAgICAgICAgIGlmICghY29udGFpbnMoZWxlbSkpDQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgTiBnZXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gaW5uZXJMaXN0LmdldChpbmRleCkub3ZlcnJpZGRlbjsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBlbGVtKSB7DQorICAgICAgICByZXR1cm4gaW5uZXJMaXN0LmluZGV4T2YobmV3IEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSgoTikgZWxlbSkpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5pc0VtcHR5KCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBJdGVyYXRvcjxOPiBpdGVyYXRvcigpIHsNCisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8Tj4oKSB7DQorICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8RXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlPiBpdHIgPSBpbm5lckxpc3QuaXRlcmF0b3IoKTsNCisNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLmhhc05leHQoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIE4gbmV4dCgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ci5uZXh0KCkub3ZlcnJpZGRlbjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KKyAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgZWxlbSkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5sYXN0SW5kZXhPZihuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8Tj4gbGlzdEl0ZXJhdG9yKCkgew0KKyAgICAgICAgcmV0dXJuIGxpc3RJdGVyYXRvcigwKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIExpc3RJdGVyYXRvcjxOPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcjxOPigpIHsNCisgICAgICAgICAgICBmaW5hbCBMaXN0SXRlcmF0b3I8RXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlPiBpdHIgPSBpbm5lckxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KTsNCisNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLmhhc05leHQoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIE4gbmV4dCgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ci5uZXh0KCkub3ZlcnJpZGRlbjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KKyAgICAgICAgICAgICAgICBpdHIucmVtb3ZlKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChOIGVsZW0pIHsNCisgICAgICAgICAgICAgICAgaXRyLmFkZChuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLmhhc1ByZXZpb3VzKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXRyLm5leHRJbmRleCgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgTiBwcmV2aW91cygpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ci5wcmV2aW91cygpLm92ZXJyaWRkZW47DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ci5wcmV2aW91c0luZGV4KCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChOIGVsZW0pIHsNCisgICAgICAgICAgICAgICAgaXRyLnNldChuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBlbGVtKSB7DQorICAgICAgICByZXR1cm4gaW5uZXJMaXN0LnJlbW92ZShuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBOIHJlbW92ZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBpbm5lckxpc3QucmVtb3ZlKGluZGV4KS5vdmVycmlkZGVuOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2wpIHsNCisgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsNCisgICAgICAgIGZvciAoT2JqZWN0IGVsZW0gOiBjb2wpDQorICAgICAgICAgICAgaWYgKHJlbW92ZShlbGVtKSkNCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2wpIHsNCisgICAgICAgIGludCBvbGRTaXplID0gc2l6ZSgpOw0KKyAgICAgICAgY2xlYXIoKTsNCisgICAgICAgIGFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTj4pIGNvbCk7DQorICAgICAgICByZXR1cm4gc2l6ZSgpICE9IG9sZFNpemU7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBOIHNldChpbnQgaW5kZXgsIE4gZWxlbSkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5zZXQoaW5kZXgsIG5ldyBFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUoKE4pIGVsZW0pKS5vdmVycmlkZGVuOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgICByZXR1cm4gaW5uZXJMaXN0LnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIExpc3Q8Tj4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBWaXNpdG9yTGlzdDxOPihoYXNoY29kZVZpc2l0b3IsIGVxdWFsc1Zpc2l0b3IpIHsNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJMaXN0ID0gVmlzaXRvckxpc3QudGhpcy5pbm5lckxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH07DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyTGlzdC5zdHJlYW0oKS5tYXAoZmFjYWRlIC0+IGZhY2FkZS5vdmVycmlkZGVuKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLnRvQXJyYXkoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYXJyKSB7DQorICAgICAgICByZXR1cm4gaW5uZXJMaXN0LnN0cmVhbSgpLm1hcChmYWNhZGUgLT4gZmFjYWRlLm92ZXJyaWRkZW4pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9BcnJheShhcnIpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbIik7DQorICAgICAgICBpZiAoc2l6ZSgpID09IDApDQorICAgICAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgiXSIpLnRvU3RyaW5nKCk7DQorICAgICAgICBmb3IgKEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSBmYWNhZGUgOiBpbm5lckxpc3QpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQoZmFjYWRlLm92ZXJyaWRkZW4udG9TdHJpbmcoKSArICIsICIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHNiLnJlcGxhY2Uoc2IubGVuZ3RoKCkgLSAyLCBzYi5sZW5ndGgoKSwgIl0iKS50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgY2xhc3MgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlIGltcGxlbWVudHMgVmlzaXRhYmxlIHsNCisgICAgICAgIHByaXZhdGUgZmluYWwgTiBvdmVycmlkZGVuOw0KKw0KKyAgICAgICAgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKE4gb3ZlcnJpZGRlbikgew0KKyAgICAgICAgICAgIHRoaXMub3ZlcnJpZGRlbiA9IG92ZXJyaWRkZW47DQorICAgICAgICB9DQorDQorICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZGVuLmFjY2VwdChoYXNoY29kZVZpc2l0b3IsIG51bGwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgew0KKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIFZpc2l0b3JMaXN0LkVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbi5hY2NlcHQoZXF1YWxzVmlzaXRvciwgKChFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUpIG9iaikub3ZlcnJpZGRlbik7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Zpc2l0b3JNYXAuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyMWI5MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yTWFwLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQSBtYXAgdGhhdCBvdmVycmlkZXMgdGhlIGVxdWFscyBhbmQgaGFzaGNvZGUgY2FsY3VsYXRpb24gb2YgdGhlIGFkZGVkIG5vZGVzCisgKiBieSB1c2luZyBhbm90aGVyIGVxdWFscyBhbmQgaGFzaGNvZGUgdmlzaXRvciBmb3IgdGhvc2UgbWV0aG9kcy4KKyAqLworcHVibGljIGNsYXNzIFZpc2l0b3JNYXA8TiBleHRlbmRzIE5vZGUsIFY+IGltcGxlbWVudHMgTWFwPE4sIFY+IHsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUsIFY+IGlubmVyTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgR2VuZXJpY1Zpc2l0b3I8SW50ZWdlciwgVm9pZD4gaGFzaGNvZGVWaXNpdG9yOworICAgIHByaXZhdGUgZmluYWwgR2VuZXJpY1Zpc2l0b3I8Qm9vbGVhbiwgVmlzaXRhYmxlPiBlcXVhbHNWaXNpdG9yOworCisgICAgLyoqCisgICAgICogUGFzcyB0aGUgdmlzaXRvcnMgdG8gdXNlIGZvciBlcXVhbHMgYW5kIGhhc2hjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBWaXNpdG9yTWFwKEdlbmVyaWNWaXNpdG9yPEludGVnZXIsIFZvaWQ+IGhhc2hjb2RlVmlzaXRvciwgR2VuZXJpY1Zpc2l0b3I8Qm9vbGVhbiwgVmlzaXRhYmxlPiBlcXVhbHNWaXNpdG9yKSB7CisgICAgICAgIHRoaXMuaGFzaGNvZGVWaXNpdG9yID0gaGFzaGNvZGVWaXNpdG9yOworICAgICAgICB0aGlzLmVxdWFsc1Zpc2l0b3IgPSBlcXVhbHNWaXNpdG9yOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBpbm5lck1hcC5zaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGlubmVyTWFwLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBpbm5lck1hcC5jb250YWluc0tleShuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBrZXkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gaW5uZXJNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGlubmVyTWFwLmdldChuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBrZXkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBwdXQoTiBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGlubmVyTWFwLnB1dChuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKGtleSksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSBpbXBsZW1lbnRzIFZpc2l0YWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTiBvdmVycmlkZGVuOworCisgICAgICAgIEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZShOIG92ZXJyaWRkZW4pIHsKKyAgICAgICAgICAgIHRoaXMub3ZlcnJpZGRlbiA9IG92ZXJyaWRkZW47CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZGVuLmFjY2VwdChoYXNoY29kZVZpc2l0b3IsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBWaXNpdG9yTWFwLkVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbi5hY2NlcHQoZXF1YWxzVmlzaXRvciwgKChFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUpIG9iaikub3ZlcnJpZGRlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gaW5uZXJNYXAucmVtb3ZlKG5ldyBFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUoKE4pIGtleSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8PyBleHRlbmRzIE4sID8gZXh0ZW5kcyBWPiBtKSB7CisgICAgICAgIG0uZm9yRWFjaCh0aGlzOjpwdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBpbm5lck1hcC5jbGVhcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Tj4ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gaW5uZXJNYXAua2V5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKGsgLT4gay5vdmVycmlkZGVuKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248Vj4gdmFsdWVzKCkgeworICAgICAgICByZXR1cm4gaW5uZXJNYXAudmFsdWVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxFbnRyeTxOLCBWPj4gZW50cnlTZXQoKSB7CisgICAgICAgIHJldHVybiBpbm5lck1hcC5lbnRyeVNldCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcChlIC0+IG5ldyBIYXNoTWFwLlNpbXBsZUVudHJ5PD4oZS5nZXRLZXkoKS5vdmVycmlkZGVuLCBlLmdldFZhbHVlKCkpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Zpc2l0b3JTZXQuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmYzM1OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yU2V0LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQoraW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGU7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsNCisNCisvKioNCisgKiBBIHNldCB0aGF0IG92ZXJyaWRlcyB0aGUgZXF1YWxzIGFuZCBoYXNoY29kZSBjYWxjdWxhdGlvbiBvZiB0aGUgYWRkZWQgbm9kZXMNCisgKiBieSB1c2luZyBhbm90aGVyIGVxdWFscyBhbmQgaGFzaGNvZGUgdmlzaXRvciBmb3IgdGhvc2UgbWV0aG9kcy4NCisgKi8NCitwdWJsaWMgY2xhc3MgVmlzaXRvclNldDxOIGV4dGVuZHMgTm9kZT4gaW1wbGVtZW50cyBTZXQ8Tj4gew0KKw0KKyAgICBwcml2YXRlIGZpbmFsIFNldDxFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGU+IGlubmVyU2V0ID0gbmV3IEhhc2hTZXQ8PigpOw0KKyAgICBwcml2YXRlIGZpbmFsIEdlbmVyaWNWaXNpdG9yPEludGVnZXIsIFZvaWQ+IGhhc2hjb2RlVmlzaXRvcjsNCisgICAgcHJpdmF0ZSBmaW5hbCBHZW5lcmljVmlzaXRvcjxCb29sZWFuLCBWaXNpdGFibGU+IGVxdWFsc1Zpc2l0b3I7DQorDQorICAgIC8qKg0KKyAgICAgKiBQYXNzIHRoZSB2aXNpdG9ycyB0byB1c2UgZm9yIGVxdWFscyBhbmQgaGFzaGNvZGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgVmlzaXRvclNldChHZW5lcmljVmlzaXRvcjxJbnRlZ2VyLCBWb2lkPiBoYXNoY29kZVZpc2l0b3IsIEdlbmVyaWNWaXNpdG9yPEJvb2xlYW4sIFZpc2l0YWJsZT4gZXF1YWxzVmlzaXRvcikgew0KKyAgICAgICAgdGhpcy5oYXNoY29kZVZpc2l0b3IgPSBoYXNoY29kZVZpc2l0b3I7DQorICAgICAgICB0aGlzLmVxdWFsc1Zpc2l0b3IgPSBlcXVhbHNWaXNpdG9yOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoTiBlbGVtKSB7DQorICAgICAgICByZXR1cm4gaW5uZXJTZXQuYWRkKG5ldyBFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUoZWxlbSkpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTj4gY29sKSB7DQorICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7DQorICAgICAgICBmb3IgKE4gZWxlbSA6IGNvbCkNCisgICAgICAgICAgICBpZiAoYWRkKGVsZW0pKQ0KKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7DQorICAgICAgICByZXR1cm4gbW9kaWZpZWQ7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgew0KKyAgICAgICAgaW5uZXJTZXQuY2xlYXIoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IGVsZW0pIHsNCisgICAgICAgIHJldHVybiBpbm5lclNldC5jb250YWlucyhuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sKSB7DQorICAgICAgICBmb3IgKE9iamVjdCBlbGVtIDogY29sKQ0KKyAgICAgICAgICAgIGlmICghY29udGFpbnMoZWxlbSkpDQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyU2V0LmlzRW1wdHkoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIEl0ZXJhdG9yPE4+IGl0ZXJhdG9yKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxOPigpIHsNCisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGU+IGl0ciA9IGlubmVyU2V0Lml0ZXJhdG9yKCk7DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ci5oYXNOZXh0KCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyBOIG5leHQoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpdHIubmV4dCgpLm92ZXJyaWRkZW47DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsNCisgICAgICAgICAgICAgICAgaXRyLnJlbW92ZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH07DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgZWxlbSkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyU2V0LnJlbW92ZShuZXcgRXF1YWxzSGFzaGNvZGVPdmVycmlkaW5nRmFjYWRlKChOKSBlbGVtKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbCkgew0KKyAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOw0KKyAgICAgICAgZm9yIChPYmplY3QgZWxlbSA6IGNvbCkNCisgICAgICAgICAgICBpZiAocmVtb3ZlKGVsZW0pKQ0KKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7DQorICAgICAgICByZXR1cm4gbW9kaWZpZWQ7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbCkgew0KKyAgICAgICAgaW50IG9sZFNpemUgPSBzaXplKCk7DQorICAgICAgICBjbGVhcigpOw0KKyAgICAgICAgYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBOPikgY29sKTsNCisgICAgICAgIHJldHVybiBzaXplKCkgIT0gb2xkU2l6ZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgICAgcmV0dXJuIGlubmVyU2V0LnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7DQorICAgICAgICByZXR1cm4gaW5uZXJTZXQuc3RyZWFtKCkubWFwKGZhY2FkZSAtPiBmYWNhZGUub3ZlcnJpZGRlbikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGFycikgew0KKyAgICAgICAgcmV0dXJuIGlubmVyU2V0LnN0cmVhbSgpLm1hcChmYWNhZGUgLT4gZmFjYWRlLm92ZXJyaWRkZW4pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9BcnJheShhcnIpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbIik7DQorICAgICAgICBpZiAoc2l6ZSgpID09IDApDQorICAgICAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgiXSIpLnRvU3RyaW5nKCk7DQorICAgICAgICBmb3IgKEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSBmYWNhZGUgOiBpbm5lclNldCkgew0KKyAgICAgICAgICAgIHNiLmFwcGVuZChmYWNhZGUub3ZlcnJpZGRlbi50b1N0cmluZygpICsgIiwiKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzYi5yZXBsYWNlKHNiLmxlbmd0aCgpIC0gMiwgc2IubGVuZ3RoKCksICJdIikudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIGNsYXNzIEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSBpbXBsZW1lbnRzIFZpc2l0YWJsZSB7DQorICAgICAgICBwcml2YXRlIGZpbmFsIE4gb3ZlcnJpZGRlbjsNCisNCisgICAgICAgIEVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZShOIG92ZXJyaWRkZW4pIHsNCisgICAgICAgICAgICB0aGlzLm92ZXJyaWRkZW4gPSBvdmVycmlkZGVuOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbi5hY2NlcHQoaGFzaGNvZGVWaXNpdG9yLCBudWxsKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsNCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBWaXNpdG9yU2V0LkVxdWFsc0hhc2hjb2RlT3ZlcnJpZGluZ0ZhY2FkZSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbi5hY2NlcHQoZXF1YWxzVmlzaXRvciwgKChFcXVhbHNIYXNoY29kZU92ZXJyaWRpbmdGYWNhZGUpIG9iaikub3ZlcnJpZGRlbik7DQorICAgICAgICB9DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ZlcnNpb24vSmF2YTEwUG9zdFByb2Nlc3Nvci5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ZlcnNpb24vSmF2YTEwUG9zdFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzA4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdmVyc2lvbi9KYXZhMTBQb3N0UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudmVyc2lvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVmFyVHlwZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQuUG9zdFByb2Nlc3NvcjsKKworLyoqCisgKiBQcm9jZXNzZXMgdGhlIGdlbmVyaWMgQVNUIGludG8gYSBKYXZhIDEwIEFTVCBhbmQgdmFsaWRhdGVzIGl0LgorICovCitwdWJsaWMgY2xhc3MgSmF2YTEwUG9zdFByb2Nlc3NvciBleHRlbmRzIFBvc3RQcm9jZXNzb3JzIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUG9zdFByb2Nlc3NvciB2YXJOb2RlQ3JlYXRvciA9IChyZXN1bHQsIGNvbmZpZ3VyYXRpb24pIC0+CisgICAgICAgICAgICByZXN1bHQuZ2V0UmVzdWx0KCkuaWZQcmVzZW50KG5vZGUgLT4geworICAgICAgICAgICAgICAgIG5vZGUuZmluZEFsbChDbGFzc09ySW50ZXJmYWNlVHlwZS5jbGFzcykuZm9yRWFjaChuIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKCJ2YXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbi5yZXBsYWNlKG5ldyBWYXJUeXBlKG4uZ2V0VG9rZW5SYW5nZSgpLm9yRWxzZShudWxsKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAgIHB1YmxpYyBKYXZhMTBQb3N0UHJvY2Vzc29yKCkgeworICAgICAgICBhZGQodmFyTm9kZUNyZWF0b3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci92ZXJzaW9uL0phdmExMVBvc3RQcm9jZXNzb3IuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci92ZXJzaW9uL0phdmExMVBvc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ5NjdlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ZlcnNpb24vSmF2YTExUG9zdFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudmVyc2lvbjsKKworLyoqCisgKiBQcm9jZXNzZXMgdGhlIGdlbmVyaWMgQVNUIGludG8gYSBKYXZhIDEwIEFTVCBhbmQgdmFsaWRhdGVzIGl0LgorICovCitwdWJsaWMgY2xhc3MgSmF2YTExUG9zdFByb2Nlc3NvciBleHRlbmRzIEphdmExMFBvc3RQcm9jZXNzb3IgeworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ZlcnNpb24vUG9zdFByb2Nlc3NvcnMuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci92ZXJzaW9uL1Bvc3RQcm9jZXNzb3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyMGRlMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci92ZXJzaW9uL1Bvc3RQcm9jZXNzb3JzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudmVyc2lvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0LlBvc3RQcm9jZXNzb3I7CisKKy8qKgorICogQSBwb3N0IHByb2Nlc3NvciB0aGF0IHdpbGwgY2FsbCBhIGNvbGxlY3Rpb24gb2YgcG9zdCBwcm9jZXNzb3JzLgorICovCitwdWJsaWMgY2xhc3MgUG9zdFByb2Nlc3NvcnMgaW1wbGVtZW50cyBQb3N0UHJvY2Vzc29yIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UG9zdFByb2Nlc3Nvcj4gcG9zdFByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBQb3N0UHJvY2Vzc29ycyhQb3N0UHJvY2Vzc29yLi4uIHBvc3RQcm9jZXNzb3JzKSB7CisgICAgICAgIHRoaXMucG9zdFByb2Nlc3NvcnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocG9zdFByb2Nlc3NvcnMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxQb3N0UHJvY2Vzc29yPiBnZXRQb3N0UHJvY2Vzc29ycygpIHsKKyAgICAgICAgcmV0dXJuIHBvc3RQcm9jZXNzb3JzOworICAgIH0KKworICAgIHB1YmxpYyBQb3N0UHJvY2Vzc29ycyByZW1vdmUoUG9zdFByb2Nlc3NvciBwb3N0UHJvY2Vzc29yKSB7CisgICAgICAgIGlmICghcG9zdFByb2Nlc3NvcnMucmVtb3ZlKHBvc3RQcm9jZXNzb3IpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlRyeWluZyB0byByZW1vdmUgYSBwb3N0IHByb2Nlc3NvciB0aGF0IGlzbid0IHRoZXJlLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBQb3N0UHJvY2Vzc29ycyByZXBsYWNlKFBvc3RQcm9jZXNzb3Igb2xkUHJvY2Vzc29yLCBQb3N0UHJvY2Vzc29yIG5ld1Byb2Nlc3NvcikgeworICAgICAgICByZW1vdmUob2xkUHJvY2Vzc29yKTsKKyAgICAgICAgYWRkKG5ld1Byb2Nlc3Nvcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBQb3N0UHJvY2Vzc29ycyBhZGQoUG9zdFByb2Nlc3NvciBuZXdQcm9jZXNzb3IpIHsKKyAgICAgICAgcG9zdFByb2Nlc3NvcnMuYWRkKG5ld1Byb2Nlc3Nvcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoUGFyc2VSZXN1bHQ8PyBleHRlbmRzIE5vZGU+IHJlc3VsdCwgUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHBvc3RQcm9jZXNzb3JzLmZvckVhY2gocHAgLT4gcHAucHJvY2VzcyhyZXN1bHQsIGNvbmZpZ3VyYXRpb24pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YWNjLXN1cHBvcnQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0dlbmVyYXRlZEphdmFQYXJzZXJCYXNlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YWNjLXN1cHBvcnQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0dlbmVyYXRlZEphdmFQYXJzZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwYjdlZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydC9jb20vZ2l0aHViL2phdmFwYXJzZXIvR2VuZXJhdGVkSmF2YVBhcnNlckJhc2UuamF2YQpAQCAtMCwwICsxLDM2OSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUGFpcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkVPRjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS51bndyYXBBcnJheVR5cGVzOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLndyYXBJbkFycmF5VHlwZXM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHtAbGluayBHZW5lcmF0ZWRKYXZhUGFyc2VyfQorICovCithYnN0cmFjdCBjbGFzcyBHZW5lcmF0ZWRKYXZhUGFyc2VyQmFzZSB7CisgICAgLy8vLyBJbnRlcmZhY2Ugd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgICBhYnN0cmFjdCBHZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyIGdldFRva2VuU291cmNlKCk7CisKKyAgICBhYnN0cmFjdCB2b2lkIFJlSW5pdChQcm92aWRlciBwcm92aWRlcik7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBKYXZhUGFyc2VyIHNwZWNpZmljIHRva2VuIHR5cGUgb2YgdGhlIGxhc3QgbWF0Y2hlZCB0b2tlbiAqLworICAgIGFic3RyYWN0IEphdmFUb2tlbiB0b2tlbigpOworCisgICAgYWJzdHJhY3QgVG9rZW4gZ2V0TmV4dFRva2VuKCk7CisKKyAgICAvLy8vCisKKyAgICAvKiBUaGUgcHJvYmxlbXMgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyAqLworICAgIExpc3Q8UHJvYmxlbT4gcHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAvKiBDb25maWd1cmF0aW9uIGZsYWcgd2hldGhlciB3ZSBzdG9yZSB0b2tlbnMgYW5kIHRva2VucmFuZ2VzICovCisgICAgYm9vbGVhbiBzdG9yZVRva2VuczsKKworICAgIC8qIFJlc2V0cyB0aGUgcGFyc2VyIGZvciByZXVzZSwgZ2FpbmluZyBhIGxpdHRsZSBwZXJmb3JtYW5jZSAqLworICAgIHZvaWQgcmVzZXQoUHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgUmVJbml0KHByb3ZpZGVyKTsKKyAgICAgICAgcHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZ2V0VG9rZW5Tb3VyY2UoKS5yZXNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBKYXZhUGFyc2VyIHNwZWNpZmljIHRva2VucyB0aGF0IGhhdmUgYmVlbiBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIGNvZGUgdXNpbmcgdGhpcyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0b2tlbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxKYXZhVG9rZW4+IGdldFRva2VucygpIHsKKyAgICAgICAgcmV0dXJuIGdldFRva2VuU291cmNlKCkuZ2V0VG9rZW5zKCk7CisgICAgfQorCisgICAgLyogVGhlIGNvbGxlY3Rpb24gb2YgY29tbWVudHMgZW5jb3VudGVyZWQgKi8KKyAgICBDb21tZW50c0NvbGxlY3Rpb24gZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0VG9rZW5Tb3VyY2UoKS5nZXRDb21tZW50c0NvbGxlY3Rpb24oKTsKKyAgICB9CisKKyAgICAvKiBSZXBvcnRzIGEgcHJvYmxlbSB0byB0aGUgdXNlciAqLworICAgIHZvaWQgYWRkUHJvYmxlbShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAvLyBUT0RPIHRva2VuUmFuZ2Ugb25seSB0YWtlcyB0aGUgZmluYWwgdG9rZW4uIE5lZWQgYWxsIHRoZSB0b2tlbnMuCisgICAgICAgIHByb2JsZW1zLmFkZChuZXcgUHJvYmxlbShtZXNzYWdlLCB0b2tlblJhbmdlKCksIG51bGwpKTsKKyAgICB9CisKKyAgICAvKiBSZXR1cm5zIGEgdG9rZW5SYW5nZSB0aGF0IHNwYW5zIHRoZSBsYXN0IG1hdGNoZWQgdG9rZW4gKi8KKyAgICBUb2tlblJhbmdlIHRva2VuUmFuZ2UoKSB7CisgICAgICAgIGlmIChzdG9yZVRva2VucykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlblJhbmdlKHRva2VuKCksIHRva2VuKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFRva2VuUmFuZ2Ugc3Bhbm5pbmcgZnJvbSBiZWdpbiB0byBlbmQKKyAgICAgKi8KKyAgICBUb2tlblJhbmdlIHJhbmdlKEphdmFUb2tlbiBiZWdpbiwgSmF2YVRva2VuIGVuZCkgeworICAgICAgICBpZiAoc3RvcmVUb2tlbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW5SYW5nZShiZWdpbiwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBUb2tlblJhbmdlIHNwYW5uaW5nIGZyb20gYmVnaW4gdG8gZW5kCisgICAgICovCisgICAgVG9rZW5SYW5nZSByYW5nZShOb2RlIGJlZ2luLCBKYXZhVG9rZW4gZW5kKSB7CisgICAgICAgIGlmIChzdG9yZVRva2VucykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlblJhbmdlKGJlZ2luLmdldFRva2VuUmFuZ2UoKS5nZXQoKS5nZXRCZWdpbigpLCBlbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFRva2VuUmFuZ2Ugc3Bhbm5pbmcgZnJvbSBiZWdpbiB0byBlbmQKKyAgICAgKi8KKyAgICBUb2tlblJhbmdlIHJhbmdlKEphdmFUb2tlbiBiZWdpbiwgTm9kZSBlbmQpIHsKKyAgICAgICAgaWYgKHN0b3JlVG9rZW5zKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuUmFuZ2UoYmVnaW4sIGVuZC5nZXRUb2tlblJhbmdlKCkuZ2V0KCkuZ2V0RW5kKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFRva2VuUmFuZ2Ugc3Bhbm5pbmcgZnJvbSBiZWdpbiB0byBlbmQKKyAgICAgKi8KKyAgICBUb2tlblJhbmdlIHJhbmdlKE5vZGUgYmVnaW4sIE5vZGUgZW5kKSB7CisgICAgICAgIGlmIChzdG9yZVRva2VucykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlblJhbmdlKGJlZ2luLmdldFRva2VuUmFuZ2UoKS5nZXQoKS5nZXRCZWdpbigpLCBlbmQuZ2V0VG9rZW5SYW5nZSgpLmdldCgpLmdldEVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHNlY29uZENob2ljZSBpZiBmaXJzdENob2ljZSBpcyBKYXZhVG9rZW4uVU5LTk9XTiwgb3RoZXJ3aXNlIGZpcnN0Q2hvaWNlCisgICAgICovCisgICAgSmF2YVRva2VuIG9ySWZJbnZhbGlkKEphdmFUb2tlbiBmaXJzdENob2ljZSwgSmF2YVRva2VuIHNlY29uZENob2ljZSkgeworICAgICAgICBpZiAoc3RvcmVUb2tlbnMpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmlyc3RDaG9pY2UpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWNvbmRDaG9pY2UpOworICAgICAgICAgICAgaWYgKGZpcnN0Q2hvaWNlLnZhbGlkKCkgfHwgc2Vjb25kQ2hvaWNlLmludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENob2ljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZWNvbmRDaG9pY2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYmVnaW4tdG9rZW4gc2Vjb25kQ2hvaWNlIGlmIGZpcnN0Q2hvaWNlIGlzIEphdmFUb2tlbi5VTktOT1dOLCBvdGhlcndpc2UgZmlyc3RDaG9pY2UKKyAgICAgKi8KKyAgICBKYXZhVG9rZW4gb3JJZkludmFsaWQoSmF2YVRva2VuIGZpcnN0Q2hvaWNlLCBOb2RlIHNlY29uZENob2ljZSkgeworICAgICAgICBpZiAoc3RvcmVUb2tlbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBvcklmSW52YWxpZChmaXJzdENob2ljZSwgc2Vjb25kQ2hvaWNlLmdldFRva2VuUmFuZ2UoKS5nZXQoKS5nZXRCZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRva2VuIHRoYXQgc3RhcnRzIHRoZSBOb2RlTGlzdCBsCisgICAgICovCisgICAgSmF2YVRva2VuIG5vZGVMaXN0QmVnaW4oTm9kZUxpc3Q8Pz4gbCkgeworICAgICAgICBpZiAoIXN0b3JlVG9rZW5zIHx8IGwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gSmF2YVRva2VuLklOVkFMSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGwuZ2V0KDApLmdldFRva2VuUmFuZ2UoKS5nZXQoKS5nZXRCZWdpbigpOworICAgIH0KKworICAgIC8qIFNldHMgdGhlIGtpbmQgb2YgdGhlIGxhc3QgbWF0Y2hlZCB0b2tlbiB0byBuZXdLaW5kICovCisgICAgdm9pZCBzZXRUb2tlbktpbmQoaW50IG5ld0tpbmQpIHsKKyAgICAgICAgdG9rZW4oKS5zZXRLaW5kKG5ld0tpbmQpOworICAgIH0KKworICAgIC8qIE1ha2VzIHRoZSBwYXJzZXIga2VlcCBhIGxpc3Qgb2YgdG9rZW5zICovCisgICAgdm9pZCBzZXRTdG9yZVRva2Vucyhib29sZWFuIHN0b3JlVG9rZW5zKSB7CisgICAgICAgIHRoaXMuc3RvcmVUb2tlbnMgPSBzdG9yZVRva2VuczsKKyAgICAgICAgZ2V0VG9rZW5Tb3VyY2UoKS5zZXRTdG9yZVRva2VucyhzdG9yZVRva2Vucyk7CisgICAgfQorCisgICAgLyogQ2FsbGVkIGZyb20gd2l0aGluIGEgY2F0Y2ggYmxvY2sgdG8gc2tpcCBmb3J3YXJkIHRvIGEga25vd24gdG9rZW4sCisgICAgICAgIGFuZCByZXBvcnQgdGhlIG9jY3VycmVkIGV4Y2VwdGlvbiBhcyBhIHByb2JsZW0uICovCisgICAgVG9rZW5SYW5nZSByZWNvdmVyKGludCByZWNvdmVyeVRva2VuVHlwZSwgUGFyc2VFeGNlcHRpb24gcCkgeworICAgICAgICBKYXZhVG9rZW4gYmVnaW4gPSBudWxsOworICAgICAgICBpZiAocC5jdXJyZW50VG9rZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgYmVnaW4gPSB0b2tlbigpOworICAgICAgICB9CisgICAgICAgIFRva2VuIHQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHQgPSBnZXROZXh0VG9rZW4oKTsKKyAgICAgICAgfSB3aGlsZSAodC5raW5kICE9IHJlY292ZXJ5VG9rZW5UeXBlICYmIHQua2luZCAhPSBFT0YpOworCisgICAgICAgIEphdmFUb2tlbiBlbmQgPSB0b2tlbigpOworCisgICAgICAgIFRva2VuUmFuZ2UgdG9rZW5SYW5nZSA9IG51bGw7CisgICAgICAgIGlmIChiZWdpbiAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0b2tlblJhbmdlID0gcmFuZ2UoYmVnaW4sIGVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcm9ibGVtcy5hZGQobmV3IFByb2JsZW0obWFrZU1lc3NhZ2VGb3JQYXJzZUV4Y2VwdGlvbihwKSwgdG9rZW5SYW5nZSwgcCkpOworICAgICAgICByZXR1cm4gdG9rZW5SYW5nZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWlja2x5IGNyZWF0ZSBhIG5ldyBOb2RlTGlzdAorICAgICAqLworICAgIDxUIGV4dGVuZHMgTm9kZT4gTm9kZUxpc3Q8VD4gZW1wdHlMaXN0KCkgeworICAgICAgICByZXR1cm4gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgb2JqIHRvIGxpc3QgYW5kIHJldHVybiBpdC4gQ3JlYXRlIGEgbmV3IGxpc3QgaWYgbGlzdCBpcyBudWxsCisgICAgICovCisgICAgPFQgZXh0ZW5kcyBOb2RlPiBOb2RlTGlzdDxUPiBhZGQoTm9kZUxpc3Q8VD4gbGlzdCwgVCBvYmopIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdCA9IG5ldyBOb2RlTGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5hZGQob2JqKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG9iaiB0byBsaXN0IG9ubHkgd2hlbiBsaXN0IGlzIG5vdCBudWxsCisgICAgICovCisgICAgPFQgZXh0ZW5kcyBOb2RlPiBOb2RlTGlzdDxUPiBhZGRXaGVuTm90TnVsbChOb2RlTGlzdDxUPiBsaXN0LCBUIG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGQobGlzdCwgb2JqKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgb2JqIHRvIGxpc3QgYXQgcG9zaXRpb24gcG9zCisgICAgICovCisgICAgPFQgZXh0ZW5kcyBOb2RlPiBOb2RlTGlzdDxUPiBwcmVwZW5kKE5vZGVMaXN0PFQ+IGxpc3QsIFQgb2JqKSB7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIGxpc3QuYWRkRmlyc3Qob2JqKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG9iaiB0byBsaXN0CisgICAgICovCisgICAgPFQ+IExpc3Q8VD4gYWRkKExpc3Q8VD4gbGlzdCwgVCBvYmopIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LmFkZChvYmopOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbW9kaWZpZXIgbW9kIHRvIG1vZGlmaWVycworICAgICAqLworICAgIHZvaWQgYWRkTW9kaWZpZXIoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBNb2RpZmllciBtb2QpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhtb2QpKSB7CisgICAgICAgICAgICBhZGRQcm9ibGVtKCJEdXBsaWNhdGVkIG1vZGlmaWVyIik7CisgICAgICAgIH0KKyAgICAgICAgbW9kaWZpZXJzLmFkZChtb2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3BhZ2F0ZSBleHBhbnNpb24gb2YgdGhlIHJhbmdlIG9uIHRoZSByaWdodCB0byB0aGUgcGFyZW50LiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIHRoZSByaWdodCBib3JkZXIgb2YgdGhlIGNoaWxkCisgICAgICogaXMgZGV0ZXJtaW5pbmcgdGhlIHJpZ2h0IGJvcmRlciBvZiB0aGUgcGFyZW50IChpLmUuLCB0aGUgY2hpbGQgaXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGFyZW50KS4gSW4gdGhpcyBjYXNlCisgICAgICogd2hlbiB3ZSAiZW5sYXJnZSIgdGhlIGNoaWxkIHdlIHNob3VsZCBlbmxhcmdlIGFsc28gdGhlIHBhcmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvcGFnYXRlUmFuZ2VHcm93dGhPblJpZ2h0KE5vZGUgbm9kZSwgTm9kZSBlbmROb2RlKSB7CisgICAgICAgIGlmIChzdG9yZVRva2VucykgeworICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnROb2RlKCkuaWZQcmVzZW50KG5vZGVQYXJlbnQgLT4geworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDaGlsZE9uVGhlUmlnaHRCb3JkZXJPZlBhcmVudCA9IG5vZGUuZ2V0VG9rZW5SYW5nZSgpLmdldCgpLmdldEVuZCgpLmVxdWFscyhub2RlUGFyZW50LmdldFRva2VuUmFuZ2UoKS5nZXQoKS5nZXRFbmQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2hpbGRPblRoZVJpZ2h0Qm9yZGVyT2ZQYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlUmFuZ2VHcm93dGhPblJpZ2h0KG5vZGVQYXJlbnQsIGVuZE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbm9kZS5zZXRUb2tlblJhbmdlKHJhbmdlKG5vZGUsIGVuZE5vZGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdvcmthcm91bmQgZm9yIHJhdGhlciBjb21wbGV4IGFtYmlndWl0eSB0aGF0IGxhbWJkYSdzIGNyZWF0ZQorICAgICAqLworICAgIEV4cHJlc3Npb24gZ2VuZXJhdGVMYW1iZGEoRXhwcmVzc2lvbiByZXQsIFN0YXRlbWVudCBsYW1iZGFCb2R5KSB7CisgICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBFbmNsb3NlZEV4cHIpIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gaW5uZXIgPSAoKEVuY2xvc2VkRXhwcikgcmV0KS5nZXRJbm5lcigpOworICAgICAgICAgICAgU2ltcGxlTmFtZSBpZCA9ICgoTmFtZUV4cHIpIGlubmVyKS5nZXROYW1lKCk7CisgICAgICAgICAgICBOb2RlTGlzdDxQYXJhbWV0ZXI+IHBhcmFtcyA9IGFkZChuZXcgTm9kZUxpc3Q8PigpLCBuZXcgUGFyYW1ldGVyKHJldC5nZXRUb2tlblJhbmdlKCkub3JFbHNlKG51bGwpLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIG5ldyBOb2RlTGlzdDw+KCksIG5ldyBVbmtub3duVHlwZSgpLCBmYWxzZSwgbmV3IE5vZGVMaXN0PD4oKSwgaWQpKTsKKyAgICAgICAgICAgIHJldCA9IG5ldyBMYW1iZGFFeHByKHJhbmdlKHJldCwgbGFtYmRhQm9keSksIHBhcmFtcywgbGFtYmRhQm9keSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTmFtZUV4cHIpIHsKKyAgICAgICAgICAgIFNpbXBsZU5hbWUgaWQgPSAoKE5hbWVFeHByKSByZXQpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1zID0gYWRkKG5ldyBOb2RlTGlzdDw+KCksIG5ldyBQYXJhbWV0ZXIocmV0LmdldFRva2VuUmFuZ2UoKS5vckVsc2UobnVsbCksIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IE5vZGVMaXN0PD4oKSwgbmV3IFVua25vd25UeXBlKCksIGZhbHNlLCBuZXcgTm9kZUxpc3Q8PigpLCBpZCkpOworICAgICAgICAgICAgcmV0ID0gbmV3IExhbWJkYUV4cHIocmFuZ2UocmV0LCBsYW1iZGFCb2R5KSwgcGFyYW1zLCBsYW1iZGFCb2R5LCBmYWxzZSk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTGFtYmRhRXhwcikgeworICAgICAgICAgICAgKChMYW1iZGFFeHByKSByZXQpLnNldEJvZHkobGFtYmRhQm9keSk7CisgICAgICAgICAgICBwcm9wYWdhdGVSYW5nZUdyb3d0aE9uUmlnaHQocmV0LCBsYW1iZGFCb2R5KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgaW5zdGFuY2VvZiBDYXN0RXhwcikgeworICAgICAgICAgICAgQ2FzdEV4cHIgY2FzdEV4cHIgPSAoQ2FzdEV4cHIpIHJldDsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gaW5uZXIgPSBnZW5lcmF0ZUxhbWJkYShjYXN0RXhwci5nZXRFeHByZXNzaW9uKCksIGxhbWJkYUJvZHkpOworICAgICAgICAgICAgY2FzdEV4cHIuc2V0RXhwcmVzc2lvbihpbm5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRQcm9ibGVtKCJGYWlsZWQgdG8gcGFyc2UgbGFtYmRhIGV4cHJlc3Npb24hIFBsZWFzZSBjcmVhdGUgYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXBhcnNlci9pc3N1ZXMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyB0b2dldGhlciBhbiBBcnJheUNyZWF0aW9uRXhwciBmcm9tIGEgbG90IG9mIHBpZWNlcworICAgICAqLworICAgIEFycmF5Q3JlYXRpb25FeHByIGp1Z2dsZUFycmF5Q3JlYXRpb24oVG9rZW5SYW5nZSByYW5nZSwgTGlzdDxUb2tlblJhbmdlPiBsZXZlbFJhbmdlcywgVHlwZSB0eXBlLCBOb2RlTGlzdDxFeHByZXNzaW9uPiBkaW1lbnNpb25zLCBMaXN0PE5vZGVMaXN0PEFubm90YXRpb25FeHByPj4gYXJyYXlBbm5vdGF0aW9ucywgQXJyYXlJbml0aWFsaXplckV4cHIgYXJyYXlJbml0aWFsaXplckV4cHIpIHsKKyAgICAgICAgTm9kZUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBsZXZlbHMgPSBuZXcgTm9kZUxpc3Q8PigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlBbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbGV2ZWxzLmFkZChuZXcgQXJyYXlDcmVhdGlvbkxldmVsKGxldmVsUmFuZ2VzLmdldChpKSwgZGltZW5zaW9ucy5nZXQoaSksIGFycmF5QW5ub3RhdGlvbnMuZ2V0KGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUNyZWF0aW9uRXhwcihyYW5nZSwgdHlwZSwgbGV2ZWxzLCBhcnJheUluaXRpYWxpemVyRXhwcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3dzIHRvZ2V0aGVyIGEgVHlwZSwgdGFraW5nIGNhcmUgb2YgYWxsIHRoZSBhcnJheSBicmFja2V0cworICAgICAqLworICAgIFR5cGUganVnZ2xlQXJyYXlUeXBlKFR5cGUgcGFydGlhbFR5cGUsIExpc3Q8QXJyYXlUeXBlLkFycmF5QnJhY2tldFBhaXI+IGFkZGl0aW9uYWxCcmFja2V0cykgeworICAgICAgICBQYWlyPFR5cGUsIExpc3Q8QXJyYXlUeXBlLkFycmF5QnJhY2tldFBhaXI+PiBwYXJ0aWFsUGFydHMgPSB1bndyYXBBcnJheVR5cGVzKHBhcnRpYWxUeXBlKTsKKyAgICAgICAgVHlwZSBlbGVtZW50VHlwZSA9IHBhcnRpYWxQYXJ0cy5hOworICAgICAgICBMaXN0PEFycmF5VHlwZS5BcnJheUJyYWNrZXRQYWlyPiBsZWZ0TW9zdEJyYWNrZXRzID0gcGFydGlhbFBhcnRzLmI7CisgICAgICAgIHJldHVybiB3cmFwSW5BcnJheVR5cGVzKGVsZW1lbnRUeXBlLCBsZWZ0TW9zdEJyYWNrZXRzLCBhZGRpdGlvbmFsQnJhY2tldHMpLmNsb25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgY29kZSBmcm9tIFBhcnNlRXhjZXB0aW9uLmluaXRpYWxpc2UsIG1vZGlmaWVkIHRvIGJlIG1vcmUgaG9yaXpvbnRhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYWtlTWVzc2FnZUZvclBhcnNlRXhjZXB0aW9uKFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlBhcnNlIGVycm9yLiBGb3VuZCAiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBleHBlY3RlZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaW50IG1heEV4cGVjdGVkVG9rZW5TZXF1ZW5jZUxlbmd0aCA9IDA7CisgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBzb3J0ZWRPcHRpb25zID0gbmV3IFRyZWVTZXQ8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbi5leHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWF4RXhwZWN0ZWRUb2tlblNlcXVlbmNlTGVuZ3RoIDwgZXhjZXB0aW9uLmV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWRUb2tlblNlcXVlbmNlTGVuZ3RoID0gZXhjZXB0aW9uLmV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleGNlcHRpb24uZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHNvcnRlZE9wdGlvbnMuYWRkKGV4Y2VwdGlvbi50b2tlbkltYWdlW2V4Y2VwdGlvbi5leHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN0cmluZyBvcHRpb24gOiBzb3J0ZWRPcHRpb25zKSB7CisgICAgICAgICAgICBleHBlY3RlZC5hcHBlbmQoIiAiKS5hcHBlbmQob3B0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHNiLmFwcGVuZCgiIik7CisKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBleGNlcHRpb24uY3VycmVudFRva2VuLm5leHQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4RXhwZWN0ZWRUb2tlblNlcXVlbmNlTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlblRleHQgPSB0b2tlbi5pbWFnZTsKKyAgICAgICAgICAgIFN0cmluZyBlc2NhcGVkVG9rZW5UZXh0ID0gUGFyc2VFeGNlcHRpb24uYWRkX2VzY2FwZXModG9rZW5UZXh0KTsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbi5raW5kID09IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXhjZXB0aW9uLnRva2VuSW1hZ2VbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXNjYXBlZFRva2VuVGV4dCA9ICJcIiIgKyBlc2NhcGVkVG9rZW5UZXh0ICsgIlwiIjsKKyAgICAgICAgICAgIFN0cmluZyBpbWFnZSA9IGV4Y2VwdGlvbi50b2tlbkltYWdlW3Rva2VuLmtpbmRdOworICAgICAgICAgICAgaWYgKGltYWdlLmVxdWFscyhlc2NhcGVkVG9rZW5UZXh0KSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbWFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVzY2FwZWRUb2tlblRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaW1hZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbi5leHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICBpbnQgbnVtRXhwZWN0ZWRUb2tlbnMgPSBleGNlcHRpb24uZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZXhwZWN0ZWQiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG51bUV4cGVjdGVkVG9rZW5zID09IDEgPyAiIiA6ICIgb25lIG9mICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZXhwZWN0ZWQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmFjYy1zdXBwb3J0L2NvbS9naXRodWIvamF2YXBhcnNlci9HZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyQmFzZS5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmFjYy1zdXBwb3J0L2NvbS9naXRodWIvamF2YXBhcnNlci9HZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDMzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YWNjLXN1cHBvcnQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0dlbmVyYXRlZEphdmFQYXJzZXJUb2tlbk1hbmFnZXJCYXNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi5wb3M7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3Ige0BsaW5rIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyfQorICovCithYnN0cmFjdCBjbGFzcyBHZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyQmFzZSB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgVG9rZW5SYW5nZSB0aGF0IHNwYW5zIGV4YWN0bHkgb25lIHRva2VuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVG9rZW5SYW5nZSB0b2tlblJhbmdlKFRva2VuIHRva2VuKSB7CisgICAgICAgIEphdmFUb2tlbiBqYXZhVG9rZW4gPSB0b2tlbi5qYXZhVG9rZW47CisgICAgICAgIHJldHVybiBuZXcgVG9rZW5SYW5nZShqYXZhVG9rZW4sIGphdmFUb2tlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2luY2UgY29tbWVudHMgYXJlIGNvbXBsZXRlbHkgY2FwdHVyZWQgaW4gYSBzaW5nbGUgdG9rZW4sIGluY2x1ZGluZyB0aGVpciBkZWxpbWl0ZXJzLCBkZWNvbnN0cnVjdCB0aGVtIGhlcmUgc28gd2UKKyAgICAgKiBjYW4gdHVybiB0aGVtIGludG8gbm9kZXMgbGF0ZXIgb24uCisgICAgICovCisgICAgc3RhdGljIENvbW1lbnQgY3JlYXRlQ29tbWVudEZyb21Ub2tlbihUb2tlbiB0b2tlbikgeworICAgICAgICBTdHJpbmcgY29tbWVudFRleHQgPSB0b2tlbi5pbWFnZTsKKyAgICAgICAgaWYgKHRva2VuLmtpbmQgPT0gSkFWQURPQ19DT01NRU5UKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFkb2NDb21tZW50KHRva2VuUmFuZ2UodG9rZW4pLCBjb21tZW50VGV4dC5zdWJzdHJpbmcoMywgY29tbWVudFRleHQubGVuZ3RoKCkgLSAyKSk7CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4ua2luZCA9PSBNVUxUSV9MSU5FX0NPTU1FTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tDb21tZW50KHRva2VuUmFuZ2UodG9rZW4pLCBjb21tZW50VGV4dC5zdWJzdHJpbmcoMiwgY29tbWVudFRleHQubGVuZ3RoKCkgLSAyKSk7CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4ua2luZCA9PSBTSU5HTEVfTElORV9DT01NRU5UKSB7CisgICAgICAgICAgICAvLyBsaW5lIGNvbW1lbnRzIGhhdmUgdGhlaXIgZW5kIG9mIGxpbmUgY2hhcmFjdGVyKHMpIGluY2x1ZGVkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGF0LgorICAgICAgICAgICAgUmFuZ2UgcmFuZ2UgPSBuZXcgUmFuZ2UocG9zKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4pLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSk7CisgICAgICAgICAgICB3aGlsZSAoY29tbWVudFRleHQuZW5kc1dpdGgoIlxyIikgfHwgY29tbWVudFRleHQuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICAgICAgICBjb21tZW50VGV4dCA9IGNvbW1lbnRUZXh0LnN1YnN0cmluZygwLCBjb21tZW50VGV4dC5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmFuZ2UgPSByYW5nZS53aXRoRW5kKHBvcyhyYW5nZS5iZWdpbi5saW5lLCByYW5nZS5iZWdpbi5jb2x1bW4gKyBjb21tZW50VGV4dC5sZW5ndGgoKSkpOworICAgICAgICAgICAgTGluZUNvbW1lbnQgY29tbWVudCA9IG5ldyBMaW5lQ29tbWVudCh0b2tlblJhbmdlKHRva2VuKSwgY29tbWVudFRleHQuc3Vic3RyaW5nKDIpKTsKKyAgICAgICAgICAgIGNvbW1lbnQuc2V0UmFuZ2UocmFuZ2UpOworICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmV4cGVjdGVkbHkgZ290IHBhc3NlZCBhIG5vbi1jb21tZW50IHRva2VuLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydC9jb20vZ2l0aHViL2phdmFwYXJzZXIvTW9kaWZpZXJIb2xkZXIuamF2YSBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydC9jb20vZ2l0aHViL2phdmFwYXJzZXIvTW9kaWZpZXJIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQyZThmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmFjYy1zdXBwb3J0L2NvbS9naXRodWIvamF2YXBhcnNlci9Nb2RpZmllckhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Ige0BsaW5rIEdlbmVyYXRlZEphdmFQYXJzZXJ9CisgKi8KK2NsYXNzIE1vZGlmaWVySG9sZGVyIHsKKyAgICBmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnM7CisgICAgZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworICAgIGZpbmFsIEphdmFUb2tlbiBiZWdpbjsKKworICAgIE1vZGlmaWVySG9sZGVyKEphdmFUb2tlbiBiZWdpbiwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5iZWdpbiA9IGJlZ2luOworICAgICAgICB0aGlzLm1vZGlmaWVycyA9IGFzc2VydE5vdE51bGwobW9kaWZpZXJzKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydC9jb20vZ2l0aHViL2phdmFwYXJzZXIvUmFuZ2VkTGlzdC5qYXZhIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmFjYy1zdXBwb3J0L2NvbS9naXRodWIvamF2YXBhcnNlci9SYW5nZWRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4ZWM1MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydC9jb20vZ2l0aHViL2phdmFwYXJzZXIvUmFuZ2VkTGlzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CisKKy8qKgorICogSGVscGVyIGNsYXNzIGZvciB7QGxpbmsgR2VuZXJhdGVkSmF2YVBhcnNlcn0KKyAqLworY2xhc3MgUmFuZ2VkTGlzdDxUIGV4dGVuZHMgTm9kZT4geworICAgIC8qIEEgcmFuZ2VkIGxpc3QgTVVTVCBiZSBzZXQgdG8gYSBiZWdpbiBhbmQgZW5kLAorICAgICAgIG9yIHRoZXNlIHRlbXBvcmFyeSB2YWx1ZXMgd2lsbCBsZWFrIG91dCAqLworICAgIFRva2VuUmFuZ2UgcmFuZ2UgPSBuZXcgVG9rZW5SYW5nZShKYXZhVG9rZW4uSU5WQUxJRCwgSmF2YVRva2VuLklOVkFMSUQpOworICAgIE5vZGVMaXN0PFQ+IGxpc3Q7CisKKyAgICBSYW5nZWRMaXN0KE5vZGVMaXN0PFQ+IGxpc3QpIHsKKyAgICAgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICB9CisKKyAgICB2b2lkIGJlZ2luQXQoSmF2YVRva2VuIGJlZ2luKSB7CisgICAgICAgIHJhbmdlID0gcmFuZ2Uud2l0aEJlZ2luKGJlZ2luKTsKKyAgICB9CisKKyAgICB2b2lkIGVuZEF0KEphdmFUb2tlbiBlbmQpIHsKKyAgICAgICAgcmFuZ2UgPSByYW5nZS53aXRoRW5kKGVuZCk7CisgICAgfQorCisgICAgdm9pZCBhZGQoVCB0KSB7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIGxpc3QuYWRkKHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2Mtc3VwcG9ydC9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW5CYXNlLmphdmEgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YWNjLXN1cHBvcnQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjY2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLWNvcmUvc3JjL21haW4vamF2YWNjLXN1cHBvcnQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5HZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkdUOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHRoZSBnZW5lcmF0ZWQge0BsaW5rIFRva2VufQorICovCithYnN0cmFjdCBjbGFzcyBUb2tlbkJhc2UgeworICAgIC8qKgorICAgICAqIEZvciB0cmFja2luZyB0aGUgPj4gPj4+IGFtYmlndWl0eS4KKyAgICAgKi8KKyAgICBpbnQgcmVhbEtpbmQgPSBHVDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBsaW5rIHRvIHRoZSB0b2tlbiB0aGF0IEphdmFQYXJzZXIgcHJlc2VudHMgdG8gdGhlIHVzZXIKKyAgICAgKi8KKyAgICBKYXZhVG9rZW4gamF2YVRva2VuID0gbnVsbDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2MvamF2YS5qaiBiL2phdmFwYXJzZXItY29yZS9zcmMvbWFpbi9qYXZhY2MvamF2YS5qagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjg4MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmFjYy9qYXZhLmpqCkBAIC0wLDAgKzEsMjc5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworb3B0aW9ucyB7CisgIFNUQVRJQz1mYWxzZTsKKyAgQ09NTU9OX1RPS0VOX0FDVElPTj10cnVlOworICBKREtfVkVSU0lPTiA9ICIxLjgiOworICBUT0tFTl9FWFRFTkRTID0iVG9rZW5CYXNlIjsKKyAgSkFWQV9URU1QTEFURV9UWVBFID0gIm1vZGVybiI7Cit9CisKK1BBUlNFUl9CRUdJTihHZW5lcmF0ZWRKYXZhUGFyc2VyKQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuKjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFUb2tlbi5JTlZBTElEOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuUGFyc2VkbmVzcy5VTlBBUlNBQkxFOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuR2VuZXJhdGVkSmF2YVBhcnNlci4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJUb2tlbk1hbmFnZXJCYXNlLio7CisKK0BHZW5lcmF0ZWQoIkphdmFDQyIpCitmaW5hbCBjbGFzcyBHZW5lcmF0ZWRKYXZhUGFyc2VyIGV4dGVuZHMgR2VuZXJhdGVkSmF2YVBhcnNlckJhc2UgeworICAgIC8qIFJldHVybnMgdGhlIEphdmFQYXJzZXIgc3BlY2lmaWMgdG9rZW4gdHlwZSBvZiB0aGUgbGFzdCBtYXRjaGVkIHRva2VuICovCisgICAgSmF2YVRva2VuIHRva2VuKCkgeworICAgICAgICByZXR1cm4gdG9rZW4uamF2YVRva2VuOworICAgIH0KKworICAgIC8qIENoYW5nZXMgdGhlIGFtb3VudCBieSB3aGljaCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBpcyBpbmNyZWFzZWQgd2hlbiBhIHRhYiBjaGFyYWN0ZXIgaXMgZW5jb3VudGVyZWQuCisgICAgICAgIE9uZSBieSBkZWZhdWx0LiovCisgICAgdm9pZCBzZXRUYWJTaXplKGludCBzaXplKSB7CisgICAgICAgIGpqX2lucHV0X3N0cmVhbS5zZXRUYWJTaXplKHNpemUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEdlbmVyYXRlZEphdmFQYXJzZXJUb2tlbk1hbmFnZXIgZ2V0VG9rZW5Tb3VyY2UoKSB7CisgICAgICAgIHJldHVybiB0b2tlbl9zb3VyY2U7CisgICAgfQorfQorCitQQVJTRVJfRU5EKEdlbmVyYXRlZEphdmFQYXJzZXIpCisKKy8qIFdISVRFIFNQQUNFICovCisKK1NQRUNJQUxfVE9LRU4gOgoreworICA8U1BBQ0U6IFsiICIsICJcdCIsICJcZiIsICJcdTAwODUiLCAiXHUwMEEwIiwgIlx1MTY4MCIsICJcdTE4MGUiLCAiXHUyMDAwIiwgIlx1MjAwMSIsICJcdTIwMDIiLCAiXHUyMDAzIiwgIlx1MjAwNCIsICJcdTIwMDUiLAorICAgICAgIlx1MjAwNiIsICJcdTIwMDciLCAiXHUyMDA4IiwgIlx1MjAwOSIsICJcdTIwMGEiLCAiXHUyMDBiIiwgIlx1MjAwYyIsICJcdTIwMGQiLCAiXHUyMDI4IiwgIlx1MjAyOSIsICJcdTIwMmYiLCAiXHUyMDVmIiwgIlx1MjA2MCIsICJcdTMwMDAiLCAiXHVmZWZmIl0+Cit8IDxXSU5ET1dTX0VPTCA6ICJcclxuIj4KK3wgPFVOSVhfRU9MOiAiXG4iPgorfCA8T0xEX01BQ19FT0w6ICJcciI+Cit9CisKK1RPS0VOX01HUl9ERUNMUyA6Cit7CisgICAgcHJpdmF0ZSBMaXN0PEphdmFUb2tlbj4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDxKYXZhVG9rZW4+KCk7CisgICAgcHJpdmF0ZSBDb21tZW50c0NvbGxlY3Rpb24gY29tbWVudHNDb2xsZWN0aW9uID0gbmV3IENvbW1lbnRzQ29sbGVjdGlvbigpOworICAgIHByaXZhdGUgSmF2YVRva2VuIGhvbWVUb2tlbjsKKyAgICBwcml2YXRlIFN0YWNrPFRva2VuPiB0b2tlbldvcmtTdGFjayA9IG5ldyBTdGFjazxUb2tlbj4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcmVUb2tlbnM7CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PEphdmFUb2tlbj4oKTsKKyAgICAgICAgY29tbWVudHNDb2xsZWN0aW9uID0gbmV3IENvbW1lbnRzQ29sbGVjdGlvbigpOworICAgICAgICBob21lVG9rZW4gPSBudWxsOworICAgIH0KKworICAgIExpc3Q8SmF2YVRva2VuPiBnZXRUb2tlbnMoKSB7CisgICAgICAgIGlmKHN0b3JlVG9rZW5zKSB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIENvbW1lbnRzQ29sbGVjdGlvbiBnZXRDb21tZW50c0NvbGxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBjb21tZW50c0NvbGxlY3Rpb247CisgICAgfQorCisgICAgLyogR2V0IHRoZSB2ZXJ5IGZpcnN0IHRva2VuIGluIHRoZSBmaWxlICovCisgICAgSmF2YVRva2VuIGdldEhvbWVUb2tlbigpIHsKKyAgICAgICAgcmV0dXJuIGhvbWVUb2tlbjsKKyAgICB9CisKKyAgICAvKiBNYWtlcyB0aGUgcGFyc2VyIGtlZXAgYSBsaXN0IG9mIHRva2VucyAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlVG9rZW5zKGJvb2xlYW4gc3RvcmVUb2tlbnMpIHsKKyAgICAgICAgdGhpcy5zdG9yZVRva2VucyA9IHN0b3JlVG9rZW5zOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBDb21tb25Ub2tlbkFjdGlvbihUb2tlbiB0b2tlbikgeworICAgICAgICAvLyBVc2UgYW4gaW50ZXJtZWRpYXJ5IHN0YWNrIHRvIGF2b2lkIHJlY3Vyc2lvbiwgc2VlIGlzc3VlIDEwMDMKKyAgICAgICAgZG8geworICAgICAgICAgICAgdG9rZW5Xb3JrU3RhY2sucHVzaCh0b2tlbik7CisgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnNwZWNpYWxUb2tlbjsKKyAgICAgICAgfSB3aGlsZSAodG9rZW4gIT0gbnVsbCk7CisKKyAgICAgICAgLy8gVGhlIHN0YWNrIGlzIG5vdyBmaWxsZWQgd2l0aCB0b2tlbnMgaW4gbGVmdC10by1yaWdodCBvcmRlci4gUHJvY2VzcyB0aGVtLgorICAgICAgICB3aGlsZSghdG9rZW5Xb3JrU3RhY2suZW1wdHkoKSkgeworICAgICAgICAgICAgdG9rZW4gPSB0b2tlbldvcmtTdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHRva2VuLmphdmFUb2tlbiA9IG5ldyBKYXZhVG9rZW4odG9rZW4sIHRva2Vucyk7CisKKyAgICAgICAgICAgIGlmKHN0b3JlVG9rZW5zKSB7CisgICAgICAgICAgICAgICAgdG9rZW5zLmFkZCh0b2tlbi5qYXZhVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaG9tZVRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBob21lVG9rZW4gPSB0b2tlbi5qYXZhVG9rZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKFRva2VuVHlwZXMuaXNDb21tZW50KHRva2VuLmtpbmQpKSB7CisgICAgICAgICAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY3JlYXRlQ29tbWVudEZyb21Ub2tlbih0b2tlbik7CisgICAgICAgICAgICAgICAgY29tbWVudHNDb2xsZWN0aW9uLmFkZENvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENPTU1FTlRTICovCisKK1NQRUNJQUxfVE9LRU4gOgoreworICA8U0lOR0xFX0xJTkVfQ09NTUVOVDogIi8vIiAoflsiXG4iLCJcciJdKSogKCJcbiJ8IlxyInwiXHJcbiIpPyA+Cit9CisKK01PUkUgOgoreworICA8RU5URVJfSkFWQURPQ19DT01NRU5UOiAiLyoqIiB+WyIvIl0+IHsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfSA6IElOX0pBVkFET0NfQ09NTUVOVAorfAorICA8RU5URVJfTVVMVElMSU5FX0NPTU1FTlQ6ICIvKiI+IDogSU5fTVVMVElfTElORV9DT01NRU5UCit9CisKKzxJTl9KQVZBRE9DX0NPTU1FTlQ+CitTUEVDSUFMX1RPS0VOIDoKK3sKKyAgPEpBVkFET0NfQ09NTUVOVDogIiovIiA+IDogREVGQVVMVAorfQorCis8SU5fTVVMVElfTElORV9DT01NRU5UPgorU1BFQ0lBTF9UT0tFTiA6Cit7CisgIDxNVUxUSV9MSU5FX0NPTU1FTlQ6ICIqLyIgPiA6IERFRkFVTFQKK30KKworPElOX0pBVkFET0NfQ09NTUVOVCwgSU5fTVVMVElfTElORV9DT01NRU5UPgorTU9SRSA6Cit7CisgIDxDT01NRU5UX0NPTlRFTlQ6IH5bXSA+Cit9CisKKy8qIFJFU0VSVkVEIFdPUkRTIEFORCBMSVRFUkFMUyAqLworCitUT0tFTiA6Cit7CisgIDwgQUJTVFJBQ1Q6ICJhYnN0cmFjdCIgPgorfCA8IEFTU0VSVDogImFzc2VydCIgPgorfCA8IEJPT0xFQU46ICJib29sZWFuIiA+Cit8IDwgQlJFQUs6ICJicmVhayIgPgorfCA8IEJZVEU6ICJieXRlIiA+Cit8IDwgQ0FTRTogImNhc2UiID4KK3wgPCBDQVRDSDogImNhdGNoIiA+Cit8IDwgQ0hBUjogImNoYXIiID4KK3wgPCBDTEFTUzogImNsYXNzIiA+Cit8IDwgQ09OU1Q6ICJjb25zdCIgPgorfCA8IENPTlRJTlVFOiAiY29udGludWUiID4KK3wgPCBfREVGQVVMVDogImRlZmF1bHQiID4KK3wgPCBETzogImRvIiA+Cit8IDwgRE9VQkxFOiAiZG91YmxlIiA+Cit8IDwgRUxTRTogImVsc2UiID4KK3wgPCBFTlVNOiAiZW51bSIgPgorfCA8IEVYVEVORFM6ICJleHRlbmRzIiA+Cit8IDwgRkFMU0U6ICJmYWxzZSIgPgorfCA8IEZJTkFMOiAiZmluYWwiID4KK3wgPCBGSU5BTExZOiAiZmluYWxseSIgPgorfCA8IEZMT0FUOiAiZmxvYXQiID4KK3wgPCBGT1I6ICJmb3IiID4KK3wgPCBHT1RPOiAiZ290byIgPgorfCA8IElGOiAiaWYiID4KK3wgPCBJTVBMRU1FTlRTOiAiaW1wbGVtZW50cyIgPgorfCA8IElNUE9SVDogImltcG9ydCIgPgorfCA8IElOU1RBTkNFT0Y6ICJpbnN0YW5jZW9mIiA+Cit8IDwgSU5UOiAiaW50IiA+Cit8IDwgSU5URVJGQUNFOiAiaW50ZXJmYWNlIiA+Cit8IDwgTE9ORzogImxvbmciID4KK3wgPCBOQVRJVkU6ICJuYXRpdmUiID4KK3wgPCBORVc6ICJuZXciID4KK3wgPCBOVUxMOiAibnVsbCIgPgorfCA8IFBBQ0tBR0U6ICJwYWNrYWdlIj4KK3wgPCBQUklWQVRFOiAicHJpdmF0ZSIgPgorfCA8IFBST1RFQ1RFRDogInByb3RlY3RlZCIgPgorfCA8IFBVQkxJQzogInB1YmxpYyIgPgorfCA8IFJFVFVSTjogInJldHVybiIgPgorfCA8IFNIT1JUOiAic2hvcnQiID4KK3wgPCBTVEFUSUM6ICJzdGF0aWMiID4KK3wgPCBTVFJJQ1RGUDogInN0cmljdGZwIiA+Cit8IDwgU1VQRVI6ICJzdXBlciIgPgorfCA8IFNXSVRDSDogInN3aXRjaCIgPgorfCA8IFNZTkNIUk9OSVpFRDogInN5bmNocm9uaXplZCIgPgorfCA8IFRISVM6ICJ0aGlzIiA+Cit8IDwgVEhST1c6ICJ0aHJvdyIgPgorfCA8IFRIUk9XUzogInRocm93cyIgPgorfCA8IFRSQU5TSUVOVDogInRyYW5zaWVudCIgPgorfCA8IFRSVUU6ICJ0cnVlIiA+Cit8IDwgVFJZOiAidHJ5IiA+Cit8IDwgVk9JRDogInZvaWQiID4KK3wgPCBWT0xBVElMRTogInZvbGF0aWxlIiA+Cit8IDwgV0hJTEU6ICJ3aGlsZSIgPgorfCA8IFJFUVVJUkVTOiAicmVxdWlyZXMiID4KK3wgPCBUTzogInRvIiA+Cit8IDwgV0lUSDogIndpdGgiID4KK3wgPCBPUEVOOiAib3BlbiIgPgorfCA8IE9QRU5TOiAib3BlbnMiID4KK3wgPCBVU0VTOiAidXNlcyIgPgorfCA8IE1PRFVMRTogIm1vZHVsZSIgPgorfCA8IEVYUE9SVFM6ICJleHBvcnRzIiA+Cit8IDwgUFJPVklERVM6ICJwcm92aWRlcyIgPgorfCA8IFRSQU5TSVRJVkU6ICJ0cmFuc2l0aXZlIiA+Cit9CisKKy8qIExJVEVSQUxTICovCisKK1RPS0VOIDoKK3sKKyAgPCBMT05HX0xJVEVSQUw6CisgICAgICAgIDxERUNJTUFMX0xJVEVSQUw+IChbImwiLCJMIl0pCisgICAgICB8IDxIRVhfTElURVJBTD4gKFsibCIsIkwiXSkKKyAgICAgIHwgPE9DVEFMX0xJVEVSQUw+IChbImwiLCJMIl0pCisgICAgICB8IDxCSU5BUllfTElURVJBTD4gKFsibCIsIkwiXSkKKyAgPgorfAorICA8IElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgPERFQ0lNQUxfTElURVJBTD4KKyAgICAgIHwgPEhFWF9MSVRFUkFMPgorICAgICAgfCA8T0NUQUxfTElURVJBTD4KKyAgICAgIHwgPEJJTkFSWV9MSVRFUkFMPgorICA+Cit8CisgIDwgI0RFQ0lNQUxfTElURVJBTDogWyIwIi0iOSJdKChbIjAiLSI5IiwiXyJdKSpbIjAiLSI5Il0pPyA+Cit8CisgIDwgI0hFWF9MSVRFUkFMOiAiMCIgWyJ4IiwiWCJdIDxIRVhfRElHSVRTPiA+Cit8CisgIDwgI09DVEFMX0xJVEVSQUw6ICIwIiBbIjAiLSI3Il0oKFsiMCItIjciLCJfIl0pKlsiMCItIjciXSk/ID4KK3wKKyAgPCAjQklOQVJZX0xJVEVSQUw6ICIwIiBbImIiLCJCIl0gWyIwIiwiMSJdKChbIjAiLCIxIiwiXyJdKSpbIjAiLCIxIl0pPyA+Cit8CisgIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgICAgPERFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTD4KKyAgICAgIHwgPEhFWEFERUNJTUFMX0ZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+CisgID4KK3wKKyAgPCAjREVDSU1BTF9GTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICA8REVDSU1BTF9MSVRFUkFMPiAiLiIgKDxERUNJTUFMX0xJVEVSQUw+KT8gKDxERUNJTUFMX0VYUE9ORU5UPik/IChbImYiLCJGIiwiZCIsIkQiXSk/CisgICAgICB8ICIuIiA8REVDSU1BTF9MSVRFUkFMPiAoPERFQ0lNQUxfRVhQT05FTlQ+KT8gKFsiZiIsIkYiLCJkIiwiRCJdKT8KKyAgICAgIHwgPERFQ0lNQUxfTElURVJBTD4gPERFQ0lNQUxfRVhQT05FTlQ+IChbImYiLCJGIiwiZCIsIkQiXSk/CisgICAgICB8IDxERUNJTUFMX0xJVEVSQUw+ICg8REVDSU1BTF9FWFBPTkVOVD4pPyBbImYiLCJGIiwiZCIsIkQiXQorICA+Cit8CisgIDwgI0RFQ0lNQUxfRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKDxERUNJTUFMX0xJVEVSQUw+KSsgPgorfAorICA8ICNIRVhBREVDSU1BTF9GTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICA8SEVYX0xJVEVSQUw+ICgiLiIpPyA8SEVYQURFQ0lNQUxfRVhQT05FTlQ+IChbImYiLCJGIiwiZCIsIkQiXSk/CisgICAgICB8ICIwIiBbIngiLCJYIl0gKDxIRVhfRElHSVRTPik/ICIuIiA8SEVYX0RJR0lUUz4gPEhFWEFERUNJTUFMX0VYUE9ORU5UPiAoWyJmIiwiRiIsImQiLCJEIl0pPworICA+Cit8CisgIDwgI0hFWEFERUNJTUFMX0VYUE9ORU5UOiBbInAiLCJQIl0gKFsiKyIsIi0iXSk/IDxERUNJTUFMX0xJVEVSQUw+ID4KK3wKKyAgPCAjSEVYX0RJR0lUUzogWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSgoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiLCJfIl0pKlsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0pPyA+Cit8CisgIDwgI1VOSUNPREVfRVNDQVBFOgorICAgICJcXHUiCisgICAgWyIwIi0iOSIsIkEiLSJGIiwiYSItImYiXQorICAgIFsiMCItIjkiLCJBIi0iRiIsImEiLSJmIl0KKyAgICBbIjAiLSI5IiwiQSItIkYiLCJhIi0iZiJdCisgICAgWyIwIi0iOSIsIkEiLSJGIiwiYSItImYiXSA+Cit8CisgIDwgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICAiJyIKKyAgICAgICggICAoflsiJyIsIlxcIiwiXG4iLCJcciJdKQorICAgICAgICB8ICgiXFwiCisgICAgICAgICAgICAoIFsibiIsInQiLCJiIiwiciIsImYiLCJcXCIsIiciLCJcIiJdCisgICAgICAgICAgICB8IFsiMCItIjciXSAoIFsiMCItIjciXSApPworICAgICAgICAgICAgfCBbIjAiLSIzIl0gWyIwIi0iNyJdIFsiMCItIjciXQorICAgICAgICAgICAgKQorICAgICAgICAgICkKKyAgICAgICAgfCA8VU5JQ09ERV9FU0NBUEU+CisgICAgICApCisgICAgICAiJyIKKyAgPgorfAorICA8IFNUUklOR19MSVRFUkFMOgorICAgICAgIlwiIgorICAgICAgKCAgICh+WyJcIiIsIlxcIiwiXG4iLCJcciJdKQorICAgICAgICB8ICgiXFwiCisgICAgICAgICAgICAoIFsibiIsInQiLCJiIiwiciIsImYiLCJcXCIsIiciLCJcIiJdCisgICAgICAgICAgICB8IFsiMCItIjciXSAoIFsiMCItIjciXSApPworICAgICAgICAgICAgfCBbIjAiLSIzIl0gWyIwIi0iNyJdIFsiMCItIjciXQorICAgICAgICAgICAgKQorICAgICAgICAgICkKKyAgICAgICAgfCAoIlxcdSIKKyAgICAgICAgCVsiMCItIjkiLCJBIi0iRiIsImEiLSJmIl0KKyAgICAgICAgCVsiMCItIjkiLCJBIi0iRiIsImEiLSJmIl0KKyAgICAgICAgCVsiMCItIjkiLCJBIi0iRiIsImEiLSJmIl0KKyAgICAgICAgCVsiMCItIjkiLCJBIi0iRiIsImEiLSJmIl0KKyAgICAgICAgICApCisgICAgICApKgorICAgICAgIlwiIgorICA+Cit9CisKKy8qIElERU5USUZJRVJTICovCisKK1RPS0VOIDoKK3sKKyAgPCBJREVOVElGSUVSOiA8TEVUVEVSPiAoPFBBUlRfTEVUVEVSPikqID4KK3wKKyAgPCAjTEVUVEVSOiBbCisgICAgICAgICAiXHUwMDI0IiwgICJcdTAwNDEiLSJcdTAwNWEiLCAgIlx1MDA1ZiIsICAiXHUwMDYxIi0iXHUwMDdhIiwgICJcdTAwYTIiLSJcdTAwYTUiLCAgIlx1MDBhYSIsICAiXHUwMGI1IiwgIAorICAgICAgICAgIlx1MDBiYSIsICAiXHUwMGMwIi0iXHUwMGQ2IiwgICJcdTAwZDgiLSJcdTAwZjYiLCAgIlx1MDBmOCItIlx1MDJjMSIsICAiXHUwMmM2Ii0iXHUwMmQxIiwgICJcdTAyZTAiLSJcdTAyZTQiLCAgCisgICAgICAgICAiXHUwMmVjIiwgICJcdTAyZWUiLCAgIlx1MDM3MCItIlx1MDM3NCIsICAiXHUwMzc2Ii0iXHUwMzc3IiwgICJcdTAzN2EiLSJcdTAzN2QiLCAgIlx1MDM4NiIsICAiXHUwMzg4Ii0iXHUwMzhhIiwgIAorICAgICAgICAgIlx1MDM4YyIsICAiXHUwMzhlIi0iXHUwM2ExIiwgICJcdTAzYTMiLSJcdTAzZjUiLCAgIlx1MDNmNyItIlx1MDQ4MSIsICAiXHUwNDhhIi0iXHUwNTI3IiwgICJcdTA1MzEiLSJcdTA1NTYiLCAgCisgICAgICAgICAiXHUwNTU5IiwgICJcdTA1NjEiLSJcdTA1ODciLCAgIlx1MDU4ZiIsICAiXHUwNWQwIi0iXHUwNWVhIiwgICJcdTA1ZjAiLSJcdTA1ZjIiLCAgIlx1MDYwYiIsICAiXHUwNjIwIi0iXHUwNjRhIiwgIAorICAgICAgICAgIlx1MDY2ZSItIlx1MDY2ZiIsICAiXHUwNjcxIi0iXHUwNmQzIiwgICJcdTA2ZDUiLCAgIlx1MDZlNSItIlx1MDZlNiIsICAiXHUwNmVlIi0iXHUwNmVmIiwgICJcdTA2ZmEiLSJcdTA2ZmMiLCAgCisgICAgICAgICAiXHUwNmZmIiwgICJcdTA3MTAiLCAgIlx1MDcxMiItIlx1MDcyZiIsICAiXHUwNzRkIi0iXHUwN2E1IiwgICJcdTA3YjEiLCAgIlx1MDdjYSItIlx1MDdlYSIsICAiXHUwN2Y0Ii0iXHUwN2Y1IiwgIAorICAgICAgICAgIlx1MDdmYSIsICAiXHUwODAwIi0iXHUwODE1IiwgICJcdTA4MWEiLCAgIlx1MDgyNCIsICAiXHUwODI4IiwgICJcdTA4NDAiLSJcdTA4NTgiLCAgIlx1MDhhMCIsICAiXHUwOGEyIi0iXHUwOGFjIiwgIAorICAgICAgICAgIlx1MDkwNCItIlx1MDkzOSIsICAiXHUwOTNkIiwgICJcdTA5NTAiLCAgIlx1MDk1OCItIlx1MDk2MSIsICAiXHUwOTcxIi0iXHUwOTc3IiwgICJcdTA5NzkiLSJcdTA5N2YiLCAgCisgICAgICAgICAiXHUwOTg1Ii0iXHUwOThjIiwgICJcdTA5OGYiLSJcdTA5OTAiLCAgIlx1MDk5MyItIlx1MDlhOCIsICAiXHUwOWFhIi0iXHUwOWIwIiwgICJcdTA5YjIiLCAgIlx1MDliNiItIlx1MDliOSIsICAKKyAgICAgICAgICJcdTA5YmQiLCAgIlx1MDljZSIsICAiXHUwOWRjIi0iXHUwOWRkIiwgICJcdTA5ZGYiLSJcdTA5ZTEiLCAgIlx1MDlmMCItIlx1MDlmMyIsICAiXHUwOWZiIiwgICJcdTBhMDUiLSJcdTBhMGEiLCAgCisgICAgICAgICAiXHUwYTBmIi0iXHUwYTEwIiwgICJcdTBhMTMiLSJcdTBhMjgiLCAgIlx1MGEyYSItIlx1MGEzMCIsICAiXHUwYTMyIi0iXHUwYTMzIiwgICJcdTBhMzUiLSJcdTBhMzYiLCAgCisgICAgICAgICAiXHUwYTM4Ii0iXHUwYTM5IiwgICJcdTBhNTkiLSJcdTBhNWMiLCAgIlx1MGE1ZSIsICAiXHUwYTcyIi0iXHUwYTc0IiwgICJcdTBhODUiLSJcdTBhOGQiLCAgIlx1MGE4ZiItIlx1MGE5MSIsICAKKyAgICAgICAgICJcdTBhOTMiLSJcdTBhYTgiLCAgIlx1MGFhYSItIlx1MGFiMCIsICAiXHUwYWIyIi0iXHUwYWIzIiwgICJcdTBhYjUiLSJcdTBhYjkiLCAgIlx1MGFiZCIsICAiXHUwYWQwIiwgIAorICAgICAgICAgIlx1MGFlMCItIlx1MGFlMSIsICAiXHUwYWYxIiwgICJcdTBiMDUiLSJcdTBiMGMiLCAgIlx1MGIwZiItIlx1MGIxMCIsICAiXHUwYjEzIi0iXHUwYjI4IiwgICJcdTBiMmEiLSJcdTBiMzAiLCAgCisgICAgICAgICAiXHUwYjMyIi0iXHUwYjMzIiwgICJcdTBiMzUiLSJcdTBiMzkiLCAgIlx1MGIzZCIsICAiXHUwYjVjIi0iXHUwYjVkIiwgICJcdTBiNWYiLSJcdTBiNjEiLCAgIlx1MGI3MSIsICAKKyAgICAgICAgICJcdTBiODMiLCAgIlx1MGI4NSItIlx1MGI4YSIsICAiXHUwYjhlIi0iXHUwYjkwIiwgICJcdTBiOTIiLSJcdTBiOTUiLCAgIlx1MGI5OSItIlx1MGI5YSIsICAiXHUwYjljIiwgIAorICAgICAgICAgIlx1MGI5ZSItIlx1MGI5ZiIsICAiXHUwYmEzIi0iXHUwYmE0IiwgICJcdTBiYTgiLSJcdTBiYWEiLCAgIlx1MGJhZSItIlx1MGJiOSIsICAiXHUwYmQwIiwgICJcdTBiZjkiLCAgCisgICAgICAgICAiXHUwYzA1Ii0iXHUwYzBjIiwgICJcdTBjMGUiLSJcdTBjMTAiLCAgIlx1MGMxMiItIlx1MGMyOCIsICAiXHUwYzJhIi0iXHUwYzMzIiwgICJcdTBjMzUiLSJcdTBjMzkiLCAgCisgICAgICAgICAiXHUwYzNkIiwgICJcdTBjNTgiLSJcdTBjNTkiLCAgIlx1MGM2MCItIlx1MGM2MSIsICAiXHUwYzg1Ii0iXHUwYzhjIiwgICJcdTBjOGUiLSJcdTBjOTAiLCAgIlx1MGM5MiItIlx1MGNhOCIsICAKKyAgICAgICAgICJcdTBjYWEiLSJcdTBjYjMiLCAgIlx1MGNiNSItIlx1MGNiOSIsICAiXHUwY2JkIiwgICJcdTBjZGUiLCAgIlx1MGNlMCItIlx1MGNlMSIsICAiXHUwY2YxIi0iXHUwY2YyIiwgIAorICAgICAgICAgIlx1MGQwNSItIlx1MGQwYyIsICAiXHUwZDBlIi0iXHUwZDEwIiwgICJcdTBkMTIiLSJcdTBkM2EiLCAgIlx1MGQzZCIsICAiXHUwZDRlIiwgICJcdTBkNjAiLSJcdTBkNjEiLCAgCisgICAgICAgICAiXHUwZDdhIi0iXHUwZDdmIiwgICJcdTBkODUiLSJcdTBkOTYiLCAgIlx1MGQ5YSItIlx1MGRiMSIsICAiXHUwZGIzIi0iXHUwZGJiIiwgICJcdTBkYmQiLCAgIlx1MGRjMCItIlx1MGRjNiIsICAKKyAgICAgICAgICJcdTBlMDEiLSJcdTBlMzAiLCAgIlx1MGUzMiItIlx1MGUzMyIsICAiXHUwZTNmIi0iXHUwZTQ2IiwgICJcdTBlODEiLSJcdTBlODIiLCAgIlx1MGU4NCIsICAiXHUwZTg3Ii0iXHUwZTg4IiwgIAorICAgICAgICAgIlx1MGU4YSIsICAiXHUwZThkIiwgICJcdTBlOTQiLSJcdTBlOTciLCAgIlx1MGU5OSItIlx1MGU5ZiIsICAiXHUwZWExIi0iXHUwZWEzIiwgICJcdTBlYTUiLCAgIlx1MGVhNyIsICAKKyAgICAgICAgICJcdTBlYWEiLSJcdTBlYWIiLCAgIlx1MGVhZCItIlx1MGViMCIsICAiXHUwZWIyIi0iXHUwZWIzIiwgICJcdTBlYmQiLCAgIlx1MGVjMCItIlx1MGVjNCIsICAiXHUwZWM2IiwgIAorICAgICAgICAgIlx1MGVkYyItIlx1MGVkZiIsICAiXHUwZjAwIiwgICJcdTBmNDAiLSJcdTBmNDciLCAgIlx1MGY0OSItIlx1MGY2YyIsICAiXHUwZjg4Ii0iXHUwZjhjIiwgICJcdTEwMDAiLSJcdTEwMmEiLCAgCisgICAgICAgICAiXHUxMDNmIiwgICJcdTEwNTAiLSJcdTEwNTUiLCAgIlx1MTA1YSItIlx1MTA1ZCIsICAiXHUxMDYxIiwgICJcdTEwNjUiLSJcdTEwNjYiLCAgIlx1MTA2ZSItIlx1MTA3MCIsICAKKyAgICAgICAgICJcdTEwNzUiLSJcdTEwODEiLCAgIlx1MTA4ZSIsICAiXHUxMGEwIi0iXHUxMGM1IiwgICJcdTEwYzciLCAgIlx1MTBjZCIsICAiXHUxMGQwIi0iXHUxMGZhIiwgICJcdTEwZmMiLSJcdTEyNDgiLCAgCisgICAgICAgICAiXHUxMjRhIi0iXHUxMjRkIiwgICJcdTEyNTAiLSJcdTEyNTYiLCAgIlx1MTI1OCIsICAiXHUxMjVhIi0iXHUxMjVkIiwgICJcdTEyNjAiLSJcdTEyODgiLCAgIlx1MTI4YSItIlx1MTI4ZCIsICAKKyAgICAgICAgICJcdTEyOTAiLSJcdTEyYjAiLCAgIlx1MTJiMiItIlx1MTJiNSIsICAiXHUxMmI4Ii0iXHUxMmJlIiwgICJcdTEyYzAiLCAgIlx1MTJjMiItIlx1MTJjNSIsICAiXHUxMmM4Ii0iXHUxMmQ2IiwgIAorICAgICAgICAgIlx1MTJkOCItIlx1MTMxMCIsICAiXHUxMzEyIi0iXHUxMzE1IiwgICJcdTEzMTgiLSJcdTEzNWEiLCAgIlx1MTM4MCItIlx1MTM4ZiIsICAiXHUxM2EwIi0iXHUxM2Y0IiwgIAorICAgICAgICAgIlx1MTQwMSItIlx1MTY2YyIsICAiXHUxNjZmIi0iXHUxNjdmIiwgICJcdTE2ODEiLSJcdTE2OWEiLCAgIlx1MTZhMCItIlx1MTZlYSIsICAiXHUxNmVlIi0iXHUxNmYwIiwgIAorICAgICAgICAgIlx1MTcwMCItIlx1MTcwYyIsICAiXHUxNzBlIi0iXHUxNzExIiwgICJcdTE3MjAiLSJcdTE3MzEiLCAgIlx1MTc0MCItIlx1MTc1MSIsICAiXHUxNzYwIi0iXHUxNzZjIiwgIAorICAgICAgICAgIlx1MTc2ZSItIlx1MTc3MCIsICAiXHUxNzgwIi0iXHUxN2IzIiwgICJcdTE3ZDciLCAgIlx1MTdkYiItIlx1MTdkYyIsICAiXHUxODIwIi0iXHUxODc3IiwgICJcdTE4ODAiLSJcdTE4YTgiLCAgCisgICAgICAgICAiXHUxOGFhIiwgICJcdTE4YjAiLSJcdTE4ZjUiLCAgIlx1MTkwMCItIlx1MTkxYyIsICAiXHUxOTUwIi0iXHUxOTZkIiwgICJcdTE5NzAiLSJcdTE5NzQiLCAgIlx1MTk4MCItIlx1MTlhYiIsICAKKyAgICAgICAgICJcdTE5YzEiLSJcdTE5YzciLCAgIlx1MWEwMCItIlx1MWExNiIsICAiXHUxYTIwIi0iXHUxYTU0IiwgICJcdTFhYTciLCAgIlx1MWIwNSItIlx1MWIzMyIsICAiXHUxYjQ1Ii0iXHUxYjRiIiwgIAorICAgICAgICAgIlx1MWI4MyItIlx1MWJhMCIsICAiXHUxYmFlIi0iXHUxYmFmIiwgICJcdTFiYmEiLSJcdTFiZTUiLCAgIlx1MWMwMCItIlx1MWMyMyIsICAiXHUxYzRkIi0iXHUxYzRmIiwgIAorICAgICAgICAgIlx1MWM1YSItIlx1MWM3ZCIsICAiXHUxY2U5Ii0iXHUxY2VjIiwgICJcdTFjZWUiLSJcdTFjZjEiLCAgIlx1MWNmNSItIlx1MWNmNiIsICAiXHUxZDAwIi0iXHUxZGJmIiwgIAorICAgICAgICAgIlx1MWUwMCItIlx1MWYxNSIsICAiXHUxZjE4Ii0iXHUxZjFkIiwgICJcdTFmMjAiLSJcdTFmNDUiLCAgIlx1MWY0OCItIlx1MWY0ZCIsICAiXHUxZjUwIi0iXHUxZjU3IiwgIAorICAgICAgICAgIlx1MWY1OSIsICAiXHUxZjViIiwgICJcdTFmNWQiLCAgIlx1MWY1ZiItIlx1MWY3ZCIsICAiXHUxZjgwIi0iXHUxZmI0IiwgICJcdTFmYjYiLSJcdTFmYmMiLCAgIlx1MWZiZSIsICAKKyAgICAgICAgICJcdTFmYzIiLSJcdTFmYzQiLCAgIlx1MWZjNiItIlx1MWZjYyIsICAiXHUxZmQwIi0iXHUxZmQzIiwgICJcdTFmZDYiLSJcdTFmZGIiLCAgIlx1MWZlMCItIlx1MWZlYyIsICAKKyAgICAgICAgICJcdTFmZjIiLSJcdTFmZjQiLCAgIlx1MWZmNiItIlx1MWZmYyIsICAiXHUyMDNmIi0iXHUyMDQwIiwgICJcdTIwNTQiLCAgIlx1MjA3MSIsICAiXHUyMDdmIiwgICJcdTIwOTAiLSJcdTIwOWMiLCAgCisgICAgICAgICAiXHUyMGEwIi0iXHUyMGJhIiwgICJcdTIxMDIiLCAgIlx1MjEwNyIsICAiXHUyMTBhIi0iXHUyMTEzIiwgICJcdTIxMTUiLCAgIlx1MjExOSItIlx1MjExZCIsICAiXHUyMTI0IiwgIAorICAgICAgICAgIlx1MjEyNiIsICAiXHUyMTI4IiwgICJcdTIxMmEiLSJcdTIxMmQiLCAgIlx1MjEyZiItIlx1MjEzOSIsICAiXHUyMTNjIi0iXHUyMTNmIiwgICJcdTIxNDUiLSJcdTIxNDkiLCAgCisgICAgICAgICAiXHUyMTRlIiwgICJcdTIxNjAiLSJcdTIxODgiLCAgIlx1MmMwMCItIlx1MmMyZSIsICAiXHUyYzMwIi0iXHUyYzVlIiwgICJcdTJjNjAiLSJcdTJjZTQiLCAgIlx1MmNlYiItIlx1MmNlZSIsICAKKyAgICAgICAgICJcdTJjZjIiLSJcdTJjZjMiLCAgIlx1MmQwMCItIlx1MmQyNSIsICAiXHUyZDI3IiwgICJcdTJkMmQiLCAgIlx1MmQzMCItIlx1MmQ2NyIsICAiXHUyZDZmIiwgICJcdTJkODAiLSJcdTJkOTYiLCAgCisgICAgICAgICAiXHUyZGEwIi0iXHUyZGE2IiwgICJcdTJkYTgiLSJcdTJkYWUiLCAgIlx1MmRiMCItIlx1MmRiNiIsICAiXHUyZGI4Ii0iXHUyZGJlIiwgICJcdTJkYzAiLSJcdTJkYzYiLCAgCisgICAgICAgICAiXHUyZGM4Ii0iXHUyZGNlIiwgICJcdTJkZDAiLSJcdTJkZDYiLCAgIlx1MmRkOCItIlx1MmRkZSIsICAiXHUyZTJmIiwgICJcdTMwMDUiLSJcdTMwMDciLCAgIlx1MzAyMSItIlx1MzAyOSIsICAKKyAgICAgICAgICJcdTMwMzEiLSJcdTMwMzUiLCAgIlx1MzAzOCItIlx1MzAzYyIsICAiXHUzMDQxIi0iXHUzMDk2IiwgICJcdTMwOWQiLSJcdTMwOWYiLCAgIlx1MzBhMSItIlx1MzBmYSIsICAKKyAgICAgICAgICJcdTMwZmMiLSJcdTMwZmYiLCAgIlx1MzEwNSItIlx1MzEyZCIsICAiXHUzMTMxIi0iXHUzMThlIiwgICJcdTMxYTAiLSJcdTMxYmEiLCAgIlx1MzFmMCItIlx1MzFmZiIsICAKKyAgICAgICAgICJcdTM0MDAiLSJcdTRkYjUiLCAgIlx1NGUwMCItIlx1OWZjYyIsICAiXHVhMDAwIi0iXHVhNDhjIiwgICJcdWE0ZDAiLSJcdWE0ZmQiLCAgIlx1YTUwMCItIlx1YTYwYyIsICAKKyAgICAgICAgICJcdWE2MTAiLSJcdWE2MWYiLCAgIlx1YTYyYSItIlx1YTYyYiIsICAiXHVhNjQwIi0iXHVhNjZlIiwgICJcdWE2N2YiLSJcdWE2OTciLCAgIlx1YTZhMCItIlx1YTZlZiIsICAKKyAgICAgICAgICJcdWE3MTciLSJcdWE3MWYiLCAgIlx1YTcyMiItIlx1YTc4OCIsICAiXHVhNzhiIi0iXHVhNzhlIiwgICJcdWE3OTAiLSJcdWE3OTMiLCAgIlx1YTdhMCItIlx1YTdhYSIsICAKKyAgICAgICAgICJcdWE3ZjgiLSJcdWE4MDEiLCAgIlx1YTgwMyItIlx1YTgwNSIsICAiXHVhODA3Ii0iXHVhODBhIiwgICJcdWE4MGMiLSJcdWE4MjIiLCAgIlx1YTgzOCIsICAiXHVhODQwIi0iXHVhODczIiwgIAorICAgICAgICAgIlx1YTg4MiItIlx1YThiMyIsICAiXHVhOGYyIi0iXHVhOGY3IiwgICJcdWE4ZmIiLCAgIlx1YTkwYSItIlx1YTkyNSIsICAiXHVhOTMwIi0iXHVhOTQ2IiwgICJcdWE5NjAiLSJcdWE5N2MiLCAgCisgICAgICAgICAiXHVhOTg0Ii0iXHVhOWIyIiwgICJcdWE5Y2YiLCAgIlx1YWEwMCItIlx1YWEyOCIsICAiXHVhYTQwIi0iXHVhYTQyIiwgICJcdWFhNDQiLSJcdWFhNGIiLCAgIlx1YWE2MCItIlx1YWE3NiIsICAKKyAgICAgICAgICJcdWFhN2EiLCAgIlx1YWE4MCItIlx1YWFhZiIsICAiXHVhYWIxIiwgICJcdWFhYjUiLSJcdWFhYjYiLCAgIlx1YWFiOSItIlx1YWFiZCIsICAiXHVhYWMwIiwgICJcdWFhYzIiLCAgCisgICAgICAgICAiXHVhYWRiIi0iXHVhYWRkIiwgICJcdWFhZTAiLSJcdWFhZWEiLCAgIlx1YWFmMiItIlx1YWFmNCIsICAiXHVhYjAxIi0iXHVhYjA2IiwgICJcdWFiMDkiLSJcdWFiMGUiLCAgCisgICAgICAgICAiXHVhYjExIi0iXHVhYjE2IiwgICJcdWFiMjAiLSJcdWFiMjYiLCAgIlx1YWIyOCItIlx1YWIyZSIsICAiXHVhYmMwIi0iXHVhYmUyIiwgICJcdWFjMDAiLSJcdWQ3YTMiLCAgCisgICAgICAgICAiXHVkN2IwIi0iXHVkN2M2IiwgICJcdWQ3Y2IiLSJcdWQ3ZmIiLCAgIlx1ZDgwMCItIlx1ZGZmZiIsICAiXHVmOTAwIi0iXHVmYTZkIiwgICJcdWZhNzAiLSJcdWZhZDkiLCAgCisgICAgICAgICAiXHVmYjAwIi0iXHVmYjA2IiwgICJcdWZiMTMiLSJcdWZiMTciLCAgIlx1ZmIxZCIsICAiXHVmYjFmIi0iXHVmYjI4IiwgICJcdWZiMmEiLSJcdWZiMzYiLCAgIlx1ZmIzOCItIlx1ZmIzYyIsICAKKyAgICAgICAgICJcdWZiM2UiLCAgIlx1ZmI0MCItIlx1ZmI0MSIsICAiXHVmYjQzIi0iXHVmYjQ0IiwgICJcdWZiNDYiLSJcdWZiYjEiLCAgIlx1ZmJkMyItIlx1ZmQzZCIsICAiXHVmZDUwIi0iXHVmZDhmIiwgIAorICAgICAgICAgIlx1ZmQ5MiItIlx1ZmRjNyIsICAiXHVmZGYwIi0iXHVmZGZjIiwgICJcdWZlMzMiLSJcdWZlMzQiLCAgIlx1ZmU0ZCItIlx1ZmU0ZiIsICAiXHVmZTY5IiwgICJcdWZlNzAiLSJcdWZlNzQiLCAgCisgICAgICAgICAiXHVmZTc2Ii0iXHVmZWZjIiwgICJcdWZmMDQiLCAgIlx1ZmYyMSItIlx1ZmYzYSIsICAiXHVmZjNmIiwgICJcdWZmNDEiLSJcdWZmNWEiLCAgIlx1ZmY2NiItIlx1ZmZiZSIsICAKKyAgICAgICAgICJcdWZmYzIiLSJcdWZmYzciLCAgIlx1ZmZjYSItIlx1ZmZjZiIsICAiXHVmZmQyIi0iXHVmZmQ3IiwgICJcdWZmZGEiLSJcdWZmZGMiLCAgIlx1ZmZlMCItIlx1ZmZlMSIsICAKKyAgICAgICAgICJcdWZmZTUiLSJcdWZmZTYiICBdCisgICAgICAgIHwgPFVOSUNPREVfRVNDQVBFPgorICA+Cit8CisgIDwgI1BBUlRfTEVUVEVSOiBbCisgICAgICAgICAiXHUwMDAwIi0iXHUwMDA4IiwgICJcdTAwMGUiLSJcdTAwMWIiLCAgIlx1MDAyNCIsICAiXHUwMDMwIi0iXHUwMDM5IiwgICJcdTAwNDEiLSJcdTAwNWEiLCAgIlx1MDA1ZiIsICAKKyAgICAgICAgICJcdTAwNjEiLSJcdTAwN2EiLCAgIlx1MDA3ZiItIlx1MDA5ZiIsICAiXHUwMGEyIi0iXHUwMGE1IiwgICJcdTAwYWEiLCAgIlx1MDBhZCIsICAiXHUwMGI1IiwgICJcdTAwYmEiLCAgCisgICAgICAgICAiXHUwMGMwIi0iXHUwMGQ2IiwgICJcdTAwZDgiLSJcdTAwZjYiLCAgIlx1MDBmOCItIlx1MDJjMSIsICAiXHUwMmM2Ii0iXHUwMmQxIiwgICJcdTAyZTAiLSJcdTAyZTQiLCAgCisgICAgICAgICAiXHUwMmVjIiwgICJcdTAyZWUiLCAgIlx1MDMwMCItIlx1MDM3NCIsICAiXHUwMzc2Ii0iXHUwMzc3IiwgICJcdTAzN2EiLSJcdTAzN2QiLCAgIlx1MDM4NiIsICAiXHUwMzg4Ii0iXHUwMzhhIiwgIAorICAgICAgICAgIlx1MDM4YyIsICAiXHUwMzhlIi0iXHUwM2ExIiwgICJcdTAzYTMiLSJcdTAzZjUiLCAgIlx1MDNmNyItIlx1MDQ4MSIsICAiXHUwNDgzIi0iXHUwNDg3IiwgICJcdTA0OGEiLSJcdTA1MjciLCAgCisgICAgICAgICAiXHUwNTMxIi0iXHUwNTU2IiwgICJcdTA1NTkiLCAgIlx1MDU2MSItIlx1MDU4NyIsICAiXHUwNThmIiwgICJcdTA1OTEiLSJcdTA1YmQiLCAgIlx1MDViZiIsICAiXHUwNWMxIi0iXHUwNWMyIiwgIAorICAgICAgICAgIlx1MDVjNCItIlx1MDVjNSIsICAiXHUwNWM3IiwgICJcdTA1ZDAiLSJcdTA1ZWEiLCAgIlx1MDVmMCItIlx1MDVmMiIsICAiXHUwNjAwIi0iXHUwNjA0IiwgICJcdTA2MGIiLCAgCisgICAgICAgICAiXHUwNjEwIi0iXHUwNjFhIiwgICJcdTA2MjAiLSJcdTA2NjkiLCAgIlx1MDY2ZSItIlx1MDZkMyIsICAiXHUwNmQ1Ii0iXHUwNmRkIiwgICJcdTA2ZGYiLSJcdTA2ZTgiLCAgCisgICAgICAgICAiXHUwNmVhIi0iXHUwNmZjIiwgICJcdTA2ZmYiLCAgIlx1MDcwZiItIlx1MDc0YSIsICAiXHUwNzRkIi0iXHUwN2IxIiwgICJcdTA3YzAiLSJcdTA3ZjUiLCAgIlx1MDdmYSIsICAKKyAgICAgICAgICJcdTA4MDAiLSJcdTA4MmQiLCAgIlx1MDg0MCItIlx1MDg1YiIsICAiXHUwOGEwIiwgICJcdTA4YTIiLSJcdTA4YWMiLCAgIlx1MDhlNCItIlx1MDhmZSIsICAiXHUwOTAwIi0iXHUwOTYzIiwgIAorICAgICAgICAgIlx1MDk2NiItIlx1MDk2ZiIsICAiXHUwOTcxIi0iXHUwOTc3IiwgICJcdTA5NzkiLSJcdTA5N2YiLCAgIlx1MDk4MSItIlx1MDk4MyIsICAiXHUwOTg1Ii0iXHUwOThjIiwgIAorICAgICAgICAgIlx1MDk4ZiItIlx1MDk5MCIsICAiXHUwOTkzIi0iXHUwOWE4IiwgICJcdTA5YWEiLSJcdTA5YjAiLCAgIlx1MDliMiIsICAiXHUwOWI2Ii0iXHUwOWI5IiwgICJcdTA5YmMiLSJcdTA5YzQiLCAgCisgICAgICAgICAiXHUwOWM3Ii0iXHUwOWM4IiwgICJcdTA5Y2IiLSJcdTA5Y2UiLCAgIlx1MDlkNyIsICAiXHUwOWRjIi0iXHUwOWRkIiwgICJcdTA5ZGYiLSJcdTA5ZTMiLCAgIlx1MDllNiItIlx1MDlmMyIsICAKKyAgICAgICAgICJcdTA5ZmIiLCAgIlx1MGEwMSItIlx1MGEwMyIsICAiXHUwYTA1Ii0iXHUwYTBhIiwgICJcdTBhMGYiLSJcdTBhMTAiLCAgIlx1MGExMyItIlx1MGEyOCIsICAiXHUwYTJhIi0iXHUwYTMwIiwgIAorICAgICAgICAgIlx1MGEzMiItIlx1MGEzMyIsICAiXHUwYTM1Ii0iXHUwYTM2IiwgICJcdTBhMzgiLSJcdTBhMzkiLCAgIlx1MGEzYyIsICAiXHUwYTNlIi0iXHUwYTQyIiwgICJcdTBhNDciLSJcdTBhNDgiLCAgCisgICAgICAgICAiXHUwYTRiIi0iXHUwYTRkIiwgICJcdTBhNTEiLCAgIlx1MGE1OSItIlx1MGE1YyIsICAiXHUwYTVlIiwgICJcdTBhNjYiLSJcdTBhNzUiLCAgIlx1MGE4MSItIlx1MGE4MyIsICAKKyAgICAgICAgICJcdTBhODUiLSJcdTBhOGQiLCAgIlx1MGE4ZiItIlx1MGE5MSIsICAiXHUwYTkzIi0iXHUwYWE4IiwgICJcdTBhYWEiLSJcdTBhYjAiLCAgIlx1MGFiMiItIlx1MGFiMyIsICAKKyAgICAgICAgICJcdTBhYjUiLSJcdTBhYjkiLCAgIlx1MGFiYyItIlx1MGFjNSIsICAiXHUwYWM3Ii0iXHUwYWM5IiwgICJcdTBhY2IiLSJcdTBhY2QiLCAgIlx1MGFkMCIsICAiXHUwYWUwIi0iXHUwYWUzIiwgIAorICAgICAgICAgIlx1MGFlNiItIlx1MGFlZiIsICAiXHUwYWYxIiwgICJcdTBiMDEiLSJcdTBiMDMiLCAgIlx1MGIwNSItIlx1MGIwYyIsICAiXHUwYjBmIi0iXHUwYjEwIiwgICJcdTBiMTMiLSJcdTBiMjgiLCAgCisgICAgICAgICAiXHUwYjJhIi0iXHUwYjMwIiwgICJcdTBiMzIiLSJcdTBiMzMiLCAgIlx1MGIzNSItIlx1MGIzOSIsICAiXHUwYjNjIi0iXHUwYjQ0IiwgICJcdTBiNDciLSJcdTBiNDgiLCAgCisgICAgICAgICAiXHUwYjRiIi0iXHUwYjRkIiwgICJcdTBiNTYiLSJcdTBiNTciLCAgIlx1MGI1YyItIlx1MGI1ZCIsICAiXHUwYjVmIi0iXHUwYjYzIiwgICJcdTBiNjYiLSJcdTBiNmYiLCAgCisgICAgICAgICAiXHUwYjcxIiwgICJcdTBiODIiLSJcdTBiODMiLCAgIlx1MGI4NSItIlx1MGI4YSIsICAiXHUwYjhlIi0iXHUwYjkwIiwgICJcdTBiOTIiLSJcdTBiOTUiLCAgIlx1MGI5OSItIlx1MGI5YSIsICAKKyAgICAgICAgICJcdTBiOWMiLCAgIlx1MGI5ZSItIlx1MGI5ZiIsICAiXHUwYmEzIi0iXHUwYmE0IiwgICJcdTBiYTgiLSJcdTBiYWEiLCAgIlx1MGJhZSItIlx1MGJiOSIsICAiXHUwYmJlIi0iXHUwYmMyIiwgIAorICAgICAgICAgIlx1MGJjNiItIlx1MGJjOCIsICAiXHUwYmNhIi0iXHUwYmNkIiwgICJcdTBiZDAiLCAgIlx1MGJkNyIsICAiXHUwYmU2Ii0iXHUwYmVmIiwgICJcdTBiZjkiLCAgIlx1MGMwMSItIlx1MGMwMyIsICAKKyAgICAgICAgICJcdTBjMDUiLSJcdTBjMGMiLCAgIlx1MGMwZSItIlx1MGMxMCIsICAiXHUwYzEyIi0iXHUwYzI4IiwgICJcdTBjMmEiLSJcdTBjMzMiLCAgIlx1MGMzNSItIlx1MGMzOSIsICAKKyAgICAgICAgICJcdTBjM2QiLSJcdTBjNDQiLCAgIlx1MGM0NiItIlx1MGM0OCIsICAiXHUwYzRhIi0iXHUwYzRkIiwgICJcdTBjNTUiLSJcdTBjNTYiLCAgIlx1MGM1OCItIlx1MGM1OSIsICAKKyAgICAgICAgICJcdTBjNjAiLSJcdTBjNjMiLCAgIlx1MGM2NiItIlx1MGM2ZiIsICAiXHUwYzgyIi0iXHUwYzgzIiwgICJcdTBjODUiLSJcdTBjOGMiLCAgIlx1MGM4ZSItIlx1MGM5MCIsICAKKyAgICAgICAgICJcdTBjOTIiLSJcdTBjYTgiLCAgIlx1MGNhYSItIlx1MGNiMyIsICAiXHUwY2I1Ii0iXHUwY2I5IiwgICJcdTBjYmMiLSJcdTBjYzQiLCAgIlx1MGNjNiItIlx1MGNjOCIsICAKKyAgICAgICAgICJcdTBjY2EiLSJcdTBjY2QiLCAgIlx1MGNkNSItIlx1MGNkNiIsICAiXHUwY2RlIiwgICJcdTBjZTAiLSJcdTBjZTMiLCAgIlx1MGNlNiItIlx1MGNlZiIsICAiXHUwY2YxIi0iXHUwY2YyIiwgIAorICAgICAgICAgIlx1MGQwMiItIlx1MGQwMyIsICAiXHUwZDA1Ii0iXHUwZDBjIiwgICJcdTBkMGUiLSJcdTBkMTAiLCAgIlx1MGQxMiItIlx1MGQzYSIsICAiXHUwZDNkIi0iXHUwZDQ0IiwgIAorICAgICAgICAgIlx1MGQ0NiItIlx1MGQ0OCIsICAiXHUwZDRhIi0iXHUwZDRlIiwgICJcdTBkNTciLCAgIlx1MGQ2MCItIlx1MGQ2MyIsICAiXHUwZDY2Ii0iXHUwZDZmIiwgICJcdTBkN2EiLSJcdTBkN2YiLCAgCisgICAgICAgICAiXHUwZDgyIi0iXHUwZDgzIiwgICJcdTBkODUiLSJcdTBkOTYiLCAgIlx1MGQ5YSItIlx1MGRiMSIsICAiXHUwZGIzIi0iXHUwZGJiIiwgICJcdTBkYmQiLCAgIlx1MGRjMCItIlx1MGRjNiIsICAKKyAgICAgICAgICJcdTBkY2EiLCAgIlx1MGRjZiItIlx1MGRkNCIsICAiXHUwZGQ2IiwgICJcdTBkZDgiLSJcdTBkZGYiLCAgIlx1MGRmMiItIlx1MGRmMyIsICAiXHUwZTAxIi0iXHUwZTNhIiwgIAorICAgICAgICAgIlx1MGUzZiItIlx1MGU0ZSIsICAiXHUwZTUwIi0iXHUwZTU5IiwgICJcdTBlODEiLSJcdTBlODIiLCAgIlx1MGU4NCIsICAiXHUwZTg3Ii0iXHUwZTg4IiwgICJcdTBlOGEiLCAgCisgICAgICAgICAiXHUwZThkIiwgICJcdTBlOTQiLSJcdTBlOTciLCAgIlx1MGU5OSItIlx1MGU5ZiIsICAiXHUwZWExIi0iXHUwZWEzIiwgICJcdTBlYTUiLCAgIlx1MGVhNyIsICAiXHUwZWFhIi0iXHUwZWFiIiwgIAorICAgICAgICAgIlx1MGVhZCItIlx1MGViOSIsICAiXHUwZWJiIi0iXHUwZWJkIiwgICJcdTBlYzAiLSJcdTBlYzQiLCAgIlx1MGVjNiIsICAiXHUwZWM4Ii0iXHUwZWNkIiwgICJcdTBlZDAiLSJcdTBlZDkiLCAgCisgICAgICAgICAiXHUwZWRjIi0iXHUwZWRmIiwgICJcdTBmMDAiLCAgIlx1MGYxOCItIlx1MGYxOSIsICAiXHUwZjIwIi0iXHUwZjI5IiwgICJcdTBmMzUiLCAgIlx1MGYzNyIsICAiXHUwZjM5IiwgIAorICAgICAgICAgIlx1MGYzZSItIlx1MGY0NyIsICAiXHUwZjQ5Ii0iXHUwZjZjIiwgICJcdTBmNzEiLSJcdTBmODQiLCAgIlx1MGY4NiItIlx1MGY5NyIsICAiXHUwZjk5Ii0iXHUwZmJjIiwgIAorICAgICAgICAgIlx1MGZjNiIsICAiXHUxMDAwIi0iXHUxMDQ5IiwgICJcdTEwNTAiLSJcdTEwOWQiLCAgIlx1MTBhMCItIlx1MTBjNSIsICAiXHUxMGM3IiwgICJcdTEwY2QiLCAgIlx1MTBkMCItIlx1MTBmYSIsICAKKyAgICAgICAgICJcdTEwZmMiLSJcdTEyNDgiLCAgIlx1MTI0YSItIlx1MTI0ZCIsICAiXHUxMjUwIi0iXHUxMjU2IiwgICJcdTEyNTgiLCAgIlx1MTI1YSItIlx1MTI1ZCIsICAiXHUxMjYwIi0iXHUxMjg4IiwgIAorICAgICAgICAgIlx1MTI4YSItIlx1MTI4ZCIsICAiXHUxMjkwIi0iXHUxMmIwIiwgICJcdTEyYjIiLSJcdTEyYjUiLCAgIlx1MTJiOCItIlx1MTJiZSIsICAiXHUxMmMwIiwgICJcdTEyYzIiLSJcdTEyYzUiLCAgCisgICAgICAgICAiXHUxMmM4Ii0iXHUxMmQ2IiwgICJcdTEyZDgiLSJcdTEzMTAiLCAgIlx1MTMxMiItIlx1MTMxNSIsICAiXHUxMzE4Ii0iXHUxMzVhIiwgICJcdTEzNWQiLSJcdTEzNWYiLCAgCisgICAgICAgICAiXHUxMzgwIi0iXHUxMzhmIiwgICJcdTEzYTAiLSJcdTEzZjQiLCAgIlx1MTQwMSItIlx1MTY2YyIsICAiXHUxNjZmIi0iXHUxNjdmIiwgICJcdTE2ODEiLSJcdTE2OWEiLCAgCisgICAgICAgICAiXHUxNmEwIi0iXHUxNmVhIiwgICJcdTE2ZWUiLSJcdTE2ZjAiLCAgIlx1MTcwMCItIlx1MTcwYyIsICAiXHUxNzBlIi0iXHUxNzE0IiwgICJcdTE3MjAiLSJcdTE3MzQiLCAgCisgICAgICAgICAiXHUxNzQwIi0iXHUxNzUzIiwgICJcdTE3NjAiLSJcdTE3NmMiLCAgIlx1MTc2ZSItIlx1MTc3MCIsICAiXHUxNzcyIi0iXHUxNzczIiwgICJcdTE3ODAiLSJcdTE3ZDMiLCAgCisgICAgICAgICAiXHUxN2Q3IiwgICJcdTE3ZGIiLSJcdTE3ZGQiLCAgIlx1MTdlMCItIlx1MTdlOSIsICAiXHUxODBiIi0iXHUxODBkIiwgICJcdTE4MTAiLSJcdTE4MTkiLCAgIlx1MTgyMCItIlx1MTg3NyIsICAKKyAgICAgICAgICJcdTE4ODAiLSJcdTE4YWEiLCAgIlx1MThiMCItIlx1MThmNSIsICAiXHUxOTAwIi0iXHUxOTFjIiwgICJcdTE5MjAiLSJcdTE5MmIiLCAgIlx1MTkzMCItIlx1MTkzYiIsICAKKyAgICAgICAgICJcdTE5NDYiLSJcdTE5NmQiLCAgIlx1MTk3MCItIlx1MTk3NCIsICAiXHUxOTgwIi0iXHUxOWFiIiwgICJcdTE5YjAiLSJcdTE5YzkiLCAgIlx1MTlkMCItIlx1MTlkOSIsICAKKyAgICAgICAgICJcdTFhMDAiLSJcdTFhMWIiLCAgIlx1MWEyMCItIlx1MWE1ZSIsICAiXHUxYTYwIi0iXHUxYTdjIiwgICJcdTFhN2YiLSJcdTFhODkiLCAgIlx1MWE5MCItIlx1MWE5OSIsICAKKyAgICAgICAgICJcdTFhYTciLCAgIlx1MWIwMCItIlx1MWI0YiIsICAiXHUxYjUwIi0iXHUxYjU5IiwgICJcdTFiNmIiLSJcdTFiNzMiLCAgIlx1MWI4MCItIlx1MWJmMyIsICAiXHUxYzAwIi0iXHUxYzM3IiwgIAorICAgICAgICAgIlx1MWM0MCItIlx1MWM0OSIsICAiXHUxYzRkIi0iXHUxYzdkIiwgICJcdTFjZDAiLSJcdTFjZDIiLCAgIlx1MWNkNCItIlx1MWNmNiIsICAiXHUxZDAwIi0iXHUxZGU2IiwgIAorICAgICAgICAgIlx1MWRmYyItIlx1MWYxNSIsICAiXHUxZjE4Ii0iXHUxZjFkIiwgICJcdTFmMjAiLSJcdTFmNDUiLCAgIlx1MWY0OCItIlx1MWY0ZCIsICAiXHUxZjUwIi0iXHUxZjU3IiwgIAorICAgICAgICAgIlx1MWY1OSIsICAiXHUxZjViIiwgICJcdTFmNWQiLCAgIlx1MWY1ZiItIlx1MWY3ZCIsICAiXHUxZjgwIi0iXHUxZmI0IiwgICJcdTFmYjYiLSJcdTFmYmMiLCAgIlx1MWZiZSIsICAKKyAgICAgICAgICJcdTFmYzIiLSJcdTFmYzQiLCAgIlx1MWZjNiItIlx1MWZjYyIsICAiXHUxZmQwIi0iXHUxZmQzIiwgICJcdTFmZDYiLSJcdTFmZGIiLCAgIlx1MWZlMCItIlx1MWZlYyIsICAKKyAgICAgICAgICJcdTFmZjIiLSJcdTFmZjQiLCAgIlx1MWZmNiItIlx1MWZmYyIsICAiXHUyMDBiIi0iXHUyMDBmIiwgICJcdTIwMmEiLSJcdTIwMmUiLCAgIlx1MjAzZiItIlx1MjA0MCIsICAKKyAgICAgICAgICJcdTIwNTQiLCAgIlx1MjA2MCItIlx1MjA2NCIsICAiXHUyMDZhIi0iXHUyMDZmIiwgICJcdTIwNzEiLCAgIlx1MjA3ZiIsICAiXHUyMDkwIi0iXHUyMDljIiwgICJcdTIwYTAiLSJcdTIwYmEiLCAgCisgICAgICAgICAiXHUyMGQwIi0iXHUyMGRjIiwgICJcdTIwZTEiLCAgIlx1MjBlNSItIlx1MjBmMCIsICAiXHUyMTAyIiwgICJcdTIxMDciLCAgIlx1MjEwYSItIlx1MjExMyIsICAiXHUyMTE1IiwgIAorICAgICAgICAgIlx1MjExOSItIlx1MjExZCIsICAiXHUyMTI0IiwgICJcdTIxMjYiLCAgIlx1MjEyOCIsICAiXHUyMTJhIi0iXHUyMTJkIiwgICJcdTIxMmYiLSJcdTIxMzkiLCAgIlx1MjEzYyItIlx1MjEzZiIsICAKKyAgICAgICAgICJcdTIxNDUiLSJcdTIxNDkiLCAgIlx1MjE0ZSIsICAiXHUyMTYwIi0iXHUyMTg4IiwgICJcdTJjMDAiLSJcdTJjMmUiLCAgIlx1MmMzMCItIlx1MmM1ZSIsICAiXHUyYzYwIi0iXHUyY2U0IiwgIAorICAgICAgICAgIlx1MmNlYiItIlx1MmNmMyIsICAiXHUyZDAwIi0iXHUyZDI1IiwgICJcdTJkMjciLCAgIlx1MmQyZCIsICAiXHUyZDMwIi0iXHUyZDY3IiwgICJcdTJkNmYiLCAgIlx1MmQ3ZiItIlx1MmQ5NiIsICAKKyAgICAgICAgICJcdTJkYTAiLSJcdTJkYTYiLCAgIlx1MmRhOCItIlx1MmRhZSIsICAiXHUyZGIwIi0iXHUyZGI2IiwgICJcdTJkYjgiLSJcdTJkYmUiLCAgIlx1MmRjMCItIlx1MmRjNiIsICAKKyAgICAgICAgICJcdTJkYzgiLSJcdTJkY2UiLCAgIlx1MmRkMCItIlx1MmRkNiIsICAiXHUyZGQ4Ii0iXHUyZGRlIiwgICJcdTJkZTAiLSJcdTJkZmYiLCAgIlx1MmUyZiIsICAiXHUzMDA1Ii0iXHUzMDA3IiwgIAorICAgICAgICAgIlx1MzAyMSItIlx1MzAyZiIsICAiXHUzMDMxIi0iXHUzMDM1IiwgICJcdTMwMzgiLSJcdTMwM2MiLCAgIlx1MzA0MSItIlx1MzA5NiIsICAiXHUzMDk5Ii0iXHUzMDlhIiwgIAorICAgICAgICAgIlx1MzA5ZCItIlx1MzA5ZiIsICAiXHUzMGExIi0iXHUzMGZhIiwgICJcdTMwZmMiLSJcdTMwZmYiLCAgIlx1MzEwNSItIlx1MzEyZCIsICAiXHUzMTMxIi0iXHUzMThlIiwgIAorICAgICAgICAgIlx1MzFhMCItIlx1MzFiYSIsICAiXHUzMWYwIi0iXHUzMWZmIiwgICJcdTM0MDAiLSJcdTRkYjUiLCAgIlx1NGUwMCItIlx1OWZjYyIsICAiXHVhMDAwIi0iXHVhNDhjIiwgIAorICAgICAgICAgIlx1YTRkMCItIlx1YTRmZCIsICAiXHVhNTAwIi0iXHVhNjBjIiwgICJcdWE2MTAiLSJcdWE2MmIiLCAgIlx1YTY0MCItIlx1YTY2ZiIsICAiXHVhNjc0Ii0iXHVhNjdkIiwgIAorICAgICAgICAgIlx1YTY3ZiItIlx1YTY5NyIsICAiXHVhNjlmIi0iXHVhNmYxIiwgICJcdWE3MTciLSJcdWE3MWYiLCAgIlx1YTcyMiItIlx1YTc4OCIsICAiXHVhNzhiIi0iXHVhNzhlIiwgIAorICAgICAgICAgIlx1YTc5MCItIlx1YTc5MyIsICAiXHVhN2EwIi0iXHVhN2FhIiwgICJcdWE3ZjgiLSJcdWE4MjciLCAgIlx1YTgzOCIsICAiXHVhODQwIi0iXHVhODczIiwgICJcdWE4ODAiLSJcdWE4YzQiLCAgCisgICAgICAgICAiXHVhOGQwIi0iXHVhOGQ5IiwgICJcdWE4ZTAiLSJcdWE4ZjciLCAgIlx1YThmYiIsICAiXHVhOTAwIi0iXHVhOTJkIiwgICJcdWE5MzAiLSJcdWE5NTMiLCAgIlx1YTk2MCItIlx1YTk3YyIsICAKKyAgICAgICAgICJcdWE5ODAiLSJcdWE5YzAiLCAgIlx1YTljZiItIlx1YTlkOSIsICAiXHVhYTAwIi0iXHVhYTM2IiwgICJcdWFhNDAiLSJcdWFhNGQiLCAgIlx1YWE1MCItIlx1YWE1OSIsICAKKyAgICAgICAgICJcdWFhNjAiLSJcdWFhNzYiLCAgIlx1YWE3YSItIlx1YWE3YiIsICAiXHVhYTgwIi0iXHVhYWMyIiwgICJcdWFhZGIiLSJcdWFhZGQiLCAgIlx1YWFlMCItIlx1YWFlZiIsICAKKyAgICAgICAgICJcdWFhZjIiLSJcdWFhZjYiLCAgIlx1YWIwMSItIlx1YWIwNiIsICAiXHVhYjA5Ii0iXHVhYjBlIiwgICJcdWFiMTEiLSJcdWFiMTYiLCAgIlx1YWIyMCItIlx1YWIyNiIsICAKKyAgICAgICAgICJcdWFiMjgiLSJcdWFiMmUiLCAgIlx1YWJjMCItIlx1YWJlYSIsICAiXHVhYmVjIi0iXHVhYmVkIiwgICJcdWFiZjAiLSJcdWFiZjkiLCAgIlx1YWMwMCItIlx1ZDdhMyIsICAKKyAgICAgICAgICJcdWQ3YjAiLSJcdWQ3YzYiLCAgIlx1ZDdjYiItIlx1ZDdmYiIsICAiXHVkODAwIi0iXHVkZmZmIiwgICJcdWY5MDAiLSJcdWZhNmQiLCAgIlx1ZmE3MCItIlx1ZmFkOSIsICAKKyAgICAgICAgICJcdWZiMDAiLSJcdWZiMDYiLCAgIlx1ZmIxMyItIlx1ZmIxNyIsICAiXHVmYjFkIi0iXHVmYjI4IiwgICJcdWZiMmEiLSJcdWZiMzYiLCAgIlx1ZmIzOCItIlx1ZmIzYyIsICAKKyAgICAgICAgICJcdWZiM2UiLCAgIlx1ZmI0MCItIlx1ZmI0MSIsICAiXHVmYjQzIi0iXHVmYjQ0IiwgICJcdWZiNDYiLSJcdWZiYjEiLCAgIlx1ZmJkMyItIlx1ZmQzZCIsICAiXHVmZDUwIi0iXHVmZDhmIiwgIAorICAgICAgICAgIlx1ZmQ5MiItIlx1ZmRjNyIsICAiXHVmZGYwIi0iXHVmZGZjIiwgICJcdWZlMDAiLSJcdWZlMGYiLCAgIlx1ZmUyMCItIlx1ZmUyNiIsICAiXHVmZTMzIi0iXHVmZTM0IiwgIAorICAgICAgICAgIlx1ZmU0ZCItIlx1ZmU0ZiIsICAiXHVmZTY5IiwgICJcdWZlNzAiLSJcdWZlNzQiLCAgIlx1ZmU3NiItIlx1ZmVmYyIsICAiXHVmZWZmIiwgICJcdWZmMDQiLCAgIlx1ZmYxMCItIlx1ZmYxOSIsICAKKyAgICAgICAgICJcdWZmMjEiLSJcdWZmM2EiLCAgIlx1ZmYzZiIsICAiXHVmZjQxIi0iXHVmZjVhIiwgICJcdWZmNjYiLSJcdWZmYmUiLCAgIlx1ZmZjMiItIlx1ZmZjNyIsICAiXHVmZmNhIi0iXHVmZmNmIiwgIAorICAgICAgICAgIlx1ZmZkMiItIlx1ZmZkNyIsICAiXHVmZmRhIi0iXHVmZmRjIiwgICJcdWZmZTAiLSJcdWZmZTEiLCAgIlx1ZmZlNSItIlx1ZmZlNiIsICAiXHVmZmY5Ii0iXHVmZmZiIiBdCisgICAgICAgIHwgPFVOSUNPREVfRVNDQVBFPgorICA+Cit9CisKKy8qIFNFUEFSQVRPUlMgKi8KKworVE9LRU4gOgoreworICA8IExQQVJFTjogIigiID4KK3wgPCBSUEFSRU46ICIpIiA+Cit8IDwgTEJSQUNFOiAieyIgPgorfCA8IFJCUkFDRTogIn0iID4KK3wgPCBMQlJBQ0tFVDogIlsiID4KK3wgPCBSQlJBQ0tFVDogIl0iID4KK3wgPCBTRU1JQ09MT046ICI7IiA+Cit8IDwgQ09NTUE6ICIsIiA+Cit8IDwgRE9UOiAiLiIgPgorfCA8IEFUOiAiQCIgPgorfQorCisvKiBPUEVSQVRPUlMgKi8KKworVE9LRU4gOgoreworICA8IEFTU0lHTjogIj0iID4KK3wgPCBMVDogIjwiID4KK3wgPCBCQU5HOiAiISIgPgorfCA8IFRJTERFOiAifiIgPgorfCA8IEhPT0s6ICI/IiA+Cit8IDwgQ09MT046ICI6IiA+Cit8IDwgRVE6ICI9PSIgPgorfCA8IExFOiAiPD0iID4KK3wgPCBHRTogIj49IiA+Cit8IDwgTkU6ICIhPSIgPgorfCA8IFNDX09SOiAifHwiID4KK3wgPCBTQ19BTkQ6ICImJiIgPgorfCA8IElOQ1I6ICIrKyIgPgorfCA8IERFQ1I6ICItLSIgPgorfCA8IFBMVVM6ICIrIiA+Cit8IDwgTUlOVVM6ICItIiA+Cit8IDwgU1RBUjogIioiID4KK3wgPCBTTEFTSDogIi8iID4KK3wgPCBCSVRfQU5EOiAiJiIgPgorfCA8IEJJVF9PUjogInwiID4KK3wgPCBYT1I6ICJeIiA+Cit8IDwgUkVNOiAiJSIgPgorfCA8IExTSElGVDogIjw8IiA+Cit8IDwgUExVU0FTU0lHTjogIis9IiA+Cit8IDwgTUlOVVNBU1NJR046ICItPSIgPgorfCA8IFNUQVJBU1NJR046ICIqPSIgPgorfCA8IFNMQVNIQVNTSUdOOiAiLz0iID4KK3wgPCBBTkRBU1NJR046ICImPSIgPgorfCA8IE9SQVNTSUdOOiAifD0iID4KK3wgPCBYT1JBU1NJR046ICJePSIgPgorfCA8IFJFTUFTU0lHTjogIiU9IiA+Cit8IDwgTFNISUZUQVNTSUdOOiAiPDw9IiA+Cit8IDwgUlNJR05FRFNISUZUQVNTSUdOOiAiPj49IiA+Cit8IDwgUlVOU0lHTkVEU0hJRlRBU1NJR046ICI+Pj49IiA+Cit8IDwgRUxMSVBTSVM6ICIuLi4iID4KK3wgPCBBUlJPVzogIi0+IiA+Cit8IDwgRE9VQkxFQ09MT046ICI6OiIgPgorfQorCisvKiA+J3MgbmVlZCBzcGVjaWFsIGF0dGVudGlvbiBkdWUgdG8gZ2VuZXJpY3Mgc3ludGF4LiAqLworVE9LRU4gOgoreworICA8IFJVTlNJR05FRFNISUZUOiAiPj4+IiA+CisgIHsKKyAgICAgbWF0Y2hlZFRva2VuLmtpbmQgPSBHVDsKKyAgICAgbWF0Y2hlZFRva2VuLnJlYWxLaW5kID0gUlVOU0lHTkVEU0hJRlQ7CisgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMik7CisgIH0KK3wgPCBSU0lHTkVEU0hJRlQ6ICI+PiIgPgorICB7CisgICAgIG1hdGNoZWRUb2tlbi5raW5kID0gR1Q7CisgICAgIG1hdGNoZWRUb2tlbi5yZWFsS2luZCA9IFJTSUdORURTSElGVDsKKyAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKKyAgfQorfCA8IEdUOiAiPiIgPgorfQorCitUT0tFTjogeyA8Q1RSTF9aOiAiXHUwMDFBIiAvKiogY3RybCt6IGNoYXIgKiovPiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVEhFIEpBVkEgTEFOR1VBR0UgR1JBTU1BUiBTVEFSVFMgSEVSRSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQcm9ncmFtIHN0cnVjdHVyaW5nIHN5bnRheCBmb2xsb3dzLgorICovCisKK0NvbXBpbGF0aW9uVW5pdCBDb21waWxhdGlvblVuaXQoKToKK3sKKwlQYWNrYWdlRGVjbGFyYXRpb24gcGFrYWdlID0gbnVsbDsKKwlOb2RlTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IGVtcHR5TGlzdCgpOworCUltcG9ydERlY2xhcmF0aW9uIGluID0gbnVsbDsKKwlOb2RlTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzID0gZW1wdHlMaXN0KCk7CisgICBNb2RpZmllckhvbGRlciBtb2RpZmllcjsKKwlUeXBlRGVjbGFyYXRpb24gdG4gPSBudWxsOworCU1vZHVsZURlY2xhcmF0aW9uIG1vZHVsZSA9IG51bGw7Cit9Cit7CisgICAgdHJ5IHsKKyAgICAgICAgKCBMT09LQUhFQUQoMikiOyIgKSoKKyAgICAgICAgWyBMT09LQUhFQUQoUGFja2FnZURlY2xhcmF0aW9uKCkpIHBha2FnZSA9IFBhY2thZ2VEZWNsYXJhdGlvbigpIF0KKyAgICAgICAgKAorICAgICAgICAgICAgaW4gPSBJbXBvcnREZWNsYXJhdGlvbigpIHsgaW1wb3J0cyA9IGFkZChpbXBvcnRzLCBpbik7IH0gCisgICAgICAgIHwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICBtb2RpZmllciA9IE1vZGlmaWVycygpCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICB0biA9IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihtb2RpZmllcikgeyB0eXBlcyA9IGFkZCh0eXBlcywgdG4pOyB9CisgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICB0biA9IEVudW1EZWNsYXJhdGlvbihtb2RpZmllcikgeyB0eXBlcyA9IGFkZCh0eXBlcywgdG4pOyB9CisgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICB0biA9IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24obW9kaWZpZXIpIHsgdHlwZXMgPSBhZGQodHlwZXMsIHRuKTsgfQorICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gTW9kdWxlRGVjbGFyYXRpb24obW9kaWZpZXIpCisgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAiOyIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICkqCisgICAgICAgICg8RU9GPiB8IDxDVFJMX1o+KQorICAgICAgICB7IHJldHVybiBuZXcgQ29tcGlsYXRpb25Vbml0KHJhbmdlKHRva2VuX3NvdXJjZS5nZXRIb21lVG9rZW4oKSwgdG9rZW4oKSksIHBha2FnZSwgaW1wb3J0cywgdHlwZXMsIG1vZHVsZSk7IH0KKyAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJlY292ZXIoRU9GLCBlKTsKKyAgICAgICAgZmluYWwgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQocmFuZ2UodG9rZW5fc291cmNlLmdldEhvbWVUb2tlbigpLCB0b2tlbigpKSwgbnVsbCwgbmV3IE5vZGVMaXN0PEltcG9ydERlY2xhcmF0aW9uPigpLCBuZXcgTm9kZUxpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PigpLCBudWxsKTsKKyAgICAgICAgY29tcGlsYXRpb25Vbml0LnNldFBhcnNlZChVTlBBUlNBQkxFKTsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGF0aW9uVW5pdDsKKyAgICB9Cit9CisKK1BhY2thZ2VEZWNsYXJhdGlvbiBQYWNrYWdlRGVjbGFyYXRpb24oKToKK3sKKwlOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuZXcgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+KCk7CisJTmFtZSBuYW1lOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpIAorICAicGFja2FnZSIge2JlZ2luID0gdG9rZW4oKTt9ICBuYW1lID0gTmFtZSgpICI7IgorICB7IHJldHVybiBuZXcgUGFja2FnZURlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgYW5ub3RhdGlvbnMsIG5hbWUpOyB9Cit9CisKKworSW1wb3J0RGVjbGFyYXRpb24gSW1wb3J0RGVjbGFyYXRpb24oKToKK3sKKyAgICBOYW1lIG5hbWU7CisgICAgYm9vbGVhbiBpc1N0YXRpYyA9IGZhbHNlOworICAgIGJvb2xlYW4gaXNBc3RlcmlzayA9IGZhbHNlOworICAgIEphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgICAiaW1wb3J0IiB7YmVnaW4gPSB0b2tlbigpO30gCisgICAgWyAic3RhdGljIiB7IGlzU3RhdGljID0gdHJ1ZTsgfSBdIAorICAgIG5hbWUgPSBOYW1lKCkgCisgICAgWyAiLiIgIioiIHsgaXNBc3RlcmlzayA9IHRydWU7IH0gXSAiOyIKKyAgICB7IHJldHVybiBuZXcgSW1wb3J0RGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBuYW1lLCBpc1N0YXRpYywgaXNBc3Rlcmlzayk7IH0KK30KKworLyoKKyAqIE1vZGlmaWVycy4gV2UgbWF0Y2ggYWxsIG1vZGlmaWVycyBpbiBhIHNpbmdsZSBydWxlIHRvIHJlZHVjZSB0aGUgY2hhbmNlcyBvZgorICogc3ludGF4IGVycm9ycyBmb3Igc2ltcGxlIG1vZGlmaWVyIG1pc3Rha2VzLiBJdCB3aWxsIGFsc28gZW5hYmxlIHVzIHRvIGdpdmUKKyAqIGJldHRlciBlcnJvciBtZXNzYWdlcy4KKyAqLworCitNb2RpZmllckhvbGRlciBNb2RpZmllcnMoKToKK3sKKwlKYXZhVG9rZW4gYmVnaW4gPSBJTlZBTElEOworICAgIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKTsKKwlOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuZXcgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+KCk7CisgICAgQW5ub3RhdGlvbkV4cHIgYW5uOworfQoreworICgKKyAgTE9PS0FIRUFEKDIpCisgICgKKyAgICJwdWJsaWMiIHsgYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5QVUJMSUMpOyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICB8CisgICAic3RhdGljIiB7IGFkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXIuU1RBVElDKTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0KKyAgfAorICAgInByb3RlY3RlZCIgeyAgYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5QUk9URUNURUQpOyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICB8CisgICAicHJpdmF0ZSIgeyBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLlBSSVZBVEUpOyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICB8CisgICAiZmluYWwiIHsgYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5GSU5BTCk7IGJlZ2luID0gb3JJZkludmFsaWQoYmVnaW4sIHRva2VuKCkpOyB9CisgIHwKKyAgICJhYnN0cmFjdCIgeyBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLkFCU1RSQUNUKTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0KKyAgfAorICAgInN5bmNocm9uaXplZCIgeyBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLlNZTkNIUk9OSVpFRCk7IGJlZ2luID0gb3JJZkludmFsaWQoYmVnaW4sIHRva2VuKCkpOyB9CisgIHwKKyAgICJuYXRpdmUiIHsgYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5OQVRJVkUpOyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICB8CisgICAidHJhbnNpZW50IiB7IGFkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXIuVFJBTlNJRU5UKTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0KKyAgfAorICAgInZvbGF0aWxlIiB7IGFkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXIuVk9MQVRJTEUpOyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICB8CisgICAic3RyaWN0ZnAiIHsgYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5TVFJJQ1RGUCk7ICBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICB8CisgICAidHJhbnNpdGl2ZSIgeyBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLlRSQU5TSVRJVkUpOyAgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0KKyAgfAorICAgImRlZmF1bHQiIHsgYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5ERUZBVUxUKTsgIGJlZ2luID0gb3JJZkludmFsaWQoYmVnaW4sIHRva2VuKCkpOyB9CisgIHwKKyAgIGFubiA9IEFubm90YXRpb24oKSB7IGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCBhbm4pOyB9CisgICkKKyApKgorCisgeworICAgIHJldHVybiBuZXcgTW9kaWZpZXJIb2xkZXIoYmVnaW4sIG1vZGlmaWVycywgYW5ub3RhdGlvbnMpOworIH0KK30KKworLyoKKyAqIERlY2xhcmF0aW9uIHN5bnRheCBmb2xsb3dzLgorICovCisKK0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXIpOgoreworICAgIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBmYWxzZTsKKyAgICBTaW1wbGVOYW1lIG5hbWU7CisgICAgUmFuZ2VkTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyID0gbmV3IFJhbmdlZExpc3Q8VHlwZVBhcmFtZXRlcj4oZW1wdHlMaXN0KCkpOworICAgIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRMaXN0ID0gZW1wdHlMaXN0KCk7CisgICAgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcExpc3QgPSBlbXB0eUxpc3QoKTsKKyAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBlbXB0eUxpc3QoKTsKKyAgICBKYXZhVG9rZW4gYmVnaW4gPSBtb2RpZmllci5iZWdpbjsKK30KK3sKKyAgKCAiY2xhc3MiIHwgImludGVyZmFjZSIgeyBpc0ludGVyZmFjZSA9IHRydWU7IH0gKSB7IGJlZ2luID0gb3JJZkludmFsaWQoYmVnaW4sIHRva2VuKCkpOyB9CisgIG5hbWUgPSBTaW1wbGVOYW1lKCkKKyAgWyB0eXBlUGFyID0gVHlwZVBhcmFtZXRlcnMoKSBdCisgIFsgZXh0TGlzdCA9IEV4dGVuZHNMaXN0KCkgXQorICBbIGltcExpc3QgPSBJbXBsZW1lbnRzTGlzdCgpIF0KKyAgbWVtYmVycyA9IENsYXNzT3JJbnRlcmZhY2VCb2R5KCkKKworCXsgcmV0dXJuIG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCBpc0ludGVyZmFjZSwgbmFtZSwgdHlwZVBhci5saXN0LCBleHRMaXN0LCBpbXBMaXN0LCBtZW1iZXJzKTsgfQorfQorCitOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gRXh0ZW5kc0xpc3QoKToKK3sKKyAgIGJvb2xlYW4gZXh0ZW5kc01vcmVUaGFuT25lID0gZmFsc2U7CisgICBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gcmV0ID0gbmV3IE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPigpOworICAgQ2xhc3NPckludGVyZmFjZVR5cGUgY2l0OworfQoreworICAgImV4dGVuZHMiIGNpdCA9IEFubm90YXRlZENsYXNzT3JJbnRlcmZhY2VUeXBlKCkgeyByZXQuYWRkKGNpdCk7IH0KKyAgICggIiwiIGNpdCA9IEFubm90YXRlZENsYXNzT3JJbnRlcmZhY2VUeXBlKCkgeyByZXQuYWRkKGNpdCk7IGV4dGVuZHNNb3JlVGhhbk9uZSA9IHRydWU7IH0gKSoKKyAgIHsgcmV0dXJuIHJldDsgfQorfQorCitOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gSW1wbGVtZW50c0xpc3QoKToKK3sKKyAgIE5vZGVMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiByZXQgPSBuZXcgTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+KCk7CisgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBjaXQ7Cit9Cit7CisgICAiaW1wbGVtZW50cyIgY2l0ID0gQW5ub3RhdGVkQ2xhc3NPckludGVyZmFjZVR5cGUoKSB7IHJldC5hZGQoY2l0KTsgfQorICAgKCAiLCIgY2l0ID0gQW5ub3RhdGVkQ2xhc3NPckludGVyZmFjZVR5cGUoKSB7IHJldC5hZGQoY2l0KTsgfSApKgorICAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0VudW1EZWNsYXJhdGlvbiBFbnVtRGVjbGFyYXRpb24oTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXIpOgoreworCVNpbXBsZU5hbWUgbmFtZTsKKyAgICBOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wTGlzdCA9IGVtcHR5TGlzdCgpOworCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudHJ5OworCU5vZGVMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnRyaWVzID0gZW1wdHlMaXN0KCk7CisJQm9keURlY2xhcmF0aW9uPD8+IG1lbWJlcjsKKyAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBlbXB0eUxpc3QoKTsKKwlKYXZhVG9rZW4gYmVnaW4gPSBtb2RpZmllci5iZWdpbjsKK30KK3sKKyAgICAiZW51bSIgeyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICAgIG5hbWUgPSBTaW1wbGVOYW1lKCkKKyAgICBbIGltcExpc3QgPSBJbXBsZW1lbnRzTGlzdCgpIF0KKyAgICAieyIKKyAgICBbCisgICAgICAgIGVudHJ5ID0gRW51bUNvbnN0YW50RGVjbGFyYXRpb24oKSB7IGVudHJpZXMuYWRkKGVudHJ5KTsgfSAoIExPT0tBSEVBRCgyKSAiLCIgZW50cnkgPSBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpIHsgZW50cmllcy5hZGQoZW50cnkpOyB9ICkqCisgICAgXQorICAgIFsgIiwiIF0KKyAgICBbCisgICAgICAgICI7IiAoCisgICAgICAgICAgICBtZW1iZXIgPSBDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKCkgeyBtZW1iZXJzID0gYWRkKG1lbWJlcnMsIG1lbWJlcik7IH0gCisgICAgICAgIHwKKyAgICAgICAgICAgICI7IgorICAgICAgICApKgorICAgIF0KKyAgICAifSIKKyAgICAKKyAgICB7IHJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgbmFtZSwgaW1wTGlzdCwgZW50cmllcywgbWVtYmVycyk7IH0KK30KKworCitFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpOgoreworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4oKTsKKwlBbm5vdGF0aW9uRXhwciBhbm47CisJU2ltcGxlTmFtZSBuYW1lOworCU5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBlbXB0eUxpc3QoKTsKKwlOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGNsYXNzQm9keSA9IGVtcHR5TGlzdCgpOworCUphdmFUb2tlbiBiZWdpbiA9IElOVkFMSUQ7Cit9Cit7CisgIHsgIH0KKyAgKCBhbm4gPSBBbm5vdGF0aW9uKCkgeyBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgYW5uKTsgfSApKgorICBuYW1lID0gU2ltcGxlTmFtZSgpIHsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0gCisgIFsgYXJncyA9IEFyZ3VtZW50cygpIF0gWyBjbGFzc0JvZHkgPSBDbGFzc09ySW50ZXJmYWNlQm9keSgpIF0KKyAgeyAKKyAgICAgIHJldHVybiBuZXcgRW51bUNvbnN0YW50RGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBhbm5vdGF0aW9ucywgbmFtZSwgYXJncywgY2xhc3NCb2R5KTsgIAorICB9Cit9CisKKy8qKgorICogSWYgdGhlIGxpc3QgaW5zaWRlIHRoZSByZXR1cm5lZCBSYW5nZWRMaXN0IGlzIG51bGwsIHRoZXJlIGFyZSBubyBicmFja2V0cy4KKyAqIElmIGl0IGlzIGVtcHR5LCB0aGVyZSBhcmUgYnJhY2tldHMsIGJ1dCBub3RoaW5nIGlzIGluIHRoZW0gPD4uCisgKiBUaGUgbm9ybWFsIGNhc2UgaXMgdGhhdCBpdCBjb250YWlucyBUeXBlUGFyYW1ldGVycywgbGlrZSA8QSwgQiwgQz4uCisgKi8KK1JhbmdlZExpc3Q8VHlwZVBhcmFtZXRlcj4gVHlwZVBhcmFtZXRlcnMoKToKK3sKKwlSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+IHJldCA9IG5ldyBSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+KG5ldyBOb2RlTGlzdDxUeXBlUGFyYW1ldGVyPigpKTsKKwlUeXBlUGFyYW1ldGVyIHRwOworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKK30KK3sKKyAgICI8IiB7IHJldC5iZWdpbkF0KHRva2VuKCkpOyB9CisgICBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgCisgICB0cCA9IFR5cGVQYXJhbWV0ZXIoYW5ub3RhdGlvbnMpIHsgcmV0LmFkZCh0cCk7IGFubm90YXRpb25zID0gbnVsbDsgfQorICAgKCAiLCIgCisgICBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgdHAgPSBUeXBlUGFyYW1ldGVyKGFubm90YXRpb25zKSB7IHJldC5hZGQodHApOyBhbm5vdGF0aW9ucyA9IG51bGw7IH0gKSoKKyAgICI+IiB7IHJldC5lbmRBdCh0b2tlbigpKTsgfQorICAgeyByZXR1cm4gcmV0OyB9Cit9CisKK1R5cGVQYXJhbWV0ZXIgVHlwZVBhcmFtZXRlcihOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpOgoreworCVNpbXBsZU5hbWUgbmFtZTsKKwlOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdHlwZUJvdW5kICA9IGVtcHR5TGlzdCgpOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgIG5hbWUgPSBTaW1wbGVOYW1lKCkgeyBiZWdpbj10b2tlbigpOyB9IFsgdHlwZUJvdW5kID0gVHlwZUJvdW5kKCkgXQorICAgeyByZXR1cm4gbmV3IFR5cGVQYXJhbWV0ZXIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBuYW1lLCB0eXBlQm91bmQsIGFubm90YXRpb25zKTsgfQorfQorCitOb2RlTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gVHlwZUJvdW5kKCk6Cit7CisJTm9kZUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHJldCA9IGVtcHR5TGlzdCgpOworCUNsYXNzT3JJbnRlcmZhY2VUeXBlIGNpdDsKK30KK3sKKyAgICJleHRlbmRzIiBjaXQgPSBBbm5vdGF0ZWRDbGFzc09ySW50ZXJmYWNlVHlwZSgpIHsgcmV0LmFkZChjaXQpOyB9CisgICAoICImIiAgIGNpdCA9IEFubm90YXRlZENsYXNzT3JJbnRlcmZhY2VUeXBlKCkgeyByZXQuYWRkKGNpdCk7IH0gKSoKKyAgIHsgcmV0dXJuIHJldDsgfQorfQorCitOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IENsYXNzT3JJbnRlcmZhY2VCb2R5KCk6Cit7CisJTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiByZXQgPSBlbXB0eUxpc3QoKTsKKwlCb2R5RGVjbGFyYXRpb24gbWVtYmVyOworfQoreworICAgICJ7IiAoCisgICAgICAgIG1lbWJlciA9IENsYXNzT3JJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24oKSB7IHJldC5hZGQobWVtYmVyKTsgfQorICAgIHwKKyAgICAgICAgIjsiCisgICAgKSogIn0iCisgICAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0JvZHlEZWNsYXJhdGlvbjw/PiBDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKCk6Cit7CisgICBNb2RpZmllckhvbGRlciBtb2RpZmllcjsKKyAgIEJvZHlEZWNsYXJhdGlvbjw/PiByZXQ7Cit9Cit7CisgICgKKwkgIExPT0tBSEVBRCgyKQorCSAgcmV0ID0gSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbigpCisJfAorICAgICAgLy8gSnVzdCBnZXQgYWxsIHRoZSBtb2RpZmllcnMgb3V0IG9mIHRoZSB3YXkuIElmIHlvdSB3YW50IHRvIGRvCisgICAgICAvLyBtb3JlIGNoZWNrcywgcGFzcyB0aGUgbW9kaWZpZXJzIGRvd24gdG8gdGhlIG1lbWJlcgorCSAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKQorCSAgKAorCSAgICAgIHJldCA9IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihtb2RpZmllcikKKwkgICAgfCBMT09LQUhFQUQoImVudW0iKQorCSAgICAgIHJldCA9IEVudW1EZWNsYXJhdGlvbihtb2RpZmllcikKKwkgICAgfCBMT09LQUhFQUQoIkAiICJpbnRlcmZhY2UiKQorCSAgICAgIHJldCA9IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24obW9kaWZpZXIpCisJICAgIHwgTE9PS0FIRUFEKCBbIFR5cGVQYXJhbWV0ZXJzKCkgXSBJZGVudGlmaWVyKCkgIigiICkKKwkgICAgICByZXQgPSBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1vZGlmaWVyKQorCSAgICB8IExPT0tBSEVBRCggVHlwZSgpIElkZW50aWZpZXIoKSAoIEFycmF5QnJhY2tldFBhaXIoKSApKiAoICIsIiB8ICI9IiB8ICI7IiApICkKKwkgICAgICByZXQgPSBGaWVsZERlY2xhcmF0aW9uKG1vZGlmaWVyKQorCSAgICB8CisJICAgICAgcmV0ID0gTWV0aG9kRGVjbGFyYXRpb24obW9kaWZpZXIpCisJICApCisgICkKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0ZpZWxkRGVjbGFyYXRpb24gRmllbGREZWNsYXJhdGlvbihNb2RpZmllckhvbGRlciBtb2RpZmllcik6Cit7CisJVHlwZSBwYXJ0aWFsVHlwZTsKKwlOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IG5ldyBOb2RlTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCk7CisJVmFyaWFibGVEZWNsYXJhdG9yIHZhbDsKK30KK3sKKyAgICAvLyBNb2RpZmllcnMgYXJlIGFscmVhZHkgbWF0Y2hlZCBpbiB0aGUgY2FsbGVyCisgICAgcGFydGlhbFR5cGUgPSBUeXBlKGVtcHR5TGlzdCgpKSB2YWwgPSBWYXJpYWJsZURlY2xhcmF0b3IocGFydGlhbFR5cGUpIHsgdmFyaWFibGVzLmFkZCh2YWwpOyB9CisgICAgICAgICggIiwiIHZhbCA9IFZhcmlhYmxlRGVjbGFyYXRvcihwYXJ0aWFsVHlwZSkgeyB2YXJpYWJsZXMuYWRkKHZhbCk7IH0gKSogIjsiCisgICAgeworICAgICAgICBKYXZhVG9rZW4gYmVnaW4gPSBvcklmSW52YWxpZChtb2RpZmllci5iZWdpbiwgcGFydGlhbFR5cGUpOworICAgICAgICByZXR1cm4gbmV3IEZpZWxkRGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCB2YXJpYWJsZXMpOworICAgIH0KK30KKworVmFyaWFibGVEZWNsYXJhdG9yIFZhcmlhYmxlRGVjbGFyYXRvcihUeXBlIHBhcnRpYWxUeXBlKToKK3sKKwlQYWlyPFNpbXBsZU5hbWUsIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4+IGlkOworCUV4cHJlc3Npb24gaW5pdCA9IG51bGw7Cit9Cit7CisgICAgaWQgPSBWYXJpYWJsZURlY2xhcmF0b3JJZCgpIFsgIj0iIGluaXQgPSBWYXJpYWJsZUluaXRpYWxpemVyKCkgXQorICAgIHsgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0b3IocmFuZ2UoaWQuYSwgdG9rZW4oKSksIGp1Z2dsZUFycmF5VHlwZShwYXJ0aWFsVHlwZSwgaWQuYiksIGlkLmEsIGluaXQpOyB9Cit9CisKK1BhaXI8U2ltcGxlTmFtZSwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPj4gVmFyaWFibGVEZWNsYXJhdG9ySWQoKToKK3sKKwlTaW1wbGVOYW1lIG5hbWU7CisJSmF2YVRva2VuIGJlZ2luOworCUFycmF5QnJhY2tldFBhaXIgYXJyYXlCcmFja2V0UGFpcjsKKwlMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzID0gbmV3IEFycmF5TGlzdCgwKTsKK30KK3sKKyAgICBuYW1lID0gU2ltcGxlTmFtZSgpIHsgYmVnaW49dG9rZW4oKTt9ICAoIGFycmF5QnJhY2tldFBhaXIgPSBBcnJheUJyYWNrZXRQYWlyKE9yaWdpbi5OQU1FKSB7IGFycmF5QnJhY2tldFBhaXJzPWFkZChhcnJheUJyYWNrZXRQYWlycywgYXJyYXlCcmFja2V0UGFpcik7IH0gKSoKKyAgICB7CisgICAgICAgIGlmKHN0b3JlVG9rZW5zKSB7CisgICAgICAgICAgICBuYW1lLnNldFRva2VuUmFuZ2UobmFtZS5nZXRUb2tlblJhbmdlKCkuZ2V0KCkud2l0aEVuZCh0b2tlbigpKSk7CisgICAgICAgIH0gICAgCisgICAgICAgIHJldHVybiBuZXcgUGFpcihuYW1lLCBhcnJheUJyYWNrZXRQYWlycyk7CisgICAgfQorfQorCitFeHByZXNzaW9uIFZhcmlhYmxlSW5pdGlhbGl6ZXIoKToKK3sKKwlFeHByZXNzaW9uIHJldDsKK30KK3sKKyAgKAorCSAgcmV0ID0gQXJyYXlJbml0aWFsaXplcigpCisJfAorCSAgcmV0ID0gRXhwcmVzc2lvbigpCisgICkKKyAgeyByZXR1cm4gcmV0O30KK30KKworQXJyYXlJbml0aWFsaXplckV4cHIgQXJyYXlJbml0aWFsaXplcigpOgoreworCU5vZGVMaXN0PEV4cHJlc3Npb24+IHZhbHVlcyA9IGVtcHR5TGlzdCgpOworCUV4cHJlc3Npb24gdmFsOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgInsiIHtiZWdpbj10b2tlbigpO30gWyB2YWwgPSBWYXJpYWJsZUluaXRpYWxpemVyKCkgeyB2YWx1ZXMgPSBhZGQodmFsdWVzLCB2YWwpOyB9ICggTE9PS0FIRUFEKDIpICIsIiB2YWwgPSBWYXJpYWJsZUluaXRpYWxpemVyKCkgeyB2YWx1ZXMgPSBhZGQodmFsdWVzLCB2YWwpOyB9ICkqIF0gWyAiLCIgXSAifSIKKyAgeyByZXR1cm4gbmV3IEFycmF5SW5pdGlhbGl6ZXJFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgdmFsdWVzKTsgfQorfQorCitNZXRob2REZWNsYXJhdGlvbiBNZXRob2REZWNsYXJhdGlvbihNb2RpZmllckhvbGRlciBtb2RpZmllcik6Cit7CisJUmFuZ2VkTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG5ldyBSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+KGVtcHR5TGlzdCgpKTsKKwlUeXBlIHR5cGU7CisJU2ltcGxlTmFtZSBuYW1lOworCVBhaXI8Tm9kZUxpc3Q8UGFyYW1ldGVyPiwgUmVjZWl2ZXJQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgUGFpcjxOb2RlTGlzdDxQYXJhbWV0ZXI+LCBSZWNlaXZlclBhcmFtZXRlcj4oZW1wdHlMaXN0KCksIG51bGwpOworCUFycmF5QnJhY2tldFBhaXIgYXJyYXlCcmFja2V0UGFpcjsKKwlMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzID0gbmV3IEFycmF5TGlzdCgwKTsKKwlOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd3NfID0gZW1wdHlMaXN0KCk7CisJQmxvY2tTdG10IGJvZHkgPSBudWxsOworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKwlKYXZhVG9rZW4gYmVnaW4gPSBtb2RpZmllci5iZWdpbjsKKwlSZWZlcmVuY2VUeXBlIHRocm93VHlwZTsKK30KK3sKKyAgICAvLyBNb2RpZmllcnMgYWxyZWFkeSBtYXRjaGVkIGluIHRoZSBjYWxsZXIhCisgICAgWyB0eXBlUGFyYW1ldGVycyA9IFR5cGVQYXJhbWV0ZXJzKCkgeyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0eXBlUGFyYW1ldGVycy5yYW5nZS5nZXRCZWdpbigpKTsgfSBdCisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpIHsgbW9kaWZpZXIuYW5ub3RhdGlvbnMuYWRkQWxsKGFubm90YXRpb25zKTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgbm9kZUxpc3RCZWdpbihhbm5vdGF0aW9ucykpOyB9CisgICAgdHlwZSA9IFJlc3VsdFR5cGUoZW1wdHlMaXN0KCkpIHsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdHlwZSk7IH0KKyAgICBuYW1lID0gU2ltcGxlTmFtZSgpIHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzKCkgKCBhcnJheUJyYWNrZXRQYWlyID0gQXJyYXlCcmFja2V0UGFpcihPcmlnaW4uTkFNRSkgeyBhcnJheUJyYWNrZXRQYWlycz1hZGQoYXJyYXlCcmFja2V0UGFpcnMsIGFycmF5QnJhY2tldFBhaXIpOyB9ICkqCisgICAgWyAidGhyb3dzIiB0aHJvd1R5cGUgPSBBbm5vdGF0ZWRSZWZlcmVuY2VUeXBlKCkgeyB0aHJvd3NfID0gYWRkKHRocm93c18sIHRocm93VHlwZSk7IH0KKyAgICAgICgiLCIgdGhyb3dUeXBlID0gQW5ub3RhdGVkUmVmZXJlbmNlVHlwZSgpIHsgdGhyb3dzXyA9IGFkZCh0aHJvd3NfLCB0aHJvd1R5cGUpOyB9ICkqIF0KKyAgICAoIGJvZHkgPSBCbG9jaygpIHwgIjsiICkKKyAgICB7IAorICAgICAgICB0eXBlID0ganVnZ2xlQXJyYXlUeXBlKHR5cGUsIGFycmF5QnJhY2tldFBhaXJzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2REZWNsYXJhdGlvbihyYW5nZShiZWdpbiwgdG9rZW4oKSksIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLmxpc3QsIHR5cGUsIG5hbWUsIHBhcmFtZXRlcnMuYSwgdGhyb3dzXywgYm9keSwgcGFyYW1ldGVycy5iKTsKKyAgICB9Cit9CisKK1JlZmVyZW5jZVR5cGUgQW5ub3RhdGVkUmVmZXJlbmNlVHlwZSgpOgoreworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKwlSZWZlcmVuY2VUeXBlIHR5cGU7Cit9Cit7CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpIAorICAgIHR5cGUgPSBSZWZlcmVuY2VUeXBlKGFubm90YXRpb25zKQorICAgIHsgcmV0dXJuIHR5cGU7IH0KK30KKworVHlwZSBBbm5vdGF0ZWRUeXBlKCk6Cit7CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCVR5cGUgdHlwZTsKK30KK3sKKyAgICBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgCisgICAgdHlwZSA9IFR5cGUoYW5ub3RhdGlvbnMpCisgICAgeyByZXR1cm4gdHlwZTsgfQorfQorCitQYWlyPE5vZGVMaXN0PFBhcmFtZXRlcj4sIFJlY2VpdmVyUGFyYW1ldGVyPiBQYXJhbWV0ZXJzKCk6Cit7CisJTm9kZUxpc3Q8UGFyYW1ldGVyPiByZXQgPSBlbXB0eUxpc3QoKTsKKwlQYXJhbWV0ZXIgcGFyOworCVJlY2VpdmVyUGFyYW1ldGVyIHJwID0gbnVsbDsKK30KK3sKKyAgICAiKCIKKyAgICBbIAorICAgICAgICAoIExPT0tBSEVBRChSZWNlaXZlclBhcmFtZXRlcigpKQorICAgICAgICAgICAgcnAgPSBSZWNlaXZlclBhcmFtZXRlcigpCisgICAgICAgICAgICB8CisgICAgICAgICAgICBwYXIgPSBQYXJhbWV0ZXIoKSB7IHJldCA9IGFkZChyZXQsIHBhcik7IH0KKyAgICAgICAgKSAKKyAgICAgICAgKCAiLCIgcGFyID0gUGFyYW1ldGVyKCkgeyByZXQgPSBhZGQocmV0LCBwYXIpOyB9ICkqIAorICAgIF0KKyAgICAiKSIKKyAgICB7IHJldHVybiBuZXcgUGFpcihyZXQsIHJwKTsgfQorfQorCitOb2RlTGlzdDxQYXJhbWV0ZXI+IExhbWJkYVBhcmFtZXRlcnMoKToKK3sKKyAgTm9kZUxpc3Q8UGFyYW1ldGVyPiByZXQgPSBudWxsOworICBQYXJhbWV0ZXIgcGFyOworfQoreworICAgIHBhciA9IFBhcmFtZXRlcigpIHsgcmV0ID0gYWRkKHJldCwgcGFyKTsgfSAoICIsIiBwYXIgPSBQYXJhbWV0ZXIoKSB7IHJldCA9IGFkZChyZXQsIHBhcik7IH0gKSoKKyAgICB7IHJldHVybiByZXQ7ICB9Cit9CisKK05vZGVMaXN0PFBhcmFtZXRlcj4gSW5mZXJyZWRMYW1iZGFQYXJhbWV0ZXJzKCk6Cit7CisgICAgTm9kZUxpc3Q8UGFyYW1ldGVyPiByZXQgPSBudWxsOworICAgIFBhaXI8U2ltcGxlTmFtZSwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPj4gaWQ7Cit9Cit7CisgICAgaWQgPSBWYXJpYWJsZURlY2xhcmF0b3JJZCgpIAl7IHJldCA9IGFkZChyZXQsIG5ldyBQYXJhbWV0ZXIocmFuZ2UoaWQuYSwgaWQuYSksIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgZW1wdHlMaXN0KCksIG5ldyBVbmtub3duVHlwZSgpLCBmYWxzZSwgZW1wdHlMaXN0KCksIGlkLmEpKTt9CisgICAgKAorICAgICAgICAiLCIgaWQgPSBWYXJpYWJsZURlY2xhcmF0b3JJZCgpICB7IHJldCA9IGFkZChyZXQsIG5ldyBQYXJhbWV0ZXIocmFuZ2UoaWQuYSwgaWQuYSksIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgZW1wdHlMaXN0KCksIG5ldyBVbmtub3duVHlwZSgpLCBmYWxzZSwgZW1wdHlMaXN0KCksIGlkLmEpKTsgfQorICAgICkqCisgICAgeyByZXR1cm4gcmV0OyAgfQorfQorCitQYXJhbWV0ZXIgUGFyYW1ldGVyKCk6Cit7CisJTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXI7CisJVHlwZSBwYXJ0aWFsVHlwZTsKKwlib29sZWFuIGlzVmFyQXJnID0gZmFsc2U7CisJUGFpcjxTaW1wbGVOYW1lLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+PiBpZDsKKwlOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gdmFyQXJnQW5ub3RhdGlvbnMgPSBlbXB0eUxpc3QoKTsKK30KK3sKKyAgICBtb2RpZmllciA9IE1vZGlmaWVycygpIHBhcnRpYWxUeXBlID0gVHlwZShlbXB0eUxpc3QoKSkgWyB2YXJBcmdBbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgIi4uLiIgeyBpc1ZhckFyZyA9IHRydWU7fSBdIAorICAgIGlkID0gVmFyaWFibGVEZWNsYXJhdG9ySWQoKQorICAgIHsKKyAgICAgICAgSmF2YVRva2VuIGJlZ2luID0gb3JJZkludmFsaWQobW9kaWZpZXIuYmVnaW4sIHBhcnRpYWxUeXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCBqdWdnbGVBcnJheVR5cGUocGFydGlhbFR5cGUsIGlkLmIpLCBpc1ZhckFyZywgdmFyQXJnQW5ub3RhdGlvbnMsIGlkLmEpOworICAgIH0KK30KKworUmVjZWl2ZXJQYXJhbWV0ZXIgUmVjZWl2ZXJQYXJhbWV0ZXIoKToKK3sKKwlUeXBlIHBhcnRpYWxUeXBlOworCU5hbWUgaWQ7CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gZW1wdHlMaXN0KCk7Cit9Cit7CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpCisgICAgcGFydGlhbFR5cGUgPSBUeXBlKGVtcHR5TGlzdCgpKSAKKyAgICBpZCA9IFJlY2VpdmVyUGFyYW1ldGVySWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWNlaXZlclBhcmFtZXRlcihyYW5nZShwYXJ0aWFsVHlwZSwgdG9rZW4oKSksIGFubm90YXRpb25zLCBwYXJ0aWFsVHlwZSwgaWQpOworICAgIH0KK30KKworTmFtZSBSZWNlaXZlclBhcmFtZXRlcklkKCk6Cit7CisJTmFtZSByZXQgPSBudWxsOworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKK30KK3sKKyAgICBbIExPT0tBSEVBRChOYW1lKCkpIHJldCA9IE5hbWUoKSAiLiJdIGFubm90YXRpb25zPUFubm90YXRpb25zKCkgInRoaXMiIAorICAgIHsgcmV0dXJuIG5ldyBOYW1lKHRva2VuUmFuZ2UoKSwgcmV0LCB0b2tlbi5pbWFnZSwgYW5ub3RhdGlvbnMpOyB9Cit9CisKK0NvbnN0cnVjdG9yRGVjbGFyYXRpb24gQ29uc3RydWN0b3JEZWNsYXJhdGlvbihNb2RpZmllckhvbGRlciBtb2RpZmllcik6Cit7CisJUmFuZ2VkTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG5ldyBSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+KGVtcHR5TGlzdCgpKTsKKwlTaW1wbGVOYW1lIG5hbWU7CisJUGFpcjxOb2RlTGlzdDxQYXJhbWV0ZXI+LCBSZWNlaXZlclBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG5ldyBQYWlyPE5vZGVMaXN0PFBhcmFtZXRlcj4sIFJlY2VpdmVyUGFyYW1ldGVyPihlbXB0eUxpc3QoKSwgbnVsbCk7CisJTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXyA9IGVtcHR5TGlzdCgpOworCUV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBleENvbnNJbnYgPSBudWxsOworCU5vZGVMaXN0PFN0YXRlbWVudD4gc3RtdHMgPSBlbXB0eUxpc3QoKTsKKyAgICBKYXZhVG9rZW4gYmVnaW4gPSBtb2RpZmllci5iZWdpbjsKKwlKYXZhVG9rZW4gYmxvY2tCZWdpbiA9IElOVkFMSUQ7CisJUmVmZXJlbmNlVHlwZSB0aHJvd1R5cGU7Cit9Cit7CisgIFsgdHlwZVBhcmFtZXRlcnMgPSBUeXBlUGFyYW1ldGVycygpIHsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdHlwZVBhcmFtZXRlcnMucmFuZ2UuZ2V0QmVnaW4oKSk7IH0gXQorICAvLyBNb2RpZmllcnMgbWF0Y2hlZCBpbiB0aGUgY2FsbGVyCisgIG5hbWUgPSBTaW1wbGVOYW1lKCkgeyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0eXBlUGFyYW1ldGVycy5yYW5nZS5nZXRCZWdpbigpKTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0gcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMoKSBbICJ0aHJvd3MiIHRocm93VHlwZSA9IEFubm90YXRlZFJlZmVyZW5jZVR5cGUoKSB7IHRocm93c18gPSBhZGQodGhyb3dzXywgdGhyb3dUeXBlKTsgfQorICAoIiwiIHRocm93VHlwZSA9IEFubm90YXRlZFJlZmVyZW5jZVR5cGUoKSB7IHRocm93c18gPSBhZGQodGhyb3dzXywgdGhyb3dUeXBlKTsgfSkqIF0KKyAgInsiIHsgYmxvY2tCZWdpbj10b2tlbigpOyB9CisgICAgWyBMT09LQUhFQUQoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oKSkgZXhDb25zSW52ID0gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oKSBdCisgICAgc3RtdHMgPSBTdGF0ZW1lbnRzKCkKKyAgIn0iCisKKyAgeworICAJaWYgKGV4Q29uc0ludiAhPSBudWxsKSB7CisgIAkJc3RtdHMgPSBwcmVwZW5kKHN0bXRzLCBleENvbnNJbnYpOworICAJfQorICAJcmV0dXJuIG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMubGlzdCwgbmFtZSwgcGFyYW1ldGVycy5hLCB0aHJvd3NfLCBuZXcgQmxvY2tTdG10KHJhbmdlKGJsb2NrQmVnaW4sIHRva2VuKCkpLCBzdG10cyksIHBhcmFtZXRlcnMuYik7CisgIH0KK30KKworRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCk6Cit7CisJYm9vbGVhbiBpc1RoaXMgPSBmYWxzZTsKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmdzOworCUV4cHJlc3Npb24gZXhwciA9IG51bGw7CisJUmFuZ2VkTGlzdDxUeXBlPiB0eXBlQXJncyA9IG5ldyBSYW5nZWRMaXN0PFR5cGU+KG51bGwpOworCUphdmFUb2tlbiBiZWdpbiA9IElOVkFMSUQ7Cit9Cit7CisgICgKKwkgIExPT0tBSEVBRChbIFR5cGVBcmd1bWVudHMoKSBdIDxUSElTPiAiKCIpCisJICBbIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpIHsgYmVnaW49dHlwZUFyZ3MucmFuZ2UuZ2V0QmVnaW4oKTsgfSBdCisJICA8VEhJUz4geyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgaXNUaGlzID0gdHJ1ZTsgfQorCSAgYXJncyA9IEFyZ3VtZW50cygpICI7IgorCXwKKwkgIFsKKwkgICAgTE9PS0FIRUFEKCBQcmltYXJ5RXhwcmVzc2lvbldpdGhvdXRTdXBlclN1ZmZpeCgpICIuIiApCisJICAJZXhwciA9IFByaW1hcnlFeHByZXNzaW9uV2l0aG91dFN1cGVyU3VmZml4KCkgIi4iCisJICAJeyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCBleHByKTsgfQorCSAgXQorCSAgWyB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKSB7IGJlZ2luID0gb3JJZkludmFsaWQoYmVnaW4sIHR5cGVBcmdzLnJhbmdlLmdldEJlZ2luKCkpOyB9IF0KKwkgIDxTVVBFUj4ge2JlZ2luID0gb3JJZkludmFsaWQoYmVnaW4sIHRva2VuKCkpO30KKwkgIGFyZ3MgPSBBcmd1bWVudHMoKSAiOyIKKyAgKQorICB7IHJldHVybiBuZXcgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KHJhbmdlKGJlZ2luLCB0b2tlbigpKSx0eXBlQXJncy5saXN0LCBpc1RoaXMsIGV4cHIsIGFyZ3MpOyB9Cit9CisKK05vZGVMaXN0PFN0YXRlbWVudD4gU3RhdGVtZW50cygpOgoreworCU5vZGVMaXN0PFN0YXRlbWVudD4gcmV0ID0gZW1wdHlMaXN0KCk7CisJU3RhdGVtZW50IHN0bXQ7Cit9Cit7CisJKCBMT09LQUhFQUQoMikgc3RtdCA9IEJsb2NrU3RhdGVtZW50KCkgeyByZXQgPSBhZGQocmV0LCBzdG10KTsgfSApKgorCXsgcmV0dXJuIHJldDsgfQorfQorCitJbml0aWFsaXplckRlY2xhcmF0aW9uIEluaXRpYWxpemVyRGVjbGFyYXRpb24oKToKK3sKKwlCbG9ja1N0bXQgYm9keTsKKwlKYXZhVG9rZW4gYmVnaW4gPSBJTlZBTElEOworCWJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsKK30KK3sKKyAgWyAic3RhdGljIiB7IGlzU3RhdGljID0gdHJ1ZTsgYmVnaW49dG9rZW4oKTt9IF0gCisgIGJvZHkgPSBCbG9jaygpIHtiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCBib2R5KTt9CisgIHsgcmV0dXJuIG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgaXNTdGF0aWMsIGJvZHkpOyB9Cit9CisKKworLyoKKyAqIFR5cGUsIG5hbWUgYW5kIGV4cHJlc3Npb24gc3ludGF4IGZvbGxvd3MuCisgKi8KKworVHlwZSBUeXBlKE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyk6Cit7CisJVHlwZSByZXQ7Cit9Cit7CisgKAorICAgTE9PS0FIRUFEKDIpIHJldCA9IFJlZmVyZW5jZVR5cGUoYW5ub3RhdGlvbnMpCisgfAorICAgcmV0ID0gUHJpbWl0aXZlVHlwZShhbm5vdGF0aW9ucyApCisgKQorIHsgcmV0dXJuIHJldDsgfQorfQorCitSZWZlcmVuY2VUeXBlIFJlZmVyZW5jZVR5cGUoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKToKK3sKKwlUeXBlIHR5cGU7CisJQXJyYXlCcmFja2V0UGFpciBhcnJheUJyYWNrZXRQYWlyOworCUxpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnMgPSBuZXcgQXJyYXlMaXN0KDApOworfQoreworICAoCisgICB0eXBlID0gUHJpbWl0aXZlVHlwZShhbm5vdGF0aW9ucykgKCBMT09LQUhFQUQoQW5ub3RhdGlvbnMoKSAiWyIpIGFycmF5QnJhY2tldFBhaXIgPSBBcnJheUJyYWNrZXRQYWlyKE9yaWdpbi5UWVBFKSB7IGFycmF5QnJhY2tldFBhaXJzPWFkZChhcnJheUJyYWNrZXRQYWlycywgYXJyYXlCcmFja2V0UGFpcik7IH0gKSsKKyAgfAorICAgdHlwZSA9IENsYXNzT3JJbnRlcmZhY2VUeXBlKGFubm90YXRpb25zKSAgKCBMT09LQUhFQUQoQW5ub3RhdGlvbnMoKSAiWyIpIGFycmF5QnJhY2tldFBhaXIgPSBBcnJheUJyYWNrZXRQYWlyKE9yaWdpbi5UWVBFKSB7IGFycmF5QnJhY2tldFBhaXJzPWFkZChhcnJheUJyYWNrZXRQYWlycywgYXJyYXlCcmFja2V0UGFpcik7IH0gKSoKKyAgKQorICB7IHJldHVybiAoUmVmZXJlbmNlVHlwZSl3cmFwSW5BcnJheVR5cGVzKHR5cGUsIGFycmF5QnJhY2tldFBhaXJzKTsgfQorfQorCitBcnJheUJyYWNrZXRQYWlyIEFycmF5QnJhY2tldFBhaXIoT3JpZ2luIG9yaWdpbik6Cit7CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworICAgIEphdmFUb2tlbiBiZWdpbiA9IElOVkFMSUQ7Cit9Cit7CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpCisgICAgIlsiIHsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7IH0gIl0iCisgICAgeyByZXR1cm4gbmV3IEFycmF5QnJhY2tldFBhaXIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBvcmlnaW4sIGFubm90YXRpb25zKTsgfQorfQorCitJbnRlcnNlY3Rpb25UeXBlIEludGVyc2VjdGlvblR5cGUoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKToKK3sKKwlKYXZhVG9rZW4gYmVnaW4gPSBJTlZBTElEOworCVJlZmVyZW5jZVR5cGUgZWxlbWVudFR5cGU7CisJTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMgPSBlbXB0eUxpc3QoKTsKK30KK3sKKyAgICBlbGVtZW50VHlwZSA9IFJlZmVyZW5jZVR5cGUoYW5ub3RhdGlvbnMpIHsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgZWxlbWVudFR5cGUpOyBlbGVtZW50cyA9IGFkZChlbGVtZW50cywgZWxlbWVudFR5cGUpOyB9CisgICAgIiYiIChlbGVtZW50VHlwZSA9IEFubm90YXRlZFJlZmVyZW5jZVR5cGUoKSB7IGVsZW1lbnRzID0gYWRkKGVsZW1lbnRzLCBlbGVtZW50VHlwZSk7IH0gKSsKKyAgICB7IHJldHVybiBuZXcgSW50ZXJzZWN0aW9uVHlwZShyYW5nZShiZWdpbiwgdG9rZW4oKSksIGVsZW1lbnRzKTsgfQorfQorCitDbGFzc09ySW50ZXJmYWNlVHlwZSBBbm5vdGF0ZWRDbGFzc09ySW50ZXJmYWNlVHlwZSgpOgoreworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4oKTsKKwlDbGFzc09ySW50ZXJmYWNlVHlwZSBjaXQ7Cit9Cit7CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpCisgICAgY2l0ID0gQ2xhc3NPckludGVyZmFjZVR5cGUoYW5ub3RhdGlvbnMpCisgICAgeyByZXR1cm4gY2l0OyB9Cit9CisKK0NsYXNzT3JJbnRlcmZhY2VUeXBlIENsYXNzT3JJbnRlcmZhY2VUeXBlKE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBmaXJzdEFubm90YXRpb25zKToKK3sKKwlDbGFzc09ySW50ZXJmYWNlVHlwZSByZXQ7CisJU2ltcGxlTmFtZSBuYW1lOworCVJhbmdlZExpc3Q8VHlwZT4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPihudWxsKTsKKwlKYXZhVG9rZW4gYmVnaW47CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbmV3IE5vZGVMaXN0PEFubm90YXRpb25FeHByPigpOworfQoreworICBuYW1lID0gU2ltcGxlTmFtZSgpIHtiZWdpbj10b2tlbigpO30KKyAgWyBMT09LQUhFQUQoMikgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCkgXQorICB7CisgICAgICByZXQgPSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBudWxsLCBuYW1lLCB0eXBlQXJncy5saXN0LCBmaXJzdEFubm90YXRpb25zKTsKKyAgICAgIHR5cGVBcmdzID0gbmV3IFJhbmdlZExpc3Q8VHlwZT4obnVsbCk7CisgIH0KKyAgKAorCSAgTE9PS0FIRUFEKDIpICIuIiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgIG5hbWUgPSBTaW1wbGVOYW1lKCkKKwkgIFsgTE9PS0FIRUFEKDIpIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpIF0KKwkgIHsKKwkgICAgcmV0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgcmV0LCBuYW1lLCB0eXBlQXJncy5saXN0LCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHR5cGVBcmdzID0gbmV3IFJhbmdlZExpc3Q8VHlwZT4obnVsbCk7CisgICAgICB9CisgICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitSYW5nZWRMaXN0PFR5cGU+IFR5cGVBcmd1bWVudHMoKToKK3sKKwlSYW5nZWRMaXN0PFR5cGU+IHJldCA9IG5ldyBSYW5nZWRMaXN0PFR5cGU+KG5ldyBOb2RlTGlzdDxUeXBlPigpKTsKKwlUeXBlIHR5cGU7Cit9Cit7CisgICAoCisgICAgICI8IiB7IHJldC5iZWdpbkF0KHRva2VuKCkpOyB9CisgICAgICh0eXBlID0gVHlwZUFyZ3VtZW50KCkgeyByZXQuYWRkKHR5cGUpOyB9ICggIiwiIHR5cGUgPSBUeXBlQXJndW1lbnQoKSB7IHJldC5hZGQodHlwZSk7IH0gKSopPworICAgICAiPiIgeyByZXQuZW5kQXQodG9rZW4oKSk7IH0KKyAgICkKKyAgIHsgcmV0dXJuIHJldDsgfQorfQorCitUeXBlIFR5cGVBcmd1bWVudCgpOgoreworCVR5cGUgcmV0OworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKK30KK3sKKyBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgCisgKAorICAgcmV0ID0gVHlwZShhbm5vdGF0aW9ucykKKyB8CisgICByZXQgPSBXaWxkY2FyZChhbm5vdGF0aW9ucykKKyApCisgeyByZXR1cm4gcmV0OyB9Cit9CisKK1dpbGRjYXJkVHlwZSBXaWxkY2FyZChOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gZmlyc3RBbm5vdGF0aW9ucyk6Cit7CisJUmVmZXJlbmNlVHlwZSBleHQgPSBudWxsOworCVJlZmVyZW5jZVR5cGUgc3VwID0gbnVsbDsKKwlKYXZhVG9rZW4gYmVnaW47CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbmV3IE5vZGVMaXN0PEFubm90YXRpb25FeHByPigpOworfQoreworICAgIj8iIHtiZWdpbj10b2tlbigpO30KKyAgIFsKKwkJImV4dGVuZHMiIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKSBleHQgPSBSZWZlcmVuY2VUeXBlKGFubm90YXRpb25zKQorCXwKKwkJInN1cGVyIiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCkgc3VwID0gUmVmZXJlbmNlVHlwZShhbm5vdGF0aW9ucykKKyAgIF0KKyAgIHsgCisgICAgIHJldHVybiBuZXcgV2lsZGNhcmRUeXBlKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgZXh0LCBzdXAsIGZpcnN0QW5ub3RhdGlvbnMpOworICAgfQorfQorCitQcmltaXRpdmVUeXBlIFByaW1pdGl2ZVR5cGUoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKToKK3sKKwlQcmltaXRpdmVUeXBlIHJldDsKK30KK3sKKygKKyAgImJvb2xlYW4iIHsgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5CT09MRUFOLCBhbm5vdGF0aW9ucyk7IH0KK3wKKyAgImNoYXIiIHsgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5DSEFSLCBhbm5vdGF0aW9ucyk7IH0KK3wKKyAgImJ5dGUiIHsgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5CWVRFLCBhbm5vdGF0aW9ucyk7IH0KK3wKKyAgInNob3J0IiB7IHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuUmFuZ2UoKSwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuU0hPUlQsIGFubm90YXRpb25zKTsgfQorfAorICAiaW50IiB7IHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuUmFuZ2UoKSwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuSU5ULCBhbm5vdGF0aW9ucyk7IH0KK3wKKyAgImxvbmciIHsgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5MT05HLCBhbm5vdGF0aW9ucyk7IH0KK3wKKyAgImZsb2F0IiB7IHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuUmFuZ2UoKSwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuRkxPQVQsIGFubm90YXRpb25zKTsgfQorfAorICAiZG91YmxlIiB7IHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuUmFuZ2UoKSwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuRE9VQkxFLCBhbm5vdGF0aW9ucyk7IH0KKykKK3sgcmV0dXJuIHJldDsgfQorfQorCitUeXBlIFJlc3VsdFR5cGUoTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKToKK3sKKwlUeXBlIHJldDsKK30KK3sKKyAgKAorCSAgInZvaWQiIHsgcmV0ID0gbmV3IFZvaWRUeXBlKHRva2VuUmFuZ2UoKSk7IH0KKwl8CisJICByZXQgPSBUeXBlKGFubm90YXRpb25zKQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitOYW1lIE5hbWUoKToKKy8qCisgKiBBIGxvb2thaGVhZCBpcyByZXF1aXJlZCBiZWxvdyBzaW5jZSAiTmFtZSIgY2FuIGJlIGZvbGxvd2VkCisgKiBieSBhICIuKiIgd2hlbiB1c2VkIGluIHRoZSBjb250ZXh0IG9mIGFuICJJbXBvcnREZWNsYXJhdGlvbiIuCisgKi8KK3sKKwlOYW1lIHJldDsKKwlOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuZXcgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+KCk7Cit9Cit7CisgIGFubm90YXRpb25zPUFubm90YXRpb25zKCkgSWRlbnRpZmllcigpIHsgcmV0ID0gbmV3IE5hbWUodG9rZW5SYW5nZSgpLCBudWxsLCB0b2tlbi5pbWFnZSwgYW5ub3RhdGlvbnMpOyB9CisgICggTE9PS0FIRUFEKCIuIiBBbm5vdGF0aW9ucygpIElkZW50aWZpZXIoKSkgCisgICIuIiBhbm5vdGF0aW9ucz1Bbm5vdGF0aW9ucygpIElkZW50aWZpZXIoKSB7IHJldCA9IG5ldyBOYW1lKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgdG9rZW4uaW1hZ2UsIGFubm90YXRpb25zKTsgfSApKgorICB7IHJldHVybiByZXQ7IH0KK30KKworU2ltcGxlTmFtZSBTaW1wbGVOYW1lKCk6Cit7CisgICAgU2ltcGxlTmFtZSByZXQ7Cit9Cit7CisgIElkZW50aWZpZXIoKSB7IHJldCA9IG5ldyBTaW1wbGVOYW1lKHRva2VuUmFuZ2UoKSwgdG9rZW4uaW1hZ2UpOyB9CisgIHsgcmV0dXJuIHJldDsgfQorfQorCisKK1N0cmluZyBJZGVudGlmaWVyKCk6Cit7CisgICAgU3RyaW5nIHJldDsKK30KK3sKKyAgICAvLyBNYWtlIHN1cmUgdGhlIG1vZHVsZSBpbmZvIGtleXdvcmRzIGRvbid0IGludGVyZmVyZSB3aXRoIG5vcm1hbCBKYXZhIHBhcnNpbmcgYnkgbWF0Y2hpbmcgdGhlbSBhcyBub3JtYWwgaWRlbnRpZmllcnMuCisgICAgKDxNT0RVTEU+IHwgPFJFUVVJUkVTPiB8IDxUTz4gfCA8V0lUSD4gfCA8T1BFTj4gfCA8T1BFTlM+IHwgPFVTRVM+IHwgPEVYUE9SVFM+IHwgPFBST1ZJREVTPiB8IDxUUkFOU0lUSVZFPiB8CisgICAgLy8gTWFrZSBzdXJlIG9sZGVyIEphdmEgdmVyc2lvbnMgcGFyc2UKKyAgICA8RU5VTT4gfCA8U1RSSUNURlA+IHwKKyAgICAvLyBBbiBhY3R1YWwgcGxhaW4gb2xkIGlkZW50aWZpZXIKKyAgICA8SURFTlRJRklFUj4pIHsgcmV0ID0gdG9rZW4uaW1hZ2U7IHNldFRva2VuS2luZChJREVOVElGSUVSKTt9CisgICAgeyByZXR1cm4gcmV0OyB9Cit9CisKKy8qCisgKiBFeHByZXNzaW9uIHN5bnRheCBmb2xsb3dzLgorICovCisKK0V4cHJlc3Npb24gRXhwcmVzc2lvbigpOgorLyoKKyAqIFRoaXMgZXhwYW5zaW9uIGhhcyBiZWVuIHdyaXR0ZW4gdGhpcyB3YXkgaW5zdGVhZCBvZjoKKyAqICAgQXNzaWdubWVudCgpIHwgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKKyAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICogSG93ZXZlciwgaXQgaXMgYSB3ZWFrZW5pbmcgb2YgdGhlIGdyYW1tYXIgZm9yIGl0IGFsbG93cyB0aGUgTEhTIG9mCisgKiBhc3NpZ25tZW50cyB0byBiZSBhbnkgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiB3aGVyZWFzIGl0IGNhbiBvbmx5IGJlCisgKiBhIHByaW1hcnkgZXhwcmVzc2lvbi4gVGhpcyBpcyBjYXVnaHQgYnkgYSB2YWxpZGF0aW9uIGFmdGVyIHBhcnNpbmcuCisgKi8KK3sKKwlFeHByZXNzaW9uIHJldDsKKwlBc3NpZ25FeHByLk9wZXJhdG9yIG9wOworCUV4cHJlc3Npb24gdmFsdWU7CisJU3RhdGVtZW50IGxhbWJkYUJvZHkgPSBudWxsOworCVJhbmdlZExpc3Q8VHlwZT4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPihudWxsKTsKK30KK3sKKyAgICByZXQgPSBDb25kaXRpb25hbEV4cHJlc3Npb24oKQorICAgIFsKKyAgICAgICAgKCBMT09LQUhFQUQoMikKKyAgICAgICAgICAgIG9wID0gQXNzaWdubWVudE9wZXJhdG9yKCkgdmFsdWUgPSBFeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgQXNzaWduRXhwcihyYW5nZShyZXQsIHRva2VuKCkpLCByZXQsIHZhbHVlLCBvcCk7IH0KKyAgICAgICAgfAorICAgICAgICAgICAgIi0+IiBsYW1iZGFCb2R5ID0gTGFtYmRhQm9keSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIENhc3RFeHByKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGdlbmVyYXRlTGFtYmRhKHJldCwgbGFtYmRhQm9keSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgaW5zdGFuY2VvZiBDb25kaXRpb25hbEV4cHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uYWxFeHByIGNlID0gKENvbmRpdGlvbmFsRXhwcikgcmV0OworICAgICAgICAgICAgICAgICAgICBpZihjZS5nZXRFbHNlRXhwcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlLnNldEVsc2VFeHByKGdlbmVyYXRlTGFtYmRhKGNlLmdldEVsc2VFeHByKCksIGxhbWJkYUJvZHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGdlbmVyYXRlTGFtYmRhKHJldCwgbGFtYmRhQm9keSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB8CisgICAgICAgICAgICAiOjoiICBbdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCkgXSAoSWRlbnRpZmllcigpIHwgIm5ldyIpIHsgcmV0ID0gbmV3IE1ldGhvZFJlZmVyZW5jZUV4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCB0eXBlQXJncy5saXN0LCB0b2tlbi5pbWFnZSk7IH0KKyAgICAgICAgKQorICAgIF0KKyAgICAKKyAgICB7IHJldHVybiByZXQ7IH0KK30KKworQXNzaWduRXhwci5PcGVyYXRvciBBc3NpZ25tZW50T3BlcmF0b3IoKToKK3sKKwlBc3NpZ25FeHByLk9wZXJhdG9yIHJldDsKK30KK3sKKyAgKAorICAgICAgIj0iICAgIHsgcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5BU1NJR047IH0KKyAgICB8ICIqPSIgICB7IHJldCA9IEFzc2lnbkV4cHIuT3BlcmF0b3IuTVVMVElQTFk7IH0KKyAgICB8ICIvPSIgICB7IHJldCA9IEFzc2lnbkV4cHIuT3BlcmF0b3IuRElWSURFOyB9CisgICAgfCAiJT0iICAgeyByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLlJFTUFJTkRFUjsgfQorICAgIHwgIis9IiAgIHsgcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5QTFVTOyB9CisgICAgfCAiLT0iICAgeyByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLk1JTlVTOyB9CisgICAgfCAiPDw9IiAgeyByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLkxFRlRfU0hJRlQ7IH0KKyAgICB8ICI+Pj0iICB7IHJldCA9IEFzc2lnbkV4cHIuT3BlcmF0b3IuU0lHTkVEX1JJR0hUX1NISUZUOyB9CisgICAgfCAiPj4+PSIgeyByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLlVOU0lHTkVEX1JJR0hUX1NISUZUOyB9CisgICAgfCAiJj0iICAgeyByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLkJJTkFSWV9BTkQ7IH0KKyAgICB8ICJePSIgICB7IHJldCA9IEFzc2lnbkV4cHIuT3BlcmF0b3IuWE9SOyB9CisgICAgfCAifD0iICAgeyByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLkJJTkFSWV9PUjsgfQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCUV4cHJlc3Npb24gbGVmdDsKKwlFeHByZXNzaW9uIHJpZ2h0OworfQoreworICByZXQgPSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbigpCisgIFsgIj8iIGxlZnQgPSBFeHByZXNzaW9uKCkgIjoiIHJpZ2h0ID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgQ29uZGl0aW9uYWxFeHByKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgbGVmdCwgcmlnaHQpOyB9IF0KKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0V4cHJlc3Npb24gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlFeHByZXNzaW9uIHJpZ2h0OworfQoreworICByZXQgPSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24oKSAoICJ8fCIgcmlnaHQgPSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24oKSB7IHJldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgcmlnaHQsIEJpbmFyeUV4cHIuT3BlcmF0b3IuT1IpOyB9ICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCUV4cHJlc3Npb24gcmlnaHQ7Cit9Cit7CisgIHJldCA9IEluY2x1c2l2ZU9yRXhwcmVzc2lvbigpICggIiYmIiByaWdodCA9IEluY2x1c2l2ZU9yRXhwcmVzc2lvbigpIHsgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCByaWdodCwgQmluYXJ5RXhwci5PcGVyYXRvci5BTkQpOyB9ICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIEluY2x1c2l2ZU9yRXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCUV4cHJlc3Npb24gcmlnaHQ7Cit9Cit7CisgIHJldCA9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbigpICggInwiIHJpZ2h0ID0gRXhjbHVzaXZlT3JFeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgQmluYXJ5RXhwcihyYW5nZShyZXQsIHRva2VuKCkpLCByZXQsIHJpZ2h0LCBCaW5hcnlFeHByLk9wZXJhdG9yLkJJTkFSWV9PUik7IH0gKSoKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0V4cHJlc3Npb24gRXhjbHVzaXZlT3JFeHByZXNzaW9uKCk6Cit7CisJRXhwcmVzc2lvbiByZXQ7CisJRXhwcmVzc2lvbiByaWdodDsKK30KK3sKKyAgcmV0ID0gQW5kRXhwcmVzc2lvbigpICggIl4iIHJpZ2h0ID0gQW5kRXhwcmVzc2lvbigpIHsgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCByaWdodCwgQmluYXJ5RXhwci5PcGVyYXRvci5YT1IpOyB9ICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIEFuZEV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlFeHByZXNzaW9uIHJpZ2h0OworfQoreworICByZXQgPSBFcXVhbGl0eUV4cHJlc3Npb24oKSAoICImIiByaWdodCA9IEVxdWFsaXR5RXhwcmVzc2lvbigpIHsgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCByaWdodCwgQmluYXJ5RXhwci5PcGVyYXRvci5CSU5BUllfQU5EKTsgfSApKgorICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBFcXVhbGl0eUV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlFeHByZXNzaW9uIHJpZ2h0OworCUJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7Cit9Cit7CisgIHJldCA9IEluc3RhbmNlT2ZFeHByZXNzaW9uKCkKKyAgKAorICAgICggIj09IiB7IG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5FUVVBTFM7IH0gfAorICAgICAgIiE9IiB7IG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5OT1RfRVFVQUxTOyB9CisgICAgKSByaWdodCA9IEluc3RhbmNlT2ZFeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgQmluYXJ5RXhwcihyYW5nZShyZXQsIHRva2VuKCkpLCByZXQsIHJpZ2h0LCBvcCk7IH0KKyAgKSoKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0V4cHJlc3Npb24gSW5zdGFuY2VPZkV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlSZWZlcmVuY2VUeXBlIHR5cGU7CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworfQoreworICAgIHJldCA9IFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgWyAiaW5zdGFuY2VvZiIgdHlwZSA9IEFubm90YXRlZFJlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldCA9IG5ldyBJbnN0YW5jZU9mRXhwcihyYW5nZShyZXQsIHRva2VuKCkpLCByZXQsIHR5cGUpOyAKKyAgICB9IF0KKyAgICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCUV4cHJlc3Npb24gcmlnaHQ7CisJQmluYXJ5RXhwci5PcGVyYXRvciBvcDsKK30KK3sKKyAgcmV0ID0gU2hpZnRFeHByZXNzaW9uKCkKKyAgKAorICAJKCAiPCIgIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLkxFU1M7IH0gfAorICAJICAiPiIgIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLkdSRUFURVI7IH0gfAorICAJICAiPD0iIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLkxFU1NfRVFVQUxTOyB9IHwKKyAgCSAgIj49IiB7IG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5HUkVBVEVSX0VRVUFMUzsgfQorICAJKSByaWdodCA9IFNoaWZ0RXhwcmVzc2lvbigpIHsgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCByaWdodCwgb3ApOyB9CisgICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIFNoaWZ0RXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCUV4cHJlc3Npb24gcmlnaHQ7CisJQmluYXJ5RXhwci5PcGVyYXRvciBvcDsKK30KK3sKKyAgcmV0ID0gQWRkaXRpdmVFeHByZXNzaW9uKCkKKyAgKAorICAJKCAiPDwiICAgICAgICAgICAgIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLkxFRlRfU0hJRlQ7IH0gfAorICAJICBSU0lHTkVEU0hJRlQoKSAgIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLlNJR05FRF9SSUdIVF9TSElGVDsgfSB8CisgIAkgIFJVTlNJR05FRFNISUZUKCkgeyBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuVU5TSUdORURfUklHSFRfU0hJRlQ7IH0KKyAgCSkgcmlnaHQgPSBBZGRpdGl2ZUV4cHJlc3Npb24oKSB7IHJldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgcmlnaHQsIG9wKTsgfQorICApKgorICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBBZGRpdGl2ZUV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlFeHByZXNzaW9uIHJpZ2h0OworCUJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7Cit9Cit7CisgIHJldCA9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpCisgICgKKyAgCSggIisiIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLlBMVVM7IH0gfAorICAJICAiLSIgeyBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuTUlOVVM7IH0KKyAgCSkgcmlnaHQgPSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB7IHJldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgcmlnaHQsIG9wKTsgfQorICApKgorICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlFeHByZXNzaW9uIHJpZ2h0OworCUJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7Cit9Cit7CisgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpCisgICgKKyAgCSggIioiIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLk1VTFRJUExZOyB9IHwKKyAgCSAgIi8iIHsgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLkRJVklERTsgfSB8CisgIAkgICIlIiB7IG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5SRU1BSU5ERVI7IH0KKyAgCSkgcmlnaHQgPSBVbmFyeUV4cHJlc3Npb24oKSB7IHJldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgcmlnaHQsIG9wKTsgfQorICApKgorICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBVbmFyeUV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlVbmFyeUV4cHIuT3BlcmF0b3Igb3A7CisJSmF2YVRva2VuIGJlZ2luID0gSU5WQUxJRDsKK30KK3sKKyAgKAorCSAgcmV0ID0gUHJlSW5jcmVtZW50RXhwcmVzc2lvbigpCisJfAorCSAgcmV0ID0gUHJlRGVjcmVtZW50RXhwcmVzc2lvbigpCisJfAorCSAgKCAiKyIgeyBvcCA9IFVuYXJ5RXhwci5PcGVyYXRvci5QTFVTOyBiZWdpbj10b2tlbigpO30gfAorCSAgICAiLSIgeyBvcCA9IFVuYXJ5RXhwci5PcGVyYXRvci5NSU5VUzsgYmVnaW49dG9rZW4oKTt9CisJICApIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpCisJICB7CisgICAgICAgIHJldCA9IG5ldyBVbmFyeUV4cHIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCByZXQsIG9wKTsKKwkgIH0KKwl8CisJICByZXQgPSBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMoKQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIFByZUluY3JlbWVudEV4cHJlc3Npb24oKToKK3sKKwlFeHByZXNzaW9uIHJldDsKKwlKYXZhVG9rZW4gYmVnaW4gPSBJTlZBTElEOworfQoreworICAiKysiIHtiZWdpbj10b2tlbigpO30gcmV0ID0gVW5hcnlFeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgVW5hcnlFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgcmV0LCBVbmFyeUV4cHIuT3BlcmF0b3IuUFJFRklYX0lOQ1JFTUVOVCk7IH0KKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0V4cHJlc3Npb24gUHJlRGVjcmVtZW50RXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgIi0tIiB7YmVnaW49dG9rZW4oKTt9IHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpIHsgcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShiZWdpbiwgdG9rZW4oKSksIHJldCwgVW5hcnlFeHByLk9wZXJhdG9yLlBSRUZJWF9ERUNSRU1FTlQpOyB9CisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cygpOgoreworCUV4cHJlc3Npb24gcmV0OworCVVuYXJ5RXhwci5PcGVyYXRvciBvcDsKKwlKYXZhVG9rZW4gYmVnaW4gPSBJTlZBTElEOworfQoreworICAoCisJICAoICJ+IiB7IG9wID0gVW5hcnlFeHByLk9wZXJhdG9yLkJJVFdJU0VfQ09NUExFTUVOVDsgYmVnaW49dG9rZW4oKTsgfSB8CisJICAgICIhIiB7IG9wID0gVW5hcnlFeHByLk9wZXJhdG9yLkxPR0lDQUxfQ09NUExFTUVOVDsgICAgIGJlZ2luPXRva2VuKCk7IH0KKwkgICkgcmV0ID0gVW5hcnlFeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgVW5hcnlFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgcmV0LCBvcCk7IH0KKwl8CisJICBMT09LQUhFQUQoIENhc3RFeHByZXNzaW9uKCkgKQorCSAgcmV0ID0gQ2FzdEV4cHJlc3Npb24oKQorCXwKKyAgICAgIHJldCA9IFBvc3RmaXhFeHByZXNzaW9uKCkKKyAgKQorICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBQb3N0Zml4RXhwcmVzc2lvbigpOgoreworCUV4cHJlc3Npb24gcmV0OworCVVuYXJ5RXhwci5PcGVyYXRvciBvcDsKK30KK3sKKyAgcmV0ID0gUHJpbWFyeUV4cHJlc3Npb24oKQorICBbCisgIAlMT09LQUhFQUQoMikKKyAgICAoICIrKyIgeyBvcCA9IFVuYXJ5RXhwci5PcGVyYXRvci5QT1NURklYX0lOQ1JFTUVOVDsgfSB8CisgICAgICAiLS0iIHsgb3AgPSBVbmFyeUV4cHIuT3BlcmF0b3IuUE9TVEZJWF9ERUNSRU1FTlQ7IH0KKyAgICApIHsgcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShyZXQsIHRva2VuKCkpLCByZXQsIG9wKTsgfQorICBdCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIENhc3RFeHByZXNzaW9uKCk6Cit7CisJRXhwcmVzc2lvbiByZXQ7CisJUmVmZXJlbmNlVHlwZSByZWZlcmVuY2VUeXBlOworCVByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZTsKKwlKYXZhVG9rZW4gYmVnaW4gPSBJTlZBTElEOworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKwlOb2RlTGlzdDxSZWZlcmVuY2VUeXBlPiB0eXBlc09mTXVsdGlDYXN0ID0gZW1wdHlMaXN0KCk7Cit9Cit7CisgICIoIiB7YmVnaW49dG9rZW4oKTt9CisgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKSAKKyAgKAorICAJICBMT09LQUhFQUQoMikKKyAgCSAgcHJpbWl0aXZlVHlwZSA9IFByaW1pdGl2ZVR5cGUoYW5ub3RhdGlvbnMpICIpIiByZXQgPSBVbmFyeUV4cHJlc3Npb24oKSB7IHJldCA9IG5ldyBDYXN0RXhwcihyYW5nZShiZWdpbiwgdG9rZW4oKSksIHByaW1pdGl2ZVR5cGUsIHJldCk7IH0KKyAgCXwKKyAgCSAgcmVmZXJlbmNlVHlwZSA9IFJlZmVyZW5jZVR5cGUoYW5ub3RhdGlvbnMpIHsgdHlwZXNPZk11bHRpQ2FzdCA9IGFkZCh0eXBlc09mTXVsdGlDYXN0LCByZWZlcmVuY2VUeXBlKTsgfQorICAJICAoICImIiByZWZlcmVuY2VUeXBlID0gQW5ub3RhdGVkUmVmZXJlbmNlVHlwZSgpIHsKKyAgCSAgICB0eXBlc09mTXVsdGlDYXN0ID0gYWRkKHR5cGVzT2ZNdWx0aUNhc3QsIHJlZmVyZW5jZVR5cGUpOworICAJICAgIH0KKyAgCSAgKSoKKyAgCSAgIikiIHJldCA9IFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cygpIHsKKyAgCSAgICBpZiAodHlwZXNPZk11bHRpQ2FzdC5zaXplKCkgPiAxKSB7CisgIAkgICAgICAgIHJldCA9IG5ldyBDYXN0RXhwcihyYW5nZShiZWdpbiwgdG9rZW4oKSksIG5ldyBJbnRlcnNlY3Rpb25UeXBlKHJhbmdlKHR5cGVzT2ZNdWx0aUNhc3QuZ2V0KDApLCB0eXBlc09mTXVsdGlDYXN0LmdldCh0eXBlc09mTXVsdGlDYXN0LnNpemUoKSAtMSkpLCB0eXBlc09mTXVsdGlDYXN0KSwgcmV0KTsKKyAgCSAgICB9IGVsc2UgeworICAJICAgICAgICByZXQgPSBuZXcgQ2FzdEV4cHIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCByZWZlcmVuY2VUeXBlLCByZXQpOworICAJICAgIH0KKyAgCSAgfQorICkKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKKworCitFeHByZXNzaW9uIFByaW1hcnlFeHByZXNzaW9uKCk6Cit7CisJRXhwcmVzc2lvbiByZXQ7Cit9Cit7CisgIHJldCA9IFByaW1hcnlQcmVmaXgoKSAoIExPT0tBSEVBRCgyKSByZXQgPSBQcmltYXJ5U3VmZml4KHJldCkgKSoKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0V4cHJlc3Npb24gUHJpbWFyeUV4cHJlc3Npb25XaXRob3V0U3VwZXJTdWZmaXgoKToKK3sKKwlFeHByZXNzaW9uIHJldDsKK30KK3sKKyAgcmV0ID0gUHJpbWFyeVByZWZpeCgpICggTE9PS0FIRUFEKCBQcmltYXJ5U3VmZml4V2l0aG91dFN1cGVyKG51bGwpICkgcmV0ID0gUHJpbWFyeVN1ZmZpeFdpdGhvdXRTdXBlcihyZXQpICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIFByaW1hcnlQcmVmaXgoKToKK3sKKwlFeHByZXNzaW9uIHJldCA9IG51bGw7CisJU2ltcGxlTmFtZSBuYW1lOworCVJhbmdlZExpc3Q8VHlwZT4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPihudWxsKTsKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmdzID0gZW1wdHlMaXN0KCk7CisJTm9kZUxpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSBlbXB0eUxpc3QoKTsKKwlib29sZWFuIGhhc0FyZ3MgPSBmYWxzZTsKKwlib29sZWFuIGlzTGFtYmRhID0gZmFsc2U7CisJVHlwZSB0eXBlOworCUphdmFUb2tlbiBiZWdpbjsKKwlQYXJhbWV0ZXIgcCA9IG51bGw7CisJU2ltcGxlTmFtZSBpZCA9IG51bGw7Cit9Cit7CisgICgKKwkgIHJldCA9IExpdGVyYWwoKQorCXwKKwkgIDxUSElTPiB7IHJldCA9IG5ldyBUaGlzRXhwcih0b2tlblJhbmdlKCksIG51bGwpOyB9CisJfAorCSAgPFNVUEVSPiB7IHJldCA9IG5ldyBTdXBlckV4cHIodG9rZW5SYW5nZSgpLCBudWxsKTsgfQorCSAgKAorCSAgICAgIi4iCisJICBbIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpIF0KKwkgIG5hbWUgPSBTaW1wbGVOYW1lKCkKKwkgIFsgYXJncyA9IEFyZ3VtZW50cygpIHtoYXNBcmdzPXRydWU7fSBdCisJICAJeworCQkJaWYgKGhhc0FyZ3MpIHsKKwkgIAkJCXJldCA9IG5ldyBNZXRob2RDYWxsRXhwcihyYW5nZShyZXQsIHRva2VuKCkpLCByZXQsIHR5cGVBcmdzLmxpc3QsIG5hbWUsIGFyZ3MpOworCQkJfSBlbHNlIHsKKwkgIAkJCXJldCA9IG5ldyBGaWVsZEFjY2Vzc0V4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCBlbXB0eUxpc3QoKSwgbmFtZSk7CisJCQl9CisJICAJfQorCSB8CisJCSI6OiIgW3R5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpIF0gKElkZW50aWZpZXIoKSB8ICJuZXciKQorCQl7CisJCSAgcmV0ID0gbmV3IE1ldGhvZFJlZmVyZW5jZUV4cHIocmFuZ2UocmV0LCB0b2tlbigpKSwgcmV0LCB0eXBlQXJncy5saXN0LCB0b2tlbi5pbWFnZSk7CisJCX0KKwkgICkKKwl8CisgICAgICAgICIoIiB7YmVnaW49dG9rZW4oKTt9CisgICAgICAgICgKKyAgICAgICAgICAgICIpIiB7IHJldCA9IG5ldyBMYW1iZGFFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgcGFyYW1zLCBuZXcgQmxvY2tTdG10KCksIHRydWUpOyB9CisgICAgICAgIHwgTE9PS0FIRUFEKFBhcmFtZXRlcigpKQorICAgICAgICAgICAgcGFyYW1zID0gTGFtYmRhUGFyYW1ldGVycygpICIpIiB7IHJldCA9IG5ldyBMYW1iZGFFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgcGFyYW1zLCBuZXcgQmxvY2tTdG10KCksIHRydWUpOyB9CisgICAgICAgIHwgTE9PS0FIRUFEKFZhcmlhYmxlRGVjbGFyYXRvcklkKCkgIiwiKQorICAgICAgICAgICAgcGFyYW1zID0gSW5mZXJyZWRMYW1iZGFQYXJhbWV0ZXJzKCkgIikiIHsgcmV0ID0gbmV3IExhbWJkYUV4cHIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBwYXJhbXMsIG5ldyBCbG9ja1N0bXQoKSwgdHJ1ZSk7IH0KKyAgICAgICAgfAorICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBzdGlsbCBiZSBhIGxhbWJkYSBleHByZXNzaW9uLCBidXQgdGhpcyBpcyBoYW5kbGVkIGFmdGVyIG1hdGNoaW5nIC0+IGVsc2V3aGVyZQorICAgICAgICAgICAgcmV0ID0gRXhwcmVzc2lvbigpICIpIiB7IHJldCA9IG5ldyBFbmNsb3NlZEV4cHIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCByZXQpOyB9CisgICAgICAgICkKKwl8CisJICByZXQgPSBBbGxvY2F0aW9uRXhwcmVzc2lvbihudWxsKQorCXwKKwkgIExPT0tBSEVBRCggUmVzdWx0VHlwZSgpICIuIiAiY2xhc3MiICkKKwkgIHR5cGUgPSBSZXN1bHRUeXBlKGVtcHR5TGlzdCgpKSAgIi4iICJjbGFzcyIgeyByZXQgPSBuZXcgQ2xhc3NFeHByKHJhbmdlKHR5cGUsIHRva2VuKCkpLCB0eXBlKTsgfQorCisJfCBMT09LQUhFQUQgKEFubm90YXRlZFR5cGUoKSAiOjoiICkKKwkgIHR5cGUgPSBBbm5vdGF0ZWRUeXBlKCkgIjo6IiBbdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCkgXSAoSWRlbnRpZmllcigpIHwgIm5ldyIpCisJCXsKKwkJICByZXQgPSBuZXcgVHlwZUV4cHIocmFuZ2UodHlwZSwgdHlwZSksIHR5cGUpOworCQkgIHJldCA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKHJhbmdlKHJldCwgdG9rZW4oKSksIHJldCwgdHlwZUFyZ3MubGlzdCwgdG9rZW4uaW1hZ2UpOworCQl9CisKKwl8CisJICAJbmFtZSA9IFNpbXBsZU5hbWUoKSB7IGJlZ2luPXRva2VuKCk7IH0KKwkgIAlbIGFyZ3MgPSBBcmd1bWVudHMoKSB7IGhhc0FyZ3M9dHJ1ZTsgfSBdCisJICAJeworCSAgCQlpZiAoaGFzQXJncykgeworCSAgCQkJcmV0ID0gbmV3IE1ldGhvZENhbGxFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbnVsbCwgbnVsbCwgbmFtZSwgYXJncyk7CisJCQl9IGVsc2UgeworCSAgCQkJcmV0ID0gbmV3IE5hbWVFeHByKG5hbWUpOworCQkJfQorCSAgCX0KKyAgKQorICB7IHJldHVybiByZXQ7IH0KK30KKworRXhwcmVzc2lvbiBQcmltYXJ5U3VmZml4KEV4cHJlc3Npb24gc2NvcGUpOgoreworCUV4cHJlc3Npb24gcmV0OworfQoreworICAoCisgIAlMT09LQUhFQUQoMikKKwlyZXQgPSBQcmltYXJ5U3VmZml4V2l0aG91dFN1cGVyKHNjb3BlKQorCXwKKyAgCSIuIiAic3VwZXIiIHsgcmV0ID0gbmV3IFN1cGVyRXhwcihyYW5nZShzY29wZSwgdG9rZW4oKSksIHNjb3BlKTsgfQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIFByaW1hcnlTdWZmaXhXaXRob3V0U3VwZXIoRXhwcmVzc2lvbiBzY29wZSk6Cit7CisJRXhwcmVzc2lvbiByZXQ7CisJUmFuZ2VkTGlzdDxUeXBlPiB0eXBlQXJncyA9IG5ldyBSYW5nZWRMaXN0PFR5cGU+KG51bGwpOworCU5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBlbXB0eUxpc3QoKTsKKwlib29sZWFuIGhhc0FyZ3MgPSBmYWxzZTsKKwlTaW1wbGVOYW1lIG5hbWU7Cit9Cit7CisgICgKKyAgCSIuIgorICAJKAorCQkidGhpcyIgeyByZXQgPSBuZXcgVGhpc0V4cHIocmFuZ2Uoc2NvcGUsIHRva2VuKCkpLCBzY29wZSk7IH0KKwkgIHwKKwkgIAlyZXQgPSBBbGxvY2F0aW9uRXhwcmVzc2lvbihzY29wZSkKKwkgIHwKKwkgIAlMT09LQUhFQUQoIFsgVHlwZUFyZ3VtZW50cygpIF0gSWRlbnRpZmllcigpICkKKwkgIAlbIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpIF0KKwkgIAluYW1lID0gU2ltcGxlTmFtZSgpCisJICAJWyBhcmdzID0gQXJndW1lbnRzKCkge2hhc0FyZ3M9dHJ1ZTt9IF0KKwkgIAl7CisJCQlpZiAoaGFzQXJncykgeworCSAgCQkJcmV0ID0gbmV3IE1ldGhvZENhbGxFeHByKHJhbmdlKHNjb3BlLCB0b2tlbigpKSwgc2NvcGUsIHR5cGVBcmdzLmxpc3QsIG5hbWUsIGFyZ3MpOworCQkJfSBlbHNlIHsKKwkgIAkJCXJldCA9ICBuZXcgRmllbGRBY2Nlc3NFeHByKHJhbmdlKHNjb3BlLCB0b2tlbigpKSwgc2NvcGUsIHR5cGVBcmdzLmxpc3QsIG5hbWUpOworCQkJfQorCSAgCX0KKwkpCisJfAorCSAgIlsicmV0ID0gRXhwcmVzc2lvbigpICJdIiB7IHJldCA9IG5ldyBBcnJheUFjY2Vzc0V4cHIocmFuZ2Uoc2NvcGUsIHRva2VuKCkpLCBzY29wZSwgcmV0KTsgfQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIExpdGVyYWwoKToKK3sKKwlFeHByZXNzaW9uIHJldDsKK30KK3sKKyAgKAorCSAgPElOVEVHRVJfTElURVJBTD4geworCSAgCQlyZXQgPSBuZXcgSW50ZWdlckxpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSwgdG9rZW4uaW1hZ2UpOworCSAgfQorCXwKKwkgIDxMT05HX0xJVEVSQUw+IHsKKwkgIAkJcmV0ID0gbmV3IExvbmdMaXRlcmFsRXhwcih0b2tlblJhbmdlKCksIHRva2VuLmltYWdlKTsKKwkgIH0KKwl8CisJICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4geworCSAgCQlyZXQgPSBuZXcgRG91YmxlTGl0ZXJhbEV4cHIodG9rZW5SYW5nZSgpLCB0b2tlbi5pbWFnZSk7CisJICB9CisJfAorCSAgPENIQVJBQ1RFUl9MSVRFUkFMPiB7CisJICAJcmV0ID0gbmV3IENoYXJMaXRlcmFsRXhwcih0b2tlblJhbmdlKCksIHRva2VuLmltYWdlLnN1YnN0cmluZygxLCB0b2tlbi5pbWFnZS5sZW5ndGgoKS0xKSk7CisJICB9CisJfAorCSAgPFNUUklOR19MSVRFUkFMPiB7CisJICAJcmV0ID0gbmV3IFN0cmluZ0xpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSwgdG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDEsIHRva2VuLmltYWdlLmxlbmd0aCgpLTEpKTsKKwkgIH0KKwl8CisJICByZXQgPSBCb29sZWFuTGl0ZXJhbCgpCisJfAorCSAgcmV0ID0gTnVsbExpdGVyYWwoKQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIEJvb2xlYW5MaXRlcmFsKCk6Cit7CisJRXhwcmVzc2lvbiByZXQ7Cit9Cit7CisgICgKKwkgICJ0cnVlIiB7IHJldCA9IG5ldyBCb29sZWFuTGl0ZXJhbEV4cHIodG9rZW5SYW5nZSgpLCB0cnVlKTsgfQorCXwKKwkgICJmYWxzZSIgeyByZXQgPSBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSwgZmFsc2UpOyB9CisgICkKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0V4cHJlc3Npb24gTnVsbExpdGVyYWwoKToKK3t9Cit7CisgICJudWxsIgorICB7IHJldHVybiBuZXcgTnVsbExpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSk7IH0KK30KKworTm9kZUxpc3Q8RXhwcmVzc2lvbj4gQXJndW1lbnRzKCk6Cit7CisJTm9kZUxpc3Q8RXhwcmVzc2lvbj4gcmV0ID0gZW1wdHlMaXN0KCk7Cit9Cit7CisgICIoIiBbIHJldCA9IEFyZ3VtZW50TGlzdCgpIF0gIikiCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitOb2RlTGlzdDxFeHByZXNzaW9uPiBBcmd1bWVudExpc3QoKToKK3sKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiByZXQgPSBlbXB0eUxpc3QoKTsKKwlFeHByZXNzaW9uIGV4cHI7Cit9Cit7CisgIGV4cHIgPSBFeHByZXNzaW9uKCkgeyByZXQuYWRkKGV4cHIpOyB9ICggIiwiIGV4cHIgPSBFeHByZXNzaW9uKCkgeyByZXQuYWRkKGV4cHIpOyB9ICkqCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uIEFsbG9jYXRpb25FeHByZXNzaW9uKEV4cHJlc3Npb24gc2NvcGUpOgoreworCUV4cHJlc3Npb24gcmV0OworCVR5cGUgdHlwZTsKKwlSYW5nZWRMaXN0PFR5cGU+IHR5cGVBcmdzID0gbmV3IFJhbmdlZExpc3Q8VHlwZT4obnVsbCk7CisJTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBhbm9ueW1vdXNCb2R5ID0gbnVsbDsKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmdzOworCUphdmFUb2tlbiBiZWdpbiA9IElOVkFMSUQ7CisJTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbmV3IE5vZGVMaXN0PEFubm90YXRpb25FeHByPigpOworfQoreworICAgICJuZXciIHsgaWYoc2NvcGU9PW51bGwpIHtiZWdpbj10b2tlbigpO30gZWxzZSB7YmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgc2NvcGUpO30gfQorICAgIAorICAgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKSAKKyAgICAoCisgICAgICAgIHR5cGUgPSBQcmltaXRpdmVUeXBlKGFubm90YXRpb25zKQorICAgICAgICByZXQgPSBBcnJheUNyZWF0aW9uKGJlZ2luLCB0eXBlKQorICAgIHwKKyAgICAgICAgWyB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKSBdCisgICAgICAgIHR5cGUgPSBBbm5vdGF0ZWRDbGFzc09ySW50ZXJmYWNlVHlwZSgpCisgICAgICAgICgKKyAgICAgICAgICAgIHJldCA9IEFycmF5Q3JlYXRpb24oYmVnaW4sIHR5cGUpCisgICAgICAgIHwKKyAgICAgICAgICAgIGFyZ3MgPSBBcmd1bWVudHMoKSBbIExPT0tBSEVBRCgyKSBhbm9ueW1vdXNCb2R5ID0gQ2xhc3NPckludGVyZmFjZUJvZHkoKSBdCisgICAgICAgICAgICB7IHJldCA9IG5ldyBPYmplY3RDcmVhdGlvbkV4cHIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBzY29wZSwgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0eXBlLCB0eXBlQXJncy5saXN0LCBhcmdzLCBhbm9ueW1vdXNCb2R5KTsgfQorICAgICAgICApCisgICAgKQorICAgIHsgcmV0dXJuIHJldDsgfQorfQorCitBcnJheUNyZWF0aW9uRXhwciBBcnJheUNyZWF0aW9uKEphdmFUb2tlbiBiZWdpbiwgVHlwZSB0eXBlKToKK3sKKwlFeHByZXNzaW9uIGV4cHIgPSBudWxsOworCUFycmF5SW5pdGlhbGl6ZXJFeHByIGFycmF5SW5pdGlhbGl6ZXJFeHByID0gbnVsbDsKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiBpbml0cyA9IGVtcHR5TGlzdCgpOworCUxpc3Q8Tm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+PiBhY2N1bSA9IG5ldyBBcnJheUxpc3Q8Tm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+PigpOworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4oKTsKKwlKYXZhVG9rZW4gYXJyYXlDcmVhdGlvbkxldmVsU3RhcnQgPSBJTlZBTElEOworCUxpc3Q8VG9rZW5SYW5nZT4gbGV2ZWxSYW5nZXMgPSBuZXcgQXJyYXlMaXN0PFRva2VuUmFuZ2U+KCk7Cit9Cit7IAorICAgICggTE9PS0FIRUFEKDIpCisgICAgICAgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKQorICAgICAgICAiWyIgeyBhcnJheUNyZWF0aW9uTGV2ZWxTdGFydCA9IGFubm90YXRpb25zLmlzRW1wdHkoKSA/IHRva2VuKCkgOiBvcklmSW52YWxpZChhcnJheUNyZWF0aW9uTGV2ZWxTdGFydCwgYW5ub3RhdGlvbnMuZ2V0KDApKTsgfQorICAgICAgICAoZXhwciA9IEV4cHJlc3Npb24oKSk/IHsgYWNjdW0gPSBhZGQoYWNjdW0sIGFubm90YXRpb25zKTsgaW5pdHMgPSBhZGQoaW5pdHMsIGV4cHIpOyBhbm5vdGF0aW9ucz1udWxsOyBleHByPW51bGw7IH0gCisgICAgICAgICJdIiB7IGxldmVsUmFuZ2VzLmFkZChyYW5nZShhcnJheUNyZWF0aW9uTGV2ZWxTdGFydCwgdG9rZW4oKSkpOyB9CisgICAgKSsgCisgICAgKGFycmF5SW5pdGlhbGl6ZXJFeHByID0gQXJyYXlJbml0aWFsaXplcigpKT8gCisgICAgeyAgCisgICAgICAgIHJldHVybiBqdWdnbGVBcnJheUNyZWF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbGV2ZWxSYW5nZXMsIHR5cGUsIGluaXRzLCBhY2N1bSwgYXJyYXlJbml0aWFsaXplckV4cHIpOworICAgIH0KK30KKworLyoKKyAqIFN0YXRlbWVudCBzeW50YXggZm9sbG93cy4KKyAqLworCitTdGF0ZW1lbnQgU3RhdGVtZW50KCk6Cit7CisJU3RhdGVtZW50IHJldDsKK30KK3sKKyAgICB0cnkgeworICAgICAgICAoIExPT0tBSEVBRCgyKQorICAgICAgICAgICAgcmV0ID0gTGFiZWxlZFN0YXRlbWVudCgpCisgICAgICAgIHwKKyAgICAgICAgICAgIHJldCA9IEFzc2VydFN0YXRlbWVudCgpCisgICAgICAgIHwKKyAgICAgICAgICAgIHJldCA9IEJsb2NrKCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gRW1wdHlTdGF0ZW1lbnQoKQorICAgICAgICB8CisgICAgICAgICAgICByZXQgPSBTdGF0ZW1lbnRFeHByZXNzaW9uKCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gU3dpdGNoU3RhdGVtZW50KCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gSWZTdGF0ZW1lbnQoKQorICAgICAgICB8CisgICAgICAgICAgICByZXQgPSBXaGlsZVN0YXRlbWVudCgpCisgICAgICAgIHwKKyAgICAgICAgICAgIHJldCA9IERvU3RhdGVtZW50KCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gRm9yU3RhdGVtZW50KCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gQnJlYWtTdGF0ZW1lbnQoKQorICAgICAgICB8CisgICAgICAgICAgICByZXQgPSBDb250aW51ZVN0YXRlbWVudCgpCisgICAgICAgIHwKKyAgICAgICAgICAgIHJldCA9IFJldHVyblN0YXRlbWVudCgpCisgICAgICAgIHwKKyAgICAgICAgICAgIHJldCA9IFRocm93U3RhdGVtZW50KCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gU3luY2hyb25pemVkU3RhdGVtZW50KCkKKyAgICAgICAgfAorICAgICAgICAgICAgcmV0ID0gVHJ5U3RhdGVtZW50KCkKKyAgICAgICAgKQorICAgICAgICB7IHJldHVybiByZXQ7IH0KKyAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFRva2VuUmFuZ2UgZXJyb3JSYW5nZSA9IHJlY292ZXIoU0VNSUNPTE9OLCBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBVbnBhcnNhYmxlU3RtdChlcnJvclJhbmdlKTsKKyAgICB9Cit9CisKK0Fzc2VydFN0bXQgQXNzZXJ0U3RhdGVtZW50KCk6Cit7CisJRXhwcmVzc2lvbiBjaGVjazsKKwlFeHByZXNzaW9uIG1zZyA9IG51bGw7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAiYXNzZXJ0IiB7YmVnaW49dG9rZW4oKTt9IGNoZWNrID0gRXhwcmVzc2lvbigpIFsgIjoiIG1zZyA9IEV4cHJlc3Npb24oKSBdICI7IgorICB7IHJldHVybiBuZXcgQXNzZXJ0U3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksIGNoZWNrLCBtc2cpOyAgfQorfQorCitMYWJlbGVkU3RtdCBMYWJlbGVkU3RhdGVtZW50KCk6Cit7CisJU2ltcGxlTmFtZSBsYWJlbDsKKwlTdGF0ZW1lbnQgc3RtdDsKKwlKYXZhVG9rZW4gYmVnaW47Cit9Cit7CisgIGxhYmVsID0gU2ltcGxlTmFtZSgpIHtiZWdpbj10b2tlbigpO30gIjoiIHN0bXQgPSBTdGF0ZW1lbnQoKQorICB7IHJldHVybiBuZXcgTGFiZWxlZFN0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBsYWJlbCwgc3RtdCk7IH0KK30KKworQmxvY2tTdG10IEJsb2NrKCk6Cit7CisJTm9kZUxpc3Q8U3RhdGVtZW50PiBzdG10cyA9IGVtcHR5TGlzdCgpOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgICAieyIge2JlZ2luPXRva2VuKCk7fQorICAgIHRyeSB7CisgICAgICAgIHN0bXRzID0gU3RhdGVtZW50cygpCisgICAgICAgICJ9IgorICAgICAgICB7IHJldHVybiBuZXcgQmxvY2tTdG10KHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgc3RtdHMpOyB9CisgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICByZWNvdmVyKFJCUkFDRSwgZSk7CisgICAgICAgIEJsb2NrU3RtdCBibG9jayA9IG5ldyBCbG9ja1N0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBuZXcgTm9kZUxpc3Q8U3RhdGVtZW50PigpKTsKKyAgICAgICAgYmxvY2suc2V0UGFyc2VkKFVOUEFSU0FCTEUpOworICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorfQorCisvKgorICogQ2xhc3NlcyBpbnNpZGUgYm9keSBzdGF0ZW1lbnRzIGNhbiBvbmx5IGJlIGFic3RyYWN0IG9yIGZpbmFsLiBUaGUgc2VtYW50aWMgbXVzdCBjaGVjayBpdC4KKyAqLworU3RhdGVtZW50IEJsb2NrU3RhdGVtZW50KCk6Cit7CisJU3RhdGVtZW50IHJldDsKKwlFeHByZXNzaW9uIGV4cHI7CisJQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHR5cGVEZWNsOworCU1vZGlmaWVySG9sZGVyIG1vZGlmaWVyOworfQoreworICAgIHRyeSB7CisgICAgICAgICggTE9PS0FIRUFEKCBNb2RpZmllcnMoKSAoImNsYXNzIiB8ICJpbnRlcmZhY2UiKSApCisgICAgICAgICAgICBtb2RpZmllciA9IE1vZGlmaWVycygpCisgICAgICAgICAgICB0eXBlRGVjbCA9IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihtb2RpZmllcikgeyByZXQgPSBuZXcgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdChyYW5nZSh0eXBlRGVjbCwgdG9rZW4oKSksIHR5cGVEZWNsKTsgfQorICAgICAgICB8IExPT0tBSEVBRChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgIGV4cHIgPSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpICI7IgorICAgICAgICAgICAgeyByZXQgPSBuZXcgRXhwcmVzc2lvblN0bXQocmFuZ2UoZXhwciwgdG9rZW4oKSksIGV4cHIpOyB9IAorICAgICAgICB8CisgICAgICAgICAgICByZXQgPSBTdGF0ZW1lbnQoKQorICAgICAgICApCisgICAgICAgIHsgcmV0dXJuIHJldDsgfQorICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgVG9rZW5SYW5nZSBlcnJvclJhbmdlID0gcmVjb3ZlcihTRU1JQ09MT04sIGUpOworICAgICAgICByZXR1cm4gbmV3IFVucGFyc2FibGVTdG10KGVycm9yUmFuZ2UpOworICAgIH0KK30KKworVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKToKK3sKKwlNb2RpZmllckhvbGRlciBtb2RpZmllcjsKKwlUeXBlIHBhcnRpYWxUeXBlOworCU5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzID0gbmV3IE5vZGVMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4oKTsKKwlWYXJpYWJsZURlY2xhcmF0b3IgdmFyOworfQoreworICAgIG1vZGlmaWVyID0gTW9kaWZpZXJzKCkgcGFydGlhbFR5cGUgPSBUeXBlKGVtcHR5TGlzdCgpKSB2YXIgPSBWYXJpYWJsZURlY2xhcmF0b3IocGFydGlhbFR5cGUpIHsgdmFyaWFibGVzLmFkZCh2YXIpOyB9ICggIiwiIHZhciA9IFZhcmlhYmxlRGVjbGFyYXRvcihwYXJ0aWFsVHlwZSkgeyB2YXJpYWJsZXMuYWRkKHZhcik7IH0gKSoKKyAgICB7CisgICAgICAgIEphdmFUb2tlbiBiZWdpbj1vcklmSW52YWxpZChtb2RpZmllci5iZWdpbiwgcGFydGlhbFR5cGUpOworICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdmFyaWFibGVzKTsKKyAgICB9Cit9CisKK0VtcHR5U3RtdCBFbXB0eVN0YXRlbWVudCgpOgore30KK3sKKyAgICAiOyIKKyAgICB7IHJldHVybiBuZXcgRW1wdHlTdG10KHRva2VuUmFuZ2UoKSk7IH0KK30KKworU3RhdGVtZW50IExhbWJkYUJvZHkoKToKK3sKKyAgICBFeHByZXNzaW9uIGV4cHI7CisgICAgU3RhdGVtZW50IG4gPSBudWxsOworfQoreworICAgICgKKyAgICAgICAgZXhwciA9IEV4cHJlc3Npb24oKSB7IG4gPSBuZXcgRXhwcmVzc2lvblN0bXQocmFuZ2UoZXhwciwgdG9rZW4oKSksIGV4cHIpOyB9CisgICAgICAgIHwgIAorICAgICAgICBuID0gQmxvY2soKQorICAgICkKKyAgICB7IHJldHVybiBuOyB9Cit9CisKK0V4cHJlc3Npb25TdG10IFN0YXRlbWVudEV4cHJlc3Npb24oKToKKy8qCisgKiBUaGUgbGFzdCBleHBhbnNpb24gb2YgdGhpcyBwcm9kdWN0aW9uIGFjY2VwdHMgbW9yZSB0aGFuIHRoZSBsZWdhbAorICogSmF2YSBleHBhbnNpb25zIGZvciBTdGF0ZW1lbnRFeHByZXNzaW9uLiAgVGhpcyBleHBhbnNpb24gZG9lcyBub3QKKyAqIHVzZSBQb3N0Zml4RXhwcmVzc2lvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAqLworeworCUV4cHJlc3Npb24gZXhwcjsKKwlBc3NpZ25FeHByLk9wZXJhdG9yIG9wOworCUV4cHJlc3Npb24gdmFsdWU7CisJUmFuZ2VkTGlzdDxUeXBlPiB0eXBlQXJncyA9IG5ldyBSYW5nZWRMaXN0PFR5cGU+KG51bGwpOworCVN0YXRlbWVudCBsYW1iZGFCb2R5OworfQoreworICAgICggTE9PS0FIRUFEKDIpCisgICAgICAgIGV4cHIgPSBQcmVJbmNyZW1lbnRFeHByZXNzaW9uKCkKKyAgICAgICAgfAorICAgICAgICBleHByID0gUHJlRGVjcmVtZW50RXhwcmVzc2lvbigpCisgICAgICAgIHwKKyAgICAgICAgZXhwciA9IFByaW1hcnlFeHByZXNzaW9uKCkKKyAgICAgICAgWworICAgICAgICAgICAgIisrIiB7IGV4cHIgPSBuZXcgVW5hcnlFeHByKHJhbmdlKGV4cHIsIHRva2VuKCkpLCBleHByLCBVbmFyeUV4cHIuT3BlcmF0b3IuUE9TVEZJWF9JTkNSRU1FTlQpOyAgfQorICAgICAgICAgICAgfAorICAgICAgICAgICAgIi0tIiB7IGV4cHIgPSBuZXcgVW5hcnlFeHByKHJhbmdlKGV4cHIsIHRva2VuKCkpLCBleHByLCBVbmFyeUV4cHIuT3BlcmF0b3IuUE9TVEZJWF9ERUNSRU1FTlQpOyAgfQorICAgICAgICAgICAgfAorICAgICAgICAgICAgb3AgPSBBc3NpZ25tZW50T3BlcmF0b3IoKSB2YWx1ZSA9IEV4cHJlc3Npb24oKSB7IGV4cHIgPSBuZXcgQXNzaWduRXhwcihyYW5nZShleHByLCB0b2tlbigpKSwgZXhwciwgdmFsdWUsIG9wKTsgfQorICAgICAgICBdCisgICAgKQorICAgICI7IgorICAgIHsgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RtdChyYW5nZShleHByLCB0b2tlbigpKSwgZXhwcik7IH0KK30KKworU3dpdGNoU3RtdCBTd2l0Y2hTdGF0ZW1lbnQoKToKK3sKKwlFeHByZXNzaW9uIHNlbGVjdG9yOworCVN3aXRjaEVudHJ5U3RtdCBlbnRyeTsKKwlOb2RlTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMgPSBlbXB0eUxpc3QoKTsKKwlKYXZhVG9rZW4gYmVnaW47Cit9Cit7CisgICJzd2l0Y2giIHtiZWdpbj10b2tlbigpO30gIigiIHNlbGVjdG9yID0gRXhwcmVzc2lvbigpICIpIiAieyIKKyAgICAoIGVudHJ5ID0gU3dpdGNoRW50cnkoKSB7IGVudHJpZXMgPSBhZGQoZW50cmllcywgZW50cnkpOyB9ICkqCisgICJ9IgorCisgIHsgcmV0dXJuIG5ldyBTd2l0Y2hTdG10KHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgc2VsZWN0b3IsIGVudHJpZXMpOyB9Cit9CisKK1N3aXRjaEVudHJ5U3RtdCBTd2l0Y2hFbnRyeSgpOgoreworCUV4cHJlc3Npb24gbGFiZWwgPSBudWxsOworCU5vZGVMaXN0PFN0YXRlbWVudD4gc3RtdHM7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAoCisJICAiY2FzZSIge2JlZ2luPXRva2VuKCk7fSBsYWJlbCA9IEV4cHJlc3Npb24oKQorCXwKKwkgICJkZWZhdWx0IiB7YmVnaW49dG9rZW4oKTt9CisgICkKKyAgIjoiIHN0bXRzID0gU3RhdGVtZW50cygpCisKKyAgeyByZXR1cm4gbmV3IFN3aXRjaEVudHJ5U3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksbGFiZWwsIHN0bXRzKTsgfQorfQorCitJZlN0bXQgSWZTdGF0ZW1lbnQoKToKKy8qCisgKiBUaGUgZGlzYW1iaWd1YXRpbmcgYWxnb3JpdGhtIG9mIEphdmFDQyBhdXRvbWF0aWNhbGx5IGJpbmRzIGRhbmdsaW5nCisgKiBlbHNlJ3MgdG8gdGhlIGlubmVybW9zdCBpZiBzdGF0ZW1lbnQuICBUaGUgTE9PS0FIRUFEIHNwZWNpZmljYXRpb24KKyAqIGlzIHRvIHRlbGwgSmF2YUNDIHRoYXQgd2Uga25vdyB3aGF0IHdlIGFyZSBkb2luZy4KKyAqLworeworCUV4cHJlc3Npb24gY29uZGl0aW9uOworCVN0YXRlbWVudCB0aGVuU3RtdDsKKwlTdGF0ZW1lbnQgZWxzZVN0bXQgPSBudWxsOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgImlmIiB7YmVnaW49dG9rZW4oKTt9ICIoIiBjb25kaXRpb24gPSBFeHByZXNzaW9uKCkgIikiIHt9IHRoZW5TdG10ID0gU3RhdGVtZW50KCkgWyBMT09LQUhFQUQoMSkgImVsc2UiIHt9IGVsc2VTdG10ID0gU3RhdGVtZW50KCkgXQorICB7IAorICAgICAgcmV0dXJuIG5ldyBJZlN0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBjb25kaXRpb24sIHRoZW5TdG10LCBlbHNlU3RtdCk7CisgIH0KK30KKworV2hpbGVTdG10IFdoaWxlU3RhdGVtZW50KCk6Cit7CisJRXhwcmVzc2lvbiBjb25kaXRpb247CisJU3RhdGVtZW50IGJvZHk7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAid2hpbGUiIHtiZWdpbj10b2tlbigpO30gIigiIGNvbmRpdGlvbiA9IEV4cHJlc3Npb24oKSAiKSIgYm9keSA9IFN0YXRlbWVudCgpCisgIHsgcmV0dXJuIG5ldyBXaGlsZVN0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLGNvbmRpdGlvbiwgYm9keSk7IH0KK30KKworRG9TdG10IERvU3RhdGVtZW50KCk6Cit7CisJRXhwcmVzc2lvbiBjb25kaXRpb247CisJU3RhdGVtZW50IGJvZHk7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAiZG8iIHtiZWdpbj10b2tlbigpO30gYm9keSA9IFN0YXRlbWVudCgpICJ3aGlsZSIgIigiIGNvbmRpdGlvbiA9IEV4cHJlc3Npb24oKSAiKSIgIjsiCisgIHsgcmV0dXJuIG5ldyBEb1N0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLGJvZHksIGNvbmRpdGlvbik7IH0KK30KKworU3RhdGVtZW50IEZvclN0YXRlbWVudCgpOgoreworCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhckV4cHIgPSBudWxsOworCUV4cHJlc3Npb24gZXhwciA9IG51bGw7CisJTm9kZUxpc3Q8RXhwcmVzc2lvbj4gaW5pdCA9IGVtcHR5TGlzdCgpOworCU5vZGVMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSA9IGVtcHR5TGlzdCgpOworCVN0YXRlbWVudCBib2R5OworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgImZvciIge2JlZ2luPXRva2VuKCk7fSAiKCIKKworICAoCisgICAgICBMT09LQUhFQUQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKSAiOiIpCisgICAgICB2YXJFeHByID0gVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKSAiOiIgZXhwciA9IEV4cHJlc3Npb24oKQorICAgIHwKKyAgICAgWyBpbml0ID0gRm9ySW5pdCgpIF0gIjsiIFsgZXhwciA9IEV4cHJlc3Npb24oKSBdICI7IiBbIHVwZGF0ZSA9IEZvclVwZGF0ZSgpIF0KKyAgKQorCisgICIpIiBib2R5ID0gU3RhdGVtZW50KCkKKworICB7CisgIAlpZiAodmFyRXhwciAhPSBudWxsKSB7CisgIAkJcmV0dXJuIG5ldyBGb3JlYWNoU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksdmFyRXhwciwgZXhwciwgYm9keSk7CisgIAl9CisJcmV0dXJuIG5ldyBGb3JTdG10KHJhbmdlKGJlZ2luLCB0b2tlbigpKSxpbml0LCBleHByLCB1cGRhdGUsIGJvZHkpOworICB9Cit9CisKK05vZGVMaXN0PEV4cHJlc3Npb24+IEZvckluaXQoKToKK3sKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiByZXQ7CisJRXhwcmVzc2lvbiBleHByOworfQoreworICAoCisJICBMT09LQUhFQUQoIE1vZGlmaWVycygpIFR5cGUoKSBJZGVudGlmaWVyKCkgKQorCSAgZXhwciA9IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCkgeyByZXQgPSBuZXcgTm9kZUxpc3Q8RXhwcmVzc2lvbj4oKTsgcmV0LmFkZChleHByKTsgfQorCXwKKwkgIHJldCA9IEV4cHJlc3Npb25MaXN0KCkKKyAgKQorICB7IHJldHVybiByZXQ7IH0KK30KKworTm9kZUxpc3Q8RXhwcmVzc2lvbj4gRXhwcmVzc2lvbkxpc3QoKToKK3sKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiByZXQgPSBuZXcgTm9kZUxpc3Q8RXhwcmVzc2lvbj4oKTsKKwlFeHByZXNzaW9uIGV4cHI7Cit9Cit7CisgIGV4cHIgPSBFeHByZXNzaW9uKCkgeyByZXQuYWRkKGV4cHIpOyB9ICggIiwiIGV4cHIgPSBFeHByZXNzaW9uKCkgIHsgcmV0LmFkZChleHByKTsgfSApKgorCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitOb2RlTGlzdDxFeHByZXNzaW9uPiBGb3JVcGRhdGUoKToKK3sKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiByZXQ7Cit9Cit7CisgIHJldCA9IEV4cHJlc3Npb25MaXN0KCkKKworICB7IHJldHVybiByZXQ7IH0KK30KKworQnJlYWtTdG10IEJyZWFrU3RhdGVtZW50KCk6Cit7CisJU2ltcGxlTmFtZSBsYWJlbCA9IG51bGw7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAiYnJlYWsiIHtiZWdpbj10b2tlbigpO30gWyBsYWJlbCA9IFNpbXBsZU5hbWUoKSBdICI7IgorICB7IHJldHVybiBuZXcgQnJlYWtTdG10KHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbGFiZWwpOyB9Cit9CisKK0NvbnRpbnVlU3RtdCBDb250aW51ZVN0YXRlbWVudCgpOgoreworCVNpbXBsZU5hbWUgbGFiZWwgPSBudWxsOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgImNvbnRpbnVlIiB7YmVnaW49dG9rZW4oKTt9IFsgbGFiZWwgPSBTaW1wbGVOYW1lKCkgXSAiOyIKKyAgeyByZXR1cm4gbmV3IENvbnRpbnVlU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksIGxhYmVsKTsgfQorfQorCitSZXR1cm5TdG10IFJldHVyblN0YXRlbWVudCgpOgoreworCUV4cHJlc3Npb24gZXhwciA9IG51bGw7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAicmV0dXJuIiB7YmVnaW49dG9rZW4oKTt9IFsgZXhwciA9IEV4cHJlc3Npb24oKSBdICI7IgorICB7IHJldHVybiBuZXcgUmV0dXJuU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksZXhwcik7IH0KK30KKworVGhyb3dTdG10IFRocm93U3RhdGVtZW50KCk6Cit7CisJRXhwcmVzc2lvbiBleHByOworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgInRocm93IiB7YmVnaW49dG9rZW4oKTt9IGV4cHIgPSBFeHByZXNzaW9uKCkgIjsiCisgIHsgcmV0dXJuIG5ldyBUaHJvd1N0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLGV4cHIpOyB9Cit9CisKK1N5bmNocm9uaXplZFN0bXQgU3luY2hyb25pemVkU3RhdGVtZW50KCk6Cit7CisJRXhwcmVzc2lvbiBleHByOworCUJsb2NrU3RtdCBib2R5OworCUphdmFUb2tlbiBiZWdpbjsKK30KK3sKKyAgInN5bmNocm9uaXplZCIge2JlZ2luPXRva2VuKCk7fSAiKCIgZXhwciA9IEV4cHJlc3Npb24oKSAiKSIgYm9keSA9IEJsb2NrKCkKKyAgeyByZXR1cm4gbmV3IFN5bmNocm9uaXplZFN0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLGV4cHIsIGJvZHkpOyB9Cit9CisKK1RyeVN0bXQgVHJ5U3RhdGVtZW50KCk6Cit7CisJTm9kZUxpc3Q8RXhwcmVzc2lvbj4gcmVzb3VyY2VzID0gZW1wdHlMaXN0KCk7CisJQmxvY2tTdG10IHRyeUJsb2NrOworCUJsb2NrU3RtdCBmaW5hbGx5QmxvY2sgPSBudWxsOworCU5vZGVMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaHMgPSBlbXB0eUxpc3QoKTsKKwlCbG9ja1N0bXQgY2F0Y2hCbG9jazsKKwlNb2RpZmllckhvbGRlciBleGNlcHRNb2RpZmllcjsKKwlSZWZlcmVuY2VUeXBlIGV4Y2VwdGlvblR5cGU7CisJTm9kZUxpc3Q8UmVmZXJlbmNlVHlwZT4gZXhjZXB0aW9uVHlwZXMgPSBlbXB0eUxpc3QoKTsKKwlQYWlyPFNpbXBsZU5hbWUsIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4+IGV4Y2VwdElkOworCUphdmFUb2tlbiBiZWdpbjsKKwlKYXZhVG9rZW4gY2F0Y2hCZWdpbjsKKwlKYXZhVG9rZW4gdHlwZXNCZWdpbjsKKwlKYXZhVG9rZW4gcGFyYW1FbmQ7CisJVHlwZSB0eXBlOworfQoreworICAidHJ5IiB7YmVnaW49dG9rZW4oKTt9CisgIChyZXNvdXJjZXMgPSBSZXNvdXJjZVNwZWNpZmljYXRpb24oKSk/CisgIHRyeUJsb2NrID0gQmxvY2soKQorICAoCisgICAgICAgIExPT0tBSEVBRCgyKQorICAJCSgKKyAgCQkJImNhdGNoIiB7Y2F0Y2hCZWdpbj10b2tlbigpO30KKyAgCQkJIigiIHsgdHlwZXNCZWdpbj10b2tlbigpOyB9CisgIAkJCWV4Y2VwdE1vZGlmaWVyID0gTW9kaWZpZXJzKCkgZXhjZXB0aW9uVHlwZSA9IFJlZmVyZW5jZVR5cGUoZW1wdHlMaXN0KCkpIHsgZXhjZXB0aW9uVHlwZXMuYWRkKGV4Y2VwdGlvblR5cGUpOyB9CisgIAkJCSggInwiIGV4Y2VwdGlvblR5cGUgPSBBbm5vdGF0ZWRSZWZlcmVuY2VUeXBlKCkgeyBleGNlcHRpb25UeXBlcy5hZGQoZXhjZXB0aW9uVHlwZSk7IH0gKSoKKyAgCQkJZXhjZXB0SWQgPSBWYXJpYWJsZURlY2xhcmF0b3JJZCgpIHsgcGFyYW1FbmQgPSB0b2tlbigpOyB9CisgIAkJCSIpIgorICAJCQkgCisgIAkJCWNhdGNoQmxvY2sgPSBCbG9jaygpCisgIAkJCXsKKyAgCQkJICAgIGlmIChleGNlcHRpb25UeXBlcy5zaXplKCkgPiAxKSB7CisgIAkJCSAgICAgICAgdHlwZSA9IG5ldyBVbmlvblR5cGUocmFuZ2UoZXhjZXB0aW9uVHlwZXMuZ2V0KDApLCBleGNlcHRpb25UeXBlcy5nZXQoZXhjZXB0aW9uVHlwZXMuc2l6ZSgpIC0gMSkpLCBleGNlcHRpb25UeXBlcyk7CisgIAkJCSAgICB9IGVsc2UgeworICAJCQkgICAgICAgIHR5cGUgPSAoVHlwZSlleGNlcHRpb25UeXBlcy5nZXQoMCk7CisgIAkJCSAgICB9CisJCQkJUGFyYW1ldGVyIGNhdGNoVHlwZSA9IG5ldyBQYXJhbWV0ZXIocmFuZ2UodHlwZSwgcGFyYW1FbmQpLCBleGNlcHRNb2RpZmllci5tb2RpZmllcnMsIGV4Y2VwdE1vZGlmaWVyLmFubm90YXRpb25zLCB0eXBlLCBmYWxzZSwgZW1wdHlMaXN0KCksIGV4Y2VwdElkLmEpOworICAJCQkgICAgY2F0Y2hzID0gYWRkKGNhdGNocywgbmV3IENhdGNoQ2xhdXNlKHJhbmdlKGNhdGNoQmVnaW4sIHRva2VuKCkpLCBjYXRjaFR5cGUsIGNhdGNoQmxvY2spKTsKKyAgCQkJICAgIGV4Y2VwdGlvblR5cGVzID0gZW1wdHlMaXN0KCk7IH0KKyAgCQkpKgorICAJCVsgImZpbmFsbHkiIGZpbmFsbHlCbG9jayA9IEJsb2NrKCkgXQorICAJfAorICAJCSJmaW5hbGx5IiBmaW5hbGx5QmxvY2sgPSBCbG9jaygpCisgICkKKyAgeyByZXR1cm4gbmV3IFRyeVN0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCByZXNvdXJjZXMsIHRyeUJsb2NrLCBjYXRjaHMsIGZpbmFsbHlCbG9jayk7IH0KK30KKworCitOb2RlTGlzdDxFeHByZXNzaW9uPiBSZXNvdXJjZVNwZWNpZmljYXRpb24oKSA6Cit7CisgIE5vZGVMaXN0PEV4cHJlc3Npb24+IHZhcmlhYmxlczsKK30KK3sKKyAgIigiCisgIHZhcmlhYmxlcyA9IFJlc291cmNlcygpCisgIChMT09LQUhFQUQoMikgIjsiKT8KKyAgIikiCisgIHsgcmV0dXJuIHZhcmlhYmxlczsgfQorfQorCisKK05vZGVMaXN0PEV4cHJlc3Npb24+IFJlc291cmNlcygpIDoKK3sKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IG5ldyBOb2RlTGlzdDxFeHByZXNzaW9uPigpOworCUV4cHJlc3Npb24gZXhwcjsKK30KK3sKKyAgICBleHByID0gUmVzb3VyY2UoKSB7ZXhwcmVzc2lvbnMuYWRkKGV4cHIpO30gKExPT0tBSEVBRCgyKSAiOyIgZXhwciA9IFJlc291cmNlKCkge2V4cHJlc3Npb25zLmFkZChleHByKTt9KSoKKyAgICB7IHJldHVybiBleHByZXNzaW9uczsgfQorfQorCitFeHByZXNzaW9uIFJlc291cmNlKCkgOgoreworCUV4cHJlc3Npb24gZXhwcjsKK30KK3sKKyAgICAoIExPT0tBSEVBRCggTW9kaWZpZXJzKCkgcGFydGlhbFR5cGUgPSBUeXBlKCkgVmFyaWFibGVEZWNsYXJhdG9yKHBhcnRpYWxUeXBlKSkKKyAgICAgICAgLyp0aGlzIGlzIGEgYml0IG1vcmUgbGVuaWVudCB0aGFuIHdlIG5lZWQgdG8gYmUsIGVnIGFsbG93aW5nIGFjY2VzcyBtb2RpZmllcnMgbGlrZSBwcml2YXRlKi8KKyAgICAgICAgZXhwciA9IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCkKKyAgICB8CisgICAgICAgIGV4cHIgPSBQcmltYXJ5RXhwcmVzc2lvbigpCisgICAgKQorICAgIHsgcmV0dXJuIGV4cHI7IH0KK30KKworCisvKiBXZSB1c2UgcHJvZHVjdGlvbnMgdG8gbWF0Y2ggPj4+LCA+PiBhbmQgPiBzbyB0aGF0IHdlIGNhbiBrZWVwIHRoZQorICogdHlwZSBkZWNsYXJhdGlvbiBzeW50YXggd2l0aCBnZW5lcmljcyBjbGVhbgorICovCisKK3ZvaWQgUlVOU0lHTkVEU0hJRlQoKToKK3t9Cit7CisgICggTE9PS0FIRUFEKHsgZ2V0VG9rZW4oMSkua2luZCA9PSBHVCAmJgorICAgICAgICAgICAgICAgIGdldFRva2VuKDEpLnJlYWxLaW5kID09IFJVTlNJR05FRFNISUZUfSApCisgICAiPiIgIj4iICI+IgorICApCit9CisKK3ZvaWQgUlNJR05FRFNISUZUKCk6Cit7fQoreworICAoIExPT0tBSEVBRCh7IGdldFRva2VuKDEpLmtpbmQgPT0gR1QgJiYKKyAgICAgICAgICAgICAgICBnZXRUb2tlbigxKS5yZWFsS2luZCA9PSBSU0lHTkVEU0hJRlR9ICkKKyAgIj4iICI+IgorICApCit9CisKKy8qIEFubm90YXRpb24gc3ludGF4IGZvbGxvd3MuICovCisKK05vZGVMaXN0PEFubm90YXRpb25FeHByPiBBbm5vdGF0aW9ucygpOgoreworCU5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4oKTsKKwlBbm5vdGF0aW9uRXhwciBhbm5vdGF0aW9uOworfQoreworICAgKExPT0tBSEVBRCgiQCIpIGFubm90YXRpb24gPSBBbm5vdGF0aW9uKCkgIHthbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5ub3RhdGlvbik7fSApKgorICAgeyByZXR1cm4gYW5ub3RhdGlvbnM7IH0KK30KKworQW5ub3RhdGlvbkV4cHIgQW5ub3RhdGlvbigpOgoreworCUFubm90YXRpb25FeHByIHJldDsKKwlOYW1lIG5hbWU7CisJTm9kZUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycyA9IGVtcHR5TGlzdCgpOworCUphdmFUb2tlbiBiZWdpbjsKKwlFeHByZXNzaW9uIG1lbWJlclZhbDsKK30KK3sKKyAgICAiQCIgeyBiZWdpbj10b2tlbigpOyB9IG5hbWUgPSBOYW1lKCkKKyAgICAoCisgICAgICAgIExPT0tBSEVBRCggIigiICggSWRlbnRpZmllcigpICI9IiB8ICIpIiApKQorICAgICAgICAiKCIgWyBwYWlycyA9IE1lbWJlclZhbHVlUGFpcnMoKSBdICIpIgorICAgICAgICB7IHJldCA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uRXhwcihyYW5nZShiZWdpbiwgdG9rZW4oKSksIG5hbWUsIHBhaXJzKTsgfQorICAgIHwKKyAgICAgICAgTE9PS0FIRUFEKCAiKCIgKQorICAgICAgICAiKCIgbWVtYmVyVmFsID0gTWVtYmVyVmFsdWUoKSAiKSIKKyAgICAgICAgeyByZXQgPSBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBuYW1lLCBtZW1iZXJWYWwpOyB9CisgICAgfAorICAgICAgICB7IHJldCA9IG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihyYW5nZShiZWdpbiwgdG9rZW4oKSksIG5hbWUpOyB9CisgICAgKQorICAgIHsgcmV0dXJuIHJldDsgfQorfQorCitOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IE1lbWJlclZhbHVlUGFpcnMoKToKK3sKKwlOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHJldCA9IG5ldyBOb2RlTGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7CisJTWVtYmVyVmFsdWVQYWlyIHBhaXI7Cit9Cit7CisgICBwYWlyID0gTWVtYmVyVmFsdWVQYWlyKCkgeyByZXQuYWRkKHBhaXIpOyB9ICggIiwiIHBhaXIgPSBNZW1iZXJWYWx1ZVBhaXIoKSB7IHJldC5hZGQocGFpcik7IH0gKSoKKyAgIHsgcmV0dXJuIHJldDsgfQorfQorCitNZW1iZXJWYWx1ZVBhaXIgTWVtYmVyVmFsdWVQYWlyKCk6Cit7CisJU2ltcGxlTmFtZSBuYW1lOworCUV4cHJlc3Npb24gdmFsdWU7CisJSmF2YVRva2VuIGJlZ2luOworfQoreworICAgIG5hbWUgPSBTaW1wbGVOYW1lKCkgeyBiZWdpbj10b2tlbigpO30gIj0iIHZhbHVlID0gTWVtYmVyVmFsdWUoKQorICAgIHsgcmV0dXJuIG5ldyBNZW1iZXJWYWx1ZVBhaXIocmFuZ2UoYmVnaW4sIHRva2VuKCkpLG5hbWUsIHZhbHVlKTsgfQorfQorCitFeHByZXNzaW9uIE1lbWJlclZhbHVlKCk6Cit7CisJRXhwcmVzc2lvbiByZXQ7Cit9Cit7CisgICggTE9PS0FIRUFEKCJAIikKKwkgICByZXQgPSBBbm5vdGF0aW9uKCkKKwkgfAorCSAgIHJldCA9IE1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplcigpCisJIHwKKwkgICByZXQgPSBDb25kaXRpb25hbEV4cHJlc3Npb24oKQorICApCisgIHsgcmV0dXJuIHJldDsgfQorfQorCitFeHByZXNzaW9uICBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKToKK3sKKwlOb2RlTGlzdDxFeHByZXNzaW9uPiByZXQgPSBlbXB0eUxpc3QoKTsKKwlFeHByZXNzaW9uIG1lbWJlcjsKKwlKYXZhVG9rZW4gYmVnaW47Cit9Cit7CisgICJ7IiB7YmVnaW49dG9rZW4oKTt9CisgICgJbWVtYmVyID0gTWVtYmVyVmFsdWUoKSB7IHJldC5hZGQobWVtYmVyKTsgfSAoIExPT0tBSEVBRCgyKSAiLCIgbWVtYmVyID0gTWVtYmVyVmFsdWUoKSB7IHJldC5hZGQobWVtYmVyKTsgfSApKiAgKT8gWyAiLCIgXQorICAifSIKKyAgeyByZXR1cm4gbmV3IEFycmF5SW5pdGlhbGl6ZXJFeHByKHJhbmdlKGJlZ2luLCB0b2tlbigpKSxyZXQpOyB9Cit9CisKKworLyogQW5ub3RhdGlvbiBUeXBlcy4gKi8KKworQW5ub3RhdGlvbkRlY2xhcmF0aW9uIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24oTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXIpOgoreworCVNpbXBsZU5hbWUgbmFtZTsKKyAgICBOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBlbXB0eUxpc3QoKTsKKwlKYXZhVG9rZW4gYmVnaW4gPSBtb2RpZmllci5iZWdpbjsKK30KK3sKKyAgIkAiIHsgYmVnaW49b3JJZkludmFsaWQoYmVnaW4sIHRva2VuKCkpOyB9CisgICJpbnRlcmZhY2UiIG5hbWUgPSBTaW1wbGVOYW1lKCkgbWVtYmVycyA9IEFubm90YXRpb25UeXBlQm9keSgpCisgIHsgCisgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25EZWNsYXJhdGlvbihyYW5nZShiZWdpbiwgdG9rZW4oKSksIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIG5hbWUsIG1lbWJlcnMpOworICB9Cit9CisKK05vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gQW5ub3RhdGlvblR5cGVCb2R5KCk6Cit7CisJTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiByZXQgPSBlbXB0eUxpc3QoKTsKKwlCb2R5RGVjbGFyYXRpb24gbWVtYmVyOworfQoreworICAgICJ7IiAoIAorICAgICAgICBtZW1iZXIgPSBBbm5vdGF0aW9uQm9keURlY2xhcmF0aW9uKCkgeyByZXQgPSBhZGRXaGVuTm90TnVsbChyZXQsIG1lbWJlcik7IH0KKyAgICB8CisgICAgICAgICI7IgorICAgICkqICJ9IgorICAgIHsgcmV0dXJuIHJldDsgfQorfQorCitCb2R5RGVjbGFyYXRpb248Pz4gQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvbigpOgoreworICAgTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXI7CisgICBCb2R5RGVjbGFyYXRpb24gcmV0OworfQoreworICAoCisgICAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKQorICAgICgKKwkgICBMT09LQUhFQUQoVHlwZSgpIElkZW50aWZpZXIoKSAiKCIpCisJICAgcmV0ID0gQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbihtb2RpZmllcikKKwkgIHwKKwkgICByZXQgPSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24obW9kaWZpZXIpCisJICB8IExPT0tBSEVBRCgiZW51bSIpCisJICAgcmV0ID0gRW51bURlY2xhcmF0aW9uKG1vZGlmaWVyKQorCSAgfAorCSAgIHJldCA9IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24obW9kaWZpZXIpCisJICB8CisJICAgcmV0ID0gRmllbGREZWNsYXJhdGlvbihtb2RpZmllcikKKyAgICApCisgICkKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKK0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKE1vZGlmaWVySG9sZGVyIG1vZGlmaWVyKToKK3sKKwlUeXBlIHR5cGU7CisJU2ltcGxlTmFtZSBuYW1lOworCUV4cHJlc3Npb24gZGVmYXVsdFZhbCA9IG51bGw7Cit9Cit7CisgIHR5cGUgPSBUeXBlKGVtcHR5TGlzdCgpKSBuYW1lID0gU2ltcGxlTmFtZSgpICIoIiAiKSIgWyBkZWZhdWx0VmFsID0gRGVmYXVsdFZhbHVlKCkgXSAiOyIKKworICB7CisJSmF2YVRva2VuIGJlZ2luID0gb3JJZkludmFsaWQobW9kaWZpZXIuYmVnaW4sIHR5cGUpOworICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZSwgbmFtZSwgZGVmYXVsdFZhbCk7CisgIH0KK30KKworRXhwcmVzc2lvbiBEZWZhdWx0VmFsdWUoKToKK3sKKwlFeHByZXNzaW9uIHJldDsKK30KK3sKKyAgImRlZmF1bHQiIHJldCA9IE1lbWJlclZhbHVlKCkKKyAgeyByZXR1cm4gcmV0OyB9Cit9CisKKy8qIE1vZHVsZSBzeW50YXggZm9sbG93cyAqLworCisKK01vZHVsZVN0bXQgTW9kdWxlU3RtdCgpOgoreworICAgIE1vZGlmaWVySG9sZGVyIG1vZGlmaWVyczsKKyAgICBOYW1lIG5hbWU7CisgICAgTmFtZSB0bXBOYW1lOworICAgIE5vZGVMaXN0PE5hbWU+IG5hbWVzPWVtcHR5TGlzdCgpOworICAgIFR5cGUgdHlwZTsKKyAgICBUeXBlIHRtcFR5cGU7CisgICAgTm9kZUxpc3Q8VHlwZT4gdHlwZXM9ZW1wdHlMaXN0KCk7CisgICAgSmF2YVRva2VuIGJlZ2luOworICAgIE1vZHVsZVN0bXQgc3RtdD1uZXcgTW9kdWxlUmVxdWlyZXNTdG10KCk7CisgICAgSmF2YVRva2VuIHRyYW5zaXRpdmVFeGNlcHRpb25hbFRva2VuOworfQoreworICAgICgKKyAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgZm9yIHRoZSBlZGdlIGNhc2UgInJlcXVpcmVzIHRyYW5zaXRpdmU7IiB3aGljaCBpcyBzdXBwb3NlZCB0byBtZWFuICJyZXF1aXJlIHRoZSBtb2R1bGUgbmFtZWQgJ3RyYW5zaXRpdmUnIiAKKyAgICAgICAgTE9PS0FIRUFEKDxSRVFVSVJFUz4gPFRSQU5TSVRJVkU+ICI7IikKKyAgICAgICAgPFJFUVVJUkVTPiB7YmVnaW49dG9rZW4oKTt9IDxUUkFOU0lUSVZFPiB7dHJhbnNpdGl2ZUV4Y2VwdGlvbmFsVG9rZW49dG9rZW4oKTsgc2V0VG9rZW5LaW5kKElERU5USUZJRVIpO30gIjsiIHtzdG10PW5ldyBNb2R1bGVSZXF1aXJlc1N0bXQocmFuZ2UoYmVnaW4sIHRva2VuKCkpLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIG5ldyBOYW1lKHJhbmdlKHRyYW5zaXRpdmVFeGNlcHRpb25hbFRva2VuLCB0cmFuc2l0aXZlRXhjZXB0aW9uYWxUb2tlbiksIG51bGwsIHRyYW5zaXRpdmVFeGNlcHRpb25hbFRva2VuLmdldFRleHQoKSwgbmV3IE5vZGVMaXN0PEFubm90YXRpb25FeHByPigpKSk7fQorICAgIHwKKyAgICAgICAgPFJFUVVJUkVTPiB7YmVnaW49dG9rZW4oKTt9IG1vZGlmaWVycz1Nb2RpZmllcnMoKSBuYW1lPU5hbWUoKSAiOyIge3N0bXQ9bmV3IE1vZHVsZVJlcXVpcmVzU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksIG1vZGlmaWVycy5tb2RpZmllcnMsIG5hbWUpO30KKyAgICB8CisgICAgICAgIDxFWFBPUlRTPiB7YmVnaW49dG9rZW4oKTt9IG5hbWU9TmFtZSgpIFs8VE8+IHRtcE5hbWU9TmFtZSgpIHtuYW1lcy5hZGQodG1wTmFtZSk7fSAoIiwiIHRtcE5hbWU9TmFtZSgpe25hbWVzLmFkZCh0bXBOYW1lKTt9ICkqIF0gIjsiIHtzdG10PW5ldyBNb2R1bGVFeHBvcnRzU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksIG5hbWUsIG5hbWVzKTt9CisgICAgfAorICAgICAgICA8T1BFTlM+IHtiZWdpbj10b2tlbigpO30gbmFtZT1OYW1lKCkgWzxUTz4gdG1wTmFtZT1OYW1lKCkge25hbWVzLmFkZCh0bXBOYW1lKTt9ICgiLCIgdG1wTmFtZT1OYW1lKCl7bmFtZXMuYWRkKHRtcE5hbWUpO30gKSogXSAiOyIge3N0bXQ9bmV3IE1vZHVsZU9wZW5zU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksIG5hbWUsIG5hbWVzKTt9CisgICAgfAorICAgICAgICA8VVNFUz4geyBiZWdpbj10b2tlbigpO30gdHlwZT1UeXBlKGVtcHR5TGlzdCgpKSAiOyIge3N0bXQ9bmV3IE1vZHVsZVVzZXNTdG10KHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgdHlwZSk7fQorICAgIHwKKyAgICAgICAgPFBST1ZJREVTPiB7IGJlZ2luPXRva2VuKCk7fSB0eXBlPVR5cGUoZW1wdHlMaXN0KCkpIDxXSVRIPiB0bXBUeXBlPVR5cGUoZW1wdHlMaXN0KCkpIHt0eXBlcy5hZGQodG1wVHlwZSk7fSAoIiwiIHRtcFR5cGU9VHlwZShlbXB0eUxpc3QoKSkge3R5cGVzLmFkZCh0bXBUeXBlKTt9ICApKiAiOyIge3N0bXQ9bmV3IE1vZHVsZVByb3ZpZGVzU3RtdChyYW5nZShiZWdpbiwgdG9rZW4oKSksIHR5cGUsIHR5cGVzKTt9CisgICAgKQorICAgIHsgcmV0dXJuIHN0bXQ7IH0KK30KKworTW9kdWxlRGVjbGFyYXRpb24gTW9kdWxlRGVjbGFyYXRpb24oTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXIpOgoreworICAgIE5vZGVMaXN0PE1vZHVsZVN0bXQ+IHN0YXRlbWVudHMgPSBuZXcgTm9kZUxpc3Q8TW9kdWxlU3RtdD4oKTsKKyAgICBib29sZWFuIG9wZW49ZmFsc2U7CisgICAgTW9kdWxlU3RtdCBzdDsKKyAgICBOYW1lIG5hbWU7CisgICAgSmF2YVRva2VuIGJlZ2luID0gbW9kaWZpZXIuYmVnaW47Cit9Cit7CisgICAgWyA8T1BFTj4ge29wZW49dHJ1ZTsgYmVnaW4gPSBvcklmSW52YWxpZChiZWdpbiwgdG9rZW4oKSk7fSBdCisgICAgPE1PRFVMRT4geyBiZWdpbiA9IG9ySWZJbnZhbGlkKGJlZ2luLCB0b2tlbigpKTsgfQorICAgIG5hbWUgPSBOYW1lKCkgInsiCisgICAgKCBzdCA9IE1vZHVsZVN0bXQoKSB7IHN0YXRlbWVudHMgPSBhZGQoc3RhdGVtZW50cywgc3QpOyB9ICkqCisgICAgIn0iCisgICAgeyByZXR1cm4gbmV3IE1vZHVsZURlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbigpKSwgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIG5hbWUsIG9wZW4sIHN0YXRlbWVudHMpOyB9Cit9CisKKy8qIFJ1bGVzIGZvciBtYXRjaGluZyBwYXJ0aWFsIGlucHV0cy4KK1RoZXNlIHJ1bGVzIGFyZSBuZWVkZWQgdG8gcHJvcGVybHkgdGVybWluYXRlIHRoZW0gLQoraWYgd2Ugc2ltcGx5IHVzZSB0aGUgdXN1YWwgcnVsZXMsIHRoZXkgd2lsbCBpZ25vcmUgZXZlcnl0aGluZyBpbiB0aGUgcHJvdmlkZXIKK2FmdGVyIHRoZXkgbWF0Y2hlZCB0aGVpciBkZXNpcmVkIGlucHV0LCB3aGljaCB3aWxsIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvdXIKKyovCisKKworQmxvY2tTdG10IEJsb2NrUGFyc2VTdGFydCgpOgoreyBCbG9ja1N0bXQgcmV0OyB9Cit7IHJldCA9IEJsb2NrKCkgPEVPRj4geyByZXR1cm4gcmV0OyB9IH0KKworU3RhdGVtZW50IEJsb2NrU3RhdGVtZW50UGFyc2VTdGFydCgpOgoreyBTdGF0ZW1lbnQgcmV0OyB9Cit7IChMT09LQUhFQUQoMykgcmV0ID0gQmxvY2tTdGF0ZW1lbnQoKXxyZXQgPSBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigpKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitJbXBvcnREZWNsYXJhdGlvbiBJbXBvcnREZWNsYXJhdGlvblBhcnNlU3RhcnQoKToKK3sgSW1wb3J0RGVjbGFyYXRpb24gcmV0OyB9Cit7IHJldCA9IEltcG9ydERlY2xhcmF0aW9uKCkgPEVPRj4geyByZXR1cm4gcmV0OyB9IH0KKworRXhwcmVzc2lvbiBFeHByZXNzaW9uUGFyc2VTdGFydCgpOgoreyBFeHByZXNzaW9uIHJldDsgfQoreyByZXQgPSBFeHByZXNzaW9uKCkgPEVPRj4geyByZXR1cm4gcmV0OyB9IH0KKworQW5ub3RhdGlvbkV4cHIgQW5ub3RhdGlvblBhcnNlU3RhcnQoKToKK3sgQW5ub3RhdGlvbkV4cHIgcmV0OyB9Cit7IHJldCA9IEFubm90YXRpb24oKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitCb2R5RGVjbGFyYXRpb248Pz4gQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvblBhcnNlU3RhcnQoKToKK3sgQm9keURlY2xhcmF0aW9uPD8+IHJldDsgfQoreyByZXQgPSBBbm5vdGF0aW9uQm9keURlY2xhcmF0aW9uKCkgPEVPRj4geyByZXR1cm4gcmV0OyB9IH0KKworQm9keURlY2xhcmF0aW9uPD8+IENsYXNzT3JJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb25QYXJzZVN0YXJ0KCk6Cit7IEJvZHlEZWNsYXJhdGlvbjw/PiByZXQ7IH0KK3sgcmV0ID0gQ2xhc3NPckludGVyZmFjZUJvZHlEZWNsYXJhdGlvbigpIDxFT0Y+IHsgcmV0dXJuIHJldDsgfSB9CisKK0NsYXNzT3JJbnRlcmZhY2VUeXBlIENsYXNzT3JJbnRlcmZhY2VUeXBlUGFyc2VTdGFydCgpOgoreyBDbGFzc09ySW50ZXJmYWNlVHlwZSByZXQ7IH0KK3sgcmV0ID0gQW5ub3RhdGVkQ2xhc3NPckludGVyZmFjZVR5cGUoKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitUeXBlIFJlc3VsdFR5cGVQYXJzZVN0YXJ0KCk6Cit7IE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsgVHlwZSByZXQ7IH0KK3sgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpIHJldCA9IFJlc3VsdFR5cGUoYW5ub3RhdGlvbnMpIDxFT0Y+IHsgcmV0dXJuIHJldDsgfSB9CisKK1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uUGFyc2VTdGFydCgpOgoreyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciByZXQ7IH0KK3sgcmV0ID0gVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25QYXJzZVN0YXJ0KCk6Cit7IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCByZXQ7IH0KK3sgcmV0ID0gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitOYW1lIE5hbWVQYXJzZVN0YXJ0KCk6Cit7IE5hbWUgcmV0OyB9Cit7IHJldCA9IE5hbWUoKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitTaW1wbGVOYW1lIFNpbXBsZU5hbWVQYXJzZVN0YXJ0KCk6Cit7IFNpbXBsZU5hbWUgcmV0OyB9Cit7IHJldCA9IFNpbXBsZU5hbWUoKSA8RU9GPiB7IHJldHVybiByZXQ7IH0gfQorCitQYXJhbWV0ZXIgUGFyYW1ldGVyUGFyc2VTdGFydCgpOgoreyBQYXJhbWV0ZXIgcmV0OyB9Cit7IHJldCA9IFBhcmFtZXRlcigpIDxFT0Y+IHsgcmV0dXJuIHJldDsgfSB9CisKK1BhY2thZ2VEZWNsYXJhdGlvbiBQYWNrYWdlRGVjbGFyYXRpb25QYXJzZVN0YXJ0KCk6Cit7IFBhY2thZ2VEZWNsYXJhdGlvbiByZXQ7IH0KK3sgcmV0ID0gUGFja2FnZURlY2xhcmF0aW9uKCkgPEVPRj4geyByZXR1cm4gcmV0OyB9IH0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3IuaW1sIGIvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci5pbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwZWM2MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3IuaW1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bW9kdWxlIG9yZy5qZXRicmFpbnMuaWRlYS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdHNNYW5hZ2VyLmlzTWF2ZW5Nb2R1bGU9InRydWUiIHR5cGU9IkpBVkFfTU9EVUxFIiB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJOZXdNb2R1bGVSb290TWFuYWdlciIgTEFOR1VBR0VfTEVWRUw9IkpES18xXzgiPgorICAgIDxvdXRwdXQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC9jbGFzc2VzIiAvPgorICAgIDxvdXRwdXQtdGVzdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L3Rlc3QtY2xhc3NlcyIgLz4KKyAgICA8Y29udGVudCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQiPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL21haW4vamF2YSIgaXNUZXN0U291cmNlPSJmYWxzZSIgLz4KKyAgICAgIDxleGNsdWRlRm9sZGVyIHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQiIC8+CisgICAgPC9jb250ZW50PgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImluaGVyaXRlZEpkayIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJzb3VyY2VGb2xkZXIiIGZvclRlc3RzPSJmYWxzZSIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUiIG1vZHVsZS1uYW1lPSJqYXZhcGFyc2VyLWNvcmUiIC8+CisgIDwvY29tcG9uZW50PgorPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3BvbS54bWwgYi9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3IvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFlNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3BvbS54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4xNi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3I8L2FydGlmYWN0SWQ+CisgICAgPGRlc2NyaXB0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVzIHRoZSBjb2RlIGluIHRoZSBqYXZhcGFyc2VyLW1ldGFtb2RlbCBtb2R1bGU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8IS0tIG5vIG5lZWQgdG8gcmVsZWFzZSB0aGlzIG1vZHVsZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJ1bi1tZXRhbW9kZWwtZ2VuZXJhdG9yPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtamF2YXBhcnNlci1tZXRhbW9kZWw8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphdmE8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoU2NvcGU+dGVzdDwvY2xhc3NwYXRoU2NvcGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5jb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLm1ldGFtb2RlbC5NZXRhTW9kZWxHZW5lcmF0b3I8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+JHtwcm9qZWN0LmJhc2VkaXJ9PC9hcmd1bWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL21ldGFtb2RlbC9Bc3RUeXBlQW5hbHlzaXMuamF2YSBiL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvbWV0YW1vZGVsL0FzdFR5cGVBbmFseXNpcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDFmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL21ldGFtb2RlbC9Bc3RUeXBlQW5hbHlzaXMuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IubWV0YW1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdDsKKworLyoqCisgKiBBIGhhY2t5IHRoaW5nIHRoYXQgY29sbGVjdHMgZmxhZ3Mgd2UgbmVlZCBmcm9tIEFTVCB0eXBlcyB0byBnZW5lcmF0ZSB0aGUgbWV0YW1vZGVsLgorICovCitwdWJsaWMgY2xhc3MgQXN0VHlwZUFuYWx5c2lzIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Fic3RyYWN0OworICAgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW1TZXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05vZGVMaXN0ID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxmVHlwZSA9IGZhbHNlOworICAgIHB1YmxpYyBDbGFzczw/PiBpbm5lclR5cGU7CisKKyAgICBBc3RUeXBlQW5hbHlzaXMoVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHsKKyAgICAgICAgICAgIFR5cGVWYXJpYWJsZTw/IGV4dGVuZHMgQ2xhc3M8Pz4+W10gdHlwZVBhcmFtZXRlcnMgPSAoKENsYXNzPD8+KSB0eXBlKS5nZXRUeXBlUGFyYW1ldGVycygpOworICAgICAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBpc1NlbGZUeXBlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlOworICAgICAgICAgICAgICAgIFR5cGUgY3VycmVudE91dGVyVHlwZSA9IHQuZ2V0UmF3VHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T3V0ZXJUeXBlID09IE5vZGVMaXN0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlzTm9kZUxpc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudE91dGVyVHlwZSA9PSBPcHRpb25hbC5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICBpc09wdGlvbmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPdXRlclR5cGUgPT0gRW51bVNldC5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICBpc0VudW1TZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gdC5nZXRSYXdUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGlzU2VsZlR5cGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHlwZSA9IHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlubmVyVHlwZSA9IChDbGFzczw/PikgdHlwZTsKKyAgICAgICAgaXNBYnN0cmFjdCA9IGlzQWJzdHJhY3QoaW5uZXJUeXBlLmdldE1vZGlmaWVycygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL21ldGFtb2RlbC9Jbml0aWFsaXplQ29uc3RydWN0b3JQYXJhbWV0ZXJzU3RhdGVtZW50c0dlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9tZXRhbW9kZWwvSW5pdGlhbGl6ZUNvbnN0cnVjdG9yUGFyYW1ldGVyc1N0YXRlbWVudHNHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTBjMGVkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9tZXRhbW9kZWwvSW5pdGlhbGl6ZUNvbnN0cnVjdG9yUGFyYW1ldGVyc1N0YXRlbWVudHNHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDU4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IubWV0YW1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BbGxGaWVsZHNDb25zdHJ1Y3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZVN0YXRlbWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5tZXRhbW9kZWwuTWV0YU1vZGVsR2VuZXJhdG9yLm5vZGVNZXRhTW9kZWxGaWVsZE5hbWU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IubWV0YW1vZGVsLk1ldGFNb2RlbEdlbmVyYXRvci5wcm9wZXJ0eU1ldGFNb2RlbEZpZWxkTmFtZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKKworY2xhc3MgSW5pdGlhbGl6ZUNvbnN0cnVjdG9yUGFyYW1ldGVyc1N0YXRlbWVudHNHZW5lcmF0b3IgeworICAgIHZvaWQgZ2VuZXJhdGUoQ2xhc3M8PyBleHRlbmRzIE5vZGU+IG5vZGVDbGFzcywgTm9kZUxpc3Q8U3RhdGVtZW50PiBpbml0aWFsaXplQ29uc3RydWN0b3JQYXJhbWV0ZXJzU3RhdGVtZW50cykgeworICAgICAgICBpZiAobm9kZUNsYXNzID09IE5vZGUuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA9IGZpbmRBbGxGaWVsZHNDb25zdHJ1Y3Rvcihub2RlQ2xhc3MpOworICAgICAgICBmb3IgKGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlciBwYXJhbWV0ZXIgOiBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gZmluZEZpZWxkSW5DbGFzcyhub2RlQ2xhc3MsIHBhcmFtZXRlci5nZXROYW1lKCkpOworCisgICAgICAgICAgICBTdHJpbmcgYWRkRmllbGRTdGF0ZW1lbnQgPSBmKCIlcy5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKS5hZGQoJXMuJXMpOyIsCisgICAgICAgICAgICAgICAgICAgIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUobm9kZUNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgbm9kZU1ldGFNb2RlbEZpZWxkTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlNZXRhTW9kZWxGaWVsZE5hbWUoZmllbGQpKTsKKworICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbnN0cnVjdG9yUGFyYW1ldGVyc1N0YXRlbWVudHMuYWRkKHBhcnNlU3RhdGVtZW50KGFkZEZpZWxkU3RhdGVtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpZWxkIGZpbmRGaWVsZEluQ2xhc3MoQ2xhc3M8Pz4gbm9kZUNsYXNzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBDbGFzczw/PiBzZWFyY2hDbGFzcyA9IG5vZGVDbGFzczsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IHNlYXJjaENsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VhcmNoQ2xhc3MgPSBzZWFyY2hDbGFzcy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKHNlYXJjaENsYXNzICE9IG51bGwpOworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZigiQ291bGRuJ3QgZmluZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgJXMgYXMgYSBmaWVsZCwgY2xhc3MgJXMiLCBuYW1lLCBub2RlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb25zdHJ1Y3Rvcjw/PiBmaW5kQWxsRmllbGRzQ29uc3RydWN0b3IoQ2xhc3M8PyBleHRlbmRzIE5vZGU+IG5vZGVDbGFzcykgeworICAgICAgICBmb3IgKENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yIDogbm9kZUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkpIHsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogY29uc3RydWN0b3IuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkgPT0gQWxsRmllbGRzQ29uc3RydWN0b3IuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZigiTm9kZSBjbGFzcyAlcyBoYXMgbm8gY29uc3RydWN0b3IgYW5ub3RhdGVkIHdpdGggQEFsbEZpZWxkc0NvbnN0cnVjdG9yIiwgbm9kZUNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvbWV0YW1vZGVsL0luaXRpYWxpemVQcm9wZXJ0eU1ldGFNb2RlbHNTdGF0ZW1lbnRzR2VuZXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL21ldGFtb2RlbC9Jbml0aWFsaXplUHJvcGVydHlNZXRhTW9kZWxzU3RhdGVtZW50c0dlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWZmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL21ldGFtb2RlbC9Jbml0aWFsaXplUHJvcGVydHlNZXRhTW9kZWxzU3RhdGVtZW50c0dlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5tZXRhbW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIubWV0YW1vZGVsLk5vbkVtcHR5UHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbC5PcHRpb25hbFByb3BlcnR5OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlU3RhdGVtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLlBVQkxJQzsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5tZXRhbW9kZWwuTWV0YU1vZGVsR2VuZXJhdG9yLmlzTm9kZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5tZXRhbW9kZWwuTWV0YU1vZGVsR2VuZXJhdG9yLm5vZGVNZXRhTW9kZWxOYW1lOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZGVjYXBpdGFsaXplOworCitjbGFzcyBJbml0aWFsaXplUHJvcGVydHlNZXRhTW9kZWxzU3RhdGVtZW50c0dlbmVyYXRvciB7CisgICAgdm9pZCBnZW5lcmF0ZShGaWVsZCBmaWVsZCwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVNZXRhTW9kZWxDbGFzcywgU3RyaW5nIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUsIE5vZGVMaXN0PFN0YXRlbWVudD4gaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBc3RUeXBlQW5hbHlzaXMgZmllbGRUeXBlQW5hbHlzaXMgPSBuZXcgQXN0VHlwZUFuYWx5c2lzKGZpZWxkLmdldEdlbmVyaWNUeXBlKCkpOworCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGZpZWxkVHlwZSA9IGZpZWxkVHlwZUFuYWx5c2lzLmlubmVyVHlwZTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gZmllbGRUeXBlLmdldFR5cGVOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU1ldGFNb2RlbEZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKSArICJQcm9wZXJ0eU1ldGFNb2RlbCI7CisgICAgICAgIG5vZGVNZXRhTW9kZWxDbGFzcy5hZGRGaWVsZCgiUHJvcGVydHlNZXRhTW9kZWwiLCBwcm9wZXJ0eU1ldGFNb2RlbEZpZWxkTmFtZSwgUFVCTElDKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5SW5pdGlhbGl6ZXIgPSBmKCJuZXcgUHJvcGVydHlNZXRhTW9kZWwoJXMsIFwiJXNcIiwgJXMuY2xhc3MsICVzLCAlcywgJXMsICVzLCAlcywgJXMpIiwKKyAgICAgICAgICAgICAgICBub2RlTWV0YU1vZGVsRmllbGROYW1lLAorICAgICAgICAgICAgICAgIGZpZWxkLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICBvcHRpb25hbE9mKGRlY2FwaXRhbGl6ZShub2RlTWV0YU1vZGVsTmFtZShmaWVsZFR5cGUpKSwgaXNOb2RlKGZpZWxkVHlwZSkpLAorICAgICAgICAgICAgICAgIGlzT3B0aW9uYWwoZmllbGQpLAorICAgICAgICAgICAgICAgIGlzTm9uRW1wdHkoZmllbGQpLAorICAgICAgICAgICAgICAgIGZpZWxkVHlwZUFuYWx5c2lzLmlzTm9kZUxpc3QsCisgICAgICAgICAgICAgICAgZmllbGRUeXBlQW5hbHlzaXMuaXNFbnVtU2V0LAorICAgICAgICAgICAgICAgIGZpZWxkVHlwZUFuYWx5c2lzLmlzU2VsZlR5cGUpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRTZXR0aW5nID0gZigiJXMuJXM9JXM7Iiwgbm9kZU1ldGFNb2RlbEZpZWxkTmFtZSwgcHJvcGVydHlNZXRhTW9kZWxGaWVsZE5hbWUsIHByb3BlcnR5SW5pdGlhbGl6ZXIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRBZGRpdGlvbiA9IGYoIiVzLmdldERlY2xhcmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKCVzLiVzKTsiLCBub2RlTWV0YU1vZGVsRmllbGROYW1lLCBub2RlTWV0YU1vZGVsRmllbGROYW1lLCBwcm9wZXJ0eU1ldGFNb2RlbEZpZWxkTmFtZSk7CisKKyAgICAgICAgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMuYWRkKHBhcnNlU3RhdGVtZW50KGZpZWxkU2V0dGluZykpOworICAgICAgICBpbml0aWFsaXplUHJvcGVydHlNZXRhTW9kZWxzU3RhdGVtZW50cy5hZGQocGFyc2VTdGF0ZW1lbnQoZmllbGRBZGRpdGlvbikpOworICAgIH0KKworICAgIHZvaWQgZ2VuZXJhdGVEZXJpdmVkUHJvcGVydHkoTWV0aG9kIG1ldGhvZCwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVNZXRhTW9kZWxDbGFzcywgU3RyaW5nIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUsIE5vZGVMaXN0PFN0YXRlbWVudD4gaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMpIHsKKyAgICAgICAgZmluYWwgQXN0VHlwZUFuYWx5c2lzIHJldHVyblR5cGVBbmFseXNpcyA9IG5ldyBBc3RUeXBlQW5hbHlzaXMobWV0aG9kLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpOworCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGlubmVybW9zdFJldHVyblR5cGUgPSByZXR1cm5UeXBlQW5hbHlzaXMuaW5uZXJUeXBlOworICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZU5hbWUgPSBpbm5lcm1vc3RSZXR1cm5UeXBlLmdldFR5cGVOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU1ldGFNb2RlbEZpZWxkTmFtZSA9IGdldHRlclRvUHJvcGVydHlOYW1lKG1ldGhvZC5nZXROYW1lKCkpICsgIlByb3BlcnR5TWV0YU1vZGVsIjsKKyAgICAgICAgbm9kZU1ldGFNb2RlbENsYXNzLmFkZEZpZWxkKCJQcm9wZXJ0eU1ldGFNb2RlbCIsIHByb3BlcnR5TWV0YU1vZGVsRmllbGROYW1lLCBQVUJMSUMpOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlJbml0aWFsaXplciA9IGYoIm5ldyBQcm9wZXJ0eU1ldGFNb2RlbCglcywgXCIlc1wiLCAlcy5jbGFzcywgJXMsICVzLCAlcywgJXMsICVzLCAlcykiLAorICAgICAgICAgICAgICAgIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgZ2V0dGVyVG9Qcm9wZXJ0eU5hbWUobWV0aG9kLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxPZihkZWNhcGl0YWxpemUobm9kZU1ldGFNb2RlbE5hbWUoaW5uZXJtb3N0UmV0dXJuVHlwZSkpLCBpc05vZGUoaW5uZXJtb3N0UmV0dXJuVHlwZSkpLAorICAgICAgICAgICAgICAgIHJldHVyblR5cGVBbmFseXNpcy5pc09wdGlvbmFsLAorICAgICAgICAgICAgICAgIGlzTm9uRW1wdHkobWV0aG9kKSwKKyAgICAgICAgICAgICAgICByZXR1cm5UeXBlQW5hbHlzaXMuaXNOb2RlTGlzdCwKKyAgICAgICAgICAgICAgICByZXR1cm5UeXBlQW5hbHlzaXMuaXNFbnVtU2V0LAorICAgICAgICAgICAgICAgIHJldHVyblR5cGVBbmFseXNpcy5pc1NlbGZUeXBlKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkU2V0dGluZyA9IGYoIiVzLiVzPSVzOyIsIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUsIHByb3BlcnR5TWV0YU1vZGVsRmllbGROYW1lLCBwcm9wZXJ0eUluaXRpYWxpemVyKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkQWRkaXRpb24gPSBmKCIlcy5nZXREZXJpdmVkUHJvcGVydHlNZXRhTW9kZWxzKCkuYWRkKCVzLiVzKTsiLCBub2RlTWV0YU1vZGVsRmllbGROYW1lLCBub2RlTWV0YU1vZGVsRmllbGROYW1lLCBwcm9wZXJ0eU1ldGFNb2RlbEZpZWxkTmFtZSk7CisKKyAgICAgICAgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMuYWRkKHBhcnNlU3RhdGVtZW50KGZpZWxkU2V0dGluZykpOworICAgICAgICBpbml0aWFsaXplUHJvcGVydHlNZXRhTW9kZWxzU3RhdGVtZW50cy5hZGQocGFyc2VTdGF0ZW1lbnQoZmllbGRBZGRpdGlvbikpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc05vbkVtcHR5KEZpZWxkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KE5vbkVtcHR5UHJvcGVydHkuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc05vbkVtcHR5KE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KE5vbkVtcHR5UHJvcGVydHkuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc09wdGlvbmFsKEZpZWxkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KE9wdGlvbmFsUHJvcGVydHkuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvbWV0YW1vZGVsL01ldGFNb2RlbEdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9tZXRhbW9kZWwvTWV0YU1vZGVsR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkOTExMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9nZW5lcmF0b3IvbWV0YW1vZGVsL01ldGFNb2RlbEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5nZW5lcmF0b3IubWV0YW1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuUHJldHR5UHJpbnRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5QcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZGVjYXBpdGFsaXplOworCitwdWJsaWMgY2xhc3MgTWV0YU1vZGVsR2VuZXJhdG9yIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfTk9ERV9NRVRBX01PREVMID0gIkJhc2VOb2RlTWV0YU1vZGVsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPD8gZXh0ZW5kcyBOb2RlPj4gQUxMX05PREVfQ0xBU1NFUyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIE5vZGU+PigpIHt7CisgICAgICAgIC8qIEJhc2UgY2xhc3NlcyBnbyBmaXJzdCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgc29ydGluZyB0byBtYWtlIHN1cmUKKyAgICAgICAgIGdlbmVyYXRlZCBjbGFzc2VzIGNhbiByZWZlciB0byB0aGVpciBiYXNlIGdlbmVyYXRlZCBjbGFzc2VzIHdpdGhvdXQKKyAgICAgICAgIGJlaW5nIGFmcmFpZCB0aG9zZSBhcmUgbm90IGluaXRpYWxpemVkIHlldC4gKi8KKyAgICAgICAgYWRkKE5vZGUuY2xhc3MpOworCisgICAgICAgIGFkZChCb2R5RGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBhZGQoQ2FsbGFibGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFkZChTdGF0ZW1lbnQuY2xhc3MpOworICAgICAgICBhZGQoRXhwcmVzc2lvbi5jbGFzcyk7CisgICAgICAgIGFkZChUeXBlLmNsYXNzKTsKKworICAgICAgICBhZGQoQW5ub3RhdGlvbkV4cHIuY2xhc3MpOworICAgICAgICBhZGQoVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgYWRkKFJlZmVyZW5jZVR5cGUuY2xhc3MpOworCisgICAgICAgIGFkZChMaXRlcmFsRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChMaXRlcmFsU3RyaW5nVmFsdWVFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKFN0cmluZ0xpdGVyYWxFeHByLmNsYXNzKTsKKworICAgICAgICBhZGQoTW9kdWxlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBhZGQoTW9kdWxlU3RtdC5jbGFzcyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgYWRkKEFycmF5Q3JlYXRpb25MZXZlbC5jbGFzcyk7CisgICAgICAgIGFkZChDb21waWxhdGlvblVuaXQuY2xhc3MpOworICAgICAgICBhZGQoUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzKTsKKworICAgICAgICBhZGQoQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgYWRkKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFkZChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBhZGQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFkZChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFkZChFbnVtRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBhZGQoRmllbGREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFkZChJbml0aWFsaXplckRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgYWRkKE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgYWRkKFBhcmFtZXRlci5jbGFzcyk7CisgICAgICAgIGFkZChSZWNlaXZlclBhcmFtZXRlci5jbGFzcyk7CisgICAgICAgIGFkZChWYXJpYWJsZURlY2xhcmF0b3IuY2xhc3MpOworCisgICAgICAgIGFkZChDb21tZW50LmNsYXNzKTsKKyAgICAgICAgYWRkKEJsb2NrQ29tbWVudC5jbGFzcyk7CisgICAgICAgIGFkZChKYXZhZG9jQ29tbWVudC5jbGFzcyk7CisgICAgICAgIGFkZChMaW5lQ29tbWVudC5jbGFzcyk7CisKKyAgICAgICAgYWRkKEFycmF5QWNjZXNzRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChBcnJheUNyZWF0aW9uRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChBcnJheUluaXRpYWxpemVyRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChBc3NpZ25FeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKEJpbmFyeUV4cHIuY2xhc3MpOworICAgICAgICBhZGQoQm9vbGVhbkxpdGVyYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKENhc3RFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKENoYXJMaXRlcmFsRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChDbGFzc0V4cHIuY2xhc3MpOworICAgICAgICBhZGQoQ29uZGl0aW9uYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKERvdWJsZUxpdGVyYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKEVuY2xvc2VkRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChGaWVsZEFjY2Vzc0V4cHIuY2xhc3MpOworICAgICAgICBhZGQoSW5zdGFuY2VPZkV4cHIuY2xhc3MpOworICAgICAgICBhZGQoSW50ZWdlckxpdGVyYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKExhbWJkYUV4cHIuY2xhc3MpOworICAgICAgICBhZGQoTG9uZ0xpdGVyYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKE1hcmtlckFubm90YXRpb25FeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKE1lbWJlclZhbHVlUGFpci5jbGFzcyk7CisgICAgICAgIGFkZChNZXRob2RDYWxsRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChNZXRob2RSZWZlcmVuY2VFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKE5hbWVFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKE5hbWUuY2xhc3MpOworICAgICAgICBhZGQoTm9ybWFsQW5ub3RhdGlvbkV4cHIuY2xhc3MpOworICAgICAgICBhZGQoTnVsbExpdGVyYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKE9iamVjdENyZWF0aW9uRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChTaW1wbGVOYW1lLmNsYXNzKTsKKyAgICAgICAgYWRkKFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByLmNsYXNzKTsKKyAgICAgICAgYWRkKFN1cGVyRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChUaGlzRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChUeXBlRXhwci5jbGFzcyk7CisgICAgICAgIGFkZChVbmFyeUV4cHIuY2xhc3MpOworICAgICAgICBhZGQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuY2xhc3MpOworCisgICAgICAgIGFkZChJbXBvcnREZWNsYXJhdGlvbi5jbGFzcyk7CisKKyAgICAgICAgYWRkKEFzc2VydFN0bXQuY2xhc3MpOworICAgICAgICBhZGQoQmxvY2tTdG10LmNsYXNzKTsKKyAgICAgICAgYWRkKEJyZWFrU3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChDYXRjaENsYXVzZS5jbGFzcyk7CisgICAgICAgIGFkZChDb250aW51ZVN0bXQuY2xhc3MpOworICAgICAgICBhZGQoRG9TdG10LmNsYXNzKTsKKyAgICAgICAgYWRkKEVtcHR5U3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuY2xhc3MpOworICAgICAgICBhZGQoRXhwcmVzc2lvblN0bXQuY2xhc3MpOworICAgICAgICBhZGQoRm9yZWFjaFN0bXQuY2xhc3MpOworICAgICAgICBhZGQoRm9yU3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChJZlN0bXQuY2xhc3MpOworICAgICAgICBhZGQoTGFiZWxlZFN0bXQuY2xhc3MpOworICAgICAgICBhZGQoUmV0dXJuU3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChTd2l0Y2hFbnRyeVN0bXQuY2xhc3MpOworICAgICAgICBhZGQoU3dpdGNoU3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChTeW5jaHJvbml6ZWRTdG10LmNsYXNzKTsKKyAgICAgICAgYWRkKFRocm93U3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChUcnlTdG10LmNsYXNzKTsKKyAgICAgICAgYWRkKExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQuY2xhc3MpOworICAgICAgICBhZGQoV2hpbGVTdG10LmNsYXNzKTsKKyAgICAgICAgYWRkKFVucGFyc2FibGVTdG10LmNsYXNzKTsKKworICAgICAgICBhZGQoQXJyYXlUeXBlLmNsYXNzKTsKKyAgICAgICAgYWRkKENsYXNzT3JJbnRlcmZhY2VUeXBlLmNsYXNzKTsKKyAgICAgICAgYWRkKEludGVyc2VjdGlvblR5cGUuY2xhc3MpOworICAgICAgICBhZGQoUHJpbWl0aXZlVHlwZS5jbGFzcyk7CisgICAgICAgIGFkZChUeXBlUGFyYW1ldGVyLmNsYXNzKTsKKyAgICAgICAgYWRkKFVuaW9uVHlwZS5jbGFzcyk7CisgICAgICAgIGFkZChVbmtub3duVHlwZS5jbGFzcyk7CisgICAgICAgIGFkZChWb2lkVHlwZS5jbGFzcyk7CisgICAgICAgIGFkZChXaWxkY2FyZFR5cGUuY2xhc3MpOworICAgICAgICBhZGQoVmFyVHlwZS5jbGFzcyk7CisKKyAgICAgICAgYWRkKE1vZHVsZVJlcXVpcmVzU3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChNb2R1bGVFeHBvcnRzU3RtdC5jbGFzcyk7CisgICAgICAgIGFkZChNb2R1bGVQcm92aWRlc1N0bXQuY2xhc3MpOworICAgICAgICBhZGQoTW9kdWxlVXNlc1N0bXQuY2xhc3MpOworICAgICAgICBhZGQoTW9kdWxlT3BlbnNTdG10LmNsYXNzKTsKKyAgICB9fTsKKworICAgIHN0YXRpYyBTdHJpbmcgTUVUQU1PREVMX1BBQ0tBR0UgPSAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTmVlZCAxIHBhcmFtZXRlcjogdGhlIEphdmFQYXJzZXIgc291cmNlIGNoZWNrb3V0IHJvb3QgZGlyZWN0b3J5LiIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBhdGggcm9vdCA9IFBhdGhzLmdldChhcmdzWzBdLCAiLi4iLCAiamF2YXBhcnNlci1jb3JlIiwgInNyYyIsICJtYWluIiwgImphdmEiKTsKKyAgICAgICAgZmluYWwgU291cmNlUm9vdCBzb3VyY2VSb290ID0gbmV3IFNvdXJjZVJvb3Qocm9vdCk7CisgICAgICAgIHNvdXJjZVJvb3Quc2V0UHJpbnRlcihuZXcgUHJldHR5UHJpbnRlcihuZXcgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24oKS5zZXRFbmRPZkxpbmVDaGFyYWN0ZXIoIlxuIikpOjpwcmludCk7CisKKyAgICAgICAgbmV3IE1ldGFNb2RlbEdlbmVyYXRvcigpLnJ1bihzb3VyY2VSb290KTsKKworICAgICAgICBzb3VyY2VSb290LnNhdmVBbGwoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuKFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb21waWxhdGlvblVuaXQgamF2YVBhcnNlck1ldGFNb2RlbCA9IHNvdXJjZVJvb3QucGFyc2UoTUVUQU1PREVMX1BBQ0tBR0UsICJKYXZhUGFyc2VyTWV0YU1vZGVsLmphdmEiKTsKKworICAgICAgICBnZW5lcmF0ZU5vZGVNZXRhTW9kZWxzKGphdmFQYXJzZXJNZXRhTW9kZWwsIHNvdXJjZVJvb3QpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU5vZGVNZXRhTW9kZWxzKENvbXBpbGF0aW9uVW5pdCBqYXZhUGFyc2VyTWV0YU1vZGVsQ3UsIFNvdXJjZVJvb3Qgc291cmNlUm9vdCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBtZXRhTW9kZWxDb2lkID0gamF2YVBhcnNlck1ldGFNb2RlbEN1LmdldENsYXNzQnlOYW1lKCJKYXZhUGFyc2VyTWV0YU1vZGVsIikuZ2V0KCk7CisgICAgICAgIGZpbmFsIE5vZGVMaXN0PFN0YXRlbWVudD4gaW5pdGlhbGl6ZU5vZGVNZXRhTW9kZWxzU3RhdGVtZW50cyA9IG1ldGFNb2RlbENvaWQuZ2V0TWV0aG9kc0J5TmFtZSgiaW5pdGlhbGl6ZU5vZGVNZXRhTW9kZWxzIikuZ2V0KDApLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCk7CisgICAgICAgIGZpbmFsIE5vZGVMaXN0PFN0YXRlbWVudD4gaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMgPSBtZXRhTW9kZWxDb2lkLmdldE1ldGhvZHNCeU5hbWUoImluaXRpYWxpemVQcm9wZXJ0eU1ldGFNb2RlbHMiKS5nZXQoMCkuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKTsKKyAgICAgICAgZmluYWwgTm9kZUxpc3Q8U3RhdGVtZW50PiBpbml0aWFsaXplQ29uc3RydWN0b3JQYXJhbWV0ZXJzU3RhdGVtZW50cyA9IG1ldGFNb2RlbENvaWQuZ2V0TWV0aG9kc0J5TmFtZSgiaW5pdGlhbGl6ZUNvbnN0cnVjdG9yUGFyYW1ldGVycyIpLmdldCgwKS5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpOworICAgICAgICBpbml0aWFsaXplTm9kZU1ldGFNb2RlbHNTdGF0ZW1lbnRzLmNsZWFyKCk7CisgICAgICAgIGluaXRpYWxpemVQcm9wZXJ0eU1ldGFNb2RlbHNTdGF0ZW1lbnRzLmNsZWFyKCk7CisgICAgICAgIGluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzLmNsZWFyKCk7CisKKyAgICAgICAgbWV0YU1vZGVsQ29pZC5nZXRGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldFZhcmlhYmxlKDApLmdldE5hbWVBc1N0cmluZygpLmVuZHNXaXRoKCJNZXRhTW9kZWwiKSkuZm9yRWFjaChOb2RlOjpyZW1vdmUpOworICAgICAgICBmaW5hbCBOb2RlTWV0YU1vZGVsR2VuZXJhdG9yIG5vZGVNZXRhTW9kZWxHZW5lcmF0b3IgPSBuZXcgTm9kZU1ldGFNb2RlbEdlbmVyYXRvcigpOworICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBOb2RlPiBub2RlQ2xhc3MgOiBBTExfTk9ERV9DTEFTU0VTKSB7CisgICAgICAgICAgICBub2RlTWV0YU1vZGVsR2VuZXJhdG9yLmdlbmVyYXRlKG5vZGVDbGFzcywgbWV0YU1vZGVsQ29pZCwgaW5pdGlhbGl6ZU5vZGVNZXRhTW9kZWxzU3RhdGVtZW50cywgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMsIGluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzLCBzb3VyY2VSb290KTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVOb2RlTWV0YU1vZGVsc1N0YXRlbWVudHMuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZyhOb2RlOjp0b1N0cmluZykpOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGlzTm9kZShDbGFzczw/PiBjKSB7CisgICAgICAgIHJldHVybiBOb2RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYyk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBub2RlTWV0YU1vZGVsTmFtZShDbGFzczw/PiBjKSB7CisgICAgICAgIHJldHVybiBjLmdldFNpbXBsZU5hbWUoKSArICJNZXRhTW9kZWwiOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcHJvcGVydHlNZXRhTW9kZWxGaWVsZE5hbWUoRmllbGQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldE5hbWUoKSArICJQcm9wZXJ0eU1ldGFNb2RlbCI7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBub2RlTWV0YU1vZGVsRmllbGROYW1lKENsYXNzPD8+IG5vZGVDbGFzcykgeworICAgICAgICByZXR1cm4gZGVjYXBpdGFsaXplKG5vZGVNZXRhTW9kZWxOYW1lKG5vZGVDbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9tZXRhbW9kZWwvTm9kZU1ldGFNb2RlbEdlbmVyYXRvci5qYXZhIGIvamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2dlbmVyYXRvci9tZXRhbW9kZWwvTm9kZU1ldGFNb2RlbEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjkyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLW1ldGFtb2RlbC1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvZ2VuZXJhdG9yL21ldGFtb2RlbC9Ob2RlTWV0YU1vZGVsR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmdlbmVyYXRvci5tZXRhbW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuRGVyaXZlZFByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWwuSW50ZXJuYWxQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuU291cmNlUm9vdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuZ2VuZXJhdG9yLm1ldGFtb2RlbC5NZXRhTW9kZWxHZW5lcmF0b3IuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMuZjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNvZGVHZW5lcmF0aW9uVXRpbHMub3B0aW9uYWxPZjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmRlY2FwaXRhbGl6ZTsKKworcHVibGljIGNsYXNzIE5vZGVNZXRhTW9kZWxHZW5lcmF0b3IgeworICAgIHByaXZhdGUgZmluYWwgSW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHNHZW5lcmF0b3IgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHNHZW5lcmF0b3IgPSBuZXcgSW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHNHZW5lcmF0b3IoKTsKKyAgICBwcml2YXRlIGZpbmFsIEluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzR2VuZXJhdG9yIGluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzR2VuZXJhdG9yID0gbmV3IEluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzR2VuZXJhdG9yKCk7CisKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShDbGFzczw/IGV4dGVuZHMgTm9kZT4gbm9kZUNsYXNzLCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbWV0YU1vZGVsQ29pZCwgTm9kZUxpc3Q8U3RhdGVtZW50PiBpbml0aWFsaXplTm9kZU1ldGFNb2RlbHNTdGF0ZW1lbnRzLCBOb2RlTGlzdDxTdGF0ZW1lbnQ+IGluaXRpYWxpemVQcm9wZXJ0eU1ldGFNb2RlbHNTdGF0ZW1lbnRzLCBOb2RlTGlzdDxTdGF0ZW1lbnQ+IGluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzLCBTb3VyY2VSb290IHNvdXJjZVJvb3QpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gbm9kZU1ldGFNb2RlbE5hbWUobm9kZUNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUgPSBkZWNhcGl0YWxpemUoY2xhc3NOYW1lKTsKKyAgICAgICAgbWV0YU1vZGVsQ29pZC5nZXRGaWVsZEJ5TmFtZShub2RlTWV0YU1vZGVsRmllbGROYW1lKS5pZlByZXNlbnQoTm9kZTo6cmVtb3ZlKTsKKworICAgICAgICBmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG5vZGVGaWVsZCA9IG1ldGFNb2RlbENvaWQuYWRkRmllbGQoY2xhc3NOYW1lLCBub2RlTWV0YU1vZGVsRmllbGROYW1lLCBQVUJMSUMsIFNUQVRJQywgRklOQUwpOworCisgICAgICAgIGZpbmFsIENsYXNzPD8+IHN1cGVyY2xhc3MgPSBub2RlQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3VwZXJOb2RlTWV0YU1vZGVsID0gbm9kZU1ldGFNb2RlbE5hbWUoc3VwZXJjbGFzcyk7CisKKyAgICAgICAgYm9vbGVhbiBpc1Jvb3ROb2RlID0gIWlzTm9kZShzdXBlcmNsYXNzKTsKKyAgICAgICAgbm9kZUZpZWxkLmdldFZhcmlhYmxlKDApLnNldEluaXRpYWxpemVyKHBhcnNlRXhwcmVzc2lvbihmKCJuZXcgJXMoJXMpIiwKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxPZihkZWNhcGl0YWxpemUoc3VwZXJOb2RlTWV0YU1vZGVsKSwgIWlzUm9vdE5vZGUpKSkpOworCisgICAgICAgIGluaXRpYWxpemVOb2RlTWV0YU1vZGVsc1N0YXRlbWVudHMuYWRkKHBhcnNlU3RhdGVtZW50KGYoIm5vZGVNZXRhTW9kZWxzLmFkZCglcyk7Iiwgbm9kZU1ldGFNb2RlbEZpZWxkTmFtZSkpKTsKKworICAgICAgICBmaW5hbCBDb21waWxhdGlvblVuaXQgY2xhc3NNZXRhTW9kZWxKYXZhRmlsZSA9IG5ldyBDb21waWxhdGlvblVuaXQoTUVUQU1PREVMX1BBQ0tBR0UpOworICAgICAgICBjbGFzc01ldGFNb2RlbEphdmFGaWxlLmFkZEltcG9ydCgiamF2YS51dGlsLk9wdGlvbmFsIik7CisgICAgICAgIHNvdXJjZVJvb3QuYWRkKE1FVEFNT0RFTF9QQUNLQUdFLCBjbGFzc05hbWUgKyAiLmphdmEiLCBjbGFzc01ldGFNb2RlbEphdmFGaWxlKTsKKyAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVNZXRhTW9kZWxDbGFzcyA9IGNsYXNzTWV0YU1vZGVsSmF2YUZpbGUuYWRkQ2xhc3MoY2xhc3NOYW1lLCBQVUJMSUMpOworICAgICAgICBpZiAoaXNSb290Tm9kZSkgeworICAgICAgICAgICAgbm9kZU1ldGFNb2RlbENsYXNzLmFkZEV4dGVuZGVkVHlwZShCQVNFX05PREVfTUVUQV9NT0RFTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub2RlTWV0YU1vZGVsQ2xhc3MuYWRkRXh0ZW5kZWRUeXBlKHN1cGVyTm9kZU1ldGFNb2RlbCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBc3RUeXBlQW5hbHlzaXMgdHlwZUFuYWx5c2lzID0gbmV3IEFzdFR5cGVBbmFseXNpcyhub2RlQ2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2xhc3NNTUNvbnN0cnVjdG9yID0gbm9kZU1ldGFNb2RlbENsYXNzCisgICAgICAgICAgICAgICAgLmFkZENvbnN0cnVjdG9yKCkKKyAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKCJPcHRpb25hbDwiICsgQkFTRV9OT0RFX01FVEFfTU9ERUwgKyAiPiIsICJzdXBlciIgKyBCQVNFX05PREVfTUVUQV9NT0RFTCk7CisgICAgICAgIGNsYXNzTU1Db25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgIC5nZXRCb2R5KCkKKyAgICAgICAgICAgICAgICAuYWRkU3RhdGVtZW50KHBhcnNlRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KGYoInN1cGVyKHN1cGVyJXMsICVzLmNsYXNzLCBcIiVzXCIsIFwiJXNcIiwgJXMsICVzKTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgQkFTRV9OT0RFX01FVEFfTU9ERUwsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlQ2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUNsYXNzLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVDbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFuYWx5c2lzLmlzQWJzdHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQW5hbHlzaXMuaXNTZWxmVHlwZSkpKTsKKworICAgICAgICBpZiAodHlwZUFuYWx5c2lzLmlzQWJzdHJhY3QpIHsKKyAgICAgICAgICAgIGNsYXNzTWV0YU1vZGVsSmF2YUZpbGUuYWRkSW1wb3J0KE5vZGUuY2xhc3MpOworICAgICAgICAgICAgbm9kZU1ldGFNb2RlbENsYXNzLmFkZE1lbWJlcihwYXJzZUJvZHlEZWNsYXJhdGlvbihmKAorICAgICAgICAgICAgICAgICAgICAicHJvdGVjdGVkICVzKE9wdGlvbmFsPEJhc2VOb2RlTWV0YU1vZGVsPiBzdXBlck5vZGVNZXRhTW9kZWwsIENsYXNzPD8gZXh0ZW5kcyBOb2RlPiB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGlzQWJzdHJhY3QsIGJvb2xlYW4gaGFzV2lsZGNhcmQpIHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwZXIoc3VwZXJOb2RlTWV0YU1vZGVsLCB0eXBlLCBuYW1lLCBwYWNrYWdlTmFtZSwgaXNBYnN0cmFjdCwgaGFzV2lsZGNhcmQpOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgfSIsCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExpc3Q8RmllbGQ+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8PihBcnJheXMuYXNMaXN0KG5vZGVDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSk7CisgICAgICAgIGZpZWxkcy5zb3J0KENvbXBhcmF0b3IuY29tcGFyaW5nKEZpZWxkOjpnZXROYW1lKSk7CisgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZFNob3VsZEJlSWdub3JlZChmaWVsZCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHNHZW5lcmF0b3IuZ2VuZXJhdGUoZmllbGQsIG5vZGVNZXRhTW9kZWxDbGFzcywgbm9kZU1ldGFNb2RlbEZpZWxkTmFtZSwgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3Qobm9kZUNsYXNzLmdldE1ldGhvZHMoKSkpOworICAgICAgICBtZXRob2RzLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmcoTWV0aG9kOjpnZXROYW1lKSk7CisgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgICAgICAgIGlmIChtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChEZXJpdmVkUHJvcGVydHkuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVByb3BlcnR5TWV0YU1vZGVsc1N0YXRlbWVudHNHZW5lcmF0b3IuZ2VuZXJhdGVEZXJpdmVkUHJvcGVydHkobWV0aG9kLCBub2RlTWV0YU1vZGVsQ2xhc3MsIG5vZGVNZXRhTW9kZWxGaWVsZE5hbWUsIGluaXRpYWxpemVQcm9wZXJ0eU1ldGFNb2RlbHNTdGF0ZW1lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVDb25zdHJ1Y3RvclBhcmFtZXRlcnNTdGF0ZW1lbnRzR2VuZXJhdG9yLmdlbmVyYXRlKG5vZGVDbGFzcywgaW5pdGlhbGl6ZUNvbnN0cnVjdG9yUGFyYW1ldGVyc1N0YXRlbWVudHMpOworCisgICAgICAgIG1vdmVTdGF0aWNJbml0aWFsaXplVG9UaGVFbmRPZlRoZUNsYXNzQmVjYXVzZVdlTmVlZFRoZUZpZWxkc1RvSW5pdGlhbGl6ZUZpcnN0KG1ldGFNb2RlbENvaWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtb3ZlU3RhdGljSW5pdGlhbGl6ZVRvVGhlRW5kT2ZUaGVDbGFzc0JlY2F1c2VXZU5lZWRUaGVGaWVsZHNUb0luaXRpYWxpemVGaXJzdChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbWV0YU1vZGVsQ29pZCkgeworICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbjw/PiBtIDogbWV0YU1vZGVsQ29pZC5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChtIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgIG0ucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgbWV0YU1vZGVsQ29pZC5hZGRNZW1iZXIobSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGZpZWxkU2hvdWxkQmVJZ25vcmVkKEZpZWxkIHJlZmxlY3Rpb25GaWVsZCkgeworICAgICAgICByZXR1cm4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMocmVmbGVjdGlvbkZpZWxkLmdldE1vZGlmaWVycygpKSB8fAorICAgICAgICAgICAgICAgIHJlZmxlY3Rpb25GaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KEludGVybmFsUHJvcGVydHkuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItcGFyZW50LmltbCBiL2phdmFwYXJzZXItcGFyZW50LmltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBmNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1wYXJlbnQuaW1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bW9kdWxlIG9yZy5qZXRicmFpbnMuaWRlYS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdHNNYW5hZ2VyLmlzTWF2ZW5Nb2R1bGU9InRydWUiIHR5cGU9IkpBVkFfTU9EVUxFIiB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJGYWNldE1hbmFnZXIiPgorICAgIDxmYWNldCB0eXBlPSJPc21vcmMiIG5hbWU9Ik9TR2kiPgorICAgICAgPGNvbmZpZ3VyYXRpb24gbWFuaWZlc3RHZW5lcmF0aW9uTW9kZT0iTWFudWFsbHkiIG1hbmlmZXN0TG9jYXRpb249ImphdmFwYXJzZXItYmRkLXRlc3RpbmcvdGFyZ2V0L2NsYXNzZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiIGphcmZpbGVMb2NhdGlvbj0iamF2YXBhcnNlci1wYXJlbnQuamFyIiBvdXRwdXRQYXRoVHlwZT0iQ29tcGlsZXJPdXRwdXRQYXRoIiBibmRGaWxlTG9jYXRpb249IiIgYnVuZGxvckZpbGVMb2NhdGlvbj0iIiBidW5kbGVBY3RpdmF0b3I9IiIgYnVuZGxlU3ltYm9saWNOYW1lPSIiIGJ1bmRsZVZlcnNpb249IjEuMC4wIiBpZ25vcmVGaWxlUGF0dGVybj0iIiB1c2VQcm9qZWN0RGVmYXVsdE1hbmlmZXN0RmlsZUxvY2F0aW9uPSJmYWxzZSIgYWx3YXlzUmVidWlsZEJ1bmRsZUpBUj0iZmFsc2UiIGRvTm90U3luY2hyb25pemVXaXRoTWF2ZW49ImZhbHNlIj4KKyAgICAgICAgPGFkZGl0aW9uYWxQcm9wZXJ0aWVzIC8+CisgICAgICAgIDxhZGRpdGlvbmFsSkFSQ29udGVudHMgLz4KKyAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICA8L2ZhY2V0PgorICA8L2NvbXBvbmVudD4KKyAgPGNvbXBvbmVudCBuYW1lPSJOZXdNb2R1bGVSb290TWFuYWdlciIgTEFOR1VBR0VfTEVWRUw9IkpES18xXzgiPgorICAgIDxvdXRwdXQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC9jbGFzc2VzIiAvPgorICAgIDxvdXRwdXQtdGVzdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L3Rlc3QtY2xhc3NlcyIgLz4KKyAgICA8Y29udGVudCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQiPgorICAgICAgPGV4Y2x1ZGVGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldCIgLz4KKyAgICA8L2NvbnRlbnQ+CisgICAgPG9yZGVyRW50cnkgdHlwZT0iaW5oZXJpdGVkSmRrIiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9InNvdXJjZUZvbGRlciIgZm9yVGVzdHM9ImZhbHNlIiAvPgorICA8L2NvbXBvbmVudD4KKzwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlLy5naXRpZ25vcmUgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTRiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAordGFyZ2V0CitidWlsZAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLnNldHRpbmdzCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS5pbWwgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS5pbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlMzgwNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlLmltbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPG1vZHVsZSBvcmcuamV0YnJhaW5zLmlkZWEubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RzTWFuYWdlci5pc01hdmVuTW9kdWxlPSJ0cnVlIiB0eXBlPSJKQVZBX01PRFVMRSIgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iTmV3TW9kdWxlUm9vdE1hbmFnZXIiIExBTkdVQUdFX0xFVkVMPSJKREtfMV84Ij4KKyAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQvY2xhc3NlcyIgLz4KKyAgICA8b3V0cHV0LXRlc3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC90ZXN0LWNsYXNzZXMiIC8+CisgICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9tYWluL2phdmEiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIC8+CisgICAgICA8ZXhjbHVkZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0IiAvPgorICAgIDwvY29udGVudD4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJpbmhlcml0ZWRKZGsiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ic291cmNlRm9sZGVyIiBmb3JUZXN0cz0iZmFsc2UiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlIiBtb2R1bGUtbmFtZT0iamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljIiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9Ik1hdmVuOiBvcmcuamF2YXNzaXN0OmphdmFzc2lzdDozLjIyLjAtR0EiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgbW9kdWxlLW5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUiIG1vZHVsZS1uYW1lPSJqYXZhcGFyc2VyLWNvcmUiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IGNvbS5nb29nbGUuZ3VhdmE6Z3VhdmE6MjMuNC1qcmUiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9Ik1hdmVuOiBjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3M6anNyMzA1OjEuMy45IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJNYXZlbjogY29tLmdvb2dsZS5lcnJvcnByb25lOmVycm9yX3Byb25lX2Fubm90YXRpb25zOjIuMC4xOCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IGNvbS5nb29nbGUuajJvYmpjOmoyb2JqYy1hbm5vdGF0aW9uczoxLjEiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9Ik1hdmVuOiBvcmcuY29kZWhhdXMubW9qbzphbmltYWwtc25pZmZlci1hbm5vdGF0aW9uczoxLjE0IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgPC9jb21wb25lbnQ+Cis8L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9wb20ueG1sIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZmNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvcG9tLnhtbApAQCAtMCwwICsxLDEyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8cGFyZW50PgorICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICA8dmVyc2lvbj4zLjUuMTYtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PiAgICAKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8ZGVzY3JpcHRpb24+QSBTeW1ib2wgU29sdmVyIGZvciBKYXZhLCBidWlsdCBvbiB0b3Agb2YgSmF2YVBhcnNlciAoY29yZSk8L2Rlc2NyaXB0aW9uPgorCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5BIGJ1c2luZXNzLWZyaWVuZGx5IE9TUyBsaWNlbnNlPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGphdmEudmVyc2lvbj4xLjg8L2phdmEudmVyc2lvbj4KKyAgICAgICAgPGJ1aWxkLnRpbWVzdGFtcD4ke21hdmVuLmJ1aWxkLnRpbWVzdGFtcH08L2J1aWxkLnRpbWVzdGFtcD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamF2YXBhcnNlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFuaW1hbC1zbmlmZmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWFrZSBzdXJlIG9ubHkgdGhlIEFQSSBvZiB0aGlzIEpESyBpcyB1c2VkIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam8uc2lnbmF0dXJlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YTE4PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YW5pbWFsLXNuaWZmZXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLXZlcnNpb25zPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmVuZm9yY2U8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVxdWlyZUphdmFWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNYWtlIHN1cmUgYSBjb21waWxlciBvZiB0aGlzIHZlcnNpb24gaXMgdXNlZCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF2YS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXF1aXJlSmF2YVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbmZvcmNlQnl0ZWNvZGVWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNYWtlIHN1cmUgdGhlIGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQgZm9yIG91ciBKYXZhIHZlcnNpb24gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SmRrVmVyc2lvbj4ke2phdmEudmVyc2lvbn08L21heEpka1ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW5mb3JjZUJ5dGVjb2RlVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4dHJhLWVuZm9yY2VyLXJ1bGVzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWJldGEtNjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8IS0tIFNldCBKUE1TIG1vZHVsZSBuYW1lIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBdXRvbWF0aWMtTW9kdWxlLU5hbWU+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlPC9BdXRvbWF0aWMtTW9kdWxlLU5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9KYXZhU3ltYm9sU29sdmVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSmF2YVN5bWJvbFNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSmF2YVN5bWJvbFNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5TeW1ib2xSZXNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCisvKioKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bWJvbFJlc29sdmVyIHdyYXBzIHRoZSBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIGxpYnJhcnkgdG8gbWFrZSB0aGVtIGVhc2lseSB1c2FibGUKKyAqIGZyb20gSmF2YVBhcnNlciBub2Rlcy4KKyAqCisgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSBjcmVhdGVkIG9uY2UgYW5kIHRoZW4gaW5qZWN0ZWQgaW4gYWxsIHRoZSBDb21waWxhdGlvblVuaXQgZm9yIHdoaWNoIHdlCisgKiB3YW50IHRvIGVuYWJsZSBzeW1ib2wgcmVzb2x1dGlvbi4gVG8gZG8gc28gdGhlIG1ldGhvZCBpbmplY3QgY2FuIGJlIHVzZWQuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhU3ltYm9sU29sdmVyIGltcGxlbWVudHMgU3ltYm9sUmVzb2x2ZXIgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgSmF2YVN5bWJvbFNvbHZlcihUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGlzIFN5bWJvbFJlc29sdmVyIGludG8gYSBDb21waWxhdGlvblVuaXQsIHNvIHRoYXQgc3ltYm9sIHJlc29sdXRpb24gYmVjb21lcyBhdmFpbGFibGUgdG8KKyAgICAgKiBhbGwgbm9kZXMgcGFydCBvZiB0aGUgQ29tcGlsYXRpb25Vbml0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluamVjdChDb21waWxhdGlvblVuaXQgZGVzdGluYXRpb24pIHsKKyAgICAgICAgZGVzdGluYXRpb24uc2V0RGF0YShOb2RlLlNZTUJPTF9SRVNPTFZFUl9LRVksIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCByZXNvbHZlRGVjbGFyYXRpb24oTm9kZSBub2RlLCBDbGFzczxUPiByZXN1bHRDbGFzcykgeworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChuZXcgSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uKChNZXRob2REZWNsYXJhdGlvbilub2RlLCB0eXBlU29sdmVyKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHJlc29sdmVkID0gSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24obm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXNvbHZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHJlc29sdmVkID0gSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24obm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXNvbHZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgeworICAgICAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gbm9kZS5maW5kUGFyZW50KEVudW1EZWNsYXJhdGlvbi5jbGFzcykuZ2V0KCkucmVzb2x2ZSgpLmFzRW51bSgpOworICAgICAgICAgICAgUmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiByZXNvbHZlZCA9IGVudW1EZWNsYXJhdGlvbi5nZXRFbnVtQ29uc3RhbnRzKCkuc3RyZWFtKCkuZmlsdGVyKGMgLT4gKChKYXZhUGFyc2VyRW51bUNvbnN0YW50RGVjbGFyYXRpb24pYykuZ2V0V3JhcHBlZE5vZGUoKSA9PSBub2RlKS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRDbGFzcy5pc0luc3RhbmNlKHJlc29sdmVkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDbGFzcy5jYXN0KHJlc29sdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKW5vZGU7CisgICAgICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbilub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKTsKKyAgICAgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiByZXNvbHZlZENsYXNzID0gcmVzb2x2ZURlY2xhcmF0aW9uKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uLmNsYXNzKS5hc0NsYXNzKCk7CisgICAgICAgICAgICBSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gcmVzb2x2ZWQgPSAgcmVzb2x2ZWRDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKS5zdHJlYW0oKS5maWx0ZXIoYyAtPiAoKEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKWMpLmdldFdyYXBwZWROb2RlKCkgPT0gY29uc3RydWN0b3JEZWNsYXJhdGlvbikuZmluZEZpcnN0KCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXNvbHZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHJlc29sdmVkID0gSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24obm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXNvbHZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIFJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IG5vZGUuZmluZFBhcmVudChBbm5vdGF0aW9uRGVjbGFyYXRpb24uY2xhc3MpLmdldCgpLnJlc29sdmUoKTsKKyAgICAgICAgICAgIFJlc29sdmVkQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHJlc29sdmVkID0gYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKGMgLT4gKChKYXZhUGFyc2VyQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKWMpLmdldFdyYXBwZWROb2RlKCkgPT0gbm9kZSkuZmluZEZpcnN0KCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXNvbHZlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXNvbHZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbilub2RlOworICAgICAgICAgICAgaWYgKGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHJlc29sdmUgYSBGaWVsZCBEZWNsYXJhdGlvbiBpbmNsdWRpbmcgbXVsdGlwbGUgdmFyaWFibGUgZGVjbGFyYXRvcnMuIFJlc29sdmUgdGhlIHNpbmdsZSB2YXJpYWJsZSBkZWNsYXJhdG9ycyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIHJlc29sdmVkID0gbmV3IEphdmFQYXJzZXJGaWVsZERlY2xhcmF0aW9uKGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGUoMCksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHJlc3VsdENsYXNzLmlzSW5zdGFuY2UocmVzb2x2ZWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzLmNhc3QocmVzb2x2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdG9yKSB7CisgICAgICAgICAgICBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gcmVzb2x2ZWQgPSBuZXcgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24oKFZhcmlhYmxlRGVjbGFyYXRvcilub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRDbGFzcy5pc0luc3RhbmNlKHJlc29sdmVkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDbGFzcy5jYXN0KHJlc29sdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVzdWx0ID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmUoKE1ldGhvZENhbGxFeHByKW5vZGUpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENsYXNzLmlzSW5zdGFuY2UocmVzdWx0LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXN1bHQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKCJXZSBhcmUgdW5hYmxlIHRvIGZpbmQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvICIgKyBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVFeHByKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVzdWx0ID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmUoKE5hbWVFeHByKSBub2RlKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDbGFzcy5pc0luc3RhbmNlKHJlc3VsdC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzLmNhc3QocmVzdWx0LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbigiV2UgYXJlIHVuYWJsZSB0byBmaW5kIHRoZSB2YWx1ZSBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvICIgKyBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRoaXNFeHByKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlc3VsdCA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLnNvbHZlKChUaGlzRXhwcikgbm9kZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXN1bHQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDbGFzcy5jYXN0KHJlc3VsdC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIldlIGFyZSB1bmFibGUgdG8gZmluZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvICIgKyBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgeworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gcmVzdWx0ID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmUoKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgbm9kZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q2xhc3MuaXNJbnN0YW5jZShyZXN1bHQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDbGFzcy5jYXN0KHJlc3VsdC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIldlIGFyZSB1bmFibGUgdG8gZmluZCB0aGUgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byAiICsgbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIGlmIChSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uLmNsYXNzLmVxdWFscyhyZXN1bHRDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gKFBhcmFtZXRlcilub2RlOworICAgICAgICAgICAgICAgIENhbGxhYmxlRGVjbGFyYXRpb24gY2FsbGFibGVEZWNsYXJhdGlvbiA9IG5vZGUuZmluZFBhcmVudChDYWxsYWJsZURlY2xhcmF0aW9uLmNsYXNzKS5nZXQoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbiByZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGFibGVEZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSkgeworICAgICAgICAgICAgICAgICAgICByZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbiA9IGNhbGxhYmxlRGVjbGFyYXRpb24uYXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkucmVzb2x2ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uID0gY2FsbGFibGVEZWNsYXJhdGlvbi5hc01ldGhvZERlY2xhcmF0aW9uKCkucmVzb2x2ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxyZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpO2krKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRNZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaSkuZ2V0TmFtZSgpLmVxdWFscyhwYXJhbWV0ZXIuZ2V0TmFtZUFzU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2xhc3MuY2FzdChyZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCB0aGUgZGVjbGFyYXRpb24gb2YgdHlwZSAiICsgcmVzdWx0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIG5vZGUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCB0b1Jlc29sdmVkVHlwZShUeXBlIGphdmFwYXJzZXJUeXBlLCBDbGFzczxUPiByZXN1bHRDbGFzcykgeworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzb2x2ZWRUeXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UoamF2YXBhcnNlclR5cGUsIGphdmFwYXJzZXJUeXBlKTsKKyAgICAgICAgaWYgKHJlc3VsdENsYXNzLmlzSW5zdGFuY2UocmVzb2x2ZWRUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzLmNhc3QocmVzb2x2ZWRUeXBlKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgdGhlIHJlc29sdmVkIHR5cGUgb2YgY2xhc3MgIgorICAgICAgICAgICAgICAgICsgcmVzdWx0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIiBmcm9tICIgKyBqYXZhcGFyc2VyVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBjYWxjdWxhdGVUeXBlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShleHByZXNzaW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvU291cmNlRmlsZUluZm9FeHRyYWN0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMmMwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvU291cmNlRmlsZUluZm9FeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCisvKioKKyAqIEl0IHByaW50cyBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSBhIHNvdXJjZSBmaWxlLiBJdCBpcyBtYWlubHkgaW50ZW5kZWQgYXMgYW4gZXhhbXBsZSB1c2FnZSBvZiBKYXZhU3ltYm9sU29sdmVyLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgU291cmNlRmlsZUluZm9FeHRyYWN0b3IgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwcml2YXRlIGludCBvayA9IDA7CisgICAgcHJpdmF0ZSBpbnQga28gPSAwOworICAgIHByaXZhdGUgaW50IHVuc3VwcG9ydGVkID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHJpbnRGaWxlTmFtZSA9IHRydWU7CisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQgPSBTeXN0ZW0ub3V0OworICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKKworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIHNldFByaW50RmlsZU5hbWUoYm9vbGVhbiBwcmludEZpbGVOYW1lKSB7CisgICAgICAgIHRoaXMucHJpbnRGaWxlTmFtZSA9IHByaW50RmlsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG9rID0gMDsKKyAgICAgICAga28gPSAwOworICAgICAgICB1bnN1cHBvcnRlZCA9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3V0KFByaW50U3RyZWFtIG91dCkgeworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnIoUHJpbnRTdHJlYW0gZXJyKSB7CisgICAgICAgIHRoaXMuZXJyID0gZXJyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T2soKSB7CisgICAgICAgIHJldHVybiBvazsKKworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VW5zdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEtvKCkgeworICAgICAgICByZXR1cm4ga287CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNvbHZlVHlwZURlY2woQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGUpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKG5vZGUpOworICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmlzQ2xhc3MoKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIlxuWyBDbGFzcyAiICsgdHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSArICIgXSIpOworICAgICAgICAgICAgZm9yIChSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc2MgOiB0eXBlRGVjbGFyYXRpb24uYXNDbGFzcygpLmdldEFsbFN1cGVyQ2xhc3NlcygpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgc3VwZXJjbGFzczogIiArIHNjLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBzYyA6IHR5cGVEZWNsYXJhdGlvbi5hc0NsYXNzKCkuZ2V0QWxsSW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgaW50ZXJmYWNlOiAiICsgc2MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzb2x2ZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHNvbHZlVHlwZURlY2woKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgbm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIGlmICgocmVxdWlyZVBhcmVudE5vZGUobm9kZSkgaW5zdGFuY2VvZiBJbXBvcnREZWNsYXJhdGlvbikgfHwgKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpIGluc3RhbmNlb2YgRXhwcmVzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgfHwgKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pCisgICAgICAgICAgICAgICAgICAgIHx8IChyZXF1aXJlUGFyZW50Tm9kZShub2RlKSBpbnN0YW5jZW9mIFBhY2thZ2VEZWNsYXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwCisgICAgICAgICAgICB9IGVsc2UgaWYgKChyZXF1aXJlUGFyZW50Tm9kZShub2RlKSBpbnN0YW5jZW9mIFN0YXRlbWVudCkgfHwgKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdG9yKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKG5vZGUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICBMaW5lICIgKyBub2RlLmdldFJhbmdlKCkuZ2V0KCkuYmVnaW4ubGluZSArICIpICIgKyBub2RlICsgIiA9PT4gIiArIHJlZi5kZXNjcmliZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgb2srKzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgZXJyLnByaW50bG4odXBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHVwZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgICAgIGtvKys7CisgICAgICAgICAgICAgICAgICAgIGVyci5wcmludGxuKHJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzb2x2ZU1ldGhvZENhbGxzKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiICBMaW5lICIgKyBub2RlLmdldEJlZ2luKCkuZ2V0KCkubGluZSArICIpICIgKyBub2RlICsgIiA9PT4gIiArIHRvU3RyaW5nKChNZXRob2RDYWxsRXhwcikgbm9kZSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IG5vZGUuZ2V0Q2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICBzb2x2ZU1ldGhvZENhbGxzKGNoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKE1ldGhvZENhbGxFeHByIG5vZGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiB0b1N0cmluZyhKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZShub2RlKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgcmVzb2x2aW5nIGNhbGwgYXQgTCIgKyBub2RlLmdldEJlZ2luKCkuZ2V0KCkubGluZSArICI6ICIgKyBub2RlKTsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UpIHsKKyAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvblN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiVU5TT0xWRUQiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PE5vZGU+IGNvbGxlY3RBbGxOb2RlcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgTGlzdDxOb2RlPiBub2RlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgY29sbGVjdEFsbE5vZGVzKG5vZGUsIG5vZGVzKTsKKyAgICAgICAgbm9kZXMuc29ydCgobjEsIG4yKSAtPiBuMS5nZXRCZWdpbigpLmdldCgpLmNvbXBhcmVUbyhuMi5nZXRCZWdpbigpLmdldCgpKSk7CisgICAgICAgIHJldHVybiBub2RlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29sbGVjdEFsbE5vZGVzKE5vZGUgbm9kZSwgTGlzdDxOb2RlPiBub2RlcykgeworICAgICAgICBub2Rlcy5hZGQobm9kZSk7CisgICAgICAgIG5vZGUuZ2V0Q2hpbGROb2RlcygpLmZvckVhY2goYyAtPiBjb2xsZWN0QWxsTm9kZXMoYywgbm9kZXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGUubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBzb2x2ZShmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSkgeworICAgICAgICAgICAgICAgIGlmIChwcmludEZpbGVOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCItIHBhcnNpbmcgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGZpbGUpOworICAgICAgICAgICAgICAgIExpc3Q8Tm9kZT4gbm9kZXMgPSBjb2xsZWN0QWxsTm9kZXMoY3UpOworICAgICAgICAgICAgICAgIG5vZGVzLmZvckVhY2gobiAtPiBzb2x2ZShuKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZENhbGxzKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogZmlsZS5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgICAgIHNvbHZlTWV0aG9kQ2FsbHMoZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJpbnRGaWxlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLSBwYXJzaW5nICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShmaWxlKTsKKyAgICAgICAgICAgICAgICBzb2x2ZU1ldGhvZENhbGxzKGN1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVTb2x2ZXIoVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvY29yZS9yZXNvbHV0aW9uL0NvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9jb3JlL3Jlc29sdXRpb24vQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvY29yZS9yZXNvbHV0aW9uL0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBDb250ZXh0IGlzIHZlcnkgc2ltaWxhciB0byBzY29wZS4KKyAqIEluIHRoZSBjb250ZXh0IHdlIGxvb2sgZm9yIHNvbHZpbmcgc3ltYm9scy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKKworICAgIENvbnRleHQgZ2V0UGFyZW50KCk7CisKKyAgICAvKiBUeXBlIHJlc29sdXRpb24gKi8KKworICAgIGRlZmF1bHQgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBzb2x2ZUdlbmVyaWNUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgZGVmYXVsdCBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHNvbHZlVHlwZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIENvbnRleHQgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50LnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFN5bWJvbCByZXNvbHV0aW9uICovCisKKyAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcik7CisKKyAgICBkZWZhdWx0IE9wdGlvbmFsPFZhbHVlPiBzb2x2ZVN5bWJvbEFzVmFsdWUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgVmFsdWUgdmFsdWUgPSBWYWx1ZS5mcm9tKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb25zdHJ1Y3RvciByZXNvbHV0aW9uICovCisKKyAgICAvKioKKyAgICAgKiBXZSBmaW5kIHRoZSBtZXRob2QgZGVjbGFyYXRpb24gd2hpY2ggaXMgdGhlIGJlc3QgbWF0Y2ggZm9yIHRoZSBnaXZlbiBuYW1lIGFuZCBsaXN0IG9mIHR5cGVQYXJhbWV0ZXJzVmFsdWVzLgorICAgICAqLworICAgIGRlZmF1bHQgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gc29sdmVDb25zdHJ1Y3RvcihMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25zdHJ1Y3RvciByZXNvbHV0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IG9uIENsYXNzIENvbnRleHQiKTsKKyAgICB9CisKKyAgICAvKiBNZXRob2RzIHJlc29sdXRpb24gKi8KKworICAgIC8qKgorICAgICAqIFdlIGZpbmQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbiB3aGljaCBpcyB0aGUgYmVzdCBtYXRjaCBmb3IgdGhlIGdpdmVuIG5hbWUgYW5kIGxpc3Qgb2YgdHlwZVBhcmFtZXRlcnNWYWx1ZXMuCisgICAgICovCisgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKTsKKworICAgIC8qKgorICAgICAqIFNpbWlsYXIgdG8gc29sdmVNZXRob2QgYnV0IHdlIHJldHVybiBhIE1ldGhvZFVzYWdlLiBBIE1ldGhvZFVzYWdlIGNvcnJlc3BvbmRzIHRvIGEgTWV0aG9kRGVjbGFyYXRpb24gcGx1cyB0aGUKKyAgICAgKiByZXNvbHZlZCB0eXBlIHZhcmlhYmxlcy4KKyAgICAgKi8KKyAgICBkZWZhdWx0IE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBzb2x2ZU1ldGhvZEFzVXNhZ2UoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RTb2x2ZWQgPSBzb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpOworICAgICAgICBpZiAobWV0aG9kU29sdmVkLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RTb2x2ZWQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9IENvbnRleHRIZWxwZXIucmVzb2x2ZVR5cGVWYXJpYWJsZXModGhpcywgbWV0aG9kRGVjbGFyYXRpb24sIGFyZ3VtZW50c1R5cGVzKTsvL21ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVUeXBlVmFyaWFibGVzKHRoaXMsIGFyZ3VtZW50c1R5cGVzKTsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihtZXRob2RVc2FnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9jb3JlL3Jlc29sdXRpb24vQ29udGV4dEhlbHBlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2NvcmUvcmVzb2x1dGlvbi9Db250ZXh0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9jb3JlL3Jlc29sdXRpb24vQ29udGV4dEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworY2xhc3MgQ29udGV4dEhlbHBlciB7CisKKyAgICBwcml2YXRlIENvbnRleHRIZWxwZXIoKSB7CisgICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIHN0YXRpYyBNZXRob2RVc2FnZSByZXNvbHZlVHlwZVZhcmlhYmxlcyhDb250ZXh0IGNvbnRleHQsIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb24pLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbnRleHQsIHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChKYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbikgbWV0aG9kRGVjbGFyYXRpb24pLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbnRleHQsIHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24uVmFsdWVzTWV0aG9kKSB7CisgICAgICAgICAgICByZXR1cm4gKChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLlZhbHVlc01ldGhvZCkgbWV0aG9kRGVjbGFyYXRpb24pLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbnRleHQsIHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2REZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFJlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoUmVmbGVjdGlvbk1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbikucmVzb2x2ZVR5cGVWYXJpYWJsZXMoY29udGV4dCwgcGFyYW1ldGVyVHlwZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvZGVjbGFyYXRpb25zL2NvbW1vbi9NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvZGVjbGFyYXRpb25zL2NvbW1vbi9NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwMDYzNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9kZWNsYXJhdGlvbnMvY29tbW9uL01ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWMuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmRlY2xhcmF0aW9ucy5jb21tb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLk15T2JqZWN0UHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWMgeworCisgICAgcHJpdmF0ZSBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWMoUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHRoaXMubWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2REZWNsYXJhdGlvbjsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kVXNhZ2UgcmVzb2x2ZVR5cGVWYXJpYWJsZXMoQ29udGV4dCBjb250ZXh0LCBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJldHVyblR5cGUgPSByZXBsYWNlVHlwZVBhcmFtcyhtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCksIHR5cGVTb2x2ZXIsIGNvbnRleHQpOworICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kRGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKTsgaSsrKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcmVwbGFjZWQgPSByZXBsYWNlVHlwZVBhcmFtcyhtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbShpKS5nZXRUeXBlKCksIHR5cGVTb2x2ZXIsIGNvbnRleHQpOworICAgICAgICAgICAgcGFyYW1zLmFkZChyZXBsYWNlZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBub3cgbG9vayBhdCB0aGUgdHlwZSBwYXJhbWV0ZXIgZm9yIHRoZSBtZXRob2Qgd2hpY2ggd2UgY2FuIGRlcml2ZSBmcm9tIHRoZSBwYXJhbWV0ZXIgdHlwZXMKKyAgICAgICAgLy8gYW5kIHRoZW4gd2UgcmVwbGFjZSB0aGVtIGluIHRoZSByZXR1cm4gdHlwZQorICAgICAgICAvLyBNYXA8VHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBUeXBlPiBkZXRlcm1pbmVkVHlwZVBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIEluZmVyZW5jZUNvbnRleHQgaW5mZXJlbmNlQ29udGV4dCA9IG5ldyBJbmZlcmVuY2VDb250ZXh0KE15T2JqZWN0UHJvdmlkZXIuSU5TVEFOQ0UpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZERlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkgLSAobWV0aG9kRGVjbGFyYXRpb24uaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSA/IDEgOiAwKTsgaSsrKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZm9ybWFsUGFyYW1UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGFjdHVhbFBhcmFtVHlwZSA9IHBhcmFtZXRlclR5cGVzLmdldChpKTsKKyAgICAgICAgICAgIGluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihmb3JtYWxQYXJhbVR5cGUsIGFjdHVhbFBhcmFtVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm5UeXBlID0gaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKHJldHVyblR5cGUpKTsKKworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlKG1ldGhvZERlY2xhcmF0aW9uLCBwYXJhbXMsIHJldHVyblR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHJlcGxhY2VUeXBlUGFyYW1zKFJlc29sdmVkVHlwZSB0eXBlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAodHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyID0gdHlwZS5hc1R5cGVQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIGlmICh0eXBlUGFyYW1ldGVyLmRlY2xhcmVkT25UeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbSA9IHR5cGVQYXJhbUJ5TmFtZSh0eXBlUGFyYW1ldGVyLmdldE5hbWUoKSwgdHlwZVNvbHZlciwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVQYXJhbS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnRyYW5zZm9ybVR5cGVQYXJhbWV0ZXJzKHRwIC0+IHJlcGxhY2VUeXBlUGFyYW1zKHRwLCB0eXBlU29sdmVyLCBjb250ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1CeU5hbWUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLmZpbHRlcih0cCAtPiB0cC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5tYXAodHAgLT4gdG9UeXBlKHRwKSkuZmluZEZpcnN0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlc29sdmVkVHlwZSB0b1R5cGUoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlci9OYXZpZ2F0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VyL05hdmlnYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2VhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlci9OYXZpZ2F0b3IuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBlYXNpbHkgcmV0cmlldmUgbm9kZXMgZnJvbSBhIEphdmFQYXJzZXIgQVNULgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yIHsKKworICAgIHByaXZhdGUgTmF2aWdhdG9yKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgTm9kZS5nZXRQYXJlbnROb2RlCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIE5vZGUgZ2V0UGFyZW50Tm9kZShOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5vZGUgcmVxdWlyZVBhcmVudE5vZGUoTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBub2RlLmdldFBhcmVudE5vZGUoKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJlbnQgbm90IGZvdW5kLCB0aGUgbm9kZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW5zZXJ0ZWQgaW4gYSBjb3JyZWN0IEFTVCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbjw/Pj4gZmluZFR5cGUoQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworICAgICAgICBpZiAoY3UuZ2V0VHlwZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVOYW1lID0gZ2V0T3V0ZXJUeXBlTmFtZShxdWFsaWZpZWROYW1lKTsKKyAgICAgICAgT3B0aW9uYWw8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlID0gY3UuZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoKHQpIC0+IHQuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKHR5cGVOYW1lKSkuZmluZEZpcnN0KCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGlubmVyVHlwZU5hbWUgPSBnZXRJbm5lclR5cGVOYW1lKHF1YWxpZmllZE5hbWUpOworICAgICAgICBpZiAodHlwZS5pc1ByZXNlbnQoKSAmJiAhaW5uZXJUeXBlTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5kVHlwZSh0eXBlLmdldCgpLCBpbm5lclR5cGVOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbjw/Pj4gZmluZFR5cGUoVHlwZURlY2xhcmF0aW9uPD8+IHRkLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZU5hbWUgPSBnZXRPdXRlclR5cGVOYW1lKHF1YWxpZmllZE5hbWUpOworCisgICAgICAgIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbjw/Pj4gdHlwZSA9IE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIGZvciAoTm9kZSBuIDogdGQuZ2V0TWVtYmVycygpKSB7CisgICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbiAmJiAoKFR5cGVEZWNsYXJhdGlvbjw/PikgbikuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKHR5cGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBPcHRpb25hbC5vZigoVHlwZURlY2xhcmF0aW9uPD8+KSBuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgaW5uZXJUeXBlTmFtZSA9IGdldElubmVyVHlwZU5hbWUocXVhbGlmaWVkTmFtZSk7CisgICAgICAgIGlmICh0eXBlLmlzUHJlc2VudCgpICYmICFpbm5lclR5cGVOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZpbmRUeXBlKHR5cGUuZ2V0KCksIGlubmVyVHlwZU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGRlbWFuZENsYXNzKENvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNkID0gZGVtYW5kQ2xhc3NPckludGVyZmFjZShjdSwgcXVhbGlmaWVkTmFtZSk7CisgICAgICAgIGlmIChjZC5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUeXBlIGlzIG5vdCBhIGNsYXNzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNkOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRW51bURlY2xhcmF0aW9uIGRlbWFuZEVudW0oQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworICAgICAgICBPcHRpb25hbDxUeXBlRGVjbGFyYXRpb248Pz4+IHJlcyA9IGZpbmRUeXBlKGN1LCBxdWFsaWZpZWROYW1lKTsKKyAgICAgICAgaWYgKCFyZXMuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHR5cGUgZm91bmQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShyZXMuZ2V0KCkgaW5zdGFuY2VvZiBFbnVtRGVjbGFyYXRpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUeXBlIGlzIG5vdCBhbiBlbnVtIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIHJlcy5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlY2xhcmF0aW9uIGRlbWFuZE1ldGhvZChUeXBlRGVjbGFyYXRpb248Pz4gY2QsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGZvdW5kID0gbnVsbDsKKyAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb248Pz4gYmQgOiBjZC5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChiZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJkOworICAgICAgICAgICAgICAgIGlmIChtZC5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFtYmlndW91cyBnZXROYW1lIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIG1ldGhvZCBjYWxsZWQgIiArIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3VuZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFZhcmlhYmxlRGVjbGFyYXRvciBkZW1hbmRGaWVsZChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2QsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uPD8+IGJkIDogY2QuZ2V0TWVtYmVycygpKSB7CisgICAgICAgICAgICBpZiAoYmQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmZCA9IChGaWVsZERlY2xhcmF0aW9uKSBiZDsKKyAgICAgICAgICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRvciB2ZCA6IGZkLmdldFZhcmlhYmxlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZC5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBmaWVsZCB3aXRoIGdpdmVuIG5hbWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPE5hbWVFeHByPiBmaW5kTmFtZUV4cHJlc3Npb24oTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbm9kZS5maW5kRmlyc3QoTmFtZUV4cHIuY2xhc3MsIG4gLT4gbi5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMobmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U2ltcGxlTmFtZT4gZmluZFNpbXBsZU5hbWUoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbm9kZS5maW5kRmlyc3QoU2ltcGxlTmFtZS5jbGFzcywgbiAtPiBuLmFzU3RyaW5nKCkuZXF1YWxzKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8TWV0aG9kQ2FsbEV4cHI+IGZpbmRNZXRob2RDYWxsKE5vZGUgbm9kZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuZmluZEZpcnN0KE1ldGhvZENhbGxFeHByLmNsYXNzLCBuIC0+IG4uZ2V0TmFtZUFzU3RyaW5nKCkuZXF1YWxzKG1ldGhvZE5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFZhcmlhYmxlRGVjbGFyYXRvcj4gZGVtYW5kVmFyaWFibGVEZWNsYXJhdGlvbihOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBub2RlLmZpbmRGaXJzdChWYXJpYWJsZURlY2xhcmF0b3IuY2xhc3MsIG4gLT4gbi5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMobmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGRlbWFuZENsYXNzT3JJbnRlcmZhY2UoQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRUeXBlKGNvbXBpbGF0aW9uVW5pdCwgcXVhbGlmaWVkTmFtZSkKKyAgICAgICAgICAgICAgICAubWFwKHJlcyAtPiByZXMudG9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUeXBlIGlzIG5vdCBhIGNsYXNzIG9yIGFuIGludGVyZmFjZSwgaXQgaXMgIiArIHJlcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSkpKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyB0eXBlIG5hbWVkICciICsgcXVhbGlmaWVkTmFtZSArICInZm91bmQiKSk7CisgICAgfQorCisgICAgLy8gVE9ETyBzaG91bGQgYmUgZGVtYW5kIG9yIHJlcXVpcmVTd2l0Y2gKKyAgICBwdWJsaWMgc3RhdGljIFN3aXRjaFN0bXQgZmluZFN3aXRjaChOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGZpbmRTd2l0Y2hIZWxwZXIobm9kZSkub3JFbHNlVGhyb3coSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOjpuZXcpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPE4gZXh0ZW5kcyBOb2RlPiBOIGZpbmROb2RlT2ZHaXZlbkNsYXNzKE5vZGUgbm9kZSwgQ2xhc3M8Tj4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuZmluZEZpcnN0KGNsYXp6KS5vckVsc2VUaHJvdyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb246Om5ldyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIE5vZGUuZmluZEFsbCBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIDxOIGV4dGVuZHMgTm9kZT4gTGlzdDxOPiBmaW5kQWxsTm9kZXNPZkdpdmVuQ2xhc3MoTm9kZSBub2RlLCBDbGFzczxOPiBjbGF6eikgeworICAgICAgICByZXR1cm4gbm9kZS5maW5kQWxsKGNsYXp6KTsKKyAgICB9CisKKyAgICAvLyBUT0RPIHNob3VsZCBiZSBkZW1hbmQgb3IgcmVxdWlyZS4uLgorICAgIHB1YmxpYyBzdGF0aWMgUmV0dXJuU3RtdCBmaW5kUmV0dXJuU3RtdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIGZpbmROb2RlT2ZHaXZlbkNsYXNzKG1ldGhvZCwgUmV0dXJuU3RtdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIE5vZGUuZmluZFBhcmVudCBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIDxOIGV4dGVuZHMgTm9kZT4gT3B0aW9uYWw8Tj4gZmluZEFuY2VzdG9yKE5vZGUgbm9kZSwgQ2xhc3M8Tj4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuZmluZFBhcmVudChjbGF6eik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFByaXZhdGUgbWV0aG9kcworICAgIC8vLworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE91dGVyVHlwZU5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWUuc3BsaXQoIlxcLiIsIDIpWzBdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbm5lclR5cGVOYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7CisgICAgICAgIGlmIChxdWFsaWZpZWROYW1lLmNvbnRhaW5zKCIuIikpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZWROYW1lLnNwbGl0KCJcXC4iLCAyKVsxXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8U3dpdGNoU3RtdD4gZmluZFN3aXRjaEhlbHBlcihOb2RlIG5vZGUpIHsKKyAgICAgICAgLy8gVE9ETyBjYW4gYmUgcmVwbGFjZWQgYnkgZmluZEZpcnN0IHdpdGggdGhlIGNvcnJlY3QgYWxnb3JpdGhtLgorICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFN3aXRjaFN0bXQpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZigoU3dpdGNoU3RtdCkgbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogbm9kZS5nZXRDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgIE9wdGlvbmFsPFN3aXRjaFN0bXQ+IHJlc0NoaWxkID0gZmluZFN3aXRjaEhlbHBlcihjaGlsZCk7CisgICAgICAgICAgICBpZiAocmVzQ2hpbGQuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzQ2hpbGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXIvcGFja2FnZS1pbmZvLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlci9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVmMjAyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXIvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHV0aWxpdHkgdG8gdXNlIEphdmFQYXJzZXIuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvRGVmYXVsdFZpc2l0b3JBZGFwdGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0RlZmF1bHRWaXNpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWVmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0RlZmF1bHRWaXNpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNDc1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm1vZHVsZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdFZpc2l0b3JBZGFwdGVyIGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8UmVzb2x2ZWRUeXBlLCBCb29sZWFuPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChDb21waWxhdGlvblVuaXQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChUeXBlUGFyYW1ldGVyIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTGluZUNvbW1lbnQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChCbG9ja0NvbW1lbnQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEFubm90YXRpb25EZWNsYXJhdGlvbiBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3Igbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChQYXJhbWV0ZXIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChJbml0aWFsaXplckRlY2xhcmF0aW9uIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoSmF2YWRvY0NvbW1lbnQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChDbGFzc09ySW50ZXJmYWNlVHlwZSBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChBcnJheVR5cGUgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChBcnJheUNyZWF0aW9uTGV2ZWwgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChJbnRlcnNlY3Rpb25UeXBlIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVW5pb25UeXBlIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVm9pZFR5cGUgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChXaWxkY2FyZFR5cGUgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChVbmtub3duVHlwZSBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEFycmF5QWNjZXNzRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEFycmF5Q3JlYXRpb25FeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQXJyYXlJbml0aWFsaXplckV4cHIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChBc3NpZ25FeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQmluYXJ5RXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KENhc3RFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQ2xhc3NFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQ29uZGl0aW9uYWxFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoRW5jbG9zZWRFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoRmllbGRBY2Nlc3NFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoSW5zdGFuY2VPZkV4cHIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChTdHJpbmdMaXRlcmFsRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEludGVnZXJMaXRlcmFsRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KExvbmdMaXRlcmFsRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KENoYXJMaXRlcmFsRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KERvdWJsZUxpdGVyYWxFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQm9vbGVhbkxpdGVyYWxFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTnVsbExpdGVyYWxFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTWV0aG9kQ2FsbEV4cHIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChOYW1lRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KE9iamVjdENyZWF0aW9uRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFRoaXNFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoU3VwZXJFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVW5hcnlFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChNYXJrZXJBbm5vdGF0aW9uRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTm9ybWFsQW5ub3RhdGlvbkV4cHIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQXNzZXJ0U3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEJsb2NrU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KExhYmVsZWRTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoRW1wdHlTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoRXhwcmVzc2lvblN0bXQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChTd2l0Y2hTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoU3dpdGNoRW50cnlTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQnJlYWtTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoUmV0dXJuU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KElmU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFdoaWxlU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KENvbnRpbnVlU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KERvU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEZvcmVhY2hTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoRm9yU3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFRocm93U3RtdCBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFN5bmNocm9uaXplZFN0bXQgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChUcnlTdG10IG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChMYW1iZGFFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTWV0aG9kUmVmZXJlbmNlRXhwciBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFR5cGVFeHByIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTm9kZUxpc3Qgbm9kZSwgQm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChOYW1lIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoU2ltcGxlTmFtZSBub2RlLCBCb29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUsIEJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTW9kdWxlRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBhcmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoTW9kdWxlUmVxdWlyZXNTdG10IG5vZGUsIEJvb2xlYW4gYXJnKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KE1vZHVsZUV4cG9ydHNTdG10IG5vZGUsIEJvb2xlYW4gYXJnKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KE1vZHVsZVByb3ZpZGVzU3RtdCBub2RlLCBCb29sZWFuIGFyZykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChNb2R1bGVVc2VzU3RtdCBub2RlLCBCb29sZWFuIGFyZykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChNb2R1bGVPcGVuc1N0bXQgbm9kZSwgQm9vbGVhbiBhcmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVW5wYXJzYWJsZVN0bXQgbm9kZSwgQm9vbGVhbiBhcmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoUmVjZWl2ZXJQYXJhbWV0ZXIgbm9kZSwgQm9vbGVhbiBhcmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVmFyVHlwZSBub2RlLCBCb29sZWFuIGFyZykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9KYXZhUGFyc2VyRmFjYWRlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0phdmFQYXJzZXJGYWNhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNkZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9KYXZhUGFyc2VyRmFjYWRlLmphdmEKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5GaWVsZEFjY2Vzc0NvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5yZXF1aXJlUGFyZW50Tm9kZTsKKworLyoqCisgKiBDbGFzcyB0byBiZSB1c2VkIGJ5IGZpbmFsIHVzZXJzIHRvIHNvbHZlIHN5bWJvbHMgZm9yIEphdmFQYXJzZXIgQVNUcy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFQYXJzZXJGYWNhZGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSmF2YVBhcnNlckZhY2FkZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOworICAgICAgICBDb25zb2xlSGFuZGxlciBjb25zb2xlSGFuZGxlciA9IG5ldyBDb25zb2xlSGFuZGxlcigpOworICAgICAgICBjb25zb2xlSGFuZGxlci5zZXRMZXZlbChMZXZlbC5JTkZPKTsKKyAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZUhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxUeXBlU29sdmVyLCBKYXZhUGFyc2VyRmFjYWRlPiBpbnN0YW5jZXMgPSBuZXcgV2Vha0hhc2hNYXA8PigpOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlcjsKKyAgICBwcml2YXRlIE1hcDxOb2RlLCBSZXNvbHZlZFR5cGU+IGNhY2hlV2l0aExhbWJkYXNTb2x2ZWQgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIE1hcDxOb2RlLCBSZXNvbHZlZFR5cGU+IGNhY2hlV2l0aG91dExhbWJkYXNTb2x2ZWQgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIFR5cGVFeHRyYWN0b3IgdHlwZUV4dHJhY3RvcjsKKworICAgIHByaXZhdGUgSmF2YVBhcnNlckZhY2FkZShUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlci5nZXRSb290KCk7CisgICAgICAgIHRoaXMuc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKTsKKyAgICAgICAgdGhpcy50eXBlRXh0cmFjdG9yID0gbmV3IFR5cGVFeHRyYWN0b3IodHlwZVNvbHZlciwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIFR5cGVTb2x2ZXIgZ2V0VHlwZVNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFNvbHZlciBnZXRTeW1ib2xTb2x2ZXIoKSB7CisgICAgICAgIHJldHVybiBzeW1ib2xTb2x2ZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBKYXZhUGFyc2VyRmFjYWRlIGdldChUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlcy5jb21wdXRlSWZBYnNlbnQodHlwZVNvbHZlciwgSmF2YVBhcnNlckZhY2FkZTo6bmV3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNsZWFyIGludGVybmFsIGNhY2hlcyBmb3IgdGhlIHNha2Ugb2YgcmVsZWFzaW5nIG1lbW9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJJbnN0YW5jZXMoKSB7CisgICAgICAgIGluc3RhbmNlcy5jbGVhcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgUmVzb2x2ZWRUeXBlIHNvbHZlR2VuZXJpY1R5cGVzKFJlc29sdmVkVHlwZSB0eXBlLCBDb250ZXh0IGNvbnRleHQsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKHR5cGUuZGVzY3JpYmUoKSwgdHlwZVNvbHZlcikub3JFbHNlKHR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgaWYgKHR5cGUuYXNXaWxkY2FyZCgpLmlzRXh0ZW5kcygpIHx8IHR5cGUuYXNXaWxkY2FyZCgpLmlzU3VwZXIoKSkgeworICAgICAgICAgICAgICAgIFJlc29sdmVkV2lsZGNhcmQgd2lsZGNhcmRVc2FnZSA9IHR5cGUuYXNXaWxkY2FyZCgpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBib3VuZFJlc29sdmVkID0gc29sdmVHZW5lcmljVHlwZXMod2lsZGNhcmRVc2FnZS5nZXRCb3VuZGVkVHlwZSgpLCBjb250ZXh0LCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRVc2FnZS5pc0V4dGVuZHMoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQoYm91bmRSZXNvbHZlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuc3VwZXJCb3VuZChib3VuZFJlc29sdmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZShOYW1lRXhwciBuYW1lRXhwcikgeworICAgICAgICByZXR1cm4gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sKG5hbWVFeHByLmdldE5hbWUoKS5nZXRJZCgpLCBuYW1lRXhwcik7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZShTaW1wbGVOYW1lIG5hbWVFeHByKSB7CisgICAgICAgIHJldHVybiBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2wobmFtZUV4cHIuZ2V0SWQoKSwgbmFtZUV4cHIpOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmUoRXhwcmVzc2lvbiBleHByKSB7CisgICAgICAgIHJldHVybiBleHByLnRvTmFtZUV4cHIoKS5tYXAodGhpczo6c29sdmUpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXhwci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmUoTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIpIHsKKyAgICAgICAgcmV0dXJuIHNvbHZlKG1ldGhvZENhbGxFeHByLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gc29sdmUoT2JqZWN0Q3JlYXRpb25FeHByIG9iamVjdENyZWF0aW9uRXhwcikgeworICAgICAgICByZXR1cm4gc29sdmUob2JqZWN0Q3JlYXRpb25FeHByLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gc29sdmUoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgeworICAgICAgICByZXR1cm4gc29sdmUoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gc29sdmUoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCwgYm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50VHlwZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIExpc3Q8TGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI+IHBsYWNlaG9sZGVycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBzb2x2ZUFyZ3VtZW50cyhleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQsIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmd1bWVudHMoKSwgc29sdmVMYW1iZGFzLCBhcmd1bWVudFR5cGVzLCBwbGFjZWhvbGRlcnMpOworCisgICAgICAgIE9wdGlvbmFsPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gb3B0QW5jZXN0b3IgPSBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0QW5jZXN0b3JPZlR5cGUoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgaWYgKCFvcHRBbmNlc3Rvci5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc05vZGUgPSBvcHRBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBudWxsOworICAgICAgICBpZiAoIWV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5pc1RoaXMoKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGNsYXNzRGVjbCA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQoY2xhc3NOb2RlLmdldEV4dGVuZGVkVHlwZXMoMCksIGNsYXNzTm9kZSk7CisgICAgICAgICAgICBpZiAoY2xhc3NEZWNsLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgdHlwZURlY2wgPSBjbGFzc0RlY2wuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHNyID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjbGFzc05vZGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShjbGFzc05vZGUuZ2V0TmFtZUFzU3RyaW5nKCksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHNyLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICB0eXBlRGVjbCA9IHNyLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0eXBlRGVjbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gcmVzID0gQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKCgoUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbCkuZ2V0Q29uc3RydWN0b3JzKCksIGFyZ3VtZW50VHlwZXMsIHR5cGVTb2x2ZXIpOworICAgICAgICBmb3IgKExhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyIDogcGxhY2Vob2xkZXJzKSB7CisgICAgICAgICAgICBwbGFjZWhvbGRlci5zZXRNZXRob2QocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHNvbHZlKFRoaXNFeHByIG5vZGUpIHsKKyAgICAgICAgLy8gSWYgJ3RoaXMnIGlzIHByZWZpeGVkIGJ5IGEgY2xhc3MgZWcuIE15Q2xhc3MudGhpcworICAgICAgICBpZiAobm9kZS5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgLy8gR2V0IHRoZSBjbGFzcyBuYW1lCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbm9kZS5nZXRDbGFzc0V4cHIoKS5nZXQoKS50b1N0cmluZygpOworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZXNvbHZlIHVzaW5nIGEgdHlwZVNvbHZlcgorICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjbGF6eiA9IHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGlmIChjbGF6ei5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoY2xhenouZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZXNvbHZlIGxvY2FsbHkgaW4gQ29tcGlsYXRpb24gdW5pdAorICAgICAgICAgICAgT3B0aW9uYWw8Q29tcGlsYXRpb25Vbml0PiBjdSA9IG5vZGUuZ2V0QW5jZXN0b3JPZlR5cGUoQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChjdS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIE9wdGlvbmFsPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gY2xhc3NCeU5hbWUgPSBjdS5nZXQoKS5nZXRDbGFzc0J5TmFtZShjbGFzc05hbWUpOworICAgICAgICAgICAgICAgIGlmIChjbGFzc0J5TmFtZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChnZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NCeU5hbWUuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoZ2V0VHlwZURlY2xhcmF0aW9uKGZpbmRDb250YWluaW5nVHlwZURlY2xPck9iamVjdENyZWF0aW9uRXhwcihub2RlKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29uc3RydWN0b3IgY2FsbCBmaW5kIG91dCB0byB3aGljaCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBpdCBjb3JyZXNwb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gc29sdmUoT2JqZWN0Q3JlYXRpb25FeHByIG9iamVjdENyZWF0aW9uRXhwciwgYm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50VHlwZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIExpc3Q8TGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI+IHBsYWNlaG9sZGVycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBzb2x2ZUFyZ3VtZW50cyhvYmplY3RDcmVhdGlvbkV4cHIsIG9iamVjdENyZWF0aW9uRXhwci5nZXRBcmd1bWVudHMoKSwgc29sdmVMYW1iZGFzLCBhcmd1bWVudFR5cGVzLCBwbGFjZWhvbGRlcnMpOworCisgICAgICAgIFJlc29sdmVkVHlwZSBjbGFzc0RlY2wgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KG9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlKCksIG9iamVjdENyZWF0aW9uRXhwcik7CisgICAgICAgIGlmICghY2xhc3NEZWNsLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gcmVzID0gQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKCgoUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uKSBjbGFzc0RlY2wuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkpLmdldENvbnN0cnVjdG9ycygpLCBhcmd1bWVudFR5cGVzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgZm9yIChMYW1iZGFBcmd1bWVudFR5cGVQbGFjZWhvbGRlciBwbGFjZWhvbGRlciA6IHBsYWNlaG9sZGVycykgeworICAgICAgICAgICAgcGxhY2Vob2xkZXIuc2V0TWV0aG9kKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc29sdmVBcmd1bWVudHMoTm9kZSBub2RlLCBOb2RlTGlzdDxFeHByZXNzaW9uPiBhcmdzLCBib29sZWFuIHNvbHZlTGFtYmRhcywgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50VHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI+IHBsYWNlaG9sZGVycykgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoRXhwcmVzc2lvbiBwYXJhbWV0ZXJWYWx1ZSA6IGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZSBpbnN0YW5jZW9mIExhbWJkYUV4cHIgfHwgcGFyYW1ldGVyVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RSZWZlcmVuY2VFeHByKSB7CisgICAgICAgICAgICAgICAgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIgcGxhY2Vob2xkZXIgPSBuZXcgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIoaSk7CisgICAgICAgICAgICAgICAgYXJndW1lbnRUeXBlcy5hZGQocGxhY2Vob2xkZXIpOworICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5hZGQocGxhY2Vob2xkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudFR5cGVzLmFkZChKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKHBhcmFtZXRlclZhbHVlLCBzb2x2ZUxhbWJkYXMpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGNhbGN1bGF0ZSB0aGUgdHlwZSBvZiBhIHBhcmFtZXRlciBvZiBhIG1ldGhvZCBjYWxsLiBNZXRob2QgY2FsbDogJXMsIFBhcmFtZXRlcjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBhcmFtZXRlclZhbHVlKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBtZXRob2QgY2FsbCBmaW5kIG91dCB0byB3aGljaCBtZXRob2QgZGVjbGFyYXRpb24gaXQgY29ycmVzcG9uZHMuCisgICAgICovCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZShNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciwgYm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50VHlwZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIExpc3Q8TGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI+IHBsYWNlaG9sZGVycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBzb2x2ZUFyZ3VtZW50cyhtZXRob2RDYWxsRXhwciwgbWV0aG9kQ2FsbEV4cHIuZ2V0QXJndW1lbnRzKCksIHNvbHZlTGFtYmRhcywgYXJndW1lbnRUeXBlcywgcGxhY2Vob2xkZXJzKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVzID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChtZXRob2RDYWxsRXhwciwgdHlwZVNvbHZlcikuc29sdmVNZXRob2QobWV0aG9kQ2FsbEV4cHIuZ2V0TmFtZSgpLmdldElkKCksIGFyZ3VtZW50VHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgZm9yIChMYW1iZGFBcmd1bWVudFR5cGVQbGFjZWhvbGRlciBwbGFjZWhvbGRlciA6IHBsYWNlaG9sZGVycykgeworICAgICAgICAgICAgcGxhY2Vob2xkZXIuc2V0TWV0aG9kKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uPiBzb2x2ZShBbm5vdGF0aW9uRXhwciBhbm5vdGF0aW9uRXhwcikgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGFubm90YXRpb25FeHByLCB0eXBlU29sdmVyKTsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiB0eXBlRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UgPSBjb250ZXh0LnNvbHZlVHlwZShhbm5vdGF0aW9uRXhwci5nZXROYW1lQXNTdHJpbmcoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChSZXNvbHZlZEFubm90YXRpb25EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpOworICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGFubm90YXRpb25EZWNsYXJhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBzb2x2ZShGaWVsZEFjY2Vzc0V4cHIgZmllbGRBY2Nlc3NFeHByKSB7CisgICAgICAgIHJldHVybiAoKEZpZWxkQWNjZXNzQ29udGV4dCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChmaWVsZEFjY2Vzc0V4cHIsIHR5cGVTb2x2ZXIpKS5zb2x2ZUZpZWxkKGZpZWxkQWNjZXNzRXhwci5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShub2RlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFR5cGUoTm9kZSBub2RlLCBib29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICBpZiAoc29sdmVMYW1iZGFzKSB7CisgICAgICAgICAgICBpZiAoIWNhY2hlV2l0aExhbWJkYXNTb2x2ZWQuY29udGFpbnNLZXkobm9kZSkpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcmVzID0gZ2V0VHlwZUNvbmNyZXRlKG5vZGUsIHNvbHZlTGFtYmRhcyk7CisKKyAgICAgICAgICAgICAgICBjYWNoZVdpdGhMYW1iZGFzU29sdmVkLnB1dChub2RlLCByZXMpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWNvbmRQYXNzTmVjZXNzYXJ5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBNZXRob2RDYWxsRXhwcikgeworICAgICAgICAgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IChNZXRob2RDYWxsRXhwcikgbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChOb2RlIGFyZyA6IG1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlV2l0aExhbWJkYXNTb2x2ZWQuY29udGFpbnNLZXkoYXJnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoYXJnLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRQYXNzTmVjZXNzYXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2Vjb25kUGFzc05lY2Vzc2FyeSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZVdpdGhMYW1iZGFzU29sdmVkLnJlbW92ZShub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVXaXRoTGFtYmRhc1NvbHZlZC5wdXQobm9kZSwgZ2V0VHlwZShub2RlLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZ2dlci5maW5lcigiZ2V0VHlwZSBvbiAiICsgbm9kZSArICIgLT4gIiArIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGVXaXRoTGFtYmRhc1NvbHZlZC5nZXQobm9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IHJlcyA9IGZpbmQoY2FjaGVXaXRoTGFtYmRhc1NvbHZlZCwgbm9kZSk7CisgICAgICAgICAgICBpZiAocmVzLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IGZpbmQoY2FjaGVXaXRob3V0TGFtYmRhc1NvbHZlZCwgbm9kZSk7CisgICAgICAgICAgICBpZiAoIXJlcy5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSByZXNUeXBlID0gZ2V0VHlwZUNvbmNyZXRlKG5vZGUsIHNvbHZlTGFtYmRhcyk7CisgICAgICAgICAgICAgICAgY2FjaGVXaXRob3V0TGFtYmRhc1NvbHZlZC5wdXQobm9kZSwgcmVzVHlwZSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmZpbmVyKCJnZXRUeXBlIG9uICIgKyBub2RlICsgIiAobm8gc29sdmVMYW1iZGFzKSAtPiAiICsgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXMuZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gZmluZChNYXA8Tm9kZSwgUmVzb2x2ZWRUeXBlPiBtYXAsIE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KG5vZGUpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobWFwLmdldChub2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBMYW1iZGFFeHByKSB7CisgICAgICAgICAgICByZXR1cm4gZmluZChtYXAsIChMYW1iZGFFeHByKSBub2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIHNvbWUgcmVhc29ucyBMYW1iZGFFeHBycyBhcmUgZHVwbGljYXRlIGFuZCB0aGUgZXF1YWxzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5LgorICAgICAqLworICAgIHByaXZhdGUgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBmaW5kKE1hcDxOb2RlLCBSZXNvbHZlZFR5cGU+IG1hcCwgTGFtYmRhRXhwciBsYW1iZGFFeHByKSB7CisgICAgICAgIGZvciAoTm9kZSBrZXkgOiBtYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBMYW1iZGFFeHByKSB7CisgICAgICAgICAgICAgICAgTGFtYmRhRXhwciBrZXlMYW1iZGFFeHByID0gKExhbWJkYUV4cHIpIGtleTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5TGFtYmRhRXhwci50b1N0cmluZygpLmVxdWFscyhsYW1iZGFFeHByLnRvU3RyaW5nKCkpICYmIHJlcXVpcmVQYXJlbnROb2RlKGtleUxhbWJkYUV4cHIpID09IHJlcXVpcmVQYXJlbnROb2RlKGxhbWJkYUV4cHIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihtYXAuZ2V0KGtleUxhbWJkYUV4cHIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE1ldGhvZFVzYWdlIHRvTWV0aG9kVXNhZ2UoTWV0aG9kUmVmZXJlbmNlRXhwciBtZXRob2RSZWZlcmVuY2VFeHByKSB7CisgICAgICAgIGlmICghKG1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0U2NvcGUoKSBpbnN0YW5jZW9mIFR5cGVFeHByKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgVHlwZUV4cHIgdHlwZUV4cHIgPSAoVHlwZUV4cHIpIG1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0U2NvcGUoKTsKKyAgICAgICAgaWYgKCEodHlwZUV4cHIuZ2V0VHlwZSgpIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHR5cGVFeHByLmdldFR5cGUoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NPckludGVyZmFjZVR5cGUgY2xhc3NPckludGVyZmFjZVR5cGUgPSAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHR5cGVFeHByLmdldFR5cGUoKTsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiB0eXBlRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNsYXNzT3JJbnRlcmZhY2VUeXBlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUoY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpOworICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvblN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBMaXN0PE1ldGhvZFVzYWdlPiBtZXRob2RVc2FnZXMgPSAoKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpLmdldEFsbE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2RSZWZlcmVuY2VFeHByLmdldElkZW50aWZpZXIoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIHN3aXRjaCAobWV0aG9kVXNhZ2VzLnNpemUoKSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RVc2FnZXMuZ2V0KDApOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBSZXNvbHZlZFR5cGUgZ2V0QmluYXJ5VHlwZUNvbmNyZXRlKE5vZGUgbGVmdCwgTm9kZSByaWdodCwgYm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIGxlZnRUeXBlID0gZ2V0VHlwZUNvbmNyZXRlKGxlZnQsIHNvbHZlTGFtYmRhcyk7CisgICAgICAgIFJlc29sdmVkVHlwZSByaWdodFR5cGUgPSBnZXRUeXBlQ29uY3JldGUocmlnaHQsIHNvbHZlTGFtYmRhcyk7CisgICAgICAgIGlmIChyaWdodFR5cGUuaXNBc3NpZ25hYmxlQnkobGVmdFR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gcmlnaHRUeXBlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsZWZ0VHlwZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCByZXR1cm4gbW9yZSBsaWtlIGEgVHlwZUFwcGxpY2F0aW9uOiBhIFR5cGVEZWNsYXJhdGlvbiBhbmQgcG9zc2libGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgb3IgYXJyYXkKKyAgICAgKiBtb2RpZmllcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgZ2V0VHlwZUNvbmNyZXRlKE5vZGUgbm9kZSwgYm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gbm9kZS5hY2NlcHQodHlwZUV4dHJhY3Rvciwgc29sdmVMYW1iZGFzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PiBmaW5kQ29udGFpbmluZ1R5cGVEZWNsKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoRW51bURlY2xhcmF0aW9uKSBub2RlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5kQ29udGFpbmluZ1R5cGVEZWNsKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpKTsKKworICAgIH0KKworICAgIHByb3RlY3RlZCBOb2RlIGZpbmRDb250YWluaW5nVHlwZURlY2xPck9iamVjdENyZWF0aW9uRXhwcihOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgICAgICBOb2RlIHBhcmVudCA9IHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpOworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgT2JqZWN0Q3JlYXRpb25FeHByICYmICEoKE9iamVjdENyZWF0aW9uRXhwcikgcGFyZW50KS5nZXRBcmd1bWVudHMoKS5jb250YWlucyhub2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmluZENvbnRhaW5pbmdUeXBlRGVjbE9yT2JqZWN0Q3JlYXRpb25FeHByKHBhcmVudCk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBjb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShWYXJpYWJsZURlY2xhcmF0b3IgdmFyKSB7CisgICAgICAgIHJldHVybiBnZXQodHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UodmFyLmdldFR5cGUoKSwgdmFyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlIHR5cGUsIE5vZGUgY29udGV4dCkgeworICAgICAgICBpZiAodHlwZS5pc1Vua25vd25UeXBlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluZmVycmVkIGxhbWJkYSBwYXJhbWV0ZXIgdHlwZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb252ZXJ0VG9Vc2FnZSh0eXBlLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbnRleHQsIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1VzYWdlKHR5cGUsIHR5cGUpOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgYW4gaGFjayBhcm91bmQgYW4gaXNzdWUgaW4gSmF2YVBhcnNlcgorICAgIHByaXZhdGUgU3RyaW5nIHFOYW1lKENsYXNzT3JJbnRlcmZhY2VUeXBlIGNsYXNzT3JJbnRlcmZhY2VUeXBlKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgICAgIGlmIChjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcU5hbWUoY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKS5nZXQoKSkgKyAiLiIgKyBuYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZXNvbHZlZFR5cGUgY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUgdHlwZSwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29udGV4dCBzaG91bGQgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VUeXBlKSB7CisgICAgICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBjbGFzc09ySW50ZXJmYWNlVHlwZSA9IChDbGFzc09ySW50ZXJmYWNlVHlwZSkgdHlwZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcU5hbWUoY2xhc3NPckludGVyZmFjZVR5cGUpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIGlmICghcmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24obmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtZXRlcnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycyA9IGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5zdHJlYW0oKS5tYXAoKHB0KSAtPiBjb252ZXJ0VG9Vc2FnZShwdCwgY29udGV4dCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmlzVHlwZVBhcmFtZXRlcigpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUoKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEphdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbiBqYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb247CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUoamF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLmFzVHlwZVBhcmFtZXRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24sIHR5cGVQYXJhbWV0ZXJzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuYnlOYW1lKCgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUpIHR5cGUpLmdldFR5cGUoKS5uYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBXaWxkY2FyZFR5cGUpIHsKKyAgICAgICAgICAgIFdpbGRjYXJkVHlwZSB3aWxkY2FyZFR5cGUgPSAoV2lsZGNhcmRUeXBlKSB0eXBlOworICAgICAgICAgICAgaWYgKHdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGUoKS5pc1ByZXNlbnQoKSAmJiAhd2lsZGNhcmRUeXBlLmdldFN1cGVyVHlwZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGNvbnZlcnRUb1VzYWdlKHdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGUoKS5nZXQoKSwgY29udGV4dCkpOyAvLyByZW1vdmVkIChSZWZlcmVuY2VUeXBlSW1wbCkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGUoKS5pc1ByZXNlbnQoKSAmJiB3aWxkY2FyZFR5cGUuZ2V0U3VwZXJUeXBlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRXaWxkY2FyZC5zdXBlckJvdW5kKGNvbnZlcnRUb1VzYWdlKHdpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGUoKS5nZXQoKSwgY29udGV4dCkpOyAvLyByZW1vdmVkIChSZWZlcmVuY2VUeXBlSW1wbCkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGUoKS5pc1ByZXNlbnQoKSAmJiAhd2lsZGNhcmRUeXBlLmdldFN1cGVyVHlwZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuVU5CT1VOREVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24od2lsZGNhcmRUeXBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlKSB7CisgICAgICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlIGpwQXJyYXlUeXBlID0gKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkQXJyYXlUeXBlKGNvbnZlcnRUb1VzYWdlKGpwQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKSwgY29udGV4dCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBVbmlvblR5cGUpIHsKKyAgICAgICAgICAgIFVuaW9uVHlwZSB1bmlvblR5cGUgPSAoVW5pb25UeXBlKSB0eXBlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFVuaW9uVHlwZSh1bmlvblR5cGUuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoZWwgLT4gY29udmVydFRvVXNhZ2UoZWwsIGNvbnRleHQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgVmFyVHlwZSkgeworICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSB0eXBlLmdldFBhcmVudE5vZGUoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRvcikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUcnlpbmcgdG8gcmVzb2x2ZSBhIGB2YXJgIHdoaWNoIGlzIG5vdCBpbiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlRGVjbGFyYXRvciA9IChWYXJpYWJsZURlY2xhcmF0b3IpIHBhcmVudDsKKyAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0SW5pdGlhbGl6ZXIoKQorICAgICAgICAgICAgICAgICAgICAubWFwKEV4cHJlc3Npb246OmNhbGN1bGF0ZVJlc29sdmVkVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCByZXNvbHZlIGB2YXJgIHdoaWNoIGhhcyBubyBpbml0aWFsaXplci4iKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24odHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgY29udmVydChUeXBlIHR5cGUsIE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gY29udmVydCh0eXBlLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGNvbnZlcnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUgdHlwZSwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjb252ZXJ0VG9Vc2FnZSh0eXBlLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kVXNhZ2Ugc29sdmVNZXRob2RBc1VzYWdlKE1ldGhvZENhbGxFeHByIGNhbGwpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpZiAoY2FsbC5nZXRBcmd1bWVudHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gcGFyYW0gOiBjYWxsLmdldEFyZ3VtZW50cygpKSB7CisgICAgICAgICAgICAgICAgLy9nZXRUeXBlQ29uY3JldGUoTm9kZSBub2RlLCBib29sZWFuIHNvbHZlTGFtYmRhcykKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKGdldFR5cGUocGFyYW0sIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICVzIG9mIG1ldGhvZCBjYWxsICVzIiwgcGFyYW0sIGNhbGwpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9wYXJhbXMuYWRkKGdldFR5cGVDb25jcmV0ZShwYXJhbSwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNhbGwsIHR5cGVTb2x2ZXIpOworICAgICAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gbWV0aG9kVXNhZ2UgPSBjb250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZShjYWxsLmdldE5hbWUoKS5nZXRJZCgpLCBwYXJhbXMsIHR5cGVTb2x2ZXIpOworICAgICAgICBpZiAoIW1ldGhvZFVzYWdlLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWV0aG9kICciICsgY2FsbC5nZXROYW1lKCkgKyAiJyBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gY29udGV4dCAiCisgICAgICAgICAgICAgICAgICAgICsgY2FsbCArICIgKGxpbmU6ICIgKyBjYWxsLmdldFJhbmdlKCkubWFwKHIgLT4gIiIgKyByLmJlZ2luLmxpbmUpLm9yRWxzZSgiPz8iKSArICIpICIgKyBjb250ZXh0ICsgIi4gUGFyYW1ldGVyIHR5cGVzOiAiICsgcGFyYW1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kVXNhZ2UuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUeXBlRGVjbGFyYXRpb24oKFR5cGVEZWNsYXJhdGlvbikgbm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE9iamVjdENyZWF0aW9uRXhwcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigoT2JqZWN0Q3JlYXRpb25FeHByKSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAidGhpcyIgaW5zZXJ0ZWQgaW4gdGhlIGdpdmVuIHBvaW50LCB3aGljaCB0eXBlIHdvdWxkIGhhdmU/CisgICAgICovCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlT2ZUaGlzSW4oTm9kZSBub2RlKSB7CisgICAgICAgIC8vIFRPRE8gY29uc2lkZXIgc3RhdGljIG1ldGhvZHMKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoZ2V0VHlwZURlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIG5vZGUpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiA9IG5ldyBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKChFbnVtRGVjbGFyYXRpb24pIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChlbnVtRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBPYmplY3RDcmVhdGlvbkV4cHIgJiYgKChPYmplY3RDcmVhdGlvbkV4cHIpIG5vZGUpLmdldEFub255bW91c0NsYXNzQm9keSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBKYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNEZWNsYXJhdGlvbiA9IG5ldyBKYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigoT2JqZWN0Q3JlYXRpb25FeHByKSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoYW5vbnltb3VzRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlT2ZUaGlzSW4ocmVxdWlyZVBhcmVudE5vZGUobm9kZSkpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PiB0eXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBjbGFzc1RvUmVzb2x2ZWRUeXBlKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGlmIChjbGF6ei5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRQcmltaXRpdmVUeXBlLmJ5TmFtZShjbGF6ei5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvSmF2YVBhcnNlckZhY3RvcnkuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvSmF2YVBhcnNlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQzNDk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9KYXZhUGFyc2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdG9ycy5GaWVsZFN5bWJvbERlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRvcnMuTm9TeW1ib2xEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0b3JzLlBhcmFtZXRlclN5bWJvbERlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRvcnMuVmFyaWFibGVTeW1ib2xEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5yZXF1aXJlUGFyZW50Tm9kZTsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFQYXJzZXJGYWN0b3J5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dCBnZXRDb250ZXh0KE5vZGUgbm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTm9kZSBzaG91bGQgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGF0aW9uVW5pdENvbnRleHQoKENvbXBpbGF0aW9uVW5pdCkgbm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEZvcmVhY2hTdG10KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcmVjaFN0YXRlbWVudENvbnRleHQoKEZvcmVhY2hTdG10KSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRm9yU3RtdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JTdGF0ZW1lbnRDb250ZXh0KChGb3JTdG10KSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTGFtYmRhRXhwcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMYW1iZGFFeHByQ29udGV4dCgoTGFtYmRhRXhwcikgbm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZENvbnRleHQoKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvckNvbnRleHQoKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dCgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWV0aG9kQ2FsbEV4cHJDb250ZXh0KChNZXRob2RDYWxsRXhwcikgbm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Db250ZXh0KChFbnVtRGVjbGFyYXRpb24pIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZEFjY2Vzc0V4cHIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRBY2Nlc3NDb250ZXh0KChGaWVsZEFjY2Vzc0V4cHIpIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTd2l0Y2hFbnRyeVN0bXQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3dpdGNoRW50cnlDb250ZXh0KChTd2l0Y2hFbnRyeVN0bXQpIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcnlTdG10KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRyeVdpdGhSZXNvdXJjZUNvbnRleHQoKFRyeVN0bXQpIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50Q29udGV4dDw+KChTdGF0ZW1lbnQpIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDYXRjaENsYXVzZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXRjaENsYXVzZUNvbnRleHQoKENhdGNoQ2xhdXNlKSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgT2JqZWN0Q3JlYXRpb25FeHByICYmCisgICAgICAgICAgICAoKE9iamVjdENyZWF0aW9uRXhwcikgbm9kZSkuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkNvbnRleHQoKE9iamVjdENyZWF0aW9uRXhwcikgbm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVFeHByKSB7CisgICAgICAgICAgICAgICAgLy8gdG8gcmVzb2x2ZSBhIG5hbWUgd2hlbiBpbiBhIGZpZWxkQWNjZXNzIGNvbnRleHQsIHdlIGNhbiBnZXQgdG8gdGhlIGdyYW5kIHBhcmVudCB0byBwcmV2ZW50IGEgaW5maW5pdGUgbG9vcCBpZiB0aGUgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgZmllbGQgKGllIHgueCkKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkgaW5zdGFuY2VvZiBGaWVsZEFjY2Vzc0V4cHIgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkuZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLmdldFBhcmVudE5vZGUoKS5nZXQoKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTm9kZSBwYXJlbnROb2RlID0gcmVxdWlyZVBhcmVudE5vZGUobm9kZSk7CisgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIE9iamVjdENyZWF0aW9uRXhwciAmJiBub2RlID09ICgoT2JqZWN0Q3JlYXRpb25FeHByKSBwYXJlbnROb2RlKS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGV4dChyZXF1aXJlUGFyZW50Tm9kZShwYXJlbnROb2RlKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIEFTVCBub2RlIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbnNlcnRlZCBpbiBhIHByb3BlcnQgQVNULCB0aGVyZWZvcmUgd2UgY2Fubm90IHJlc29sdmUgc3ltYm9scyBjb3JyZWN0bHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KHBhcmVudE5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xEZWNsYXJhdG9yIGdldFN5bWJvbERlY2xhcmF0b3IoTm9kZSBub2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkU3ltYm9sRGVjbGFyYXRvcigoRmllbGREZWNsYXJhdGlvbikgbm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJTeW1ib2xEZWNsYXJhdG9yKChQYXJhbWV0ZXIpIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RtdCkgeworICAgICAgICAgICAgRXhwcmVzc2lvblN0bXQgZXhwcmVzc2lvblN0bXQgPSAoRXhwcmVzc2lvblN0bXQpIG5vZGU7CisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvblN0bXQuZ2V0RXhwcmVzc2lvbigpIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlU3ltYm9sRGVjbGFyYXRvcigoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIChleHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb1N5bWJvbERlY2xhcmF0b3I8PihleHByZXNzaW9uU3RtdCwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElmU3RtdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOb1N5bWJvbERlY2xhcmF0b3I8PigoSWZTdG10KSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRm9yZWFjaFN0bXQpIHsKKyAgICAgICAgICAgIEZvcmVhY2hTdG10IGZvcmVhY2hTdG10ID0gKEZvcmVhY2hTdG10KSBub2RlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVN5bWJvbERlY2xhcmF0b3IoZm9yZWFjaFN0bXQuZ2V0VmFyaWFibGUoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vU3ltYm9sRGVjbGFyYXRvcjw+KG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdG9UeXBlRGVjbGFyYXRpb24oTm9kZSBub2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIGlmICgoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgbm9kZSkuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUeXBlUGFyYW1ldGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKChUeXBlUGFyYW1ldGVyKSBub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24oKEVudW1EZWNsYXJhdGlvbikgbm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEFubm90YXRpb25EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uKChBbm5vdGF0aW9uRGVjbGFyYXRpb24pIG5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGUzNWJmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9MYW1iZGFBcmd1bWVudFR5cGVQbGFjZWhvbGRlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworCisvKioKKyAqIFBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IGEgbGFtYmRhIGFyZ3VtZW50IHR5cGUgd2hpbGUgaXQgaXMgYmVpbmcKKyAqIGNhbGN1bGF0ZWQuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBMYW1iZGFBcmd1bWVudFR5cGVQbGFjZWhvbGRlciBpbXBsZW1lbnRzIFJlc29sdmVkVHlwZSB7CisKKyAgICBwcml2YXRlIGludCBwb3M7CisgICAgcHJpdmF0ZSBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uPiBtZXRob2Q7CisKKyAgICBwdWJsaWMgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIoaW50IHBvcykgeworICAgICAgICB0aGlzLnBvcyA9IHBvczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uPiBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9UeXBlRXh0cmFjdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL1R5cGVFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM4ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9UeXBlRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw1MTcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5rbm93blR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRWb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLk15T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlR2VuZXJpY1R5cGVzOworCitwdWJsaWMgY2xhc3MgVHlwZUV4dHJhY3RvciBleHRlbmRzIERlZmF1bHRWaXNpdG9yQWRhcHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihUeXBlRXh0cmFjdG9yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBsb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CisgICAgICAgIENvbnNvbGVIYW5kbGVyIGNvbnNvbGVIYW5kbGVyID0gbmV3IENvbnNvbGVIYW5kbGVyKCk7CisgICAgICAgIGNvbnNvbGVIYW5kbGVyLnNldExldmVsKExldmVsLklORk8pOworICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBKYXZhUGFyc2VyRmFjYWRlIGZhY2FkZTsKKworICAgIHB1YmxpYyBUeXBlRXh0cmFjdG9yKFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgSmF2YVBhcnNlckZhY2FkZSBmYWNhZGUpIHsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5mYWNhZGUgPSBmYWNhZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3Igbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShub2RlKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlUGFyZW50Tm9kZShub2RlKSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjYWRlLmNvbnZlcnRUb1VzYWdlVmFyaWFibGVUeXBlKG5vZGUpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihyZXF1aXJlUGFyZW50Tm9kZShub2RlKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChQYXJhbWV0ZXIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpIGluc3RhbmNlb2YgVW5rbm93blR5cGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmFtZXRlciBoYXMgdW5rbm93biB0eXBlOiAiICsgbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldFR5cGUoKSwgbm9kZSk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEFycmF5QWNjZXNzRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICBSZXNvbHZlZFR5cGUgYXJyYXlVc2FnZVR5cGUgPSBub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKTsKKyAgICAgICAgaWYgKGFycmF5VXNhZ2VUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb2x2ZWRBcnJheVR5cGUpIGFycmF5VXNhZ2VUeXBlKS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFycmF5VXNhZ2VUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQXJyYXlDcmVhdGlvbkV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlcyA9IGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldEVsZW1lbnRUeXBlKCksIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZ2V0TGV2ZWxzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHJlcyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChBcnJheUluaXRpYWxpemVyRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChBc3NpZ25FeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIHJldHVybiBub2RlLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQmluYXJ5RXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0T3BlcmF0b3IoKSkgeworICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgIGNhc2UgRElWSURFOgorICAgICAgICAgICAgY2FzZSBNVUxUSVBMWToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjYWRlLmdldEJpbmFyeVR5cGVDb25jcmV0ZShub2RlLmdldExlZnQoKSwgbm9kZS5nZXRSaWdodCgpLCBzb2x2ZUxhbWJkYXMpOworICAgICAgICAgICAgY2FzZSBMRVNTX0VRVUFMUzoKKyAgICAgICAgICAgIGNhc2UgTEVTUzoKKyAgICAgICAgICAgIGNhc2UgR1JFQVRFUjoKKyAgICAgICAgICAgIGNhc2UgR1JFQVRFUl9FUVVBTFM6CisgICAgICAgICAgICBjYXNlIEVRVUFMUzoKKyAgICAgICAgICAgIGNhc2UgTk9UX0VRVUFMUzoKKyAgICAgICAgICAgIGNhc2UgT1I6CisgICAgICAgICAgICBjYXNlIEFORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU47CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9PUjoKKyAgICAgICAgICAgIGNhc2UgU0lHTkVEX1JJR0hUX1NISUZUOgorICAgICAgICAgICAgY2FzZSBVTlNJR05FRF9SSUdIVF9TSElGVDoKKyAgICAgICAgICAgIGNhc2UgTEVGVF9TSElGVDoKKyAgICAgICAgICAgIGNhc2UgUkVNQUlOREVSOgorICAgICAgICAgICAgY2FzZSBYT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk9wZXJhdG9yICIgKyBub2RlLmdldE9wZXJhdG9yKCkubmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQ2FzdEV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldFR5cGUoKSwgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChDbGFzc0V4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZWdhcmQgdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50IG9mIHRoZSBDbGFzc0V4cHIuCisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlIGFzdFR5cGUgPSBub2RlLmdldFR5cGUoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIGpzc1R5cGUgPSBmYWNhZGUuY29udmVydFRvVXNhZ2UoYXN0VHlwZSwgbm9kZS5nZXRUeXBlKCkpOworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihDbGFzcy5jbGFzcywgdHlwZVNvbHZlciksIEltbXV0YWJsZUxpc3Qub2YoanNzVHlwZSksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQ29uZGl0aW9uYWxFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIHJldHVybiBub2RlLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIHNvbHZlTGFtYmRhcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChFbmNsb3NlZEV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKYXZhIFBhcnNlciBjYW4ndCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFja2FnZXMsIGludGVybmFsIHR5cGVzLCBhbmQgZmllbGRzLgorICAgICAqIEFsbCB0aHJlZSBhcmUgbHVtcGVkIHRvZ2V0aGVyIGludG8gRmllbGRBY2Nlc3NFeHByLiBXZSBuZWVkIHRvIGRpZmZlcmVudGlhdGUgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBzb2x2ZURvdEV4cHJlc3Npb25UeXBlKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHBhcmVudFR5cGUsIEZpZWxkQWNjZXNzRXhwciBub2RlKSB7CisgICAgICAgIC8vIEZpZWxkcyBhbmQgaW50ZXJuYWwgdHlwZSBkZWNsYXJhdGlvbnMgY2Fubm90IGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgICAgICAgLy8gVGh1cywgdGhlc2UgY2hlY2tzIHdpbGwgYWx3YXlzIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKyAgICAgICAgaWYgKHBhcmVudFR5cGUuaGFzRmllbGQobm9kZS5nZXROYW1lKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRUeXBlLmdldEZpZWxkKG5vZGUuZ2V0TmFtZSgpLmdldElkKCkpLmdldFR5cGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnRUeXBlLmhhc0ludGVybmFsVHlwZShub2RlLmdldE5hbWUoKS5nZXRJZCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChwYXJlbnRUeXBlLmdldEludGVybmFsVHlwZShub2RlLmdldE5hbWUoKS5nZXRJZCgpKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24obm9kZS5nZXROYW1lKCkuZ2V0SWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEZpZWxkQWNjZXNzRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICAvLyBXZSBzaG91bGQgdW5kZXJzdGFuZCBpZiB0aGlzIGlzIGEgc3RhdGljIGFjY2VzcworICAgICAgICBpZiAobm9kZS5nZXRTY29wZSgpIGluc3RhbmNlb2YgTmFtZUV4cHIgfHwKKyAgICAgICAgICAgICAgICBub2RlLmdldFNjb3BlKCkgaW5zdGFuY2VvZiBGaWVsZEFjY2Vzc0V4cHIpIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gc3RhdGljVmFsdWUgPSBub2RlLmdldFNjb3BlKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHR5cGVBY2Nlc3NlZFN0YXRpY2FsbHkgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShzdGF0aWNWYWx1ZS50b1N0cmluZygpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIGlmICh0eXBlQWNjZXNzZWRTdGF0aWNhbGx5LmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGhlcmUgbWF5YmUgd2UgaGF2ZSB0byBzdWJzdGl0dXRlIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMKKyAgICAgICAgICAgICAgICByZXR1cm4gc29sdmVEb3RFeHByZXNzaW9uVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBY2Nlc3NlZFN0YXRpY2FsbHkuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNSZWZlcmVuY2VUeXBlKCksIG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0U2NvcGUoKSBpbnN0YW5jZW9mIFRoaXNFeHByKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgYWNjZXNzaW5nIHRocm91Z2ggYSAndGhpcycgZXhwcmVzc2lvbiwgZmlyc3QgcmVzb2x2ZSB0aGUgdHlwZQorICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byAndGhpcycKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmUgPSBmYWNhZGUuc29sdmUoKFRoaXNFeHByKSBub2RlLmdldFNjb3BlKCkpOworICAgICAgICAgICAgLy8gSWYgZm91bmQgZ2V0IGl0J3MgZGVjbGFyYXRpb24gYW5kIGdldCB0aGUgZmllbGQgaW4gdGhlcmUKKyAgICAgICAgICAgIGlmIChzb2x2ZS5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gY29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uID0gc29sdmUuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2x2ZURvdEV4cHJlc3Npb25UeXBlKGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKSwgbm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRTY29wZSgpLnRvU3RyaW5nKCkuaW5kZXhPZignLicpID4gMCkgeworICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgZnVsbHkgcXVhbGlmaWVkIG5hbWUKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gc3IgPSB0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKG5vZGUuZ2V0U2NvcGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChzci5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvbHZlRG90RXhwcmVzc2lvblR5cGUoc3IuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCksIG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiB2YWx1ZSA9IE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xBc1ZhbHVlKG5vZGUuZ2V0TmFtZSgpLmdldElkKCksIG5vZGUpOworICAgICAgICB9IGNhdGNoIChjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbiB1c2UpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBhIHBhY2thZ2UgbmFtZSBhcyBwYXJ0IG9mIGl0cyBmdWxseSBxdWFsaWZpZWQgbmFtZS4KKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBzb2x2ZSBmb3IgdGhlIHR5cGUgZGVjbGFyYXRpb24gaW5zaWRlIHRoaXMgcGFja2FnZS4KKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gc3JlZiA9IHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUobm9kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChzcmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHNyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldCgpLmdldFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24obm9kZS5nZXROYW1lKCkuZ2V0SWQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChJbnN0YW5jZU9mRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICByZXR1cm4gUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChTdHJpbmdMaXRlcmFsRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZShTdHJpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChJbnRlZ2VyTGl0ZXJhbEV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgcmV0dXJuIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChMb25nTGl0ZXJhbEV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgcmV0dXJuIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQ2hhckxpdGVyYWxFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIHJldHVybiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KERvdWJsZUxpdGVyYWxFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIGlmIChub2RlLmdldFZhbHVlKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiZiIpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FUOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoQm9vbGVhbkxpdGVyYWxFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIHJldHVybiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KE51bGxMaXRlcmFsRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICByZXR1cm4gTnVsbFR5cGUuSU5TVEFOQ0U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChNZXRob2RDYWxsRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICBsb2dnZXIuZmluZXN0KCJnZXRUeXBlIG9uIG1ldGhvZCBjYWxsICIgKyBub2RlKTsKKyAgICAgICAgLy8gZmlyc3Qgc29sdmUgdGhlIG1ldGhvZAorICAgICAgICBNZXRob2RVc2FnZSByZWYgPSBmYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKG5vZGUpOworICAgICAgICBsb2dnZXIuZmluZXN0KCJnZXRUeXBlIG9uIG1ldGhvZCBjYWxsICIgKyBub2RlICsgIiByZXNvbHZlZCB0byAiICsgcmVmKTsKKyAgICAgICAgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBtZXRob2QgY2FsbCAiICsgbm9kZSArICIgcmV0dXJuIHR5cGUgaXMgIiArIHJlZi5yZXR1cm5UeXBlKCkpOworICAgICAgICByZXR1cm4gcmVmLnJldHVyblR5cGUoKTsKKyAgICAgICAgLy8gdGhlIHR5cGUgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KE5hbWVFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIGxvZ2dlci5maW5lc3QoImdldFR5cGUgb24gbmFtZSBleHByICIgKyBub2RlKTsKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHZhbHVlID0gbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVN5bWJvbEFzVmFsdWUobm9kZS5nZXROYW1lKCkuZ2V0SWQoKSwgbm9kZSk7CisgICAgICAgIGlmICghdmFsdWUuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbigiU29sdmluZyAiICsgbm9kZSwgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0KCkuZ2V0VHlwZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChPYmplY3RDcmVhdGlvbkV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldFR5cGUoKSwgbm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChUaGlzRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICAvLyBJZiAndGhpcycgaXMgcHJlZml4ZWQgYnkgYSBjbGFzcyBlZy4gTXlDbGFzcy50aGlzCisgICAgICAgIGlmIChub2RlLmdldENsYXNzRXhwcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGNsYXNzIG5hbWUKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBub2RlLmdldENsYXNzRXhwcigpLmdldCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlc29sdmUgdXNpbmcgYSB0eXBlU29sdmVyCisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGNsYXp6ID0gdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShjbGFzc05hbWUpOworICAgICAgICAgICAgaWYgKGNsYXp6LmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGNsYXp6LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVzb2x2ZSBsb2NhbGx5IGluIENvbXBpbGF0aW9uIHVuaXQKKyAgICAgICAgICAgIE9wdGlvbmFsPENvbXBpbGF0aW9uVW5pdD4gY3UgPSBub2RlLmdldEFuY2VzdG9yT2ZUeXBlKENvbXBpbGF0aW9uVW5pdC5jbGFzcyk7CisgICAgICAgICAgICBpZiAoY3UuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBPcHRpb25hbDxDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+IGNsYXNzQnlOYW1lID0gY3UuZ2V0KCkuZ2V0Q2xhc3NCeU5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NCeU5hbWUuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChmYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzQnlOYW1lLmdldCgpKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChmYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGZhY2FkZS5maW5kQ29udGFpbmluZ1R5cGVEZWNsT3JPYmplY3RDcmVhdGlvbkV4cHIobm9kZSkpLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KFN1cGVyRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiB0eXBlT2ZOb2RlID0gZmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihmYWNhZGUuZmluZENvbnRhaW5pbmdUeXBlRGVjbChub2RlKSk7CisgICAgICAgIGlmICh0eXBlT2ZOb2RlIGluc3RhbmNlb2YgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24pIHR5cGVPZk5vZGUpLmdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgdmlzaXQoVW5hcnlFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIHN3aXRjaCAobm9kZS5nZXRPcGVyYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKTsKKyAgICAgICAgICAgIGNhc2UgTE9HSUNBTF9DT01QTEVNRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTjsKKyAgICAgICAgICAgIGNhc2UgUE9TVEZJWF9ERUNSRU1FTlQ6CisgICAgICAgICAgICBjYXNlIFBSRUZJWF9ERUNSRU1FTlQ6CisgICAgICAgICAgICBjYXNlIFBPU1RGSVhfSU5DUkVNRU5UOgorICAgICAgICAgICAgY2FzZSBQUkVGSVhfSU5DUkVNRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG5vZGUuZ2V0T3BlcmF0b3IoKS5uYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBub2RlLCBCb29sZWFuIHNvbHZlTGFtYmRhcykgeworICAgICAgICBpZiAobm9kZS5nZXRWYXJpYWJsZXMoKS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShub2RlLmdldFZhcmlhYmxlcygpLmdldCgwKSk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KExhbWJkYUV4cHIgbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxFeHByID0gKE1ldGhvZENhbGxFeHByKSByZXF1aXJlUGFyZW50Tm9kZShub2RlKTsKKyAgICAgICAgICAgIGludCBwb3MgPSBKYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24uZ2V0UGFyYW1Qb3Mobm9kZSk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmTWV0aG9kID0gZmFjYWRlLnNvbHZlKGNhbGxFeHByKTsKKyAgICAgICAgICAgIGlmICghcmVmTWV0aG9kLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24ocmVxdWlyZVBhcmVudE5vZGUobm9kZSkudG9TdHJpbmcoKSwgY2FsbEV4cHIuZ2V0TmFtZSgpLmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBsYW1iZGEgZXhwciAiICsgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoc29sdmVMYW1iZGFzKSB7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgdHlwZSBwYXJhbWV0ZXIgcmVmZXJyZWQgaGVyZSBzaG91bGQgYmUgdGhlIGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLlQKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcmVzdWx0ID0gcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKHBvcykuZ2V0VHlwZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGNhbGxFeHByLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IGNhbGxFeHByLmdldFNjb3BlKCkuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBzdGF0aWMgY2FsbCB3ZSBzaG91bGQgbm90IHRyeSB0byBnZXQgdGhlIHR5cGUgb2YgdGhlIHNjb3BlCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhdGljQ2FsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgaW5zdGFuY2VvZiBOYW1lRXhwcikgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUV4cHIgbmFtZUV4cHIgPSAoTmFtZUV4cHIpIHNjb3BlOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHR5cGUgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5hbWVFeHByLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZUV4cHIuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljQ2FsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0aWNDYWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgc2NvcGVUeXBlID0gZmFjYWRlLmdldFR5cGUoc2NvcGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlVHlwZS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNjb3BlVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZXBsYWNlIHRoZSB0eXBlIHZhcmlhYmxlcworICAgICAgICAgICAgICAgIENvbnRleHQgY3R4ID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzb2x2ZUdlbmVyaWNUeXBlcyhyZXN1bHQsIGN0eCwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgICAgICAgICAvL1dlIHNob3VsZCBmaW5kIG91dCB3aGljaCBpcyB0aGUgZnVuY3Rpb25hbCBtZXRob2QgKGUuZy4sIGFwcGx5KSBhbmQgcmVwbGFjZSB0aGUgcGFyYW1zIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vc29sdmVMYW1iZGFzIHdpdGggaXQsIHRvIGRlcml2ZSBzbyB0aGUgdmFsdWVzLiBXZSBzaG91bGQgYWxzbyBjb25zaWRlciB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy9sYW1iZGFzCisgICAgICAgICAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IGZ1bmN0aW9uYWxNZXRob2QgPSBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChyZXN1bHQpOworICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbmFsTWV0aG9kLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExhbWJkYUV4cHIgbGFtYmRhRXhwciA9IG5vZGU7CisKKyAgICAgICAgICAgICAgICAgICAgSW5mZXJlbmNlQ29udGV4dCBsYW1iZGFDdHggPSBuZXcgSW5mZXJlbmNlQ29udGV4dChNeU9iamVjdFByb3ZpZGVyLklOU1RBTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgSW5mZXJlbmNlQ29udGV4dCBmdW5jSW50ZXJmYWNlQ3R4ID0gbmV3IEluZmVyZW5jZUNvbnRleHQoTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBwYXJhbWV0ZXJUeXBlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uPFQ9PyBzdXBlciBTdHJlYW0uVCwgPyBleHRlbmRzIG1hcC5SPgorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmVwbGFjZSBTdHJlYW0uVAorICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZnVuY3Rpb25hbEludGVyZmFjZVR5cGUgPSBSZWZlcmVuY2VUeXBlSW1wbC51bmRldGVybWluZWRQYXJhbWV0ZXJzKGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkuZ2V0RGVjbGFyYXRpb24oKS5kZWNsYXJpbmdUeXBlKCksIHR5cGVTb2x2ZXIpOworCisgICAgICAgICAgICAgICAgICAgIGxhbWJkYUN0eC5hZGRQYWlyKHJlc3VsdCwgZnVuY3Rpb25hbEludGVyZmFjZVR5cGUpOworCisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChsYW1iZGFFeHByLmdldEJvZHkoKSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdG10KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUeXBlID0gZmFjYWRlLmdldFR5cGUoKChFeHByZXNzaW9uU3RtdCkgbGFtYmRhRXhwci5nZXRCb2R5KCkpLmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFtYmRhRXhwci5nZXRCb2R5KCkgaW5zdGFuY2VvZiBCbG9ja1N0bXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU3RtdCBibG9ja1N0bXQgPSAoQmxvY2tTdG10KSBsYW1iZGFFeHByLmdldEJvZHkoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcmV0dXJuIHN0YXRlbWVudHMgaW4gdGhlIGxhbWJkYSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXR1cm5TdG10PiByZXR1cm5TdG10cyA9IGJsb2NrU3RtdC5maW5kQWxsKFJldHVyblN0bXQuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuU3RtdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFR5cGUgPSByZXR1cm5TdG10cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChyZXR1cm5TdG10IC0+IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLm1hcChlIC0+IGZhY2FkZS5nZXRUeXBlKGUpKS5vckVsc2UoUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHggLT4geCAhPSBudWxsICYmICF4LmlzVm9pZCgpICYmICF4LmlzTnVsbCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3JFbHNlKFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGZvcm1hbFR5cGUgPSBmdW5jdGlvbmFsTWV0aG9kLmdldCgpLnJldHVyblR5cGUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJbmZlciB0aGUgZnVuY3Rpb25hbCBpbnRlcmZhY2VzJyByZXR1cm4gdnMgYWN0dWFsIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgZnVuY0ludGVyZmFjZUN0eC5hZGRQYWlyKGZvcm1hbFR5cGUsIGFjdHVhbFR5cGUpOworICAgICAgICAgICAgICAgICAgICAvLyBTdWJzdGl0dXRlIHRvIG9idGFpbiBhIG5ldyB0eXBlCisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBmdW5jdGlvbmFsVHlwZVdpdGhSZXR1cm4gPSBmdW5jSW50ZXJmYWNlQ3R4LnJlc29sdmUoZnVuY0ludGVyZmFjZUN0eC5hZGRTaW5nbGUoZnVuY3Rpb25hbEludGVyZmFjZVR5cGUpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZnVuY3Rpb25hbCBtZXRob2QgcmV0dXJucyB2b2lkIGFueXdheQorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGJvdGhlciBpbmZlcnJpbmcgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoZm9ybWFsVHlwZSBpbnN0YW5jZW9mIFJlc29sdmVkVm9pZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFDdHguYWRkUGFpcihyZXN1bHQsIGZ1bmN0aW9uYWxUeXBlV2l0aFJldHVybik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBsYW1iZGFDdHgucmVzb2x2ZShsYW1iZGFDdHguYWRkU2luZ2xlKHJlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHR5cGUgb2YgYSBsYW1iZGEgZXhwciBkZXBlbmRzIG9uIHRoZSBwb3NpdGlvbiBhbmQgaXRzIHJldHVybiB2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG5vZGUsIEJvb2xlYW4gc29sdmVMYW1iZGFzKSB7CisgICAgICAgIGlmIChyZXF1aXJlUGFyZW50Tm9kZShub2RlKSBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsRXhwciA9IChNZXRob2RDYWxsRXhwcikgcmVxdWlyZVBhcmVudE5vZGUobm9kZSk7CisgICAgICAgICAgICBpbnQgcG9zID0gSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmdldFBhcmFtUG9zKG5vZGUpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZk1ldGhvZCA9IGZhY2FkZS5zb2x2ZShjYWxsRXhwciwgZmFsc2UpOworICAgICAgICAgICAgaWYgKCFyZWZNZXRob2QuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihyZXF1aXJlUGFyZW50Tm9kZShub2RlKS50b1N0cmluZygpLCBjYWxsRXhwci5nZXROYW1lKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2dnZXIuZmluZXN0KCJnZXRUeXBlIG9uIG1ldGhvZCByZWZlcmVuY2UgZXhwciAiICsgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAvL2xvZ2dlci5maW5lc3QoIk1ldGhvZCBwYXJhbSAiICsgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKHBvcykpOworICAgICAgICAgICAgaWYgKHNvbHZlTGFtYmRhcykgeworICAgICAgICAgICAgICAgIE1ldGhvZFVzYWdlIHVzYWdlID0gZmFjYWRlLnNvbHZlTWV0aG9kQXNVc2FnZShjYWxsRXhwcik7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHJlc3VsdCA9IHVzYWdlLmdldFBhcmFtVHlwZShwb3MpOworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgdHlwZSB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICBDb250ZXh0IGN0eCA9IEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc29sdmVHZW5lcmljVHlwZXMocmVzdWx0LCBjdHgsIHR5cGVTb2x2ZXIpOworCisgICAgICAgICAgICAgICAgLy9XZSBzaG91bGQgZmluZCBvdXQgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uYWwgbWV0aG9kIChlLmcuLCBhcHBseSkgYW5kIHJlcGxhY2UgdGhlIHBhcmFtcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAvL3NvbHZlTGFtYmRhcyB3aXRoIGl0LCB0byBkZXJpdmUgc28gdGhlIHZhbHVlcy4gV2Ugc2hvdWxkIGFsc28gY29uc2lkZXIgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vbGFtYmRhcworICAgICAgICAgICAgICAgIGlmIChGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChyZXN1bHQpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGhvZFJlZmVyZW5jZUV4cHIgbWV0aG9kUmVmZXJlbmNlRXhwciA9IG5vZGU7CisKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGFjdHVhbFR5cGUgPSBmYWNhZGUudG9NZXRob2RVc2FnZShtZXRob2RSZWZlcmVuY2VFeHByKS5yZXR1cm5UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBmb3JtYWxUeXBlID0gRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QocmVzdWx0KS5nZXQoKS5yZXR1cm5UeXBlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgSW5mZXJlbmNlQ29udGV4dCBpbmZlcmVuY2VDb250ZXh0ID0gbmV3IEluZmVyZW5jZUNvbnRleHQoTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSk7CisgICAgICAgICAgICAgICAgICAgIGluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKHJlc3VsdCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKHBvcykuZ2V0VHlwZSgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHR5cGUgb2YgYSBtZXRob2QgcmVmZXJlbmNlIGV4cHIgZGVwZW5kcyBvbiB0aGUgcG9zaXRpb24gYW5kIGl0cyByZXR1cm4gdmFsdWUiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSwgQm9vbGVhbiBzb2x2ZUxhbWJkYXMpIHsKKyAgICAgICAgaWYgKG5vZGUuZ2V0VmFyaWFibGVzKCkuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlLmdldFZhcmlhYmxlcygpLmdldCgwKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgcmVzb2x2ZSB0aGUgdHlwZSBvZiBhIGZpZWxkIHdpdGggbXVsdGlwbGUgdmFyaWFibGUgZGVjbGFyYXRpb25zLiBQaWNrIG9uZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FiN2QxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9ufSBpbnN0ZWFkCisgKi8KKy8vIFVzZSB0aGUgb25lIGluIG1vZGVsIGluc3RlYWQKK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIoIlVuc29sdmVkIHN5bWJvbCA6ICIgKyBuYW1lICsgIiB1c2luZyB0eXBlc29sdmVyICIgKyB0eXBlU29sdmVyKTsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKCJVbnNvbHZlZCBzeW1ib2wgaW4gIiArIGNvbnRleHQgKyAiIDogIiArIG5hbWUpOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0LnRvU3RyaW5nKCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oU3RyaW5nIGNvbnRleHQsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKCJVbnNvbHZlZCBzeW1ib2wgaW4gIiArIGNvbnRleHQgKyAiIDogIiArIG5hbWUpOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKCJVbnNvbHZlZCBzeW1ib2wgOiAiICsgbmFtZSk7CisgICAgICAgIHRoaXMuY29udGV4dCA9ICJ1bmtub3duIjsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlVuc29sdmVkU3ltYm9sRXhjZXB0aW9ueyIgKworICAgICAgICAgICAgICAgICJjb250ZXh0PSciICsgY29udGV4dCArICdcJycgKworICAgICAgICAgICAgICAgICIsIG5hbWU9JyIgKyBuYW1lICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgdHlwZVNvbHZlcj0iICsgdHlwZVNvbHZlciArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMDhhNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yOworCitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuKjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8TiBleHRlbmRzIE5vZGU+IGltcGxlbWVudHMgQ29udGV4dCB7CisKKyAgICBwcm90ZWN0ZWQgTiB3cmFwcGVkTm9kZTsKKyAgICBwcm90ZWN0ZWQgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgLy8vCisgICAgLy8vIFN0YXRpYyBtZXRob2RzCisgICAgLy8vCisKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlV2l0aChTeW1ib2xEZWNsYXJhdG9yIHN5bWJvbERlY2xhcmF0b3IsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uIGRlY2wgOiBzeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoZGVjbC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoZGVjbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBDb25zdHJ1Y3RvcnMKKyAgICAvLy8KKworICAgIHB1YmxpYyBBYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0KE4gd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQdWJsaWMgbWV0aG9kcworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dDw/PiB0aGF0ID0gKEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8Pz4pIG87CisKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlICE9IG51bGwgPyAhd3JhcHBlZE5vZGUuZXF1YWxzKHRoYXQud3JhcHBlZE5vZGUpIDogdGhhdC53cmFwcGVkTm9kZSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlICE9IG51bGwgPyB3cmFwcGVkTm9kZS5oYXNoQ29kZSgpIDogMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBzb2x2ZUdlbmVyaWNUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgQ29udGV4dCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc29sdmVHZW5lcmljVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBDb250ZXh0IGdldFBhcmVudCgpIHsKKyAgICAgICAgTm9kZSBwYXJlbnQgPSB3cmFwcGVkTm9kZS5nZXRQYXJlbnROb2RlKCkub3JFbHNlKG51bGwpOworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIHBhcmVudENhbGwgPSAoTWV0aG9kQ2FsbEV4cHIpIHBhcmVudDsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChwYXJlbnRDYWxsLmdldEFyZ3VtZW50cygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gZXhwcmVzc2lvbiA6IHBhcmVudENhbGwuZ2V0QXJndW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gd3JhcHBlZE5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgIE5vZGUgbm90TWV0aG9kID0gcGFyZW50OworICAgICAgICAgICAgICAgIHdoaWxlIChub3RNZXRob2QgaW5zdGFuY2VvZiBNZXRob2RDYWxsRXhwcikgeworICAgICAgICAgICAgICAgICAgICBub3RNZXRob2QgPSByZXF1aXJlUGFyZW50Tm9kZShub3RNZXRob2QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub3RNZXRob2QsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE5vZGUgbm90TWV0aG9kID0gcGFyZW50OworICAgICAgICB3aGlsZSAobm90TWV0aG9kIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIgfHwgbm90TWV0aG9kIGluc3RhbmNlb2YgRmllbGRBY2Nlc3NFeHByKSB7CisgICAgICAgICAgICBub3RNZXRob2QgPSBub3RNZXRob2QuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90TWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vdE1ldGhvZCwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFByb3RlY3RlZCBtZXRob2RzCisgICAgLy8vCisKKyAgICBwcm90ZWN0ZWQgT3B0aW9uYWw8VmFsdWU+IHNvbHZlV2l0aEFzVmFsdWUoU3ltYm9sRGVjbGFyYXRvciBzeW1ib2xEZWNsYXJhdG9yLCBTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBzeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihkIC0+IGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICAubWFwKFZhbHVlOjpmcm9tKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gZmluZFR5cGVEZWNsYXJhdGlvbnMoT3B0aW9uYWw8RXhwcmVzc2lvbj4gb3B0U2NvcGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAob3B0U2NvcGUuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBvcHRTY29wZS5nZXQoKTsKKworICAgICAgICAgICAgLy8gY29uc2lkZXIgc3RhdGljIG1ldGhvZHMKKyAgICAgICAgICAgIGlmIChzY29wZSBpbnN0YW5jZW9mIE5hbWVFeHByKSB7CisgICAgICAgICAgICAgICAgTmFtZUV4cHIgc2NvcGVBc05hbWUgPSAoTmFtZUV4cHIpIHNjb3BlOworICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc3ltYm9sUmVmZXJlbmNlID0gdGhpcy5zb2x2ZVR5cGUoc2NvcGVBc05hbWUuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgIGlmIChzeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKSAmJiBzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaXNUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZXRvbkxpc3Qoc3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlT2ZTY29wZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHlwZU9mU2NvcGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKHNjb3BlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIklzc3VlIGNhbGN1bGF0aW5nIHRoZSB0eXBlIG9mIHRoZSBzY29wZSBvZiAiICsgdGhpcywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZU9mU2NvcGUuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVPZlNjb3BlLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSB8fCB0eXBlT2ZTY29wZS5hc1dpbGRjYXJkKCkuaXNTdXBlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW5nbGV0b25MaXN0KHR5cGVPZlNjb3BlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uTGlzdChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKS5hc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlT2ZTY29wZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBtZXRob2QgY2FsbCBvbiBhcnJheSBhcmUgT2JqZWN0IG1ldGhvZHMKKyAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xldG9uTGlzdChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKS5hc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVPZlNjb3BlLmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kIGJvdW5kIDogdHlwZU9mU2NvcGUuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChib3VuZC5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlT2ZTY29wZS5pc0NvbnN0cmFpbnQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzaW5nbGV0b25MaXN0KHR5cGVPZlNjb3BlLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzaW5nbGV0b25MaXN0KHR5cGVPZlNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZU9mU2NvcGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlT2ZUaGlzSW4od3JhcHBlZE5vZGUpOworICAgICAgICByZXR1cm4gc2luZ2xldG9uTGlzdCh0eXBlT2ZTY29wZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0Fic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9BYnN0cmFjdE1ldGhvZExpa2VEZWNsYXJhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjExZDcxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9BYnN0cmFjdE1ldGhvZExpa2VEZWNsYXJhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGVWYXJpYWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dAorICAgICAgICA8VCBleHRlbmRzIE5vZGUgJiBOb2RlV2l0aFBhcmFtZXRlcnM8VD4gJiBOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzPFQ+PiBleHRlbmRzIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8VD4geworCisgICAgcHVibGljIEFic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dChUIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbWV0ZXIgOiB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIFN5bWJvbERlY2xhcmF0b3Igc2IgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKHBhcmFtZXRlciwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc3ltYm9sUmVmZXJlbmNlID0gQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGgoc2IsIG5hbWUpOworICAgICAgICAgICAgaWYgKHN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFJlZmVyZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vdGhpbmcgaXMgZm91bmQgd2Ugc2hvdWxkIGFzayB0aGUgcGFyZW50IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IHNvbHZlR2VuZXJpY1R5cGUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBmb3IgKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyIHRwIDogd3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgaWYgKHRwLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUobmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKHRwLCB0eXBlU29sdmVyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5zb2x2ZUdlbmVyaWNUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBPcHRpb25hbDxWYWx1ZT4gc29sdmVTeW1ib2xBc1ZhbHVlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBTeW1ib2xEZWNsYXJhdG9yIHNiID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihwYXJhbWV0ZXIsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHN5bWJvbFJlZmVyZW5jZSA9IHNvbHZlV2l0aEFzVmFsdWUoc2IsIG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHN5bWJvbFJlZmVyZW5jZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHR5cGUgc3Vic3RpdHV0aW9uIGFzIG5lZWRlZAorICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xSZWZlcmVuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kIHdlIHNob3VsZCBhc2sgdGhlIHBhcmVudCBjb250ZXh0CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlciB0cCA6IHdyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHAuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcih0cCwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTG9jYWwgdHlwZXMKKyAgICAgICAgTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPiBsb2NhbFR5cGVzID0gd3JhcHBlZE5vZGUuZmluZEFsbCgKKyAgICAgICAgICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgZm9yIChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+IGxvY2FsVHlwZSA6IGxvY2FsVHlwZXMpIHsKKyAgICAgICAgICAgIGlmIChsb2NhbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGxvY2FsVHlwZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoU3RyaW5nLmZvcm1hdCgiJXMuIiwgbG9jYWxUeXBlLmdldE5hbWUoKSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobG9jYWxUeXBlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZyhsb2NhbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkubGVuZ3RoKCkgKyAxKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZCgKKyAgICAgICAgICAgIFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkNvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODEzMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zCisgICAgLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBBIHN5bWJvbCByZXNvbHV0aW9uIGNvbnRleHQgZm9yIGFuIG9iamVjdCBjcmVhdGlvbiBub2RlLgorICovCitwdWJsaWMgY2xhc3MgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0PE9iamVjdENyZWF0aW9uRXhwcj4geworCisgIHByaXZhdGUgZmluYWwgSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbXlEZWNsYXJhdGlvbiA9CisgICAgICBuZXcgSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24od3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworCisgIHB1YmxpYyBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uQ29udGV4dChPYmplY3RDcmVhdGlvbkV4cHIgbm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgc3VwZXIobm9kZSwgdHlwZVNvbHZlcik7CisgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KG5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuaXNQcmVzZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbiBhbm9ueW1vdXMgY2xhc3MgbXVzdCBoYXZlIGEgYm9keSIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhdGljT25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICBMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGNhbmRpZGF0ZU1ldGhvZHMgPQorICAgICAgICBteURlY2xhcmF0aW9uCisgICAgICAgICAgICAuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgLmZpbHRlcihtIC0+IG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSAmJiAoIXN0YXRpY09ubHkgfHwgbS5pc1N0YXRpYygpKSkKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgaWYgKCFPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhteURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yIDogbXlEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKSkgeworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVzID0KKyAgICAgICAgICAgIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY09ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNvbHZlcik7CisgICAgICAgIC8vIGNvbnNpZGVyIG1ldGhvZHMgZnJvbSBzdXBlcmNsYXNzZXMgYW5kIG9ubHkgZGVmYXVsdCBtZXRob2RzIGZyb20gaW50ZXJmYWNlcyA6CisgICAgICAgIC8vIG5vdCB0cnVlLCB3ZSBzaG91bGQga2VlcCBhYnN0cmFjdCBhcyBhIHZhbGlkIGNhbmRpZGF0ZQorICAgICAgICAvLyBhYnN0cmFjdCBhcmUgcmVtb3ZlZCBpbiBNZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBcHBsaWNhYmxlIGlzIG5lY2Vzc2FyeQorICAgICAgICBpZiAocmVzLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICBjYW5kaWRhdGVNZXRob2RzLmFkZChyZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gV2Ugd2FudCB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gd2hlbiBhIGNsYXNzIGlzIHVzaW5nIGl0cyBvd24gbWV0aG9kCisgICAgLy8gc2VlIGlzc3VlICM3NQorICAgIGlmIChjYW5kaWRhdGVNZXRob2RzLmlzRW1wdHkoKSkgeworICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHBhcmVudFNvbHV0aW9uID0KKyAgICAgICAgICBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcik7CisgICAgICBpZiAocGFyZW50U29sdXRpb24uaXNTb2x2ZWQoKSkgeworICAgICAgICBjYW5kaWRhdGVNZXRob2RzLmFkZChwYXJlbnRTb2x1dGlvbi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgaXMgaW50ZXJmYWNlIGFuZCBjYW5kaWRhdGUgbWV0aG9kIGxpc3QgaXMgZW1wdHksIHdlIHNob3VsZCBjaGVjayB0aGUgT2JqZWN0IE1ldGhvZHMKKyAgICBpZiAoY2FuZGlkYXRlTWV0aG9kcy5pc0VtcHR5KCkgJiYgbXlEZWNsYXJhdGlvbi5nZXRTdXBlclR5cGVEZWNsYXJhdGlvbigpLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZXMgPQorICAgICAgICAgIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNvbHZlcik7CisgICAgICBpZiAocmVzLmlzU29sdmVkKCkpIHsKKyAgICAgICAgY2FuZGlkYXRlTWV0aG9kcy5hZGQocmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShjYW5kaWRhdGVNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNvbHZlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICBMaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+IHR5cGVEZWNsYXJhdGlvbnMgPQorICAgICAgICBteURlY2xhcmF0aW9uCisgICAgICAgICAgICAuZmluZE1lbWJlcnNPZktpbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisKKyAgICBPcHRpb25hbDxTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+PiBleGFjdE1hdGNoID0KKyAgICAgICAgdHlwZURlY2xhcmF0aW9ucworICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAuZmlsdGVyKGludGVybmFsVHlwZSAtPiBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgLmZpbmRGaXJzdCgpCisgICAgICAgICAgICAubWFwKGludGVybmFsVHlwZSAtPgorICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oaW50ZXJuYWxUeXBlKSkpOworCisgICAgaWYoZXhhY3RNYXRjaC5pc1ByZXNlbnQoKSl7CisgICAgICByZXR1cm4gZXhhY3RNYXRjaC5nZXQoKTsKKyAgICB9CisKKyAgICBPcHRpb25hbDxTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+PiByZWN1cnNpdmVNYXRjaCA9CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbnMKKyAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgLmZpbHRlcihpbnRlcm5hbFR5cGUgLT4gbmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiIsIGludGVybmFsVHlwZS5nZXROYW1lKCkpKSkKKyAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgLm1hcChpbnRlcm5hbFR5cGUgLT4KKyAgICAgICAgICAgICAgICAgICAgIEphdmFQYXJzZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHQoaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zb2x2ZVR5cGUobmFtZS5zdWJzdHJpbmcoaW50ZXJuYWxUeXBlLmdldE5hbWUoKS5nZXRJZCgpLmxlbmd0aCgpICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU29sdmVyKSk7CisKKyAgICBpZiAocmVjdXJzaXZlTWF0Y2guaXNQcmVzZW50KCkpIHsKKyAgICAgIHJldHVybiByZWN1cnNpdmVNYXRjaC5nZXQoKTsKKyAgICB9CisKKyAgICBPcHRpb25hbDxTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+PiB0eXBlQXJndW1lbnRzTWF0Y2ggPQorICAgICAgICB3cmFwcGVkTm9kZQorICAgICAgICAgICAgLmdldFR5cGVBcmd1bWVudHMoKQorICAgICAgICAgICAgLm1hcChub2RlcyAtPgorICAgICAgICAgICAgICAgICAgICAgKChOb2RlV2l0aFR5cGVBcmd1bWVudHM8Pz4pIG5vZGVzKS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3JFbHNlKG5ldyBOb2RlTGlzdDw+KCkpKQorICAgICAgICAgICAgLm9yRWxzZShuZXcgTm9kZUxpc3Q8PigpKQorICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAuZmlsdGVyKHR5cGUgLT4gdHlwZS50b1N0cmluZygpLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgLm1hcChtYXRjaGluZ1R5cGUgLT4KKyAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKG5ldyBUeXBlUGFyYW1ldGVyKG1hdGNoaW5nVHlwZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNvbHZlcikpKTsKKworICAgIGlmICh0eXBlQXJndW1lbnRzTWF0Y2guaXNQcmVzZW50KCkpIHsKKyAgICAgIHJldHVybiB0eXBlQXJndW1lbnRzTWF0Y2guZ2V0KCk7CisgICAgfQorCisgICAgLy8gTG9vayBpbnRvIGV4dGVuZGVkIGNsYXNzZXMgYW5kIGltcGxlbWVudGVkIGludGVyZmFjZXMKKyAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA6IG15RGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkpIHsKKyAgICAgIC8vIGxvb2sgYXQgbmFtZXMgb2YgZXh0ZW5kZWQgY2xhc3NlcyBhbmQgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyAodGhpcyBtYXkgbm90IGJlIGltcG9ydGFudCBiZWNhdXNlIHRoZXkgYXJlIGNoZWNrZWQgaW4gQ29tcGlsYXRpb25Vbml0Q29udGV4dCkKKyAgICAgIGlmIChhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpKTsKKyAgICAgIH0gCisgICAgICAvLyBsb29rIGludG8gaW50ZXJuYWwgdHlwZXMgb2YgZXh0ZW5kZWQgY2xhc3NlcyBhbmQgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBpbnRlcm5hbFR5cGVEZWNsYXJhdGlvbiA6IGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpLmludGVybmFsVHlwZXMoKSkgeworICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChpbnRlcm5hbFR5cGVEZWNsYXJhdGlvbik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGp1c3QgY29udGludWUgdXNpbmcgdGhlIG5leHQgYW5jZXN0b3IKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudCh0eXBlU29sdmVyICE9IG51bGwpOworCisgICAgaWYgKG15RGVjbGFyYXRpb24uaGFzVmlzaWJsZUZpZWxkKG5hbWUpKSB7CisgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChteURlY2xhcmF0aW9uLmdldFZpc2libGVGaWVsZChuYW1lKSk7CisgICAgfQorCisgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQ2F0Y2hDbGF1c2VDb250ZXh0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0NhdGNoQ2xhdXNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODNmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0NhdGNoQ2xhdXNlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbERlY2xhcmF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQGF1dGhvciBGcmVkIExlZsOpdsOocmUtTGFvaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRjaENsYXVzZUNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0PENhdGNoQ2xhdXNlPiB7CisKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2VDb250ZXh0KENhdGNoQ2xhdXNlIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBTeW1ib2xEZWNsYXJhdG9yIHNiID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcih3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXIoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzeW1ib2xSZWZlcmVuY2UgPSBBYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LnNvbHZlV2l0aChzYiwgbmFtZSk7CisgICAgICAgIGlmIChzeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vdGhpbmcgaXMgZm91bmQgd2Ugc2hvdWxkIGFzayB0aGUgcGFyZW50IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBPcHRpb25hbDxWYWx1ZT4gc29sdmVTeW1ib2xBc1ZhbHVlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgU3ltYm9sRGVjbGFyYXRvciBzYiA9IEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3Iod3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVyKCksIHR5cGVTb2x2ZXIpOworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gc3ltYm9sUmVmZXJlbmNlID0gc29sdmVXaXRoQXNWYWx1ZShzYiwgbmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIGlmIChzeW1ib2xSZWZlcmVuY2UuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHR5cGUgc3Vic3RpdHV0aW9uIGFzIG5lZWRlZAorICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vdGhpbmcgaXMgZm91bmQgd2Ugc2hvdWxkIGFzayB0aGUgcGFyZW50IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKAorICAgICAgICAgICAgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgYm9vbGVhbiBzdGF0aWNPbmx5LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY0YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dCBleHRlbmRzIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiB7CisKKyAgICBwcml2YXRlIEphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyIGphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyOworCisgICAgLy8vCisgICAgLy8vIENvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB0aGlzLmphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IEphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyKHdyYXBwZWROb2RlLCB0eXBlU29sdmVyLAorICAgICAgICAgICAgICAgIGdldERlY2xhcmF0aW9uKCksIHRoaXMpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQdWJsaWMgbWV0aG9kcworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbChTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICh0eXBlU29sdmVyID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAodGhpcy5nZXREZWNsYXJhdGlvbigpLmhhc1Zpc2libGVGaWVsZChuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQodGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFZpc2libGVGaWVsZChuYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGVuIHRvIHBhcmVudAorICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFZhbHVlPiBzb2x2ZVN5bWJvbEFzVmFsdWUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodHlwZVNvbHZlciA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5oYXNWaXNpYmxlRmllbGQobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihWYWx1ZS5mcm9tKHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRWaXNpYmxlRmllbGQobmFtZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZW4gdG8gcGFyZW50CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gc29sdmVHZW5lcmljVHlwZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGZvciAoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIgdHAgOiB3cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBpZiAodHAuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBSZXNvbHZlZFR5cGVWYXJpYWJsZShuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIodHAsIHR5cGVTb2x2ZXIpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlR2VuZXJpY1R5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBqYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IHNvbHZlQ29uc3RydWN0b3IoTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLnNvbHZlQ29uc3RydWN0b3IoYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQcml2YXRlIG1ldGhvZHMKKyAgICAvLy8KKworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24odGhpcy53cmFwcGVkTm9kZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Db21waWxhdGlvblVuaXRDb250ZXh0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0NvbXBpbGF0aW9uVW5pdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE0YWEwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Db21waWxhdGlvblVuaXRDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dDxDb21waWxhdGlvblVuaXQ+IHsKKworICAgIC8vLworICAgIC8vLyBTdGF0aWMgbWV0aG9kcworICAgIC8vLworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1YWxpZmllZE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuY29udGFpbnMoIi4iKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gQ29uc3RydWN0b3JzCisgICAgLy8vCisKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0Q29udGV4dChDb21waWxhdGlvblVuaXQgd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBzdXBlcih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFB1YmxpYyBtZXRob2RzCisgICAgLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKworICAgICAgICAvLyBzb2x2ZSBhYnNvbHV0ZSByZWZlcmVuY2VzCisgICAgICAgIFN0cmluZyBpdE5hbWUgPSBuYW1lOworICAgICAgICB3aGlsZSAoaXROYW1lLmNvbnRhaW5zKCIuIikpIHsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGUoaXROYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gZ2V0TWVtYmVyKGl0TmFtZSk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHR5cGUgPSB0aGlzLnNvbHZlVHlwZSh0eXBlTmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAodHlwZS5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xJblR5cGUodHlwZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSwgbWVtYmVyTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0TmFtZSA9IHR5cGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vayBhbW9uZyBzdGF0aWNhbGx5IGltcG9ydGVkIHZhbHVlcworICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0SW1wb3J0cygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbCA6IHdyYXBwZWROb2RlLmdldEltcG9ydHMoKSkgeworICAgICAgICAgICAgICAgIGlmKGltcG9ydERlY2wuaXNTdGF0aWMoKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKGltcG9ydERlY2wuaXNBc3RlcmlzaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBpbXBvcnREZWNsLmdldE5hbWVBc1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gaW1wb3J0ZWRUeXBlID0gdHlwZVNvbHZlci5zb2x2ZVR5cGUocU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xJblR5cGUoaW1wb3J0ZWRUeXBlLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3aG9sZSA9IGltcG9ydERlY2wuZ2V0TmFtZUFzU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0IGluIGZpZWxkL21ldGhvZCBuYW1lIGFuZCB0eXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gZ2V0TWVtYmVyKHdob2xlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGUod2hvbGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyTmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBpbXBvcnRlZFR5cGUgPSB0eXBlU29sdmVyLnNvbHZlVHlwZSh0eXBlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xJblR5cGUoaW1wb3J0ZWRUeXBlLCBtZW1iZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0VHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFR5cGVEZWNsYXJhdGlvbjw/PiB0eXBlIDogd3JhcHBlZE5vZGUuZ2V0VHlwZXMoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbigoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKSB0eXBlLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQobmV3IEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24oKEVudW1EZWNsYXJhdGlvbikgdHlwZSwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHR5cGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldEltcG9ydHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgZG90UG9zID0gbmFtZS5pbmRleE9mKCcuJyk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChkb3RQb3MgPiAtMSkgeworICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDAsIGRvdFBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBsb29rIGludG8gdHlwZSBpbXBvcnRzCisgICAgICAgICAgICBmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2wgOiB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWltcG9ydERlY2wuaXNBc3RlcmlzaygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSA9IGltcG9ydERlY2wuZ2V0TmFtZUFzU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFBhY2thZ2UgPSAhaW1wb3J0RGVjbC5nZXROYW1lKCkuZ2V0UXVhbGlmaWVyKCkuaXNQcmVzZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSAhZGVmYXVsdFBhY2thZ2UgJiYgaW1wb3J0RGVjbC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBxTmFtZS5lbmRzV2l0aCgiLiIgKyBwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSA9IHFOYW1lICsgbmFtZS5zdWJzdHJpbmcoZG90UG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IHJlZiA9IHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUocU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5hZGFwdChyZWYsIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGxvb2sgaW50byB0eXBlIGltcG9ydHMgb24gZGVtYW5kCisgICAgICAgICAgICBmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2wgOiB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1wb3J0RGVjbC5pc0FzdGVyaXNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lID0gaW1wb3J0RGVjbC5nZXROYW1lQXNTdHJpbmcoKSArICIuIiArIG5hbWU7CisgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVmID0gdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShxTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5hZGFwdChyZWYsIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgaW4gY3VycmVudCBwYWNrYWdlCisgICAgICAgIGlmICh0aGlzLndyYXBwZWROb2RlLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSB0aGlzLndyYXBwZWROb2RlLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmdldCgpLmdldE5hbWUoKS50b1N0cmluZygpICsgIi4iICsgbmFtZTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVmID0gdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShxTmFtZSk7CisgICAgICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLmFkYXB0KHJlZiwgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbG9vayBmb3IgY2xhc3NlcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlCisgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBuYW1lOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiByZWYgPSB0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKHFOYW1lKTsKKyAgICAgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UuYWRhcHQocmVmLCBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb29rIGluIHRoZSBqYXZhLmxhbmcgcGFja2FnZQorICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IHJlZiA9IHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoImphdmEubGFuZy4iICsgbmFtZSk7CisgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5hZGFwdChyZWYsIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERPIE5PVCBsb29rIGZvciBhYnNvbHV0ZSBuYW1lIGlmIHRoaXMgbmFtZSBpcyBub3QgcXVhbGlmaWVkOiB5b3UgY2Fubm90IGltcG9ydCBjbGFzc2VzIGZyb20gdGhlIGRlZmF1bHQgcGFja2FnZQorICAgICAgICBpZiAoaXNRdWFsaWZpZWROYW1lKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLmFkYXB0KHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUobmFtZSksIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcU5hbWUoQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZS5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcU5hbWUodHlwZS5nZXRTY29wZSgpLmdldCgpKSArICIuIiArIHR5cGUuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHFOYW1lKE5hbWUgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5nZXRRdWFsaWZpZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHFOYW1lKG5hbWUuZ2V0UXVhbGlmaWVyKCkuZ2V0KCkpICsgIi4iICsgbmFtZS5nZXRJZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU2ltcGxlTmFtZShTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgU3RyaW5nW10gcGFydHMgPSBxTmFtZS5zcGxpdCgiXFwuIik7CisgICAgICAgIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZShTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgaW50IGxhc3REb3QgPSBxTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAobGFzdERvdCA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcU5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBib29sZWFuIHN0YXRpY09ubHksIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2wgOiB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkpIHsKKyAgICAgICAgICAgIGlmKGltcG9ydERlY2wuaXNTdGF0aWMoKSl7CisgICAgICAgICAgICAgICAgaWYoaW1wb3J0RGVjbC5pc0FzdGVyaXNrKCkpeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0U3RyaW5nID0gaW1wb3J0RGVjbC5nZXROYW1lQXNTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53cmFwcGVkTm9kZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5pc1ByZXNlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMocGFja2FnZU5hbWUoaW1wb3J0U3RyaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVzKCkuc3RyZWFtKCkuYW55TWF0Y2goaXQgLT4gaXQuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHModG9TaW1wbGVOYW1lKGltcG9ydFN0cmluZykpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHVzaW5nIGEgc3RhdGljIGltcG9ydCBvbiBhIHR5cGUgZGVmaW5lZCBpbiB0aGlzIGZpbGUuIEl0IG1lYW5zIHRoZSB2YWx1ZSB3YXMgbm90IGZvdW5kIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGxvd2VyIGxldmVsIHNvIHRoaXMgd2lsbCBmYWlsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gcmVmID0gdHlwZVNvbHZlci5zb2x2ZVR5cGUoaW1wb3J0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZCA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShyZWYsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0cnVlLCB0eXBlU29sdmVyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSA9IGltcG9ydERlY2wuZ2V0TmFtZUFzU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHFOYW1lLmVxdWFscyhuYW1lKSB8fCBxTmFtZS5lbmRzV2l0aCgiLiIgKyBuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZShxTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiByZWYgPSB0eXBlU29sdmVyLnNvbHZlVHlwZSh0eXBlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kID0gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKHJlZiwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHRydWUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQcml2YXRlIG1ldGhvZHMKKyAgICAvLy8KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFR5cGUoU3RyaW5nIHFOYW1lKSB7CisgICAgICAgIGludCBpbmRleCA9IHFOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gcU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIHR5cGVOYW1lOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldE1lbWJlcihTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gcU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IHFOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICByZXR1cm4gbWVtYmVyTmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0NvbnN0cnVjdG9yQ29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Db25zdHJ1Y3RvckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJhYTczCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Db25zdHJ1Y3RvckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RNZXRob2RMaWtlRGVjbGFyYXRpb25Db250ZXh0PENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IHsKKworICAgIC8vLworICAgIC8vLyBDb25zdHJ1Y3RvcnMKKyAgICAvLy8KKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckNvbnRleHQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB3cmFwcGVkTm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHN1cGVyKHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQ29udGV4dEhlbHBlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Db250ZXh0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlZGEyNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQ29udGV4dEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENvbnRleHRIZWxwZXIgeworCisgICAgcHJpdmF0ZSBDb250ZXh0SGVscGVyKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBzb2x2ZU1ldGhvZEFzVXNhZ2UoUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQsIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVycykgeworICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0eXBlRGVjbGFyYXRpb24udG9TdHJpbmcoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0VudW1EZWNsYXJhdGlvbkNvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvRW51bURlY2xhcmF0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjM2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0VudW1EZWNsYXJhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJFbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtRGVjbGFyYXRpb25Db250ZXh0IGV4dGVuZHMgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dDxFbnVtRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgSmF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgamF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uQ29udGV4dChFbnVtRGVjbGFyYXRpb24gd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBzdXBlcih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgICAgIHRoaXMuamF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBuZXcgSmF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIsCisgICAgICAgICAgICAgICAgZ2V0RGVjbGFyYXRpb24oKSwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbChTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICh0eXBlU29sdmVyID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAvLyBhbW9uZyBjb25zdGFudHMKKyAgICAgICAgZm9yIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBjb25zdGFudCA6IHdyYXBwZWROb2RlLmdldEVudHJpZXMoKSkgeworICAgICAgICAgICAgaWYgKGNvbnN0YW50LmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyRW51bUNvbnN0YW50RGVjbGFyYXRpb24oY29uc3RhbnQsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmdldERlY2xhcmF0aW9uKCkuaGFzRmllbGQobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRGaWVsZChuYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGVuIHRvIHBhcmVudAorICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBqYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFByaXZhdGUgbWV0aG9kcworICAgIC8vLworCisgICAgcHJpdmF0ZSBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKHRoaXMud3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvRmllbGRBY2Nlc3NDb250ZXh0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0ZpZWxkQWNjZXNzQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Y2NlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0ZpZWxkQWNjZXNzQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5yZXF1aXJlUGFyZW50Tm9kZTsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEZpZWxkQWNjZXNzQ29udGV4dCBleHRlbmRzIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8RmllbGRBY2Nlc3NFeHByPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJSQVlfTEVOR1RIX0ZJRUxEX05BTUUgPSAibGVuZ3RoIjsKKworICAgIHB1YmxpYyBGaWVsZEFjY2Vzc0NvbnRleHQoRmllbGRBY2Nlc3NFeHByIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0U2NvcGUoKSBpbnN0YW5jZW9mIFRoaXNFeHByKSB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGVPZlRoaXMgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlT2ZUaGlzSW4od3JhcHBlZE5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sSW5UeXBlKHR5cGVPZlRoaXMuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSwgdHlwZVNvbHZlcikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtZXRlclR5cGVzLCBib29sZWFuIHN0YXRpY09ubHksIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChyZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSksIHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFZhbHVlPiBzb2x2ZVN5bWJvbEFzVmFsdWUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBFeHByZXNzaW9uIHNjb3BlID0gd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKTsKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGVPZlNjb3BlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShzY29wZSk7CisgICAgICAgICAgICBpZiAodHlwZU9mU2NvcGUuaXNBcnJheSgpICYmIG5hbWUuZXF1YWxzKEFSUkFZX0xFTkdUSF9GSUVMRF9OQU1FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihuZXcgVmFsdWUoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVCwgQVJSQVlfTEVOR1RIX0ZJRUxEX05BTUUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlT2ZTY29wZS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gdHlwZVVzYWdlID0gdHlwZU9mU2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0RmllbGRUeXBlKG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlVXNhZ2UubWFwKHJlc29sdmVkVHlwZSAtPiBuZXcgVmFsdWUocmVzb2x2ZWRUeXBlLCBuYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBzb2x2ZUZpZWxkKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcnJ0ZHMgPSBmaW5kVHlwZURlY2xhcmF0aW9ucyhPcHRpb25hbC5vZih3cmFwcGVkTm9kZS5nZXRTY29wZSgpKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gcnJ0ZCA6IHJydGRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHJydGQuZ2V0RmllbGQod3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvRm9yU3RhdGVtZW50Q29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Gb3JTdGF0ZW1lbnRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzZmUzYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvRm9yU3RhdGVtZW50Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCitwdWJsaWMgY2xhc3MgRm9yU3RhdGVtZW50Q29udGV4dCBleHRlbmRzIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8Rm9yU3RtdD4geworCisgICAgcHVibGljIEZvclN0YXRlbWVudENvbnRleHQoRm9yU3RtdCB3cmFwcGVkTm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHN1cGVyKHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gOiB3cmFwcGVkTm9kZS5nZXRJbml0aWFsaXphdGlvbigpKSB7CisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB7CisgICAgICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIGV4cHJlc3Npb247CisgICAgICAgICAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGVEZWNsYXJhdG9yIDogdmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2YXJpYWJsZURlY2xhcmF0b3IsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShleHByZXNzaW9uIGluc3RhbmNlb2YgQXNzaWduRXhwciB8fCBleHByZXNzaW9uIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGV4cHJlc3Npb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIE5vZGVXaXRoU3RhdGVtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIFN0YXRlbWVudENvbnRleHQuc29sdmVJbkJsb2NrKG5hbWUsIHR5cGVTb2x2ZXIsIHdyYXBwZWROb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhdGljT25seSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvRm9yZWNoU3RhdGVtZW50Q29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Gb3JlY2hTdGF0ZW1lbnRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MTIwMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvRm9yZWNoU3RhdGVtZW50Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCitwdWJsaWMgY2xhc3MgRm9yZWNoU3RhdGVtZW50Q29udGV4dCBleHRlbmRzIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQ8Rm9yZWFjaFN0bXQ+IHsKKworICAgIHB1YmxpYyBGb3JlY2hTdGF0ZW1lbnRDb250ZXh0KEZvcmVhY2hTdG10IHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0VmFyaWFibGUoKS5nZXRWYXJpYWJsZXMoKS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IgPSB3cmFwcGVkTm9kZS5nZXRWYXJpYWJsZSgpLmdldFZhcmlhYmxlcygpLmdldCgwKTsKKyAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2YXJpYWJsZURlY2xhcmF0b3IsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgaW5zdGFuY2VvZiBCbG9ja1N0bXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdGVtZW50Q29udGV4dC5zb2x2ZUluQmxvY2sobmFtZSwgdHlwZVNvbHZlciwgd3JhcHBlZE5vZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0YXRpY09ubHksIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0phdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0phdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzZjQyZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvSmF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgeworCisgICAgcHJpdmF0ZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+IHdyYXBwZWROb2RlOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgQ29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOworCisgICAgcHVibGljIEphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4gd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICB0aGlzLnR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbjsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodGhpcy53cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbih3cmFwcGVkTm9kZSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xhc3NlcworICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiB0aGlzLndyYXBwZWROb2RlLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgaWYgKG1lbWJlciBpbnN0YW5jZW9mIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+IGludGVybmFsVHlwZSA9IChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KSBtZW1iZXI7CisgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGludGVybmFsVHlwZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLCBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZS5zdWJzdHJpbmcod3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkubGVuZ3RoKCkgKyAxKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoU3RyaW5nLmZvcm1hdCgiJXMuIiwgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGludGVybmFsVHlwZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5sZW5ndGgoKSArIDEpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JhcHBlZE5vZGUgaW5zdGFuY2VvZiBOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzPD8+IG5vZGVXaXRoVHlwZVBhcmFtZXRlcnMgPSAoTm9kZVdpdGhUeXBlUGFyYW1ldGVyczw/Pikgd3JhcHBlZE5vZGU7CisgICAgICAgICAgICBmb3IgKFR5cGVQYXJhbWV0ZXIgYXN0VHBSYXcgOiBub2RlV2l0aFR5cGVQYXJhbWV0ZXJzLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBUeXBlUGFyYW1ldGVyIGFzdFRwID0gYXN0VHBSYXc7CisgICAgICAgICAgICAgICAgaWYgKGFzdFRwLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIoYXN0VHAsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb29rIGludG8gZXh0ZW5kZWQgY2xhc3NlcyBhbmQgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcworICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA6IHRoaXMudHlwZURlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpKSB7CisgICAgICAgIAl0cnkgeworCSAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gaW50ZXJuYWxUeXBlRGVjbGFyYXRpb24gOiBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5pbnRlcm5hbFR5cGVzKCkpIHsKKwkgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGludGVybmFsVHlwZURlY2xhcmF0aW9uKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKyAgICAgICAgCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgICAvLyBqdXN0IGNvbnRpbnVlIHVzaW5nIHRoZSBuZXh0IGFuY2VzdG9yCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBib29sZWFuIHN0YXRpY09ubHksIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGNhbmRpZGF0ZU1ldGhvZHMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiAhc3RhdGljT25seSB8fCAoc3RhdGljT25seSAmJiAgbS5pc1N0YXRpYygpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgLy8gV2Ugd2FudCB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW4gY2FzZSBvZiBPYmplY3QgaGF2aW5nIE9iamVjdCBhcyBhbmNlc3RvcgorICAgICAgICBpZiAoIU9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKHR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA6IHR5cGVEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKSkgeworCQkvLyBBdm9pZCByZWN1cnNpb24gb24gc2VsZgorICAgICAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gIT0gYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb2x2ZU1ldGhvZEluVHlwZShhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgICAgICAvLyBjb25zaWRlciBtZXRob2RzIGZyb20gc3VwZXJjbGFzc2VzIGFuZCBvbmx5IGRlZmF1bHQgbWV0aG9kcyBmcm9tIGludGVyZmFjZXMgOgorICAgICAgICAgICAgICAgICAgICAvLyBub3QgdHJ1ZSwgd2Ugc2hvdWxkIGtlZXAgYWJzdHJhY3QgYXMgYSB2YWxpZCBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWJzdHJhY3QgYXJlIHJlbW92ZWQgaW4gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzQXBwbGljYWJsZSBpcyBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVNZXRob2RzLmFkZChyZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBXZSB3YW50IHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIGEgY2xhc3MgaXMgdXNpbmcgaXRzIG93biBtZXRob2QKKyAgICAgICAgLy8gc2VlIGlzc3VlICM3NQorICAgICAgICBpZiAoY2FuZGlkYXRlTWV0aG9kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBwYXJlbnRTb2x1dGlvbiA9IGNvbnRleHQuZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHBhcmVudFNvbHV0aW9uLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVNZXRob2RzLmFkZChwYXJlbnRTb2x1dGlvbi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBpcyBpbnRlcmZhY2UgYW5kIGNhbmRpZGF0ZSBtZXRob2QgbGlzdCBpcyBlbXB0eSwgd2Ugc2hvdWxkIGNoZWNrIHRoZSBPYmplY3QgTWV0aG9kcworICAgICAgICBpZiAoY2FuZGlkYXRlTWV0aG9kcy5pc0VtcHR5KCkgJiYgdHlwZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZXMgPSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVzLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVNZXRob2RzLmFkZChyZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoY2FuZGlkYXRlTWV0aG9kcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBzb2x2ZUNvbnN0cnVjdG9yKExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBDb25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoKChSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29uc3RydWN0b3JzKCksIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9MYW1iZGFFeHByQ29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9MYW1iZGFFeHByQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzRmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0xhbWJkYUV4cHJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRMYW1iZGFDb25zdHJhaW50VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLk15T2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbERlY2xhcmF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgTGFtYmRhRXhwckNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0PExhbWJkYUV4cHI+IHsKKworICAgIHB1YmxpYyBMYW1iZGFFeHByQ29udGV4dChMYW1iZGFFeHByIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxWYWx1ZT4gc29sdmVTeW1ib2xBc1ZhbHVlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBTeW1ib2xEZWNsYXJhdG9yIHNiID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihwYXJhbWV0ZXIsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uIGRlY2wgOiBzYi5nZXRTeW1ib2xEZWNsYXJhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIGlmIChkZWNsLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IChNZXRob2RDYWxsRXhwcikgcmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobWV0aG9kQ2FsbEV4cHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBwb3MobWV0aG9kQ2FsbEV4cHIsIHdyYXBwZWROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBsYW1iZGFUeXBlID0gbWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlcygpLmdldChpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmdW5jdGlvbmFsIG1ldGhvZCBpbiBvcmRlciBmb3IgdXMgdG8gcmVzb2x2ZSBpdCdzIHR5cGUgYXJndW1lbnRzIHByb3Blcmx5CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gZnVuY3Rpb25hbE1ldGhvZE9wdCA9IEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKGxhbWJkYVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uYWxNZXRob2RPcHQuaXNQcmVzZW50KCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFVzYWdlIGZ1bmN0aW9uYWxNZXRob2QgPSBmdW5jdGlvbmFsTWV0aG9kT3B0LmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmVyZW5jZUNvbnRleHQgaW5mZXJlbmNlQ29udGV4dCA9IG5ldyBJbmZlcmVuY2VDb250ZXh0KE15T2JqZWN0UHJvdmlkZXIuSU5TVEFOQ0UpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBlYWNoIHR5cGUgdmFyaWFibGUgb2YgdGhlIGxhbWJkYSwgYW5kIHVzZSB0aGlzIGxhdGVyIHRvIGluZmVyIHRoZSB0eXBlIG9mIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIobGFtYmRhVHlwZSwgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGxhbWJkYVR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCksIHR5cGVTb2x2ZXIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoaXMgbGFtYmRhIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYW1iZGFQYXJhbUluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGFtYmRhUGFyYW1JbmRleCA9IDA7IGxhbWJkYVBhcmFtSW5kZXggPCB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpOyBsYW1iZGFQYXJhbUluZGV4KyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVyKGxhbWJkYVBhcmFtSW5kZXgpLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG5hbWUpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7IH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyByZXNvbHZlIHRoZSBhcmd1bWVudCB0eXBlIHVzaW5nIHRoZSBpbmZlcmVuY2UgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBhcmdUeXBlID0gaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKGZ1bmN0aW9uYWxNZXRob2QuZ2V0UGFyYW1UeXBlKGxhbWJkYVBhcmFtSW5kZXgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZExhbWJkYUNvbnN0cmFpbnRUeXBlIGNvblR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNXaWxkY2FyZCgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uVHlwZSA9IFJlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUuYm91bmQoYXJnVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uVHlwZSA9IFJlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUuYm91bmQoYXJnVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlID0gbmV3IFZhbHVlKGNvblR5cGUsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGVEZWNsYXJhdG9yID0gKFZhcmlhYmxlRGVjbGFyYXRvcikgcmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHQgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZSh2YXJpYWJsZURlY2xhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IGZ1bmN0aW9uYWxNZXRob2QgPSBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbmFsTWV0aG9kLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGxhbWJkYVR5cGUgPSBmdW5jdGlvbmFsTWV0aG9kLmdldCgpLmdldFBhcmFtVHlwZShpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHBhcmFtZXRlciBmcm9tIGRlY2xhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gaW5mZXJyZWRUeXBlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFtYmRhVHlwZS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5QYWlyPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IGVudHJ5IDogbGFtYmRhVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlUGFyYW1ldGVyc01hcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuYi5pc1R5cGVWYXJpYWJsZSgpICYmIGVudHJ5LmIuYXNUeXBlUGFyYW1ldGVyKCkuZGVjbGFyZWRPblR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBvdCA9IHQuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZShlbnRyeS5hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFUeXBlID0gbGFtYmRhVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhlbnRyeS5hLCBvdCwgaW5mZXJyZWRUeXBlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhbWJkYVR5cGUuaXNUeXBlVmFyaWFibGUoKSAmJiBsYW1iZGFUeXBlLmFzVHlwZVBhcmFtZXRlcigpLmRlY2xhcmVkT25UeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhVHlwZSA9IHQuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZShsYW1iZGFUeXBlLmFzVHlwZVBhcmFtZXRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSB2YWx1ZSA9IG5ldyBWYWx1ZShsYW1iZGFUeXBlLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kIHdlIHNob3VsZCBhc2sgdGhlIHBhcmVudCBjb250ZXh0CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbChTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHdyYXBwZWROb2RlLmdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgU3ltYm9sRGVjbGFyYXRvciBzYiA9IEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3IocGFyYW1ldGVyLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHN5bWJvbFJlZmVyZW5jZSA9IHNvbHZlV2l0aChzYiwgbmFtZSk7CisgICAgICAgICAgICBpZiAoc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sUmVmZXJlbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm90aGluZyBpcyBmb3VuZCB3ZSBzaG91bGQgYXNrIHRoZSBwYXJlbnQgY29udGV4dAorICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKAorICAgICAgICAgICAgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgYm9vbGVhbiBzdGF0aWNPbmx5LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFByb3RlY3RlZCBtZXRob2RzCisgICAgLy8vCisKKyAgICBwcm90ZWN0ZWQgZmluYWwgT3B0aW9uYWw8VmFsdWU+IHNvbHZlV2l0aEFzVmFsdWUoU3ltYm9sRGVjbGFyYXRvciBzeW1ib2xEZWNsYXJhdG9yLCBTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uIGRlY2wgOiBzeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoZGVjbC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gUHJpdmF0ZSBtZXRob2RzCisgICAgLy8vCisKKyAgICBwcml2YXRlIGludCBwb3MoTWV0aG9kQ2FsbEV4cHIgY2FsbEV4cHIsIEV4cHJlc3Npb24gcGFyYW0pIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEV4cHJlc3Npb24gcCA6IGNhbGxFeHByLmdldEFyZ3VtZW50cygpKSB7CisgICAgICAgICAgICBpZiAocCA9PSBwYXJhbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL01ldGhvZENhbGxFeHByQ29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9NZXRob2RDYWxsRXhwckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTlmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9NZXRob2RDYWxsRXhwckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDQzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitwdWJsaWMgY2xhc3MgTWV0aG9kQ2FsbEV4cHJDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dDxNZXRob2RDYWxsRXhwcj4geworCisgICAgLy8vCisgICAgLy8vIENvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgcHVibGljIE1ldGhvZENhbGxFeHByQ29udGV4dChNZXRob2RDYWxsRXhwciB3cmFwcGVkTm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHN1cGVyKHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IHNvbHZlR2VuZXJpY1R5cGUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZih3cmFwcGVkTm9kZS5nZXRTY29wZSgpLmlzUHJlc2VudCgpKXsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlT2ZTY29wZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUod3JhcHBlZE5vZGUuZ2V0U2NvcGUoKS5nZXQoKSk7CisgICAgICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IHJlcyA9IHR5cGVPZlNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpLmdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUobmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiTWV0aG9kQ2FsbEV4cHJDb250ZXh0e3dyYXBwZWQ9IiArIHdyYXBwZWROb2RlICsgIn0iOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RVc2FnZT4gc29sdmVNZXRob2RBc1VzYWdlKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IHdyYXBwZWROb2RlLmdldFNjb3BlKCkuZ2V0KCk7CisgICAgICAgICAgICAvLyBDb25zaWRlciBzdGF0aWMgbWV0aG9kIGNhbGxzCisgICAgICAgICAgICBpZiAoc2NvcGUgaW5zdGFuY2VvZiBOYW1lRXhwcikgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoKE5hbWVFeHByKSBzY29wZSkuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBzb2x2ZVR5cGUoY2xhc3NOYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IG0gPSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gbmV3IE1ldGhvZFVzYWdlKG0uZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kVXNhZ2UgPSByZXNvbHZlTWV0aG9kVHlwZVBhcmFtZXRlcnNGcm9tRXhwbGljaXRMaXN0KHR5cGVTb2x2ZXIsIG1ldGhvZFVzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gcmVzb2x2ZU1ldGhvZFR5cGVQYXJhbWV0ZXJzKG1ldGhvZFVzYWdlLCBhcmd1bWVudHNUeXBlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobWV0aG9kVXNhZ2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0aG9kICciICsgbmFtZSArICInIHdpdGggcGFyYW1ldGVyVHlwZXMgIiArIGFyZ3VtZW50c1R5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGVPZlNjb3BlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShzY29wZSk7CisgICAgICAgICAgICAvLyB3ZSBjYW4gcmVwbGFjZSB0aGUgcGFyYW1ldGVyIHR5cGVzIGZyb20gdGhlIHNjb3BlIGludG8gdGhlIHR5cGVQYXJhbWV0ZXJzVmFsdWVzCisKKyAgICAgICAgICAgIE1hcDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPiBpbmZlcnJlZFR5cGVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHNUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIGJ5IHJlcGxhY2luZyB0eXBlcyBJIGNhbiBhbHNvIGZpbmQgbmV3IGVxdWl2YWxlbmNlcworICAgICAgICAgICAgICAgIC8vIGZvciBleGFtcGxlIGlmIEkgcmVwbGFjZSBUPVUgd2l0aCBTdHJpbmcgYmVjYXVzZSBJIGtub3cgdGhhdCBUPVN0cmluZyBJIGNhbiBkZXJpdmUgdGhhdCBhbHNvIFUgZXF1YWwgU3RyaW5nCisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIG9yaWdpbmFsQXJndW1lbnRUeXBlID0gYXJndW1lbnRzVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSB1cGRhdGVkQXJndW1lbnRUeXBlID0gdXNpbmdQYXJhbWV0ZXJUeXBlc0Zyb21TY29wZSh0eXBlT2ZTY29wZSwgb3JpZ2luYWxBcmd1bWVudFR5cGUsIGluZmVycmVkVHlwZXMpOworICAgICAgICAgICAgICAgIGFyZ3VtZW50c1R5cGVzLnNldChpLCB1cGRhdGVkQXJndW1lbnRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzVHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgdXBkYXRlZEFyZ3VtZW50VHlwZSA9IGFwcGx5SW5mZXJyZWRUeXBlcyhhcmd1bWVudHNUeXBlcy5nZXQoaSksIGluZmVycmVkVHlwZXMpOworICAgICAgICAgICAgICAgIGFyZ3VtZW50c1R5cGVzLnNldChpLCB1cGRhdGVkQXJndW1lbnRUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNvbHZlTWV0aG9kQXNVc2FnZSh0eXBlT2ZTY29wZSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29udGV4dCBwYXJlbnRDb250ZXh0ID0gZ2V0UGFyZW50KCk7CisgICAgICAgICAgICB3aGlsZSAocGFyZW50Q29udGV4dCBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudENvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kVXNhZ2UgcmVzb2x2ZU1ldGhvZFR5cGVQYXJhbWV0ZXJzRnJvbUV4cGxpY2l0TGlzdChUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlKSB7CisgICAgICAgIGlmICh3cmFwcGVkTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlQXJndW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlIHR5IDogd3JhcHBlZE5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpKSB7CisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5hZGQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UodHkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlQYXJhbURlY2xzID0gbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5nZXRUeXBlUGFyYW1ldGVycygpOworICAgICAgICAgICAgaWYgKHR5UGFyYW1EZWNscy5zaXplKCkgPT0gdHlwZUFyZ3VtZW50cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5UGFyYW1EZWNscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtZXRob2RVc2FnZSA9IG1ldGhvZFVzYWdlLnJlcGxhY2VUeXBlUGFyYW1ldGVyKHR5UGFyYW1EZWNscy5nZXQoaSksIHR5cGVBcmd1bWVudHMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWV0aG9kVXNhZ2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbChTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8VmFsdWU+IHNvbHZlU3ltYm9sQXNWYWx1ZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIENvbnRleHQgcGFyZW50Q29udGV4dCA9IGdldFBhcmVudCgpOworICAgICAgICByZXR1cm4gcGFyZW50Q29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBib29sZWFuIHN0YXRpY09ubHksIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBDb2xsZWN0aW9uPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBycnRkcyA9IGZpbmRUeXBlRGVjbGFyYXRpb25zKHdyYXBwZWROb2RlLmdldFNjb3BlKCksIHR5cGVTb2x2ZXIpOworICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHJydGQgOiBycnRkcykgeworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShycnRkLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHJlcy5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQcml2YXRlIG1ldGhvZHMKKyAgICAvLy8KKworICAgIHByaXZhdGUgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHNvbHZlTWV0aG9kQXNVc2FnZShSZXNvbHZlZFJlZmVyZW5jZVR5cGUgcmVmVHlwZSwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGludm9rYXRpb25Db250ZXh0KSB7CisgICAgICAgIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiByZWYgPSBDb250ZXh0SGVscGVyLnNvbHZlTWV0aG9kQXNVc2FnZShyZWZUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSk7CisgICAgICAgIGlmIChyZWYuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gcmVmLmdldCgpOworCisgICAgICAgICAgICBtZXRob2RVc2FnZSA9IHJlc29sdmVNZXRob2RUeXBlUGFyYW1ldGVyc0Zyb21FeHBsaWNpdExpc3QodHlwZVNvbHZlciwgbWV0aG9kVXNhZ2UpOworCisgICAgICAgICAgICAvLyBBdCB0aGlzIHN0YWdlIEkgc2hvdWxkIGRlcml2ZSBmcm9tIHRoZSBjb250ZXh0IGFuZCB0aGUgdmFsdWUgc29tZSBpbmZvcm1hdGlvbiBvbiB0aGUgdHlwZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nOgorICAgICAgICAgICAgLy8gbXlTdHJlYW0uY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKQorICAgICAgICAgICAgLy8gSSBzaG91bGQgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHRoYXQgY29uc2lkZXJpbmcgdGhlIHR5cGUgb2YgdGhlIHN0cmVhbSAoZS5nLiwgU3RyZWFtPFN0cmluZz4pCisgICAgICAgICAgICAvLyBhbmQgY29uc2lkZXJpbmcgdGhhdCBTdHJlYW0gaGFzIHRoaXMgbWV0aG9kOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIDxSLEE+IFIgY29sbGVjdChDb2xsZWN0b3I8PyBzdXBlciBULEEsUj4gY29sbGVjdG9yKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGFuZCBjb2xsZWN0b3IgaGFzIHRoaXMgbWV0aG9kOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHN0YXRpYyA8VD4gQ29sbGVjdG9yPFQsPyxMaXN0PFQ+PiAgIHRvTGlzdCgpCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIGNvbGxlY3QuUiBoYXMgdG8gYmUgZXF1YWwgdG8gTGlzdDx0b0xpc3QuVD4KKyAgICAgICAgICAgIC8vIEFuZCB0b0xpc3QuVCBoYXMgdG8gYmUgZXF1YWwgdG8gPyBzdXBlciBTdHJlYW0uVAorICAgICAgICAgICAgLy8gVGhlcmVmb3JlIFIgaGFzIHRvIGJlIGVxdWFsIHRvIExpc3Q8PyBzdXBlciBTdHJlYW0uVD4uCisgICAgICAgICAgICAvLyBJbiBvdXIgZXhhbXBsZSBTdHJlYW0uVCBlcXVhbCB0byBTdHJpbmcsIHNvIHRoZSBSIChhbmQgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBjb2xsZWN0KSBpcworICAgICAgICAgICAgLy8gTGlzdDw/IHN1cGVyIFN0cmluZz4KKworICAgICAgICAgICAgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IGRlcml2ZWRWYWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5nZXRQYXJhbShpKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlci5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5pc1ZhcmlhZGljKCkpIHsKKyAgICAgICAgICAgICAgICAJcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZmVyVHlwZXMoYXJndW1lbnRzVHlwZXMuZ2V0KGkpLCBwYXJhbWV0ZXJUeXBlLCBkZXJpdmVkVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gZW50cnkgOiBkZXJpdmVkVmFsdWVzLmVudHJ5U2V0KCkpeworICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gbWV0aG9kVXNhZ2UucmVwbGFjZVR5cGVQYXJhbWV0ZXIoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcmV0dXJuVHlwZSA9IHJlZlR5cGUudXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUobWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IG1ldGhvZFVzYWdlLnJldHVyblR5cGUoKSkgeworICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gbWV0aG9kVXNhZ2UucmVwbGFjZVJldHVyblR5cGUocmV0dXJuVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSByZXBsYWNlZCA9IHJlZlR5cGUudXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUobWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlcygpLmdldChpKSk7CisgICAgICAgICAgICAgICAgbWV0aG9kVXNhZ2UgPSBtZXRob2RVc2FnZS5yZXBsYWNlUGFyYW1UeXBlKGksIHJlcGxhY2VkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihtZXRob2RVc2FnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluZmVyVHlwZXMoUmVzb2x2ZWRUeXBlIHNvdXJjZSwgUmVzb2x2ZWRUeXBlIHRhcmdldCwgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IG1hcHBpbmdzKSB7CisgICAgICAgIGlmIChzb3VyY2UuZXF1YWxzKHRhcmdldCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzUmVmZXJlbmNlVHlwZSgpICYmIHRhcmdldC5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHNvdXJjZVJlZlR5cGUgPSBzb3VyY2UuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgdGFyZ2V0UmVmVHlwZSA9IHRhcmdldC5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2VSZWZUeXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModGFyZ2V0UmVmVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICAJaWYgKCFzb3VyY2VSZWZUeXBlLmlzUmF3VHlwZSgpICYmICF0YXJnZXRSZWZUeXBlLmlzUmF3VHlwZSgpKSB7CisJICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKTsgaSsrKSB7CisJICAgICAgICAgICAgICAgICAgICBpbmZlclR5cGVzKHNvdXJjZVJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSksIHRhcmdldFJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSksIG1hcHBpbmdzKTsKKwkgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzUmVmZXJlbmNlVHlwZSgpICYmIHRhcmdldC5pc1dpbGRjYXJkKCkpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXQuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5mZXJUeXBlcyhzb3VyY2UsIHRhcmdldC5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgbWFwcGluZ3MpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzV2lsZGNhcmQoKSAmJiB0YXJnZXQuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICBpZiAoc291cmNlLmFzV2lsZGNhcmQoKS5pc0JvdW5kZWQoKSAmJiB0YXJnZXQuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpKXsKKyAgICAgICAgICAgICAgICBpbmZlclR5cGVzKHNvdXJjZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgdGFyZ2V0LmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLCBtYXBwaW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc1JlZmVyZW5jZVR5cGUoKSAmJiB0YXJnZXQuaXNUeXBlVmFyaWFibGUoKSkgeworICAgICAgICAgICAgbWFwcGluZ3MucHV0KHRhcmdldC5hc1R5cGVQYXJhbWV0ZXIoKSwgc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzV2lsZGNhcmQoKSAmJiB0YXJnZXQuaXNUeXBlVmFyaWFibGUoKSkgeworICAgICAgICAgICAgbWFwcGluZ3MucHV0KHRhcmdldC5hc1R5cGVQYXJhbWV0ZXIoKSwgc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzQXJyYXkoKSAmJiB0YXJnZXQuaXNXaWxkY2FyZCgpKXsKKyAgICAgICAgICAgIGlmKHRhcmdldC5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkpeworICAgICAgICAgICAgICAgIGluZmVyVHlwZXMoc291cmNlLCB0YXJnZXQuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCksIG1hcHBpbmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc0FycmF5KCkgJiYgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlLmlzV2lsZGNhcmQoKSAmJiB0YXJnZXQuaXNSZWZlcmVuY2VUeXBlKCkpeworICAgICAgICAgICAgaWYgKHNvdXJjZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkpeworICAgICAgICAgICAgICAgIGluZmVyVHlwZXMoc291cmNlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLCB0YXJnZXQsIG1hcHBpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzQ29uc3RyYWludCgpICYmIHRhcmdldC5pc1JlZmVyZW5jZVR5cGUoKSl7CisgICAgICAgICAgICBpbmZlclR5cGVzKHNvdXJjZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSwgdGFyZ2V0LCBtYXBwaW5ncyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlLmlzQ29uc3RyYWludCgpICYmIHRhcmdldC5pc1R5cGVWYXJpYWJsZSgpKXsKKyAgICAgICAgICAgIGluZmVyVHlwZXMoc291cmNlLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpLCB0YXJnZXQsIG1hcHBpbmdzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzVHlwZVZhcmlhYmxlKCkgJiYgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc1ByaW1pdGl2ZSgpIHx8IHRhcmdldC5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc051bGwoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNvdXJjZS5kZXNjcmliZSgpICsgIiAiICsgdGFyZ2V0LmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgTWV0aG9kVXNhZ2UgcmVzb2x2ZU1ldGhvZFR5cGVQYXJhbWV0ZXJzKE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlLCBMaXN0PFJlc29sdmVkVHlwZT4gYWN0dWFsUGFyYW1UeXBlcykgeworICAgICAgICBNYXA8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGlmIChtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkpIHsKKyAgICAgICAgICAgIGlmIChhY3R1YWxQYXJhbVR5cGVzLnNpemUoKSA9PSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmdldE51bWJlck9mUGFyYW1zKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFyYXJncyBwYXJhbWV0ZXIgaXMgYW4gQXJyYXksIHNvIGV4dHJhY3QgdGhlIGlubmVyIHR5cGUKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5nZXRMYXN0UGFyYW0oKS5nZXRUeXBlKCkuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgLy8gdGhlIHZhcmFyZ3MgY29ycmVzcG9uZGluZyB0eXBlIGNhbiBiZSBlaXRoZXIgVCBvciBBcnJheTxUPgorICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGFyYW1UeXBlcy5nZXQoYWN0dWFsUGFyYW1UeXBlcy5zaXplKCkgLSAxKS5pc0FycmF5KCkgPworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGFyYW1UeXBlcy5nZXQoYWN0dWFsUGFyYW1UeXBlcy5zaXplKCkgLSAxKS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQYXJhbVR5cGVzLmdldChhY3R1YWxQYXJhbVR5cGVzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5yZXBsYWNlVHlwZVBhcmFtKGV4cGVjdGVkVHlwZSwgdHAsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9rLCB0aGVuIGl0IG5lZWRzIHRvIGJlIHdyYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIHJlc29sdmUgdGhlIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgaW4gYSBNZXRob2RVc2FnZS4gRXhwZWN0ZWQgdHlwZTogJXMsIEFjdHVhbCB0eXBlOiAlcy4gTWV0aG9kIERlY2xhcmF0aW9uOiAlcy4gTWV0aG9kVXNhZ2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RVc2FnZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBtYXRjaCBvbmx5IHRoZSB2YXJhcmdzIHR5cGUKKyAgICAgICAgICAgICAgICBtYXRjaFR5cGVQYXJhbWV0ZXJzKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSwgbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZFVzYWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHVudGlsID0gbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5oYXNWYXJpYWRpY1BhcmFtZXRlcigpID8KKyAgICAgICAgICAgIGFjdHVhbFBhcmFtVHlwZXMuc2l6ZSgpIC0gMSA6CisgICAgICAgICAgICBhY3R1YWxQYXJhbVR5cGVzLnNpemUoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVudGlsOyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBleHBlY3RlZFR5cGUgPSBtZXRob2RVc2FnZS5nZXRQYXJhbVR5cGUoaSk7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgYWN0dWFsVHlwZSA9IGFjdHVhbFBhcmFtVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgbWF0Y2hUeXBlUGFyYW1ldGVycyhleHBlY3RlZFR5cGUsIGFjdHVhbFR5cGUsIG1hdGNoZWRUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCA6IG1hdGNoZWRUeXBlUGFyYW1ldGVycy5rZXlTZXQoKSkgeworICAgICAgICAgICAgbWV0aG9kVXNhZ2UgPSBtZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcih0cCwgbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzLmdldCh0cCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2RVc2FnZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF0Y2hUeXBlUGFyYW1ldGVycyhSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlLCBSZXNvbHZlZFR5cGUgYWN0dWFsVHlwZSwgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IG1hdGNoZWRUeXBlUGFyYW1ldGVycykgeworICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlLmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmICghYWN0dWFsVHlwZS5pc1R5cGVWYXJpYWJsZSgpICYmICFhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGFjdHVhbFR5cGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzLnB1dChleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCksIGFjdHVhbFR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICghYWN0dWFsVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oYWN0dWFsVHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaFR5cGVQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICAvLyBhdm9pZCBjYXNlcyB3aGVyZSB0aGUgYWN0dWFsIHR5cGUgaGFzIG5vIHR5cGUgcGFyYW1ldGVycyBidXQgdGhlIGV4cGVjdGVkIG9uZSBoYXMuIFN1Y2ggYXM6ICJjbGFzc1ggZXh0ZW5kcyBjbGFzc1k8SW50ZWdlcj4iCisgICAgICAgICAgICBpZiAoYWN0dWFsVHlwZS5pc1JlZmVyZW5jZVR5cGUoKSAmJiBhY3R1YWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZSB0cCA6IGV4cGVjdGVkVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoVHlwZVBhcmFtZXRlcnModHAsIGFjdHVhbFR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSksIG1hdGNoZWRUeXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZXhwZWN0ZWRUeXBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHNvbHZlTWV0aG9kQXNVc2FnZShSZXNvbHZlZFR5cGVWYXJpYWJsZSB0cCwgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBDb250ZXh0IGludm9rYXRpb25Db250ZXh0KSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQgYm91bmQgOiB0cC5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRCb3VuZHMoKSkgeworICAgICAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IG1ldGhvZFVzYWdlID0gc29sdmVNZXRob2RBc1VzYWdlKGJvdW5kLmdldFR5cGUoKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgIGlmIChtZXRob2RVc2FnZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RVc2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBzb2x2ZU1ldGhvZEFzVXNhZ2UoUmVzb2x2ZWRUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgQ29udGV4dCBpbnZva2F0aW9uQ29udGV4dCkgeworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFJlc29sdmVkUmVmZXJlbmNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHNvbHZlTWV0aG9kQXNVc2FnZSgoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSB0eXBlLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZXNvbHZlZFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIHNvbHZlTWV0aG9kQXNVc2FnZSgoUmVzb2x2ZWRUeXBlVmFyaWFibGUpIHR5cGUsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFJlc29sdmVkV2lsZGNhcmQpIHsKKyAgICAgICAgICAgIFJlc29sdmVkV2lsZGNhcmQgd2lsZGNhcmRVc2FnZSA9IChSZXNvbHZlZFdpbGRjYXJkKSB0eXBlOworICAgICAgICAgICAgaWYgKHdpbGRjYXJkVXNhZ2UuaXNTdXBlcigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvbHZlTWV0aG9kQXNVc2FnZSh3aWxkY2FyZFVzYWdlLmdldEJvdW5kZWRUeXBlKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbGRjYXJkVXNhZ2UuaXNFeHRlbmRzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImV4dGVuZHMgd2lsZGNhcmQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmJvdW5kZWQgd2lsZGNhcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUmVzb2x2ZWRMYW1iZGFDb25zdHJhaW50VHlwZSl7CisgICAgICAgICAgICBSZXNvbHZlZExhbWJkYUNvbnN0cmFpbnRUeXBlIGNvbnN0cmFpbnRUeXBlID0gKFJlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gc29sdmVNZXRob2RBc1VzYWdlKGNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFJlc29sdmVkQXJyYXlUeXBlKSB7CisgICAgICAgICAgICAvLyBBbiBhcnJheSBpbmhlcml0cyBtZXRob2RzIGZyb20gT2JqZWN0IG5vdCBmcm9tIGl0J3MgY29tcG9uZW50IHR5cGUKKyAgICAgICAgICAgIHJldHVybiBzb2x2ZU1ldGhvZEFzVXNhZ2UobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidHlwZSB1c2FnZTogIiArIHR5cGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgdXNpbmdQYXJhbWV0ZXJUeXBlc0Zyb21TY29wZShSZXNvbHZlZFR5cGUgc2NvcGUsIFJlc29sdmVkVHlwZSB0eXBlLCBNYXA8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gaW5mZXJyZWRUeXBlcykgeworICAgICAgICBpZiAodHlwZS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgZm9yIChQYWlyPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IGVudHJ5IDogdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlUGFyYW1ldGVyc01hcCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmEuZGVjbGFyZWRPblR5cGUoKSAmJiBzY29wZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRHZW5lcmljUGFyYW1ldGVyQnlOYW1lKGVudHJ5LmEuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhlbnRyeS5hLCBzY29wZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRHZW5lcmljUGFyYW1ldGVyQnlOYW1lKGVudHJ5LmEuZ2V0TmFtZSgpKS5nZXQoKSwgaW5mZXJyZWRUeXBlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIGFwcGx5SW5mZXJyZWRUeXBlcyhSZXNvbHZlZFR5cGUgdHlwZSwgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IGluZmVycmVkVHlwZXMpIHsKKyAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCA6IGluZmVycmVkVHlwZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBpbmZlcnJlZFR5cGVzLmdldCh0cCksIGluZmVycmVkVHlwZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvTWV0aG9kQ29udGV4dC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9NZXRob2RDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3NTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvTWV0aG9kQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kQ29udGV4dCBleHRlbmRzIEFic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dDxNZXRob2REZWNsYXJhdGlvbj4geworCisgICAgLy8vCisgICAgLy8vIENvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgcHVibGljIE1ldGhvZENvbnRleHQoTWV0aG9kRGVjbGFyYXRpb24gd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBzdXBlcih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL1N0YXRlbWVudENvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvU3RhdGVtZW50Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2FiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL1N0YXRlbWVudENvbnRleHQuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IucmVxdWlyZVBhcmVudE5vZGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0ZW1lbnRDb250ZXh0PE4gZXh0ZW5kcyBTdGF0ZW1lbnQ+IGV4dGVuZHMgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dDxOPiB7CisKKyAgICBwdWJsaWMgU3RhdGVtZW50Q29udGV4dChOIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlSW5CbG9jayhTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBTdGF0ZW1lbnQgc3RtdCkgeworICAgICAgICBpZiAoIShyZXF1aXJlUGFyZW50Tm9kZShzdG10KSBpbnN0YW5jZW9mIE5vZGVXaXRoU3RhdGVtZW50cykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBOb2RlV2l0aFN0YXRlbWVudHM8Pz4gYmxvY2tTdG10ID0gKE5vZGVXaXRoU3RhdGVtZW50czw/PikgcmVxdWlyZVBhcmVudE5vZGUoc3RtdCk7CisgICAgICAgIGludCBwb3NpdGlvbiA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpLmdldChpKS5lcXVhbHMoc3RtdCkpIHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvc2l0aW9uID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBTeW1ib2xEZWNsYXJhdG9yIHN5bWJvbERlY2xhcmF0b3IgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzeW1ib2xSZWZlcmVuY2UgPSBzb2x2ZVdpdGgoc3ltYm9sRGVjbGFyYXRvciwgbmFtZSk7CisgICAgICAgICAgICBpZiAoc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sUmVmZXJlbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm90aGluZyBpcyBmb3VuZCB3ZSBzaG91bGQgYXNrIHRoZSBwYXJlbnQgY29udGV4dAorICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChyZXF1aXJlUGFyZW50Tm9kZShzdG10KSwgdHlwZVNvbHZlcikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxWYWx1ZT4gc29sdmVJbkJsb2NrQXNWYWx1ZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBTdGF0ZW1lbnQgc3RtdCkgeworICAgICAgICBpZiAoIShyZXF1aXJlUGFyZW50Tm9kZShzdG10KSBpbnN0YW5jZW9mIE5vZGVXaXRoU3RhdGVtZW50cykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBOb2RlV2l0aFN0YXRlbWVudHM8Pz4gYmxvY2tTdG10ID0gKE5vZGVXaXRoU3RhdGVtZW50czw/PikgcmVxdWlyZVBhcmVudE5vZGUoc3RtdCk7CisgICAgICAgIGludCBwb3NpdGlvbiA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpLmdldChpKS5lcXVhbHMoc3RtdCkpIHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvc2l0aW9uID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBTeW1ib2xEZWNsYXJhdG9yIHN5bWJvbERlY2xhcmF0b3IgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzeW1ib2xSZWZlcmVuY2UgPSBzb2x2ZVdpdGgoc3ltYm9sRGVjbGFyYXRvciwgbmFtZSk7CisgICAgICAgICAgICBpZiAoc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoVmFsdWUuZnJvbShzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vdGhpbmcgaXMgZm91bmQgd2Ugc2hvdWxkIGFzayB0aGUgcGFyZW50IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQocmVxdWlyZVBhcmVudE5vZGUoc3RtdCksIHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8VmFsdWU+IHNvbHZlU3ltYm9sQXNWYWx1ZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisKKyAgICAgICAgLy8gaWYgd2UncmUgaW4gYSBtdWx0aXBsZSBWYXJpYWJsZSBkZWNsYXJhdGlvbiBsaW5lIChmb3IgZXg6IGRvdWJsZSBhPTAsIGI9YTspCisgICAgICAgIFN5bWJvbERlY2xhcmF0b3Igc3ltYm9sRGVjbGFyYXRvciA9IEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3Iod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gc3ltYm9sUmVmZXJlbmNlID0gc29sdmVXaXRoQXNWYWx1ZShzeW1ib2xEZWNsYXJhdG9yLCBuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgaWYgKHN5bWJvbFJlZmVyZW5jZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHNob3VsZCBsb29rIGluIGFsbCB0aGUgc3RhdGVtZW50cyBwcmVjZWRpbmcsIHRyZWF0aW5nIHRoZW0gYXMgU3ltYm9sRGVjbGFyYXRvcnMKKyAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpIGluc3RhbmNlb2YgTGFtYmRhRXhwcikgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpIGluc3RhbmNlb2YgSWZTdG10KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGlmICghKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIE5vZGVXaXRoU3RhdGVtZW50cykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgTm9kZVdpdGhTdGF0ZW1lbnRzPD8+IG5vZGVXaXRoU3RtdCA9IChOb2RlV2l0aFN0YXRlbWVudHM8Pz4pIHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKTsKKyAgICAgICAgaW50IHBvc2l0aW9uID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLmVxdWFscyh3cmFwcGVkTm9kZSkpIHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvc2l0aW9uID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBzeW1ib2xEZWNsYXJhdG9yID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihub2RlV2l0aFN0bXQuZ2V0U3RhdGVtZW50cygpLmdldChpKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBzeW1ib2xSZWZlcmVuY2UgPSBzb2x2ZVdpdGhBc1ZhbHVlKHN5bWJvbERlY2xhcmF0b3IsIG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHN5bWJvbFJlZmVyZW5jZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xSZWZlcmVuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kIHdlIHNob3VsZCBhc2sgdGhlIHBhcmVudCBjb250ZXh0CisgICAgICAgIENvbnRleHQgcGFyZW50Q29udGV4dCA9IGdldFBhcmVudCgpOworICAgICAgICByZXR1cm4gcGFyZW50Q29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbChTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisKKyAgICAgICAgLy8gaWYgd2UncmUgaW4gYSBtdWx0aXBsZSBWYXJpYWJsZSBkZWNsYXJhdGlvbiBsaW5lIChmb3IgZXg6IGRvdWJsZSBhPTAsIGI9YTspCisgICAgICAgIFN5bWJvbERlY2xhcmF0b3Igc3ltYm9sRGVjbGFyYXRvciA9IEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3Iod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc3ltYm9sUmVmZXJlbmNlID0gc29sdmVXaXRoKHN5bWJvbERlY2xhcmF0b3IsIG5hbWUpOworICAgICAgICBpZiAoc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeW1ib2xSZWZlcmVuY2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBzaG91bGQgbG9vayBpbiBhbGwgdGhlIHN0YXRlbWVudHMgcHJlY2VkaW5nLCB0cmVhdGluZyB0aGVtIGFzIFN5bWJvbERlY2xhcmF0b3JzCisgICAgICAgIGlmIChyZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpIGluc3RhbmNlb2YgTGFtYmRhRXhwcikgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGlmICghKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIE5vZGVXaXRoU3RhdGVtZW50cykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBOb2RlV2l0aFN0YXRlbWVudHM8Pz4gbm9kZVdpdGhTdG10ID0gKE5vZGVXaXRoU3RhdGVtZW50czw/PikgcmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpOworICAgICAgICBpbnQgcG9zaXRpb24gPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlV2l0aFN0bXQuZ2V0U3RhdGVtZW50cygpLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSkuZXF1YWxzKHdyYXBwZWROb2RlKSkgeworICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocG9zaXRpb24gPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIHN5bWJvbERlY2xhcmF0b3IgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIHN5bWJvbFJlZmVyZW5jZSA9IHNvbHZlV2l0aChzeW1ib2xEZWNsYXJhdG9yLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChzeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xSZWZlcmVuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBub3RoaW5nIGlzIGZvdW5kIHdlIHNob3VsZCBhc2sgdGhlIHBhcmVudCBjb250ZXh0CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHNvbHZlVHlwZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Td2l0Y2hFbnRyeUNvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvU3dpdGNoRW50cnlDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5NjcyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvU3dpdGNoRW50cnlDb250ZXh0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IucmVxdWlyZVBhcmVudE5vZGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBTd2l0Y2hFbnRyeUNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0PFN3aXRjaEVudHJ5U3RtdD4geworCisgICAgcHVibGljIFN3aXRjaEVudHJ5Q29udGV4dChTd2l0Y2hFbnRyeVN0bXQgd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBzdXBlcih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbChTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIFN3aXRjaFN0bXQgc3dpdGNoU3RtdCA9IChTd2l0Y2hTdG10KSByZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShzd2l0Y2hTdG10LmdldFNlbGVjdG9yKCkpOworICAgICAgICBpZiAodHlwZS5pc1JlZmVyZW5jZVR5cGUoKSAmJiB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpLmlzRW51bSgpKSB7CisgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZVR5cGVJbXBsKSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlVHlwZUltcGwgdHlwZVVzYWdlT2ZUeXBlRGVjbGFyYXRpb24gPSAoUmVmZXJlbmNlVHlwZUltcGwpIHR5cGU7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVVc2FnZU9mVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLmhhc0ZpZWxkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHR5cGVVc2FnZU9mVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEZpZWxkKG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbG9vayBmb3IgZGVjbGFyYXRpb24gaW4gb3RoZXIgc3dpdGNoIHN0YXRlbWVudHMKKyAgICAgICAgZm9yIChTd2l0Y2hFbnRyeVN0bXQgc2VTdG10IDogc3dpdGNoU3RtdC5nZXRFbnRyaWVzKCkpIHsKKyAgICAgICAgICAgIGlmICghc2VTdG10LmVxdWFscyh3cmFwcGVkTm9kZSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0YXRlbWVudCBzdG10IDogc2VTdG10LmdldFN0YXRlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTeW1ib2xEZWNsYXJhdG9yIHN5bWJvbERlY2xhcmF0b3IgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKHN0bXQsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc3ltYm9sUmVmZXJlbmNlID0gc29sdmVXaXRoKHN5bWJvbERlY2xhcmF0b3IsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xSZWZlcmVuY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBib29sZWFuIHN0YXRpY09ubHksIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL1RyeVdpdGhSZXNvdXJjZUNvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvVHJ5V2l0aFJlc291cmNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOTMyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL1RyeVdpdGhSZXNvdXJjZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IucmVxdWlyZVBhcmVudE5vZGU7CisKK3B1YmxpYyBjbGFzcyBUcnlXaXRoUmVzb3VyY2VDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dDxUcnlTdG10PiB7CisKKyAgICBwdWJsaWMgVHJ5V2l0aFJlc291cmNlQ29udGV4dChUcnlTdG10IHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxWYWx1ZT4gc29sdmVTeW1ib2xBc1ZhbHVlKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChFeHByZXNzaW9uIGV4cHIgOiB3cmFwcGVkTm9kZS5nZXRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgeworICAgICAgICAgICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdG9yIHYgOiAoKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKWV4cHIpLmdldFZhcmlhYmxlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2LmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBKYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24gZGVjbCA9IEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2LCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihWYWx1ZS5mcm9tKGRlY2wpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgaW5zdGFuY2VvZiBCbG9ja1N0bXQpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0ZW1lbnRDb250ZXh0LnNvbHZlSW5CbG9ja0FzVmFsdWUobmFtZSwgdHlwZVNvbHZlciwgd3JhcHBlZE5vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBmb3IgKEV4cHJlc3Npb24gZXhwciA6IHdyYXBwZWROb2RlLmdldFJlc291cmNlcygpKSB7CisgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB7CisgICAgICAgICAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0b3IgdiA6ICgoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpZXhwcikuZ2V0VmFyaWFibGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2LCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpIGluc3RhbmNlb2YgQmxvY2tTdG10KSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdGVtZW50Q29udGV4dC5zb2x2ZUluQmxvY2sobmFtZSwgdHlwZVNvbHZlciwgd3JhcHBlZE5vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGF0aWNPbmx5LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvRGVmYXVsdENvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0RlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmN2M3YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0RlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyByZXByZXNlbnRzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFkZGVkIGJ5IHRoZSBjb21waWxlciBmb3Igb2JqZWN0cyBub3QgZGVjbGFyaW5nIG9uZS4KKyAqIEl0IHRha2VzIG5vIHBhcmFtZXRlcnMuIFNlZSBKTFMgOC44LjkgZm9yIGRldGFpbHMuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK2NsYXNzIERlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb247CisKKyAgICBEZWZhdWx0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgeworICAgICAgICB0aGlzLmNsYXNzRGVjbGFyYXRpb24gPSBjbGFzc0RlY2xhcmF0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzRGVjbGFyYXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtcygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24gZ2V0UGFyYW0oaW50IGkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBoYXMgbm90IHBhcmFtZXRlcnMiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc0RlY2xhcmF0aW9uLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QVUJMSUM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0U3BlY2lmaWVkRXhjZXB0aW9uKGludCBpbmRleCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGRvZXMgbm90IHRocm93IGV4Y2VwdGlvbnMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9IZWxwZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGUxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9IZWxwZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitjbGFzcyBIZWxwZXIgeworCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NTcGVjaWZpZXIgdG9BY2Nlc3NMZXZlbChFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QUklWQVRFKSkgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUklWQVRFOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QUk9URUNURUQpKSB7CisgICAgICAgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLlBST1RFQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QVUJMSUM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLkRFRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNvbnRhaW5lck5hbWUoTm9kZSBjb250YWluZXIpIHsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoY29udGFpbmVyKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgiIiwgY29udGFpbmVyKTsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lICsKKyAgICAgICAgICAgICAgICAoKCFwYWNrYWdlTmFtZS5pc0VtcHR5KCkgJiYgIWNsYXNzTmFtZS5pc0VtcHR5KCkpID8gIi4iIDogIiIpICsKKyAgICAgICAgICAgICAgICBjbGFzc05hbWU7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShOb2RlIGNvbnRhaW5lcikgeworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7CisgICAgICAgICAgICBPcHRpb25hbDxQYWNrYWdlRGVjbGFyYXRpb24+IHAgPSAoKENvbXBpbGF0aW9uVW5pdCkgY29udGFpbmVyKS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChwLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHAuZ2V0KCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZShjb250YWluZXIuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBiYXNlLCBOb2RlIGNvbnRhaW5lcikgeworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgU3RyaW5nIGIgPSBnZXRDbGFzc05hbWUoYmFzZSwgY29udGFpbmVyLmdldFBhcmVudE5vZGUoKS5vckVsc2UobnVsbCkpOworICAgICAgICAgICAgU3RyaW5nIGNuID0gKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldE5hbWUoKS5nZXRJZCgpOworICAgICAgICAgICAgaWYgKGIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYiArICIuIiArIGNuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIFN0cmluZyBiID0gZ2V0Q2xhc3NOYW1lKGJhc2UsIGNvbnRhaW5lci5nZXRQYXJlbnROb2RlKCkub3JFbHNlKG51bGwpKTsKKyAgICAgICAgICAgIFN0cmluZyBjbiA9ICgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgIGlmIChiLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGIgKyAiLiIgKyBjbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzTmFtZShiYXNlLCBjb250YWluZXIuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmM2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZEFubm90YXRpb25EZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb24gd3JhcHBlZE5vZGU7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbihBbm5vdGF0aW9uRGVjbGFyYXRpb24gd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLndyYXBwZWROb2RlID0gd3JhcHBlZE5vZGU7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZ2V0QWxsRmllbGRzKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBIZWxwZXIuZ2V0UGFja2FnZU5hbWUod3JhcHBlZE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gSGVscGVyLmdldENsYXNzTmFtZSgiIiwgd3JhcHBlZE5vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIGNvbnRhaW5lck5hbWUgPSBIZWxwZXIuY29udGFpbmVyTmFtZSh3cmFwcGVkTm9kZS5nZXRQYXJlbnROb2RlKCkub3JFbHNlKG51bGwpKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyTmFtZSArICIuIiArIHdyYXBwZWROb2RlLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNvbnRhaW5lclR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiBnZXRBbm5vdGF0aW9uTWVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmdldE1lbWJlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKQorICAgICAgICAgICAgICAgIC5tYXAobSAtPiBuZXcgSmF2YVBhcnNlckFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKW0sIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTYwM2RhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlckFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiB3cmFwcGVkTm9kZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gZ2V0V3JhcHBlZE5vZGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YVBhcnNlckFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLndyYXBwZWROb2RlID0gd3JhcHBlZE5vZGU7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RGVmYXVsdFZhbHVlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmdldE5hbWVBc1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmNiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkFic3RyYWN0Q2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uIHJlcHJlc2VudGF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdENsYXNzRGVjbGFyYXRpb24geworCisgIHByaXZhdGUgZmluYWwgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICBwcml2YXRlIGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciB3cmFwcGVkTm9kZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBzdXBlclR5cGVEZWNsYXJhdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZSA9ICJBbm9ueW1vdXMtIiArIFVVSUQucmFuZG9tVVVJRCgpOworCisgIHB1YmxpYyBKYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihPYmplY3RDcmVhdGlvbkV4cHIgd3JhcHBlZE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIHRoaXMud3JhcHBlZE5vZGUgPSB3cmFwcGVkTm9kZTsKKyAgICBzdXBlclR5cGVEZWNsYXJhdGlvbiA9CisgICAgICAgIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zb2x2ZVR5cGUod3JhcHBlZE5vZGUuZ2V0VHlwZSgpLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgfQorCisgIHB1YmxpYyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBnZXRTdXBlclR5cGVEZWNsYXJhdGlvbigpIHsKKyAgICByZXR1cm4gc3VwZXJUeXBlRGVjbGFyYXRpb247CisgIH0KKworICBwdWJsaWMgPFQgZXh0ZW5kcyBOb2RlPiBMaXN0PFQ+IGZpbmRNZW1iZXJzT2ZLaW5kKGZpbmFsIENsYXNzPFQ+IG1lbWJlckNsYXNzKSB7CisgICAgaWYgKHdyYXBwZWROb2RlLmdldEFub255bW91c0NsYXNzQm9keSgpLmlzUHJlc2VudCgpKSB7CisgICAgICByZXR1cm4gd3JhcHBlZE5vZGUKKyAgICAgICAgICAgICAgLmdldEFub255bW91c0NsYXNzQm9keSgpCisgICAgICAgICAgICAgIC5nZXQoKQorICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgLmZpbHRlcihub2RlIC0+IG1lbWJlckNsYXNzLmlzQXNzaWduYWJsZUZyb20obm9kZS5nZXRDbGFzcygpKSkKKyAgICAgICAgICAgICAgLm1hcChtZW1iZXJDbGFzczo6Y2FzdCkKKyAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvYmplY3QoKSB7CisgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBnZXRTdXBlckNsYXNzKCkgeworICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCksIHR5cGVTb2x2ZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0SW50ZXJmYWNlcygpIHsKKyAgICByZXR1cm4KKyAgICAgICAgc3VwZXJUeXBlRGVjbGFyYXRpb24KKyAgICAgICAgICAgIC5hc1JlZmVyZW5jZVR5cGUoKS5nZXRBbmNlc3RvcnMoKQorICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAuZmlsdGVyKHR5cGUgLT4gdHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5pc0ludGVyZmFjZSgpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8UmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBnZXRDb25zdHJ1Y3RvcnMoKSB7CisgICAgcmV0dXJuCisgICAgICAgIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKQorICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAubWFwKGN0b3IgLT4gbmV3IEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMsIGN0b3IsIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUklWQVRFOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QW5jZXN0b3JzKCkgeworICAgIHJldHVybgorICAgICAgICBJbW11dGFibGVMaXN0LgorICAgICAgICAgICAgPFJlc29sdmVkUmVmZXJlbmNlVHlwZT5idWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGQoZ2V0U3VwZXJDbGFzcygpKQorICAgICAgICAgICAgLmFkZEFsbChzdXBlclR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKS5nZXRBbmNlc3RvcnMoKSkKKyAgICAgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZ2V0QWxsRmllbGRzKCkgeworCisgICAgTGlzdDxKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbj4gbXlGaWVsZHMgPQorICAgICAgICBmaW5kTWVtYmVyc09mS2luZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5jbGFzcykKKyAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgLmZsYXRNYXAoZmllbGQgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRWYXJpYWJsZXMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSAtPiBuZXcgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24odmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU29sdmVyKSkpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgIExpc3Q8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBzdXBlckNsYXNzRmllbGRzID0KKyAgICAgICAgZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpOworCisgICAgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGludGVyZmFjZUZpZWxkcyA9CisgICAgICAgIGdldEludGVyZmFjZXMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcChpbnRlZmFjZSAtPiBpbnRlZmFjZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKS5zdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICByZXR1cm4KKyAgICAgICAgSW1tdXRhYmxlTGlzdAorICAgICAgICAuPFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj5idWlsZGVyKCkKKyAgICAgICAgLmFkZEFsbChteUZpZWxkcykKKyAgICAgICAgLmFkZEFsbChzdXBlckNsYXNzRmllbGRzKQorICAgICAgICAuYWRkQWxsKGludGVyZmFjZUZpZWxkcykKKyAgICAgICAgLmJ1aWxkKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgcmV0dXJuCisgICAgICAgIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5jbGFzcykKKyAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgLm1hcChtZXRob2QgLT4gbmV3IEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBoYXNEaXJlY3RseUFubm90YXRpb24oU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICByZXR1cm4gSGVscGVyLmdldFBhY2thZ2VOYW1lKHdyYXBwZWROb2RlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICByZXR1cm4gSGVscGVyLmdldENsYXNzTmFtZSgiIiwgd3JhcHBlZE5vZGUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICBTdHJpbmcgY29udGFpbmVyTmFtZSA9IEhlbHBlci5jb250YWluZXJOYW1lKHdyYXBwZWROb2RlLmdldFBhcmVudE5vZGUoKS5vckVsc2UobnVsbCkpOworICAgIGlmIChjb250YWluZXJOYW1lLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNvbnRhaW5lck5hbWUgKyAiLiIgKyBnZXROYW1lKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGludGVybmFsVHlwZXMoKSB7CisgICAgcmV0dXJuCisgICAgICAgIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uY2xhc3MpCisgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgIC5tYXAodHlwZU1lbWJlciAtPiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24odHlwZU1lbWJlcikpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNvbnRhaW5lclR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjlmOTFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdENsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdENsYXNzRGVjbGFyYXRpb24geworCisgICAgLy8vCisgICAgLy8vIEZpZWxkcworICAgIC8vLworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHdyYXBwZWROb2RlOworICAgIHByaXZhdGUgSmF2YVBhcnNlclR5cGVBZGFwdGVyPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4gamF2YVBhcnNlclR5cGVBZGFwdGVyOworCisgICAgLy8vCisgICAgLy8vIENvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgcHVibGljIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gd3JhcHBlZE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW50ZXJmYWNlIGdpdmVuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICB0aGlzLmphdmFQYXJzZXJUeXBlQWRhcHRlciA9IG5ldyBKYXZhUGFyc2VyVHlwZUFkYXB0ZXI8Pih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFB1YmxpYyBtZXRob2RzOiBmcm9tIE9iamVjdAorICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gdGhhdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgbzsKKworICAgICAgICBpZiAoIXdyYXBwZWROb2RlLmVxdWFscyh0aGF0LndyYXBwZWROb2RlKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb257IiArCisgICAgICAgICAgICAgICAgIndyYXBwZWROb2RlPSIgKyB3cmFwcGVkTm9kZSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQdWJsaWMgbWV0aG9kczogZmllbGRzCisgICAgLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGZpZWxkcyA9IGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRGaWVsZHNGb3JEZWNsYXJlZFZhcmlhYmxlcygpOworICAgICAgICAKKyAgICAgICAgZ2V0QW5jZXN0b3JzKCkuZm9yRWFjaChhbmNlc3RvciAtPiBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKS5mb3JFYWNoKGYgLT4geworICAgICAgICAgICAgZmllbGRzLmFkZChuZXcgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uKCkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5hY2Nlc3NTcGVjaWZpZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9yLnVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKGYuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmLmlzU3RhdGljKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5kZWNsYXJpbmdUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0pKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorICAgIAorICAgIC8vLworICAgIC8vLyBQdWJsaWMgbWV0aG9kcworICAgIC8vLworCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtZXRlclR5cGVzKSB7CisgICAgICAgIENvbnRleHQgY3R4ID0gZ2V0Q29udGV4dCgpOworICAgICAgICByZXR1cm4gY3R4LnNvbHZlTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRVc2FnZShOb2RlIG5vZGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBnZXRTdXBlckNsYXNzKCkgeworICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRvUmVmZXJlbmNlVHlwZSh3cmFwcGVkTm9kZS5nZXRFeHRlbmRlZFR5cGVzKCkuZ2V0KDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0SW50ZXJmYWNlcygpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKENsYXNzT3JJbnRlcmZhY2VUeXBlIHQgOiB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZCh0b1JlZmVyZW5jZVR5cGUodCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZ2V0Q29uc3RydWN0b3JzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZGVjbGFyZWQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uPD8+IG1lbWJlciA6IHdyYXBwZWROb2RlLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgaWYgKG1lbWJlciBpbnN0YW5jZW9mIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgbWVtYmVyOworICAgICAgICAgICAgICAgIGRlY2xhcmVkLmFkZChuZXcgSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24odGhpcywgY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZWNsYXJlZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjb25zdHJ1Y3RvcnMgaW5zZXJ0IHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihuZXcgRGVmYXVsdENvbnN0cnVjdG9yRGVjbGFyYXRpb24odGhpcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmVkOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvbkV4cHIgOiB3cmFwcGVkTm9kZS5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuaXNJbnRlcmZhY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFBhY2thZ2VOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0Q2xhc3NOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KG90aGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNhbkJlQXNzaWduZWRUbyhSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGdlbmVyaWMgdHlwZXMKKyAgICAgICAgaWYgKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gc3VwZXJjbGFzcyA9IChSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24pIGdldFN1cGVyQ2xhc3MoKS5nZXRUeXBlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW4gY2FzZSBvZiBPYmplY3QgaGF2aW5nIE9iamVjdCBhcyBhbmNlc3RvcgorICAgICAgICAgICAgaWYgKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKHN1cGVyY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1cGVyY2xhc3MuY2FuQmVBc3NpZ25lZFRvKG90aGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMud3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZSA6IHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGFuY2VzdG9yID0gKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlVHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3IuY2FuQmVBc3NpZ25lZFRvKG90aGVyKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodGhpcy53cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHRoaXMpOworICAgICAgICB9CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gamF2YVBhcnNlclR5cGVBZGFwdGVyLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IHdyYXBwZWROb2RlLmdldE5hbWUoKSArICIuIjsKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpICYmIG5hbWUubGVuZ3RoKCkgPiBwcmVmaXgubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24odGhpcy53cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSksIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldENvbnRleHQoKS5nZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAvLyBXZSB3YW50IHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIE9iamVjdCBoYXZpbmcgT2JqZWN0IGFzIGFuY2VzdG9yCisgICAgICAgIGlmICghKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGdldFF1YWxpZmllZE5hbWUoKSkpKSB7CisgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3VwZXJjbGFzcyA9IGdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHN1cGVyY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChDbGFzc09ySW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRlZCA6IHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgPSB0b1JlZmVyZW5jZVR5cGUoaW1wbGVtZW50ZWQpOworICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKGFuY2VzdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5jZXN0b3JzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRNZXRob2RzKCkgeworICAgICAgICBTZXQ8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogd3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpKSB7CisgICAgICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQobmV3IEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uKSBtZW1iZXIsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKAorICAgICAgICAgICAgICAgICh0cCkgLT4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKHRwLCB0eXBlU29sdmVyKQorICAgICAgICApLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YVBhcnNlciBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZpc2l0YWJsZSBKYXZhUGFyc2VyIG5vZGUgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBnZXRXcmFwcGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICByZXR1cm4gSGVscGVyLnRvQWNjZXNzTGV2ZWwod3JhcHBlZE5vZGUuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQcm90ZWN0ZWQgbWV0aG9kcworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvYmplY3QoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGludGVybmFsVHlwZXMoKSB7CisgICAgICAgIFNldDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiB0aGlzLndyYXBwZWROb2RlLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgaWYgKG1lbWJlciBpbnN0YW5jZW9mIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXMuYWRkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbiltZW1iZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlQWRhcHRlci5jb250YWluZXJUeXBlKCk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFByaXZhdGUgbWV0aG9kcworICAgIC8vLworCisgICAgcHJpdmF0ZSBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgdG9SZWZlcmVuY2VUeXBlKENsYXNzT3JJbnRlcmZhY2VUeXBlIGNsYXNzT3JJbnRlcmZhY2VUeXBlKSB7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICAgICAgaWYgKGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBxdWFsaWZpZWQgbmFtZSAoZm9yIGV4YW1wbGUgY2xhc3Mgb2YgdHlwZSBSZWN0YW5nbGUyRC5Eb3VibGUpCisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpLmdldCgpLnRvU3RyaW5nKCkgKyAiLiIgKyBjbGFzc05hbWU7CisgICAgICAgIH0KKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBzb2x2ZVR5cGUoY2xhc3NOYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgaWYgKCFyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgT3B0aW9uYWw8Q2xhc3NPckludGVyZmFjZVR5cGU+IGxvY2FsU2NvcGUgPSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpOworICAgICAgICAgICAgaWYgKGxvY2FsU2NvcGUuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbG9jYWxTY29wZS5nZXQoKS5nZXROYW1lKCkuZ2V0SWQoKSArICIuIiArIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIHJlZiA9IHNvbHZlVHlwZShsb2NhbE5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzUmVmZXJlbmNlVHlwZSgpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gc3VwZXJDbGFzc1R5cGVQYXJhbWV0ZXJzID0gY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpCisgICAgICAgICAgICAgICAgLnN0cmVhbSgpLm1hcCh0YSAtPiBuZXcgTGF6eVR5cGUodiAtPiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHRhLCB0YSkpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1JlZmVyZW5jZVR5cGUoKSwgc3VwZXJDbGFzc1R5cGVQYXJhbWV0ZXJzLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTUwMGZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb247CisgICAgcHJpdmF0ZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB3cmFwcGVkTm9kZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB3cmFwcGVkTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy5jbGFzc0RlY2xhcmF0aW9uID0gY2xhc3NEZWNsYXJhdGlvbjsKKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzRGVjbGFyYXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpLnNpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBnZXRQYXJhbShpbnQgaSkgeworICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBnZXROdW1iZXJPZlBhcmFtcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vIHBhcmFtIHdpdGggaW5kZXggJWQuIE51bWJlciBvZiBwYXJhbXM6ICVkIiwgaSwgZ2V0TnVtYmVyT2ZQYXJhbXMoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSmF2YVBhcnNlclBhcmFtZXRlckRlY2xhcmF0aW9uKHdyYXBwZWROb2RlLmdldFBhcmFtZXRlcnMoKS5nZXQoaSksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NEZWNsYXJhdGlvbi5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YVBhcnNlciBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZpc2l0YWJsZSBKYXZhUGFyc2VyIG5vZGUgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gZ2V0V3JhcHBlZE5vZGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBIZWxwZXIudG9BY2Nlc3NMZXZlbCh3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCgoYXN0VHApIC0+IG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcihhc3RUcCwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXRUaHJvd25FeGNlcHRpb25zKCkuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0U3BlY2lmaWVkRXhjZXB0aW9uKGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGdldE51bWJlck9mU3BlY2lmaWVkRXhjZXB0aW9ucygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vIGV4Y2VwdGlvbiB3aXRoIGluZGV4ICVkLiBOdW1iZXIgb2YgZXhjZXB0aW9uczogJWQiLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAuY29udmVydCh3cmFwcGVkTm9kZS5nZXRUaHJvd25FeGNlcHRpb25zKCkuZ2V0KGluZGV4KSwgd3JhcHBlZE5vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5MDk1OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJFbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlckVudW1Db25zdGFudERlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbiB3cmFwcGVkTm9kZTsKKworICAgIHB1YmxpYyBKYXZhUGFyc2VyRW51bUNvbnN0YW50RGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbigoRW51bURlY2xhcmF0aW9uKSByZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSksIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhUGFyc2VyIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YVBhcnNlckVudW1Db25zdGFudERlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZpc2l0YWJsZSBKYXZhUGFyc2VyIG5vZGUgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uIGdldFdyYXBwZWROb2RlKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4YzA2MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZEFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbi5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24gd3JhcHBlZE5vZGU7CisgICAgcHJpdmF0ZSBKYXZhUGFyc2VyVHlwZUFkYXB0ZXI8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbj4gamF2YVBhcnNlclR5cGVBZGFwdGVyOworCisgICAgcHVibGljIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiB3cmFwcGVkTm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHRoaXMud3JhcHBlZE5vZGUgPSB3cmFwcGVkTm9kZTsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5qYXZhUGFyc2VyVHlwZUFkYXB0ZXIgPSBuZXcgSmF2YVBhcnNlclR5cGVBZGFwdGVyPD4od3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbnsiICsKKyAgICAgICAgICAgICAgICAid3JhcHBlZE5vZGU9IiArIHdyYXBwZWROb2RlICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiB3cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChuZXcgSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlciwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2RzOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0RpcmVjdGx5QW5ub3RhdGlvbihTdHJpbmcgY2Fub25pY2FsTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5CZUFzc2lnbmVkVG8oUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgU3RyaW5nIG90aGVyTmFtZSA9IG90aGVyLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgLy8gRW51bXMgY2Fubm90IGJlIGV4dGVuZGVkCisgICAgICAgIGlmIChvdGhlck5hbWUuZXF1YWxzKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyTmFtZS5lcXVhbHMoRW51bS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBFbnVtIGltcGxlbWVudHMgQ29tcGFyYWJsZSBhbmQgU2VyaWFsaXphYmxlCisgICAgICAgIGlmIChvdGhlck5hbWUuZXF1YWxzKENvbXBhcmFibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyTmFtZS5lcXVhbHMoU2VyaWFsaXphYmxlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvdGhlck5hbWUuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRQYWNrYWdlTmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldENsYXNzTmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeShvdGhlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeSh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIHRoYXQgPSAoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgbzsKKworICAgICAgICBpZiAoIXdyYXBwZWROb2RlLmVxdWFscyh0aGF0LndyYXBwZWROb2RlKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBzb2x2ZU1ldGhvZEFzVXNhZ2UoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQsIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVyVmFsdWVzKSB7CisgICAgICAgIGlmIChuYW1lLmVxdWFscygidmFsdWVzIikgJiYgcGFyYW1ldGVyVHlwZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobmV3IFZhbHVlc01ldGhvZCh0aGlzLCB0eXBlU29sdmVyKS5nZXRVc2FnZShudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBhZGQgbWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBFbnVtCisgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIHBhcmFtZXRlclR5cGVzLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGZpZWxkcyA9IGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRGaWVsZHNGb3JEZWNsYXJlZFZhcmlhYmxlcygpOworCisgICAgICAgIGlmICh0aGlzLndyYXBwZWROb2RlLmdldEVudHJpZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEVudW1Db25zdGFudERlY2xhcmF0aW9uIG1lbWJlciA6IHRoaXMud3JhcHBlZE5vZGUuZ2V0RW50cmllcygpKSB7CisgICAgICAgICAgICAgICAgZmllbGRzLmFkZChuZXcgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24obWVtYmVyLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QW5jZXN0b3JzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBlbnVtQ2xhc3MgPSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoRW51bS5jbGFzcywgdHlwZVNvbHZlcikuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGVUeXBlUGFyYW1ldGVyID0gZW51bUNsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApOworICAgICAgICBlbnVtQ2xhc3MgPSBlbnVtQ2xhc3MuZGVyaXZlVHlwZVBhcmFtZXRlcnMobmV3IFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAuQnVpbGRlcigpLnNldFZhbHVlKGVUeXBlUGFyYW1ldGVyLCBuZXcgUmVmZXJlbmNlVHlwZUltcGwodGhpcywgdHlwZVNvbHZlcikpLmJ1aWxkKCkpOworICAgICAgICBhbmNlc3RvcnMuYWRkKGVudW1DbGFzcyk7CisgICAgICAgIGlmICh3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChDbGFzc09ySW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRlZFR5cGUgOiB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IGltcGxlbWVudGVkRGVjbFJlZiA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVUeXBlSW5UeXBlKHRoaXMsIGltcGxlbWVudGVkVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbXBsZW1lbnRlZERlY2xSZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oaW1wbGVtZW50ZWRUeXBlLmdldE5hbWUoKS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChuZXcgUmVmZXJlbmNlVHlwZUltcGwoKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSBpbXBsZW1lbnRlZERlY2xSZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5jZXN0b3JzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmFQYXJzZXIgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZpc2l0YWJsZSBKYXZhUGFyc2VyIG5vZGUgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiBnZXRXcmFwcGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGdldEVudW1Db25zdGFudHMoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXRFbnRyaWVzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKGVudHJ5IC0+IG5ldyBKYXZhUGFyc2VyRW51bUNvbnN0YW50RGVjbGFyYXRpb24oZW50cnksIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8vIE5lZWRlZCBieSBDb250ZXh0SGVscGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWx1ZXNNZXRob2QgaW1wbGVtZW50cyBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIHsKKworICAgICAgICBwcml2YXRlIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uOworICAgICAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgICAgICBwdWJsaWMgVmFsdWVzTWV0aG9kKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgICAgIHRoaXMuZW51bURlY2xhcmF0aW9uID0gZW51bURlY2xhcmF0aW9uOworICAgICAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnVtRGVjbGFyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEFycmF5VHlwZShuZXcgUmVmZXJlbmNlVHlwZUltcGwoZW51bURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIGdldFBhcmFtKGludCBpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRob2RVc2FnZSBnZXRVc2FnZShOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1ldGhvZFVzYWdlIHJlc29sdmVUeXBlVmFyaWFibGVzKENvbnRleHQgY29udGV4dCwgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtZXRlclR5cGVzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJ2YWx1ZXMiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgICAgIHJldHVybiBIZWxwZXIudG9BY2Nlc3NMZXZlbChlbnVtRGVjbGFyYXRpb24uZ2V0V3JhcHBlZE5vZGUoKS5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFNwZWNpZmllZEV4Y2VwdGlvbihpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHZhbHVlcyBtZXRob2Qgb2YgYW4gZW51bSBkb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gaW50ZXJuYWxUeXBlcygpIHsKKyAgICAgICAgU2V0PFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiByZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uPD8+IG1lbWJlciA6IHRoaXMud3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpKSB7CisgICAgICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgIHJlcy5hZGQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uKW1lbWJlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmNvbnRhaW5lclR5cGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzllMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IucmVxdWlyZVBhcmVudE5vZGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3I7CisgICAgcHJpdmF0ZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbiB3cmFwcGVkTm9kZTsKKyAgICBwcml2YXRlIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIEphdmFQYXJzZXJGaWVsZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodHlwZVNvbHZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0eXBlU29sdmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMudmFyaWFibGVEZWNsYXJhdG9yID0gdmFyaWFibGVEZWNsYXJhdG9yOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICBpZiAoIShyZXF1aXJlUGFyZW50Tm9kZSh2YXJpYWJsZURlY2xhcmF0b3IpIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHJlcXVpcmVQYXJlbnROb2RlKHZhcmlhYmxlRGVjbGFyYXRvcikuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMud3JhcHBlZE5vZGUgPSAoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24pIHJlcXVpcmVQYXJlbnROb2RlKHZhcmlhYmxlRGVjbGFyYXRvcik7CisgICAgfQorCisgICAgcHVibGljIEphdmFQYXJzZXJGaWVsZERlY2xhcmF0aW9uKEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKHR5cGVTb2x2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidHlwZVNvbHZlciBzaG91bGQgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmVudW1Db25zdGFudERlY2xhcmF0aW9uID0gZW51bUNvbnN0YW50RGVjbGFyYXRpb247CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKCkgeworICAgICAgICBpZiAoZW51bUNvbnN0YW50RGVjbGFyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gPSAoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbikgcmVxdWlyZVBhcmVudE5vZGUoZW51bUNvbnN0YW50RGVjbGFyYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbihlbnVtRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh2YXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpLCB3cmFwcGVkTm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICBpZiAoZW51bUNvbnN0YW50RGVjbGFyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhUGFyc2VyIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmlzaXRhYmxlIEphdmFQYXJzZXIgbm9kZSB3cmFwcGVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbiBnZXRXcmFwcGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSlBGaWVsZHsiICsgZ2V0TmFtZSgpICsgIn0iOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICByZXR1cm4gSGVscGVyLnRvQWNjZXNzTGV2ZWwod3JhcHBlZE5vZGUuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKCkgeworICAgICAgICBPcHRpb25hbDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPiB0eXBlRGVjbGFyYXRpb24gPSB3cmFwcGVkTm9kZS5maW5kUGFyZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbi5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5NTVhMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB3cmFwcGVkTm9kZTsKKyAgICBwcml2YXRlIEphdmFQYXJzZXJUeXBlQWRhcHRlcjxDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24+IGphdmFQYXJzZXJUeXBlQWRhcHRlcjsKKworICAgIHB1YmxpYyBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24oQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKCF3cmFwcGVkTm9kZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICB0aGlzLmphdmFQYXJzZXJUeXBlQWRhcHRlciA9IG5ldyBKYXZhUGFyc2VyVHlwZUFkYXB0ZXI8Pih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiB3cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChuZXcgSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlciwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2RzOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFVzYWdlKE5vZGUgbm9kZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gdGhhdCA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIG87CisKKyAgICAgICAgaWYgKCF3cmFwcGVkTm9kZS5lcXVhbHModGhhdC53cmFwcGVkTm9kZSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiBhc0ludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvbkV4cHIgOiB3cmFwcGVkTm9kZS5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEludGVyZmFjZXNFeHRlbmRlZCgpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKENsYXNzT3JJbnRlcmZhY2VUeXBlIHQgOiB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChuZXcgUmVmZXJlbmNlVHlwZUltcGwoc29sdmVUeXBlKHQuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzSW50ZXJmYWNlKCksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50ZXJmYWNlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFBhY2thZ2VOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0Q2xhc3NOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KG90aGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNhbkJlQXNzaWduZWRUbyhSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGdlbmVyaWMgdHlwZXMKKyAgICAgICAgaWYgKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy53cmFwcGVkTm9kZS5nZXRFeHRlbmRlZFR5cGVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlIDogd3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gYW5jZXN0b3IgPSAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVUeXBlKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLndyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKENsYXNzT3JJbnRlcmZhY2VUeXBlIHR5cGUgOiB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBhbmNlc3RvciA9IChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVR5cGUodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yLmNhbkJlQXNzaWduZWRUbyhvdGhlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZ2V0QWxsRmllbGRzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZmllbGRzID0gamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldEZpZWxkc0ZvckRlY2xhcmVkVmFyaWFibGVzKCk7CisgICAgICAgIAorICAgICAgICBnZXRBbmNlc3RvcnMoKS5mb3JFYWNoKGFuY2VzdG9yIC0+IGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpLmZvckVhY2goZiAtPiB7CisgICAgICAgICAgICBmaWVsZHMuYWRkKG5ldyBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmLmFjY2Vzc1NwZWNpZmllcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3IudXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUoZi5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYuaXNTdGF0aWMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmLmRlY2xhcmluZ1R5cGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSkpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9ueyIgKworICAgICAgICAgICAgICAgICJ3cmFwcGVkTm9kZT0iICsgd3JhcHBlZE5vZGUgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHNvbHZlVHlwZShTdHJpbmcgbmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICh0aGlzLndyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZWY7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JhcHBlZE5vZGUuZ2V0TmFtZSgpICsgIi4iOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKHByZWZpeCkgJiYgbmFtZS5sZW5ndGgoKSA+IHByZWZpeC5sZW5ndGgoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24odGhpcy53cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSksIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldENvbnRleHQoKS5nZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaWYgKHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKENsYXNzT3JJbnRlcmZhY2VUeXBlIGV4dGVuZGVkIDogd3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmFkZCh0b1JlZmVyZW5jZVR5cGUoZXh0ZW5kZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAod3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoQ2xhc3NPckludGVyZmFjZVR5cGUgaW1wbGVtZW50ZWQgOiB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHRvUmVmZXJlbmNlVHlwZShpbXBsZW1lbnRlZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmNlc3RvcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBpZiAodGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKAorICAgICAgICAgICAgICAgICAgICAodHApIC0+IG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcih0cCwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmFQYXJzZXIgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmlzaXRhYmxlIEphdmFQYXJzZXIgbm9kZSB3cmFwcGVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZ2V0V3JhcHBlZE5vZGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIEhlbHBlci50b0FjY2Vzc0xldmVsKHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBpbnRlcm5hbFR5cGVzKCkgeworICAgICAgICBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IHJlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogdGhpcy53cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgcmVzLmFkZChKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pbWVtYmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGNvbnRhaW5lclR5cGUoKSB7CisgICAgICAgIHJldHVybiBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuY29udGFpbmVyVHlwZSgpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQcml2YXRlIG1ldGhvZHMKKyAgICAvLy8KKworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHRvUmVmZXJlbmNlVHlwZShDbGFzc09ySW50ZXJmYWNlVHlwZSBjbGFzc09ySW50ZXJmYWNlVHlwZSkgeworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBudWxsOworICAgICAgICBpZiAoY2xhc3NPckludGVyZmFjZVR5cGUudG9TdHJpbmcoKS5pbmRleE9mKCcuJykgPiAtMSkgeworICAgICAgICAgICAgcmVmID0gdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShjbGFzc09ySW50ZXJmYWNlVHlwZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVmID09IG51bGwgfHwgIXJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICByZWYgPSBzb2x2ZVR5cGUoY2xhc3NPckludGVyZmFjZVR5cGUudG9TdHJpbmcoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgcmVmID0gc29sdmVUeXBlKGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpLmdldElkKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1JlZmVyZW5jZVR5cGUoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHN1cGVyQ2xhc3NUeXBlUGFyYW1ldGVycyA9IGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKQorICAgICAgICAgICAgICAgIC5zdHJlYW0oKS5tYXAodGEgLT4gbmV3IExhenlUeXBlKHYgLT4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh0YSwgdGEpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNSZWZlcmVuY2VUeXBlKCksIHN1cGVyQ2xhc3NUeXBlUGFyYW1ldGVycywgdHlwZVNvbHZlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNjYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9uczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5kZWNsYXJhdGlvbnMuY29tbW9uLk1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbiB3cmFwcGVkTm9kZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9ueyIgKworICAgICAgICAgICAgICAgICJ3cmFwcGVkTm9kZT0iICsgd3JhcHBlZE5vZGUgKworICAgICAgICAgICAgICAgICIsIHR5cGVTb2x2ZXI9IiArIHR5cGVTb2x2ZXIgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSgpIHsKKyAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIE9iamVjdENyZWF0aW9uRXhwcikgeworICAgICAgICAgICAgT2JqZWN0Q3JlYXRpb25FeHByIHBhcmVudE5vZGUgPSAoT2JqZWN0Q3JlYXRpb25FeHByKSByZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKHBhcmVudE5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihyZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQod3JhcHBlZE5vZGUuZ2V0VHlwZSgpLCBnZXRDb250ZXh0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQYXJhbXMoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIGdldFBhcmFtKGludCBpKSB7CisgICAgICAgIGlmIChpIDwgMCB8fCBpID49IGdldE51bWJlck9mUGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm8gcGFyYW0gd2l0aCBpbmRleCAlZC4gTnVtYmVyIG9mIHBhcmFtczogJWQiLCBpLCBnZXROdW1iZXJPZlBhcmFtcygpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VyUGFyYW1ldGVyRGVjbGFyYXRpb24od3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpLmdldChpKSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFVzYWdlIGdldFVzYWdlKE5vZGUgbm9kZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kVXNhZ2UgcmVzb2x2ZVR5cGVWYXJpYWJsZXMoQ29udGV4dCBjb250ZXh0LCBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljKHRoaXMsIHR5cGVTb2x2ZXIpLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbnRleHQsIHBhcmFtZXRlclR5cGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisgICAgICAgIHJldHVybiAhd3JhcHBlZE5vZGUuZ2V0Qm9keSgpLmlzUHJlc2VudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAoKGFzdFRwKSAtPiBuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIoYXN0VHAsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmlzRGVmYXVsdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuaXNTdGF0aWMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhUGFyc2VyIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZpc2l0YWJsZSBKYXZhUGFyc2VyIG5vZGUgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uIGdldFdyYXBwZWROb2RlKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBIZWxwZXIudG9BY2Nlc3NMZXZlbCh3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXRUaHJvd25FeGNlcHRpb25zKCkuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0U3BlY2lmaWVkRXhjZXB0aW9uKGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGdldE51bWJlck9mU3BlY2lmaWVkRXhjZXB0aW9ucygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vIGV4Y2VwdGlvbiB3aXRoIGluZGV4ICVkLiBOdW1iZXIgb2YgZXhjZXB0aW9uczogJWQiLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh3cmFwcGVkTm9kZS5nZXRUaHJvd25FeGNlcHRpb25zKCkKKyAgICAgICAgICAgICAgICAuZ2V0KGluZGV4KSwgd3JhcHBlZE5vZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlclBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhN2QzMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZEFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5MYW1iZGFFeHByQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyUGFyYW1ldGVyRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgUGFyYW1ldGVyIHdyYXBwZWROb2RlOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIEphdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbihQYXJhbWV0ZXIgd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLndyYXBwZWROb2RlID0gd3JhcHBlZE5vZGU7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhZGljKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuaXNWYXJBcmdzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIGlmICh3cmFwcGVkTm9kZS5nZXRUeXBlKCkgaW5zdGFuY2VvZiBVbmtub3duVHlwZSAmJiBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKSBpbnN0YW5jZW9mIExhbWJkYUV4cHJDb250ZXh0KSB7CisgICAgICAgICAgICBPcHRpb25hbDxWYWx1ZT4gdmFsdWUgPSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKS5zb2x2ZVN5bWJvbEFzVmFsdWUod3JhcHBlZE5vZGUuZ2V0TmFtZUFzU3RyaW5nKCksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHZhbHVlLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldCgpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSZXNvbHZlZFR5cGUgcmVzID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh3cmFwcGVkTm9kZS5nZXRUeXBlKCksIHdyYXBwZWROb2RlKTsKKyAgICAgICAgaWYgKGlzVmFyaWFkaWMoKSkgeworICAgICAgICAgICAgcmVzID0gbmV3IFJlc29sdmVkQXJyYXlUeXBlKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBhc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YVBhcnNlciBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEphdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSB2aXNpdGFibGUgSmF2YVBhcnNlciBub2RlIHdyYXBwZWQgYnkgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlciBnZXRXcmFwcGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjFmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBOb2RlIHdyYXBwZWROb2RlOworICAgIHByaXZhdGUgYm9vbGVhbiBmaWVsZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyOworICAgIHByaXZhdGUgYm9vbGVhbiB2YXJpYWJsZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHByaXZhdGUgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uKE5vZGUgd3JhcHBlZE5vZGUsIFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIGJvb2xlYW4gZmllbGQsIGJvb2xlYW4gcGFyYW1ldGVyLCBib29sZWFuIHZhcmlhYmxlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMud3JhcHBlZE5vZGUgPSB3cmFwcGVkTm9kZTsKKyAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CisgICAgICAgIHRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24gZmllbGQoVmFyaWFibGVEZWNsYXJhdG9yIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBKYXZhUGFyc2VyUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbihwYXJhbWV0ZXIsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uIGxvY2FsVmFyKFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbih2YXJpYWJsZURlY2xhcmF0b3IsIHZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlciwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQYXJhbVBvcyhQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHJlcXVpcmVQYXJlbnROb2RlKHBhcmFtZXRlcikuZ2V0Q2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBwYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQYXJhbVBvcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGwgPSAoTWV0aG9kQ2FsbEV4cHIpIHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsLmdldEFyZ3VtZW50cygpLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbGwuZ2V0QXJndW1lbnRzKCkuZ2V0KGkpID09IG5vZGUpIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbnsiICsKKyAgICAgICAgICAgICAgICAibmFtZT0nIiArIG5hbWUgKyAnXCcnICsKKyAgICAgICAgICAgICAgICAiLCB3cmFwcGVkTm9kZT0iICsgd3JhcHBlZE5vZGUgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIGlmICh3cmFwcGVkTm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlcikgeworICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIHdyYXBwZWROb2RlOworICAgICAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIExhbWJkYUV4cHIpIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gZ2V0UGFyYW1Qb3MocGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgbGFtYmRhVHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUocmVxdWlyZVBhcmVudE5vZGUod3JhcHBlZE5vZGUpKTsKKworICAgICAgICAgICAgICAgIC8vIFRPRE8gdW5kZXJzdGFuZCBmcm9tIHRoZSBjb250ZXh0IHRvIHdoaWNoIG1ldGhvZCB0aGlzIGNvcnJlc3BvbmRzCisgICAgICAgICAgICAgICAgLy9NZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldE1ldGhvZENhbGxlZAorICAgICAgICAgICAgICAgIC8vTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kQ2FsbGVkID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmUoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih3cmFwcGVkTm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc29sdmVkVHlwZSByYXdUeXBlOworICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuZ2V0VHlwZSgpIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmF3VHlwZSA9IFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ieU5hbWUoKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZSkgcGFyYW1ldGVyLmdldFR5cGUoKSkuZ2V0VHlwZSgpLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmF3VHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnRUb1VzYWdlKHBhcmFtZXRlci5nZXRUeXBlKCksIHdyYXBwZWROb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5pc1ZhckFyZ3MoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkQXJyYXlUeXBlKHJhd1R5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF3VHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkTm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRvcikgeworICAgICAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlRGVjbGFyYXRvciA9IChWYXJpYWJsZURlY2xhcmF0b3IpIHdyYXBwZWROb2RlOworICAgICAgICAgICAgaWYgKHJlcXVpcmVQYXJlbnROb2RlKHdyYXBwZWROb2RlKSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQodmFyaWFibGVEZWNsYXJhdG9yLmdldFR5cGUoKSwgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQodmFyaWFibGVEZWNsYXJhdG9yLmdldFR5cGUoKSwgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih3cmFwcGVkTm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIGFzVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiOiB3cmFwcGluZyAiICsgdGhpcy5nZXRXcmFwcGVkTm9kZSgpLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhUGFyc2VyIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHZpc2l0YWJsZSBKYXZhUGFyc2VyIG5vZGUgd3JhcHBlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZSBnZXRXcmFwcGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJUeXBlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ODA4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlclR5cGVBZGFwdGVyPFQgZXh0ZW5kcyBOb2RlICYgTm9kZVdpdGhTaW1wbGVOYW1lPFQ+ICYgTm9kZVdpdGhNZW1iZXJzPFQ+PiB7CisKKyAgICBwcml2YXRlIFQgd3JhcHBlZE5vZGU7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgSmF2YVBhcnNlclR5cGVBZGFwdGVyKFQgd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLndyYXBwZWROb2RlID0gd3JhcHBlZE5vZGU7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5nZXRQYWNrYWdlTmFtZSh3cmFwcGVkTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBIZWxwZXIuZ2V0Q2xhc3NOYW1lKCIiLCB3cmFwcGVkTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgeworICAgICAgICBTdHJpbmcgY29udGFpbmVyTmFtZSA9IEhlbHBlci5jb250YWluZXJOYW1lKGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyTmFtZSArICIuIiArIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGFuY2VzdG9yc09mT3RoZXIgPSBvdGhlci5nZXRBbGxBbmNlc3RvcnMoKTsKKyAgICAgICAgYW5jZXN0b3JzT2ZPdGhlci5hZGQobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG90aGVyLCB0eXBlU29sdmVyKSk7CisgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yT2ZPdGhlciA6IGFuY2VzdG9yc09mT3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChhbmNlc3Rvck9mT3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlciA9IHR5cGVTb2x2ZXIuc29sdmVUeXBlKHR5cGUuZGVzY3JpYmUoKSk7CisgICAgICAgICAgICByZXR1cm4gaXNBc3NpZ25hYmxlQnkob3RoZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZih3cmFwcGVkTm9kZSBpbnN0YW5jZW9mIE5vZGVXaXRoVHlwZVBhcmFtZXRlcnM8Pz4pIHsKKyAgICAgICAgICAgIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gKChOb2RlV2l0aFR5cGVQYXJhbWV0ZXJzPD8+KSB3cmFwcGVkTm9kZSkuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA6IHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24odHlwZVBhcmFtZXRlciwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEludGVybmFsIGNsYXNzZXMKKyAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogdGhpcy53cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PiBpbnRlcm5hbFR5cGUgPSAoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PikgbWVtYmVyOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpICsgIi4iOworICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZXJuYWxUeXBlIGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbikgaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKHByZWZpeCkgJiYgbmFtZS5sZW5ndGgoKSA+IHByZWZpeC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxUeXBlIGluc3RhbmNlb2YgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBpbnRlcm5hbFR5cGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShuYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlcm5hbFR5cGUgaW5zdGFuY2VvZiBFbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlVHlwZUluVHlwZShuZXcgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbikgaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKSwgbmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGNvbnRhaW5lclR5cGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZQorICAgICAgICAgICAgICAgIC5nZXRQYXJlbnROb2RlKCkKKyAgICAgICAgICAgICAgICAubWFwKG5vZGUgLT4gSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24obm9kZSwgdHlwZVNvbHZlcikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEZpZWxkc0ZvckRlY2xhcmVkVmFyaWFibGVzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZmllbGRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGlmICh3cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogdGhpcy53cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24gZmllbGQgPSAoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24pIG1lbWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0b3IgdmQgOiBmaWVsZC5nZXRWYXJpYWJsZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLmFkZChuZXcgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24odmQsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJUeXBlUGFyYW1ldGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZVBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLnJlcXVpcmVQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIgd3JhcHBlZE5vZGU7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIgd3JhcHBlZE5vZGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLndyYXBwZWROb2RlID0gd3JhcHBlZE5vZGU7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgICByZXR1cm4gZ2V0Q29udGV4dCgpLnNvbHZlTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIgdGhhdCA9IChKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcikgbzsKKworICAgICAgICBpZiAod3JhcHBlZE5vZGUgIT0gbnVsbCA/ICF3cmFwcGVkTm9kZS5lcXVhbHModGhhdC53cmFwcGVkTm9kZSkgOiB0aGF0LndyYXBwZWROb2RlICE9IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gd3JhcHBlZE5vZGUgIT0gbnVsbCA/IHdyYXBwZWROb2RlLmhhc2hDb2RlKCkgOiAwOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICh0eXBlU29sdmVyICE9IG51bGwgPyB0eXBlU29sdmVyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgICAgICByZXR1cm4gaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG90aGVyLCB0eXBlU29sdmVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lKCkgeworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0cml6YWJsZSBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXJJZCgpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pIGNvbnRhaW5lcikuZ2V0SWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBKYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGNvbnRhaW5lcikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24pIGNvbnRhaW5lcikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSByZXF1aXJlUGFyZW50Tm9kZSh3cmFwcGVkTm9kZSk7CisgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBqcFR5cGVEZWNsYXJhdGlvbiA9IChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBwYXJlbnROb2RlOworICAgICAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbihqcFR5cGVEZWNsYXJhdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKXsKKyAgICAgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIGpwQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgcGFyZW50Tm9kZTsKKyAgICAgICAgICAgIE9wdGlvbmFsPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4ganBUeXBlRGVjbGFyYXRpb24gPSBqcENvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JPZlR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAoanBUeXBlRGVjbGFyYXRpb24uaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oanBUeXBlRGVjbGFyYXRpb24uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24uaXNDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLmFzQ2xhc3MoKSwganBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24ganBNZXRob2REZWNsYXJhdGlvbiA9IChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24pIHBhcmVudE5vZGU7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbihqcE1ldGhvZERlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIGdldENvbnRhaW5lclF1YWxpZmllZE5hbWUoKSwgZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxCb3VuZD4gZ2V0Qm91bmRzKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGUuZ2V0VHlwZUJvdW5kKCkuc3RyZWFtKCkubWFwKChhc3RCKSAtPiB0b0JvdW5kKGFzdEIsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgQm91bmQgdG9Cb3VuZChDbGFzc09ySW50ZXJmYWNlVHlwZSBjbGFzc09ySW50ZXJmYWNlVHlwZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UoY2xhc3NPckludGVyZmFjZVR5cGUsIGNsYXNzT3JJbnRlcmZhY2VUeXBlKTsKKyAgICAgICAgcmV0dXJuIEJvdW5kLmV4dGVuZHNCb3VuZCh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFVzYWdlKE5vZGUgbm9kZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QW5jZXN0b3JzKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0RpcmVjdGx5QW5ub3RhdGlvbihTdHJpbmcgY2Fub25pY2FsTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhUGFyc2VyIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmlzaXRhYmxlIEphdmFQYXJzZXIgbm9kZSB3cmFwcGVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlciBnZXRXcmFwcGVkTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSlBUeXBlUGFyYW1ldGVyKCIgKyB3cmFwcGVkTm9kZS5nZXROYW1lKCkgKyAiLCBib3VuZHM9IiArIHdyYXBwZWROb2RlLmdldFR5cGVCb3VuZCgpICsgIikiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDJlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24geworCisgICAgcHJpdmF0ZSBUeXBlUGFyYW1ldGVyIHdyYXBwZWROb2RlOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIEphdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbihUeXBlUGFyYW1ldGVyIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVkTm9kZSA9IHdyYXBwZWROb2RlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIG90aGVyKSB7CisgICAgICAgIHJldHVybiBpc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZUltcGwob3RoZXIsIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gSGVscGVyLmdldFBhY2thZ2VOYW1lKHdyYXBwZWROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5nZXRDbGFzc05hbWUoIiIsIHdyYXBwZWROb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJKYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb257IiArCisgICAgICAgICAgICAgICAgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtZXRlclR5cGVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VXNhZ2UoTm9kZSBub2RlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSXMgdGhpcyB0eXBlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFzc2lnbmFibGUgYnkgIiArIHR5cGUuZGVzY3JpYmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIklzIHRoaXMgdHlwZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhc3NpZ25hYmxlIGJ5ICIgKyB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFuY2VzdG9ycygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0RpcmVjdGx5QW5ub3RhdGlvbihTdHJpbmcgY2Fub25pY2FsTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gYXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKHRoaXMud3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmFQYXJzZXIgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmlzaXRhYmxlIEphdmFQYXJzZXIgbm9kZSB3cmFwcGVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBUeXBlUGFyYW1ldGVyIGdldFdyYXBwZWROb2RlKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE5vZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gYXNUeXBlUGFyYW1ldGVyKCkuY29udGFpbmVyVHlwZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvQWJzdHJhY3RTeW1ib2xEZWNsYXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL0Fic3RyYWN0U3ltYm9sRGVjbGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmRhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL0Fic3RyYWN0U3ltYm9sRGVjbGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0b3JzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTeW1ib2xEZWNsYXJhdG9yPE4gZXh0ZW5kcyBOb2RlPiBpbXBsZW1lbnRzIFN5bWJvbERlY2xhcmF0b3IgeworCisgICAgcHJvdGVjdGVkIE4gd3JhcHBlZE5vZGU7CisgICAgcHJvdGVjdGVkIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBBYnN0cmFjdFN5bWJvbERlY2xhcmF0b3IoTiB3cmFwcGVkTm9kZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHRoaXMud3JhcHBlZE5vZGUgPSB3cmFwcGVkTm9kZTsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL0ZpZWxkU3ltYm9sRGVjbGFyYXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdG9ycy9GaWVsZFN5bWJvbERlY2xhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRmN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdG9ycy9GaWVsZFN5bWJvbERlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdG9yczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZFN5bWJvbERlY2xhcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFN5bWJvbERlY2xhcmF0b3I8RmllbGREZWNsYXJhdGlvbj4geworCisgICAgcHVibGljIEZpZWxkU3ltYm9sRGVjbGFyYXRvcihGaWVsZERlY2xhcmF0aW9uIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gZ2V0U3ltYm9sRGVjbGFyYXRpb25zKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc3ltYm9scyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZm9yIChWYXJpYWJsZURlY2xhcmF0b3IgdiA6IHdyYXBwZWROb2RlLmdldFZhcmlhYmxlcygpKSB7CisgICAgICAgICAgICBzeW1ib2xzLmFkZChKYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24uZmllbGQodiwgdHlwZVNvbHZlcikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzeW1ib2xzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdG9ycy9Ob1N5bWJvbERlY2xhcmF0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvTm9TeW1ib2xEZWNsYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1MGI3MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvTm9TeW1ib2xEZWNsYXJhdG9yLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRvcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIE5vU3ltYm9sRGVjbGFyYXRvcjxOIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdFN5bWJvbERlY2xhcmF0b3I8Tj4geworCisgICAgcHVibGljIE5vU3ltYm9sRGVjbGFyYXRvcihOIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gZ2V0U3ltYm9sRGVjbGFyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL1BhcmFtZXRlclN5bWJvbERlY2xhcmF0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvUGFyYW1ldGVyU3ltYm9sRGVjbGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDhlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL1BhcmFtZXRlclN5bWJvbERlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdG9yczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJTeW1ib2xEZWNsYXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTeW1ib2xEZWNsYXJhdG9yPFBhcmFtZXRlcj4geworCisgICAgcHVibGljIFBhcmFtZXRlclN5bWJvbERlY2xhcmF0b3IoUGFyYW1ldGVyIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gZ2V0U3ltYm9sRGVjbGFyYXRpb25zKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc3ltYm9scyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgc3ltYm9scy5hZGQoSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLnBhcmFtZXRlcih3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikpOworICAgICAgICByZXR1cm4gc3ltYm9sczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL1ZhcmlhYmxlU3ltYm9sRGVjbGFyYXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdG9ycy9WYXJpYWJsZVN5bWJvbERlY2xhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODg2NWRlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdG9ycy9WYXJpYWJsZVN5bWJvbERlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdG9yczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgVmFyaWFibGVTeW1ib2xEZWNsYXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTeW1ib2xEZWNsYXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiB7CisKKyAgICBwdWJsaWMgVmFyaWFibGVTeW1ib2xEZWNsYXJhdG9yKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHdyYXBwZWROb2RlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgc3VwZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpOworICAgICAgICB3cmFwcGVkTm9kZS5nZXRQYXJlbnROb2RlKCkuaWZQcmVzZW50KHAgLT4geworICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IGdldFN5bWJvbERlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWROb2RlLmdldFZhcmlhYmxlcygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcCh2IC0+IEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2LCB0eXBlU29sdmVyKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihMaW5rZWRMaXN0OjpuZXcpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvcGFja2FnZS1pbmZvLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGYxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIG1vZGVsIGJhc2VkIG9uIEphdmFQYXJzZXIuCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWw7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1MTZiNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkxhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlcjsKK2ltcG9ydCBqYXZhc3Npc3QuQ3RDbGFzczsKK2ltcG9ydCBqYXZhc3Npc3QuQ3RGaWVsZDsKK2ltcG9ydCBqYXZhc3Npc3QuQ3RNZXRob2Q7CitpbXBvcnQgamF2YXNzaXN0Lk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5BY2Nlc3NGbGFnOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5CYWRCeXRlY29kZTsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5TeW50aGV0aWNBdHRyaWJ1dGU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdENsYXNzRGVjbGFyYXRpb24geworCisKKworICAgIHByaXZhdGUgQ3RDbGFzcyBjdENsYXNzOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyOworCisgICAgcHVibGljIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24oQ3RDbGFzcyBjdENsYXNzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKGN0Q2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChjdENsYXNzLmlzSW50ZXJmYWNlKCkgfHwgY3RDbGFzcy5pc0Fubm90YXRpb24oKSB8fCBjdENsYXNzLmlzUHJpbWl0aXZlKCkgfHwgY3RDbGFzcy5pc0VudW0oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHJ5aW5nIHRvIGluc3RhbnRpYXRlIGEgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiB3aXRoIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYSBjbGFzczogIiArIGN0Q2xhc3MudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jdENsYXNzID0gY3RDbGFzczsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5qYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IEphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIoY3RDbGFzcywgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvYmplY3QoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0RpcmVjdGx5QW5ub3RhdGlvbihTdHJpbmcgY2Fub25pY2FsTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbChvdGhlciwgdHlwZVNvbHZlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gdGhhdCA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBvOworCisgICAgICAgIGlmICghY3RDbGFzcy5lcXVhbHModGhhdC5jdENsYXNzKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBjdENsYXNzLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGN0Q2xhc3MuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOworICAgICAgICBpZiAoZ2V0UGFja2FnZU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhnZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICsgMSwgY2xhc3NOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RVc2FnZT4gc29sdmVNZXRob2RBc1VzYWdlKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGludm9rYXRpb25Db250ZXh0LCBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtZXRlclZhbHVlcykgeworICAgICAgICByZXR1cm4gSmF2YXNzaXN0VXRpbHMuZ2V0TWV0aG9kVXNhZ2UoY3RDbGFzcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0KTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBmb3IgKEN0RmllbGQgZmllbGQgOiBjdENsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQobmV3IEphdmFzc2lzdEZpZWxkRGVjbGFyYXRpb24oZmllbGQsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlcmNsYXNzRlFOID0gZ2V0U3VwZXJjbGFzc0ZRTigpOworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gc29sdmVTeW1ib2xGb3JGUU4obmFtZSwgdHlwZVNvbHZlciwgc3VwZXJjbGFzc0ZRTik7CisgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlZjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGludGVyZmFjZUZRTnMgPSBnZXRJbnRlcmZhY2VGUU5zKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGludGVyZmFjZUZRTiA6IGludGVyZmFjZUZRTnMpIHsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBpbnRlcmZhY2VSZWYgPSBzb2x2ZVN5bWJvbEZvckZRTihuYW1lLCB0eXBlU29sdmVyLCBpbnRlcmZhY2VGUU4pOworICAgICAgICAgICAgaWYgKGludGVyZmFjZVJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZVJlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzb2x2ZVN5bWJvbEZvckZRTihTdHJpbmcgc3ltYm9sTmFtZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBTdHJpbmcgZnFuKSB7CisgICAgICAgIGlmIChmcW4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gZnFuVHlwZURlY2xhcmF0aW9uID0gdHlwZVNvbHZlci5zb2x2ZVR5cGUoZnFuKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xJblR5cGUoZnFuVHlwZURlY2xhcmF0aW9uLCBzeW1ib2xOYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ1tdIGdldEludGVyZmFjZUZRTnMoKSB7CisgICAgICAgIHJldHVybiBjdENsYXNzLmdldENsYXNzRmlsZSgpLmdldEludGVyZmFjZXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdXBlcmNsYXNzRlFOKCkgeworICAgICAgICByZXR1cm4gY3RDbGFzcy5nZXRDbGFzc0ZpbGUoKS5nZXRTdXBlcmNsYXNzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGlmIChnZXRTdXBlckNsYXNzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChnZXRTdXBlckNsYXNzKCkpOworICAgICAgICB9CisgICAgICAgIGFuY2VzdG9ycy5hZGRBbGwoZ2V0SW50ZXJmYWNlcygpKTsKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9yczsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgYm9vbGVhbiBzdGF0aWNPbmx5KSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBQcmVkaWNhdGU8Q3RNZXRob2Q+IHN0YXRpY09ubHlDaGVjayA9IG0gLT4gIXN0YXRpY09ubHkgfHwgKHN0YXRpY09ubHkgJiYgTW9kaWZpZXIuaXNTdGF0aWMobS5nZXRNb2RpZmllcnMoKSkpOworICAgICAgICBmb3IgKEN0TWV0aG9kIG1ldGhvZCA6IGN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTeW50aGV0aWMgPSBtZXRob2QuZ2V0TWV0aG9kSW5mbygpLmdldEF0dHJpYnV0ZShTeW50aGV0aWNBdHRyaWJ1dGUudGFnKSAhPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBpc05vdEJyaWRnZSA9ICAobWV0aG9kLmdldE1ldGhvZEluZm8oKS5nZXRBY2Nlc3NGbGFncygpICYgQWNjZXNzRmxhZy5CUklER0UpID09IDA7CisgICAgICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgJiYgIWlzU3ludGhldGljICYmIGlzTm90QnJpZGdlICYmIHN0YXRpY09ubHlDaGVjay50ZXN0KG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZChuZXcgSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ3RDbGFzcyBzdXBlckNsYXNzID0gY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICBpZiAoc3VwZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZiA9IG5ldyBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKHN1cGVyQ2xhc3MsIHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KTsKKyAgICAgICAgICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoQ3RDbGFzcyBpbnRlcmZhemUgOiBjdENsYXNzLmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSk7CisgICAgICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBNZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKGNhbmRpZGF0ZXMsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFVzYWdlKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHRoaXMsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmlzTnVsbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8gbG9vayBpbnRvIGdlbmVyaWNzCisgICAgICAgIGlmICh0eXBlLmRlc2NyaWJlKCkuZXF1YWxzKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbmV3IEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24odGhpcy5jdENsYXNzLmdldFN1cGVyY2xhc3MoKSwgdHlwZVNvbHZlcikuaXNBc3NpZ25hYmxlQnkodHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ3RDbGFzcyBpbnRlcmZhemUgOiBjdENsYXNzLmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5pc0Fzc2lnbmFibGVCeSh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgIHJldHVybiBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICBTdHJpbmdbXSBuYW1lRWxlbWVudHMgPSBjdENsYXNzLmdldFNpbXBsZU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKS5zcGxpdCgiXFwuIik7CisgICAgICAgIHJldHVybiBuYW1lRWxlbWVudHNbbmFtZUVsZW1lbnRzLmxlbmd0aCAtIDFdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuICFjdENsYXNzLmlzSW50ZXJmYWNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBnZXRTdXBlckNsYXNzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdENsYXNzLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbihjdENsYXNzLmdldFN1cGVyY2xhc3MoKSwgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NTaWduYXR1cmUgY2xhc3NTaWduYXR1cmUgPSBTaWduYXR1cmVBdHRyaWJ1dGUudG9DbGFzc1NpZ25hdHVyZShjdENsYXNzLmdldEdlbmVyaWNTaWduYXR1cmUoKSk7CisgICAgICAgICAgICByZXR1cm4gSmF2YXNzaXN0VXRpbHMuc2lnbmF0dXJlVHlwZVRvVHlwZShjbGFzc1NpZ25hdHVyZS5nZXRTdXBlckNsYXNzKCksIHR5cGVTb2x2ZXIsIHRoaXMpLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoQmFkQnl0ZWNvZGUgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEludGVyZmFjZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY3RDbGFzcy5nZXRHZW5lcmljU2lnbmF0dXJlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChpIC0+IG5ldyBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbihpLCB0eXBlU29sdmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaSAtPiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoaSwgdHlwZVNvbHZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2lnbmF0dXJlQXR0cmlidXRlLkNsYXNzU2lnbmF0dXJlIGNsYXNzU2lnbmF0dXJlID0gU2lnbmF0dXJlQXR0cmlidXRlLnRvQ2xhc3NTaWduYXR1cmUoY3RDbGFzcy5nZXRHZW5lcmljU2lnbmF0dXJlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGNsYXNzU2lnbmF0dXJlLmdldEludGVyZmFjZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaSAtPiBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKGksIHR5cGVTb2x2ZXIsIHRoaXMpLmFzUmVmZXJlbmNlVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChCYWRCeXRlY29kZSBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworICAgICAgICByZXR1cm4gY3RDbGFzcy5pc0ludGVyZmFjZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiB7IiArIGN0Q2xhc3MuZ2V0TmFtZSgpICsgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIEphdmFzc2lzdEZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChjdENsYXNzLmdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGdldENvbnN0cnVjdG9ycygpIHsKKyAgICAgIHJldHVybiBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldENvbnN0cnVjdG9ycygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuY29udGFpbmVyVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGludGVybmFsVHlwZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgR2V0IGFsbCBpbnRlcm5hbCB0eXBlcyBvZiB0aGUgY3VycmVudCBjbGFzcyBhbmQgZ2V0IHRoZWlyIGNvcnJlc3BvbmRpbmcgUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLgorICAgICAgICAgICAgRmluYWxseSwgcmV0dXJuIHRoZW0gaW4gYSBTZXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpdHlwZSAtPiBKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGl0eXBlLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBnZXRJbnRlcm5hbFR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgVGhlIG5hbWUgb2YgdGhlIFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBjb3VsZCBiZSBjb21wb3NlZCBvZiB0aGUgaW50ZXJuYWwgY2xhc3MgYW5kIHRoZSBvdXRlciBjbGFzcywgZS5nLiBBJEIuIFRoYXQncyB3aHkgd2Ugc2VhcmNoIHRoZSBpbnRlcm5hbCB0eXBlIGluIHRoZSBlbmRpbmcgcGFydC4KKyAgICAgICAgSW4gY2FzZSB0aGUgbmFtZSBpcyBjb21wb3NlZCBvZiB0aGUgaW50ZXJuYWwgdHlwZSBvbmx5LCBpLmUuIGYuZ2V0TmFtZSgpIHJldHVybnMgQiwgaXQgd2lsbCBhbHNvIHdvcmtzLgorICAgICAgICAgKi8KKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IHR5cGUgPQorICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxUeXBlcygpLnN0cmVhbSgpLmZpbHRlcihmIC0+IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUpKS5maW5kRmlyc3QoKTsKKyAgICAgICAgcmV0dXJuIHR5cGUub3JFbHNlVGhyb3coKCkgLT4KKyAgICAgICAgICAgICAgICBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIkludGVybmFsIHR5cGUgbm90IGZvdW5kOiAiICsgbmFtZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ludGVybmFsVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvKgorICAgICAgICBUaGUgbmFtZSBvZiB0aGUgUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGNvdWxkIGJlIGNvbXBvc2VkIG9mIHRoZSBpbnRlcm5hbCBjbGFzcyBhbmQgdGhlIG91dGVyIGNsYXNzLCBlLmcuIEEkQi4gVGhhdCdzIHdoeSB3ZSBzZWFyY2ggdGhlIGludGVybmFsIHR5cGUgaW4gdGhlIGVuZGluZyBwYXJ0LgorICAgICAgICBJbiBjYXNlIHRoZSBuYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBpbnRlcm5hbCB0eXBlIG9ubHksIGkuZS4gZi5nZXROYW1lKCkgcmV0dXJucyBCLCBpdCB3aWxsIGFsc28gd29ya3MuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuYW55TWF0Y2goZiAtPiBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkMDEwYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgamF2YXNzaXN0LkN0Q29uc3RydWN0b3I7CitpbXBvcnQgamF2YXNzaXN0Lk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5CYWRCeXRlY29kZTsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRnJlZCBMZWbDqXbDqHJlLUxhb2lkZQorICovCitwdWJsaWMgY2xhc3MgSmF2YXNzaXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB7CisgICAgcHJpdmF0ZSBDdENvbnN0cnVjdG9yIGN0Q29uc3RydWN0b3I7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgSmF2YXNzaXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihDdENvbnN0cnVjdG9yIGN0Q29uc3RydWN0b3IsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLmN0Q29uc3RydWN0b3IgPSBjdENvbnN0cnVjdG9yOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb257IiArCisgICAgICAgICAgICAgICAgIkN0Q29uc3RydWN0b3I9IiArIGN0Q29uc3RydWN0b3IgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjdENvbnN0cnVjdG9yLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbihjdENvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQYXJhbXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY3RDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBnZXRQYXJhbShpbnQgaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiB2YXJpYWRpYyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKChjdENvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpICYgamF2YXNzaXN0Lk1vZGlmaWVyLlZBUkFSR1MpID4gMCkgeworICAgICAgICAgICAgICAgIHZhcmlhZGljID0gaSA9PSAoY3RDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0Q29uc3RydWN0b3IuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTaWduYXR1cmVBdHRyaWJ1dGUuTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IFNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShjdENvbnN0cnVjdG9yLmdldEdlbmVyaWNTaWduYXR1cmUoKSk7CisgICAgICAgICAgICAgICAgU2lnbmF0dXJlQXR0cmlidXRlLlR5cGUgc2lnbmF0dXJlVHlwZSA9IG1ldGhvZFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygpW2ldOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YXNzaXN0UGFyYW1ldGVyRGVjbGFyYXRpb24oSmF2YXNzaXN0VXRpbHMuc2lnbmF0dXJlVHlwZVRvVHlwZShzaWduYXR1cmVUeXBlLCB0eXBlU29sdmVyLCB0aGlzKSwgdHlwZVNvbHZlciwgdmFyaWFkaWMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFzc2lzdFBhcmFtZXRlckRlY2xhcmF0aW9uKGN0Q29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKVtpXSwgdHlwZVNvbHZlciwgdmFyaWFkaWMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoQmFkQnl0ZWNvZGUgYmFkQnl0ZWNvZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJhZEJ5dGVjb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjdENvbnN0cnVjdG9yLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2lnbmF0dXJlQXR0cmlidXRlLk1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBTaWduYXR1cmVBdHRyaWJ1dGUudG9NZXRob2RTaWduYXR1cmUoY3RDb25zdHJ1Y3Rvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0obWV0aG9kU2lnbmF0dXJlLmdldFR5cGVQYXJhbWV0ZXJzKCkpLm1hcCgoamFzVHApIC0+IG5ldyBKYXZhc3Npc3RUeXBlUGFyYW1ldGVyKGphc1RwLCB0aGlzLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfSBjYXRjaCAoQmFkQnl0ZWNvZGUgYmFkQnl0ZWNvZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJhZEJ5dGVjb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICByZXR1cm4gSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGN0Q29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGN0Q29uc3RydWN0b3IuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGg7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRTcGVjaWZpZWRFeGNlcHRpb24oaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm8gZXhjZXB0aW9uIHdpdGggaW5kZXggJWQuIE51bWJlciBvZiBleGNlcHRpb25zOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSmF2YXNzaXN0RmFjdG9yeS50eXBlVXNhZ2VGb3IoY3RDb25zdHJ1Y3Rvci5nZXRFeGNlcHRpb25UeXBlcygpW2luZGV4XSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0RW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhjNzRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBqYXZhc3Npc3QuQ3RGaWVsZDsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuQWNjZXNzRmxhZzsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFzc2lzdEVudW1Db25zdGFudERlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIEN0RmllbGQgY3RGaWVsZDsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBKYXZhc3Npc3RFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihDdEZpZWxkIGN0RmllbGQsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAoY3RGaWVsZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjdEZpZWxkLmdldEZpZWxkSW5mbzIoKS5nZXRBY2Nlc3NGbGFncygpICYgQWNjZXNzRmxhZy5FTlVNKSAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUcnlpbmcgdG8gaW5zdGFudGlhdGUgYSBKYXZhc3Npc3RFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiB3aXRoIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYW4gZW51bSBmaWVsZDogIiArIGN0RmllbGQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jdEZpZWxkID0gY3RGaWVsZDsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGN0RmllbGQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEVudW1EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEVudW1EZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXI7CitpbXBvcnQgamF2YXNzaXN0LkN0Q2xhc3M7CitpbXBvcnQgamF2YXNzaXN0LkN0RmllbGQ7CitpbXBvcnQgamF2YXNzaXN0LkN0TWV0aG9kOworaW1wb3J0IGphdmFzc2lzdC5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuQWNjZXNzRmxhZzsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuU3ludGhldGljQXR0cmlidXRlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkRW51bURlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgQ3RDbGFzcyBjdENsYXNzOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyOworCisgICAgcHVibGljIEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbihDdENsYXNzIGN0Q2xhc3MsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAoY3RDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjdENsYXNzLmlzRW51bSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUcnlpbmcgdG8gaW5zdGFudGlhdGUgYSBKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24gd2l0aCBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGFuIGVudW06ICIgKyBjdENsYXNzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY3RDbGFzcyA9IGN0Q2xhc3M7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgICAgIHRoaXMuamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IG5ldyBKYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyKGN0Q2xhc3MsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICByZXR1cm4gSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGN0Q2xhc3MuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBjdENsYXNzLmdldFBhY2thZ2VOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gY3RDbGFzcy5nZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgICAgIGlmIChnZXRQYWNrYWdlTmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhnZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICsgMSwgbmFtZS5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgeworICAgICAgICByZXR1cm4gY3RDbGFzcy5nZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIC8vIERpcmVjdCBhbmNlc3RvcnMgb2YgYW4gZW51bSBhcmUgamF2YS5sYW5nLkVudW0gYW5kIGludGVyZmFjZXMKKyAgICAgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGFuY2VzdG9ycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ3RDbGFzcyBzdXBlckNsYXNzID0gY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCk7CisKKyAgICAgICAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgc3VwZXJDbGFzc1R5cGVVc2FnZSA9IEphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKHN1cGVyQ2xhc3MsIHR5cGVTb2x2ZXIpOworCisgICAgICAgICAgICAgICAgaWYgKHN1cGVyQ2xhc3NUeXBlVXNhZ2UuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChzdXBlckNsYXNzVHlwZVVzYWdlLmFzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoQ3RDbGFzcyBpbnRlcmZhemUgOiBjdENsYXNzLmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBpbnRlcmZhemVUeXBlVXNhZ2UgPSBKYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGludGVyZmF6ZVR5cGVVc2FnZS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKGludGVyZmF6ZVR5cGVVc2FnZS5hc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW5jZXN0b3Igbm90IGZvdW5kIGZvciAiICsgY3RDbGFzcy5nZXROYW1lKCkgKyAiLiIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9yczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE9wdGlvbmFsPFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZmllbGQgPSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKTsKKworICAgICAgICByZXR1cm4gZmllbGQub3JFbHNlVGhyb3coKCkgLT4gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBkb2VzIG5vdCBleGlzdCBpbiAiICsgY3RDbGFzcy5nZXROYW1lKCkgKyAiLiIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpLnN0cmVhbSgpLmFueU1hdGNoKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgU3RyaW5nW10gbmFtZUVsZW1lbnRzID0gY3RDbGFzcy5nZXRTaW1wbGVOYW1lKCkucmVwbGFjZSgnJCcsICcuJykuc3BsaXQoIlxcLiIpOworICAgICAgICByZXR1cm4gbmFtZUVsZW1lbnRzW25hbWVFbGVtZW50cy5sZW5ndGggLSAxXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5jb250YWluZXJUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZChTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBib29sZWFuIHN0YXRpY09ubHkpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFByZWRpY2F0ZTxDdE1ldGhvZD4gc3RhdGljT25seUNoZWNrID0gbSAtPiAhc3RhdGljT25seSB8fCAoc3RhdGljT25seSAmJiBNb2RpZmllci5pc1N0YXRpYyhtLmdldE1vZGlmaWVycygpKSk7CisgICAgICAgIGZvciAoQ3RNZXRob2QgbWV0aG9kIDogY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgYm9vbGVhbiBpc1N5bnRoZXRpYyA9IG1ldGhvZC5nZXRNZXRob2RJbmZvKCkuZ2V0QXR0cmlidXRlKFN5bnRoZXRpY0F0dHJpYnV0ZS50YWcpICE9IG51bGw7CisgICAgICAgICAgICBib29sZWFuIGlzTm90QnJpZGdlID0gKG1ldGhvZC5nZXRNZXRob2RJbmZvKCkuZ2V0QWNjZXNzRmxhZ3MoKSAmIEFjY2Vzc0ZsYWcuQlJJREdFKSA9PSAwOworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpICYmICFpc1N5bnRoZXRpYyAmJiBpc05vdEJyaWRnZSAmJiBzdGF0aWNPbmx5Q2hlY2sudGVzdChtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQobmV3IEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEN0Q2xhc3Mgc3VwZXJDbGFzcyA9IGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBuZXcgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbihzdXBlckNsYXNzLCB0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSk7CisgICAgICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBNZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKGNhbmRpZGF0ZXMsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHNvbHZlTWV0aG9kQXNVc2FnZShTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBpbnZva2F0aW9uQ29udGV4dCwgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbWV0ZXJWYWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEphdmFzc2lzdFV0aWxzLmdldE1ldGhvZFVzYWdlKGN0Q2xhc3MsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gaW50ZXJuYWxUeXBlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBHZXQgYWxsIGludGVybmFsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGNsYXNzIGFuZCBnZXQgdGhlaXIgY29ycmVzcG9uZGluZyBSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uCisgICAgICAgICAgICBGaW5hbGx5LCByZXR1cm4gdGhlbSBpbiBhIFNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKSkubWFwKGl0eXBlIC0+IEphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oaXR5cGUsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGdldEludGVybmFsVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvKgorICAgICAgICBUaGUgbmFtZSBvZiB0aGUgUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGNvdWxkIGJlIGNvbXBvc2VkIG9uIHRoZSBpbnRlcm5hbCBjbGFzcyBhbmQgdGhlIG91dGVyIGNsYXNzLCBlLmcuIEEkQi4gVGhhdCdzIHdoeSB3ZSBzZWFyY2ggdGhlIGludGVybmFsIHR5cGUgaW4gdGhlIGVuZGluZyBwYXJ0LgorICAgICAgICBJbiBjYXNlIHRoZSBuYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBpbnRlcm5hbCB0eXBlIG9ubHksIGkuZS4gZi5nZXROYW1lKCkgcmV0dXJucyBCLCBpdCB3aWxsIGFsc28gd29ya3MuCisgICAgICAgICAqLworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHlwZSA9CisgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkpLmZpbmRGaXJzdCgpOworICAgICAgICByZXR1cm4gdHlwZS5vckVsc2VUaHJvdygoKSAtPgorICAgICAgICAgICAgICAgIG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbigiSW50ZXJuYWwgdHlwZSBub3QgZm91bmQ6ICIgKyBuYW1lKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzSW50ZXJuYWxUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8qCisgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gY291bGQgYmUgY29tcG9zZWQgb24gdGhlIGludGVybmFsIGNsYXNzIGFuZCB0aGUgb3V0ZXIgY2xhc3MsIGUuZy4gQSRCLiBUaGF0J3Mgd2h5IHdlIHNlYXJjaCB0aGUgaW50ZXJuYWwgdHlwZSBpbiB0aGUgZW5kaW5nIHBhcnQuCisgICAgICAgIEluIGNhc2UgdGhlIG5hbWUgaXMgY29tcG9zZWQgb2YgdGhlIGludGVybmFsIHR5cGUgb25seSwgaS5lLiBmLmdldE5hbWUoKSByZXR1cm5zIEIsIGl0IHdpbGwgYWxzbyB3b3Jrcy4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChDdEZpZWxkIGZpZWxkIDogY3RDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VGUU5zID0gZ2V0SW50ZXJmYWNlRlFOcygpOworICAgICAgICBmb3IgKFN0cmluZyBpbnRlcmZhY2VGUU4gOiBpbnRlcmZhY2VGUU5zKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gaW50ZXJmYWNlUmVmID0gc29sdmVTeW1ib2xGb3JGUU4obmFtZSwgdHlwZVNvbHZlciwgaW50ZXJmYWNlRlFOKTsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VSZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VSZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2xGb3JGUU4oU3RyaW5nIHN5bWJvbE5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgU3RyaW5nIGZxbikgeworICAgICAgICBpZiAoZnFuID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGZxblR5cGVEZWNsYXJhdGlvbiA9IHR5cGVTb2x2ZXIuc29sdmVUeXBlKGZxbik7CisgICAgICAgIHJldHVybiBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sSW5UeXBlKGZxblR5cGVEZWNsYXJhdGlvbiwgc3ltYm9sTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRJbnRlcmZhY2VGUU5zKCkgeworICAgICAgICByZXR1cm4gY3RDbGFzcy5nZXRDbGFzc0ZpbGUoKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZ2V0RW51bUNvbnN0YW50cygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXRGaWVsZHMoKSkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGYgLT4gKGYuZ2V0RmllbGRJbmZvMigpLmdldEFjY2Vzc0ZsYWdzKCkgJiBBY2Nlc3NGbGFnLkVOVU0pICE9IDApCisgICAgICAgICAgICAgICAgLm1hcChmIC0+IG5ldyBKYXZhc3Npc3RFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihmLCB0eXBlU29sdmVyKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0RmFjdG9yeS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg4YjliCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS4qOworaW1wb3J0IGphdmFzc2lzdC5DdENsYXNzOworaW1wb3J0IGphdmFzc2lzdC5Ob3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YXNzaXN0RmFjdG9yeSB7CisKKyAgcHVibGljIHN0YXRpYyBSZXNvbHZlZFR5cGUgdHlwZVVzYWdlRm9yKEN0Q2xhc3MgY3RDbGF6eiwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChjdENsYXp6LmlzQXJyYXkoKSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkQXJyYXlUeXBlKHR5cGVVc2FnZUZvcihjdENsYXp6LmdldENvbXBvbmVudFR5cGUoKSwgdHlwZVNvbHZlcikpOworICAgICAgfSBlbHNlIGlmIChjdENsYXp6LmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgaWYgKGN0Q2xhenouZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKSB7CisgICAgICAgICAgcmV0dXJuIFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ieU5hbWUoY3RDbGF6ei5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3RDbGF6ei5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oY3RDbGF6eiwgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgaWYgKGN0Q2xhenouaXNFbnVtKCkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24oY3RDbGF6eiwgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24oY3RDbGF6eiwgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0b1R5cGVEZWNsYXJhdGlvbihDdENsYXNzIGN0Q2xhenosIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgIGlmIChjdENsYXp6LmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgIHJldHVybiBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oY3RDbGF6eiwgdHlwZVNvbHZlcik7CisgICAgfSBlbHNlIGlmIChjdENsYXp6LmlzRW51bSgpKSB7CisgICAgICByZXR1cm4gbmV3IEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbihjdENsYXp6LCB0eXBlU29sdmVyKTsKKyAgICB9IGVsc2UgaWYgKGN0Q2xhenouaXNBbm5vdGF0aW9uKCkpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ3RDbGFzcyBvZiBhbm5vdGF0aW9uIG5vdCB5ZXQgc3VwcG9ydGVkIik7CisgICAgfSBlbHNlIGlmIChjdENsYXp6LmlzQXJyYXkoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgcGFzc2luZyBhbiBhcnJheSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24oY3RDbGF6eiwgdHlwZVNvbHZlcik7CisgICAgfQorICB9CisKKyAgc3RhdGljIEFjY2Vzc1NwZWNpZmllciBtb2RpZmllcnNUb0FjY2Vzc0xldmVsKGZpbmFsIGludCBtb2RpZmllcnMpIHsKKyAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgeworICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QVUJMSUM7CisgICAgfSBlbHNlIGlmIChNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKSB7CisgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLlBST1RFQ1RFRDsKKyAgICB9IGVsc2UgaWYgKE1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKSB7CisgICAgICByZXR1cm4gQWNjZXNzU3BlY2lmaWVyLlBSSVZBVEU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIuREVGQVVMVDsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEZpZWxkRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5NThjYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0cml6YWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgamF2YXNzaXN0LkN0RmllbGQ7CitpbXBvcnQgamF2YXNzaXN0Lk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5CYWRCeXRlY29kZTsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIHsKKyAgICBwcml2YXRlIEN0RmllbGQgY3RGaWVsZDsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uKEN0RmllbGQgY3RGaWVsZCwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHRoaXMuY3RGaWVsZCA9IGN0RmllbGQ7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGN0RmllbGQuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpICE9IG51bGwgJiYgZGVjbGFyaW5nVHlwZSgpIGluc3RhbmNlb2YgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUpIHsKKyAgICAgICAgICAgICAgICBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLlR5cGUgZ2VuZXJpY1NpZ25hdHVyZVR5cGUgPSBTaWduYXR1cmVBdHRyaWJ1dGUudG9GaWVsZFNpZ25hdHVyZShjdEZpZWxkLmdldEdlbmVyaWNTaWduYXR1cmUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFzc2lzdFV0aWxzLnNpZ25hdHVyZVR5cGVUb1R5cGUoZ2VuZXJpY1NpZ25hdHVyZVR5cGUsIHR5cGVTb2x2ZXIsIChSZXNvbHZlZFR5cGVQYXJhbWV0cml6YWJsZSkgZGVjbGFyaW5nVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKGN0RmllbGQuZ2V0VHlwZSgpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEJhZEJ5dGVjb2RlIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBNb2RpZmllci5pc1N0YXRpYyhjdEZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjdEZpZWxkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICByZXR1cm4gSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGN0RmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKCkgeworICAgICAgICByZXR1cm4gSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdEZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzNzUzNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyOworaW1wb3J0IGphdmFzc2lzdC5DdENsYXNzOworaW1wb3J0IGphdmFzc2lzdC5DdEZpZWxkOworaW1wb3J0IGphdmFzc2lzdC5DdE1ldGhvZDsKK2ltcG9ydCBqYXZhc3Npc3QuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXNzaXN0LmJ5dGVjb2RlLkFjY2Vzc0ZsYWc7CitpbXBvcnQgamF2YXNzaXN0LmJ5dGVjb2RlLlN5bnRoZXRpY0F0dHJpYnV0ZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkSW50ZXJmYWNlRGVjbGFyYXRpb24geworCisgICAgcHJpdmF0ZSBDdENsYXNzIGN0Q2xhc3M7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBKYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9ueyIgKworICAgICAgICAgICAgICAgICJjdENsYXNzPSIgKyBjdENsYXNzLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgIiwgdHlwZVNvbHZlcj0iICsgdHlwZVNvbHZlciArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbihDdENsYXNzIGN0Q2xhc3MsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAoIWN0Q2xhc3MuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IGFuIGludGVyZmFjZTogIiArIGN0Q2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmN0Q2xhc3MgPSBjdENsYXNzOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICB0aGlzLmphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBuZXcgSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlcihjdENsYXNzLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEludGVyZmFjZXNFeHRlbmRlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKS5tYXAoaSAtPiBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaSwgdHlwZVNvbHZlcikpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoaSAtPiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoaSwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGN0Q2xhc3MuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOworICAgICAgICBpZiAoZ2V0UGFja2FnZU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhnZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICsgMSwgY2xhc3NOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpOworICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBzb2x2ZU1ldGhvZEFzVXNhZ2UoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQsIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVyVmFsdWVzKSB7CisKKyAgICAgICAgcmV0dXJuIEphdmFzc2lzdFV0aWxzLmdldE1ldGhvZFVzYWdlKGN0Q2xhc3MsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSkgeworICAgICAgICBMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgUHJlZGljYXRlPEN0TWV0aG9kPiBzdGF0aWNPbmx5Q2hlY2sgPSBtIC0+ICFzdGF0aWNPbmx5IHx8IChzdGF0aWNPbmx5ICYmIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpKTsKKyAgICAgICAgZm9yIChDdE1ldGhvZCBtZXRob2QgOiBjdENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICBib29sZWFuIGlzU3ludGhldGljID0gbWV0aG9kLmdldE1ldGhvZEluZm8oKS5nZXRBdHRyaWJ1dGUoU3ludGhldGljQXR0cmlidXRlLnRhZykgIT0gbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNOb3RCcmlkZ2UgPSAgKG1ldGhvZC5nZXRNZXRob2RJbmZvKCkuZ2V0QWNjZXNzRmxhZ3MoKSAmIEFjY2Vzc0ZsYWcuQlJJREdFKSA9PSAwOworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpICYmICFpc1N5bnRoZXRpYyAmJiBpc05vdEJyaWRnZSAmJiBzdGF0aWNPbmx5Q2hlY2sudGVzdChtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQobmV3IEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEN0Q2xhc3Mgc3VwZXJDbGFzcyA9IGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBuZXcgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbihzdXBlckNsYXNzLCB0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSk7CisgICAgICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEN0Q2xhc3MgaW50ZXJmYXplIDogY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmID0gbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGludGVyZmF6ZSwgdHlwZVNvbHZlcikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpOworICAgICAgICAgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShjYW5kaWRhdGVzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICByZXR1cm4gamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIG90aGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QW5jZXN0b3JzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEN0Q2xhc3MgaW50ZXJmYXplIDogY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3VwZXJJbnRlcmZhemUgPSBKYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgICAgIGFuY2VzdG9ycy5hZGQoc3VwZXJJbnRlcmZhemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMuc3RyZWFtKCkuZmlsdGVyKGEgLT4gYS5nZXRRdWFsaWZpZWROYW1lKCkgIT0gT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgYW5jZXN0b3JzLmFkZChuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9yczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkKKyAgICAgICAgICAgICAgICAubWFwKG0gLT4gbmV3IEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKG0sIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBhbm5vdGF0aW9uUmF3IDogY3RDbGFzcy5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25SYXcuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQXJyYXlzLnN0cmVhbShhbm5vdGF0aW9uUmF3LmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKS5hbnlNYXRjaChpdCAtPiBpdC5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgU3RyaW5nW10gbmFtZUVsZW1lbnRzID0gY3RDbGFzcy5nZXRTaW1wbGVOYW1lKCkucmVwbGFjZSgnJCcsICcuJykuc3BsaXQoIlxcLiIpOworICAgICAgICByZXR1cm4gbmFtZUVsZW1lbnRzW25hbWVFbGVtZW50cy5sZW5ndGggLSAxXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBKYXZhc3Npc3RGYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoY3RDbGFzcy5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkSW50ZXJmYWNlRGVjbGFyYXRpb24gYXNJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChDdEZpZWxkIGZpZWxkIDogY3RDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VGUU5zID0gZ2V0SW50ZXJmYWNlRlFOcygpOworICAgICAgICBmb3IgKFN0cmluZyBpbnRlcmZhY2VGUU4gOiBpbnRlcmZhY2VGUU5zKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gaW50ZXJmYWNlUmVmID0gc29sdmVTeW1ib2xGb3JGUU4obmFtZSwgdHlwZVNvbHZlciwgaW50ZXJmYWNlRlFOKTsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VSZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VSZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2xGb3JGUU4oU3RyaW5nIHN5bWJvbE5hbWUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgU3RyaW5nIGZxbikgeworICAgICAgICBpZiAoZnFuID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGZxblR5cGVEZWNsYXJhdGlvbiA9IHR5cGVTb2x2ZXIuc29sdmVUeXBlKGZxbik7CisgICAgICAgIHJldHVybiBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sSW5UeXBlKGZxblR5cGVEZWNsYXJhdGlvbiwgc3ltYm9sTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRJbnRlcmZhY2VGUU5zKCkgeworICAgICAgICByZXR1cm4gY3RDbGFzcy5nZXRDbGFzc0ZpbGUoKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5jb250YWluZXJUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gaW50ZXJuYWxUeXBlcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBHZXQgYWxsIGludGVybmFsIHR5cGVzIG9mIHRoZSBjdXJyZW50IGNsYXNzIGFuZCBnZXQgdGhlaXIgY29ycmVzcG9uZGluZyBSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uCisgICAgICAgICAgICBGaW5hbGx5LCByZXR1cm4gdGhlbSBpbiBhIFNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKSkubWFwKGl0eXBlIC0+IEphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oaXR5cGUsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGdldEludGVybmFsVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvKgorICAgICAgICBUaGUgbmFtZSBvZiB0aGUgUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGNvdWxkIGJlIGNvbXBvc2VkIG9uIHRoZSBpbnRlcm5hbCBjbGFzcyBhbmQgdGhlIG91dGVyIGNsYXNzLCBlLmcuIEEkQi4gVGhhdCdzIHdoeSB3ZSBzZWFyY2ggdGhlIGludGVybmFsIHR5cGUgaW4gdGhlIGVuZGluZyBwYXJ0LgorICAgICAgICBJbiBjYXNlIHRoZSBuYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBpbnRlcm5hbCB0eXBlIG9ubHksIGkuZS4gZi5nZXROYW1lKCkgcmV0dXJucyBCLCBpdCB3aWxsIGFsc28gd29ya3MuCisgICAgICAgICAqLworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHlwZSA9CisgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkpLmZpbmRGaXJzdCgpOworICAgICAgICByZXR1cm4gdHlwZS5vckVsc2VUaHJvdygoKSAtPgorICAgICAgICAgICAgICAgIG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbigiSW50ZXJuYWwgdHlwZSBub3QgZm91bmQ6ICIgKyBuYW1lKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzSW50ZXJuYWxUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8qCisgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gY291bGQgYmUgY29tcG9zZWQgb24gdGhlIGludGVybmFsIGNsYXNzIGFuZCB0aGUgb3V0ZXIgY2xhc3MsIGUuZy4gQSRCLiBUaGF0J3Mgd2h5IHdlIHNlYXJjaCB0aGUgaW50ZXJuYWwgdHlwZSBpbiB0aGUgZW5kaW5nIHBhcnQuCisgICAgICAgIEluIGNhc2UgdGhlIG5hbWUgaXMgY29tcG9zZWQgb2YgdGhlIGludGVybmFsIHR5cGUgb25seSwgaS5lLiBmLmdldE5hbWUoKSByZXR1cm5zIEIsIGl0IHdpbGwgYWxzbyB3b3Jrcy4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzRkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuZGVjbGFyYXRpb25zLmNvbW1vbi5NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGphdmFzc2lzdC5DdE1ldGhvZDsKK2ltcG9ydCBqYXZhc3Npc3QuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXNzaXN0LmJ5dGVjb2RlLkJhZEJ5dGVjb2RlOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24geworICAgIHByaXZhdGUgQ3RNZXRob2QgY3RNZXRob2Q7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24oQ3RNZXRob2QgY3RNZXRob2QsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLmN0TWV0aG9kID0gY3RNZXRob2Q7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gY3RNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpICYmICFpc0Fic3RyYWN0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBNb2RpZmllci5pc1N0YXRpYyhjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJKYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbnsiICsKKyAgICAgICAgICAgICAgICAiY3RNZXRob2Q9IiArIGN0TWV0aG9kICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gY3RNZXRob2QuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlKCkgeworICAgICAgICBpZiAoY3RNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGN0TWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKGN0TWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGN0TWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlIGdlbmVyaWNTaWduYXR1cmVUeXBlID0gU2lnbmF0dXJlQXR0cmlidXRlLnRvTWV0aG9kU2lnbmF0dXJlKGN0TWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSkuZ2V0UmV0dXJuVHlwZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKGdlbmVyaWNTaWduYXR1cmVUeXBlLCB0eXBlU29sdmVyLCB0aGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKGN0TWV0aG9kLmdldFJldHVyblR5cGUoKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChCYWRCeXRlY29kZSBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjdE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBnZXRQYXJhbShpbnQgaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiB2YXJpYWRpYyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKChjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIGphdmFzc2lzdC5Nb2RpZmllci5WQVJBUkdTKSA+IDApIHsKKyAgICAgICAgICAgICAgICB2YXJpYWRpYyA9IGkgPT0gKGN0TWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3RNZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTaWduYXR1cmVBdHRyaWJ1dGUuTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IFNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShjdE1ldGhvZC5nZXRHZW5lcmljU2lnbmF0dXJlKCkpOworICAgICAgICAgICAgICAgIFNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlIHNpZ25hdHVyZVR5cGUgPSBtZXRob2RTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKVtpXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFzc2lzdFBhcmFtZXRlckRlY2xhcmF0aW9uKEphdmFzc2lzdFV0aWxzLnNpZ25hdHVyZVR5cGVUb1R5cGUoc2lnbmF0dXJlVHlwZSwgdHlwZVNvbHZlciwgdGhpcyksIHR5cGVTb2x2ZXIsIHZhcmlhZGljKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbihjdE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpW2ldLCB0eXBlU29sdmVyLCB2YXJpYWRpYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChCYWRCeXRlY29kZSBiYWRCeXRlY29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYmFkQnl0ZWNvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFVzYWdlIGdldFVzYWdlKE5vZGUgbm9kZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kVXNhZ2UgcmVzb2x2ZVR5cGVWYXJpYWJsZXMoQ29udGV4dCBjb250ZXh0LCBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljKHRoaXMsIHR5cGVTb2x2ZXIpLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbnRleHQsIHBhcmFtZXRlclR5cGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgeworICAgICAgICByZXR1cm4gTW9kaWZpZXIuaXNBYnN0cmFjdChjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGN0TWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2lnbmF0dXJlQXR0cmlidXRlLk1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBTaWduYXR1cmVBdHRyaWJ1dGUudG9NZXRob2RTaWduYXR1cmUoY3RNZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKG1ldGhvZFNpZ25hdHVyZS5nZXRUeXBlUGFyYW1ldGVycygpKS5tYXAoKGphc1RwKSAtPiBuZXcgSmF2YXNzaXN0VHlwZVBhcmFtZXRlcihqYXNUcCwgdGhpcywgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIH0gY2F0Y2ggKEJhZEJ5dGVjb2RlIGJhZEJ5dGVjb2RlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihiYWRCeXRlY29kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY3RNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGg7CisgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRTcGVjaWZpZWRFeGNlcHRpb24oaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm8gZXhjZXB0aW9uIHdpdGggaW5kZXggJWQuIE51bWJlciBvZiBleGNlcHRpb25zOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSmF2YXNzaXN0RmFjdG9yeS50eXBlVXNhZ2VGb3IoY3RNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKVtpbmRleF0sIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdFBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzZTE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgamF2YXNzaXN0LkN0Q2xhc3M7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24geworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIHZhcmlhZGljOworCisgICAgcHVibGljIEphdmFzc2lzdFBhcmFtZXRlckRlY2xhcmF0aW9uKEN0Q2xhc3MgdHlwZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBib29sZWFuIHZhcmlhZGljKSB7CisgICAgICAgIHRoaXMoSmF2YXNzaXN0RmFjdG9yeS50eXBlVXNhZ2VGb3IodHlwZSwgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIsIHZhcmlhZGljKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YXNzaXN0UGFyYW1ldGVyRGVjbGFyYXRpb24oUmVzb2x2ZWRUeXBlIHR5cGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgYm9vbGVhbiB2YXJpYWRpYykgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICB0aGlzLnZhcmlhZGljID0gdmFyaWFkaWM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJKYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbnsiICsKKyAgICAgICAgICAgICAgICAidHlwZT0iICsgdHlwZSArCisgICAgICAgICAgICAgICAgIiwgdHlwZVNvbHZlcj0iICsgdHlwZVNvbHZlciArCisgICAgICAgICAgICAgICAgIiwgdmFyaWFkaWM9IiArIHZhcmlhZGljICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNWYXJpYWRpYygpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhZGljOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU2NDM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGphdmFzc2lzdC5DdENsYXNzOworaW1wb3J0IGphdmFzc2lzdC5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuQmFkQnl0ZWNvZGU7CitpbXBvcnQgamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgeworCisgIHByaXZhdGUgQ3RDbGFzcyBjdENsYXNzOworICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICBwdWJsaWMgSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlcihDdENsYXNzIGN0Q2xhc3MsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgIHRoaXMuY3RDbGFzcyA9IGN0Q2xhc3M7CisgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgfQorCisgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRNZXRob2RzKCkgeworICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpCisgICAgICAgIC5tYXAobSAtPiBuZXcgSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZ2V0Q29uc3RydWN0b3JzKCkgeworICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkpCisgICAgICAgIC5tYXAobSAtPiBuZXcgSmF2YXNzaXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihtLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZ2V0RGVjbGFyZWRGaWVsZHMoKSB7CisgICAgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGZpZWxkRGVjbHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBjb2xsZWN0RGVjbGFyZWRGaWVsZHMoY3RDbGFzcywgZmllbGREZWNscyk7CisgICAgcmV0dXJuIGZpZWxkRGVjbHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgY29sbGVjdERlY2xhcmVkRmllbGRzKEN0Q2xhc3MgY3RDbGFzcywgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGZpZWxkRGVjbHMpIHsKKyAgICBpZiAoY3RDbGFzcyAhPSBudWxsKSB7CisgICAgICBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkKKyAgICAgICAgICAuZm9yRWFjaChmIC0+IGZpZWxkRGVjbHMuYWRkKG5ldyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uKGYsIHR5cGVTb2x2ZXIpKSk7CisgICAgICB0cnkgeworICAgICAgICBjb2xsZWN0RGVjbGFyZWRGaWVsZHMoY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCksIGZpZWxkRGVjbHMpOworICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSdsbCBzdG9wIGhlcmUKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgaWYgKG51bGwgPT0gY3RDbGFzcy5nZXRHZW5lcmljU2lnbmF0dXJlKCkpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgU2lnbmF0dXJlQXR0cmlidXRlLkNsYXNzU2lnbmF0dXJlIGNsYXNzU2lnbmF0dXJlID0KKyAgICAgICAgICAgIFNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKTsKKyAgICAgICAgcmV0dXJuIEFycmF5cy48U2lnbmF0dXJlQXR0cmlidXRlLlR5cGVQYXJhbWV0ZXI+c3RyZWFtKGNsYXNzU2lnbmF0dXJlLmdldFBhcmFtZXRlcnMoKSkKKyAgICAgICAgICAgIC5tYXAoKHRwKSAtPiBuZXcgSmF2YXNzaXN0VHlwZVBhcmFtZXRlcih0cCwgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdENsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgIH0gY2F0Y2ggKEJhZEJ5dGVjb2RlIGJhZEJ5dGVjb2RlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJhZEJ5dGVjb2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGNvbnRhaW5lclR5cGUoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBjdENsYXNzLmdldERlY2xhcmluZ0NsYXNzKCkgPT0gbnVsbCA/CisgICAgICAgICAgT3B0aW9uYWwuZW1wdHkoKSA6CisgICAgICAgICAgT3B0aW9uYWwub2YoSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdENsYXNzLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpKTsKKyAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RUeXBlUGFyYW1ldGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0VHlwZVBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTkyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0VHlwZVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhc3Npc3RUeXBlUGFyYW1ldGVyIGltcGxlbWVudHMgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24geworCisgICAgcHJpdmF0ZSBTaWduYXR1cmVBdHRyaWJ1dGUuVHlwZVBhcmFtZXRlciB3cmFwcGVkOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUgY29udGFpbmVyOworCisgICAgcHVibGljIEphdmFzc2lzdFR5cGVQYXJhbWV0ZXIoU2lnbmF0dXJlQXR0cmlidXRlLlR5cGVQYXJhbWV0ZXIgd3JhcHBlZCwgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUgY29udGFpbmVyLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdGhhdCA9IChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikgbzsKKworICAgICAgICBpZiAoIWdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhhdC5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlY2xhcmVkT25UeXBlKCkgIT0gdGhhdC5kZWNsYXJlZE9uVHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlY2xhcmVkT25NZXRob2QoKSAhPSB0aGF0LmRlY2xhcmVkT25NZXRob2QoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gY2hlY2sgYm91bmRzCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmF2YXNzaXN0VHlwZVBhcmFtZXRlcnsiICsKKyAgICAgICAgICAgICAgICB3cmFwcGVkLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyUXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB0aGlzLmNvbnRhaW5lcikuZ2V0UXVhbGlmaWVkTmFtZSgpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgUmVzb2x2ZWRNZXRob2RMaWtlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uKSB0aGlzLmNvbnRhaW5lcikuZ2V0UXVhbGlmaWVkTmFtZSgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVySWQoKSB7CisgICAgICAgIHJldHVybiBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kPiBnZXRCb3VuZHMoKSB7CisgICAgICAgIExpc3Q8Qm91bmQ+IGJvdW5kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpZiAod3JhcHBlZC5nZXRDbGFzc0JvdW5kKCkgIT0gbnVsbCAmJiAhd3JhcHBlZC5nZXRDbGFzc0JvdW5kKCkudG9TdHJpbmcoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih3cmFwcGVkLmdldENsYXNzQm91bmQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFNpZ25hdHVyZUF0dHJpYnV0ZS5PYmplY3RUeXBlIG90IDogd3JhcHBlZC5nZXRJbnRlcmZhY2VCb3VuZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ob3QudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvdW5kczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGNvbnRhaW5lclR5cGUoKSB7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0VXRpbHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViM2Q2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0VXRpbHMuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyOworaW1wb3J0IGphdmFzc2lzdC5DdENsYXNzOworaW1wb3J0IGphdmFzc2lzdC5DdE1ldGhvZDsKK2ltcG9ydCBqYXZhc3Npc3QuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXNzaXN0LmJ5dGVjb2RlLkJhZEJ5dGVjb2RlOworaW1wb3J0IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK2NsYXNzIEphdmFzc2lzdFV0aWxzIHsKKworICAgIHN0YXRpYyBPcHRpb25hbDxNZXRob2RVc2FnZT4gZ2V0TWV0aG9kVXNhZ2UoQ3RDbGFzcyBjdENsYXNzLCBTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQpIHsKKyAgICAgICAgLy8gVE9ETyBhdm9pZCBicmlkZ2UgYW5kIHN5bnRoZXRpYyBtZXRob2RzCisgICAgICAgIGZvciAoQ3RNZXRob2QgbWV0aG9kIDogY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBjaGVjayB0eXBlUGFyYW1ldGVyc1ZhbHVlcworICAgICAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gbmV3IE1ldGhvZFVzYWdlKG5ldyBKYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzVHlwZXMuc2l6ZSgpIDwgbWV0aG9kVXNhZ2UuZ2V0Tm9QYXJhbXMoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgYSBnb29kIGNhbmRpZGF0ZSAoZXhjZXB0IGlmIHZhcmlhZGljID8pCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVBdHRyaWJ1dGUuTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IFNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShtZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJzT2ZSZXR1cm5UeXBlID0gcGFyc2VUeXBlUGFyYW1ldGVycyhtZXRob2RTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZSgpLnRvU3RyaW5nKCksIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBuZXdSZXR1cm5UeXBlID0gbWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZSBvbmUgcGFyYW1ldGVyc09mUmV0dXJuVHlwZSBhdCB0aGUgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JldHVyblR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgJiYgcGFyYW1ldGVyc09mUmV0dXJuVHlwZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmV0dXJuVHlwZSA9IG5ld1JldHVyblR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHJhbnNmb3JtVHlwZVBhcmFtZXRlcnModHAgLT4gcGFyYW1ldGVyc09mUmV0dXJuVHlwZS5yZW1vdmUoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kVXNhZ2UgPSBtZXRob2RVc2FnZS5yZXBsYWNlUmV0dXJuVHlwZShuZXdSZXR1cm5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobWV0aG9kVXNhZ2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJhZEJ5dGVjb2RlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEN0Q2xhc3Mgc3VwZXJDbGFzcyA9IGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiByZWYgPSBuZXcgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbihzdXBlckNsYXNzLCB0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAocmVmLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEN0Q2xhc3MgaW50ZXJmYXplIDogY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gcmVmID0gbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGludGVyZmF6ZSwgdHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZi5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFJlc29sdmVkVHlwZT4gcGFyc2VUeXBlUGFyYW1ldGVycyhTdHJpbmcgc2lnbmF0dXJlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQpIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsU2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgICAgICBpZiAoc2lnbmF0dXJlLmNvbnRhaW5zKCI8IikpIHsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoc2lnbmF0dXJlLmluZGV4T2YoJzwnKSArIDEpOworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmUuZW5kc1dpdGgoIj4iKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoMCwgc2lnbmF0dXJlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICBpZiAoc2lnbmF0dXJlLmNvbnRhaW5zKCIsIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaWduYXR1cmUuc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgYm91bmRzCisgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgdHlwZXMuYWRkKFJlc29sdmVkV2lsZGNhcmQuVU5CT1VOREVEKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKHNpZ25hdHVyZSwgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQpOworICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5jb250YWlucygiPCIpKSB7CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnN1YnN0cmluZygwLCBzaWduYXR1cmUuaW5kZXhPZignPCcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaWduYXR1cmUuY29udGFpbnMoIj4iKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVUeXBlVXNhZ2Uoc2lnbmF0dXJlLCBpbnZva2F0aW9uQ29udGV4dCk7CisKKyAgICAgICAgICAgIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpICYmIHR5cGVQYXJhbWV0ZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiB0eXBlUGFyYW1ldGVycy5yZW1vdmUoMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICB0eXBlcy5hZGQodHlwZSk7CisgICAgICAgICAgICByZXR1cm4gdHlwZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgUmVzb2x2ZWRUeXBlIHNpZ25hdHVyZVR5cGVUb1R5cGUoU2lnbmF0dXJlQXR0cmlidXRlLlR5cGUgc2lnbmF0dXJlVHlwZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBSZXNvbHZlZFR5cGVQYXJhbWV0cml6YWJsZSB0eXBlUGFyYW1ldHJpemFibGUpIHsKKyAgICAgICAgaWYgKHNpZ25hdHVyZVR5cGUgaW5zdGFuY2VvZiBTaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NUeXBlKSB7CisgICAgICAgICAgICBTaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NUeXBlIGNsYXNzVHlwZSA9IChTaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NUeXBlKSBzaWduYXR1cmVUeXBlOworICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMgPSBjbGFzc1R5cGUuZ2V0VHlwZUFyZ3VtZW50cygpID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IEFycmF5cy5zdHJlYW0oY2xhc3NUeXBlLmdldFR5cGVBcmd1bWVudHMoKSkubWFwKHRhIC0+IHR5cGVBcmd1bWVudFRvVHlwZSh0YSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgIGNsYXNzVHlwZS5nZXREZWNsYXJpbmdDbGFzcygpICE9IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzVHlwZS5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSArICIuIiArIGNsYXNzVHlwZS5nZXROYW1lKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzVHlwZS5nZXROYW1lKCk7CisgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0eXBlU29sdmVyLnNvbHZlVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVHlwZUFyZ3VtZW50cyhpbnRlcm5hbE5hbWVUb0Nhbm9uaWNhbE5hbWUodHlwZU5hbWUpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVEZWNsYXJhdGlvbiwgdHlwZUFyZ3VtZW50cywgdHlwZVNvbHZlcik7CisgICAgICAgIH0gZWxzZSBpZiAoc2lnbmF0dXJlVHlwZSBpbnN0YW5jZW9mIFNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlVmFyaWFibGUpIHsKKyAgICAgICAgICAgIFNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlU2lnbmF0dXJlID0gKFNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlVmFyaWFibGUpc2lnbmF0dXJlVHlwZTsKKyAgICAgICAgICAgIE9wdGlvbmFsPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb25PcHQgPSB0eXBlUGFyYW1ldHJpemFibGUuZmluZFR5cGVQYXJhbWV0ZXIodHlwZVZhcmlhYmxlU2lnbmF0dXJlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbk9wdC5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbigiVW5hYmxlIHRvIHNvbHZlIFR5cGVWYXJpYWJsZSAiICsgdHlwZVZhcmlhYmxlU2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9IHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbk9wdC5nZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaWduYXR1cmVUeXBlIGluc3RhbmNlb2YgU2lnbmF0dXJlQXR0cmlidXRlLkFycmF5VHlwZSkgeworICAgICAgICAgICAgU2lnbmF0dXJlQXR0cmlidXRlLkFycmF5VHlwZSBhcnJheVR5cGUgPSAoU2lnbmF0dXJlQXR0cmlidXRlLkFycmF5VHlwZSkgc2lnbmF0dXJlVHlwZTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRBcnJheVR5cGUoc2lnbmF0dXJlVHlwZVRvVHlwZShhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCB0eXBlU29sdmVyLCB0eXBlUGFyYW1ldHJpemFibGUpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaWduYXR1cmVUeXBlIGluc3RhbmNlb2YgU2lnbmF0dXJlQXR0cmlidXRlLkJhc2VUeXBlKSB7CisgICAgICAgICAgICBTaWduYXR1cmVBdHRyaWJ1dGUuQmFzZVR5cGUgYmFzZVR5cGUgPSAoU2lnbmF0dXJlQXR0cmlidXRlLkJhc2VUeXBlKSBzaWduYXR1cmVUeXBlOworICAgICAgICAgICAgaWYgKGJhc2VUeXBlLnRvU3RyaW5nKCkuZXF1YWxzKCJ2b2lkIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ieU5hbWUoYmFzZVR5cGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzaWduYXR1cmVUeXBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlVHlwZUFyZ3VtZW50cyhTdHJpbmcgdHlwZU5hbWUpIHsKKyAgICAgICAgaWYgKHR5cGVOYW1lLmNvbnRhaW5zKCI8IikpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUuaW5kZXhPZignPCcpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBpbnRlcm5hbE5hbWVUb0Nhbm9uaWNhbE5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisgICAgICAgIHJldHVybiB0eXBlTmFtZS5yZXBsYWNlQWxsKCJcXCQiLCAiLiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc29sdmVkVHlwZSBvYmplY3RUeXBlQXJndW1lbnRUb1R5cGUoU2lnbmF0dXJlQXR0cmlidXRlLk9iamVjdFR5cGUgdHlwZUFyZ3VtZW50LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIHR5cGVQYXJhbWV0cml6YWJsZSkgeworICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0eXBlQXJndW1lbnQuanZtVHlwZU5hbWUoKTsKKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiB0eXBlID0gZ2V0R2VuZXJpY1BhcmFtZXRlckJ5TmFtZSh0eXBlTmFtZSwgdHlwZVBhcmFtZXRyaXphYmxlKTsKKyAgICAgICAgcmV0dXJuIHR5cGUub3JFbHNlR2V0KCgpIC0+IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgIHR5cGVTb2x2ZXIuc29sdmVUeXBlKHJlbW92ZVR5cGVBcmd1bWVudHMoaW50ZXJuYWxOYW1lVG9DYW5vbmljYWxOYW1lKHR5cGVOYW1lKSkpLAorICAgICAgICAgICAgdHlwZVNvbHZlcikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gZ2V0R2VuZXJpY1BhcmFtZXRlckJ5TmFtZShTdHJpbmcgdHlwZU5hbWUsIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIHR5cGVQYXJhbWV0cml6YWJsZSkgeworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHAgPSB0eXBlUGFyYW1ldHJpemFibGUuZmluZFR5cGVQYXJhbWV0ZXIodHlwZU5hbWUpOworICAgICAgICByZXR1cm4gdHAubWFwKFJlc29sdmVkVHlwZVZhcmlhYmxlOjpuZXcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc29sdmVkVHlwZSB0eXBlQXJndW1lbnRUb1R5cGUoU2lnbmF0dXJlQXR0cmlidXRlLlR5cGVBcmd1bWVudCB0eXBlQXJndW1lbnQsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGUgdHlwZVBhcmFtZXRyaXphYmxlKSB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnQuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50LmdldFR5cGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuVU5CT1VOREVEOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQXJndW1lbnQuZ2V0S2luZCgpID09ICcrJykgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZChvYmplY3RUeXBlQXJndW1lbnRUb1R5cGUodHlwZUFyZ3VtZW50LmdldFR5cGUoKSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBcmd1bWVudC5nZXRLaW5kKCkgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuc3VwZXJCb3VuZChvYmplY3RUeXBlQXJndW1lbnRUb1R5cGUodHlwZUFyZ3VtZW50LmdldFR5cGUoKSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdFR5cGVBcmd1bWVudFRvVHlwZSh0eXBlQXJndW1lbnQuZ2V0VHlwZSgpLCB0eXBlU29sdmVyLCB0eXBlUGFyYW1ldHJpemFibGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL3BhY2thZ2UtaW5mby5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTJmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgbW9kZWwgYmFzZWQgb24gSmF2YXNzaXN0LgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWw7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vTGF6eVR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL0xhenlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkYmRlYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL0xhenlUeXBlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworcHVibGljIGNsYXNzIExhenlUeXBlIGltcGxlbWVudHMgUmVzb2x2ZWRUeXBlIHsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBjb25jcmV0ZTsKKyAgICBwcml2YXRlIEZ1bmN0aW9uPFZvaWQsIFJlc29sdmVkVHlwZT4gcHJvdmlkZXI7CisKKyAgICBwdWJsaWMgTGF6eVR5cGUoRnVuY3Rpb248Vm9pZCwgUmVzb2x2ZWRUeXBlPiBwcm92aWRlcikgeworICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgaWYgKGNvbmNyZXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmNyZXRlID0gcHJvdmlkZXIuYXBwbHkobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuaXNBcnJheSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgYXJyYXlMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5hcnJheUxldmVsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuaXNQcmltaXRpdmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuaXNOdWxsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuaXNSZWZlcmVuY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuaXNSZWZlcmVuY2VUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2lkKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLmlzVm9pZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZVZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLmlzVHlwZVZhcmlhYmxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXaWxkY2FyZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5pc1dpbGRjYXJkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkQXJyYXlUeXBlIGFzQXJyYXlUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLmFzQXJyYXlUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGFzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5hc1R5cGVQYXJhbWV0ZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlVmFyaWFibGUgYXNUeXBlVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkuYXNUeXBlVmFyaWFibGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRQcmltaXRpdmVUeXBlIGFzUHJpbWl0aXZlKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLmFzUHJpbWl0aXZlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkV2lsZGNhcmQgYXNXaWxkY2FyZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5hc1dpbGRjYXJkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBkZXNjcmliZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5kZXNjcmliZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgcmVwbGFjZVR5cGVWYXJpYWJsZXMoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAsIFJlc29sdmVkVHlwZSByZXBsYWNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPiBpbmZlcnJlZFR5cGVzKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCkucmVwbGFjZVR5cGVWYXJpYWJsZXModHAsIHJlcGxhY2VkLCBpbmZlcnJlZFR5cGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHJlcGxhY2VUeXBlVmFyaWFibGVzKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwLCBSZXNvbHZlZFR5cGUgcmVwbGFjZWQpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgcmVwbGFjZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSBvdGhlcikgeworICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLmlzQXNzaWduYWJsZUJ5KG90aGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9SZWZlcmVuY2VUeXBlSW1wbC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vUmVmZXJlbmNlVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjcyNTNlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vUmVmZXJlbmNlVHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVRyYW5zZm9ybWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLnBhcmFtZXRyaXphdGlvbi5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJzTWFwOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkxhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworLy8gVE9ETyBSZW1vdmUgcmVmZXJlbmNlcyB0byB0eXBlU29sdmVyOiBpdCBpcyBuZWVkZWQgdG8gaW5zdGFudGlhdGUgb3RoZXIgaW5zdGFuY2VzIG9mIFJlZmVyZW5jZVR5cGVVc2FnZQorLy8gICAgICBhbmQgdG8gZ2V0IHRoZSBPYmplY3QgdHlwZSBkZWNsYXJhdGlvbgorcHVibGljIGNsYXNzIFJlZmVyZW5jZVR5cGVJbXBsIGV4dGVuZHMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgdW5kZXRlcm1pbmVkUGFyYW1ldGVycyhSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVEZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKAorICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZVZhcmlhYmxlOjpuZXcKKyAgICAgICAgKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGNyZWF0ZShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVyc0NvcnJlY3RlZCkgeworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVEZWNsYXJhdGlvbiwgdHlwZVBhcmFtZXRlcnNDb3JyZWN0ZWQsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgY3JlYXRlKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGVJbXBsKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHN1cGVyKHR5cGVEZWNsYXJhdGlvbik7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGVJbXBsKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVBcmd1bWVudHMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBzdXBlcih0eXBlRGVjbGFyYXRpb24sIHR5cGVBcmd1bWVudHMpOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBhc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uIGphdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24pIHRoaXMudHlwZURlY2xhcmF0aW9uOworICAgICAgICAgICAgcmV0dXJuIGphdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbi5hc1R5cGVQYXJhbWV0ZXIoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24odGhpcy50eXBlRGVjbGFyYXRpb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBUaGlzVHlwZSB0ID0gbmV3IE90aGVyVHlwZSgpIHdvdWxkIGNvbXBpbGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIE51bGxUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNQcmltaXRpdmUoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBldmVyeXRoaW5nIGlzIGFzc2lnbmFibGUgdG8gT2JqZWN0IGV4Y2VwdCB2b2lkCisgICAgICAgIGlmICghb3RoZXIuaXNWb2lkKCkgJiYgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25zaWRlciBib3hpbmcKKyAgICAgICAgaWYgKG90aGVyLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgJ290aGVyJyBjYW4gYmUgYm94ZWQgdG8gbWF0Y2ggdGhpcyB0eXBlCisgICAgICAgICAgICAgICAgaWYgKGlzQ29ycmVzcG9uZGluZ0JveGluZ1R5cGUob3RoZXIuZGVzY3JpYmUoKSkpIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgYm94ZWQgdHlwZSBhbmQgY2hlY2sgaWYgaXQgY2FuIGJlIGFzc2lnbmVkIHZpYSB3aWRlbmluZyByZWZlcmVuY2UgY29udmVyc2lvbgorICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHlwZSA9IHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUob3RoZXIuYXNQcmltaXRpdmUoKS5nZXRCb3hUeXBlUU5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuY2FuQmVBc3NpZ25lZFRvKHN1cGVyLnR5cGVEZWNsYXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWNsYXJhdGlvbigpLmhhc0Fubm90YXRpb24oRnVuY3Rpb25hbEludGVyZmFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKG90aGVyIGluc3RhbmNlb2YgUmVmZXJlbmNlVHlwZUltcGwpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIG90aGVyUmVmID0gKFJlZmVyZW5jZVR5cGVJbXBsKSBvdGhlcjsKKyAgICAgICAgICAgIGlmIChjb21wYXJlQ29uc2lkZXJpbmdUeXBlUGFyYW1ldGVycyhvdGhlclJlZikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIG90aGVyQW5jZXN0b3IgOiBvdGhlclJlZi5nZXRBbGxBbmNlc3RvcnMoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb21wYXJlQ29uc2lkZXJpbmdUeXBlUGFyYW1ldGVycyhvdGhlckFuY2VzdG9yKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAob3RoZXIuaXNUeXBlVmFyaWFibGUoKSkgeworICAgICAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZCBib3VuZCA6IG90aGVyLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYm91bmQuaXNFeHRlbmRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBc3NpZ25hYmxlQnkoYm91bmQuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAob3RoZXIuaXNDb25zdHJhaW50KCkpeworICAgICAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZUJ5KG90aGVyLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvdGhlci5pc1dpbGRjYXJkKCkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3RoZXIuYXNXaWxkY2FyZCgpLmlzRXh0ZW5kcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZUJ5KG90aGVyLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxNZXRob2RVc2FnZT4gZ2V0RGVjbGFyZWRNZXRob2RzKCkgeworICAgICAgICAvLyBUT0RPIHJlcGxhY2UgdmFyaWFibGVzCisgICAgICAgIFNldDxNZXRob2RVc2FnZT4gbWV0aG9kcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gbmV3IE1ldGhvZFVzYWdlKG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZFVzYWdlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIHRvUmF3VHlwZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNSYXdUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG1lbnRpb24oTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc3RyZWFtKCkuYW55TWF0Y2godHAgLT4gdHAubWVudGlvbih0eXBlUGFyYW1ldGVycykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSB0cmFuc2Zvcm1hdGlvbiBvbiBhbGwgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSB0cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyhSZXNvbHZlZFR5cGVUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzdWx0ID0gdGhpczsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFJlc29sdmVkVHlwZSB0cCA6IHRoaXMudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHRyYW5zZm9ybWVkVHAgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0odHApOworICAgICAgICAgICAgLy8gSWRlbnRpdHkgY29tcGFyaXNvbiBvbiBwdXJwb3NlCisgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWRUcCAhPSB0cCkgeworICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVyc0NvcnJlY3RlZCA9IHJlc3VsdC5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpOworICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzQ29ycmVjdGVkLnNldChpLCB0cmFuc2Zvcm1lZFRwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGUodHlwZURlY2xhcmF0aW9uLCB0eXBlUGFyYW1ldGVyc0NvcnJlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFsbEFuY2VzdG9ycygpIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBpbmhlcml0YW5jZSBsaW5lIGFuZCBwcm9wYWdhdGUgdGhlIHR5cGUgcGFyYW1ldGVzCisKKyAgICAgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGFuY2VzdG9ycyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKTsKKworICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKGEgLT4gdHlwZVBhcmFtZXRlcnNNYXAoKS5yZXBsYWNlQWxsKGEpLmFzUmVmZXJlbmNlVHlwZSgpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIC8vIEF2b2lkIHJlcGV0aXRpb25zIG9mIE9iamVjdAorICAgICAgICBhbmNlc3RvcnMucmVtb3ZlSWYoYSAtPiBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvYmplY3RUeXBlID0gdHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvYmplY3RSZWYgPSBjcmVhdGUob2JqZWN0VHlwZSk7CisgICAgICAgIGFuY2VzdG9ycy5hZGQob2JqZWN0UmVmKTsKKyAgICAgICAgcmV0dXJuIGFuY2VzdG9yczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGRlcml2ZVR5cGVQYXJhbWV0ZXJzKFJlc29sdmVkVHlwZVBhcmFtZXRlcnNNYXAgdHlwZVBhcmFtZXRlcnNNYXApIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSh0eXBlRGVjbGFyYXRpb24sIHR5cGVQYXJhbWV0ZXJzTWFwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvTXlPYmplY3RQcm92aWRlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9NeU9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljYmVhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvTXlPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuT2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIE15T2JqZWN0UHJvdmlkZXIgaW1wbGVtZW50cyBPYmplY3RQcm92aWRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE15T2JqZWN0UHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTXlPYmplY3RQcm92aWRlcigpOworCisgICAgcHJpdmF0ZSBNeU9iamVjdFByb3ZpZGVyKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIG9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGJ5TmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdHlwZVNvbHZlci5zb2x2ZVR5cGUocXVhbGlmaWVkTmFtZSk7CisgICAgICAgIGlmICghdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTdiZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLk51bGxUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworY2xhc3MgUmVmbGVjdGlvbkNsYXNzQWRhcHRlciB7CisKKyAgICBwcml2YXRlIENsYXNzPD8+IGNsYXp6OworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOworCisgICAgcHVibGljIFJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIoQ2xhc3M8Pz4gY2xhenosIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy50eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb247CisgICAgfQorCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGVJbXBsIGdldFN1cGVyQ2xhc3MoKSB7CisgICAgICAgIGlmIChjbGF6ei5nZXRHZW5lcmljU3VwZXJjbGFzcygpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgc3VwZXJUeXBlID0gY2xhenouZ2V0R2VuZXJpY1N1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cGVyVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbWV0ZXJpemVkVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSkgc3VwZXJUeXBlOworICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbWV0ZXJzID0gQXJyYXlzLnN0cmVhbShwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoKHQpIC0+IFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcih0LCB0eXBlU29sdmVyKSkKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihjbGF6ei5nZXRTdXBlcmNsYXNzKCksIHR5cGVTb2x2ZXIpLCB0eXBlUGFyYW1ldGVycywgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oY2xhenouZ2V0U3VwZXJjbGFzcygpLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRJbnRlcmZhY2VzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGphdmEubGFuZy5yZWZsZWN0LlR5cGUgc3VwZXJJbnRlcmZhY2UgOiBjbGF6ei5nZXRHZW5lcmljSW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICBpZiAoc3VwZXJJbnRlcmZhY2UgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBzdXBlckludGVyZmFjZTsKKyAgICAgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtZXRlcnMgPSBBcnJheXMuc3RyZWFtKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHQpIC0+IFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcih0LCB0eXBlU29sdmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKChDbGFzczw/PikgKChQYXJhbWV0ZXJpemVkVHlwZSkgc3VwZXJJbnRlcmZhY2UpLmdldFJhd1R5cGUoKSwgdHlwZVNvbHZlciksIHR5cGVQYXJhbWV0ZXJzLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKChDbGFzczw/Pikgc3VwZXJJbnRlcmZhY2UsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGlmIChnZXRTdXBlckNsYXNzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgUmVmZXJlbmNlVHlwZUltcGwgc3VwZXJDbGFzcyA9IGdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgICAgIGFuY2VzdG9ycy5hZGQoc3VwZXJDbGFzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZWZlcmVuY2VUeXBlSW1wbCBvYmplY3QgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChvYmplY3QpOworICAgICAgICB9CisgICAgICAgIGFuY2VzdG9ycy5hZGRBbGwoZ2V0SW50ZXJmYWNlcygpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbmNlc3RvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoYW5jZXN0b3IuaGFzTmFtZSgpICYmIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBhbmNlc3RvcnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5jZXN0b3JzOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gZ2V0RmllbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbihmaWVsZCwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgOiB0eXBlRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkpIHsKKyAgICAgICAgICAgIGlmIChhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5oYXNGaWVsZChuYW1lKSkgeworICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25GaWVsZERlY2xhcmF0aW9uIHJlZmxlY3Rpb25GaWVsZERlY2xhcmF0aW9uID0gKFJlZmxlY3Rpb25GaWVsZERlY2xhcmF0aW9uKSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24ucmVwbGFjZVR5cGUoYW5jZXN0b3IuZ2V0RmllbGRUeXBlKG5hbWUpLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24obmFtZSwgIkZpZWxkIGluICIgKyB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSZWZlcmVuY2VUeXBlSW1wbCBzdXBlcmNsYXNzID0gZ2V0U3VwZXJDbGFzcygpOworICAgICAgICBpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXJjbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKS5oYXNGaWVsZChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gZ2V0QWxsRmllbGRzKCkgeworICAgICAgICBBcnJheUxpc3Q8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgIGZpZWxkcy5hZGQobmV3IFJlZmxlY3Rpb25GaWVsZERlY2xhcmF0aW9uKGZpZWxkLCB0eXBlU29sdmVyKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgOiB0eXBlRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkpIHsKKyAgICAgICAgICAgIGZpZWxkcy5hZGRBbGwoYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0QWxsRmllbGRzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiAhbS5pc1N5bnRoZXRpYygpICYmICFtLmlzQnJpZGdlKCkpCisgICAgICAgICAgICAgICAgLm1hcChtIC0+IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcikpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFR5cGVWYXJpYWJsZTw/PiB0diA6IHRoaXMuY2xhenouZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgcGFyYW1zLmFkZChuZXcgUmVmbGVjdGlvblR5cGVQYXJhbWV0ZXIodHYsIHRydWUsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgTnVsbFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUuZGVzY3JpYmUoKS5lcXVhbHModHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVmZXJlbmNlVHlwZUltcGwpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIG90aGVyVHlwZURlY2xhcmF0aW9uID0gKFJlZmVyZW5jZVR5cGVJbXBsKSB0eXBlOworICAgICAgICAgICAgcmV0dXJuIG90aGVyVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLmNhbkJlQXNzaWduZWRUbyh0eXBlRGVjbGFyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0RpcmVjdGx5QW5ub3RhdGlvbihTdHJpbmcgY2Fub25pY2FsTmFtZSkgeworICAgICAgICBmb3IgKEFubm90YXRpb24gYSA6IGNsYXp6LmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUoKS5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZCh0eXBlRGVjbGFyYXRpb24pLmlzUHJlc2VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gZ2V0Q29uc3RydWN0b3JzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKSkKKyAgICAgICAgICAgICAgICAubWFwKG0gLT4gbmV3IFJlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKG0sIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT3B0aW9uYWw8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGNvbnRhaW5lclR5cGUoKSB7CisgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gY2xhenouZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgcmV0dXJuIGRlY2xhcmluZ0NsYXNzID09IG51bGwgPworICAgICAgICAgICAgICAgIE9wdGlvbmFsLmVtcHR5KCkgOgorICAgICAgICAgICAgICAgIE9wdGlvbmFsLm9mKFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVEZWNsYXJhdGlvbkZvcihkZWNsYXJpbmdDbGFzcywgdHlwZVNvbHZlcikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTMzNTNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQ29udGV4dEhlbHBlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkFic3RyYWN0Q2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5jb21wYXJhdG9ycy5NZXRob2RDb21wYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbiBleHRlbmRzIEFic3RyYWN0Q2xhc3NEZWNsYXJhdGlvbiB7CisKKyAgICAvLy8KKyAgICAvLy8gRmllbGRzCisgICAgLy8vCisKKyAgICBwcml2YXRlIENsYXNzPD8+IGNsYXp6OworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgUmVmbGVjdGlvbkNsYXNzQWRhcHRlciByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyOworCisgICAgLy8vCisgICAgLy8vIENvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgcHVibGljIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKENsYXNzPD8+IGNsYXp6LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzIHNob3VsZCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzcyBzaG91bGQgbm90IGJlIGFuIGludGVyZmFjZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGF6ei5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzcyBzaG91bGQgbm90IHJlcHJlc2VudCBhIHByaW1pdGl2ZSBjbGFzcyIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGF6ei5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzIHNob3VsZCBub3QgYmUgYW4gYXJyYXkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhenouaXNFbnVtKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzIHNob3VsZCBub3QgYmUgYW4gZW51bSIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5yZWZsZWN0aW9uQ2xhc3NBZGFwdGVyID0gbmV3IFJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIoY2xhenosIHR5cGVTb2x2ZXIsIHRoaXMpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQdWJsaWMgbWV0aG9kcworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QW5jZXN0b3JzKCkgeworICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbmNlc3RvcnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbiB0aGF0ID0gKFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKSBvOworCisgICAgICAgIGlmICghY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyh0aGF0LmNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY2xhenouaGFzaENvZGUoKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIGlmIChjbGF6ei5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBjYW5vbmljYWxOYW1lID0gY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgICAgICBpZiAoY2Fub25pY2FsTmFtZSAhPSBudWxsICYmIGdldFBhY2thZ2VOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbE5hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBjYW5vbmljYWxOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSkgeworICAgICAgICBMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgUHJlZGljYXRlPE1ldGhvZD4gc3RhdGljRmlsdGVyID0gbSAtPiAhc3RhdGljT25seSB8fCAoc3RhdGljT25seSAmJiBNb2RpZmllci5pc1N0YXRpYyhtLmdldE1vZGlmaWVycygpKSk7CisgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IEFycmF5cy5zdHJlYW0oY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpLmZpbHRlcigobSkgLT4gbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maWx0ZXIoc3RhdGljRmlsdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnRlZChuZXcgTWV0aG9kQ29tcGFyYXRvcigpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kLmlzQnJpZGdlKCkgfHwgbWV0aG9kLmlzU3ludGhldGljKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0U3VwZXJDbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBzdXBlckNsYXNzID0gKFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbikgZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZiA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShzdXBlckNsYXNzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGludGVyZmFjZURlY2xhcmF0aW9uIDogZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmID0gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBNZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKG1ldGhvZHMsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9ueyIgKworICAgICAgICAgICAgICAgICJjbGF6ej0iICsgZ2V0SWQoKSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VXNhZ2UoTm9kZSBub2RlKSB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0aGlzLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHNvbHZlTWV0aG9kQXNVc2FnZShTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQsIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVyVmFsdWVzKSB7CisgICAgICAgIExpc3Q8TWV0aG9kVXNhZ2U+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogQXJyYXlzLnN0cmVhbShjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkuZmlsdGVyKChtKSAtPiBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLnNvcnRlZChuZXcgTWV0aG9kQ29tcGFyYXRvcigpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kLmlzQnJpZGdlKCkgfHwgbWV0aG9kLmlzU3ludGhldGljKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gbmV3IE1ldGhvZFVzYWdlKG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgJiYgaSA8IHR5cGVQYXJhbWV0ZXJWYWx1ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cFRvUmVwbGFjZSA9IGdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KGkpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBuZXdWYWx1ZSA9IHR5cGVQYXJhbWV0ZXJWYWx1ZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gbWV0aG9kVXNhZ2UucmVwbGFjZVR5cGVQYXJhbWV0ZXIodHBUb1JlcGxhY2UsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZFVzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0U3VwZXJDbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBzdXBlckNsYXNzID0gKFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbikgZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpOworICAgICAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlZiA9IENvbnRleHRIZWxwZXIuc29sdmVNZXRob2RBc1VzYWdlKHN1cGVyQ2xhc3MsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCwgdHlwZVBhcmFtZXRlclZhbHVlcyk7CisgICAgICAgICAgICBpZiAocmVmLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQocmVmLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBpbnRlcmZhY2VEZWNsYXJhdGlvbiA6IGdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlZiA9IENvbnRleHRIZWxwZXIuc29sdmVNZXRob2RBc1VzYWdlKGludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJWYWx1ZXMpOworICAgICAgICAgICAgaWYgKHJlZi5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKHJlZi5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlZiA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGVVc2FnZShtZXRob2RzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcik7CisgICAgICAgIHJldHVybiByZWY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2FuQmVBc3NpZ25lZFRvKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIExhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbmFsSW50ZXJmYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuY2xhenouZ2V0U3VwZXJjbGFzcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oY2xhenouZ2V0U3VwZXJjbGFzcygpLCB0eXBlU29sdmVyKS5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENsYXNzPD8+IGludGVyZmF6ZSA6IGNsYXp6LmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgaWYgKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaXNBc3NpZ25hYmxlQnkodHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRGaWVsZChuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QWxsRmllbGRzKCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGNsYXp6LmdldEZpZWxkcygpKSB7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBSZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbihmaWVsZCwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNEaXJlY3RseUFubm90YXRpb24oU3RyaW5nIGNhbm9uaWNhbE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaGFzRGlyZWN0bHlBbm5vdGF0aW9uKGNhbm9uaWNhbE5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmhhc0ZpZWxkKG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIG90aGVyKSB7CisgICAgICAgIHJldHVybiBpc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZUltcGwob3RoZXIsIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGF6ei5nZXRTaW1wbGVOYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgeworICAgICAgICByZXR1cm4gIWNsYXp6LmlzSW50ZXJmYWNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlZmVyZW5jZVR5cGVJbXBsIGdldFN1cGVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldFN1cGVyQ2xhc3MoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEludGVyZmFjZXMoKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldEludGVyZmFjZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXp6LmlzSW50ZXJmYWNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRUeXBlUGFyYW1ldGVycygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyKCkgeworICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbCh0aGlzLmNsYXp6LmdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGdldENvbnN0cnVjdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0Q29uc3RydWN0b3JzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5jb250YWluZXJUeXBlKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGludGVybmFsVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKHRoaXMuY2xhenouZ2V0RGVjbGFyZWRDbGFzc2VzKCkpCisgICAgICAgICAgICAgICAgLm1hcChpYyAtPiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoaWMsIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFByb3RlY3RlZCBtZXRob2RzCisgICAgLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIG9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViMGM0MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGcmVkIExlZsOpdsOocmUtTGFvaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIFJlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yOworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihjb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFyYW1zKCkgeworICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyQ291bnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBnZXRQYXJhbShpbnQgaSkgeworICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBnZXROdW1iZXJPZlBhcmFtcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vIHBhcmFtIHdpdGggaW5kZXggJWQuIE51bWJlciBvZiBwYXJhbXM6ICVkIiwgaSwgZ2V0TnVtYmVyT2ZQYXJhbXMoKSkpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gdmFyaWFkaWMgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmlzVmFyQXJncygpKSB7CisgICAgICAgICAgICB2YXJpYWRpYyA9IGkgPT0gKGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlckNvdW50KCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3Rpb25QYXJhbWV0ZXJEZWNsYXJhdGlvbihjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpW2ldLCBjb25zdHJ1Y3Rvci5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKVtpXSwgdHlwZVNvbHZlciwgdmFyaWFkaWMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oY29uc3RydWN0b3IuZ2V0VHlwZVBhcmFtZXRlcnMoKSkubWFwKChyZWZUcCkgLT4gbmV3IFJlZmxlY3Rpb25UeXBlUGFyYW1ldGVyKHJlZlRwLCBmYWxzZSwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldEV4Y2VwdGlvblR5cGVzKCkubGVuZ3RoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0U3BlY2lmaWVkRXhjZXB0aW9uKGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGdldE51bWJlck9mU3BlY2lmaWVkRXhjZXB0aW9ucygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcih0aGlzLmNvbnN0cnVjdG9yLmdldEV4Y2VwdGlvblR5cGVzKClbaW5kZXhdLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3OTllOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkVudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkVudW1Db25zdGFudERlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIEZpZWxkIGVudW1Db25zdGFudDsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBSZWZsZWN0aW9uRW51bUNvbnN0YW50RGVjbGFyYXRpb24oRmllbGQgZW51bUNvbnN0YW50LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKCFlbnVtQ29uc3RhbnQuaXNFbnVtQ29uc3RhbnQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGdpdmVuIGZpZWxkIGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbnVtIGNvbnN0YW50Iik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5lbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnQ7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gZW51bUNvbnN0YW50LmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiNGJjMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkNvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbiB7CisKKyAgLy8vCisgIC8vLyBGaWVsZHMKKyAgLy8vCisKKyAgcHJpdmF0ZSBDbGFzczw/PiBjbGF6ejsKKyAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgIHByaXZhdGUgUmVmbGVjdGlvbkNsYXNzQWRhcHRlciByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyOworCisgIC8vLworICAvLy8gQ29uc3RydWN0b3JzCisgIC8vLworCisgIHB1YmxpYyBSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKENsYXNzPD8+IGNsYXp6LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3Mgc2hvdWxkIG5vdCBiZSBudWxsIik7CisgICAgfQorICAgIGlmIChjbGF6ei5pc0ludGVyZmFjZSgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzcyBzaG91bGQgbm90IGJlIGFuIGludGVyZmFjZSIpOworICAgIH0KKyAgICBpZiAoY2xhenouaXNQcmltaXRpdmUoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3Mgc2hvdWxkIG5vdCByZXByZXNlbnQgYSBwcmltaXRpdmUgY2xhc3MiKTsKKyAgICB9CisgICAgaWYgKGNsYXp6LmlzQXJyYXkoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3Mgc2hvdWxkIG5vdCBiZSBhbiBhcnJheSIpOworICAgIH0KKyAgICBpZiAoIWNsYXp6LmlzRW51bSgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzcyBzaG91bGQgYmUgYW4gZW51bSIpOworICAgIH0KKyAgICB0aGlzLmNsYXp6ID0gY2xheno7CisgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICB0aGlzLnJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIgPSBuZXcgUmVmbGVjdGlvbkNsYXNzQWRhcHRlcihjbGF6eiwgdHlwZVNvbHZlciwgdGhpcyk7CisgIH0KKworICAvLy8KKyAgLy8vIFB1YmxpYyBtZXRob2RzCisgIC8vLworCisgIEBPdmVycmlkZQorICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICByZXR1cm4gUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbCh0aGlzLmNsYXp6LmdldE1vZGlmaWVycygpKTsKKyAgfQorICAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmNvbnRhaW5lclR5cGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgIGlmIChjbGF6ei5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgIFN0cmluZyBjYW5vbmljYWxOYW1lID0gY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgIGlmIChjYW5vbmljYWxOYW1lICE9IG51bGwgJiYgZ2V0UGFja2FnZU5hbWUoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gY2Fub25pY2FsTmFtZS5zdWJzdHJpbmcoZ2V0UGFja2FnZU5hbWUoKS5sZW5ndGgoKSArIDEsIGNhbm9uaWNhbE5hbWUubGVuZ3RoKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgcmV0dXJuIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFuY2VzdG9ycygpIHsKKyAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbmNlc3RvcnMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RmllbGQobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5oYXNGaWVsZChuYW1lKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbGxGaWVsZHMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KHR5cGUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIG90aGVyKSB7CisgICAgcmV0dXJuIGlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbChvdGhlciwgdHlwZVNvbHZlcikpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGhhc0RpcmVjdGx5QW5ub3RhdGlvbihTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmhhc0RpcmVjdGx5QW5ub3RhdGlvbihxdWFsaWZpZWROYW1lKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKyAgfQorCisgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJUeXBlcywgYm9vbGVhbiBzdGF0aWNPbmx5KSB7CisgICAgcmV0dXJuIFJlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2QobmFtZSwgcGFyYW1ldGVyVHlwZXMsIHN0YXRpY09ubHksCisgICAgICAgICAgICB0eXBlU29sdmVyLHRoaXMsIGNsYXp6KTsKKyAgfQorCisgIHB1YmxpYyBPcHRpb25hbDxNZXRob2RVc2FnZT4gc29sdmVNZXRob2RBc1VzYWdlKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1ldGVyVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBpbnZva2F0aW9uQ29udGV4dCwgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbWV0ZXJWYWx1ZXMpIHsKKyAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gcmVzID0gUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgcGFyYW1ldGVyVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LAorICAgICAgICAgICAgdHlwZVBhcmFtZXRlclZhbHVlcywgdGhpcywgY2xhenopOworICAgIGlmIChyZXMuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgLy8gV2UgaGF2ZSB0byByZXBsYWNlIG1ldGhvZCB0eXBlIHR5cGVQYXJhbWV0ZXJzVmFsdWVzIGhlcmUKKyAgICAgICAgSW5mZXJlbmNlQ29udGV4dCBpbmZlcmVuY2VDb250ZXh0ID0gbmV3IEluZmVyZW5jZUNvbnRleHQoTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSk7CisgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gcmVzLmdldCgpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlIDogcGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgICBSZXNvbHZlZFR5cGUgZm9ybWFsVHlwZSA9IG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpKTsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgY2xhc3MgdHlwZSB0eXBlUGFyYW1ldGVyc1ZhbHVlcyAod2hpbGUgd2UgZGVyaXZlIHRoZSBtZXRob2Qgb25lcykKKworICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQoaW5mZXJlbmNlQ29udGV4dC5hZGRQYWlyKGZvcm1hbFR5cGUsIGFjdHVhbFR5cGUpKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgIFJlc29sdmVkVHlwZSByZXR1cm5UeXBlID0gaW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUobWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDtqPHBhcmFtZXRlcnMuc2l6ZSgpO2orKykgeworICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gbWV0aG9kVXNhZ2UucmVwbGFjZVBhcmFtVHlwZShqLCBpbmZlcmVuY2VDb250ZXh0LnJlc29sdmUocGFyYW1ldGVycy5nZXQoaikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gbWV0aG9kVXNhZ2UucmVwbGFjZVJldHVyblR5cGUoaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKHJldHVyblR5cGUpKTsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihtZXRob2RVc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKENvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxSZXNvbHZlZEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBnZXRFbnVtQ29uc3RhbnRzKCkgeworICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oY2xhenouZ2V0RmllbGRzKCkpCisgICAgICAgICAgICAgIC5maWx0ZXIoZiAtPiBmLmlzRW51bUNvbnN0YW50KCkpCisgICAgICAgICAgICAgIC5tYXAoYyAtPiBuZXcgUmVmbGVjdGlvbkVudW1Db25zdGFudERlY2xhcmF0aW9uKGMsIHR5cGVTb2x2ZXIpKQorICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRmFjdG9yeS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMGZjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGVWYXJpYWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uKjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFJlZmxlY3Rpb25GYWN0b3J5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uRm9yKENsYXNzPD8+IGNsYXp6LCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKGNsYXp6LmlzQXJyYXkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdHlwZSBkZWNsYXJhdGlvbiBhdmFpbGFibGUgZm9yIGFuIEFycmF5Iik7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhenouaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKGNsYXp6LCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGF6ei5pc0VudW0oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKGNsYXp6LCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oY2xhenosIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZFR5cGUgdHlwZVVzYWdlRm9yKGphdmEubGFuZy5yZWZsZWN0LlR5cGUgdHlwZSwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlKSB7CisgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5UeXBlVmFyaWFibGU8Pz4gdHYgPSAoamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlPD8+KSB0eXBlOworICAgICAgICAgICAgYm9vbGVhbiBkZWNsYXJlZE9uQ2xhc3MgPSB0di5nZXRHZW5lcmljRGVjbGFyYXRpb24oKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyID0gbmV3IFJlZmxlY3Rpb25UeXBlUGFyYW1ldGVyKHR2LCBkZWNsYXJlZE9uQ2xhc3MsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFR5cGVWYXJpYWJsZSh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlOworICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJhd1R5cGUgPSB0eXBlVXNhZ2VGb3IocHQuZ2V0UmF3VHlwZSgpLCB0eXBlU29sdmVyKS5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgIExpc3Q8amF2YS5sYW5nLnJlZmxlY3QuVHlwZT4gYWN0dWFsVHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGFjdHVhbFR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkpOworICAgICAgICAgICAgLy8gd2UgY29uc3VtZSB0aGUgYWN0dWFsIHR5cGVzCisgICAgICAgICAgICByYXdUeXBlID0gcmF3VHlwZS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiB0eXBlVXNhZ2VGb3IoYWN0dWFsVHlwZXMucmVtb3ZlKDApLCB0eXBlU29sdmVyKSkuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gcmF3VHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGMgPSAoQ2xhc3M8Pz4pIHR5cGU7CisgICAgICAgICAgICBpZiAoYy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMuZ2V0TmFtZSgpLmVxdWFscyhWb2lkLlRZUEUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRQcmltaXRpdmVUeXBlLmJ5TmFtZShjLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRBcnJheVR5cGUodHlwZVVzYWdlRm9yKGMuZ2V0Q29tcG9uZW50VHlwZSgpLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZURlY2xhcmF0aW9uRm9yKGMsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgeworICAgICAgICAgICAgR2VuZXJpY0FycmF5VHlwZSBnZW5lcmljQXJyYXlUeXBlID0gKEdlbmVyaWNBcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkQXJyYXlUeXBlKHR5cGVVc2FnZUZvcihnZW5lcmljQXJyYXlUeXBlLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgV2lsZGNhcmRUeXBlKSB7CisgICAgICAgICAgICBXaWxkY2FyZFR5cGUgd2lsZGNhcmRUeXBlID0gKFdpbGRjYXJkVHlwZSkgdHlwZTsKKyAgICAgICAgICAgIGlmICh3aWxkY2FyZFR5cGUuZ2V0TG93ZXJCb3VuZHMoKS5sZW5ndGggPiAwICYmIHdpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKCkubGVuZ3RoID09IDEgJiYgd2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKClbMF0uZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvaywgaXQgZG9lcyBub3QgbWF0dGVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpbGRjYXJkVHlwZS5nZXRMb3dlckJvdW5kcygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAod2lsZGNhcmRUeXBlLmdldExvd2VyQm91bmRzKCkubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuc3VwZXJCb3VuZCh0eXBlVXNhZ2VGb3Iod2lsZGNhcmRUeXBlLmdldExvd2VyQm91bmRzKClbMF0sIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWxkY2FyZFR5cGUuZ2V0VXBwZXJCb3VuZHMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZCh0eXBlVXNhZ2VGb3Iod2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKClbMF0sIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFdpbGRjYXJkLlVOQk9VTkRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0eXBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIiAiICsgdHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgQWNjZXNzU3BlY2lmaWVyIG1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoZmluYWwgaW50IG1vZGlmaWVycykgeworICAgICAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QVUJMSUM7CisgICAgICAgIH0gZWxzZSBpZiAoTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSkgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUk9URUNURUQ7CisgICAgICAgIH0gZWxzZSBpZiAoTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykpIHsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIuUFJJVkFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIuREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThhM2UwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiB7CisKKyAgICBwcml2YXRlIEZpZWxkIGZpZWxkOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHR5cGU7CisKKyAgICBwdWJsaWMgUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24oRmllbGQgZmllbGQsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgICAgIHRoaXMudHlwZSA9IGNhbGNUeXBlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbihGaWVsZCBmaWVsZCwgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBjYWxjVHlwZSgpIHsKKyAgICAgICAgLy8gVE9ETyBjb25zaWRlciBpbnRlcmZhY2VzLCBlbnVtcywgcHJpbWl0aXZlIHR5cGVzLCBhcnJheXMKKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihmaWVsZC5nZXRHZW5lcmljVHlwZSgpLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUoKSB7CisgICAgICAgIHJldHVybiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiByZXBsYWNlVHlwZShSZXNvbHZlZFR5cGUgZmllbGRUeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24oZmllbGQsIHR5cGVTb2x2ZXIsIGZpZWxkVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoZmllbGQuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTNlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkNvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTnVsbFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIHsKKworICAgIC8vLworICAgIC8vLyBGaWVsZHMKKyAgICAvLy8KKworICAgIHByaXZhdGUgQ2xhc3M8Pz4gY2xheno7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBSZWZsZWN0aW9uQ2xhc3NBZGFwdGVyIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXI7CisKKyAgICAvLy8KKyAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAvLy8KKworICAgIHB1YmxpYyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ2xhc3M8Pz4gY2xhenosIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAoIWNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5yZWZsZWN0aW9uQ2xhc3NBZGFwdGVyID0gbmV3IFJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIoY2xhenosIHR5cGVTb2x2ZXIsIHRoaXMpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQdWJsaWMgbWV0aG9kcworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbChvdGhlciwgdHlwZVNvbHZlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIGlmIChjbGF6ei5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBjYW5vbmljYWxOYW1lID0gY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgICAgICBpZiAoY2Fub25pY2FsTmFtZSAhPSBudWxsICYmIGdldFBhY2thZ2VOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbE5hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBjYW5vbmljYWxOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gcGFyYW1ldGVyVHlwZXMsIGJvb2xlYW4gc3RhdGljT25seSkgeworICAgICAgICByZXR1cm4gUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZChuYW1lLCBwYXJhbWV0ZXJUeXBlcywgc3RhdGljT25seSwKKyAgICAgICAgICAgICAgICB0eXBlU29sdmVyLHRoaXMsIGNsYXp6KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbnsiICsKKyAgICAgICAgICAgICAgICAiY2xheno9IiArIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VXNhZ2UoTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwodGhpcywgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbiB0aGF0ID0gKFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbikgbzsKKworICAgICAgICBpZiAoIWNsYXp6LmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHModGhhdC5jbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFnZXRUeXBlUGFyYW1ldGVycygpLmVxdWFscyh0aGF0LmdldFR5cGVQYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY2xhenouaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHNvbHZlTWV0aG9kQXNVc2FnZShTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtZXRlclR5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBpbnZva2F0aW9uQ29udGV4dCwgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVQYXJhbWV0ZXJWYWx1ZXMpIHsKKyAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlcyA9IFJlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIHBhcmFtZXRlclR5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCwKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyVmFsdWVzLCB0aGlzLCBjbGF6eik7CisgICAgICAgIGlmIChyZXMuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVwbGFjZSBtZXRob2QgdHlwZSB0eXBlUGFyYW1ldGVyc1ZhbHVlcyBoZXJlCisgICAgICAgICAgICBJbmZlcmVuY2VDb250ZXh0IGluZmVyZW5jZUNvbnRleHQgPSBuZXcgSW5mZXJlbmNlQ29udGV4dChNeU9iamVjdFByb3ZpZGVyLklOU1RBTkNFKTsKKyAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gcmVzLmdldCgpOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtZXRlcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlIDogcGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZm9ybWFsVHlwZSA9IG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlcGxhY2UgdGhlIGNsYXNzIHR5cGUgdHlwZVBhcmFtZXRlcnNWYWx1ZXMgKHdoaWxlIHdlIGRlcml2ZSB0aGUgbWV0aG9kIG9uZXMpCisKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChpbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoZm9ybWFsVHlwZSwgYWN0dWFsVHlwZSkpOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHJldHVyblR5cGUgPSBpbmZlcmVuY2VDb250ZXh0LmFkZFNpbmdsZShtZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDtqPHBhcmFtZXRlcnMuc2l6ZSgpO2orKykgeworICAgICAgICAgICAgICAgICAgICBtZXRob2RVc2FnZSA9IG1ldGhvZFVzYWdlLnJlcGxhY2VQYXJhbVR5cGUoaiwgaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKHBhcmFtZXRlcnMuZ2V0KGopKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlID0gbWV0aG9kVXNhZ2UucmVwbGFjZVJldHVyblR5cGUoaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKHJldHVyblR5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobWV0aG9kVXNhZ2UpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29uZmlsaWN0aW5nR2VuZXJpY1R5cGVzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5CZUFzc2lnbmVkVG8oUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhnZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jbGF6ei5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oY2xhenouZ2V0U3VwZXJjbGFzcygpLCB0eXBlU29sdmVyKS5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENsYXNzIGludGVyZmF6ZSA6IGNsYXp6LmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgaWYgKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBOdWxsVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBMYW1iZGFBcmd1bWVudFR5cGVQbGFjZWhvbGRlcikgeworICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb25hbEludGVyZmFjZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5kZXNjcmliZSgpLmVxdWFscyhnZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFJlZmVyZW5jZVR5cGVJbXBsKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VUeXBlSW1wbCBvdGhlclR5cGVEZWNsYXJhdGlvbiA9IChSZWZlcmVuY2VUeXBlSW1wbCkgdHlwZTsKKyAgICAgICAgICAgIHJldHVybiBvdGhlclR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVjbGFyYXRpb24oKS5jYW5CZUFzc2lnbmVkVG8odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRGaWVsZChuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QWxsRmllbGRzKCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGNsYXp6LmdldEZpZWxkcygpKSB7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBSZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbihmaWVsZCwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFuY2VzdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QW5jZXN0b3JzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBnZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmhhc0ZpZWxkKG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXp6LmdldFNpbXBsZU5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBnZXRJbnRlcmZhY2VzRXh0ZW5kZWQoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiByZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChDbGFzcyBpIDogY2xhenouZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICByZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKGksIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5jb250YWluZXJUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gaW50ZXJuYWxUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0odGhpcy5jbGF6ei5nZXREZWNsYXJlZENsYXNzZXMoKSkKKyAgICAgICAgICAgICAgICAubWFwKGljIC0+IFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVEZWNsYXJhdGlvbkZvcihpYywgdHlwZVNvbHZlcikpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiBhc0ludGVyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmhhc0RpcmVjdGx5QW5ub3RhdGlvbihjYW5vbmljYWxOYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBSZWZsZWN0aW9uRmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKHRoaXMuY2xhenouZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbk1ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDQ3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5kZWNsYXJhdGlvbnMuY29tbW9uLk1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgTWV0aG9kIG1ldGhvZDsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24oTWV0aG9kIG1ldGhvZCwgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICBpZiAobWV0aG9kLmlzU3ludGhldGljKCkgfHwgbWV0aG9kLmlzQnJpZGdlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb257IiArCisgICAgICAgICAgICAgICAgIm1ldGhvZD0iICsgbWV0aG9kICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGRlY2xhcmluZ1R5cGUoKSB7CisgICAgICAgIGlmIChtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmlzRW51bSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24obWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFJldHVyblR5cGUoKSB7CisgICAgICAgIHJldHVybiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IobWV0aG9kLmdldEdlbmVyaWNSZXR1cm5UeXBlKCksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQYXJhbXMoKSB7CisgICAgICAgIHJldHVybiBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24gZ2V0UGFyYW0oaW50IGkpIHsKKyAgICAgICAgYm9vbGVhbiB2YXJpYWRpYyA9IGZhbHNlOworICAgICAgICBpZiAobWV0aG9kLmlzVmFyQXJncygpKSB7CisgICAgICAgICAgICB2YXJpYWRpYyA9IGkgPT0gKG1ldGhvZC5nZXRQYXJhbWV0ZXJDb3VudCgpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aW9uUGFyYW1ldGVyRGVjbGFyYXRpb24obWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbaV0sIG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKVtpXSwgdHlwZVNvbHZlciwgdmFyaWFkaWMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0obWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCkpLm1hcCgocmVmVHApIC0+IG5ldyBSZWZsZWN0aW9uVHlwZVBhcmFtZXRlcihyZWZUcCwgZmFsc2UsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RVc2FnZSByZXNvbHZlVHlwZVZhcmlhYmxlcyhDb250ZXh0IGNvbnRleHQsIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWModGhpcywgdHlwZVNvbHZlcikucmVzb2x2ZVR5cGVWYXJpYWJsZXMoY29udGV4dCwgcGFyYW1ldGVyVHlwZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisgICAgICAgIHJldHVybiBNb2RpZmllci5pc0Fic3RyYWN0KG1ldGhvZC5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLmlzRGVmYXVsdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjZXNzU3BlY2lmaWVyIGFjY2Vzc1NwZWNpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwodGhpcy5tZXRob2QuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRTcGVjaWZpZWRFeGNlcHRpb24oaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZ2V0TnVtYmVyT2ZTcGVjaWZpZWRFeGNlcHRpb25zKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKHRoaXMubWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKClbaW5kZXhdLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjM5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitjbGFzcyBSZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljIHsKKworICAgIHN0YXRpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBwYXJhbWV0ZXJUeXBlcywgYm9vbGVhbiBzdGF0aWNPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBzY29wZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eil7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBQcmVkaWNhdGU8TWV0aG9kPiBzdGF0aWNPbmx5Q2hlY2sgPSBtIC0+ICFzdGF0aWNPbmx5IHx8IChzdGF0aWNPbmx5ICYmIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpKTsKKyAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogY2xhenouZ2V0TWV0aG9kcygpKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kLmlzQnJpZGdlKCkgfHwgbWV0aG9kLmlzU3ludGhldGljKCkgfHwgIW1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpfHwgIXN0YXRpY09ubHlDaGVjay50ZXN0KG1ldGhvZCkpIGNvbnRpbnVlOworICAgICAgICAgICAgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yIDogc2NvcGVUeXBlLmdldEFuY2VzdG9ycygpKSB7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmID0gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBwYXJhbWV0ZXJUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjb3BlVHlwZS5nZXRBbmNlc3RvcnMoKS5pc0VtcHR5KCkpeworICAgICAgICAgICAgUmVmZXJlbmNlVHlwZUltcGwgb2JqZWN0Q2xhc3MgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZiA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShvYmplY3RDbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgcGFyYW1ldGVyVHlwZXMsIHN0YXRpY09ubHksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShtZXRob2RzLCBuYW1lLCBwYXJhbWV0ZXJUeXBlcywgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgc3RhdGljIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBzb2x2ZU1ldGhvZEFzVXNhZ2UoU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgaW52b2thdGlvbkNvbnRleHQsIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlUGFyYW1ldGVyVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHNjb3BlVHlwZSwgQ2xhc3MgY2xhenopIHsKKyAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJWYWx1ZXMuc2l6ZSgpICE9IHNjb3BlVHlwZS5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSkgeworICAgICAgICAgICAgLy8gaWYgaXQgaXMgemVybyB3ZSBhcmUgZ29pbmcgdG8gaWdub3JlIHRoZW0KKyAgICAgICAgICAgIGlmICghc2NvcGVUeXBlLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVycyBub3Qgc3BlY2lmaWVkLCBzbyBkZWZhdWx0IHRvIE9iamVjdAorICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlVHlwZS5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJWYWx1ZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMaXN0PE1ldGhvZFVzYWdlPiBtZXRob2RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGNsYXp6LmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpICYmICFtZXRob2QuaXNCcmlkZ2UoKSAmJiAhbWV0aG9kLmlzU3ludGhldGljKCkpIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gbmV3IFJlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvbihtZXRob2QsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gcmVwbGFjZVBhcmFtcyh0eXBlUGFyYW1ldGVyVmFsdWVzLCBzY29wZVR5cGUsIG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2RVc2FnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGZvcihSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgOiBzY29wZVR5cGUuZ2V0QW5jZXN0b3JzKCkpeworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZiA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKXsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiA9IHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9IHJlcGxhY2VQYXJhbXModHlwZVBhcmFtZXRlclZhbHVlcywgYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCksIGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbik7CisgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kVXNhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjb3BlVHlwZS5nZXRBbmNlc3RvcnMoKS5pc0VtcHR5KCkpeworICAgICAgICAgICAgUmVmZXJlbmNlVHlwZUltcGwgb2JqZWN0Q2xhc3MgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZiA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShvYmplY3RDbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgTWV0aG9kVXNhZ2UgdXNhZ2UgPSByZXBsYWNlUGFyYW1zKHR5cGVQYXJhbWV0ZXJWYWx1ZXMsIG9iamVjdENsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKHVzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExpc3Q8UmVzb2x2ZWRUeXBlPiBmaW5hbFR5cGVQYXJhbWV0ZXJWYWx1ZXMgPSB0eXBlUGFyYW1ldGVyVmFsdWVzOworICAgICAgICBhcmd1bWVudHNUeXBlcyA9IGFyZ3VtZW50c1R5cGVzLnN0cmVhbSgpLm1hcCgocHQpIC0+IHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiBzY29wZVR5cGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgIHB0ID0gcHQucmVwbGFjZVR5cGVWYXJpYWJsZXModHAsIGZpbmFsVHlwZVBhcmFtZXRlclZhbHVlcy5nZXQoaSkpOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwdDsKKyAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgcmV0dXJuIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGVVc2FnZShtZXRob2RzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kVXNhZ2UgcmVwbGFjZVBhcmFtcyhMaXN0PFJlc29sdmVkVHlwZT4gdHlwZVBhcmFtZXRlclZhbHVlcywgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRyaXphYmxlLCBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7CisgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gbmV3IE1ldGhvZFVzYWdlKG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgIC8vIE9ubHkgcmVwbGFjZSBpZiB3ZSBoYXZlIGVub3VnaCB2YWx1ZXMgcHJvdmlkZWQKKyAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJWYWx1ZXMuc2l6ZSgpID09IHR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSl7CisgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwIDogdHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RVc2FnZSA9IG1ldGhvZFVzYWdlLnJlcGxhY2VUeXBlUGFyYW1ldGVyKHRwLCB0eXBlUGFyYW1ldGVyVmFsdWVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBtZXRob2RUeXBlUGFyYW1ldGVyIDogbWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgbWV0aG9kVXNhZ2UgPSBtZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcihtZXRob2RUeXBlUGFyYW1ldGVyLCBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUobWV0aG9kVHlwZVBhcmFtZXRlcikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZFVzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvblBhcmFtZXRlckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25QYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWU5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25QYXJhbWV0ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvblBhcmFtZXRlckRlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiB7CisgICAgcHJpdmF0ZSBDbGFzczw/PiB0eXBlOworICAgIHByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSBnZW5lcmljVHlwZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmFyaWFkaWM7CisKKyAgICBwdWJsaWMgUmVmbGVjdGlvblBhcmFtZXRlckRlY2xhcmF0aW9uKENsYXNzPD8+IHR5cGUsIGphdmEubGFuZy5yZWZsZWN0LlR5cGUgZ2VuZXJpY1R5cGUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgYm9vbGVhbiB2YXJpYWRpYykgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmdlbmVyaWNUeXBlID0gZ2VuZXJpY1R5cGU7CisgICAgICAgIHRoaXMudHlwZVNvbHZlciA9IHR5cGVTb2x2ZXI7CisgICAgICAgIHRoaXMudmFyaWFkaWMgPSB2YXJpYWRpYzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiUmVmbGVjdGlvblBhcmFtZXRlckRlY2xhcmF0aW9ueyIgKworICAgICAgICAgICAgICAgICJ0eXBlPSIgKyB0eXBlICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhZGljKCkgeworICAgICAgICByZXR1cm4gdmFyaWFkaWM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKGdlbmVyaWNUeXBlLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25UeXBlUGFyYW1ldGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25UeXBlUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzMmVkNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvblR5cGVQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2RMaWtlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldHJpemFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljRGVjbGFyYXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVHlwZVBhcmFtZXRlciBpbXBsZW1lbnRzIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHsKKworICAgIHByaXZhdGUgVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZTsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYyBSZWZsZWN0aW9uVHlwZVBhcmFtZXRlcihUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlLCBib29sZWFuIGRlY2xhcmVkT25DbGFzcywgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIEdlbmVyaWNEZWNsYXJhdGlvbiBnZW5lcmljRGVjbGFyYXRpb24gPSB0eXBlVmFyaWFibGUuZ2V0R2VuZXJpY0RlY2xhcmF0aW9uKCk7CisgICAgICAgIGlmIChnZW5lcmljRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgY29udGFpbmVyID0gUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKChDbGFzcykgZ2VuZXJpY0RlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZW5lcmljRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2QpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lciA9IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24oKE1ldGhvZCkgZ2VuZXJpY0RlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZW5lcmljRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgY29udGFpbmVyID0gbmV3IFJlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKChDb25zdHJ1Y3RvcikgZ2VuZXJpY0RlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnR5cGVWYXJpYWJsZSA9IHR5cGVWYXJpYWJsZTsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0aGF0ID0gKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSBvOworCisgICAgICAgIGlmICghZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGF0LmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVjbGFyZWRPblR5cGUoKSAhPSB0aGF0LmRlY2xhcmVkT25UeXBlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVjbGFyZWRPbk1ldGhvZCgpICE9IHRoYXQuZGVjbGFyZWRPbk1ldGhvZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBjaGVjayBib3VuZHMKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHR5cGVWYXJpYWJsZS5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGNvbnRhaW5lci5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVWYXJpYWJsZS5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lKCkgeworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc29sdmVkTWV0aG9kTGlrZURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXJJZCgpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRJZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb2x2ZWRNZXRob2RMaWtlRGVjbGFyYXRpb24pIGNvbnRhaW5lcikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRyaXphYmxlIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PEJvdW5kPiBnZXRCb3VuZHMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKHR5cGVWYXJpYWJsZS5nZXRCb3VuZHMoKSkubWFwKChyZWZCKSAtPiBCb3VuZC5leHRlbmRzQm91bmQoUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKHJlZkIsIHR5cGVTb2x2ZXIpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlJlZmxlY3Rpb25UeXBlUGFyYW1ldGVyeyIgKworICAgICAgICAgICAgICAgICJ0eXBlVmFyaWFibGU9IiArIHR5cGVWYXJpYWJsZSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSBjb250YWluZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvY29tcGFyYXRvcnMvQ2xhc3NDb21wYXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL2NvbXBhcmF0b3JzL0NsYXNzQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmMyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL2NvbXBhcmF0b3JzL0NsYXNzQ29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuY29tcGFyYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENsYXNzQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8Q2xhc3M8Pz4+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZShDbGFzczw/PiBvMSwgQ2xhc3M8Pz4gbzIpIHsKKyAgICAgICAgaW50IHN1YkNvbXBhcmU7CisgICAgICAgIHN1YkNvbXBhcmUgPSBvMS5nZXRDYW5vbmljYWxOYW1lKCkuY29tcGFyZVRvKG8yLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIGlmIChzdWJDb21wYXJlICE9IDApIHJldHVybiBzdWJDb21wYXJlOworICAgICAgICBzdWJDb21wYXJlID0gQm9vbGVhbi5jb21wYXJlKG8xLmlzQW5ub3RhdGlvbigpLCBvMi5pc0Fubm90YXRpb24oKSk7CisgICAgICAgIGlmIChzdWJDb21wYXJlICE9IDApIHJldHVybiBzdWJDb21wYXJlOworICAgICAgICBzdWJDb21wYXJlID0gQm9vbGVhbi5jb21wYXJlKG8xLmlzQXJyYXkoKSwgbzIuaXNBcnJheSgpKTsKKyAgICAgICAgaWYgKHN1YkNvbXBhcmUgIT0gMCkgcmV0dXJuIHN1YkNvbXBhcmU7CisgICAgICAgIHN1YkNvbXBhcmUgPSBCb29sZWFuLmNvbXBhcmUobzEuaXNFbnVtKCksIG8yLmlzRW51bSgpKTsKKyAgICAgICAgaWYgKHN1YkNvbXBhcmUgIT0gMCkgcmV0dXJuIHN1YkNvbXBhcmU7CisgICAgICAgIHN1YkNvbXBhcmUgPSBCb29sZWFuLmNvbXBhcmUobzEuaXNJbnRlcmZhY2UoKSwgbzIuaXNJbnRlcmZhY2UoKSk7CisgICAgICAgIGlmIChzdWJDb21wYXJlICE9IDApIHJldHVybiBzdWJDb21wYXJlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL2NvbXBhcmF0b3JzL01ldGhvZENvbXBhcmF0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvY29tcGFyYXRvcnMvTWV0aG9kQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmZjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL2NvbXBhcmF0b3JzL01ldGhvZENvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLmNvbXBhcmF0b3JzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWV0aG9kPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWV0aG9kIG8xLCBNZXRob2QgbzIpIHsKKyAgICAgICAgaW50IGNvbXBhcmVOYW1lID0gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOworICAgICAgICBpZiAoY29tcGFyZU5hbWUgIT0gMCkgcmV0dXJuIGNvbXBhcmVOYW1lOworICAgICAgICBpbnQgY29tcGFyZU5QYXJhbXMgPSBvMS5nZXRQYXJhbWV0ZXJDb3VudCgpIC0gbzIuZ2V0UGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgaWYgKGNvbXBhcmVOUGFyYW1zICE9IDApIHJldHVybiBjb21wYXJlTlBhcmFtczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvMS5nZXRQYXJhbWV0ZXJDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjb21wYXJlUGFyYW0gPSBuZXcgUGFyYW1ldGVyQ29tcGFyYXRvcigpLmNvbXBhcmUobzEuZ2V0UGFyYW1ldGVycygpW2ldLCBvMi5nZXRQYXJhbWV0ZXJzKClbaV0pOworICAgICAgICAgICAgaWYgKGNvbXBhcmVQYXJhbSAhPSAwKSByZXR1cm4gY29tcGFyZVBhcmFtOworICAgICAgICB9CisgICAgICAgIGludCBjb21wYXJlUmVzdWx0ID0gbmV3IENsYXNzQ29tcGFyYXRvcigpLmNvbXBhcmUobzEuZ2V0UmV0dXJuVHlwZSgpLCBvMi5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICBpZiAoY29tcGFyZVJlc3VsdCAhPSAwKSByZXR1cm4gY29tcGFyZVJlc3VsdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9jb21wYXJhdG9ycy9QYXJhbWV0ZXJDb21wYXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL2NvbXBhcmF0b3JzL1BhcmFtZXRlckNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVkNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9jb21wYXJhdG9ycy9QYXJhbWV0ZXJDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5jb21wYXJhdG9yczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlckNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFBhcmFtZXRlcj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlKFBhcmFtZXRlciBvMSwgUGFyYW1ldGVyIG8yKSB7CisgICAgICAgIGludCBjb21wYXJlTmFtZSA9IG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGNvbXBhcmVOYW1lICE9IDApIHJldHVybiBjb21wYXJlTmFtZTsKKyAgICAgICAgaW50IGNvbXBhcmVUeXBlID0gbmV3IENsYXNzQ29tcGFyYXRvcigpLmNvbXBhcmUobzEuZ2V0VHlwZSgpLCBvMi5nZXRUeXBlKCkpOworICAgICAgICBpZiAoY29tcGFyZVR5cGUgIT0gMCkgcmV0dXJuIGNvbXBhcmVUeXBlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL3BhY2thZ2UtaW5mby5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU4Y2JkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBtb2RlbCBiYXNlZCBvbiByZWZsZWN0aW9uLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0NvbnN0cnVjdG9yUmVzb2x1dGlvbkxvZ2ljLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDUwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kQW1iaWd1aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZyZWQgTGVmw6l2w6hyZS1MYW9pZGUKKyAqLworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yUmVzb2x1dGlvbkxvZ2ljIHsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UmVzb2x2ZWRUeXBlPiBncm91cFZhcmlhZGljUGFyYW1WYWx1ZXMoTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBpbnQgc3RhcnRWYXJpYWRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSB2YXJpYWRpY1R5cGUpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHJlcyA9IG5ldyBBcnJheUxpc3Q8Pihhcmd1bWVudHNUeXBlcy5zdWJMaXN0KDAsIHN0YXJ0VmFyaWFkaWMpKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHZhcmlhZGljVmFsdWVzID0gYXJndW1lbnRzVHlwZXMuc3ViTGlzdChzdGFydFZhcmlhZGljLCBhcmd1bWVudHNUeXBlcy5zaXplKCkpOworICAgICAgICBpZiAodmFyaWFkaWNWYWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBUT0RPIGlmIHRoZXJlIGFyZSBubyB2YXJpYWRpYyB2YWx1ZXMgd2Ugc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGJvdW5kIG9mIHRoZSBmb3JtYWwgdHlwZQorICAgICAgICAgICAgcmVzLmFkZCh2YXJpYWRpY1R5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGNvbXBvbmVudFR5cGUgPSBmaW5kQ29tbW9uVHlwZSh2YXJpYWRpY1ZhbHVlcyk7CisgICAgICAgICAgICByZXMuYWRkKG5ldyBSZXNvbHZlZEFycmF5VHlwZShjb21wb25lbnRUeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvbHZlZFR5cGUgZmluZENvbW1vblR5cGUoTGlzdDxSZXNvbHZlZFR5cGU+IHZhcmlhZGljVmFsdWVzKSB7CisgICAgICAgIGlmICh2YXJpYWRpY1ZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIGltcGxlbWVudCB0aGlzIGRlY2VudGx5CisgICAgICAgIHJldHVybiB2YXJpYWRpY1ZhbHVlcy5nZXQoMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYWJsZShSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gaXNBcHBsaWNhYmxlKGNvbnN0cnVjdG9yLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgYm9vbGVhbiB3aXRoV2lsZGNhcmRUb2xlcmFuY2UpIHsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkpIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBjb25zdHJ1Y3Rvci5nZXROdW1iZXJPZlBhcmFtcygpIC0gMTsKKyAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5nZXROdW1iZXJPZlBhcmFtcygpID09IGFyZ3VtZW50c1R5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBsYXN0IHZhbHVlIGlzIGRpcmVjdGx5IGFzc2lnbmFibGUgYXMgYW4gYXJyYXkKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlID0gY29uc3RydWN0b3IuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlID0gYXJndW1lbnRzVHlwZXMuZ2V0KHBvcyk7CisgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCA6IGNvbnN0cnVjdG9yLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9IE1ldGhvZFJlc29sdXRpb25Mb2dpYy5yZXBsYWNlVHlwZVBhcmFtKGV4cGVjdGVkVHlwZSwgdHAsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVHlwZS5pc0FycmF5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzVHlwZXMuc2V0KHBvcywgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1R5cGVzID0gZ3JvdXBWYXJpYWRpY1BhcmFtVmFsdWVzKGFyZ3VtZW50c1R5cGVzLCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5nZXRMYXN0UGFyYW0oKS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBlbHNlIGl0IGlzIGFscmVhZHkgYXNzaWduYWJsZSwgbm90aGluZyB0byBkbworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zID4gYXJndW1lbnRzVHlwZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJndW1lbnRzVHlwZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBWYXJpYWRpY1BhcmFtVmFsdWVzKGFyZ3VtZW50c1R5cGVzLCBwb3MsIGNvbnN0cnVjdG9yLmdldExhc3RQYXJhbSgpLmdldFR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uc3RydWN0b3IuZ2V0TnVtYmVyT2ZQYXJhbXMoKSAhPSBhcmd1bWVudHNUeXBlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNYXA8U3RyaW5nLCBSZXNvbHZlZFR5cGU+IG1hdGNoZWRQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBib29sZWFuIG5lZWRGb3JXaWxkQ2FyZFRvbGVyYW5jZSA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9yLmdldE51bWJlck9mUGFyYW1zKCk7IGkrKykgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGV4cGVjdGVkVHlwZSA9IGNvbnN0cnVjdG9yLmdldFBhcmFtKGkpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlID0gYXJndW1lbnRzVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKChleHBlY3RlZFR5cGUuaXNUeXBlVmFyaWFibGUoKSAmJiAhKGV4cGVjdGVkVHlwZS5pc1dpbGRjYXJkKCkpKQorICAgICAgICAgICAgICAgICAgICAmJiBleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCkuZGVjbGFyZWRPbk1ldGhvZCgpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlZFBhcmFtZXRlcnMucHV0KGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCksIGFjdHVhbFR5cGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBpc0Fzc2lnbmFibGVXaXRob3V0U3Vic3RpdHV0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpIHx8IChjb25zdHJ1Y3Rvci5nZXRQYXJhbShpKS5pc1ZhcmlhZGljKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuZXcgUmVzb2x2ZWRBcnJheVR5cGUoZXhwZWN0ZWRUeXBlKS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSk7CisgICAgICAgICAgICBpZiAoIWlzQXNzaWduYWJsZVdpdGhvdXRTdWJzdGl0dXRpb24gJiYgZXhwZWN0ZWRUeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICYmIGFjdHVhbFR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBpc0Fzc2lnbmFibGVXaXRob3V0U3Vic3RpdHV0aW9uID0gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUuYXNSZWZlcmVuY2VUeXBlKCksIGFjdHVhbFR5cGUuYXNSZWZlcmVuY2VUeXBlKCksIG1hdGNoZWRQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNBc3NpZ25hYmxlV2l0aG91dFN1YnN0aXR1dGlvbikgeworICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IHR5cGVQYXJhbWV0ZXJzID0gY29uc3RydWN0b3IuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5hZGRBbGwoY29uc3RydWN0b3IuZGVjbGFyaW5nVHlwZSgpLmdldFR5cGVQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiB0eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUgPSBNZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbShleHBlY3RlZFR5cGUsIHRwLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVHlwZS5pc1dpbGRjYXJkKCkgJiYgd2l0aFdpbGRjYXJkVG9sZXJhbmNlICYmICFleHBlY3RlZFR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEZvcldpbGRDYXJkVG9sZXJhbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5oYXNWYXJpYWRpY1BhcmFtZXRlcigpICYmIGkgPT0gY29uc3RydWN0b3IuZ2V0TnVtYmVyT2ZQYXJhbXMoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgUmVzb2x2ZWRBcnJheVR5cGUoZXhwZWN0ZWRUeXBlKS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICF3aXRoV2lsZGNhcmRUb2xlcmFuY2UgfHwgbmVlZEZvcldpbGRDYXJkVG9sZXJhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvcnMgICAgICAgIHdlIGV4cGVjdCB0aGUgbWV0aG9kcyB0byBiZSBvcmRlcmVkIHN1Y2ggdGhhdCBpbmhlcml0ZWQgbWV0aG9kcyBhcmUgbGF0ZXIgaW4gdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzVHlwZXMKKyAgICAgKiBAcGFyYW0gdHlwZVNvbHZlcgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGZpbmRNb3N0QXBwbGljYWJsZSgKKyAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBjb25zdHJ1Y3RvcnMsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IHJlcyA9CisgICAgICAgICAgICAgICAgZmluZE1vc3RBcHBsaWNhYmxlKGNvbnN0cnVjdG9ycywgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGZhbHNlKTsKKyAgICAgICAgaWYgKHJlcy5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5kTW9zdEFwcGxpY2FibGUoY29uc3RydWN0b3JzLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBmaW5kTW9zdEFwcGxpY2FibGUoCisgICAgICAgICAgICBMaXN0PFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gY29uc3RydWN0b3JzLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgYm9vbGVhbiB3aWxkY2FyZFRvbGVyYW5jZSkgeworICAgICAgICBMaXN0PFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4gYXBwbGljYWJsZUNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9ycy5zdHJlYW0oKS5maWx0ZXIoKG0pIC0+IGlzQXBwbGljYWJsZShtLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgd2lsZGNhcmRUb2xlcmFuY2UpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBpZiAoYXBwbGljYWJsZUNvbnN0cnVjdG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwbGljYWJsZUNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoYXBwbGljYWJsZUNvbnN0cnVjdG9ycy5nZXQoMCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHdpbm5pbmdDYW5kaWRhdGUgPSBhcHBsaWNhYmxlQ29uc3RydWN0b3JzLmdldCgwKTsKKyAgICAgICAgICAgIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBvdGhlciA9IG51bGw7CisgICAgICAgICAgICBib29sZWFuIHBvc3NpYmxlQW1iaWd1aXR5ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwcGxpY2FibGVDb25zdHJ1Y3RvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdGhlciA9IGFwcGxpY2FibGVDb25zdHJ1Y3RvcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChpc01vcmVTcGVjaWZpYyh3aW5uaW5nQ2FuZGlkYXRlLCBvdGhlciwgdHlwZVNvbHZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zc2libGVBbWJpZ3VpdHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9yZVNwZWNpZmljKG90aGVyLCB3aW5uaW5nQ2FuZGlkYXRlLCB0eXBlU29sdmVyKSkgeworICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUFtYmlndWl0eSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3aW5uaW5nQ2FuZGlkYXRlID0gb3RoZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpbm5pbmdDYW5kaWRhdGUuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3RoZXIuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQW1iaWd1aXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgbWV0aG9kcyB0byBiZSBvcmRlcmVkIHN1Y2ggdGhhdCBpbmhlcml0ZWQgbWV0aG9kcyBhcmUgbGF0ZXIgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3NzaWJsZUFtYmlndWl0eSkgeworICAgICAgICAgICAgICAgIC8vIHBpY2sgdGhlIGZpcnN0IGV4YWN0IG1hdGNoIGlmIGl0IGV4aXN0cworICAgICAgICAgICAgICAgIGlmICghTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzRXhhY3RNYXRjaCh3aW5uaW5nQ2FuZGlkYXRlLCBhcmd1bWVudHNUeXBlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0V4YWN0TWF0Y2gob3RoZXIsIGFyZ3VtZW50c1R5cGVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2lubmluZ0NhbmRpZGF0ZSA9IG90aGVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbigiQW1iaWd1b3VzIGNvbnN0cnVjdG9yIGNhbGw6IGNhbm5vdCBmaW5kIGEgbW9zdCBhcHBsaWNhYmxlIGNvbnN0cnVjdG9yOiAiICsgd2lubmluZ0NhbmRpZGF0ZSArICIsICIgKyBvdGhlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZCh3aW5uaW5nQ2FuZGlkYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNb3JlU3BlY2lmaWMoUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckIsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBib29sZWFuIG9uZU1vcmVTcGVjaWZpY0ZvdW5kID0gZmFsc2U7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvckEuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA8IGNvbnN0cnVjdG9yQi5nZXROdW1iZXJPZlBhcmFtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uc3RydWN0b3JBLmdldE51bWJlck9mUGFyYW1zKCkgPiBjb25zdHJ1Y3RvckIuZ2V0TnVtYmVyT2ZQYXJhbXMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JBLmdldE51bWJlck9mUGFyYW1zKCk7IGkrKykgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHRkQSA9IGNvbnN0cnVjdG9yQS5nZXRQYXJhbShpKS5nZXRUeXBlKCk7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgdGRCID0gY29uc3RydWN0b3JCLmdldFBhcmFtKGkpLmdldFR5cGUoKTsKKyAgICAgICAgICAgIC8vIEIgaXMgbW9yZSBzcGVjaWZpYworICAgICAgICAgICAgaWYgKHRkQi5pc0Fzc2lnbmFibGVCeSh0ZEEpICYmICF0ZEEuaXNBc3NpZ25hYmxlQnkodGRCKSkgeworICAgICAgICAgICAgICAgIG9uZU1vcmVTcGVjaWZpY0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEEgaXMgbW9yZSBzcGVjaWZpYworICAgICAgICAgICAgaWYgKHRkQS5pc0Fzc2lnbmFibGVCeSh0ZEIpICYmICF0ZEIuaXNBc3NpZ25hYmxlQnkodGRBKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGl0IG1hdGNoZXMgYSB2YXJpYWRpYyBhbmQgYSBub3QgdmFyaWFkaWMgSSBwaWNrIHRoZSBub3QgdmFyaWFkaWMKKyAgICAgICAgICAgIC8vIEZJWE1FCisgICAgICAgICAgICBpZiAoaSA9PSAoY29uc3RydWN0b3JBLmdldE51bWJlck9mUGFyYW1zKCkgLSAxKSAmJiB0ZEEuYXJyYXlMZXZlbCgpID4gdGRCLmFycmF5TGV2ZWwoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvbmVNb3JlU3BlY2lmaWNGb3VuZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL01ldGhvZFJlc29sdXRpb25Mb2dpYy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmZGZhYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL01ldGhvZFJlc29sdXRpb25Mb2dpYy5qYXZhCkBAIC0wLDAgKzEsNjk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RBbWJpZ3VpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RSZXNvbHV0aW9uTG9naWMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxSZXNvbHZlZFR5cGU+IGdyb3VwVmFyaWFkaWNQYXJhbVZhbHVlcyhMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIGludCBzdGFydFZhcmlhZGljLCBSZXNvbHZlZFR5cGUgdmFyaWFkaWNUeXBlKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiByZXMgPSBuZXcgQXJyYXlMaXN0PD4oYXJndW1lbnRzVHlwZXMuc3ViTGlzdCgwLCBzdGFydFZhcmlhZGljKSk7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiB2YXJpYWRpY1ZhbHVlcyA9IGFyZ3VtZW50c1R5cGVzLnN1Ykxpc3Qoc3RhcnRWYXJpYWRpYywgYXJndW1lbnRzVHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgaWYgKHZhcmlhZGljVmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVE9ETyBpZiB0aGVyZSBhcmUgbm8gdmFyaWFkaWMgdmFsdWVzIHdlIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBib3VuZCBvZiB0aGUgZm9ybWFsIHR5cGUKKyAgICAgICAgICAgIHJlcy5hZGQodmFyaWFkaWNUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBjb21wb25lbnRUeXBlID0gZmluZENvbW1vblR5cGUodmFyaWFkaWNWYWx1ZXMpOworICAgICAgICAgICAgcmVzLmFkZChuZXcgUmVzb2x2ZWRBcnJheVR5cGUoY29tcG9uZW50VHlwZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb2x2ZWRUeXBlIGZpbmRDb21tb25UeXBlKExpc3Q8UmVzb2x2ZWRUeXBlPiB2YXJpYWRpY1ZhbHVlcykgeworICAgICAgICBpZiAodmFyaWFkaWNWYWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgdGhpcyBkZWNlbnRseQorICAgICAgICByZXR1cm4gdmFyaWFkaWNWYWx1ZXMuZ2V0KDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2QsIFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gaXNBcHBsaWNhYmxlKG1ldGhvZCwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYWJsZShSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBib29sZWFuIHdpdGhXaWxkY2FyZFRvbGVyYW5jZSkgeworICAgICAgICBpZiAoIW1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZC5oYXNWYXJpYWRpY1BhcmFtZXRlcigpKSB7CisgICAgICAgICAgICBpbnQgcG9zID0gbWV0aG9kLmdldE51bWJlck9mUGFyYW1zKCkgLSAxOworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROdW1iZXJPZlBhcmFtcygpID09IGFyZ3VtZW50c1R5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBsYXN0IHZhbHVlIGlzIGRpcmVjdGx5IGFzc2lnbmFibGUgYXMgYW4gYXJyYXkKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlID0gbWV0aG9kLmdldExhc3RQYXJhbSgpLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgYWN0dWFsVHlwZSA9IGFyZ3VtZW50c1R5cGVzLmdldChwb3MpOworICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gcmVwbGFjZVR5cGVQYXJhbShleHBlY3RlZFR5cGUsIHRwLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFR5cGUuaXNBcnJheSgpICYmIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1R5cGVzLnNldChwb3MsIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNUeXBlcyA9IGdyb3VwVmFyaWFkaWNQYXJhbVZhbHVlcyhhcmd1bWVudHNUeXBlcywgcG9zLCBtZXRob2QuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBpdCBpcyBhbHJlYWR5IGFzc2lnbmFibGUsIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IGFyZ3VtZW50c1R5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmd1bWVudHNUeXBlcyA9IGdyb3VwVmFyaWFkaWNQYXJhbVZhbHVlcyhhcmd1bWVudHNUeXBlcywgcG9zLCBtZXRob2QuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRob2QuZ2V0TnVtYmVyT2ZQYXJhbXMoKSAhPSBhcmd1bWVudHNUeXBlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNYXA8U3RyaW5nLCBSZXNvbHZlZFR5cGU+IG1hdGNoZWRQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBib29sZWFuIG5lZWRGb3JXaWxkQ2FyZFRvbGVyYW5jZSA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZC5nZXROdW1iZXJPZlBhcmFtcygpOyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBleHBlY3RlZFR5cGUgPSBtZXRob2QuZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGFjdHVhbFR5cGUgPSBhcmd1bWVudHNUeXBlcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoKGV4cGVjdGVkVHlwZS5pc1R5cGVWYXJpYWJsZSgpICYmICEoZXhwZWN0ZWRUeXBlLmlzV2lsZGNhcmQoKSkpICYmIGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKS5kZWNsYXJlZE9uTWV0aG9kKCkpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVkUGFyYW1ldGVycy5wdXQoZXhwZWN0ZWRUeXBlLmFzVHlwZVBhcmFtZXRlcigpLmdldE5hbWUoKSwgYWN0dWFsVHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIGlzQXNzaWduYWJsZVdpdGhvdXRTdWJzdGl0dXRpb24gPSBleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1ldGhvZC5nZXRQYXJhbShpKS5pc1ZhcmlhZGljKCkgJiYgbmV3IFJlc29sdmVkQXJyYXlUeXBlKGV4cGVjdGVkVHlwZSkuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkpOworICAgICAgICAgICAgaWYgKCFpc0Fzc2lnbmFibGVXaXRob3V0U3Vic3RpdHV0aW9uICYmIGV4cGVjdGVkVHlwZS5pc1JlZmVyZW5jZVR5cGUoKSAmJiBhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgaXNBc3NpZ25hYmxlV2l0aG91dFN1YnN0aXR1dGlvbiA9IGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUuYXNSZWZlcmVuY2VUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFBhcmFtZXRlcnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc0Fzc2lnbmFibGVXaXRob3V0U3Vic3RpdHV0aW9uKSB7CisgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5hZGRBbGwobWV0aG9kLmRlY2xhcmluZ1R5cGUoKS5nZXRUeXBlUGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwIDogdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gcmVwbGFjZVR5cGVQYXJhbShleHBlY3RlZFR5cGUsIHRwLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVHlwZS5pc1dpbGRjYXJkKCkgJiYgd2l0aFdpbGRjYXJkVG9sZXJhbmNlICYmICFleHBlY3RlZFR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEZvcldpbGRDYXJkVG9sZXJhbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSAmJiBpID09IG1ldGhvZC5nZXROdW1iZXJPZlBhcmFtcygpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBSZXNvbHZlZEFycmF5VHlwZShleHBlY3RlZFR5cGUpLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIXdpdGhXaWxkY2FyZFRvbGVyYW5jZSB8fCBuZWVkRm9yV2lsZENhcmRUb2xlcmFuY2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnMoUmVzb2x2ZWRUeXBlIGV4cGVjdGVkLCBSZXNvbHZlZFR5cGUgYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFJlc29sdmVkVHlwZT4gbWF0Y2hlZFBhcmFtZXRlcnMpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkLmlzUmVmZXJlbmNlVHlwZSgpICYmIGFjdHVhbC5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnMoZXhwZWN0ZWQuYXNSZWZlcmVuY2VUeXBlKCksIGFjdHVhbC5hc1JlZmVyZW5jZVR5cGUoKSwgbWF0Y2hlZFBhcmFtZXRlcnMpOworICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkLmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIG1hdGNoZWRQYXJhbWV0ZXJzLnB1dChleHBlY3RlZC5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCksIGFjdHVhbCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihleHBlY3RlZC5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIgIiArIGFjdHVhbC5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVycyhSZXNvbHZlZFJlZmVyZW5jZVR5cGUgZXhwZWN0ZWQsIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUmVzb2x2ZWRUeXBlPiBtYXRjaGVkUGFyYW1ldGVycykgeworICAgICAgICBpZiAoYWN0dWFsLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZXhwZWN0ZWQuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnNNYXRjaGluZ1FOYW1lKGV4cGVjdGVkLCBhY3R1YWwsIG1hdGNoZWRQYXJhbWV0ZXJzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBhY3R1YWwuZ2V0QWxsQW5jZXN0b3JzKCk7CisgICAgICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA6IGFuY2VzdG9ycykgeworICAgICAgICAgICAgICAgIGlmIChpc0Fzc2lnbmFibGVNYXRjaFR5cGVQYXJhbWV0ZXJzTWF0Y2hpbmdRTmFtZShleHBlY3RlZCwgYW5jZXN0b3IsIG1hdGNoZWRQYXJhbWV0ZXJzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVyc01hdGNoaW5nUU5hbWUoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGV4cGVjdGVkLCBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUmVzb2x2ZWRUeXBlPiBtYXRjaGVkUGFyYW1ldGVycykgeworCisgICAgICAgIGlmICghZXhwZWN0ZWQuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhhY3R1YWwuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBlY3RlZC50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSAhPSBhY3R1YWwudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBleHBlY3RlZFBhcmFtID0gZXhwZWN0ZWQudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSk7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgYWN0dWFsUGFyYW0gPSBhY3R1YWwudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSk7CisKKyAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIG5lc3RlZCBwYXJhbWV0ZXJpemF0aW9ucyBlZy4gTGlzdDxSPiA8LT4gTGlzdDxJbnRlZ2VyPgorICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHBlZWwgb2ZmIG9uZSBsYXllciBhbmQgZW5zdXJlIFIgPC0+IEludGVnZXIKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFBhcmFtLmlzUmVmZXJlbmNlVHlwZSgpICYmIGFjdHVhbFBhcmFtLmlzUmVmZXJlbmNlVHlwZSgpKXsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgcjEgPSBleHBlY3RlZFBhcmFtLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSByMiA9IGFjdHVhbFBhcmFtLmFzUmVmZXJlbmNlVHlwZSgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnNNYXRjaGluZ1FOYW1lKHIxLCByMiwgbWF0Y2hlZFBhcmFtZXRlcnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXhwZWN0ZWRQYXJhbS5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkUGFyYW1OYW1lID0gZXhwZWN0ZWRQYXJhbS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxQYXJhbS5pc1R5cGVWYXJpYWJsZSgpIHx8ICFhY3R1YWxQYXJhbS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCkuZXF1YWxzKGV4cGVjdGVkUGFyYW1OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hUeXBlVmFyaWFibGUoZXhwZWN0ZWRQYXJhbS5hc1R5cGVWYXJpYWJsZSgpLCBhY3R1YWxQYXJhbSwgbWF0Y2hlZFBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRQYXJhbS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChhY3R1YWxQYXJhbS5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFR5cGVWYXJpYWJsZShhY3R1YWxQYXJhbS5hc1R5cGVWYXJpYWJsZSgpLCBleHBlY3RlZFBhcmFtLCBtYXRjaGVkUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXhwZWN0ZWRQYXJhbS5lcXVhbHMoYWN0dWFsUGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkUGFyYW0uaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkUGFyYW0uYXNXaWxkY2FyZCgpLmlzRXh0ZW5kcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Fzc2lnbmFibGVNYXRjaFR5cGVQYXJhbWV0ZXJzKGV4cGVjdGVkUGFyYW0uYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCksIGFjdHVhbCwgbWF0Y2hlZFBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUT0RPIHZlcmlmeSBzdXBlciBib3VuZAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZXhwZWN0ZWRQYXJhbS5kZXNjcmliZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoVHlwZVZhcmlhYmxlKFJlc29sdmVkVHlwZVZhcmlhYmxlIHR5cGVWYXJpYWJsZSwgUmVzb2x2ZWRUeXBlIHR5cGUsIE1hcDxTdHJpbmcsIFJlc29sdmVkVHlwZT4gbWF0Y2hlZFBhcmFtZXRlcnMpIHsKKyAgICAgICAgU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lID0gdHlwZVZhcmlhYmxlLmFzVHlwZVBhcmFtZXRlcigpLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKG1hdGNoZWRQYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KHR5cGVQYXJhbWV0ZXJOYW1lKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIG1hdGNoZWRQYXJhbWV0ZXIgPSBtYXRjaGVkUGFyYW1ldGVycy5nZXQodHlwZVBhcmFtZXRlck5hbWUpOworICAgICAgICAgICAgaWYgKG1hdGNoZWRQYXJhbWV0ZXIuaXNBc3NpZ25hYmxlQnkodHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0Fzc2lnbmFibGVCeShtYXRjaGVkUGFyYW1ldGVyKSkgeworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXRjaGVkUGFyYW1ldGVycyB0byBjb250YWluIHRoZSBtb3JlIGdlbmVyYWwgdHlwZQorICAgICAgICAgICAgICAgIG1hdGNoZWRQYXJhbWV0ZXJzLnB1dCh0eXBlUGFyYW1ldGVyTmFtZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXRjaGVkUGFyYW1ldGVycy5wdXQodHlwZVBhcmFtZXRlck5hbWUsIHR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRUeXBlIHJlcGxhY2VUeXBlUGFyYW0oUmVzb2x2ZWRUeXBlIHR5cGUsIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgaWYgKHR5cGUuaXNUeXBlVmFyaWFibGUoKSkgeworICAgICAgICAgICAgaWYgKHR5cGUuZGVzY3JpYmUoKS5lcXVhbHModHAuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQ+IGJvdW5kcyA9IHRwLmdldEJvdW5kcygpOworICAgICAgICAgICAgICAgIGlmIChib3VuZHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvdW5kcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRzLmdldCgwKS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEFycmF5VHlwZShyZXBsYWNlVHlwZVBhcmFtKHR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCksIHRwLCB0eXBlU29sdmVyKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJlc3VsdCA9IHR5cGUuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudHJhbnNmb3JtVHlwZVBhcmFtZXRlcnModHlwZVBhcmFtIC0+IHJlcGxhY2VUeXBlUGFyYW0odHlwZVBhcmFtLCB0cCwgdHlwZVNvbHZlcikpLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgaWYgKHR5cGUuZGVzY3JpYmUoKS5lcXVhbHModHAuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQ+IGJvdW5kcyA9IHRwLmdldEJvdW5kcygpOworICAgICAgICAgICAgICAgIGlmIChib3VuZHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvdW5kcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRzLmdldCgwKS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlcGxhY2luZyAiICsgdHlwZSArICIsIHBhcmFtICIgKyB0cCArICIgd2l0aCAiICsgdHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE1ldGhvZFVzYWdlIG1ldGhvZCwgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICghbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIENvbnNpZGVyIHZhcmFyZ3MKKyAgICAgICAgaWYgKG1ldGhvZC5nZXROb1BhcmFtcygpICE9IGFyZ3VtZW50c1R5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kLmdldE5vUGFyYW1zKCk7IGkrKykgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGV4cGVjdGVkVHlwZSA9IG1ldGhvZC5nZXRQYXJhbVR5cGUoaSk7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlV2l0aG91dFN1YnN0aXR1dGlvbnMgPSBleHBlY3RlZFR5cGU7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlV2l0aEluZmVyZW5jZSA9IG1ldGhvZC5nZXRQYXJhbVR5cGUoaSk7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgYWN0dWFsVHlwZSA9IGFyZ3VtZW50c1R5cGVzLmdldChpKTsKKworICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0RGVjbGFyYXRpb24oKS5nZXRUeXBlUGFyYW1ldGVycygpOworICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMuYWRkQWxsKG1ldGhvZC5kZWNsYXJpbmdUeXBlKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSk7CisKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFR5cGUuZGVzY3JpYmUoKS5lcXVhbHMoYWN0dWFsVHlwZS5kZXNjcmliZSgpKSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hcDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgUmVzb2x2ZWRUeXBlPiBkZXJpdmVkVmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2QuZ2V0UGFyYW1UeXBlcygpLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBtZXRob2QuZ2V0RGVjbGFyYXRpb24oKS5nZXRQYXJhbShpKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlci5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5pc1ZhcmlhZGljKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZmVyVHlwZXMoYXJndW1lbnRzVHlwZXMuZ2V0KGopLCBwYXJhbWV0ZXJUeXBlLCBkZXJpdmVkVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZT4gZW50cnkgOiBkZXJpdmVkVmFsdWVzLmVudHJ5U2V0KCkpeworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlV2l0aEluZmVyZW5jZSA9IGV4cGVjdGVkVHlwZVdpdGhJbmZlcmVuY2UucmVwbGFjZVR5cGVWYXJpYWJsZXModHAsIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwIDogdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAodHAuZ2V0Qm91bmRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLmdldE5hbWUoKSwgbmV3IFJlZmVyZW5jZVR5cGVVc2FnZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZChuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cC5nZXRCb3VuZHMoKS5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZCBib3VuZCA9IHRwLmdldEJvdW5kcygpLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kLmlzRXh0ZW5kcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cC5nZXROYW1lKCksIGJvdW5kLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXModHAsIFJlc29sdmVkV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGJvdW5kLmdldFR5cGUoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9leHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXModHAuZ2V0TmFtZSgpLCBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBSZXNvbHZlZFdpbGRjYXJkLnN1cGVyQm91bmQoYm91bmQuZ2V0VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgZXhwZWN0ZWRUeXBlMiA9IGV4cGVjdGVkVHlwZVdpdGhvdXRTdWJzdGl0dXRpb25zOworICAgICAgICAgICAgZm9yIChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCA6IHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKHRwLmdldEJvdW5kcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUyID0gZXhwZWN0ZWRUeXBlMi5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cC5nZXRCb3VuZHMoKS5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZCBib3VuZCA9IHRwLmdldEJvdW5kcygpLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kLmlzRXh0ZW5kcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUyID0gZXhwZWN0ZWRUeXBlMi5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgYm91bmQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZTIgPSBleHBlY3RlZFR5cGUyLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpCisgICAgICAgICAgICAgICAgICAgICYmICFleHBlY3RlZFR5cGUyLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpCisgICAgICAgICAgICAgICAgICAgICYmICFleHBlY3RlZFR5cGVXaXRoSW5mZXJlbmNlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpCisgICAgICAgICAgICAgICAgICAgICYmICFleHBlY3RlZFR5cGVXaXRob3V0U3Vic3RpdHV0aW9ucy5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldE1ldGhvZHNXaXRob3V0RHVwbGljYXRlcyhMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMpIHsKKyAgICAgICAgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHMgPSBuZXcgVHJlZVNldDw+KChtMSwgbTIpIC0+IHsKKyAgICAgICAgICAgIGlmIChtMSBpbnN0YW5jZW9mIEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbiAmJiBtMiBpbnN0YW5jZW9mIEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbiAmJgorICAgICAgICAgICAgICAgICAgICAoKEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbikgbTEpLmdldFdyYXBwZWROb2RlKCkuZXF1YWxzKCgoSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uKSBtMikuZ2V0V3JhcHBlZE5vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9KTsKKyAgICAgICAgcy5hZGRBbGwobWV0aG9kcyk7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFNldDxTdHJpbmc+IHVzZWRTaWduYXR1cmVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWQgOiBtZXRob2RzKSB7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbWQuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCk7CisgICAgICAgICAgICBpZiAoIXVzZWRTaWduYXR1cmVzLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgICAgICB1c2VkU2lnbmF0dXJlcy5hZGQoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICByZXMuYWRkKG1kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXRob2RzICAgICAgICB3ZSBleHBlY3QgdGhlIG1ldGhvZHMgdG8gYmUgb3JkZXJlZCBzdWNoIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMgYXJlIGxhdGVyIGluIHRoZSBsaXN0CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzVHlwZXMKKyAgICAgKiBAcGFyYW0gdHlwZVNvbHZlcgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBmaW5kTW9zdEFwcGxpY2FibGUoTGlzdDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IGZpbmRNb3N0QXBwbGljYWJsZShtZXRob2RzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgZmFsc2UpOworICAgICAgICBpZiAocmVzLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmRNb3N0QXBwbGljYWJsZShtZXRob2RzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gZmluZE1vc3RBcHBsaWNhYmxlKExpc3Q8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgVHlwZVNvbHZlciB0eXBlU29sdmVyLCBib29sZWFuIHdpbGRjYXJkVG9sZXJhbmNlKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gYXBwbGljYWJsZU1ldGhvZHMgPSBnZXRNZXRob2RzV2l0aG91dER1cGxpY2F0ZXMobWV0aG9kcykuc3RyZWFtKCkuZmlsdGVyKChtKSAtPiBpc0FwcGxpY2FibGUobSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHdpbGRjYXJkVG9sZXJhbmNlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgaWYgKGFwcGxpY2FibGVNZXRob2RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBudWxsUGFyYW1JbmRleGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHNUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1R5cGVzLmdldChpKS5pc051bGwoKSkgeworICAgICAgICAgICAgICBudWxsUGFyYW1JbmRleGVzLmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFudWxsUGFyYW1JbmRleGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIG1ldGhvZCB3aXRoIGFycmF5IHBhcmFtIGlmIGEgbm9uIGFycmF5IGV4aXN0cyBhbmQgYXJnIGlzIG51bGwKKyAgICAgICAgICAgIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZW1vdmVDYW5kaWRhdGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIG51bGxQYXJhbUluZGV4OiBudWxsUGFyYW1JbmRleGVzKSB7CisgICAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRoRGVjbDogYXBwbGljYWJsZU1ldGhvZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobWV0aERlY2wuZ2V0UGFyYW0obnVsbFBhcmFtSW5kZXguaW50VmFsdWUoKSkuZ2V0VHlwZSgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2FuZGlkYXRlcy5hZGQobWV0aERlY2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyZW1vdmVDYW5kaWRhdGVzLmlzRW1wdHkoKSAmJiByZW1vdmVDYW5kaWRhdGVzLnNpemUoKSA8IGFwcGxpY2FibGVNZXRob2RzLnNpemUoKSkgeworICAgICAgICAgICAgICBhcHBsaWNhYmxlTWV0aG9kcy5yZW1vdmVBbGwocmVtb3ZlQ2FuZGlkYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoYXBwbGljYWJsZU1ldGhvZHMuZ2V0KDApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gd2lubmluZ0NhbmRpZGF0ZSA9IGFwcGxpY2FibGVNZXRob2RzLmdldCgwKTsKKyAgICAgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gb3RoZXIgPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBwb3NzaWJsZUFtYmlndWl0eSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG90aGVyID0gYXBwbGljYWJsZU1ldGhvZHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChpc01vcmVTcGVjaWZpYyh3aW5uaW5nQ2FuZGlkYXRlLCBvdGhlciwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQW1iaWd1aXR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc01vcmVTcGVjaWZpYyhvdGhlciwgd2lubmluZ0NhbmRpZGF0ZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQW1iaWd1aXR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHdpbm5pbmdDYW5kaWRhdGUgPSBvdGhlcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVBbWJpZ3VpdHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IHRoZSBtZXRob2RzIHRvIGJlIG9yZGVyZWQgc3VjaCB0aGF0IGluaGVyaXRlZCBtZXRob2RzIGFyZSBsYXRlciBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvc3NpYmxlQW1iaWd1aXR5KSB7CisgICAgICAgICAgICAgIC8vIHBpY2sgdGhlIGZpcnN0IGV4YWN0IG1hdGNoIGlmIGl0IGV4aXN0cworICAgICAgICAgICAgICBpZiAoIWlzRXhhY3RNYXRjaCh3aW5uaW5nQ2FuZGlkYXRlLCBhcmd1bWVudHNUeXBlcykpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFeGFjdE1hdGNoKG90aGVyLCBhcmd1bWVudHNUeXBlcykpIHsKKyAgICAgICAgICAgICAgICAgIHdpbm5pbmdDYW5kaWRhdGUgPSBvdGhlcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbigiQW1iaWd1b3VzIG1ldGhvZCBjYWxsOiBjYW5ub3QgZmluZCBhIG1vc3QgYXBwbGljYWJsZSBtZXRob2Q6ICIgKyB3aW5uaW5nQ2FuZGlkYXRlICsgIiwgIiArIG90aGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHdpbm5pbmdDYW5kaWRhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRXhhY3RNYXRjaChSZXNvbHZlZE1ldGhvZExpa2VEZWNsYXJhdGlvbiBtZXRob2QsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2QuZ2V0TnVtYmVyT2ZQYXJhbXMoKTsgaSsrKSB7CisgICAgICAgIGlmICghbWV0aG9kLmdldFBhcmFtKGkpLmdldFR5cGUoKS5lcXVhbHMoYXJndW1lbnRzVHlwZXMuZ2V0KGkpKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01vcmVTcGVjaWZpYyhSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZEEsIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudFR5cGVzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBvbmVNb3JlU3BlY2lmaWNGb3VuZCA9IGZhbHNlOworICAgICAgICBpZiAobWV0aG9kQS5nZXROdW1iZXJPZlBhcmFtcygpIDwgbWV0aG9kQi5nZXROdW1iZXJPZlBhcmFtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0aG9kQS5nZXROdW1iZXJPZlBhcmFtcygpID4gbWV0aG9kQi5nZXROdW1iZXJPZlBhcmFtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RBLmdldE51bWJlck9mUGFyYW1zKCk7IGkrKykgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHRkQSA9IG1ldGhvZEEuZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHRkQiA9IG1ldGhvZEIuZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpOworICAgICAgICAgICAgLy8gQiBpcyBtb3JlIHNwZWNpZmljCisgICAgICAgICAgICBpZiAodGRCLmlzQXNzaWduYWJsZUJ5KHRkQSkgJiYgIXRkQS5pc0Fzc2lnbmFibGVCeSh0ZEIpKSB7CisgICAgICAgICAgICAgICAgb25lTW9yZVNwZWNpZmljRm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQSBpcyBtb3JlIHNwZWNpZmljCisgICAgICAgICAgICBpZiAodGRBLmlzQXNzaWduYWJsZUJ5KHRkQikgJiYgIXRkQi5pc0Fzc2lnbmFibGVCeSh0ZEEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvbmVNb3JlU3BlY2lmaWNGb3VuZCkgeworICAgICAgICAgICAgaW50IGxhc3RJbmRleCA9IGFyZ3VtZW50VHlwZXMuc2l6ZSgpIC0gMTsKKworICAgICAgICAgICAgaWYgKG1ldGhvZEEuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSAmJiAhbWV0aG9kQi5oYXNWYXJpYWRpY1BhcmFtZXRlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgYW4gYXJyYXkgdGhlbiBtMSBpcyBtb3JlIHNwZWNpZmljCisgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnRUeXBlcy5nZXQobGFzdEluZGV4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWV0aG9kQS5oYXNWYXJpYWRpY1BhcmFtZXRlcigpICYmIG1ldGhvZEIuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGFuIGFycmF5IGFuZCBtMSBpcyBub3QgdmFyaWFkaWMgdGhlbgorICAgICAgICAgICAgICAgIC8vIGl0IGlzIG5vdCBtb3JlIHNwZWNpZmljCisgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvbmVNb3JlU3BlY2lmaWNGb3VuZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTW9yZVNwZWNpZmljKE1ldGhvZFVzYWdlIG1ldGhvZEEsIE1ldGhvZFVzYWdlIG1ldGhvZEIsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBib29sZWFuIG9uZU1vcmVTcGVjaWZpY0ZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQS5nZXROb1BhcmFtcygpOyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0ZEEgPSBtZXRob2RBLmdldFBhcmFtVHlwZShpKTsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0ZEIgPSBtZXRob2RCLmdldFBhcmFtVHlwZShpKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhSXNBc3NpZ25hYmxlQnlCID0gdGRBLmlzQXNzaWduYWJsZUJ5KHRkQik7CisgICAgICAgICAgICBib29sZWFuIGJJc0Fzc2lnbmFibGVCeUEgPSB0ZEIuaXNBc3NpZ25hYmxlQnkodGRBKTsKKworICAgICAgICAgICAgLy8gQiBpcyBtb3JlIHNwZWNpZmljCisgICAgICAgICAgICBpZiAoYklzQXNzaWduYWJsZUJ5QSAmJiAhYUlzQXNzaWduYWJsZUJ5QikgeworICAgICAgICAgICAgICAgIG9uZU1vcmVTcGVjaWZpY0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEEgaXMgbW9yZSBzcGVjaWZpYworICAgICAgICAgICAgaWYgKGFJc0Fzc2lnbmFibGVCeUIgJiYgIWJJc0Fzc2lnbmFibGVCeUEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9uZU1vcmVTcGVjaWZpY0ZvdW5kOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IGZpbmRNb3N0QXBwbGljYWJsZVVzYWdlKExpc3Q8TWV0aG9kVXNhZ2U+IG1ldGhvZHMsIFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBMaXN0PE1ldGhvZFVzYWdlPiBhcHBsaWNhYmxlTWV0aG9kcyA9IG1ldGhvZHMuc3RyZWFtKCkuZmlsdGVyKChtKSAtPiBpc0FwcGxpY2FibGUobSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIGlmIChhcHBsaWNhYmxlTWV0aG9kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGlmIChhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGFwcGxpY2FibGVNZXRob2RzLmdldCgwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXRob2RVc2FnZSB3aW5uaW5nQ2FuZGlkYXRlID0gYXBwbGljYWJsZU1ldGhvZHMuZ2V0KDApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE1ldGhvZFVzYWdlIG90aGVyID0gYXBwbGljYWJsZU1ldGhvZHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChpc01vcmVTcGVjaWZpYyh3aW5uaW5nQ2FuZGlkYXRlLCBvdGhlciwgdHlwZVNvbHZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNb3JlU3BlY2lmaWMob3RoZXIsIHdpbm5pbmdDYW5kaWRhdGUsIHR5cGVTb2x2ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHdpbm5pbmdDYW5kaWRhdGUgPSBvdGhlcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmVPdmVycmlkZSh3aW5uaW5nQ2FuZGlkYXRlLCBvdGhlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0aG9kQW1iaWd1aXR5RXhjZXB0aW9uKCJBbWJpZ3VvdXMgbWV0aG9kIGNhbGw6IGNhbm5vdCBmaW5kIGEgbW9zdCBhcHBsaWNhYmxlIG1ldGhvZDogIiArIHdpbm5pbmdDYW5kaWRhdGUgKyAiLCAiICsgb3RoZXIgKyAiLiBGaXJzdCBkZWNsYXJlZCBpbiAiICsgd2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgbWV0aG9kcyB0byBiZSBvcmRlcmVkIHN1Y2ggdGhhdCBpbmhlcml0ZWQgbWV0aG9kcyBhcmUgbGF0ZXIgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2Yod2lubmluZ0NhbmRpZGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZU92ZXJyaWRlKE1ldGhvZFVzYWdlIHdpbm5pbmdDYW5kaWRhdGUsIE1ldGhvZFVzYWdlIG90aGVyKSB7CisgICAgICAgIGlmICghd2lubmluZ0NhbmRpZGF0ZS5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2lubmluZ0NhbmRpZGF0ZS5nZXROb1BhcmFtcygpICE9IG90aGVyLmdldE5vUGFyYW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbm5pbmdDYW5kaWRhdGUuZ2V0Tm9QYXJhbXMoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXdpbm5pbmdDYW5kaWRhdGUuZ2V0UGFyYW1UeXBlcygpLmdldChpKS5lcXVhbHMob3RoZXIuZ2V0UGFyYW1UeXBlcygpLmdldChpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2RJblR5cGUoUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBMaXN0PFJlc29sdmVkVHlwZT4gYXJndW1lbnRzVHlwZXMsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICByZXR1cm4gc29sdmVNZXRob2RJblR5cGUodHlwZURlY2xhcmF0aW9uLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVwbGFjZSBUeXBlRGVjbGFyYXRpb24uc29sdmVNZXRob2QKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiBAcGFyYW0gYXJndW1lbnRzVHlwZXMKKyAgICAgICAgICogQHBhcmFtIHN0YXRpY09ubHkKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb2x2ZU1ldGhvZEluVHlwZShSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcywgYm9vbGVhbiBzdGF0aWNPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIENvbnRleHQgY3R4ID0gKChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gY3R4LnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBDb250ZXh0IGN0eCA9ICgoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBjdHguc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHksIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInZhbHVlcyIpICYmIGFyZ3VtZW50c1R5cGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLlZhbHVlc01ldGhvZCgoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb250ZXh0IGN0eCA9ICgoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gY3R4LnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgCUNvbnRleHQgY3R4ID0gKChKYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gY3R4LnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgcmV0dXJuICgoUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KTsKKyAgICAgICAgfQorICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgeworICAgICAgICAgIHJldHVybiAoKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpOworICAgICAgICB9CisgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24odHlwZURlY2xhcmF0aW9uLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluZmVyVHlwZXMoUmVzb2x2ZWRUeXBlIHNvdXJjZSwgUmVzb2x2ZWRUeXBlIHRhcmdldCwgTWFwPFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBSZXNvbHZlZFR5cGU+IG1hcHBpbmdzKSB7CisKKworICAgICAgICBpZiAoc291cmNlLmVxdWFscyh0YXJnZXQpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc1JlZmVyZW5jZVR5cGUoKSAmJiB0YXJnZXQuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBzb3VyY2VSZWZUeXBlID0gc291cmNlLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHRhcmdldFJlZlR5cGUgPSB0YXJnZXQuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgICAgICBpZiAoc291cmNlUmVmVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRhcmdldFJlZlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGlmICghc291cmNlUmVmVHlwZS5pc1Jhd1R5cGUoKSAmJiAhdGFyZ2V0UmVmVHlwZS5pc1Jhd1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXJUeXBlcyhzb3VyY2VSZWZUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpLCB0YXJnZXRSZWZUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpLCBtYXBwaW5ncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc1JlZmVyZW5jZVR5cGUoKSAmJiB0YXJnZXQuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0LmFzV2lsZGNhcmQoKS5pc0JvdW5kZWQoKSkgeworICAgICAgICAgICAgICAgIGluZmVyVHlwZXMoc291cmNlLCB0YXJnZXQuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCksIG1hcHBpbmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZS5pc1dpbGRjYXJkKCkgJiYgdGFyZ2V0LmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2UuaXNSZWZlcmVuY2VUeXBlKCkgJiYgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlLmlzV2lsZGNhcmQoKSAmJiB0YXJnZXQuaXNSZWZlcmVuY2VUeXBlKCkpeworICAgICAgICAgICAgaWYgKHNvdXJjZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkpeworICAgICAgICAgICAgICAgIGluZmVyVHlwZXMoc291cmNlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLCB0YXJnZXQsIG1hcHBpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3VyY2UuaXNXaWxkY2FyZCgpICYmIHRhcmdldC5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICBtYXBwaW5ncy5wdXQodGFyZ2V0LmFzVHlwZVBhcmFtZXRlcigpLCBzb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2UuaXNUeXBlVmFyaWFibGUoKSAmJiB0YXJnZXQuaXNUeXBlVmFyaWFibGUoKSkgeworICAgICAgICAgICAgbWFwcGluZ3MucHV0KHRhcmdldC5hc1R5cGVQYXJhbWV0ZXIoKSwgc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzUHJpbWl0aXZlKCkgfHwgdGFyZ2V0LmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlLmlzTnVsbCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3ltYm9sRGVjbGFyYXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3ltYm9sRGVjbGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjA5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9TeW1ib2xEZWNsYXJhdG9yLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgaW50ZXJmYWNlIFN5bWJvbERlY2xhcmF0b3IgeworCisgICAgTGlzdDxSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IGdldFN5bWJvbERlY2xhcmF0aW9ucygpOworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9TeW1ib2xTb2x2ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNGE3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9TeW1ib2xTb2x2ZXIuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFN5bWJvbFNvbHZlciB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBTeW1ib2xTb2x2ZXIoVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIGlmICh0eXBlU29sdmVyID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVTeW1ib2woU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sKFN0cmluZyBuYW1lLCBOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIHNvbHZlU3ltYm9sKG5hbWUsIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxWYWx1ZT4gc29sdmVTeW1ib2xBc1ZhbHVlKFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxWYWx1ZT4gc29sdmVTeW1ib2xBc1ZhbHVlKFN0cmluZyBuYW1lLCBOb2RlIG5vZGUpIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKTsKKyAgICAgICAgcmV0dXJuIHNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gc29sdmVUeXBlKFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUsIE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gc29sdmVUeXBlKG5hbWUsIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RVc2FnZSBzb2x2ZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGRlY2wgPSBjb250ZXh0LnNvbHZlTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgICAgIGlmICghZGVjbC5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oY29udGV4dC50b1N0cmluZygpLCBtZXRob2ROYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlKGRlY2wuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RVc2FnZSBzb2x2ZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdDxSZXNvbHZlZFR5cGU+IGFyZ3VtZW50c1R5cGVzLCBOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIHNvbHZlTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50c1R5cGVzLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24gc29sdmVUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlVHlwZSkgeworCisgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgY2FsbCB0eXBlc29sdmVyIGhlcmUhCisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChDbGFzc09ySW50ZXJmYWNlVHlwZSkgdHlwZSkuZ2V0TmFtZSgpLmdldElkKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZiA9IEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQodHlwZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgaWYgKCFyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHR5cGUsIHR5cGVTb2x2ZXIpLnRvU3RyaW5nKCksIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0eXBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgc29sdmVUeXBlVXNhZ2UoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IGdlbmVyaWNUeXBlID0gY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICBpZiAoZ2VuZXJpY1R5cGUuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmljVHlwZS5nZXQoKTsKKyAgICAgICAgfQorICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0eXBlU29sdmVyLnNvbHZlVHlwZShuYW1lKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNvbHZlIGFueSBwb3NzaWJsZSB2aXNpYmxlIHN5bWJvbHMgaW5jbHVkaW5nOiBmaWVsZHMsIGludGVybmFsIHR5cGVzLCB0eXBlIHZhcmlhYmxlcywgdGhlIHR5cGUgaXRzZWxmIG9yIGl0cworICAgICAqIGNvbnRhaW5lcnMuCisgICAgICogPHA+CisgICAgICogSXQgc2hvdWxkIGNvbnRhaW4gaXRzIG93biBwcml2YXRlIGZpZWxkcyBidXQgbm90IGluaGVyaXRlZCBwcml2YXRlIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlU3ltYm9sSW5UeXBlKFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBDb250ZXh0IGN0eCA9ICgoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgcmV0dXJuIGN0eC5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBDb250ZXh0IGN0eCA9ICgoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBjdHguc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIENvbnRleHQgY3R4ID0gKChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBjdHguc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBzb2x2ZSBhIHN5bWJvbCBqdXN0IGluIHRoZSBkZWNsYXJhdGlvbiwgaXQgZG9lcyBub3QgZGVsZWdhdGUgdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHNvbHZlVHlwZUluVHlwZShSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICgoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Cb3VuZC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Cb3VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzIzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0JvdW5kLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5ib3VuZHMuRmFsc2VCb3VuZDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEJvdW5kcyBhcmUgZGVmaW5lZCBmb3IgSW5mZXJlbmNlIFZhcmlhYmxlcy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJvdW5kIHsKKworICAgIC8vLworICAgIC8vLyBDcmVhdGlvbiBvZiBib3VuZHMKKyAgICAvLy8KKworICAgIHN0YXRpYyBCb3VuZCBmYWxzZUJvdW5kKCkgeworICAgICAgICByZXR1cm4gRmFsc2VCb3VuZC5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBTYXRpc2ZpYWJpbGl0eQorICAgIC8vLworCisgICAgLyoqCisgICAgICogQSBib3VuZCBpcyBzYXRpc2ZpZWQgYnkgYW4gaW5mZXJlbmNlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpZiwgYWZ0ZXIgYXBwbHlpbmcgdGhlIHN1YnN0aXR1dGlvbiwKKyAgICAgKiB0aGUgYXNzZXJ0aW9uIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTYXRpc2ZpZWQoSW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb24gaW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb24pOworCisgICAgLy8vCisgICAgLy8vIENsYXNzaWZpY2F0aW9uIG9mIGJvdW5kcworICAgIC8vLworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBib3VuZCBvZiB0aGUgZm9ybSDOsSA9IFQgb3IgVCA9IM6xLCB3ZSBzYXkgVCBpcyBhbiBpbnN0YW50aWF0aW9uIG9mIM6xLgorICAgICAqCisgICAgICogUmV0dXJuIGVtcHR5IGlmIGl0IGlzIG5vdCBhbiBpbnN0YW50aWF0aW9uLiBPdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgdmFyaWFibGUgb2Ygd2hpY2ggdGhpcyBpcyBhbgorICAgICAqIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPEluc3RhbnRpYXRpb24+IGlzQW5JbnN0YW50aWF0aW9uKCkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzQW5JbnN0YW50aWF0aW9uRm9yKEluZmVyZW5jZVZhcmlhYmxlIHYpIHsKKyAgICAgICAgcmV0dXJuIGlzQW5JbnN0YW50aWF0aW9uKCkuaXNQcmVzZW50KCkgJiYgaXNBbkluc3RhbnRpYXRpb24oKS5nZXQoKS5nZXRJbmZlcmVuY2VWYXJpYWJsZSgpLmVxdWFscyh2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGJvdW5kIG9mIHRoZSBmb3JtIM6xIDw6IFQsIHdlIHNheSBUIGlzIGEgcHJvcGVyIHVwcGVyIGJvdW5kIG9mIM6xLgorICAgICAqCisgICAgICogUmV0dXJuIGVtcHR5IGlmIGl0IGlzIG5vdCBhIHByb3BlciB1cHBlciBib3VuZC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIHZhcmlhYmxlIG9mIHdoaWNoIHRoaXMgaXMgYW4KKyAgICAgKiBwcm9wZXIgdXBwZXIgYm91bmQuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPFByb3BlclVwcGVyQm91bmQ+IGlzUHJvcGVyVXBwZXJCb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBib3VuZCBvZiB0aGUgZm9ybSBUIDw6IM6xLCB3ZSBzYXkgVCBpcyBhIHByb3BlciBsb3dlciBib3VuZCBvZiDOsS4KKyAgICAgKgorICAgICAqIFJldHVybiBlbXB0eSBpZiBpdCBpcyBub3QgYSBwcm9wZXIgbG93ZXIgYm91bmQuIE90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSB2YXJpYWJsZSBvZiB3aGljaCB0aGlzIGlzIGFuCisgICAgICogcHJvcGVyIGxvd2VyIGJvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxQcm9wZXJMb3dlckJvdW5kPiBpc1Byb3Blckxvd2VyQm91bmQoKSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIE9wdGlvbmFsPFByb3Blckxvd2VyQm91bmQ+IGlzUHJvcGVyTG93ZXJCb3VuZEZvcihJbmZlcmVuY2VWYXJpYWJsZSBpbmZlcmVuY2VWYXJpYWJsZSkgeworICAgICAgICBPcHRpb25hbDxQcm9wZXJMb3dlckJvdW5kPiBwYXJ0aWFsID0gaXNQcm9wZXJMb3dlckJvdW5kKCk7CisgICAgICAgIGlmIChwYXJ0aWFsLmlzUHJlc2VudCgpICYmIHBhcnRpYWwuZ2V0KCkuZ2V0SW5mZXJlbmNlVmFyaWFibGUoKS5lcXVhbHMoaW5mZXJlbmNlVmFyaWFibGUpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFydGlhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgT3B0aW9uYWw8UHJvcGVyVXBwZXJCb3VuZD4gaXNQcm9wZXJVcHBlckJvdW5kRm9yKEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlKSB7CisgICAgICAgIE9wdGlvbmFsPFByb3BlclVwcGVyQm91bmQ+IHBhcnRpYWwgPSBpc1Byb3BlclVwcGVyQm91bmQoKTsKKyAgICAgICAgaWYgKHBhcnRpYWwuaXNQcmVzZW50KCkgJiYgcGFydGlhbC5nZXQoKS5nZXRJbmZlcmVuY2VWYXJpYWJsZSgpLmVxdWFscyhpbmZlcmVuY2VWYXJpYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdGhlciBib3VuZHMgcmVsYXRlIHR3byBpbmZlcmVuY2UgdmFyaWFibGVzLCBvciBhbiBpbmZlcmVuY2UgdmFyaWFibGUgdG8gYSB0eXBlIHRoYXQgY29udGFpbnMgaW5mZXJlbmNlCisgICAgICogdmFyaWFibGVzLiBTdWNoIGJvdW5kcywgb2YgdGhlIGZvcm0gUyA9IFQgb3IgUyA8OiBULCBhcmUgY2FsbGVkIGRlcGVuZGVuY2llcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FEZXBlbmRlbmN5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1Rocm93c0JvdW5kT24oSW5mZXJlbmNlVmFyaWFibGUgaW5mZXJlbmNlVmFyaWFibGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBPdGhlciBtZXRob2RzCisgICAgLy8vCisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU2V0PEluZmVyZW5jZVZhcmlhYmxlPiB1c2VkSW5mZXJlbmNlVmFyaWFibGVzKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0JvdW5kU2V0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0JvdW5kU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNzNiMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvQm91bmRTZXQuamF2YQpAQCAtMCwwICsxLDgwNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmJvdW5kcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmNvbnN0cmFpbnRmb3JtdWxhcy5UeXBlU2FtZUFzVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5jb25zdHJhaW50Zm9ybXVsYXMuVHlwZVN1YnR5cGVPZlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLio7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBCb3VuZFNldCB7CisKKyAgICBwcml2YXRlIExpc3Q8Qm91bmQ+IGJvdW5kcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJvdW5kU2V0IEVNUFRZID0gbmV3IEJvdW5kU2V0KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBCb3VuZFNldCBib3VuZFNldCA9IChCb3VuZFNldCkgbzsKKworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Pihib3VuZHMpLmVxdWFscyhuZXcgSGFzaFNldDw+KGJvdW5kU2V0LmJvdW5kcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBib3VuZHMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkJvdW5kU2V0eyIgKworICAgICAgICAgICAgICAgICJib3VuZHM9IiArIGJvdW5kcyArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIC8qKgorCisgICAgICogSXQgaXMgc29tZXRpbWVzIGNvbnZlbmllbnQgdG8gcmVmZXIgdG8gYW4gZW1wdHkgYm91bmQgc2V0IHdpdGggdGhlIHN5bWJvbCB0cnVlOyB0aGlzIGlzIG1lcmVseSBvdXQgb2YKKyAgICAgKiBjb252ZW5pZW5jZSwgYW5kIHRoZSB0d28gYXJlIGludGVyY2hhbmdlYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RydWUoKSB7CisgICAgICAgIHJldHVybiBib3VuZHMuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQm91bmRTZXQgZW1wdHkoKSB7CisgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm91bmRTZXQgd2l0aEJvdW5kKEJvdW5kIGJvdW5kKSB7CisgICAgICAgIGlmICh0aGlzLmJvdW5kcy5jb250YWlucyhib3VuZCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIEJvdW5kU2V0IGJvdW5kU2V0ID0gbmV3IEJvdW5kU2V0KCk7CisgICAgICAgIGJvdW5kU2V0LmJvdW5kcy5hZGRBbGwodGhpcy5ib3VuZHMpOworICAgICAgICBib3VuZFNldC5ib3VuZHMuYWRkKGJvdW5kKTsKKyAgICAgICAgcmV0dXJuIGJvdW5kU2V0OworICAgIH0KKworICAgIHByaXZhdGUgT3B0aW9uYWw8UGFpcjxTYW1lQXNCb3VuZCwgU2FtZUFzQm91bmQ+PiBmaW5kUGFpclNhbWVBcyhQcmVkaWNhdGU8UGFpcjxTYW1lQXNCb3VuZCwgU2FtZUFzQm91bmQ+PiBjb25kaXRpb24pIHsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8Ym91bmRzLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgIEJvdW5kIGJpID0gYm91bmRzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChiaSBpbnN0YW5jZW9mIFNhbWVBc0JvdW5kKSB7CisgICAgICAgICAgICAgICAgU2FtZUFzQm91bmQgc2kgPSAoU2FtZUFzQm91bmQpYmk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgYm91bmRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIEJvdW5kIGJqID0gYm91bmRzLmdldChqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJqIGluc3RhbmNlb2YgU2FtZUFzQm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNhbWVBc0JvdW5kIHNqID0gKFNhbWVBc0JvdW5kKWJqOworICAgICAgICAgICAgICAgICAgICAgICAgUGFpcjxTYW1lQXNCb3VuZCwgU2FtZUFzQm91bmQ+IHBhaXIgPSBuZXcgUGFpcjxTYW1lQXNCb3VuZCwgU2FtZUFzQm91bmQ+KHNpLCBzaik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLnRlc3QocGFpcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YocGFpcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGJvdW5kcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIFByb2Nlc3NvcjxCMSBleHRlbmRzIEJvdW5kLCBCMiBleHRlbmRzIEJvdW5kLCBSPiB7CisgICAgICAgIFIgcHJvY2VzcyhCMSBhLCBCMiBiLCBSIGluaXRpYWxWYWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gVCBmb3JFYWNoUGFpclNhbWVBcyhQcm9jZXNzb3I8U2FtZUFzQm91bmQsIFNhbWVBc0JvdW5kLCBUPiBwcm9jZXNzb3IsIFQgaW5pdGlhbFZhbHVlKSB7CisgICAgICAgIFQgY3VycmVudFZhbHVlID0gaW5pdGlhbFZhbHVlOworICAgICAgICBmb3IgKGludCBpPTA7aTxib3VuZHMuc2l6ZSgpO2krKykgeworICAgICAgICAgICAgQm91bmQgYmkgPSBib3VuZHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGJpIGluc3RhbmNlb2YgU2FtZUFzQm91bmQpIHsKKyAgICAgICAgICAgICAgICBTYW1lQXNCb3VuZCBzaSA9IChTYW1lQXNCb3VuZCliaTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBib3VuZHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQm91bmQgYmogPSBib3VuZHMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICBpZiAoYmogaW5zdGFuY2VvZiBTYW1lQXNCb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2FtZUFzQm91bmQgc2ogPSAoU2FtZUFzQm91bmQpYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBwcm9jZXNzb3IucHJvY2VzcyhzaSwgc2osIGN1cnJlbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBUIGZvckVhY2hQYWlyU2FtZUFuZFN1YnR5cGUoUHJvY2Vzc29yPFNhbWVBc0JvdW5kLCBTdWJ0eXBlT2ZCb3VuZCwgVD4gcHJvY2Vzc29yLCBUIGluaXRpYWxWYWx1ZSkgeworICAgICAgICBUIGN1cnJlbnRWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8Ym91bmRzLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgIEJvdW5kIGJpID0gYm91bmRzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChiaSBpbnN0YW5jZW9mIFNhbWVBc0JvdW5kKSB7CisgICAgICAgICAgICAgICAgU2FtZUFzQm91bmQgc2kgPSAoU2FtZUFzQm91bmQpYmk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgYm91bmRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIEJvdW5kIGJqID0gYm91bmRzLmdldChqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJqIGluc3RhbmNlb2YgU3VidHlwZU9mQm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1YnR5cGVPZkJvdW5kIHNqID0gKFN1YnR5cGVPZkJvdW5kKWJqOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gcHJvY2Vzc29yLnByb2Nlc3Moc2ksIHNqLCBjdXJyZW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gVCBmb3JFYWNoUGFpclN1YnR5cGVBbmRTdWJ0eXBlKFByb2Nlc3NvcjxTdWJ0eXBlT2ZCb3VuZCwgU3VidHlwZU9mQm91bmQsIFQ+IHByb2Nlc3NvciwgVCBpbml0aWFsVmFsdWUpIHsKKyAgICAgICAgVCBjdXJyZW50VmFsdWUgPSBpbml0aWFsVmFsdWU7CisgICAgICAgIGZvciAoaW50IGk9MDtpPGJvdW5kcy5zaXplKCk7aSsrKSB7CisgICAgICAgICAgICBCb3VuZCBiaSA9IGJvdW5kcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoYmkgaW5zdGFuY2VvZiBTdWJ0eXBlT2ZCb3VuZCkgeworICAgICAgICAgICAgICAgIFN1YnR5cGVPZkJvdW5kIHNpID0gKFN1YnR5cGVPZkJvdW5kKWJpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGJvdW5kcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBCb3VuZCBiaiA9IGJvdW5kcy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaiBpbnN0YW5jZW9mIFN1YnR5cGVPZkJvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlT2ZCb3VuZCBzaiA9IChTdWJ0eXBlT2ZCb3VuZCliajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHByb2Nlc3Nvci5wcm9jZXNzKHNpLCBzaiwgY3VycmVudFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBhcmVTYW1lVHlwZUluZmVyZW5jZShSZXNvbHZlZFR5cGUgYSwgUmVzb2x2ZWRUeXBlIGIpIHsKKyAgICAgICAgcmV0dXJuIGlzSW5mZXJlbmNlVmFyaWFibGUoYSkgJiYgaXNJbmZlcmVuY2VWYXJpYWJsZShiKSAmJiBhLmVxdWFscyhiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UGFpcjxSZXNvbHZlZFJlZmVyZW5jZVR5cGUsIFJlc29sdmVkUmVmZXJlbmNlVHlwZT4+IGZpbmRQYWlyc09mQ29tbW9uQW5jZXN0b3JzKFJlc29sdmVkUmVmZXJlbmNlVHlwZSByMSwgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHIyKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBzZXQxID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBzZXQxLmFkZChyMSk7CisgICAgICAgIHNldDEuYWRkQWxsKHIxLmdldEFsbEFuY2VzdG9ycygpKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IHNldDIgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIHNldDIuYWRkKHIyKTsKKyAgICAgICAgc2V0Mi5hZGRBbGwocjIuZ2V0QWxsQW5jZXN0b3JzKCkpOworICAgICAgICBMaXN0PFBhaXI8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlLCBSZXNvbHZlZFJlZmVyZW5jZVR5cGU+PiBwYWlycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZm9yIChSZXNvbHZlZFJlZmVyZW5jZVR5cGUgcnRGcm9tMSA6IHNldDEpIHsKKyAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJ0RnJvbTIgOiBzZXQyKSB7CisgICAgICAgICAgICAgICAgaWYgKHJ0RnJvbTEuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZXF1YWxzKHJ0RnJvbTIuZ2V0VHlwZURlY2xhcmF0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhaXJzLmFkZChuZXcgUGFpcjw+KHJ0RnJvbTEsIHJ0RnJvbTIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhaXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1haW50YWlucyBhIHNldCBvZiBpbmZlcmVuY2UgdmFyaWFibGUgYm91bmRzLCBlbnN1cmluZyB0aGF0IHRoZXNlIGFyZSBjb25zaXN0ZW50IGFzIG5ldyBib3VuZHMgYXJlIGFkZGVkLgorICAgICAqIEJlY2F1c2UgdGhlIGJvdW5kcyBvbiBvbmUgdmFyaWFibGUgY2FuIHNvbWV0aW1lcyBpbXBhY3QgdGhlIHBvc3NpYmxlIGNob2ljZXMgZm9yIGFub3RoZXIgdmFyaWFibGUsIHRoaXMgcHJvY2VzcworICAgICAqIHByb3BhZ2F0ZXMgYm91bmRzIGJldHdlZW4gc3VjaCBpbnRlcmRlcGVuZGVudCB2YXJpYWJsZXMuCisgICAgICovCisgICAgcHVibGljIEJvdW5kU2V0IGluY29ycG9yYXRlKEJvdW5kU2V0IG90aGVyQm91bmRzLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgQm91bmRTZXQgbmV3Qm91bmRTZXQgPSB0aGlzOworICAgICAgICBmb3IgKEJvdW5kIGIgOiBvdGhlckJvdW5kcy5ib3VuZHMpIHsKKyAgICAgICAgICAgIG5ld0JvdW5kU2V0ID0gbmV3Qm91bmRTZXQud2l0aEJvdW5kKGIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdCb3VuZFNldC5kZXJpdmVJbXBsaWVkQm91bmRzKHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBCb3VuZFNldCBkZXJpdmVJbXBsaWVkQm91bmRzKFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICAvLyBBcyBib3VuZCBzZXRzIGFyZSBjb25zdHJ1Y3RlZCBhbmQgZ3Jvd24gZHVyaW5nIGluZmVyZW5jZSwgaXQgaXMgcG9zc2libGUgdGhhdCBuZXcgYm91bmRzIGNhbiBiZSBpbmZlcnJlZAorICAgICAgICAvLyBiYXNlZCBvbiB0aGUgYXNzZXJ0aW9ucyBvZiB0aGUgb3JpZ2luYWwgYm91bmRzLiBUaGUgcHJvY2VzcyBvZiBpbmNvcnBvcmF0aW9uIGlkZW50aWZpZXMgdGhlc2UgbmV3IGJvdW5kcworICAgICAgICAvLyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBib3VuZCBzZXQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEluY29ycG9yYXRpb24gY2FuIGhhcHBlbiBpbiB0d28gc2NlbmFyaW9zLiBPbmUgc2NlbmFyaW8gaXMgdGhhdCB0aGUgYm91bmQgc2V0IGNvbnRhaW5zIGNvbXBsZW1lbnRhcnkgcGFpcnMKKyAgICAgICAgLy8gb2YgYm91bmRzOyB0aGlzIGltcGxpZXMgbmV3IGNvbnN0cmFpbnQgZm9ybXVsYXMsIGFzIHNwZWNpZmllZCBpbiDCpzE4LjMuMS4gVGhlIG90aGVyIHNjZW5hcmlvIGlzIHRoYXQgdGhlCisgICAgICAgIC8vIGJvdW5kIHNldCBjb250YWlucyBhIGJvdW5kIGludm9sdmluZyBjYXB0dXJlIGNvbnZlcnNpb247IHRoaXMgaW1wbGllcyBuZXcgYm91bmRzIGFuZCBtYXkgaW1wbHkgbmV3CisgICAgICAgIC8vIGNvbnN0cmFpbnQgZm9ybXVsYXMsIGFzIHNwZWNpZmllZCBpbiDCpzE4LjMuMi4gSW4gYm90aCBzY2VuYXJpb3MsIGFueSBuZXcgY29uc3RyYWludCBmb3JtdWxhcyBhcmUgcmVkdWNlZCwKKyAgICAgICAgLy8gYW5kIGFueSBuZXcgYm91bmRzIGFyZSBhZGRlZCB0byB0aGUgYm91bmQgc2V0LiBUaGlzIG1heSB0cmlnZ2VyIGZ1cnRoZXIgaW5jb3Jwb3JhdGlvbjsgdWx0aW1hdGVseSwgdGhlIHNldAorICAgICAgICAvLyB3aWxsIHJlYWNoIGEgZml4ZWQgcG9pbnQgYW5kIG5vIGZ1cnRoZXIgYm91bmRzIGNhbiBiZSBpbmZlcnJlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgaW5jb3Jwb3JhdGlvbiBvZiBhIGJvdW5kIHNldCBoYXMgcmVhY2hlZCBhIGZpeGVkIHBvaW50LCBhbmQgdGhlIHNldCBkb2VzIG5vdCBjb250YWluIHRoZSBib3VuZCBmYWxzZSwKKyAgICAgICAgLy8gdGhlbiB0aGUgYm91bmQgc2V0IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gRm9yIGVhY2ggY29tYmluYXRpb24gb2YgYSBwcm9wZXIgbG93ZXIgYm91bmQgTCBhbmQgYSBwcm9wZXIgdXBwZXIgYm91bmQgVSBvZiBhbiBpbmZlcmVuY2UgdmFyaWFibGUsIEwgPDogVS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiBldmVyeSBpbmZlcmVuY2UgdmFyaWFibGUgbWVudGlvbmVkIGJ5IGEgYm91bmQgaGFzIGFuIGluc3RhbnRpYXRpb24sIHRoZSBib3VuZCBpcyBzYXRpc2ZpZWQgYnkgdGhlCisgICAgICAgIC8vICAgY29ycmVzcG9uZGluZyBzdWJzdGl0dXRpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gR2l2ZW4gYSBkZXBlbmRlbmN5IM6xID0gzrIsIGV2ZXJ5IGJvdW5kIG9mIM6xIG1hdGNoZXMgYSBib3VuZCBvZiDOsiwgYW5kIHZpY2UgdmVyc2EuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gR2l2ZW4gYSBkZXBlbmRlbmN5IM6xIDw6IM6yLCBldmVyeSBsb3dlciBib3VuZCBvZiDOsSBpcyBhIGxvd2VyIGJvdW5kIG9mIM6yLCBhbmQgZXZlcnkgdXBwZXIgYm91bmQgb2YgzrIgaXMgYW4KKyAgICAgICAgLy8gICB1cHBlciBib3VuZCBvZiDOsS4KKworICAgICAgICBDb25zdHJhaW50Rm9ybXVsYVNldCBuZXdDb25zdHJhaW50c1NldCA9IENvbnN0cmFpbnRGb3JtdWxhU2V0LmVtcHR5KCk7CisKKyAgICAgICAgLy8gU0VDVElPTiBDb21wbGVtZW50YXJ5IFBhaXJzIG9mIEJvdW5kcworICAgICAgICAvLyAoSW4gdGhpcyBzZWN0aW9uLCBTIGFuZCBUIGFyZSBpbmZlcmVuY2UgdmFyaWFibGVzIG9yIHR5cGVzLCBhbmQgVSBpcyBhIHByb3BlciB0eXBlLiBGb3IgY29uY2lzZW5lc3MsIGEgYm91bmQKKyAgICAgICAgLy8gb2YgdGhlIGZvcm0gzrEgPSBUIG1heSBhbHNvIG1hdGNoIGEgYm91bmQgb2YgdGhlIGZvcm0gVCA9IM6xLikKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hlbiBhIGJvdW5kIHNldCBjb250YWlucyBhIHBhaXIgb2YgYm91bmRzIHRoYXQgbWF0Y2ggb25lIG9mIHRoZSBmb2xsb3dpbmcgcnVsZXMsIGEgbmV3IGNvbnN0cmFpbnQgZm9ybXVsYQorICAgICAgICAvLyBpcyBpbXBsaWVkOgorICAgICAgICAvLworICAgICAgICAvLyAtIM6xID0gUyBhbmQgzrEgPSBUIGltcGx5IOKAuVMgPSBU4oC6CisKKyAgICAgICAgbmV3Q29uc3RyYWludHNTZXQgPSBmb3JFYWNoUGFpclNhbWVBcygoYSwgYiwgY3VycmVudENvbnN0cmFpbnRTZXQpIC0+IHsKKyAgICAgICAgICAgIGlmIChhcmVTYW1lVHlwZUluZmVyZW5jZShhLmdldFMoKSwgYi5nZXRTKCkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVNhbWVBc1R5cGUoYS5nZXRUKCksIGIuZ2V0VCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJlU2FtZVR5cGVJbmZlcmVuY2UoYS5nZXRTKCksIGIuZ2V0VCgpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25zdHJhaW50U2V0ID0gY3VycmVudENvbnN0cmFpbnRTZXQud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTYW1lQXNUeXBlKGEuZ2V0UygpLCBiLmdldFQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZVNhbWVUeXBlSW5mZXJlbmNlKGEuZ2V0VCgpLCBiLmdldFMoKSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q29uc3RyYWludFNldCA9IGN1cnJlbnRDb25zdHJhaW50U2V0LndpdGhDb25zdHJhaW50KG5ldyBUeXBlU2FtZUFzVHlwZShhLmdldFQoKSwgYi5nZXRTKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmVTYW1lVHlwZUluZmVyZW5jZShhLmdldFQoKSwgYi5nZXRUKCkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVNhbWVBc1R5cGUoYS5nZXRTKCksIGIuZ2V0UygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3VycmVudENvbnN0cmFpbnRTZXQ7CisgICAgICAgIH0sIG5ld0NvbnN0cmFpbnRzU2V0KTsKKworICAgICAgICAvLyAtIM6xID0gUyBhbmQgzrEgPDogVCBpbXBseSDigLlTIDw6IFTigLoKKworICAgICAgICBuZXdDb25zdHJhaW50c1NldCA9IGZvckVhY2hQYWlyU2FtZUFuZFN1YnR5cGUoKGEsIGIsIGN1cnJlbnRDb25zdHJhaW50U2V0KSAtPiB7CisgICAgICAgICAgICBpZiAoYXJlU2FtZVR5cGVJbmZlcmVuY2UoYS5nZXRTKCksIGIuZ2V0UygpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25zdHJhaW50U2V0ID0gY3VycmVudENvbnN0cmFpbnRTZXQud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTdWJ0eXBlT2ZUeXBlKHR5cGVTb2x2ZXIsIGEuZ2V0VCgpLCBiLmdldFQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZVNhbWVUeXBlSW5mZXJlbmNlKGEuZ2V0VCgpLCBiLmdldFMoKSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q29uc3RyYWludFNldCA9IGN1cnJlbnRDb25zdHJhaW50U2V0LndpdGhDb25zdHJhaW50KG5ldyBUeXBlU3VidHlwZU9mVHlwZSh0eXBlU29sdmVyLCBhLmdldFMoKSwgYi5nZXRUKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q29uc3RyYWludFNldDsKKyAgICAgICAgfSwgbmV3Q29uc3RyYWludHNTZXQpOworCisgICAgICAgIC8vIC0gzrEgPSBTIGFuZCBUIDw6IM6xIGltcGx5IOKAuVQgPDogU+KAugorCisgICAgICAgIG5ld0NvbnN0cmFpbnRzU2V0ID0gZm9yRWFjaFBhaXJTYW1lQW5kU3VidHlwZSgoYSwgYiwgY3VycmVudENvbnN0cmFpbnRTZXQpIC0+IHsKKyAgICAgICAgICAgIGlmIChhcmVTYW1lVHlwZUluZmVyZW5jZShhLmdldFMoKSwgYi5nZXRUKCkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVN1YnR5cGVPZlR5cGUodHlwZVNvbHZlciwgYi5nZXRTKCksIGEuZ2V0VCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJlU2FtZVR5cGVJbmZlcmVuY2UoYS5nZXRUKCksIGIuZ2V0VCgpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25zdHJhaW50U2V0ID0gY3VycmVudENvbnN0cmFpbnRTZXQud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTdWJ0eXBlT2ZUeXBlKHR5cGVTb2x2ZXIsIGIuZ2V0UygpLCBhLmdldFMoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDb25zdHJhaW50U2V0OworICAgICAgICB9LCBuZXdDb25zdHJhaW50c1NldCk7CisKKyAgICAgICAgLy8gLSBTIDw6IM6xIGFuZCDOsSA8OiBUIGltcGx5IOKAuVMgPDogVOKAugorCisgICAgICAgIG5ld0NvbnN0cmFpbnRzU2V0ID0gZm9yRWFjaFBhaXJTdWJ0eXBlQW5kU3VidHlwZSgoYSwgYiwgY3VycmVudENvbnN0cmFpbnRTZXQpIC0+IHsKKyAgICAgICAgICAgIGlmIChhcmVTYW1lVHlwZUluZmVyZW5jZShhLmdldFQoKSwgYi5nZXRTKCkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVN1YnR5cGVPZlR5cGUodHlwZVNvbHZlciwgYi5nZXRTKCksIGEuZ2V0VCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3VycmVudENvbnN0cmFpbnRTZXQ7CisgICAgICAgIH0sIG5ld0NvbnN0cmFpbnRzU2V0KTsKKworICAgICAgICAvLyAtIM6xID0gVSBhbmQgUyA9IFQgaW1wbHkg4oC5U1vOsTo9VV0gPSBUW86xOj1VXeKAugorCisgICAgICAgIG5ld0NvbnN0cmFpbnRzU2V0ID0gZm9yRWFjaFBhaXJTYW1lQXMoKGEsIGIsIGN1cnJlbnRDb25zdHJhaW50U2V0KSAtPiB7CisgICAgICAgICAgICBpZiAoaXNJbmZlcmVuY2VWYXJpYWJsZShhLmdldFMoKSkgJiYgaXNQcm9wZXJUeXBlKGEuZ2V0VCgpKSkgeworICAgICAgICAgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGFscGhhID0gKEluZmVyZW5jZVZhcmlhYmxlKWEuZ2V0UygpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBVID0gYS5nZXRUKCk7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFMgPSBiLmdldFMoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgVCA9IGIuZ2V0VCgpOworICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWIgPSBTdWJzdGl0dXRpb24uZW1wdHkoKS53aXRoUGFpcihhbHBoYS5nZXRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKSwgVSk7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVNhbWVBc1R5cGUoc3ViLmFwcGx5KFMpLCBzdWIuYXBwbHkoVCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc0luZmVyZW5jZVZhcmlhYmxlKGEuZ2V0VCgpKSAmJiBpc1Byb3BlclR5cGUoYS5nZXRTKCkpKSB7CisgICAgICAgICAgICAgICAgSW5mZXJlbmNlVmFyaWFibGUgYWxwaGEgPSAoSW5mZXJlbmNlVmFyaWFibGUpYS5nZXRUKCk7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFUgPSBhLmdldFMoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgUyA9IGIuZ2V0UygpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBUID0gYi5nZXRUKCk7CisgICAgICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YiA9IFN1YnN0aXR1dGlvbi5lbXB0eSgpLndpdGhQYWlyKGFscGhhLmdldFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpLCBVKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q29uc3RyYWludFNldCA9IGN1cnJlbnRDb25zdHJhaW50U2V0LndpdGhDb25zdHJhaW50KG5ldyBUeXBlU2FtZUFzVHlwZShzdWIuYXBwbHkoUyksIHN1Yi5hcHBseShUKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzSW5mZXJlbmNlVmFyaWFibGUoYi5nZXRTKCkpICYmIGlzUHJvcGVyVHlwZShiLmdldFQoKSkpIHsKKyAgICAgICAgICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZSBhbHBoYSA9IChJbmZlcmVuY2VWYXJpYWJsZSliLmdldFMoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgVSA9IGIuZ2V0VCgpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBTID0gYS5nZXRTKCk7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFQgPSBhLmdldFQoKTsKKyAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb24gc3ViID0gU3Vic3RpdHV0aW9uLmVtcHR5KCkud2l0aFBhaXIoYWxwaGEuZ2V0VHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKCksIFUpOworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25zdHJhaW50U2V0ID0gY3VycmVudENvbnN0cmFpbnRTZXQud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTYW1lQXNUeXBlKHN1Yi5hcHBseShTKSwgc3ViLmFwcGx5KFQpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNJbmZlcmVuY2VWYXJpYWJsZShiLmdldFQoKSkgJiYgaXNQcm9wZXJUeXBlKGIuZ2V0UygpKSkgeworICAgICAgICAgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGFscGhhID0gKEluZmVyZW5jZVZhcmlhYmxlKWIuZ2V0VCgpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBVID0gYi5nZXRTKCk7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFMgPSBhLmdldFMoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgVCA9IGEuZ2V0VCgpOworICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWIgPSBTdWJzdGl0dXRpb24uZW1wdHkoKS53aXRoUGFpcihhbHBoYS5nZXRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKSwgVSk7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVNhbWVBc1R5cGUoc3ViLmFwcGx5KFMpLCBzdWIuYXBwbHkoVCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q29uc3RyYWludFNldDsKKyAgICAgICAgfSwgbmV3Q29uc3RyYWludHNTZXQpOworCisgICAgICAgIC8vIC0gzrEgPSBVIGFuZCBTIDw6IFQgaW1wbHkg4oC5U1vOsTo9VV0gPDogVFvOsTo9VV3igLoKKworICAgICAgICBuZXdDb25zdHJhaW50c1NldCA9IGZvckVhY2hQYWlyU2FtZUFuZFN1YnR5cGUoKGEsIGIsIGN1cnJlbnRDb25zdHJhaW50U2V0KSAtPiB7CisgICAgICAgICAgICBpZiAoaXNJbmZlcmVuY2VWYXJpYWJsZShhLmdldFMoKSkgJiYgaXNQcm9wZXJUeXBlKGEuZ2V0VCgpKSkgeworICAgICAgICAgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGFscGhhID0gKEluZmVyZW5jZVZhcmlhYmxlKWEuZ2V0UygpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBVID0gYS5nZXRUKCk7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFMgPSBiLmdldFMoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgVCA9IGIuZ2V0VCgpOworICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWIgPSBTdWJzdGl0dXRpb24uZW1wdHkoKS53aXRoUGFpcihhbHBoYS5nZXRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24oKSwgVSk7CisgICAgICAgICAgICAgICAgY3VycmVudENvbnN0cmFpbnRTZXQgPSBjdXJyZW50Q29uc3RyYWludFNldC53aXRoQ29uc3RyYWludChuZXcgVHlwZVN1YnR5cGVPZlR5cGUodHlwZVNvbHZlciwgc3ViLmFwcGx5KFMpLCBzdWIuYXBwbHkoVCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc0luZmVyZW5jZVZhcmlhYmxlKGEuZ2V0VCgpKSAmJiBpc1Byb3BlclR5cGUoYS5nZXRTKCkpKSB7CisgICAgICAgICAgICAgICAgSW5mZXJlbmNlVmFyaWFibGUgYWxwaGEgPSAoSW5mZXJlbmNlVmFyaWFibGUpYS5nZXRUKCk7CisgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFUgPSBhLmdldFMoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgUyA9IGIuZ2V0UygpOworICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBUID0gYi5nZXRUKCk7CisgICAgICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHN1YiA9IFN1YnN0aXR1dGlvbi5lbXB0eSgpLndpdGhQYWlyKGFscGhhLmdldFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpLCBVKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q29uc3RyYWludFNldCA9IGN1cnJlbnRDb25zdHJhaW50U2V0LndpdGhDb25zdHJhaW50KG5ldyBUeXBlU3VidHlwZU9mVHlwZSh0eXBlU29sdmVyLCBzdWIuYXBwbHkoUyksIHN1Yi5hcHBseShUKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDb25zdHJhaW50U2V0OworICAgICAgICB9LCBuZXdDb25zdHJhaW50c1NldCk7CisKKyAgICAgICAgLy8gV2hlbiBhIGJvdW5kIHNldCBjb250YWlucyBhIHBhaXIgb2YgYm91bmRzIM6xIDw6IFMgYW5kIM6xIDw6IFQsIGFuZCB0aGVyZSBleGlzdHMgYSBzdXBlcnR5cGUgb2YgUyBvZiB0aGUKKyAgICAgICAgLy8gZm9ybSBHPFMxLCAuLi4sIFNuPiBhbmQgYSBzdXBlcnR5cGUgb2YgVCBvZiB0aGUgZm9ybSBHPFQxLCAuLi4sIFRuPiAoZm9yIHNvbWUgZ2VuZXJpYyBjbGFzcyBvciBpbnRlcmZhY2UsIEcpLAorICAgICAgICAvLyB0aGVuIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgbiksIGlmIFNpIGFuZCBUaSBhcmUgdHlwZXMgKG5vdCB3aWxkY2FyZHMpLCB0aGUgY29uc3RyYWludCBmb3JtdWxhIOKAuVNpID0gVGnigLogaXMKKyAgICAgICAgLy8gaW1wbGllZC4KKworICAgICAgICBuZXdDb25zdHJhaW50c1NldCA9IGZvckVhY2hQYWlyU3VidHlwZUFuZFN1YnR5cGUoKGEsIGIsIGN1cnJlbnRDb25zdHJhaW50U2V0KSAtPiB7CisgICAgICAgICAgICBpZiAoaXNJbmZlcmVuY2VWYXJpYWJsZShhLmdldFMoKSkgJiYgaXNJbmZlcmVuY2VWYXJpYWJsZShiLmdldFMoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYS5nZXRUKCkuaXNSZWZlcmVuY2VUeXBlKCkgJiYgYi5nZXRUKCkuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIFMgPSBhLmdldFQoKS5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIFQgPSBiLmdldFQoKS5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFJlc29sdmVkUmVmZXJlbmNlVHlwZSwgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlPj4gcGFpcnMgPSBmaW5kUGFpcnNPZkNvbW1vbkFuY2VzdG9ycyhTLCBUKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJlc29sdmVkUmVmZXJlbmNlVHlwZSwgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBwYWlyIDogcGFpcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPE1hdGgubWluKHBhaXIuYS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSwgcGFpci5iLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHNpID0gcGFpci5hLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0aSA9IHBhaXIuYi50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNpLmlzV2lsZGNhcmQoKSAmJiAhdGkuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb25zdHJhaW50U2V0ID0gY3VycmVudENvbnN0cmFpbnRTZXQud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTYW1lQXNUeXBlKHNpLCB0aSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q29uc3RyYWludFNldDsKKyAgICAgICAgfSwgbmV3Q29uc3RyYWludHNTZXQpOworCisgICAgICAgIC8vIFNFQ1RJT04gQm91bmRzIEludm9sdmluZyBDYXB0dXJlIENvbnZlcnNpb24KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hlbiBhIGJvdW5kIHNldCBjb250YWlucyBhIGJvdW5kIG9mIHRoZSBmb3JtIEc8zrExLCAuLi4sIM6xbj4gPSBjYXB0dXJlKEc8QTEsIC4uLiwgQW4+KSwgbmV3IGJvdW5kcyBhcmUKKyAgICAgICAgLy8gaW1wbGllZCBhbmQgbmV3IGNvbnN0cmFpbnQgZm9ybXVsYXMgbWF5IGJlIGltcGxpZWQsIGFzIGZvbGxvd3MuCisKKyAgICAgICAgZm9yIChCb3VuZCBiIDogdGhpcy5ib3VuZHMuc3RyZWFtKCkuZmlsdGVyKGIgLT4gYiBpbnN0YW5jZW9mIENhcHR1cmVzQm91bmQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpIHsKKyAgICAgICAgICAgIENhcHR1cmVzQm91bmQgY2FwdHVyZXNCb3VuZCA9IChDYXB0dXJlc0JvdW5kKWI7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAvLyBMZXQgUDEsIC4uLiwgUG4gcmVwcmVzZW50IHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgRyBhbmQgbGV0IEIxLCAuLi4sIEJuIHJlcHJlc2VudCB0aGUgYm91bmRzIG9mIHRoZXNlIHR5cGUKKyAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMuIExldCDOuCByZXByZXNlbnQgdGhlIHN1YnN0aXR1dGlvbiBbUDE6Pc6xMSwgLi4uLCBQbjo9zrFuXS4gTGV0IFIgYmUgYSB0eXBlIHRoYXQgaXMgbm90IGFuIGluZmVyZW5jZQorICAgICAgICAgICAgLy8gdmFyaWFibGUgKGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgYSBwcm9wZXIgdHlwZSkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzZXQgb2YgYm91bmRzIG9uIM6xMSwgLi4uLCDOsW4gaXMgaW1wbGllZCwgY29uc3RydWN0ZWQgZnJvbSB0aGUgZGVjbGFyZWQgYm91bmRzIG9mIFAxLCAuLi4sIFBuIGFzIHNwZWNpZmllZAorICAgICAgICAgICAgLy8gaW4gwqcxOC4xLjMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gYWRkaXRpb24sIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgbik6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gLSBJZiBBaSBpcyBub3QgYSB3aWxkY2FyZCwgdGhlbiB0aGUgYm91bmQgzrFpID0gQWkgaXMgaW1wbGllZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAtIElmIEFpIGlzIGEgd2lsZGNhcmQgb2YgdGhlIGZvcm0gPzoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gzrFpID0gUiBpbXBsaWVzIHRoZSBib3VuZCBmYWxzZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgLSDOsWkgPDogUiBpbXBsaWVzIHRoZSBjb25zdHJhaW50IGZvcm11bGEg4oC5QmkgzrggPDogUuKAugorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgLSBSIDw6IM6xaSBpbXBsaWVzIHRoZSBib3VuZCBmYWxzZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIC0gSWYgQWkgaXMgYSB3aWxkY2FyZCBvZiB0aGUgZm9ybSA/IGV4dGVuZHMgVDoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gzrFpID0gUiBpbXBsaWVzIHRoZSBib3VuZCBmYWxzZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgLSBJZiBCaSBpcyBPYmplY3QsIHRoZW4gzrFpIDw6IFIgaW1wbGllcyB0aGUgY29uc3RyYWludCBmb3JtdWxhIOKAuVQgPDogUuKAugorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgLSBJZiBUIGlzIE9iamVjdCwgdGhlbiDOsWkgPDogUiBpbXBsaWVzIHRoZSBjb25zdHJhaW50IGZvcm11bGEg4oC5QmkgzrggPDogUuKAugorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgLSBSIDw6IM6xaSBpbXBsaWVzIHRoZSBib3VuZCBmYWxzZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIC0gSWYgQWkgaXMgYSB3aWxkY2FyZCBvZiB0aGUgZm9ybSA/IHN1cGVyIFQ6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAtIM6xaSA9IFIgaW1wbGllcyB0aGUgYm91bmQgZmFsc2UKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gzrFpIDw6IFIgaW1wbGllcyB0aGUgY29uc3RyYWludCBmb3JtdWxhIOKAuUJpIM64IDw6IFLigLoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gUiA8OiDOsWkgaW1wbGllcyB0aGUgY29uc3RyYWludCBmb3JtdWxhIOKAuVIgPDogVOKAugorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0NvbnN0cmFpbnRzU2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCb3VuZFNldCBuZXdCb3VuZHMgPSBuZXdDb25zdHJhaW50c1NldC5yZWR1Y2UodHlwZVNvbHZlcik7CisgICAgICAgICAgICBpZiAobmV3Qm91bmRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5jb3Jwb3JhdGUobmV3Qm91bmRzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRmFsc2UoKSB7CisgICAgICAgIHJldHVybiBib3VuZHMuc3RyZWFtKCkuYW55TWF0Y2goaXQgLT4gaXQgaW5zdGFuY2VvZiBGYWxzZUJvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFZhcmlhYmxlRGVwZW5kZW5jeSB7CisgICAgICAgIHByaXZhdGUgSW5mZXJlbmNlVmFyaWFibGUgZGVwZW5kaW5nOworICAgICAgICBwcml2YXRlIEluZmVyZW5jZVZhcmlhYmxlIGRlcGVuZGVkT247CisKKyAgICAgICAgcHVibGljIFZhcmlhYmxlRGVwZW5kZW5jeShJbmZlcmVuY2VWYXJpYWJsZSBkZXBlbmRpbmcsIEluZmVyZW5jZVZhcmlhYmxlIGRlcGVuZGVkT24pIHsKKyAgICAgICAgICAgIHRoaXMuZGVwZW5kaW5nID0gZGVwZW5kaW5nOworICAgICAgICAgICAgdGhpcy5kZXBlbmRlZE9uID0gZGVwZW5kZWRPbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmZlcmVuY2VWYXJpYWJsZSBnZXREZXBlbmRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVwZW5kaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEluZmVyZW5jZVZhcmlhYmxlIGdldERlcGVuZGVkT24oKSB7CisgICAgICAgICAgICByZXR1cm4gZGVwZW5kZWRPbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVmbGV4aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIGRlcGVuZGVkT24uZXF1YWxzKGRlcGVuZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYWxsSW5mZXJlbmNlVmFyaWFibGVzKCkgeworICAgICAgICBTZXQ8SW5mZXJlbmNlVmFyaWFibGU+IHZhcmlhYmxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChCb3VuZCBiIDogYm91bmRzKSB7CisgICAgICAgICAgICB2YXJpYWJsZXMuYWRkQWxsKGIudXNlZEluZmVyZW5jZVZhcmlhYmxlcygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFyaWFibGVzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbnN0YW50aWF0aW9uRm9yKEluZmVyZW5jZVZhcmlhYmxlIHYpIHsKKyAgICAgICAgZm9yIChCb3VuZCBiIDogYm91bmRzKSB7CisgICAgICAgICAgICBpZiAoYi5pc0FuSW5zdGFudGlhdGlvbkZvcih2KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluc3RhbnRpYXRpb24gZ2V0SW5zdGFudGlhdGlvbkZvcihJbmZlcmVuY2VWYXJpYWJsZSB2KSB7CisgICAgICAgIGZvciAoQm91bmQgYiA6IGJvdW5kcykgeworICAgICAgICAgICAgaWYgKGIuaXNBbkluc3RhbnRpYXRpb25Gb3IodikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYi5pc0FuSW5zdGFudGlhdGlvbigpLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdGhlcmVJc1NvbWVKU3VjaFRoYXTOsmVxdWFsQWxwaGFKKFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYWxwaGFzLCBJbmZlcmVuY2VWYXJpYWJsZSBiZXRhKSB7CisgICAgICAgIGZvciAoSW5mZXJlbmNlVmFyaWFibGUgYWxwaGFKIDogYWxwaGFzKSB7CisgICAgICAgICAgICBmb3IgKEJvdW5kIGIgOiBib3VuZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIFNhbWVBc0JvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIFNhbWVBc0JvdW5kIHNhbWVBc0JvdW5kID0gKFNhbWVBc0JvdW5kKWI7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lQXNCb3VuZC5nZXRTKCkuZXF1YWxzKGFscGhhSikgJiYgc2FtZUFzQm91bmQuZ2V0VCgpLmVxdWFscyhiZXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhbWVBc0JvdW5kLmdldFQoKS5lcXVhbHMoYWxwaGFKKSAmJiBzYW1lQXNCb3VuZC5nZXRTKCkuZXF1YWxzKGJldGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gTGlzdDxTZXQ8VD4+IGJ1aWxkQWxsU3Vic2V0c09mU2l6ZShTZXQ8VD4gYWxsRWxlbWVudHMsIGludCBkZXNpcmVkU2l6ZSkgeworICAgICAgICBpZiAoZGVzaXJlZFNpemUgPT0gYWxsRWxlbWVudHMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChhbGxFbGVtZW50cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMaXN0PFNldDxUPj4gcmVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgZm9yIChUIGVsZW1lbnQgOiBhbGxFbGVtZW50cykgeworICAgICAgICAgICAgICAgIFNldDxUPiBzdWJzZXQgPSBhbGxCdXRPbmUoYWxsRWxlbWVudHMsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgIHJlcy5hZGRBbGwoYnVpbGRBbGxTdWJzZXRzT2ZTaXplKHN1YnNldCwgZGVzaXJlZFNpemUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBTZXQ8VD4gYWxsQnV0T25lKFNldDxUPiBlbGVtZW50cywgVCBlbGVtZW50KSB7CisgICAgICAgIFNldDxUPiBzZXQgPSBuZXcgSGFzaFNldDxUPihlbGVtZW50cyk7CisgICAgICAgIHNldC5yZW1vdmUoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlcmUgZXhpc3RzIG5vIG5vbi1lbXB0eSBwcm9wZXIgc3Vic2V0IG9mIHsgzrExLCAuLi4sIM6xbiB9IHdpdGggdGhpcyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9wdGlvbmFsPFNldDxJbmZlcmVuY2VWYXJpYWJsZT4+IHNtYWxsZXN0U2V0V2l0aFByb3BlcnR5KFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gdW5pbnN0YW50aWF0ZWRWYXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFZhcmlhYmxlRGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIGZvciAoaW50IGk9MTtpPD11bmluc3RhbnRpYXRlZFZhcmlhYmxlcy5zaXplKCk7aSsrKSB7CisgICAgICAgICAgICBmb3IgKFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYVN1YlNldCA6IGJ1aWxkQWxsU3Vic2V0c09mU2l6ZSh1bmluc3RhbnRpYXRlZFZhcmlhYmxlcywgaSkpeworICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wZXJ0eShhU3ViU2V0LCBkZXBlbmRlbmNpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihhU3ViU2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaWYgzrFpIGRlcGVuZHMgb24gdGhlIHJlc29sdXRpb24gb2YgYSB2YXJpYWJsZSDOsiwgdGhlbiBlaXRoZXIgzrIgaGFzIGFuIGluc3RhbnRpYXRpb24KKyAgICAgKiBvciB0aGVyZSBpcyBzb21lIGogc3VjaCB0aGF0IM6yID0gzrFqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQcm9wZXJ0eShTZXQ8SW5mZXJlbmNlVmFyaWFibGU+IGFscGhhcywgTGlzdDxWYXJpYWJsZURlcGVuZGVuY3k+IGRlcGVuZGVuY2llcykgeworICAgICAgICBmb3IgKEluZmVyZW5jZVZhcmlhYmxlIGFscGhhSTogYWxwaGFzKSB7CisgICAgICAgICAgICBmb3IgKEluZmVyZW5jZVZhcmlhYmxlIGJldGE6IGRlcGVuZGVuY2llcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGQgLT4gZC5kZXBlbmRpbmcuZXF1YWxzKGFscGhhSSkpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZCAtPiAhZC5pc1JlZmxleGl2ZSgpKQorICAgICAgICAgICAgICAgICAgICAubWFwKGQgLT4gZC5kZXBlbmRlZE9uKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSkgeworICAgICAgICAgICAgICAgIGlmICghaGFzSW5zdGFudGlhdGlvbkZvcihiZXRhKSAmJiAhdGhlcmVJc1NvbWVKU3VjaFRoYXTOsmVxdWFsQWxwaGFKKGFscGhhcywgYmV0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGFtaW5lcyB0aGUgYm91bmRzIG9uIGFuIGluZmVyZW5jZSB2YXJpYWJsZSBhbmQgZGV0ZXJtaW5lcyBhbiBpbnN0YW50aWF0aW9uIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRob3NlCisgICAgICogYm91bmRzLiBJdCBhbHNvIGRlY2lkZXMgdGhlIG9yZGVyIGluIHdoaWNoIGludGVyZGVwZW5kZW50IGluZmVyZW5jZSB2YXJpYWJsZXMgYXJlIHRvIGJlIHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxJbnN0YW50aWF0aW9uU2V0PiBwZXJmb3JtUmVzb2x1dGlvbihMaXN0PEluZmVyZW5jZVZhcmlhYmxlPiB2YXJpYWJsZXNUb1Jlc29sdmUsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworCisgICAgICAgIGlmICh0aGlzLmNvbnRhaW5zRmFsc2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFZhcmlhYmxlRGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIC8vIEdpdmVuIGEgYm91bmQgc2V0IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgYm91bmQgZmFsc2UsIGEgc3Vic2V0IG9mIHRoZSBpbmZlcmVuY2UgdmFyaWFibGVzIG1lbnRpb25lZCBieQorICAgICAgICAvLyB0aGUgYm91bmQgc2V0IG1heSBiZSByZXNvbHZlZC4gVGhpcyBtZWFucyB0aGF0IGEgc2F0aXNmYWN0b3J5IGluc3RhbnRpYXRpb24gbWF5IGJlIGFkZGVkIHRvIHRoZSBzZXQgZm9yIGVhY2gKKyAgICAgICAgLy8gaW5mZXJlbmNlIHZhcmlhYmxlLCB1bnRpbCBhbGwgdGhlIHJlcXVlc3RlZCB2YXJpYWJsZXMgaGF2ZSBpbnN0YW50aWF0aW9ucy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVwZW5kZW5jaWVzIGluIHRoZSBib3VuZCBzZXQgbWF5IHJlcXVpcmUgdGhhdCB0aGUgdmFyaWFibGVzIGJlIHJlc29sdmVkIGluIGEgcGFydGljdWxhciBvcmRlciwgb3IgdGhhdAorICAgICAgICAvLyBhZGRpdGlvbmFsIHZhcmlhYmxlcyBiZSByZXNvbHZlZC4gRGVwZW5kZW5jaWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9sbG93czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBHaXZlbiBhIGJvdW5kIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zLCB3aGVyZSBUIGlzIGVpdGhlciBhbiBpbmZlcmVuY2UgdmFyaWFibGUgzrIgb3IgYSB0eXBlIHRoYXQKKyAgICAgICAgLy8gbWVudGlvbnMgzrI6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSDOsSA9IFQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIM6xIDw6IFQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIFQgPSDOsQorICAgICAgICAvLworICAgICAgICAvLyAgIC0gVCA8OiDOsQorICAgICAgICAvLworICAgICAgICAvLyAgIElmIM6xIGFwcGVhcnMgb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFub3RoZXIgYm91bmQgb2YgdGhlIGZvcm0gRzwuLi4sIM6xLCAuLi4+ID0gY2FwdHVyZShHPC4uLj4pLCB0aGVuIM6yCisgICAgICAgIC8vICAgZGVwZW5kcyBvbiB0aGUgcmVzb2x1dGlvbiBvZiDOsS4gT3RoZXJ3aXNlLCDOsSBkZXBlbmRzIG9uIHRoZSByZXNvbHV0aW9uIG9mIM6yLgorCisgICAgICAgIGZvciAoQm91bmQgYiA6IGJvdW5kcykgeworICAgICAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBDYXB0dXJlc0JvdW5kKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtIEFuIGluZmVyZW5jZSB2YXJpYWJsZSDOsSBhcHBlYXJpbmcgb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgYm91bmQgb2YgdGhlIGZvcm0KKyAgICAgICAgLy8gICBHPC4uLiwgzrEsIC4uLj4gPSBjYXB0dXJlKEc8Li4uPikgZGVwZW5kcyBvbiB0aGUgcmVzb2x1dGlvbiBvZiBldmVyeSBvdGhlciBpbmZlcmVuY2UgdmFyaWFibGUgbWVudGlvbmVkIGluCisgICAgICAgIC8vICAgdGhpcyBib3VuZCAob24gYm90aCBzaWRlcyBvZiB0aGUgPSBzaWduKS4KKworICAgICAgICBmb3IgKEJvdW5kIGIgOiBib3VuZHMpIHsKKyAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgQ2FwdHVyZXNCb3VuZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gLSBBbiBpbmZlcmVuY2UgdmFyaWFibGUgzrEgZGVwZW5kcyBvbiB0aGUgcmVzb2x1dGlvbiBvZiBhbiBpbmZlcmVuY2UgdmFyaWFibGUgzrIgaWYgdGhlcmUgZXhpc3RzIGFuIGluZmVyZW5jZQorICAgICAgICAvLyAgIHZhcmlhYmxlIM6zIHN1Y2ggdGhhdCDOsSBkZXBlbmRzIG9uIHRoZSByZXNvbHV0aW9uIG9mIM6zIGFuZCDOsyBkZXBlbmRzIG9uIHRoZSByZXNvbHV0aW9uIG9mIM6yLgorCisgICAgICAgIGZvciAoaW50IGk9MDtpPGRlcGVuZGVuY2llcy5zaXplKCk7aSsrKSB7CisgICAgICAgICAgICBWYXJpYWJsZURlcGVuZGVuY3kgZGkgPSBkZXBlbmRlbmNpZXMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChpbnQgaj1pKzE7ajxkZXBlbmRlbmNpZXMuc2l6ZSgpO2orKykgeworICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVwZW5kZW5jeSBkaiA9IGRlcGVuZGVuY2llcy5nZXQoaik7CisgICAgICAgICAgICAgICAgaWYgKGRpLmRlcGVuZGVkT24uZXF1YWxzKGRqLmRlcGVuZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChuZXcgVmFyaWFibGVEZXBlbmRlbmN5KGRpLmdldERlcGVuZGluZygpLCBkai5nZXREZXBlbmRlZE9uKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtIEFuIGluZmVyZW5jZSB2YXJpYWJsZSDOsSBkZXBlbmRzIG9uIHRoZSByZXNvbHV0aW9uIG9mIGl0c2VsZi4KKworICAgICAgICBmb3IgKEluZmVyZW5jZVZhcmlhYmxlIHYgOiBhbGxJbmZlcmVuY2VWYXJpYWJsZXMoKSkgeworICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChuZXcgVmFyaWFibGVEZXBlbmRlbmN5KHYsIHYpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdpdmVuIGEgc2V0IG9mIGluZmVyZW5jZSB2YXJpYWJsZXMgdG8gcmVzb2x2ZSwgbGV0IFYgYmUgdGhlIHVuaW9uIG9mIHRoaXMgc2V0IGFuZCBhbGwgdmFyaWFibGVzIHVwb24gd2hpY2gKKyAgICAgICAgLy8gdGhlIHJlc29sdXRpb24gb2YgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIGluIHRoaXMgc2V0IGRlcGVuZHMuCisKKyAgICAgICAgU2V0PEluZmVyZW5jZVZhcmlhYmxlPiBWID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBWLmFkZEFsbCh2YXJpYWJsZXNUb1Jlc29sdmUpOworICAgICAgICBmb3IgKFZhcmlhYmxlRGVwZW5kZW5jeSBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICBpZiAodmFyaWFibGVzVG9SZXNvbHZlLmNvbnRhaW5zKGRlcGVuZGVuY3kuZGVwZW5kaW5nKSkgeworICAgICAgICAgICAgICAgIFYuYWRkKGRlcGVuZGVuY3kuZGVwZW5kZWRPbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBldmVyeSB2YXJpYWJsZSBpbiBWIGhhcyBhbiBpbnN0YW50aWF0aW9uLCB0aGVuIHJlc29sdXRpb24gc3VjY2VlZHMgYW5kIHRoaXMgcHJvY2VkdXJlIHRlcm1pbmF0ZXMuCisKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIGZvciAoSW5mZXJlbmNlVmFyaWFibGUgdiA6IFYpIHsKKyAgICAgICAgICAgIGlmICghaGFzSW5zdGFudGlhdGlvbkZvcih2KSkgeworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBJbnN0YW50aWF0aW9uU2V0IGluc3RhbnRpYXRpb25TZXQgPSBJbnN0YW50aWF0aW9uU2V0LmVtcHR5KCk7CisgICAgICAgICAgICBmb3IgKEluZmVyZW5jZVZhcmlhYmxlIHYgOiBWKSB7CisgICAgICAgICAgICAgICAgaW5zdGFudGlhdGlvblNldCA9IGluc3RhbnRpYXRpb25TZXQud2l0aEluc3RhbnRpYXRpb24oZ2V0SW5zdGFudGlhdGlvbkZvcih2KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoaW5zdGFudGlhdGlvblNldCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIGxldCB7IM6xMSwgLi4uLCDOsW4gfSBiZSBhIG5vbi1lbXB0eSBzdWJzZXQgb2YgdW5pbnN0YW50aWF0ZWQgdmFyaWFibGVzIGluIFYgc3VjaCB0aGF0IGkpCisgICAgICAgIC8vIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgbiksIGlmIM6xaSBkZXBlbmRzIG9uIHRoZSByZXNvbHV0aW9uIG9mIGEgdmFyaWFibGUgzrIsIHRoZW4gZWl0aGVyIM6yIGhhcyBhbiBpbnN0YW50aWF0aW9uCisgICAgICAgIC8vIG9yIHRoZXJlIGlzIHNvbWUgaiBzdWNoIHRoYXQgzrIgPSDOsWo7IGFuZCBpaSkgdGhlcmUgZXhpc3RzIG5vIG5vbi1lbXB0eSBwcm9wZXIgc3Vic2V0IG9mIHsgzrExLCAuLi4sIM6xbiB9CisgICAgICAgIC8vIHdpdGggdGhpcyBwcm9wZXJ0eS4KKworICAgICAgICBTZXQ8SW5mZXJlbmNlVmFyaWFibGU+IHVuaW5zdGFudGlhdGVkUG9ydGlvbk9mViA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChJbmZlcmVuY2VWYXJpYWJsZSB2IDogVikgeworICAgICAgICAgICAgaWYgKCFoYXNJbnN0YW50aWF0aW9uRm9yKHYpKSB7CisgICAgICAgICAgICAgICAgdW5pbnN0YW50aWF0ZWRQb3J0aW9uT2ZWLmFkZCh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYWxwaGFzOiBhbGxTZXRzV2l0aFByb3BlcnR5KHVuaW5zdGFudGlhdGVkUG9ydGlvbk9mViwgZGVwZW5kZW5jaWVzKSkgeworCisgICAgICAgICAgICAvLyBSZXNvbHV0aW9uIHByb2NlZWRzIGJ5IGdlbmVyYXRpbmcgYW4gaW5zdGFudGlhdGlvbiBmb3IgZWFjaCBvZiDOsTEsIC4uLiwgzrFuIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgLy8gYm91bmRzIGluIHRoZSBib3VuZCBzZXQ6CisKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzU29tZUNhcHR1cmVGb3JBbHBoYXMgPSBhbHBoYXMuc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgICAgIGFscGhhSSAtPiBhcHBlYXJJbkxlZnRQYXJ0T2ZDYXB0dXJlKGFscGhhSSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8vIC0gSWYgdGhlIGJvdW5kIHNldCBkb2VzIG5vdCBjb250YWluIGEgYm91bmQgb2YgdGhlIGZvcm0gRzwuLi4sIM6xaSwgLi4uPiA9IGNhcHR1cmUoRzwuLi4+KQorICAgICAgICAgICAgLy8gICBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG4pLCB0aGVuIGEgY2FuZGlkYXRlIGluc3RhbnRpYXRpb24gVGkgaXMgZGVmaW5lZCBmb3IgZWFjaCDOsWk6CisKKyAgICAgICAgICAgIGlmICghaGFzU29tZUNhcHR1cmVGb3JBbHBoYXMpIHsKKyAgICAgICAgICAgICAgICBCb3VuZFNldCBuZXdCb3VuZHMgPSBCb3VuZFNldC5lbXB0eSgpOworICAgICAgICAgICAgICAgIGZvciAoSW5mZXJlbmNlVmFyaWFibGUgYWxwaGFJIDogYWxwaGFzKSB7CisgICAgICAgICAgICAgICAgICAgIFNldDxSZXNvbHZlZFR5cGU+IHByb3Blckxvd2VyQm91bmRzID0gYm91bmRzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihiIC0+IGIuaXNQcm9wZXJMb3dlckJvdW5kRm9yKGFscGhhSSkuaXNQcmVzZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChiIC0+IGIuaXNQcm9wZXJMb3dlckJvdW5kRm9yKGFscGhhSSkuZ2V0KCkuZ2V0UHJvcGVyVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFRpID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSWYgzrFpIGhhcyBvbmUgb3IgbW9yZSBwcm9wZXIgbG93ZXIgYm91bmRzLCBMMSwgLi4uLCBMaywgdGhlbiBUaSA9IGx1YihMMSwgLi4uLCBMaykgKMKnNC4xMC40KS4KKworICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVyTG93ZXJCb3VuZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGkgPSBsZWFzdFVwcGVyQm91bmQocHJvcGVyTG93ZXJCb3VuZHMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gICAtIE90aGVyd2lzZSwgaWYgdGhlIGJvdW5kIHNldCBjb250YWlucyB0aHJvd3MgzrFpLCBhbmQgdGhlIHByb3BlciB1cHBlciBib3VuZHMgb2YgzrFpIGFyZSwgYXQgbW9zdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIEV4Y2VwdGlvbiwgVGhyb3dhYmxlLCBhbmQgT2JqZWN0LCB0aGVuIFRpID0gUnVudGltZUV4Y2VwdGlvbi4KKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRocm93c0JvdW5kID0gYm91bmRzLnN0cmVhbSgpLmFueU1hdGNoKGIgLT4gYi5pc1Rocm93c0JvdW5kT24oYWxwaGFJKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUaSA9PSBudWxsICYmIHRocm93c0JvdW5kICYmIHByb3BlclVwcGVyQm91bmRzQXJlQXRNb3N0RXhjZXB0aW9uVGhyb3dhYmxlQW5kT2JqZWN0KGFscGhhSSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVTb2x2ZXIuc29sdmVUeXBlKFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAgIC0gT3RoZXJ3aXNlLCB3aGVyZSDOsWkgaGFzIHByb3BlciB1cHBlciBib3VuZHMgVTEsIC4uLiwgVWssIFRpID0gZ2xiKFUxLCAuLi4sIFVrKSAowqc1LjEuMTApLgorCisgICAgICAgICAgICAgICAgICAgIGlmIChUaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8UmVzb2x2ZWRUeXBlPiBwcm9wZXJVcHBlckJvdW5kcyA9IGJvdW5kcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGIgLT4gYi5pc1Byb3BlclVwcGVyQm91bmRGb3IoYWxwaGFJKS5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChiIC0+IGIuaXNQcm9wZXJVcHBlckJvdW5kRm9yKGFscGhhSSkuZ2V0KCkuZ2V0UHJvcGVyVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlclVwcGVyQm91bmRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgVGkgPSBnbGIocHJvcGVyVXBwZXJCb3VuZHMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbmV3Qm91bmRzID0gbmV3Qm91bmRzLndpdGhCb3VuZChuZXcgU2FtZUFzQm91bmQoYWxwaGFJLCBUaSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vICAgVGhlIGJvdW5kcyDOsTEgPSBUMSwgLi4uLCDOsW4gPSBUbiBhcmUgaW5jb3Jwb3JhdGVkIHdpdGggdGhlIGN1cnJlbnQgYm91bmQgc2V0LgorCisgICAgICAgICAgICAgICAgQm91bmRTZXQgaW5jb3Jwb3JhdGVkQm91bmRTZXQgPSB0aGlzLmluY29ycG9yYXRlKG5ld0JvdW5kcywgdHlwZVNvbHZlcik7CisKKyAgICAgICAgICAgICAgICAvLyAgIElmIHRoZSByZXN1bHQgZG9lcyBub3QgY29udGFpbiB0aGUgYm91bmQgZmFsc2UsIHRoZW4gdGhlIHJlc3VsdCBiZWNvbWVzIHRoZSBuZXcgYm91bmQgc2V0LCBhbmQgcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgIC8vICAgcHJvY2VlZHMgYnkgc2VsZWN0aW5nIGEgbmV3IHNldCBvZiB2YXJpYWJsZXMgdG8gaW5zdGFudGlhdGUgKGlmIG5lY2Vzc2FyeSksIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICAgICAgICAgICAgICAgIGlmICghaW5jb3Jwb3JhdGVkQm91bmRTZXQuY29udGFpbnNGYWxzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmNvcnBvcmF0ZWRCb3VuZFNldC5wZXJmb3JtUmVzb2x1dGlvbih2YXJpYWJsZXNUb1Jlc29sdmUsIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vICAgT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGNvbnRhaW5zIHRoZSBib3VuZCBmYWxzZSwgc28gYSBzZWNvbmQgYXR0ZW1wdCBpcyBtYWRlIHRvIGluc3RhbnRpYXRlIHsgzrExLCAuLi4sIM6xbiB9CisgICAgICAgICAgICAgICAgLy8gICBieSBwZXJmb3JtaW5nIHRoZSBzdGVwIGJlbG93LgorCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC0gSWYgdGhlIGJvdW5kIHNldCBjb250YWlucyBhIGJvdW5kIG9mIHRoZSBmb3JtIEc8Li4uLCDOsWksIC4uLj4gPSBjYXB0dXJlKEc8Li4uPikgZm9yIHNvbWUgaSAoMSDiiaQgaSDiiaQgbiksIG9yOworCisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vICAgSWYgdGhlIGJvdW5kIHNldCBwcm9kdWNlZCBpbiB0aGUgc3RlcCBhYm92ZSBjb250YWlucyB0aGUgYm91bmQgZmFsc2U7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgIHRoZW4gbGV0IFkxLCAuLi4sIFluIGJlIGZyZXNoIHR5cGUgdmFyaWFibGVzIHdob3NlIGJvdW5kcyBhcmUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgLSBGb3IgYWxsIGkgKDEg4omkIGkg4omkIG4pLCBpZiDOsWkgaGFzIG9uZSBvciBtb3JlIHByb3BlciBsb3dlciBib3VuZHMgTDEsIC4uLiwgTGssIHRoZW4gbGV0IHRoZSBsb3dlciBib3VuZAorICAgICAgICAgICAgICAgIC8vICAgICBvZiBZaSBiZSBsdWIoTDEsIC4uLiwgTGspOyBpZiBub3QsIHRoZW4gWWkgaGFzIG5vIGxvd2VyIGJvdW5kLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAtIEZvciBhbGwgaSAoMSDiiaQgaSDiiaQgbiksIHdoZXJlIM6xaSBoYXMgdXBwZXIgYm91bmRzIFUxLCAuLi4sIFVrLCBsZXQgdGhlIHVwcGVyIGJvdW5kIG9mIFlpIGJlCisgICAgICAgICAgICAgICAgLy8gICAgIGdsYihVMSDOuCwgLi4uLCBVayDOuCksIHdoZXJlIM64IGlzIHRoZSBzdWJzdGl0dXRpb24gW86xMTo9WTEsIC4uLiwgzrFuOj1Zbl0uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgIElmIHRoZSB0eXBlIHZhcmlhYmxlcyBZMSwgLi4uLCBZbiBkbyBub3QgaGF2ZSB3ZWxsLWZvcm1lZCBib3VuZHMgKHRoYXQgaXMsIGEgbG93ZXIgYm91bmQgaXMgbm90IGEgc3VidHlwZQorICAgICAgICAgICAgICAgIC8vICAgb2YgYW4gdXBwZXIgYm91bmQsIG9yIGFuIGludGVyc2VjdGlvbiB0eXBlIGlzIGluY29uc2lzdGVudCksIHRoZW4gcmVzb2x1dGlvbiBmYWlscy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgT3RoZXJ3aXNlLCBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG4pLCBhbGwgYm91bmRzIG9mIHRoZSBmb3JtIEc8Li4uLCDOsWksIC4uLj4gPSBjYXB0dXJlKEc8Li4uPikgYXJlIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAvLyAgIGZyb20gdGhlIGN1cnJlbnQgYm91bmQgc2V0LCBhbmQgdGhlIGJvdW5kcyDOsTEgPSBZMSwgLi4uLCDOsW4gPSBZbiBhcmUgaW5jb3Jwb3JhdGVkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICBJZiB0aGUgcmVzdWx0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGJvdW5kIGZhbHNlLCB0aGVuIHRoZSByZXN1bHQgYmVjb21lcyB0aGUgbmV3IGJvdW5kIHNldCwgYW5kIHJlc29sdXRpb24KKyAgICAgICAgICAgICAgICAvLyAgIHByb2NlZWRzIGJ5IHNlbGVjdGluZyBhIG5ldyBzZXQgb2YgdmFyaWFibGVzIHRvIGluc3RhbnRpYXRlIChpZiBuZWNlc3NhcnkpLCBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBjb250YWlucyB0aGUgYm91bmQgZmFsc2UsIGFuZCByZXNvbHV0aW9uIGZhaWxzLgorCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8U2V0PEluZmVyZW5jZVZhcmlhYmxlPj4gYWxsUG9zc2libGVTZXRzV2l0aFByb3BlcnR5KFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYWxsRWxlbWVudHMsIExpc3Q8VmFyaWFibGVEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgU2V0PFNldDxJbmZlcmVuY2VWYXJpYWJsZT4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaT0xO2k8PWFsbEVsZW1lbnRzLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgIGZvciAoU2V0PEluZmVyZW5jZVZhcmlhYmxlPiBhU3ViU2V0IDogYnVpbGRBbGxTdWJzZXRzT2ZTaXplKGFsbEVsZW1lbnRzLCBpKSl7CisgICAgICAgICAgICAgICAgaWYgKGhhc1Byb3BlcnR5KGFTdWJTZXQsIGRlcGVuZGVuY2llcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChhU3ViU2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdGhlcmVBcmVQcm9wZXJTdWJzZXRzKFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYVNldCwgU2V0PFNldDxJbmZlcmVuY2VWYXJpYWJsZT4+IGFsbFBvc3NpYmxlU2V0cykgeworICAgICAgICBmb3IgKFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYW5vdGhlclNldCA6IGFsbFBvc3NpYmxlU2V0cykgeworICAgICAgICAgICAgaWYgKCFhbm90aGVyU2V0LmVxdWFscyhhU2V0KSkgeworICAgICAgICAgICAgICAgIGlmIChpc1RoZUZpcnN0QVByb3BlclN1YnNldE9mVGhlU2Vjb25kKGFub3RoZXJTZXQsIGFTZXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGhlRmlyc3RBUHJvcGVyU3Vic2V0T2ZUaGVTZWNvbmQoU2V0PEluZmVyZW5jZVZhcmlhYmxlPiBzdWJzZXQsIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gb3JpZ2luYWxTZXQpIHsKKyAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2V0LmNvbnRhaW5zQWxsKHN1YnNldCkgJiYgb3JpZ2luYWxTZXQuc2l6ZSgpID4gc3Vic2V0LnNpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNldDxTZXQ8SW5mZXJlbmNlVmFyaWFibGU+PiBhbGxTZXRzV2l0aFByb3BlcnR5KFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYWxsRWxlbWVudHMsIExpc3Q8VmFyaWFibGVEZXBlbmRlbmN5PiBkZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgU2V0PFNldDxJbmZlcmVuY2VWYXJpYWJsZT4+IGFsbFBvc3NpYmxlU2V0cyA9IGFsbFBvc3NpYmxlU2V0c1dpdGhQcm9wZXJ0eShhbGxFbGVtZW50cywgZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgU2V0PFNldDxJbmZlcmVuY2VWYXJpYWJsZT4+IHNlbGVjdGVkID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gYVNldCA6IGFsbFBvc3NpYmxlU2V0cykgeworICAgICAgICAgICAgaWYgKCF0aGVyZUFyZVByb3BlclN1YnNldHMoYVNldCwgYWxsUG9zc2libGVTZXRzKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkLmFkZChhU2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHByb3BlclVwcGVyQm91bmRzQXJlQXRNb3N0RXhjZXB0aW9uVGhyb3dhYmxlQW5kT2JqZWN0KEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBhcHBlYXJJbkxlZnRQYXJ0T2ZDYXB0dXJlKEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlKSB7CisgICAgICAgIGZvciAoQm91bmQgYiA6IGJvdW5kcykgeworICAgICAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBDYXB0dXJlc0JvdW5kKSB7CisgICAgICAgICAgICAgICAgQ2FwdHVyZXNCb3VuZCBjYXB0dXJlc0JvdW5kID0gKENhcHR1cmVzQm91bmQpYjsKKyAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZXNCb3VuZC5nZXRJbmZlcmVuY2VWYXJpYWJsZXMoKS5jb250YWlucyhpbmZlcmVuY2VWYXJpYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxCb3VuZD4gZ2V0UHJvcGVyVXBwZXJCb3VuZHNGb3IoSW5mZXJlbmNlVmFyaWFibGUgaW5mZXJlbmNlVmFyaWFibGUpIHsKKyAgICAgICAgcmV0dXJuIGJvdW5kcy5zdHJlYW0oKS5maWx0ZXIoYiAtPiBiLmlzUHJvcGVyVXBwZXJCb3VuZEZvcihpbmZlcmVuY2VWYXJpYWJsZSkuaXNQcmVzZW50KCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Db25zdHJhaW50Rm9ybXVsYS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Db25zdHJhaW50Rm9ybXVsYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZmQwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0NvbnN0cmFpbnRGb3JtdWxhLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIENvbnN0cmFpbnQgZm9ybXVsYXMgYXJlIGFzc2VydGlvbnMgb2YgY29tcGF0aWJpbGl0eSBvciBzdWJ0eXBpbmcgdGhhdCBtYXkgaW52b2x2ZSBpbmZlcmVuY2UgdmFyaWFibGVzLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludEZvcm11bGEgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWR1Y3Rpb25SZXN1bHQgeworICAgICAgICBwcml2YXRlIEJvdW5kU2V0IGJvdW5kU2V0OworICAgICAgICBwcml2YXRlIExpc3Q8Q29uc3RyYWludEZvcm11bGE+IGNvbnN0cmFpbnRGb3JtdWxhczsKKworICAgICAgICBwdWJsaWMgQm91bmRTZXQgZ2V0Qm91bmRTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gYm91bmRTZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxDb25zdHJhaW50Rm9ybXVsYT4gZ2V0Q29uc3RyYWludEZvcm11bGFzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRGb3JtdWxhczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVkdWN0aW9uUmVzdWx0IGVtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWR1Y3Rpb25SZXN1bHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWR1Y3Rpb25SZXN1bHQgd2l0aENvbnN0cmFpbnQoQ29uc3RyYWludEZvcm11bGEgY29uc3RyYWludEZvcm11bGEpIHsKKyAgICAgICAgICAgIFJlZHVjdGlvblJlc3VsdCBuZXdJbnN0YW5jZSA9IG5ldyBSZWR1Y3Rpb25SZXN1bHQoKTsKKyAgICAgICAgICAgIG5ld0luc3RhbmNlLmJvdW5kU2V0ID0gdGhpcy5ib3VuZFNldDsKKyAgICAgICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cmFpbnRGb3JtdWxhcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cmFpbnRGb3JtdWxhcy5hZGRBbGwodGhpcy5jb25zdHJhaW50Rm9ybXVsYXMpOworICAgICAgICAgICAgbmV3SW5zdGFuY2UuY29uc3RyYWludEZvcm11bGFzLmFkZChjb25zdHJhaW50Rm9ybXVsYSk7CisgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVkdWN0aW9uUmVzdWx0IHdpdGhCb3VuZChCb3VuZCBib3VuZCkgeworICAgICAgICAgICAgUmVkdWN0aW9uUmVzdWx0IG5ld0luc3RhbmNlID0gbmV3IFJlZHVjdGlvblJlc3VsdCgpOworICAgICAgICAgICAgbmV3SW5zdGFuY2UuYm91bmRTZXQgPSB0aGlzLmJvdW5kU2V0LndpdGhCb3VuZChib3VuZCk7CisgICAgICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJhaW50Rm9ybXVsYXMgPSB0aGlzLmNvbnN0cmFpbnRGb3JtdWxhczsKKyAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVkdWN0aW9uUmVzdWx0KCkgeworICAgICAgICAgICAgdGhpcy5ib3VuZFNldCA9IEJvdW5kU2V0LmVtcHR5KCk7CisgICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnRGb3JtdWxhcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVkdWN0aW9uUmVzdWx0IHRydWVSZXN1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVkdWN0aW9uUmVzdWx0IGZhbHNlUmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCkud2l0aEJvdW5kKEJvdW5kLmZhbHNlQm91bmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgUmVkdWN0aW9uUmVzdWx0IHRoYXQgPSAoUmVkdWN0aW9uUmVzdWx0KSBvOworCisgICAgICAgICAgICBpZiAoIWJvdW5kU2V0LmVxdWFscyh0aGF0LmJvdW5kU2V0KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRGb3JtdWxhcy5lcXVhbHModGhhdC5jb25zdHJhaW50Rm9ybXVsYXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gYm91bmRTZXQuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgY29uc3RyYWludEZvcm11bGFzLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlZHVjdGlvblJlc3VsdHsiICsKKyAgICAgICAgICAgICAgICAgICAgImJvdW5kU2V0PSIgKyBib3VuZFNldCArCisgICAgICAgICAgICAgICAgICAgICIsIGNvbnN0cmFpbnRGb3JtdWxhcz0iICsgY29uc3RyYWludEZvcm11bGFzICsKKyAgICAgICAgICAgICAgICAgICAgJ30nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnN0cmFpbnRGb3JtdWxhIGdldENvbnN0cmFpbnQoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAoY29uc3RyYWludEZvcm11bGFzLnNpemUoKSA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnN0cmFpbnQgd2l0aCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG5vdCBhdmFpbGFibGUgYXMgdGhlcmUgYXJlICIgKyBjb25zdHJhaW50Rm9ybXVsYXMuc2l6ZSgpICsgIiBjb25zdHJhaW50cyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRGb3JtdWxhcy5nZXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBSZWR1Y3Rpb25SZXN1bHQgb25lQ29uc3RyYWludChDb25zdHJhaW50Rm9ybXVsYSBjb25zdHJhaW50Rm9ybXVsYSkgeworICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCkud2l0aENvbnN0cmFpbnQoY29uc3RyYWludEZvcm11bGEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBSZWR1Y3Rpb25SZXN1bHQgd2l0aENvbnN0cmFpbnRzKENvbnN0cmFpbnRGb3JtdWxhLi4uIGNvbnN0cmFpbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aENvbnN0cmFpbnRzKEFycmF5cy5hc0xpc3QoY29uc3RyYWludHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVkdWN0aW9uUmVzdWx0IG9uZUJvdW5kKEJvdW5kIGJvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZW1wdHkoKS53aXRoQm91bmQoYm91bmQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBSZWR1Y3Rpb25SZXN1bHQgd2l0aENvbnN0cmFpbnRzKExpc3Q8Q29uc3RyYWludEZvcm11bGE+IGNvbnN0cmFpbnRzKSB7CisgICAgICAgICAgICBSZWR1Y3Rpb25SZXN1bHQgcmVkdWN0aW9uUmVzdWx0ID0gbmV3IFJlZHVjdGlvblJlc3VsdCgpOworICAgICAgICAgICAgcmVkdWN0aW9uUmVzdWx0LmNvbnN0cmFpbnRGb3JtdWxhcy5hZGRBbGwoY29uc3RyYWludHMpOworICAgICAgICAgICAgcmV0dXJuIHJlZHVjdGlvblJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVkdWN0aW9uUmVzdWx0IGJvdW5kcyhCb3VuZFNldCBib3VuZHMpIHsKKyAgICAgICAgICAgIFJlZHVjdGlvblJlc3VsdCByZWR1Y3Rpb25SZXN1bHQgPSBuZXcgUmVkdWN0aW9uUmVzdWx0KCk7CisgICAgICAgICAgICByZWR1Y3Rpb25SZXN1bHQuYm91bmRTZXQgPSBib3VuZHM7CisgICAgICAgICAgICByZXR1cm4gcmVkdWN0aW9uUmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmb3JtdWxhIGlzIHJlZHVjZWQgdG8gb25lIG9yIGJvdGggb2Y6CisgICAgICogaSkgQSBib3VuZCBvciBib3VuZCBzZXQsIHdoaWNoIGlzIHRvIGJlIGluY29ycG9yYXRlZCB3aXRoIHRoZSAiY3VycmVudCIgYm91bmQgc2V0LiBJbml0aWFsbHksIHRoZSBjdXJyZW50IGJvdW5kCisgICAgICogICAgc2V0IGlzIGVtcHR5LgorICAgICAqIGlpKSBGdXJ0aGVyIGNvbnN0cmFpbnQgZm9ybXVsYXMsIHdoaWNoIGFyZSB0byBiZSByZWR1Y2VkIHJlY3Vyc2l2ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZWR1Y3Rpb25SZXN1bHQgcmVkdWNlKEJvdW5kU2V0IGN1cnJlbnRCb3VuZFNldCk7CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvQ29uc3RyYWludEZvcm11bGFTZXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvQ29uc3RyYWludEZvcm11bGFTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E2ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Db25zdHJhaW50Rm9ybXVsYVNldC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgQ29uc3RyYWludEZvcm11bGFTZXQgeworICAgIHByaXZhdGUgTGlzdDxDb25zdHJhaW50Rm9ybXVsYT4gY29uc3RyYWludEZvcm11bGFzOworCisgICAgcHVibGljIENvbnN0cmFpbnRGb3JtdWxhU2V0IHdpdGhDb25zdHJhaW50KENvbnN0cmFpbnRGb3JtdWxhIGNvbnN0cmFpbnRGb3JtdWxhKSB7CisgICAgICAgIENvbnN0cmFpbnRGb3JtdWxhU2V0IG5ld0luc3RhbmNlID0gbmV3IENvbnN0cmFpbnRGb3JtdWxhU2V0KCk7CisgICAgICAgIG5ld0luc3RhbmNlLmNvbnN0cmFpbnRGb3JtdWxhcy5hZGRBbGwodGhpcy5jb25zdHJhaW50Rm9ybXVsYXMpOworICAgICAgICBuZXdJbnN0YW5jZS5jb25zdHJhaW50Rm9ybXVsYXMuYWRkKGNvbnN0cmFpbnRGb3JtdWxhKTsKKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnN0cmFpbnRGb3JtdWxhU2V0IEVNUFRZID0gbmV3IENvbnN0cmFpbnRGb3JtdWxhU2V0KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIENvbnN0cmFpbnRGb3JtdWxhU2V0IGVtcHR5KCkgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb25zdHJhaW50Rm9ybXVsYVNldCgpIHsKKyAgICAgICAgY29uc3RyYWludEZvcm11bGFzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGEgY29tcGF0aWJpbGl0eSBhc3NlcnRpb24gYWJvdXQgYW4gZXhwcmVzc2lvbiBvciB0eXBlLCBjYWxsZWQgYSBjb25zdHJhaW50IGZvcm11bGEsIGFuZCByZWR1Y2VzIGl0IHRvIGEKKyAgICAgKiBzZXQgb2YgYm91bmRzIG9uIGluZmVyZW5jZSB2YXJpYWJsZXMuIE9mdGVuLCBhIGNvbnN0cmFpbnQgZm9ybXVsYSByZWR1Y2VzIHRvIG90aGVyIGNvbnN0cmFpbnQgZm9ybXVsYXMsCisgICAgICogd2hpY2ggbXVzdCBiZSByZWN1cnNpdmVseSByZWR1Y2VkLiBBIHByb2NlZHVyZSBpcyBmb2xsb3dlZCB0byBpZGVudGlmeSB0aGVzZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgZm9ybXVsYXMgYW5kLAorICAgICAqIHVsdGltYXRlbHksIHRvIGV4cHJlc3MgdmlhIGEgYm91bmQgc2V0IHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBjaG9pY2VzIGZvciBpbmZlcnJlZCB0eXBlcyB3b3VsZCByZW5kZXIKKyAgICAgKiBlYWNoIGNvbnN0cmFpbnQgZm9ybXVsYSB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBCb3VuZFNldCByZWR1Y2UoVHlwZVNvbHZlciB0eXBlU29sdmVyKSB7CisgICAgICAgIExpc3Q8Q29uc3RyYWludEZvcm11bGE+IGNvbnN0cmFpbnRzID0gbmV3IExpbmtlZExpc3Q8Pihjb25zdHJhaW50Rm9ybXVsYXMpOworICAgICAgICBCb3VuZFNldCBib3VuZFNldCA9IEJvdW5kU2V0LmVtcHR5KCk7CisgICAgICAgIHdoaWxlIChjb25zdHJhaW50cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBDb25zdHJhaW50Rm9ybXVsYSBjb25zdHJhaW50Rm9ybXVsYSA9IGNvbnN0cmFpbnRzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIENvbnN0cmFpbnRGb3JtdWxhLlJlZHVjdGlvblJlc3VsdCByZWR1Y3Rpb25SZXN1bHQgPSBjb25zdHJhaW50Rm9ybXVsYS5yZWR1Y2UoYm91bmRTZXQpOworICAgICAgICAgICAgY29uc3RyYWludHMuYWRkQWxsKHJlZHVjdGlvblJlc3VsdC5nZXRDb25zdHJhaW50Rm9ybXVsYXMoKSk7CisgICAgICAgICAgICBib3VuZFNldC5pbmNvcnBvcmF0ZShyZWR1Y3Rpb25SZXN1bHQuZ2V0Qm91bmRTZXQoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvdW5kU2V0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBjb25zdHJhaW50Rm9ybXVsYXMuaXNFbXB0eSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvQ29udHJvbEZsb3dMb2dpYy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Db250cm9sRmxvd0xvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNDJlNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvQ29udHJvbEZsb3dMb2dpYy5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBDb25zaWRlciBDb250cm9sIEZsb3cgdG8gZGV0ZXJtaW5lIHdoaWNoIHN0YXRlbWVudHMgYXJlIHJlYWNoYWJsZS4KKyAqCisgKiBFeGNlcHQgZm9yIHRoZSBzcGVjaWFsIHRyZWF0bWVudCBvZiB3aGlsZSwgZG8sIGFuZCBmb3Igc3RhdGVtZW50cyB3aG9zZSBjb25kaXRpb24gZXhwcmVzc2lvbiBoYXMgdGhlIGNvbnN0YW50IHZhbHVlCisgKiB0cnVlLCB0aGUgdmFsdWVzIG9mIGV4cHJlc3Npb25zIGFyZSBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIHRoZSBmbG93IGFuYWx5c2lzLgorICoKKyAqIFNlZSBKTFMgMTQuMjEKKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENvbnRyb2xGbG93TG9naWMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udHJvbEZsb3dMb2dpYyBpbnN0YW5jZSA9IG5ldyBDb250cm9sRmxvd0xvZ2ljKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIENvbnRyb2xGbG93TG9naWMgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRyb2xGbG93TG9naWMoKSB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGJyZWFrIHN0YXRlbWVudCB3aXRoIG5vIGxhYmVsIGF0dGVtcHRzIHRvIHRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIGlubmVybW9zdCBlbmNsb3Npbmcgc3dpdGNoLCB3aGlsZSwgZG8sIG9yCisgICAgICogZm9yIHN0YXRlbWVudCBvZiB0aGUgaW1tZWRpYXRlbHkgZW5jbG9zaW5nIG1ldGhvZCBvciBpbml0aWFsaXplcjsgdGhpcyBzdGF0ZW1lbnQsIHdoaWNoIGlzIGNhbGxlZCB0aGUgYnJlYWsKKyAgICAgKiB0YXJnZXQsIHRoZW4gaW1tZWRpYXRlbHkgY29tcGxldGVzIG5vcm1hbGx5LgorICAgICAqCisgICAgICoKKyAgICAgKiBBIGJyZWFrIHN0YXRlbWVudCB3aXRoIGxhYmVsIElkZW50aWZpZXIgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgY29udHJvbCB0byB0aGUgZW5jbG9zaW5nIGxhYmVsZWQgc3RhdGVtZW50ICjCpzE0LjcpCisgICAgICogdGhhdCBoYXMgdGhlIHNhbWUgSWRlbnRpZmllciBhcyBpdHMgbGFiZWw7IHRoaXMgc3RhdGVtZW50LCB3aGljaCBpcyBjYWxsZWQgdGhlIGJyZWFrIHRhcmdldCwgdGhlbiBpbW1lZGlhdGVseQorICAgICAqIGNvbXBsZXRlcyBub3JtYWxseS4gSW4gdGhpcyBjYXNlLCB0aGUgYnJlYWsgdGFyZ2V0IG5lZWQgbm90IGJlIGEgc3dpdGNoLCB3aGlsZSwgZG8sIG9yIGZvciBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0YXRlbWVudCBicmVha1RhcmdldChCcmVha1N0bXQgYnJlYWtTdG10KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcmVhY2hhYmxlIGJyZWFrIHN0YXRlbWVudCBleGl0cyBhIHN0YXRlbWVudCBpZiwgd2l0aGluIHRoZSBicmVhayB0YXJnZXQsIGVpdGhlciB0aGVyZSBhcmUgbm8gdHJ5IHN0YXRlbWVudHMKKyAgICAgKiB3aG9zZSB0cnkgYmxvY2tzIGNvbnRhaW4gdGhlIGJyZWFrIHN0YXRlbWVudCwgb3IgdGhlcmUgYXJlIHRyeSBzdGF0ZW1lbnRzIHdob3NlIHRyeSBibG9ja3MgY29udGFpbiB0aGUgYnJlYWsKKyAgICAgKiBzdGF0ZW1lbnQgYW5kIGFsbCBmaW5hbGx5IGNsYXVzZXMgb2YgdGhvc2UgdHJ5IHN0YXRlbWVudHMgY2FuIGNvbXBsZXRlIG5vcm1hbGx5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4aXRUaGVTdGF0ZW1lbnQoQnJlYWtTdG10IGJyZWFrU3RtdCkgeworICAgICAgICBpZiAoIWlzUmVhY2hhYmxlKGJyZWFrU3RtdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTdGF0ZW1lbnQgYnJlYWtUYXJnZXQgPSBicmVha1RhcmdldChicmVha1N0bXQpOworICAgICAgICBmb3IgKFRyeVN0bXQgdHJ5U3RtdCA6IGNvbnRhaW5lZFRyeVN0bXRzKGJyZWFrVGFyZ2V0KSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zKHRyeVN0bXQuZ2V0VHJ5QmxvY2soKSwgYnJlYWtTdG10KSkgeworICAgICAgICAgICAgICAgIGlmICghdHJ5U3RtdC5nZXRGaW5hbGx5QmxvY2soKS5pc1ByZXNlbnQoKSAmJiAhY2FuQ29tcGxldGVOb3JtYWxseSh0cnlTdG10LmdldEZpbmFsbHlCbG9jaygpLmdldCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRpbnVlQURvU3RhdGVtZW50KENvbnRpbnVlU3RtdCBjb250aW51ZVN0bXQsIERvU3RtdCBkb1N0bXQpIHsKKyAgICAgICAgZm9yIChUcnlTdG10IHRyeVN0bXQgOiBjb250YWluZWRUcnlTdG10cyhjb250aW51ZVN0bXQpKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbnModHJ5U3RtdC5nZXRUcnlCbG9jaygpLCBjb250aW51ZVN0bXQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0cnlTdG10LmdldEZpbmFsbHlCbG9jaygpLmlzUHJlc2VudCgpICYmICFjYW5Db21wbGV0ZU5vcm1hbGx5KHRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFN0YXRlbWVudCBjb250YWluZXIsIFN0YXRlbWVudCBjb250YWluZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRyeVN0bXQ+IGNvbnRhaW5lZFRyeVN0bXRzKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8UCBleHRlbmRzIE5vZGU+IGJvb2xlYW4gcGFyZW50SXMoTm9kZSBub2RlLCBDbGFzczxQPiBwYXJlbnRDbGFzcykgeworICAgICAgICBpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRDbGFzcy5pc0luc3RhbmNlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNlZSBKTFMgMTQuMjEKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5Db21wbGV0ZU5vcm1hbGx5KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgaWYgKCFpc1JlYWNoYWJsZShzdGF0ZW1lbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgR2VuZXJpY1Zpc2l0b3I8Qm9vbGVhbiwgVm9pZD4gdmlzaXRvciA9IG5ldyBHZW5lcmljVmlzaXRvckFkYXB0ZXI8Qm9vbGVhbiwgVm9pZD4oKXsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoQmxvY2tTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICAgICAgLy8gQW4gZW1wdHkgYmxvY2sgdGhhdCBpcyBub3QgYSBzd2l0Y2ggYmxvY2sgY2FuIGNvbXBsZXRlIG5vcm1hbGx5IGlmZiBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICBpZiAobi5pc0VtcHR5KCkgJiYgIXBhcmVudElzKHN0YXRlbWVudCwgU3dpdGNoU3RtdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzUmVhY2hhYmxlKHN0YXRlbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEEgbm9uLWVtcHR5IGJsb2NrIHRoYXQgaXMgbm90IGEgc3dpdGNoIGJsb2NrIGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgdGhlIGxhc3Qgc3RhdGVtZW50IGluCisgICAgICAgICAgICAgICAgLy8gaXQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5LgorICAgICAgICAgICAgICAgIGlmICghbi5pc0VtcHR5KCkgJiYgIXBhcmVudElzKHN0YXRlbWVudCwgU3dpdGNoU3RtdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbkNvbXBsZXRlTm9ybWFsbHkobi5nZXRTdGF0ZW1lbnQobi5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpIC0gMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChMYWJlbGVkU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgICAgIC8vIEEgbGFiZWxlZCBzdGF0ZW1lbnQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgICAgICAgICAgLy8g4oCTIFRoZSBjb250YWluZWQgc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseS4KKyAgICAgICAgICAgICAgICAvLyDigJMgVGhlcmUgaXMgYSByZWFjaGFibGUgYnJlYWsgc3RhdGVtZW50IHRoYXQgZXhpdHMgdGhlIGxhYmVsZWQgc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KEVtcHR5U3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgICAgIC8vIEFuIGVtcHR5IHN0YXRlbWVudCBjYW4gY29tcGxldGUgbm9ybWFsbHkgaWZmIGl0IGlzIHJlYWNoYWJsZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gaXNSZWFjaGFibGUobik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gdmlzaXQoTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgICAgIC8vIEEgbG9jYWwgY2xhc3MgZGVjbGFyYXRpb24gc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgaXQgaXMgcmVhY2hhYmxlLgorICAgICAgICAgICAgICAgIHJldHVybiBpc1JlYWNoYWJsZShuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChJZlN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgICAgICBpZiAobi5nZXRFbHNlU3RtdCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGlmLXRoZW4tZWxzZSBzdGF0ZW1lbnQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5IGlmZiB0aGUgdGhlbi1zdGF0ZW1lbnQgY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlIG5vcm1hbGx5IG9yIHRoZSBlbHNlLXN0YXRlbWVudCBjYW4gY29tcGxldGUgbm9ybWFsbHkuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW5Db21wbGV0ZU5vcm1hbGx5KG4uZ2V0VGhlblN0bXQoKSkgfHwgY2FuQ29tcGxldGVOb3JtYWxseShuLmdldEVsc2VTdG10KCkuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGlmLXRoZW4gc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgaXQgaXMgcmVhY2hhYmxlLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNSZWFjaGFibGUobik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KEFzc2VydFN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgICAgICAvLyBBbiBhc3NlcnQgc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgaXQgaXMgcmVhY2hhYmxlLgorICAgICAgICAgICAgICAgIHJldHVybiBpc1JlYWNoYWJsZShuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChFeHByZXNzaW9uU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgICAgIC8vIEEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgaXQgaXMgcmVhY2hhYmxlLgorICAgICAgICAgICAgICAgIGlmIChuLmdldEV4cHJlc3Npb24oKSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSB7CisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGV4cHIgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIG4uZ2V0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNSZWFjaGFibGUobik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFuIGV4cHJlc3Npb24gc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgaXQgaXMgcmVhY2hhYmxlLgorICAgICAgICAgICAgICAgIHJldHVybiBpc1JlYWNoYWJsZShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5hY2NlcHQodmlzaXRvciwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhY2hhYmxlQmVjYXVzZU9mUG9zaXRpb24oU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICAvLyBUaGUgZmlyc3Qgc3RhdGVtZW50IGluIGEgbm9uLWVtcHR5IGJsb2NrIHRoYXQgaXMgbm90IGEgc3dpdGNoIGJsb2NrIGlzIHJlYWNoYWJsZSBpZmYgdGhlIGJsb2NrIGlzIHJlYWNoYWJsZS4KKworICAgICAgICAvLyBFdmVyeSBvdGhlciBzdGF0ZW1lbnQgUyBpbiBhIG5vbi1lbXB0eSBibG9jayB0aGF0IGlzIG5vdCBhIHN3aXRjaCBibG9jayBpcyByZWFjaGFibGUgaWZmIHRoZSBzdGF0ZW1lbnQKKyAgICAgICAgLy8gcHJlY2VkaW5nIFMgY2FuIGNvbXBsZXRlIG5vcm1hbGx5LgorCisgICAgICAgIC8vIFRoZSBjb250YWluZWQgc3RhdGVtZW50IG9mIGEgTGFiZWxsZWQgU3RhdGVtZW50IGlzIHJlYWNoYWJsZSBpZmYgdGhlIGxhYmVsZWQgc3RhdGVtZW50IGlzIHJlYWNoYWJsZS4KKworICAgICAgICAvLyBUaGUgdGhlbi1zdGF0ZW1lbnQgb2YgYW4gaWYtdGhlbiBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGlmZiB0aGUgaWYtdGhlbiBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlLgorCisgICAgICAgIC8vIFRoZSB0aGVuLXN0YXRlbWVudCBvZiBhbiBpZi10aGVuLWVsc2UgIHN0YXRlbWVudCBpcyByZWFjaGFibGUgaWZmIHRoZSBpZi10aGVuLWVsc2Ugc3RhdGVtZW50IGlzIHJlYWNoYWJsZS4KKyAgICAgICAgLy8gVGhlIGVsc2Utc3RhdGVtZW50IGlzIHJlYWNoYWJsZSBpZmYgdGhlIGlmLXRoZW4tZWxzZSBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlLgorCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKworICAgICAgICBHZW5lcmljVmlzaXRvcjxCb29sZWFuLCBWb2lkPiB2aXNpdG9yID0gbmV3IEdlbmVyaWNWaXNpdG9yQWRhcHRlcjxCb29sZWFuLCBWb2lkPigpeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChCbG9ja1N0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgYmxvY2sgdGhhdCBpcyB0aGUgYm9keSBvZiBhIGNvbnN0cnVjdG9yLCBtZXRob2QsIGluc3RhbmNlIGluaXRpYWxpemVyLCBvciBzdGF0aWMgaW5pdGlhbGl6ZXIgaXMKKyAgICAgICAgICAgICAgICAvLyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldFBhcmVudE5vZGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50LmdldFBhcmVudE5vZGUoKS5nZXQoKSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldCgpIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldCgpIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzUmVhY2hhYmxlQmVjYXVzZU9mUG9zaXRpb24oc3RhdGVtZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChMb2NhbENsYXNzRGVjbGFyYXRpb25TdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuYWNjZXB0KHZpc2l0b3IsIG51bGwpOworCisgICAgICAgIC8vCisgICAgICAgIC8vCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBBIHN3aXRjaCBzdGF0ZW1lbnQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5IGlmZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcworICAgICAgICAvL3RydWU6CisgICAgICAgIC8v4oCTIFRoZSBzd2l0Y2ggYmxvY2sgaXMgZW1wdHkgb3IgY29udGFpbnMgb25seSBzd2l0Y2ggbGFiZWxzLgorICAgICAgICAvL+KAkyBUaGUgbGFzdCBzdGF0ZW1lbnQgaW4gdGhlIHN3aXRjaCBibG9jayBjYW4gY29tcGxldGUgbm9ybWFsbHkuCisgICAgICAgIC8v4oCTIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzd2l0Y2ggbGFiZWwgYWZ0ZXIgdGhlIGxhc3Qgc3dpdGNoIGJsb2NrIHN0YXRlbWVudCBncm91cC4g4oCTIFRoZSBzd2l0Y2ggYmxvY2sgZG9lcyBub3QgY29udGFpbiBhIGRlZmF1bHQgbGFiZWwuCisgICAgICAgIC8v4oCTIFRoZXJlIGlzIGEgcmVhY2hhYmxlIGJyZWFrIHN0YXRlbWVudCB0aGF0IGV4aXRzIHRoZSBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgICAvLyAgICAgICAgQkxPQ0tTIEFORCBTVEFURU1FTlRTIFVucmVhY2hhYmxlIFN0YXRlbWVudHMgMTQuMjEKKyAgICAgICAgLy8KKyAgICAgICAgLy9BIHN3aXRjaCBibG9jayBpcyByZWFjaGFibGUgaWZmIGl0cyBzd2l0Y2ggc3RhdGVtZW50IGlzIHJlYWNoYWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIEEgc3RhdGVtZW50IGluIGEgc3dpdGNoIGJsb2NrIGlzIHJlYWNoYWJsZSBpZmYgaXRzIHN3aXRjaCBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlCisgICAgICAgIC8vYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgIC8v4oCTIEl0IGJlYXJzIGEgY2FzZSBvciBkZWZhdWx0IGxhYmVsLgorICAgICAgICAvL+KAkyBUaGVyZSBpcyBhIHN0YXRlbWVudCBwcmVjZWRpbmcgaXQgaW4gdGhlIHN3aXRjaCBibG9jayBhbmQgdGhhdCBwcmVjZWRpbmcgc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseS4KKyAgICAgICAgLy8KKyAgICAgICAgLy9BIHdoaWxlIHN0YXRlbWVudCBjYW4gY29tcGxldGUgbm9ybWFsbHkgaWZmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgIC8v4oCTIFRoZXdoaWxlc3RhdGVtZW50aXNyZWFjaGFibGVhbmR0aGVjb25kaXRpb25leHByZXNzaW9uaXNub3RhY29uc3RhbnQKKyAgICAgICAgLy9leHByZXNzaW9uICjCpzE1LjI4KSB3aXRoIHZhbHVlIHRydWUuCisgICAgICAgIC8v4oCTIFRoZXJlIGlzIGEgcmVhY2hhYmxlIGJyZWFrIHN0YXRlbWVudCB0aGF0IGV4aXRzIHRoZSB3aGlsZSBzdGF0ZW1lbnQuCisgICAgICAgIC8vICAgICAgICBUaGUgY29udGFpbmVkIHN0YXRlbWVudCBpcyByZWFjaGFibGUgaWZmIHRoZSB3aGlsZSBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGFuZCB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIEEgZG8gc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKKyAgICAgICAgLy/igJMgVGhlIGNvbnRhaW5lZCBzdGF0ZW1lbnQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5IGFuZCB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24KKyAgICAgICAgLy9pcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICjCpzE1LjI4KSB3aXRoIHZhbHVlIHRydWUuCisgICAgICAgIC8v4oCTIFRoZSBkbyBzdGF0ZW1lbnQgY29udGFpbnMgYSByZWFjaGFibGUgY29udGludWUgc3RhdGVtZW50IHdpdGggbm8gbGFiZWwsIGFuZCB0aGUgZG8gc3RhdGVtZW50IGlzIHRoZSBpbm5lcm1vc3Qgd2hpbGUsIGRvLCBvciBmb3Igc3RhdGVtZW50IHRoYXQgY29udGFpbnMgdGhhdCBjb250aW51ZSBzdGF0ZW1lbnQsIGFuZCB0aGUgY29udGludWUgc3RhdGVtZW50IGNvbnRpbnVlcyB0aGF0IGRvIHN0YXRlbWVudCwgYW5kIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIHdpdGggdmFsdWUgdHJ1ZS4KKyAgICAgICAgLy/igJMgVGhlIGRvIHN0YXRlbWVudCBjb250YWlucyBhIHJlYWNoYWJsZSBjb250aW51ZSBzdGF0ZW1lbnQgd2l0aCBhIGxhYmVsIEwsIGFuZCB0aGUgZG8gc3RhdGVtZW50IGhhcyBsYWJlbCBMLCBhbmQgdGhlIGNvbnRpbnVlIHN0YXRlbWVudCBjb250aW51ZXMgdGhhdCBkbyBzdGF0ZW1lbnQsIGFuZCB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiB3aXRoIHZhbHVlIHRydWUuCisgICAgICAgIC8v4oCTIFRoZXJlIGlzIGEgcmVhY2hhYmxlIGJyZWFrIHN0YXRlbWVudCB0aGF0IGV4aXRzIHRoZSBkbyBzdGF0ZW1lbnQuCisgICAgICAgIC8vICAgICAgICBUaGUgY29udGFpbmVkIHN0YXRlbWVudCBpcyByZWFjaGFibGUgaWZmIHRoZSBkbyBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlLgorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgQSBiYXNpYyBmb3Igc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgLy9pcyB0cnVlOgorICAgICAgICAvL+KAkyBUaGUgZm9yIHN0YXRlbWVudCBpcyByZWFjaGFibGUsIHRoZXJlIGlzIGEgY29uZGl0aW9uIGV4cHJlc3Npb24sIGFuZCB0aGUKKyAgICAgICAgLy9jb25kaXRpb24gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICjCpzE1LjI4KSB3aXRoIHZhbHVlIHRydWUuCisgICAgICAgIC8v4oCTIFRoZXJlIGlzIGEgcmVhY2hhYmxlIGJyZWFrIHN0YXRlbWVudCB0aGF0IGV4aXRzIHRoZSBmb3Igc3RhdGVtZW50LgorICAgICAgICAvLyAgICAgICAgVGhlIGNvbnRhaW5lZCBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGlmZiB0aGUgZm9yIHN0YXRlbWVudCBpcyByZWFjaGFibGUgYW5kIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGZhbHNlLgorICAgICAgICAvLworICAgICAgICAvL+KAoiBBbiBlbmhhbmNlZCBmb3Igc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgaXQgaXMgcmVhY2hhYmxlLgorICAgICAgICAvLworICAgICAgICAvL+KAoiBBIGJyZWFrLCBjb250aW51ZSwgcmV0dXJuLCBvciB0aHJvdyBzdGF0ZW1lbnQgY2Fubm90IGNvbXBsZXRlIG5vcm1hbGx5LgorICAgICAgICAvLworICAgICAgICAvL+KAoiBBIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5IGlmZiB0aGUgY29udGFpbmVkIHN0YXRlbWVudCBjYW4gY29tcGxldGUgbm9ybWFsbHkuCisgICAgICAgIC8vICAgICAgICBUaGUgY29udGFpbmVkIHN0YXRlbWVudCBpcyByZWFjaGFibGUgaWZmIHRoZSBzeW5jaHJvbml6ZWQgc3RhdGVtZW50IGlzIHJlYWNoYWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy/igKIgQSB0cnkgc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgYm90aCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOgorICAgICAgICAvL+KAkyBUaGUgdHJ5IGJsb2NrIGNhbiBjb21wbGV0ZSBub3JtYWxseSBvciBhbnkgY2F0Y2ggYmxvY2sgY2FuIGNvbXBsZXRlCisgICAgICAgIC8vbm9ybWFsbHkuCisgICAgICAgIC8v4oCTIElmdGhldHJ5c3RhdGVtZW50aGFzYWZpbmFsbHlibG9jayx0aGVudGhlZmluYWxseWJsb2NrY2FuY29tcGxldGUgbm9ybWFsbHkuCisgICAgICAgIC8vCisgICAgICAgIC8v4oCiIFRoZSB0cnkgYmxvY2sgaXMgcmVhY2hhYmxlIGlmZiB0aGUgdHJ5IHN0YXRlbWVudCBpcyByZWFjaGFibGUuCisgICAgICAgIC8vCisgICAgICAgIC8v4oCiIEEgY2F0Y2ggYmxvY2sgQyBpcyByZWFjaGFibGUgaWZmIGJvdGggb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZToKKyAgICAgICAgLy/igJMgRWl0aGVyIHRoZSB0eXBlIG9mIEMncyBwYXJhbWV0ZXIgaXMgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiB0eXBlIG9yIEV4Y2VwdGlvbiBvciBhIHN1cGVyY2xhc3Mgb2YgRXhjZXB0aW9uLCBvciBzb21lIGV4cHJlc3Npb24gb3IgdGhyb3cgc3RhdGVtZW50IGluIHRoZSB0cnkgYmxvY2sgaXMgcmVhY2hhYmxlIGFuZCBjYW4gdGhyb3cgYSBjaGVja2VkIGV4Y2VwdGlvbiB3aG9zZSB0eXBlIGlzIGFzc2lnbmFibGUgdG8gdGhlIHR5cGUgb2YgQydzIHBhcmFtZXRlci4gKEFuIGV4cHJlc3Npb24gaXMgcmVhY2hhYmxlIGlmZiB0aGUgaW5uZXJtb3N0IHN0YXRlbWVudCBjb250YWluaW5nIGl0IGlzIHJlYWNoYWJsZS4pCisgICAgICAgIC8vU2VlIMKnMTUuNiBmb3Igbm9ybWFsIGFuZCBhYnJ1cHQgY29tcGxldGlvbiBvZiBleHByZXNzaW9ucy4KKyAgICAgICAgLy/igJMgVGhlcmUgaXMgbm8gZWFybGllciBjYXRjaCBibG9jayBBIGluIHRoZSB0cnkgc3RhdGVtZW50IHN1Y2ggdGhhdCB0aGUgdHlwZSBvZiBDJ3MKKyAgICAgICAgLy9wYXJhbWV0ZXIgaXMgdGhlIHNhbWUgYXMgb3IgYSBzdWJjbGFzcyBvZiB0aGUgdHlwZSBvZiBBJ3MgcGFyYW1ldGVyLgorICAgICAgICAvL+KAoiBUaGUgQmxvY2sgb2YgYSBjYXRjaCBibG9jayBpcyByZWFjaGFibGUgaWZmIHRoZSBjYXRjaCBibG9jayBpcyByZWFjaGFibGUuCisgICAgICAgIC8v4oCiIElmIGEgZmluYWxseSBibG9jayBpcyBwcmVzZW50LCBpdCBpcyByZWFjaGFibGUgaWZmIHRoZSB0cnkgc3RhdGVtZW50IGlzIHJlYWNoYWJsZS4KKyAgICAgICAgLy8gICAgICAgIE9uZSBtaWdodCBleHBlY3QgdGhlIGlmIHN0YXRlbWVudCB0byBiZSBoYW5kbGVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyOgorICAgICAgICAvL+KAoiBBbiBpZi10aGVuIHN0YXRlbWVudCBjYW4gY29tcGxldGUgbm9ybWFsbHkgaWZmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgIC8v4oCTIFRoZSBpZi10aGVuIHN0YXRlbWVudCBpcyByZWFjaGFibGUgYW5kIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIHRydWUuCisgICAgICAgIC8v4oCTIFRoZSB0aGVuLXN0YXRlbWVudCBjYW4gY29tcGxldGUgbm9ybWFsbHkuCisgICAgICAgIC8vICAgICAgICBUaGUgdGhlbi1zdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGlmZiB0aGUgaWYtdGhlbiBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGFuZCB0aGUKKyAgICAgICAgLy9jb25kaXRpb24gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGZhbHNlLgorICAgICAgICAvL+KAoiBBbiBpZi10aGVuLWVsc2Ugc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBpZmYgdGhlIHRoZW4tc3RhdGVtZW50IGNhbiBjb21wbGV0ZSBub3JtYWxseSBvciB0aGUgZWxzZS1zdGF0ZW1lbnQgY2FuIGNvbXBsZXRlIG5vcm1hbGx5LgorICAgICAgICAvLyAgICAgICAgQkxPQ0tTIEFORCBTVEFURU1FTlRTIFVucmVhY2hhYmxlIFN0YXRlbWVudHMgMTQuMjEKKyAgICAgICAgLy9UaGUgdGhlbi1zdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGlmZiB0aGUgaWYtdGhlbi1lbHNlIHN0YXRlbWVudCBpcyByZWFjaGFibGUgYW5kIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGZhbHNlLgorICAgICAgICAvLyAgICAgICAgVGhlIGVsc2Utc3RhdGVtZW50IGlzIHJlYWNoYWJsZSBpZmYgdGhlIGlmLXRoZW4tZWxzZSBzdGF0ZW1lbnQgaXMgcmVhY2hhYmxlIGFuZCB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyB0cnVlLgorICAgICAgICAvLyAgICAgICAgVGhpcyBhcHByb2FjaCB3b3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHRyZWF0bWVudCBvZiBvdGhlciBjb250cm9sIHN0cnVjdHVyZXMuIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFsbG93IHRoZSBpZiBzdGF0ZW1lbnQgdG8gYmUgdXNlZCBjb252ZW5pZW50bHkgZm9yICJjb25kaXRpb25hbCBjb21waWxhdGlvbiIgcHVycG9zZXMsIHRoZSBhY3R1YWwgcnVsZXMgZGlmZmVyLgorCisgICAgICAgIC8vIEZJWE1FCisgICAgICAgIC8vdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvRXhwcmVzc2lvbkhlbHBlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9FeHByZXNzaW9uSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2MmVjZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvRXhwcmVzc2lvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkhlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBTZWUgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2pscy9zZTgvaHRtbC9qbHMtMTUuaHRtbCNqbHMtMTUuMgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGFuZGFsb25lRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgcmV0dXJuICFpc1BvbHlFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlOC9odG1sL2pscy0xNS5odG1sI2pscy0xNS4yCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BvbHlFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEVuY2xvc2VkRXhwcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGV4cHJlc3Npb24udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBPYmplY3RDcmVhdGlvbkV4cHIpIHsKKyAgICAgICAgICAgIC8vIEEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBpcyBhIHBvbHkgZXhwcmVzc2lvbiAowqcxNS4yKSBpZiBpdCB1c2VzIHRoZSBkaWFtb25kIGZvcm0gZm9yIHR5cGUKKyAgICAgICAgICAgIC8vIGFyZ3VtZW50cyB0byB0aGUgY2xhc3MsIGFuZCBpdCBhcHBlYXJzIGluIGFuIGFzc2lnbm1lbnQgY29udGV4dCBvciBhbiBpbnZvY2F0aW9uIGNvbnRleHQgKMKnNS4yLCDCpzUuMykuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGl0IGlzIGEgc3RhbmRhbG9uZSBleHByZXNzaW9uLgorICAgICAgICAgICAgT2JqZWN0Q3JlYXRpb25FeHByIG9iamVjdENyZWF0aW9uRXhwciA9IChPYmplY3RDcmVhdGlvbkV4cHIpZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIGlmIChvYmplY3RDcmVhdGlvbkV4cHIuaXNVc2luZ0RpYW1vbmRPcGVyYXRvcigpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGV4cHJlc3Npb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IChNZXRob2RDYWxsRXhwcilleHByZXNzaW9uOworCisgICAgICAgICAgICAvLyBBIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gaXMgYSBwb2x5IGV4cHJlc3Npb24gaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gMS4gVGhlIGludm9jYXRpb24gYXBwZWFycyBpbiBhbiBhc3NpZ25tZW50IGNvbnRleHQgb3IgYW4gaW52b2NhdGlvbiBjb250ZXh0ICjCpzUuMiwgwqc1LjMpLgorCisgICAgICAgICAgICBpZiAoIWFwcGVhcnNJbkFzc2lnbm1lbnRDb250ZXh0KGV4cHJlc3Npb24pIHx8IGFwcGVhcnNJbkludm9jYXRpb25Db250ZXh0KGV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAyLiBJZiB0aGUgaW52b2NhdGlvbiBpcyBxdWFsaWZpZWQgKHRoYXQgaXMsIGFueSBmb3JtIG9mIE1ldGhvZEludm9jYXRpb24gZXhjZXB0IGZvciB0aGUgZmlyc3QpLCB0aGVuCisgICAgICAgICAgICAvLyAgICB0aGUgaW52b2NhdGlvbiBlbGlkZXMgVHlwZUFyZ3VtZW50cyB0byB0aGUgbGVmdCBvZiB0aGUgSWRlbnRpZmllci4KKworICAgICAgICAgICAgaWYgKGlzUXVhbGlmaWVkKG1ldGhvZENhbGxFeHByKSAmJiAhZWxpZGVzVHlwZUFyZ3VtZW50cyhtZXRob2RDYWxsRXhwcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIDMuIFRoZSBtZXRob2QgdG8gYmUgaW52b2tlZCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLCBpcyBnZW5lcmljICjCpzguNC40KSBhbmQgaGFzIGEKKyAgICAgICAgICAgIC8vICAgIHJldHVybiB0eXBlIHRoYXQgbWVudGlvbnMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtZXRob2QncyB0eXBlIHBhcmFtZXRlcnMuCisKKyAgICAgICAgICAgIC8vYm9vbGVhbiBjb25kaXRpb24zID07CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZXhwcmVzc2lvbi50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgbWV0aG9kIGludm9jYXRpb24gZXhwcmVzc2lvbiBpcyBhIHN0YW5kYWxvbmUgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXRob2RSZWZlcmVuY2VFeHByKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZXhwcmVzc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGV4cHJlc3Npb24udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMYW1iZGFFeHByKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbGlkZXNUeXBlQXJndW1lbnRzKE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1YWxpZmllZChNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vIE5vdCBzdXJlIGlmIHNob3VsZCBsb29rIGlmIHRoZSBwYXJlbnQgaXMgYW4gYXNzaWdubWVudCBjb250ZXh0CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcHBlYXJzSW5Bc3NpZ25tZW50Q29udGV4dChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24uZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBOb2RlIHBhcmVudCA9IGV4cHJlc3Npb24uZ2V0UGFyZW50Tm9kZSgpLmdldCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdG10KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJldHVyblN0bXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ocGFyZW50LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcHBlYXJzSW5JbnZvY2F0aW9uQ29udGV4dChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24uZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBOb2RlIHBhcmVudCA9IGV4cHJlc3Npb24uZ2V0UGFyZW50Tm9kZSgpLmdldCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdG10KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ocGFyZW50LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXhwbGljaXRseVR5cGVkKExhbWJkYUV4cHIgbGFtYmRhRXhwcikgeworICAgICAgICByZXR1cm4gbGFtYmRhRXhwci5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuYWxsTWF0Y2gocCAtPiAhKHAuZ2V0VHlwZSgpIGluc3RhbmNlb2YgVW5rbm93blR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0UmVzdWx0RXhwcmVzc2lvbnMoQmxvY2tTdG10IGJsb2NrU3RtdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21wYXRpYmxlSW5Bc3NpZ25tZW50Q29udGV4dChFeHByZXNzaW9uIGV4cHJlc3Npb24sIFJlc29sdmVkVHlwZSB0eXBlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuaXNBc3NpZ25hYmxlQnkoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShleHByZXNzaW9uLCBmYWxzZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvSW5mZXJlbmNlVmFyaWFibGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvSW5mZXJlbmNlVmFyaWFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGI4ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9JbmZlcmVuY2VWYXJpYWJsZS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQXJlIG1ldGEtdmFyaWFibGVzIGZvciB0eXBlcyAtIHRoYXQgaXMsIHRoZXkgYXJlIHNwZWNpYWwgbmFtZXMgdGhhdCBhbGxvdyBhYnN0cmFjdCByZWFzb25pbmcgYWJvdXQgdHlwZXMuCisgKiBUbyBkaXN0aW5ndWlzaCB0aGVtIGZyb20gdHlwZSB2YXJpYWJsZXMsIGluZmVyZW5jZSB2YXJpYWJsZXMgYXJlIHJlcHJlc2VudGVkIHdpdGggR3JlZWsgbGV0dGVycywgcHJpbmNpcGFsbHkgzrEuCisgKgorICogU2VlIEpMUyAxOAorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSW5mZXJlbmNlVmFyaWFibGUgaW1wbGVtZW50cyBSZXNvbHZlZFR5cGUgeworICAgIHByaXZhdGUgc3RhdGljIGludCB1bm5hbWVkSW5zdGFudGlhdGVkID0gMDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8SW5mZXJlbmNlVmFyaWFibGU+IGluc3RhbnRpYXRlKExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgTGlzdDxJbmZlcmVuY2VWYXJpYWJsZT4gaW5mZXJlbmNlVmFyaWFibGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwIDogdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaW5mZXJlbmNlVmFyaWFibGVzLmFkZChJbmZlcmVuY2VWYXJpYWJsZS51bm5hbWVkKHRwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZmVyZW5jZVZhcmlhYmxlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEluZmVyZW5jZVZhcmlhYmxlIHVubmFtZWQoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5mZXJlbmNlVmFyaWFibGUoIl9fdW5uYW1lZF9fIiArICh1bm5hbWVkSW5zdGFudGlhdGVkKyspLCB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBJbmZlcmVuY2VWYXJpYWJsZShTdHJpbmcgbmFtZSwgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uID0gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpYmUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIHRoYXQgPSAoSW5mZXJlbmNlVmFyaWFibGUpIG87CisKKyAgICAgICAgaWYgKCFuYW1lLmVxdWFscyh0aGF0Lm5hbWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gIT0gbnVsbCA/IHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5lcXVhbHModGhhdC50eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pCisgICAgICAgICAgICAgICAgOiB0aGF0LnR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9PSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiAhPSBudWxsID8gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLmVxdWFscyh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJXZSBhcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgYXNzaWduYWJpbGl0eSBvZiBhbiBpbmZlcmVuY2UgdmFyaWFibGUgd2l0aG91dCBrbm93aW5nIHRoZSBib3VuZHMgYW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnN0cmFpbnRzIik7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIGdldFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSW5mZXJlbmNlVmFyaWFibGV7IiArCisgICAgICAgICAgICAgICAgIm5hbWU9JyIgKyBuYW1lICsgJ1wnJyArCisgICAgICAgICAgICAgICAgIiwgdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPSIgKyB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtZW50aW9uKExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0luZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0luZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MzU4YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvSW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbiB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbiBFTVBUWSA9IG5ldyBJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbigpOworCisgICAgcHJpdmF0ZSBMaXN0PEluZmVyZW5jZVZhcmlhYmxlPiBpbmZlcmVuY2VWYXJpYWJsZXM7CisgICAgcHJpdmF0ZSBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZXM7CisKKyAgICBwdWJsaWMgc3RhdGljIEluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uIGVtcHR5KCkgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbigpIHsKKyAgICAgICAgdGhpcy5pbmZlcmVuY2VWYXJpYWJsZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIHRoaXMudHlwZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgfQorCisgICAgcHVibGljIEluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uIHdpdGhQYWlyKEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlLCBSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbiBuZXdJbnN0YW5jZSA9IG5ldyBJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbigpOworICAgICAgICBuZXdJbnN0YW5jZS5pbmZlcmVuY2VWYXJpYWJsZXMuYWRkQWxsKHRoaXMuaW5mZXJlbmNlVmFyaWFibGVzKTsKKyAgICAgICAgbmV3SW5zdGFuY2UudHlwZXMuYWRkQWxsKHRoaXMudHlwZXMpOworICAgICAgICBuZXdJbnN0YW5jZS5pbmZlcmVuY2VWYXJpYWJsZXMuYWRkKGluZmVyZW5jZVZhcmlhYmxlKTsKKyAgICAgICAgbmV3SW5zdGFuY2UudHlwZXMuYWRkKHR5cGUpOworICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0luc3RhbnRpYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvSW5zdGFudGlhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjU5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0luc3RhbnRpYXRpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlOworCisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uIHsKKyAgICBwcml2YXRlIEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHByb3BlclR5cGU7CisKKyAgICBwdWJsaWMgSW5zdGFudGlhdGlvbihJbmZlcmVuY2VWYXJpYWJsZSBpbmZlcmVuY2VWYXJpYWJsZSwgUmVzb2x2ZWRUeXBlIHByb3BlclR5cGUpIHsKKyAgICAgICAgdGhpcy5pbmZlcmVuY2VWYXJpYWJsZSA9IGluZmVyZW5jZVZhcmlhYmxlOworICAgICAgICB0aGlzLnByb3BlclR5cGUgPSBwcm9wZXJUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBJbmZlcmVuY2VWYXJpYWJsZSBnZXRJbmZlcmVuY2VWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGluZmVyZW5jZVZhcmlhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0UHJvcGVyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlclR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSW5zdGFudGlhdGlvbiB0aGF0ID0gKEluc3RhbnRpYXRpb24pIG87CisKKyAgICAgICAgaWYgKCFpbmZlcmVuY2VWYXJpYWJsZS5lcXVhbHModGhhdC5pbmZlcmVuY2VWYXJpYWJsZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHByb3BlclR5cGUuZXF1YWxzKHRoYXQucHJvcGVyVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGluZmVyZW5jZVZhcmlhYmxlLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgcHJvcGVyVHlwZS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSW5zdGFudGlhdGlvbnsiICsKKyAgICAgICAgICAgICAgICAiaW5mZXJlbmNlVmFyaWFibGU9IiArIGluZmVyZW5jZVZhcmlhYmxlICsKKyAgICAgICAgICAgICAgICAiLCBwcm9wZXJUeXBlPSIgKyBwcm9wZXJUeXBlICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9JbnN0YW50aWF0aW9uU2V0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL0luc3RhbnRpYXRpb25TZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJmZTNlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9JbnN0YW50aWF0aW9uU2V0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvblNldCB7CisKKyAgICBwcml2YXRlIExpc3Q8SW5zdGFudGlhdGlvbj4gaW5zdGFudGlhdGlvbnM7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhbGxJbmZlcmVuY2VWYXJpYWJsZXNBcmVSZXNvbHZlZChCb3VuZFNldCBib3VuZFNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEluc3RhbnRpYXRpb25TZXQgZW1wdHkoKSB7CisgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnN0YW50aWF0aW9uU2V0IEVNUFRZID0gbmV3IEluc3RhbnRpYXRpb25TZXQoKTsKKworICAgIHByaXZhdGUgSW5zdGFudGlhdGlvblNldCgpIHsKKyAgICAgICAgaW5zdGFudGlhdGlvbnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgfQorCisgICAgcHVibGljIEluc3RhbnRpYXRpb25TZXQgd2l0aEluc3RhbnRpYXRpb24oSW5zdGFudGlhdGlvbiBpbnN0YW50aWF0aW9uKSB7CisgICAgICAgIEluc3RhbnRpYXRpb25TZXQgbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFudGlhdGlvblNldCgpOworICAgICAgICBuZXdJbnN0YW5jZS5pbnN0YW50aWF0aW9ucy5hZGRBbGwodGhpcy5pbnN0YW50aWF0aW9ucyk7CisgICAgICAgIG5ld0luc3RhbmNlLmluc3RhbnRpYXRpb25zLmFkZChpbnN0YW50aWF0aW9uKTsKKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0aW9ucy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSW5zdGFudGlhdGlvblNldCB0aGF0ID0gKEluc3RhbnRpYXRpb25TZXQpIG87CisKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRpb25zLmVxdWFscyh0aGF0Lmluc3RhbnRpYXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGlvbnMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkluc3RhbnRpYXRpb25TZXR7IiArCisgICAgICAgICAgICAgICAgImluc3RhbnRpYXRpb25zPSIgKyBpbnN0YW50aWF0aW9ucyArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgYXBwbHkoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgZm9yIChJbnN0YW50aWF0aW9uIGluc3RhbnRpYXRpb24gOiBpbnN0YW50aWF0aW9ucykgeworICAgICAgICAgICAgdHlwZSA9IHR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoaW5zdGFudGlhdGlvbi5nZXRJbmZlcmVuY2VWYXJpYWJsZSgpLmdldFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbigpLCBpbnN0YW50aWF0aW9uLmdldFByb3BlclR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9NZXRob2RUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL01ldGhvZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ5NGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9NZXRob2RUeXBlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIE1ldGhvZFR5cGUgaXMgYW4gb3JkZXJlZCA0LXR1cGxlIGNvbnNpc3Rpbmcgb2Y6CisgKiAxLiB0eXBlIHBhcmFtZXRlcnM6IHRoZSBkZWNsYXJhdGlvbnMgb2YgYW55IHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgbWV0aG9kIG1lbWJlci4KKyAqIDIuIGFyZ3VtZW50IHR5cGVzOiBhIGxpc3Qgb2YgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZCBtZW1iZXIuCisgKiAzLiByZXR1cm4gdHlwZTogdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgbWVtYmVyLgorICogNC4gdGhyb3dzIGNsYXVzZTogZXhjZXB0aW9uIHR5cGVzIGRlY2xhcmVkIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBtZXRob2QgbWVtYmVyLgorICoKKyAqIFNlZSBKTFMgOC4yCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RUeXBlIHsKKyAgICBwcml2YXRlIExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IHR5cGVQYXJhbWV0ZXJzOworICAgIHByaXZhdGUgTGlzdDxSZXNvbHZlZFR5cGU+IGZvcm1hbEFyZ3VtZW50VHlwZXM7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgcmV0dXJuVHlwZTsKKyAgICBwcml2YXRlIExpc3Q8UmVzb2x2ZWRUeXBlPiBleGNlcHRpb25UeXBlczsKKworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kVHlwZSBmcm9tTWV0aG9kVXNhZ2UoTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RUeXBlKG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlcygpLAorICAgICAgICAgICAgICAgIG1ldGhvZFVzYWdlLnJldHVyblR5cGUoKSwgbWV0aG9kVXNhZ2UuZXhjZXB0aW9uVHlwZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFR5cGUoTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlcnMsIExpc3Q8UmVzb2x2ZWRUeXBlPiBmb3JtYWxBcmd1bWVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSByZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBleGNlcHRpb25UeXBlcykgeworICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuZm9ybWFsQXJndW1lbnRUeXBlcyA9IGZvcm1hbEFyZ3VtZW50VHlwZXM7CisgICAgICAgIHRoaXMucmV0dXJuVHlwZSA9IHJldHVyblR5cGU7CisgICAgICAgIHRoaXMuZXhjZXB0aW9uVHlwZXMgPSBleGNlcHRpb25UeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGU+IGdldEZvcm1hbEFyZ3VtZW50VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBmb3JtYWxBcmd1bWVudFR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRUeXBlPiBnZXRFeGNlcHRpb25UeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvblR5cGVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvUHJvcGVyTG93ZXJCb3VuZC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Qcm9wZXJMb3dlckJvdW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NjhhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvUHJvcGVyTG93ZXJCb3VuZC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJMb3dlckJvdW5kIHsKKyAgICBwcml2YXRlIEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHByb3BlclR5cGU7CisKKyAgICBwdWJsaWMgUHJvcGVyTG93ZXJCb3VuZChJbmZlcmVuY2VWYXJpYWJsZSBpbmZlcmVuY2VWYXJpYWJsZSwgUmVzb2x2ZWRUeXBlIHByb3BlclR5cGUpIHsKKyAgICAgICAgdGhpcy5pbmZlcmVuY2VWYXJpYWJsZSA9IGluZmVyZW5jZVZhcmlhYmxlOworICAgICAgICB0aGlzLnByb3BlclR5cGUgPSBwcm9wZXJUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFByb3Blckxvd2VyQm91bmQgdGhhdCA9IChQcm9wZXJMb3dlckJvdW5kKSBvOworCisgICAgICAgIGlmICghaW5mZXJlbmNlVmFyaWFibGUuZXF1YWxzKHRoYXQuaW5mZXJlbmNlVmFyaWFibGUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBwcm9wZXJUeXBlLmVxdWFscyh0aGF0LnByb3BlclR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBpbmZlcmVuY2VWYXJpYWJsZS5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHByb3BlclR5cGUuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlByb3Blckxvd2VyQm91bmR7IiArCisgICAgICAgICAgICAgICAgImluZmVyZW5jZVZhcmlhYmxlPSIgKyBpbmZlcmVuY2VWYXJpYWJsZSArCisgICAgICAgICAgICAgICAgIiwgcHJvcGVyVHlwZT0iICsgcHJvcGVyVHlwZSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIHB1YmxpYyBJbmZlcmVuY2VWYXJpYWJsZSBnZXRJbmZlcmVuY2VWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGluZmVyZW5jZVZhcmlhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0UHJvcGVyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlclR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Qcm9wZXJVcHBlckJvdW5kLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL1Byb3BlclVwcGVyQm91bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q4Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9Qcm9wZXJVcHBlckJvdW5kLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFByb3BlclVwcGVyQm91bmQgeworICAgIHByaXZhdGUgSW5mZXJlbmNlVmFyaWFibGUgaW5mZXJlbmNlVmFyaWFibGU7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgcHJvcGVyVHlwZTsKKworICAgIHB1YmxpYyBQcm9wZXJVcHBlckJvdW5kKEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlLCBSZXNvbHZlZFR5cGUgcHJvcGVyVHlwZSkgeworICAgICAgICB0aGlzLmluZmVyZW5jZVZhcmlhYmxlID0gaW5mZXJlbmNlVmFyaWFibGU7CisgICAgICAgIHRoaXMucHJvcGVyVHlwZSA9IHByb3BlclR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUHJvcGVyVXBwZXJCb3VuZCB0aGF0ID0gKFByb3BlclVwcGVyQm91bmQpIG87CisKKyAgICAgICAgaWYgKCFpbmZlcmVuY2VWYXJpYWJsZS5lcXVhbHModGhhdC5pbmZlcmVuY2VWYXJpYWJsZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHByb3BlclR5cGUuZXF1YWxzKHRoYXQucHJvcGVyVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGluZmVyZW5jZVZhcmlhYmxlLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgcHJvcGVyVHlwZS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiUHJvcGVyVXBwZXJCb3VuZHsiICsKKyAgICAgICAgICAgICAgICAiaW5mZXJlbmNlVmFyaWFibGU9IiArIGluZmVyZW5jZVZhcmlhYmxlICsKKyAgICAgICAgICAgICAgICAiLCBwcm9wZXJUeXBlPSIgKyBwcm9wZXJUeXBlICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHVibGljIEluZmVyZW5jZVZhcmlhYmxlIGdldEluZmVyZW5jZVZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gaW5mZXJlbmNlVmFyaWFibGU7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRQcm9wZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gcHJvcGVyVHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL1N1YnN0aXR1dGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9TdWJzdGl0dXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjMyNTQyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9TdWJzdGl0dXRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgU3Vic3RpdHV0aW9uIHsKKworICAgIHByaXZhdGUgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uczsKKyAgICBwcml2YXRlIExpc3Q8UmVzb2x2ZWRUeXBlPiB0eXBlczsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN1YnN0aXR1dGlvbiBFTVBUWSA9IG5ldyBTdWJzdGl0dXRpb24oKTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3Vic3RpdHV0aW9uIGVtcHR5KCkgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgcHVibGljIFN1YnN0aXR1dGlvbiB3aXRoUGFpcihSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIFN1YnN0aXR1dGlvbiBuZXdJbnN0YW5jZSA9IG5ldyBTdWJzdGl0dXRpb24oKTsKKyAgICAgICAgbmV3SW5zdGFuY2UudHlwZVBhcmFtZXRlckRlY2xhcmF0aW9ucy5hZGRBbGwodGhpcy50eXBlUGFyYW1ldGVyRGVjbGFyYXRpb25zKTsKKyAgICAgICAgbmV3SW5zdGFuY2UudHlwZXMuYWRkQWxsKHRoaXMudHlwZXMpOworICAgICAgICBuZXdJbnN0YW5jZS50eXBlUGFyYW1ldGVyRGVjbGFyYXRpb25zLmFkZCh0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pOworICAgICAgICBuZXdJbnN0YW5jZS50eXBlcy5hZGQodHlwZSk7CisgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3Vic3RpdHV0aW9uKCkgeworICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIHRoaXMudHlwZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBhcHBseShSZXNvbHZlZFR5cGUgb3JpZ2luYWxUeXBlKSB7CisgICAgICAgIFJlc29sdmVkVHlwZSByZXN1bHQgPSBvcmlnaW5hbFR5cGU7CisgICAgICAgIGZvciAoaW50IGk9MDtpPHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbnMuc2l6ZSgpO2krKykgeworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VUeXBlVmFyaWFibGVzKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbnMuZ2V0KGkpLCB0eXBlcy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9UeXBlSGVscGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL1R5cGVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQwNDFkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9UeXBlSGVscGVyLmphdmEKQEAgLTAsMCArMSw0MDUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2U7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5QYWlyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogVGhlIHRlcm0gInR5cGUiIGlzIHVzZWQgbG9vc2VseSBpbiB0aGlzIGNoYXB0ZXIgdG8gaW5jbHVkZSB0eXBlLWxpa2Ugc3ludGF4IHRoYXQgY29udGFpbnMgaW5mZXJlbmNlIHZhcmlhYmxlcy4KKyAqCisgKiBBc3NlcnRpb25zIHRoYXQgaW52b2x2ZSBpbmZlcmVuY2UKKyAqIHZhcmlhYmxlcyBhcmUgYXNzZXJ0aW9ucyBhYm91dCBldmVyeSBwcm9wZXIgdHlwZSB0aGF0IGNhbiBiZSBwcm9kdWNlZCBieSByZXBsYWNpbmcgZWFjaCBpbmZlcmVuY2UgdmFyaWFibGUgd2l0aAorICogYSBwcm9wZXIgdHlwZS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFR5cGVIZWxwZXIgeworCisgICAgLyoqCisgICAgICogVGhlIHRlcm0gcHJvcGVyIHR5cGUgZXhjbHVkZXMgc3VjaCAidHlwZXMiIHRoYXQgbWVudGlvbiBpbmZlcmVuY2UgdmFyaWFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3BlclR5cGUoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSB7CisgICAgICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgcmVmZXJlbmNlVHlwZSA9IChSZXNvbHZlZFJlZmVyZW5jZVR5cGUpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnN0cmVhbSgpLmFsbE1hdGNoKGl0IC0+IGlzUHJvcGVyVHlwZShpdCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVzb2x2ZWRXaWxkY2FyZCkgeworICAgICAgICAgICAgUmVzb2x2ZWRXaWxkY2FyZCB3aWxkY2FyZCA9IChSZXNvbHZlZFdpbGRjYXJkKXR5cGU7CisgICAgICAgICAgICBpZiAod2lsZGNhcmQuaXNCb3VuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNQcm9wZXJUeXBlKHdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBJIGFtIG5vdCBzdXJlLi4uCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICByZXR1cm4gaXNQcm9wZXJUeXBlKHR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0eXBlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlOC9odG1sL2pscy01Lmh0bWwjamxzLTUuMworICAgICAqIEBwYXJhbSBleHByZXNzaW9uCisgICAgICogQHBhcmFtIHQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29tcGF0aWJsZUluQVN0cmljdEludm9jYXRpb25Db250ZXh0KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUmVzb2x2ZWRUeXBlIHQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U4L2h0bWwvamxzLTUuaHRtbCNqbHMtNS4zCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24KKyAgICAgKiBAcGFyYW0gdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21wYXRpYmxlSW5BTG9vc2VJbnZvY2F0aW9uQ29udGV4dChUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUmVzb2x2ZWRUeXBlIHQpIHsKKyAgICAgICAgLy90aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBkZXRlcm1pbmUgaWYgIiArIGV4cHJlc3Npb24gKyAiIGlzIGNvbXBhdGlibGUgaW4gYSBsb29zZSBpbnZvY2F0aW9uIGNvbnRleHQgd2l0aCB0eXBlICIgKyB0KTsKKyAgICAgICAgcmV0dXJuIGlzQ29tcGF0aWJsZUluQUxvb3NlSW52b2NhdGlvbkNvbnRleHQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShleHByZXNzaW9uKSwgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U4L2h0bWwvamxzLTUuaHRtbCNqbHMtNS4zCisgICAgICogQHBhcmFtIHMKKyAgICAgKiBAcGFyYW0gdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb21wYXRpYmxlSW5BTG9vc2VJbnZvY2F0aW9uQ29udGV4dChSZXNvbHZlZFR5cGUgcywgUmVzb2x2ZWRUeXBlIHQpIHsKKyAgICAgICAgLy8gTG9vc2UgaW52b2NhdGlvbiBjb250ZXh0cyBhbGxvdyBhIG1vcmUgcGVybWlzc2l2ZSBzZXQgb2YgY29udmVyc2lvbnMsIGJlY2F1c2UgdGhleSBhcmUgb25seSB1c2VkIGZvciBhCisgICAgICAgIC8vIHBhcnRpY3VsYXIgaW52b2NhdGlvbiBpZiBubyBhcHBsaWNhYmxlIGRlY2xhcmF0aW9uIGNhbiBiZSBmb3VuZCB1c2luZyBzdHJpY3QgaW52b2NhdGlvbiBjb250ZXh0cy4gTG9vc2UKKyAgICAgICAgLy8gaW52b2NhdGlvbiBjb250ZXh0cyBhbGxvdyB0aGUgdXNlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLworICAgICAgICAvLyAtIGFuIGlkZW50aXR5IGNvbnZlcnNpb24gKMKnNS4xLjEpCisKKyAgICAgICAgaWYgKHMuZXF1YWxzKHQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gYSB3aWRlbmluZyBwcmltaXRpdmUgY29udmVyc2lvbiAowqc1LjEuMikKKworICAgICAgICBpZiAocy5pc1ByaW1pdGl2ZSgpICYmIHQuaXNQcmltaXRpdmUoKSAmJiBhcmVDb21wYXRpYmxlVGhyb3VnaFdpZGVuaW5nUHJpbWl0aXZlQ29udmVyc2lvbihzLCB0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyAtIGEgd2lkZW5pbmcgcmVmZXJlbmNlIGNvbnZlcnNpb24gKMKnNS4xLjUpCisKKyAgICAgICAgaWYgKHMuaXNSZWZlcmVuY2VUeXBlKCkgJiYgdC5pc1JlZmVyZW5jZVR5cGUoKSAmJiBhcmVDb21wYXRpYmxlVGhyb3VnaFdpZGVuaW5nUmVmZXJlbmNlQ29udmVyc2lvbihzLCB0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyAtIGEgYm94aW5nIGNvbnZlcnNpb24gKMKnNS4xLjcpIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgd2lkZW5pbmcgcmVmZXJlbmNlIGNvbnZlcnNpb24KKworICAgICAgICBpZiAocy5pc1ByaW1pdGl2ZSgpICYmIHQuaXNSZWZlcmVuY2VUeXBlKCkgJiYKKyAgICAgICAgICAgICAgICBhcmVDb21wYXRpYmxlVGhyb3VnaFdpZGVuaW5nUmVmZXJlbmNlQ29udmVyc2lvbih0b0JveGVkVHlwZShzLmFzUHJpbWl0aXZlKCkpLCB0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyAtIGFuIHVuYm94aW5nIGNvbnZlcnNpb24gKMKnNS4xLjgpIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSB3aWRlbmluZyBwcmltaXRpdmUgY29udmVyc2lvbgorCisgICAgICAgIGlmIChpc1VuYm94YWJsZShzKSAmJiBzLmlzUmVmZXJlbmNlVHlwZSgpICYmIHQuaXNQcmltaXRpdmUoKSAmJgorICAgICAgICAgICAgICAgIGFyZUNvbXBhdGlibGVUaHJvdWdoV2lkZW5pbmdQcmltaXRpdmVDb252ZXJzaW9uKHRvVW5ib3hlZFR5cGUocy5hc1JlZmVyZW5jZVR5cGUoKSksIHQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmLCBhZnRlciB0aGUgY29udmVyc2lvbnMgbGlzdGVkIGZvciBhbiBpbnZvY2F0aW9uIGNvbnRleHQgaGF2ZSBiZWVuIGFwcGxpZWQsIHRoZSByZXN1bHRpbmcgdHlwZSBpcyBhIHJhdworICAgICAgICAvLyB0eXBlICjCpzQuOCksIGFuIHVuY2hlY2tlZCBjb252ZXJzaW9uICjCpzUuMS45KSBtYXkgdGhlbiBiZSBhcHBsaWVkLgorICAgICAgICAvLworICAgICAgICAvLyBBIHZhbHVlIG9mIHRoZSBudWxsIHR5cGUgKHRoZSBudWxsIHJlZmVyZW5jZSBpcyB0aGUgb25seSBzdWNoIHZhbHVlKSBtYXkgYmUgYXNzaWduZWQgdG8gYW55IHJlZmVyZW5jZSB0eXBlCisgICAgICAgIGlmIChzLmlzTnVsbCgpICYmIHQuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy90aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImlzQ29tcGF0aWJsZUluQUxvb3NlSW52b2NhdGlvbkNvbnRleHQgdW5hYmxlIHRvIGRlY2lkZSBvbiBzPSIgKyBzICsgIiwgdD0iICsgdCk7CisgICAgICAgIC8vIFRPRE8gRklYTUUKKyAgICAgICAgcmV0dXJuIHQuaXNBc3NpZ25hYmxlQnkocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VuYm94YWJsZShSZXNvbHZlZFR5cGUgcmVmZXJlbmNlVHlwZSkgeworICAgICAgICBpZiAoIXJlZmVyZW5jZVR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShSZXNvbHZlZFByaW1pdGl2ZVR5cGUudmFsdWVzKCkpLmFueU1hdGNoKHB0IC0+IHJlZmVyZW5jZVR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhwdC5nZXRCb3hUeXBlUU5hbWUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc29sdmVkVHlwZSB0b1VuYm94ZWRUeXBlKFJlc29sdmVkUmVmZXJlbmNlVHlwZSByZWZlcmVuY2VUeXBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihyZWZlcmVuY2VUeXBlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc29sdmVkVHlwZSB0b0JveGVkVHlwZShSZXNvbHZlZFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZUNvbXBhdGlibGVUaHJvdWdoV2lkZW5pbmdSZWZlcmVuY2VDb252ZXJzaW9uKFJlc29sdmVkVHlwZSBzLCBSZXNvbHZlZFR5cGUgdCkgeworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFByaW1pdGl2ZVR5cGU+IGNvcnJlc3BvbmRpbmdQcmltaXRpdmVUeXBlRm9yUyA9IEFycmF5cy5zdHJlYW0oUmVzb2x2ZWRQcmltaXRpdmVUeXBlLnZhbHVlcygpKS5maWx0ZXIocHQgLT4gcHQuZ2V0Qm94VHlwZVFOYW1lKCkuZXF1YWxzKHMuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSkuZmluZEZpcnN0KCk7CisgICAgICAgIGlmICghY29ycmVzcG9uZGluZ1ByaW1pdGl2ZVR5cGVGb3JTLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJhcmVDb21wYXRpYmxlVGhyb3VnaFdpZGVuaW5nUmVmZXJlbmNlQ29udmVyc2lvbiBzPSIrcysiLCB0PSIgKyB0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFyZUNvbXBhdGlibGVUaHJvdWdoV2lkZW5pbmdQcmltaXRpdmVDb252ZXJzaW9uKFJlc29sdmVkVHlwZSBzLCBSZXNvbHZlZFR5cGUgdCkgeworICAgICAgICBpZiAocy5pc1ByaW1pdGl2ZSgpICYmIHQuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHMuaXNBc3NpZ25hYmxlQnkodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmZlcmVuY2VWYXJpYWJsZShSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIEluZmVyZW5jZVZhcmlhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2V0PEluZmVyZW5jZVZhcmlhYmxlPiB1c2VkSW5mZXJlbmNlVmFyaWFibGVzKFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmIChpc0luZmVyZW5jZVZhcmlhYmxlKHR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KChJbmZlcmVuY2VWYXJpYWJsZSl0eXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gcmVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgZm9yIChSZXNvbHZlZFR5cGUgdHAgOiB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICByZXMuYWRkQWxsKHVzZWRJbmZlcmVuY2VWYXJpYWJsZXModHApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHR5cGUudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIEpMUyA0LjEwLjQuIExlYXN0IFVwcGVyIEJvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRUeXBlIGxlYXN0VXBwZXJCb3VuZChTZXQ8UmVzb2x2ZWRUeXBlPiB0eXBlcykgeworICAgICAgICBpZiAodHlwZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBsZWFzdCB1cHBlciBib3VuZCwgb3IgImx1YiIsIG9mIGEgc2V0IG9mIHJlZmVyZW5jZSB0eXBlcyBpcyBhIHNoYXJlZCBzdXBlcnR5cGUgdGhhdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4KKyAgICAgICAgLy8gYW55IG90aGVyIHNoYXJlZCBzdXBlcnR5cGUgKHRoYXQgaXMsIG5vIG90aGVyIHNoYXJlZCBzdXBlcnR5cGUgaXMgYSBzdWJ0eXBlIG9mIHRoZSBsZWFzdCB1cHBlciBib3VuZCkuCisgICAgICAgIC8vIFRoaXMgdHlwZSwgbHViKFUxLCAuLi4sIFVrKSwgaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzLgorICAgICAgICAvLworICAgICAgICAvLyBJZiBrID0gMSwgdGhlbiB0aGUgbHViIGlzIHRoZSB0eXBlIGl0c2VsZjogbHViKFUpID0gVS4KKworICAgICAgICBpZiAodHlwZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlcy5zdHJlYW0oKS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vT3RoZXJ3aXNlOgorICAgICAgICAvLworICAgICAgICAvL0ZvciBlYWNoIFVpICgxIOKJpCBpIOKJpCBrKToKKyAgICAgICAgLy8KKyAgICAgICAgLy9MZXQgU1QoVWkpIGJlIHRoZSBzZXQgb2Ygc3VwZXJ0eXBlcyBvZiBVaS4KKyAgICAgICAgLy8KKyAgICAgICAgLy9MZXQgRVNUKFVpKSwgdGhlIHNldCBvZiBlcmFzZWQgc3VwZXJ0eXBlcyBvZiBVaSwgYmU6CisgICAgICAgIC8vCisgICAgICAgIC8vRVNUKFVpKSA9IHsgfFd8IHwgVyBpbiBTVChVaSkgfSB3aGVyZSB8V3wgaXMgdGhlIGVyYXN1cmUgb2YgVy4KKyAgICAgICAgLy8KKyAgICAgICAgLy9UaGUgcmVhc29uIGZvciBjb21wdXRpbmcgdGhlIHNldCBvZiBlcmFzZWQgc3VwZXJ0eXBlcyBpcyB0byBkZWFsIHdpdGggc2l0dWF0aW9ucyB3aGVyZSB0aGUgc2V0IG9mIHR5cGVzIGluY2x1ZGVzIHNldmVyYWwgZGlzdGluY3QgcGFyYW1ldGVyaXphdGlvbnMgb2YgYSBnZW5lcmljIHR5cGUuCisgICAgICAgIC8vCisgICAgICAgIC8vRm9yIGV4YW1wbGUsIGdpdmVuIExpc3Q8U3RyaW5nPiBhbmQgTGlzdDxPYmplY3Q+LCBzaW1wbHkgaW50ZXJzZWN0aW5nIHRoZSBzZXRzIFNUKExpc3Q8U3RyaW5nPikgPSB7IExpc3Q8U3RyaW5nPiwgQ29sbGVjdGlvbjxTdHJpbmc+LCBPYmplY3QgfSBhbmQgU1QoTGlzdDxPYmplY3Q+KSA9IHsgTGlzdDxPYmplY3Q+LCBDb2xsZWN0aW9uPE9iamVjdD4sIE9iamVjdCB9IHdvdWxkIHlpZWxkIGEgc2V0IHsgT2JqZWN0IH0sIGFuZCB3ZSB3b3VsZCBoYXZlIGxvc3QgdHJhY2sgb2YgdGhlIGZhY3QgdGhhdCB0aGUgdXBwZXIgYm91bmQgY2FuIHNhZmVseSBiZSBhc3N1bWVkIHRvIGJlIGEgTGlzdC4KKyAgICAgICAgLy8KKyAgICAgICAgLy9JbiBjb250cmFzdCwgaW50ZXJzZWN0aW5nIEVTVChMaXN0PFN0cmluZz4pID0geyBMaXN0LCBDb2xsZWN0aW9uLCBPYmplY3QgfSBhbmQgRVNUKExpc3Q8T2JqZWN0PikgPSB7IExpc3QsIENvbGxlY3Rpb24sIE9iamVjdCB9IHlpZWxkcyB7IExpc3QsIENvbGxlY3Rpb24sIE9iamVjdCB9LCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5hYmxlIHVzIHRvIHByb2R1Y2UgTGlzdDw/Pi4KKyAgICAgICAgLy8KKyAgICAgICAgLy9MZXQgRUMsIHRoZSBlcmFzZWQgY2FuZGlkYXRlIHNldCBmb3IgVTEgLi4uIFVrLCBiZSB0aGUgaW50ZXJzZWN0aW9uIG9mIGFsbCB0aGUgc2V0cyBFU1QoVWkpICgxIOKJpCBpIOKJpCBrKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy9MZXQgTUVDLCB0aGUgbWluaW1hbCBlcmFzZWQgY2FuZGlkYXRlIHNldCBmb3IgVTEgLi4uIFVrLCBiZToKKyAgICAgICAgLy8KKyAgICAgICAgLy9NRUMgPSB7IFYgfCBWIGluIEVDLCBhbmQgZm9yIGFsbCBXIOKJoCBWIGluIEVDLCBpdCBpcyBub3QgdGhlIGNhc2UgdGhhdCBXIDw6IFYgfQorICAgICAgICAvLworICAgICAgICAvL0JlY2F1c2Ugd2UgYXJlIHNlZWtpbmcgdG8gaW5mZXIgbW9yZSBwcmVjaXNlIHR5cGVzLCB3ZSB3aXNoIHRvIGZpbHRlciBvdXQgYW55IGNhbmRpZGF0ZXMgdGhhdCBhcmUgc3VwZXJ0eXBlcyBvZiBvdGhlciBjYW5kaWRhdGVzLiBUaGlzIGlzIHdoYXQgY29tcHV0aW5nIE1FQyBhY2NvbXBsaXNoZXMuIEluIG91ciBydW5uaW5nIGV4YW1wbGUsIHdlIGhhZCBFQyA9IHsgTGlzdCwgQ29sbGVjdGlvbiwgT2JqZWN0IH0sIHNvIE1FQyA9IHsgTGlzdCB9LiBUaGUgbmV4dCBzdGVwIGlzIHRvIHJlY292ZXIgdHlwZSBhcmd1bWVudHMgZm9yIHRoZSBlcmFzZWQgdHlwZXMgaW4gTUVDLgorICAgICAgICAvLworICAgICAgICAvL0ZvciBhbnkgZWxlbWVudCBHIG9mIE1FQyB0aGF0IGlzIGEgZ2VuZXJpYyB0eXBlOgorICAgICAgICAvLworICAgICAgICAvL0xldCB0aGUgInJlbGV2YW50IiBwYXJhbWV0ZXJpemF0aW9ucyBvZiBHLCBSZWxldmFudChHKSwgYmU6CisgICAgICAgIC8vCisgICAgICAgIC8vUmVsZXZhbnQoRykgPSB7IFYgfCAxIOKJpCBpIOKJpCBrOiBWIGluIFNUKFVpKSBhbmQgViA9IEc8Li4uPiB9CisgICAgICAgIC8vCisgICAgICAgIC8vSW4gb3VyIHJ1bm5pbmcgZXhhbXBsZSwgdGhlIG9ubHkgZ2VuZXJpYyBlbGVtZW50IG9mIE1FQyBpcyBMaXN0LCBhbmQgUmVsZXZhbnQoTGlzdCkgPSB7IExpc3Q8U3RyaW5nPiwgTGlzdDxPYmplY3Q+IH0uIFdlIHdpbGwgbm93IHNlZWsgdG8gZmluZCBhIHR5cGUgYXJndW1lbnQgZm9yIExpc3QgdGhhdCBjb250YWlucyAowqc0LjUuMSkgYm90aCBTdHJpbmcgYW5kIE9iamVjdC4KKyAgICAgICAgLy8KKyAgICAgICAgLy9UaGlzIGlzIGRvbmUgYnkgbWVhbnMgb2YgdGhlIGxlYXN0IGNvbnRhaW5pbmcgcGFyYW1ldGVyaXphdGlvbiAobGNwKSBvcGVyYXRpb24gZGVmaW5lZCBiZWxvdy4gVGhlIGZpcnN0IGxpbmUgZGVmaW5lcyBsY3AoKSBvbiBhIHNldCwgc3VjaCBhcyBSZWxldmFudChMaXN0KSwgYXMgYW4gb3BlcmF0aW9uIG9uIGEgbGlzdCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIHNldC4gVGhlIG5leHQgbGluZSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb24gc3VjaCBsaXN0cywgYXMgYSBwYWlyd2lzZSByZWR1Y3Rpb24gb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0LiBUaGUgdGhpcmQgbGluZSBpcyB0aGUgZGVmaW5pdGlvbiBvZiBsY3AoKSBvbiBwYWlycyBvZiBwYXJhbWV0ZXJpemVkIHR5cGVzLCB3aGljaCBpbiB0dXJuIHJlbGllcyBvbiB0aGUgbm90aW9uIG9mIGxlYXN0IGNvbnRhaW5pbmcgdHlwZSBhcmd1bWVudCAobGN0YSkuIGxjdGEoKSBpcyBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgY2FzZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vTGV0IHRoZSAiY2FuZGlkYXRlIiBwYXJhbWV0ZXJpemF0aW9uIG9mIEcsIENhbmRpZGF0ZShHKSwgYmUgdGhlIG1vc3Qgc3BlY2lmaWMgcGFyYW1ldGVyaXphdGlvbiBvZiB0aGUgZ2VuZXJpYyB0eXBlIEcgdGhhdCBjb250YWlucyBhbGwgdGhlIHJlbGV2YW50IHBhcmFtZXRlcml6YXRpb25zIG9mIEc6CisgICAgICAgIC8vCisgICAgICAgIC8vQ2FuZGlkYXRlKEcpID0gbGNwKFJlbGV2YW50KEcpKQorICAgICAgICAvLworICAgICAgICAvL3doZXJlIGxjcCgpLCB0aGUgbGVhc3QgY29udGFpbmluZyBpbnZvY2F0aW9uLCBpczoKKyAgICAgICAgLy8KKyAgICAgICAgLy9sY3AoUykgPSBsY3AoZTEsIC4uLiwgZW4pIHdoZXJlIGVpICgxIOKJpCBpIOKJpCBuKSBpbiBTCisgICAgICAgIC8vCisgICAgICAgIC8vbGNwKGUxLCAuLi4sIGVuKSA9IGxjcChsY3AoZTEsIGUyKSwgZTMsIC4uLiwgZW4pCisgICAgICAgIC8vCisgICAgICAgIC8vbGNwKEc8WDEsIC4uLiwgWG4+LCBHPFkxLCAuLi4sIFluPikgPSBHPGxjdGEoWDEsIFkxKSwgLi4uLCBsY3RhKFhuLCBZbik+CisgICAgICAgIC8vCisgICAgICAgIC8vbGNwKEc8WDEsIC4uLiwgWG4+KSA9IEc8bGN0YShYMSksIC4uLiwgbGN0YShYbik+CisgICAgICAgIC8vCisgICAgICAgIC8vYW5kIHdoZXJlIGxjdGEoKSwgdGhlIGxlYXN0IGNvbnRhaW5pbmcgdHlwZSBhcmd1bWVudCwgaXM6IChhc3N1bWluZyBVIGFuZCBWIGFyZSB0eXBlcykKKyAgICAgICAgLy8KKyAgICAgICAgLy9sY3RhKFUsIFYpID0gVSBpZiBVID0gViwgb3RoZXJ3aXNlID8gZXh0ZW5kcyBsdWIoVSwgVikKKyAgICAgICAgLy8KKyAgICAgICAgLy9sY3RhKFUsID8gZXh0ZW5kcyBWKSA9ID8gZXh0ZW5kcyBsdWIoVSwgVikKKyAgICAgICAgLy8KKyAgICAgICAgLy9sY3RhKFUsID8gc3VwZXIgVikgPSA/IHN1cGVyIGdsYihVLCBWKQorICAgICAgICAvLworICAgICAgICAvL2xjdGEoPyBleHRlbmRzIFUsID8gZXh0ZW5kcyBWKSA9ID8gZXh0ZW5kcyBsdWIoVSwgVikKKyAgICAgICAgLy8KKyAgICAgICAgLy9sY3RhKD8gZXh0ZW5kcyBVLCA/IHN1cGVyIFYpID0gVSBpZiBVID0gViwgb3RoZXJ3aXNlID8KKyAgICAgICAgLy8KKyAgICAgICAgLy9sY3RhKD8gc3VwZXIgVSwgPyBzdXBlciBWKSA9ID8gc3VwZXIgZ2xiKFUsIFYpCisgICAgICAgIC8vCisgICAgICAgIC8vbGN0YShVKSA9ID8gaWYgVSdzIHVwcGVyIGJvdW5kIGlzIE9iamVjdCwgb3RoZXJ3aXNlID8gZXh0ZW5kcyBsdWIoVSxPYmplY3QpCisgICAgICAgIC8vCisgICAgICAgIC8vYW5kIHdoZXJlIGdsYigpIGlzIGFzIGRlZmluZWQgaW4gwqc1LjEuMTAuCisgICAgICAgIC8vCisgICAgICAgIC8vTGV0IGx1YihVMSAuLi4gVWspIGJlOgorICAgICAgICAvLworICAgICAgICAvL0Jlc3QoVzEpICYgLi4uICYgQmVzdChXcikKKyAgICAgICAgLy8KKyAgICAgICAgLy93aGVyZSBXaSAoMSDiiaQgaSDiiaQgcikgYXJlIHRoZSBlbGVtZW50cyBvZiBNRUMsIHRoZSBtaW5pbWFsIGVyYXNlZCBjYW5kaWRhdGUgc2V0IG9mIFUxIC4uLiBVazsKKyAgICAgICAgLy8KKyAgICAgICAgLy9hbmQgd2hlcmUsIGlmIGFueSBvZiB0aGVzZSBlbGVtZW50cyBhcmUgZ2VuZXJpYywgd2UgdXNlIHRoZSBjYW5kaWRhdGUgcGFyYW1ldGVyaXphdGlvbiAoc28gYXMgdG8gcmVjb3ZlciB0eXBlIGFyZ3VtZW50cyk6CisgICAgICAgIC8vCisgICAgICAgIC8vQmVzdChYKSA9IENhbmRpZGF0ZShYKSBpZiBYIGlzIGdlbmVyaWM7IFggb3RoZXJ3aXNlLgorICAgICAgICAvLworICAgICAgICAvL1N0cmljdGx5IHNwZWFraW5nLCB0aGlzIGx1YigpIGZ1bmN0aW9uIG9ubHkgYXBwcm94aW1hdGVzIGEgbGVhc3QgdXBwZXIgYm91bmQuIEZvcm1hbGx5LCB0aGVyZSBtYXkgZXhpc3Qgc29tZSBvdGhlciB0eXBlIFQgc3VjaCB0aGF0IGFsbCBvZiBVMSAuLi4gVWsgYXJlIHN1YnR5cGVzIG9mIFQgYW5kIFQgaXMgYSBzdWJ0eXBlIG9mIGx1YihVMSwgLi4uLCBVaykuIEhvd2V2ZXIsIGEgY29tcGlsZXIgZm9yIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIG11c3QgaW1wbGVtZW50IGx1YigpIGFzIHNwZWNpZmllZCBhYm92ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBsdWIoKSBmdW5jdGlvbiB5aWVsZHMgYW4gaW5maW5pdGUgdHlwZS4gVGhpcyBpcyBwZXJtaXNzaWJsZSwgYW5kIGEgY29tcGlsZXIgZm9yIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIG11c3QgcmVjb2duaXplIHN1Y2ggc2l0dWF0aW9ucyBhbmQgcmVwcmVzZW50IHRoZW0gYXBwcm9wcmlhdGVseSB1c2luZyBjeWNsaWMgZGF0YSBzdHJ1Y3R1cmVzLgorICAgICAgICAvLworICAgICAgICAvL1RoZSBwb3NzaWJpbGl0eSBvZiBhbiBpbmZpbml0ZSB0eXBlIHN0ZW1zIGZyb20gdGhlIHJlY3Vyc2l2ZSBjYWxscyB0byBsdWIoKS4gUmVhZGVycyBmYW1pbGlhciB3aXRoIHJlY3Vyc2l2ZSB0eXBlcyBzaG91bGQgbm90ZSB0aGF0IGFuIGluZmluaXRlIHR5cGUgaXMgbm90IHRoZSBzYW1lIGFzIGEgcmVjdXJzaXZlIHR5cGUKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIEpMUyAxNS4yNy4zLiBUeXBlIG9mIGEgTGFtYmRhIEV4cHJlc3Npb24KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYWlyPFJlc29sdmVkVHlwZSwgQm9vbGVhbj4gZ3JvdW5kVGFyZ2V0VHlwZU9mTGFtYmRhKExhbWJkYUV4cHIgbGFtYmRhRXhwciwgUmVzb2x2ZWRUeXBlIFQsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICAvLyBUaGUgZ3JvdW5kIHRhcmdldCB0eXBlIGlzIGRlcml2ZWQgZnJvbSBUIGFzIGZvbGxvd3M6CisgICAgICAgIC8vCisgICAgICAgIGJvb2xlYW4gdXNlZDE4XzVfMyA9IGZhbHNlOworCisgICAgICAgIGJvb2xlYW4gd2lsZGNhcmRQYXJhbWV0ZXJpemVkID0gVC5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmFueU1hdGNoKHRwIC0+IHRwLmlzV2lsZGNhcmQoKSk7CisgICAgICAgIGlmICh3aWxkY2FyZFBhcmFtZXRlcml6ZWQpIHsKKyAgICAgICAgICAgIC8vIC0gSWYgVCBpcyBhIHdpbGRjYXJkLXBhcmFtZXRlcml6ZWQgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSBhbmQgdGhlIGxhbWJkYSBleHByZXNzaW9uIGlzIGV4cGxpY2l0bHkgdHlwZWQsCisgICAgICAgICAgICAvLyAgIHRoZW4gdGhlIGdyb3VuZCB0YXJnZXQgdHlwZSBpcyBpbmZlcnJlZCBhcyBkZXNjcmliZWQgaW4gwqcxOC41LjMuCisKKyAgICAgICAgICAgIGlmIChFeHByZXNzaW9uSGVscGVyLmlzRXhwbGljaXRseVR5cGVkKGxhbWJkYUV4cHIpKSB7CisgICAgICAgICAgICAgICAgdXNlZDE4XzVfMyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC0gSWYgVCBpcyBhIHdpbGRjYXJkLXBhcmFtZXRlcml6ZWQgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSBhbmQgdGhlIGxhbWJkYSBleHByZXNzaW9uIGlzIGltcGxpY2l0bHkgdHlwZWQsCisgICAgICAgICAgICAvLyAgIHRoZW4gdGhlIGdyb3VuZCB0YXJnZXQgdHlwZSBpcyB0aGUgbm9uLXdpbGRjYXJkIHBhcmFtZXRlcml6YXRpb24gKMKnOS45KSBvZiBULgorCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhaXI8Pihub25XaWxkY2FyZFBhcmFtZXRlcml6YXRpb25PZihULmFzUmVmZXJlbmNlVHlwZSgpLCB0eXBlU29sdmVyKSwgdXNlZDE4XzVfMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtIE90aGVyd2lzZSwgdGhlIGdyb3VuZCB0YXJnZXQgdHlwZSBpcyBULgorICAgICAgICByZXR1cm4gbmV3IFBhaXI8PihULCB1c2VkMThfNV8zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWUgSkxTIDkuOQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBub25XaWxkY2FyZFBhcmFtZXRlcml6YXRpb25PZihSZXNvbHZlZFJlZmVyZW5jZVR5cGUgb3JpZ2luYWxUeXBlLCBUeXBlU29sdmVyIHR5cGVTb2x2ZXIpIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IFRJcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IEFJcyA9IG9yaWdpbmFsVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpOworICAgICAgICBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBUUHMgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKworICAgICAgICAvLyBMZXQgUDEuLi5QbiBiZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIEkgd2l0aCBjb3JyZXNwb25kaW5nIGJvdW5kcyBCMS4uLkJuLiBGb3IgYWxsIGkgKDEg4omkIGkg4omkIG4pLAorICAgICAgICAvLyBUaSBpcyBkZXJpdmVkIGFjY29yZGluZyB0byB0aGUgZm9ybSBvZiBBaToKKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgb2JqZWN0ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCB0eXBlU29sdmVyKTsKKworICAgICAgICBmb3IgKGludCBpPTA7aTxBSXMuc2l6ZSgpO2krKykgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIEFpID0gQUlzLmdldChpKTsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSBUaSA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIC0gSWYgQWkgaXMgYSB0eXBlLCB0aGVuIFRpID0gQWkuCisKKyAgICAgICAgICAgIGlmICghQWkuaXNXaWxkY2FyZCgpKSB7CisgICAgICAgICAgICAgICAgVGkgPSBBaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLSBJZiBBaSBpcyBhIHdpbGRjYXJkLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBwYXJhbWV0ZXIncyBib3VuZCwgQmksIG1lbnRpb25zIG9uZSBvZiBQMS4uLlBuLCB0aGVuCisgICAgICAgICAgICAvLyAgIFRpIGlzIHVuZGVmaW5lZCBhbmQgdGhlcmUgaXMgbm8gZnVuY3Rpb24gdHlwZS4KKworICAgICAgICAgICAgaWYgKFRpID09IG51bGwgJiYgQWkuaXNXaWxkY2FyZCgpICYmIEFpLmFzV2lsZGNhcmQoKS5tZW50aW9uKG9yaWdpbmFsVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRUeXBlUGFyYW1ldGVycygpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLSBPdGhlcndpc2U6CisKKyAgICAgICAgICAgIGlmIChUaSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgQmkgPSBUUHMuZ2V0KGkpLmhhc0xvd2VyQm91bmQoKSA/IFRQcy5nZXQoaSkuZ2V0TG93ZXJCb3VuZCgpIDogb2JqZWN0OworCisgICAgICAgICAgICAgICAgLy8gICAtIElmIEFpIGlzIGFuIHVuYm91bmQgd2lsZGNhcmQgPywgdGhlbiBUaSA9IEJpLgorCisgICAgICAgICAgICAgICAgaWYgKEFpLmlzV2lsZGNhcmQoKSAmJiAhQWkuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFRpID0gQmk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gICAtIElmIEFpIGlzIGEgdXBwZXItYm91bmRlZCB3aWxkY2FyZCA/IGV4dGVuZHMgVWksIHRoZW4gVGkgPSBnbGIoVWksIEJpKSAowqc1LjEuMTApLgorCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWkuaXNXaWxkY2FyZCgpICYmIEFpLmFzV2lsZGNhcmQoKS5pc1VwcGVyQm91bmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBVaSA9IEFpLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBUaSA9IGdsYihuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoVWksIEJpKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vICAgLSBJZiBBaSBpcyBhIGxvd2VyLWJvdW5kZWQgd2lsZGNhcmQgPyBzdXBlciBMaSwgdGhlbiBUaSA9IExpLgorCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQWkuaXNXaWxkY2FyZCgpICYmIEFpLmFzV2lsZGNhcmQoKS5pc0xvd2VyQm91bmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFRpID0gQWkuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhcHBlbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUSXMuYWRkKFRpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZUltcGwob3JpZ2luYWxUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLCBUSXMsIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kVHlwZSBnZXRGdW5jdGlvblR5cGUoUmVzb2x2ZWRUeXBlIHR5cGUpIHsKKyAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IG11ID0gRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QodHlwZSk7CisgICAgICAgIGlmIChtdS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZFR5cGUuZnJvbU1ldGhvZFVzYWdlKG11LmdldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlZSBKTFMgNS4xLjEwLiBDYXB0dXJlIENvbnZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZFR5cGUgZ2xiKFNldDxSZXNvbHZlZFR5cGU+IHR5cGVzKSB7CisgICAgICAgIGlmICh0eXBlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGVzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRJbnRlcnNlY3Rpb25UeXBlKHR5cGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL1R5cGVJbmZlcmVuY2UuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvVHlwZUluZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGMxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL1R5cGVJbmZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDcxOSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmJvdW5kcy5TdWJ0eXBlT2ZCb3VuZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5ib3VuZHMuVGhyb3dzQm91bmQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuY29uc3RyYWludGZvcm11bGFzLkV4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuRXhwcmVzc2lvbkhlbHBlci5pc1N0YW5kYWxvbmVFeHByZXNzaW9uOworCisvKioKKyAqIFRoZSBBUEkgZXhwb3NlZCBieSB0aGUgVHlwZUluZmVyZW5jZSBzdWJzeXN0ZW0uCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlSW5mZXJlbmNlIHsKKworICAgIHByaXZhdGUgZmluYWwgUmVzb2x2ZWRUeXBlIG9iamVjdDsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIHB1YmxpYyBUeXBlSW5mZXJlbmNlKFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBpZiAodHlwZVNvbHZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnR5cGVTb2x2ZXIgPSB0eXBlU29sdmVyOworICAgICAgICB0aGlzLm9iamVjdCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFB1YmxpYyBzdGF0aWMgbWV0aG9kcworICAgIC8vLworCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RVc2FnZSB0b01ldGhvZFVzYWdlKE1ldGhvZENhbGxFeHByIGNhbGwsIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICBUeXBlSW5mZXJlbmNlIHR5cGVJbmZlcmVuY2UgPSBuZXcgVHlwZUluZmVyZW5jZSh0eXBlU29sdmVyKTsKKyAgICAgICAgT3B0aW9uYWw8SW5zdGFudGlhdGlvblNldD4gaW5zdGFudGlhdGlvblNldE9wdCA9IHR5cGVJbmZlcmVuY2UuaW5zdGFudGlhdGlvbkluZmVyZW5jZShjYWxsLCBtZXRob2REZWNsYXJhdGlvbik7CisgICAgICAgIGlmIChpbnN0YW50aWF0aW9uU2V0T3B0LmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGlvblNldFRvTWV0aG9kVXNhZ2UobWV0aG9kRGVjbGFyYXRpb24sIGluc3RhbnRpYXRpb25TZXRPcHQuZ2V0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFB1YmxpYyBpbnN0YW5jZSBtZXRob2RzCisgICAgLy8vCisKKyAgICBwdWJsaWMgT3B0aW9uYWw8SW5zdGFudGlhdGlvblNldD4gaW5zdGFudGlhdGlvbkluZmVyZW5jZShNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciwgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGlvbkluZmVyZW5jZShtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKSwgbWV0aG9kRGVjbGFyYXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxJbnN0YW50aWF0aW9uU2V0PiBpbnN0YW50aWF0aW9uSW5mZXJlbmNlKExpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRFeHByZXNzaW9ucywgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgeworLy8gICAgICAgIGlmIChtZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkpIHsKKy8vICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBpbmZlcmVuY2UgdW5uZWNlc3NhcnkgYXMgdHlwZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHNwZWNpZmllZCIpOworLy8gICAgICAgIH0KKworICAgICAgICAvLyBHaXZlbiBhIG1ldGhvZCBpbnZvY2F0aW9uIHRoYXQgcHJvdmlkZXMgbm8gZXhwbGljaXQgdHlwZSBhcmd1bWVudHMsIHRoZSBwcm9jZXNzIHRvIGRldGVybWluZSB3aGV0aGVyIGEKKyAgICAgICAgLy8gcG90ZW50aWFsbHkgYXBwbGljYWJsZSBnZW5lcmljIG1ldGhvZCBtIGlzIGFwcGxpY2FibGUgaXMgYXMgZm9sbG93czoKKworICAgICAgICAvLyAtIFdoZXJlIFAxLCAuLi4sIFBwIChwIOKJpSAxKSBhcmUgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBtLCBsZXQgzrExLCAuLi4sIM6xcCBiZSBpbmZlcmVuY2UgdmFyaWFibGVzLCBhbmQKKyAgICAgICAgLy8gICBsZXQgzrggYmUgdGhlIHN1YnN0aXR1dGlvbiBbUDE6Pc6xMSwgLi4uLCBQcDo9zrFwXS4KKworICAgICAgICBMaXN0PFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBQcyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIExpc3Q8SW5mZXJlbmNlVmFyaWFibGU+IGFscGhhcyA9IEluZmVyZW5jZVZhcmlhYmxlLmluc3RhbnRpYXRlKFBzKTsKKyAgICAgICAgU3Vic3RpdHV0aW9uIHRoZXRhID0gU3Vic3RpdHV0aW9uLmVtcHR5KCk7CisgICAgICAgIGZvciAoaW50IGk9MDtpPFBzLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgIHRoZXRhID0gdGhldGEud2l0aFBhaXIoUHMuZ2V0KDApLCBhbHBoYXMuZ2V0KDApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gQW4gaW5pdGlhbCBib3VuZCBzZXQsIEIwLCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBkZWNsYXJlZCBib3VuZHMgb2YgUDEsIC4uLiwgUHAsIGFzIGRlc2NyaWJlZCBpbiDCpzE4LjEuMy4KKworICAgICAgICBCb3VuZFNldCBCMCA9IGJvdW5kU2V0dXAoUHMsIGFscGhhcyk7CisKKyAgICAgICAgLy8gLSBGb3IgYWxsIGkgKDEg4omkIGkg4omkIHApLCBpZiBQaSBhcHBlYXJzIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIG0sIHRoZW4gdGhlIGJvdW5kIHRocm93cyDOsWkgaXMgaW1wbGllZC4KKyAgICAgICAgLy8gICBUaGVzZSBib3VuZHMsIGlmIGFueSwgYXJlIGluY29ycG9yYXRlZCB3aXRoIEIwIHRvIHByb2R1Y2UgYSBuZXcgYm91bmQgc2V0LCBCMS4KKworICAgICAgICBCb3VuZFNldCBCMSA9IEIwOworICAgICAgICBmb3IgKGludCBpPTA7aTxQcy5zaXplKCk7aSsrKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBQaSA9IFBzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcHBlYXJJblRocm93c0NsYXVzZShQaSwgbWV0aG9kRGVjbGFyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgQjEgPSBCMS53aXRoQm91bmQobmV3IFRocm93c0JvdW5kKGFscGhhcy5nZXQoaSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gQSBzZXQgb2YgY29uc3RyYWludCBmb3JtdWxhcywgQywgaXMgY29uc3RydWN0ZWQgYXMgZm9sbG93cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICBMZXQgRjEsIC4uLiwgRm4gYmUgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMgb2YgbSwgYW5kIGxldCBlMSwgLi4uLCBlayBiZSB0aGUgYWN0dWFsIGFyZ3VtZW50IGV4cHJlc3Npb25zCisgICAgICAgIC8vICAgb2YgdGhlIGludm9jYXRpb24uIFRoZW46CisKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IEZzID0gZm9ybWFsUGFyYW1ldGVyVHlwZXMobWV0aG9kRGVjbGFyYXRpb24pOworICAgICAgICBMaXN0PEV4cHJlc3Npb24+IGVzID0gYXJndW1lbnRFeHByZXNzaW9uczsKKworICAgICAgICBPcHRpb25hbDxDb25zdHJhaW50Rm9ybXVsYVNldD4gQyA9IE9wdGlvbmFsLmVtcHR5KCk7CisKKyAgICAgICAgLy8gICAtIFRvIHRlc3QgZm9yIGFwcGxpY2FiaWxpdHkgYnkgc3RyaWN0IGludm9jYXRpb246CisKKyAgICAgICAgaWYgKCFDLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBDID0gdGVzdEZvckFwcGxpY2FiaWxpdHlCeVN0cmljdEludm9jYXRpb24oRnMsIGVzLCB0aGV0YSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAgIC0gVG8gdGVzdCBmb3IgYXBwbGljYWJpbGl0eSBieSBsb29zZSBpbnZvY2F0aW9uOgorCisgICAgICAgIGlmICghQy5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgQyA9IHRlc3RGb3JBcHBsaWNhYmlsaXR5QnlMb29zZUludm9jYXRpb24oRnMsIGVzLCB0aGV0YSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAgIC0gVG8gdGVzdCBmb3IgYXBwbGljYWJpbGl0eSBieSB2YXJpYWJsZSBhcml0eSBpbnZvY2F0aW9uOgorCisgICAgICAgIGlmICghQy5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgQyA9IHRlc3RGb3JBcHBsaWNhYmlsaXR5QnlWYXJpYWJsZUFyaXR5SW52b2NhdGlvbihGcywgZXMsIHRoZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQy5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAtIEMgaXMgcmVkdWNlZCAowqcxOC4yKSBhbmQgdGhlIHJlc3VsdGluZyBib3VuZHMgYXJlIGluY29ycG9yYXRlZCB3aXRoIEIxIHRvIHByb2R1Y2UgYSBuZXcgYm91bmQgc2V0LCBCMi4KKworICAgICAgICBCb3VuZFNldCByZXN1bHRpbmdCb3VuZHMgPSBDLmdldCgpLnJlZHVjZSh0eXBlU29sdmVyKTsKKyAgICAgICAgQm91bmRTZXQgQjIgPSBCMS5pbmNvcnBvcmF0ZShyZXN1bHRpbmdCb3VuZHMsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIC8vIC0gRmluYWxseSwgdGhlIG1ldGhvZCBtIGlzIGFwcGxpY2FibGUgaWYgQjIgZG9lcyBub3QgY29udGFpbiB0aGUgYm91bmQgZmFsc2UgYW5kIHJlc29sdXRpb24gb2YgYWxsIHRoZQorICAgICAgICAvLyAgIGluZmVyZW5jZSB2YXJpYWJsZXMgaW4gQjIgc3VjY2VlZHMgKMKnMTguNCkuCisKKyAgICAgICAgaWYgKEIyLmNvbnRhaW5zRmFsc2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBPcHRpb25hbDxJbnN0YW50aWF0aW9uU2V0PiBpbnN0YW50aWF0aW9uID0gQjIucGVyZm9ybVJlc29sdXRpb24oYWxwaGFzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBwb3RlbnRpYWxseSBhcHBsaWNhYmxlIGdlbmVyaWMgbWV0aG9kIG0gaXMgYXBwbGljYWJsZSBmb3IgYSBtZXRob2QgaW52b2NhdGlvbiB0aGF0CisgICAgICogcHJvdmlkZXMgbm8gZXhwbGljaXQgdHlwZSBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaW52b2NhdGlvbkFwcGxpY2FiaWxpdHlJbmZlcmVuY2UoTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIsIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgaWYgKCFtZXRob2RDYWxsRXhwci5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMobWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIE9wdGlvbmFsPEluc3RhbnRpYXRpb25TZXQ+IHBhcnRpYWwgPSBpbnN0YW50aWF0aW9uSW5mZXJlbmNlKG1ldGhvZENhbGxFeHByLCBtZXRob2REZWNsYXJhdGlvbik7CisgICAgICAgIGlmICghcGFydGlhbC5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBuQWN0dWFsUGFyYW1zID0gbWV0aG9kQ2FsbEV4cHIuZ2V0QXJndW1lbnRzKCkuc2l6ZSgpOworICAgICAgICBpbnQgbkZvcm1hbFBhcmFtcyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCk7CisgICAgICAgIGlmIChuQWN0dWFsUGFyYW1zICE9IG5Gb3JtYWxQYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbi5oYXNWYXJpYWRpY1BhcmFtZXRlcigpKSB7CisgICAgICAgICAgICAgICAgaWYgKG5BY3R1YWxQYXJhbXMgPCAobkZvcm1hbFBhcmFtcyAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL01ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gaW5zdGFudGlhdGlvblNldFRvTWV0aG9kVXNhZ2UobWV0aG9kRGVjbGFyYXRpb24sIHBhcnRpYWwuZ2V0KCkpOworLy8gICAgICAgIGZvciAoaW50IGk9MDtpPG5BY3R1YWxQYXJhbXM7aSsrKSB7CisvLyAgICAgICAgICAgIGludCBmb3JtYWxJbmRleCA9IGkgPj0gbkZvcm1hbFBhcmFtcyA/IG5Gb3JtYWxQYXJhbXMgLSAxIDogaTsKKy8vICAgICAgICAgICAgVHlwZSBmb3JtYWxUeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW0oZm9ybWFsSW5kZXgpLmdldFR5cGUoKTsKKy8vICAgICAgICAgICAgVHlwZSBhY3R1YWxUeXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudChpKSk7CisvLyAgICAgICAgICAgIC8vaWYgKCFmb3JtYWxUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpKSB7CisvLyAgICAgICAgICAgIC8vICAgIHJldHVybiBmYWxzZTsKKy8vICAgICAgICAgICAgLy99CisvLyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm91bmRTZXQgaW52b2NhdGlvblR5cGVJbmZlcmVuY2VCb3VuZHNTZXRCMygpIHsKKyAgICAgICAgLy8gR2l2ZW4gYSBtZXRob2QgaW52b2NhdGlvbiB0aGF0IHByb3ZpZGVzIG5vIGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzLCBhbmQgYSBjb3JyZXNwb25kaW5nIG1vc3Qgc3BlY2lmaWMKKyAgICAgICAgLy8gYXBwbGljYWJsZSBnZW5lcmljIG1ldGhvZCBtLCB0aGUgcHJvY2VzcyB0byBpbmZlciB0aGUgaW52b2NhdGlvbiB0eXBlICjCpzE1LjEyLjIuNikgb2YgdGhlIGNob3NlbiBtZXRob2QgaXMKKyAgICAgICAgLy8gYXMgZm9sbG93czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBMZXQgzrggYmUgdGhlIHN1YnN0aXR1dGlvbiBbUDE6Pc6xMSwgLi4uLCBQcDo9zrFwXSBkZWZpbmVkIGluIMKnMTguNS4xIHRvIHJlcGxhY2UgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBtIHdpdGggaW5mZXJlbmNlIHZhcmlhYmxlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBMZXQgQjIgYmUgdGhlIGJvdW5kIHNldCBwcm9kdWNlZCBieSByZWR1Y3Rpb24gaW4gb3JkZXIgdG8gZGVtb25zdHJhdGUgdGhhdCBtIGlzIGFwcGxpY2FibGUgaW4gwqcxOC41LjEuIChXaGlsZSBpdCB3YXMgbmVjZXNzYXJ5IGluIMKnMTguNS4xIHRvIGRlbW9uc3RyYXRlIHRoYXQgdGhlIGluZmVyZW5jZSB2YXJpYWJsZXMgaW4gQjIgY291bGQgYmUgcmVzb2x2ZWQsIGluIG9yZGVyIHRvIGVzdGFibGlzaCBhcHBsaWNhYmlsaXR5LCB0aGUgaW5zdGFudGlhdGlvbnMgcHJvZHVjZWQgYnkgdGhpcyByZXNvbHV0aW9uIHN0ZXAgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgQjIuKQorICAgICAgICAvLworICAgICAgICAvLyAtIElmIHRoZSBpbnZvY2F0aW9uIGlzIG5vdCBhIHBvbHkgZXhwcmVzc2lvbiwgbGV0IHRoZSBib3VuZCBzZXQgQjMgYmUgdGhlIHNhbWUgYXMgQjIuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgSWYgdGhlIGludm9jYXRpb24gaXMgYSBwb2x5IGV4cHJlc3Npb24sIGxldCB0aGUgYm91bmQgc2V0IEIzIGJlIGRlcml2ZWQgZnJvbSBCMiBhcyBmb2xsb3dzLiBMZXQgUiBiZSB0aGUKKyAgICAgICAgLy8gICByZXR1cm4gdHlwZSBvZiBtLCBsZXQgVCBiZSB0aGUgaW52b2NhdGlvbidzIHRhcmdldCB0eXBlLCBhbmQgdGhlbjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIElmIHVuY2hlY2tlZCBjb252ZXJzaW9uIHdhcyBuZWNlc3NhcnkgZm9yIHRoZSBtZXRob2QgdG8gYmUgYXBwbGljYWJsZSBkdXJpbmcgY29uc3RyYWludCBzZXQgcmVkdWN0aW9uCisgICAgICAgIC8vICAgICBpbiDCpzE4LjUuMSwgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYSDigLl8Unwg4oaSIFTigLogaXMgcmVkdWNlZCBhbmQgaW5jb3Jwb3JhdGVkIHdpdGggQjIuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSBPdGhlcndpc2UsIGlmIFIgzrggaXMgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIEc8QTEsIC4uLiwgQW4+LCBhbmQgb25lIG9mIEExLCAuLi4sIEFuIGlzIGEgd2lsZGNhcmQsIHRoZW4sCisgICAgICAgIC8vICAgICBmb3IgZnJlc2ggaW5mZXJlbmNlIHZhcmlhYmxlcyDOsjEsIC4uLiwgzrJuLCB0aGUgY29uc3RyYWludCBmb3JtdWxhIOKAuUc8zrIxLCAuLi4sIM6ybj4g4oaSIFTigLogaXMgcmVkdWNlZCBhbmQKKyAgICAgICAgLy8gICAgIGluY29ycG9yYXRlZCwgYWxvbmcgd2l0aCB0aGUgYm91bmQgRzzOsjEsIC4uLiwgzrJuPiA9IGNhcHR1cmUoRzxBMSwgLi4uLCBBbj4pLCB3aXRoIEIyLgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gT3RoZXJ3aXNlLCBpZiBSIM64IGlzIGFuIGluZmVyZW5jZSB2YXJpYWJsZSDOsSwgYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAtIFQgaXMgYSByZWZlcmVuY2UgdHlwZSwgYnV0IGlzIG5vdCBhIHdpbGRjYXJkLXBhcmFtZXRlcml6ZWQgdHlwZSwgYW5kIGVpdGhlciBpKSBCMiBjb250YWlucyBhIGJvdW5kIG9mCisgICAgICAgIC8vICAgICAgIG9uZSBvZiB0aGUgZm9ybXMgzrEgPSBTIG9yIFMgPDogzrEsIHdoZXJlIFMgaXMgYSB3aWxkY2FyZC1wYXJhbWV0ZXJpemVkIHR5cGUsIG9yIGlpKSBCMiBjb250YWlucyB0d28KKyAgICAgICAgLy8gICAgICAgYm91bmRzIG9mIHRoZSBmb3JtcyBTMSA8OiDOsSBhbmQgUzIgPDogzrEsIHdoZXJlIFMxIGFuZCBTMiBoYXZlIHN1cGVydHlwZXMgdGhhdCBhcmUgdHdvIGRpZmZlcmVudAorICAgICAgICAvLyAgICAgICBwYXJhbWV0ZXJpemF0aW9ucyBvZiB0aGUgc2FtZSBnZW5lcmljIGNsYXNzIG9yIGludGVyZmFjZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gVCBpcyBhIHBhcmFtZXRlcml6YXRpb24gb2YgYSBnZW5lcmljIGNsYXNzIG9yIGludGVyZmFjZSwgRywgYW5kIEIyIGNvbnRhaW5zIGEgYm91bmQgb2Ygb25lIG9mIHRoZQorICAgICAgICAvLyAgICAgICBmb3JtcyDOsSA9IFMgb3IgUyA8OiDOsSwgd2hlcmUgdGhlcmUgZXhpc3RzIG5vIHR5cGUgb2YgdGhlIGZvcm0gRzwuLi4+IHRoYXQgaXMgYSBzdXBlcnR5cGUgb2YgUywgYnV0IHRoZQorICAgICAgICAvLyAgICAgICByYXcgdHlwZSB8RzwuLi4+fCBpcyBhIHN1cGVydHlwZSBvZiBTLgorICAgICAgICAvLworICAgICAgICAvLyAgICAgLSBUIGlzIGEgcHJpbWl0aXZlIHR5cGUsIGFuZCBvbmUgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGNsYXNzZXMgbWVudGlvbmVkIGluIMKnNS4xLjcgaXMgYW4KKyAgICAgICAgLy8gICAgICAgaW5zdGFudGlhdGlvbiwgdXBwZXIgYm91bmQsIG9yIGxvd2VyIGJvdW5kIGZvciDOsSBpbiBCMi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIHRoZW4gzrEgaXMgcmVzb2x2ZWQgaW4gQjIsIGFuZCB3aGVyZSB0aGUgY2FwdHVyZSBvZiB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24gb2YgzrEgaXMgVSwgdGhlIGNvbnN0cmFpbnQKKyAgICAgICAgLy8gICAgIGZvcm11bGEg4oC5VSDihpIgVOKAuiBpcyByZWR1Y2VkIGFuZCBpbmNvcnBvcmF0ZWQgd2l0aCBCMi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIE90aGVyd2lzZSwgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYSDigLlSIM64IOKGkiBU4oC6IGlzIHJlZHVjZWQgYW5kIGluY29ycG9yYXRlZCB3aXRoIEIyLgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZvY2F0aW9uVHlwZUluZmVyZW5jZSgpIHsKKyAgICAgICAgQm91bmRTZXQgQjMgPSBpbnZvY2F0aW9uVHlwZUluZmVyZW5jZUJvdW5kc1NldEIzKCk7CisgICAgICAgIC8vCisgICAgICAgIC8vQSBzZXQgb2YgY29uc3RyYWludCBmb3JtdWxhcywgQywgaXMgY29uc3RydWN0ZWQgYXMgZm9sbG93cy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIExldCBlMSwgLi4uLCBlayBiZSB0aGUgYWN0dWFsIGFyZ3VtZW50IGV4cHJlc3Npb25zIG9mIHRoZSBpbnZvY2F0aW9uLiBJZiBtIGlzIGFwcGxpY2FibGUgYnkgc3RyaWN0IG9yIGxvb3NlIGludm9jYXRpb24sIGxldCBGMSwgLi4uLCBGayBiZSB0aGUgZm9ybWFsIHBhcmFtZXRlciB0eXBlcyBvZiBtOyBpZiBtIGlzIGFwcGxpY2FibGUgYnkgdmFyaWFibGUgYXJpdHkgaW52b2NhdGlvbiwgbGV0IEYxLCAuLi4sIEZrIHRoZSBmaXJzdCBrIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciB0eXBlcyBvZiBtICjCpzE1LjEyLjIuNCkuIFRoZW46CisgICAgICAgIC8vCisgICAgICAgIC8vRm9yIGFsbCBpICgxIOKJpCBpIOKJpCBrKSwgaWYgZWkgaXMgbm90IHBlcnRpbmVudCB0byBhcHBsaWNhYmlsaXR5LCBDIGNvbnRhaW5zIOKAuWVpIOKGkiBGaSDOuOKAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy9Gb3IgYWxsIGkgKDEg4omkIGkg4omkIGspLCBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIG1heSBiZSBpbmNsdWRlZCwgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIGVpOgorICAgICAgICAvLworICAgICAgICAvL0lmIGVpIGlzIGEgTGFtYmRhRXhwcmVzc2lvbiwgQyBjb250YWlucyDigLlMYW1iZGFFeHByZXNzaW9uIOKGknRocm93cyBGaSDOuOKAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy9JbiBhZGRpdGlvbiwgdGhlIGxhbWJkYSBib2R5IGlzIHNlYXJjaGVkIGZvciBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzOgorICAgICAgICAvLworICAgICAgICAvL0ZvciBhIGJsb2NrIGxhbWJkYSBib2R5LCB0aGUgc2VhcmNoIGlzIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gZWFjaCByZXN1bHQgZXhwcmVzc2lvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy9Gb3IgYSBwb2x5IGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gKMKnMTUuOSkgb3IgYSBwb2x5IG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24gKMKnMTUuMTIpLCBDIGNvbnRhaW5zIGFsbCB0aGUgY29uc3RyYWludCBmb3JtdWxhcyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgc2V0IEMgZ2VuZXJhdGVkIGJ5IMKnMTguNS4yIHdoZW4gaW5mZXJyaW5nIHRoZSBwb2x5IGV4cHJlc3Npb24ncyBpbnZvY2F0aW9uIHR5cGUuCisgICAgICAgIC8vCisgICAgICAgIC8vRm9yIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCB0aGUgc2VhcmNoIGlzIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uLgorICAgICAgICAvLworICAgICAgICAvL0ZvciBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24sIHRoZSBzZWFyY2ggaXMgYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgc2Vjb25kIGFuZCB0aGlyZCBvcGVyYW5kcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy9Gb3IgYSBsYW1iZGEgZXhwcmVzc2lvbiwgdGhlIHNlYXJjaCBpcyBhcHBsaWVkIHJlY3Vyc2l2ZWx5IHRvIHRoZSBsYW1iZGEgYm9keS4KKyAgICAgICAgLy8KKyAgICAgICAgLy9JZiBlaSBpcyBhIE1ldGhvZFJlZmVyZW5jZSwgQyBjb250YWlucyDigLlNZXRob2RSZWZlcmVuY2Ug4oaSdGhyb3dzIEZpIM644oC6LgorICAgICAgICAvLworICAgICAgICAvL0lmIGVpIGlzIGEgcG9seSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uICjCpzE1LjkpIG9yIGEgcG9seSBtZXRob2QgaW52b2NhdGlvbiBleHByZXNzaW9uICjCpzE1LjEyKSwgQyBjb250YWlucyBhbGwgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYXMgdGhhdCB3b3VsZCBhcHBlYXIgaW4gdGhlIHNldCBDIGdlbmVyYXRlZCBieSDCpzE4LjUuMiB3aGVuIGluZmVycmluZyB0aGUgcG9seSBleHByZXNzaW9uJ3MgaW52b2NhdGlvbiB0eXBlLgorICAgICAgICAvLworICAgICAgICAvL0lmIGVpIGlzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCB0aGVzZSBydWxlcyBhcmUgYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24uCisgICAgICAgIC8vCisgICAgICAgIC8vSWYgZWkgaXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLCB0aGVzZSBydWxlcyBhcmUgYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgc2Vjb25kIGFuZCB0aGlyZCBvcGVyYW5kcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy9XaGlsZSBDIGlzIG5vdCBlbXB0eSwgdGhlIGZvbGxvd2luZyBwcm9jZXNzIGlzIHJlcGVhdGVkLCBzdGFydGluZyB3aXRoIHRoZSBib3VuZCBzZXQgQjMgYW5kIGFjY3VtdWxhdGluZyBuZXcgYm91bmRzIGludG8gYSAiY3VycmVudCIgYm91bmQgc2V0LCB1bHRpbWF0ZWx5IHByb2R1Y2luZyBhIG5ldyBib3VuZCBzZXQsIEI0OgorICAgICAgICAvLworICAgICAgICAvL0Egc3Vic2V0IG9mIGNvbnN0cmFpbnRzIGlzIHNlbGVjdGVkIGluIEMsIHNhdGlzZnlpbmcgdGhlIHByb3BlcnR5IHRoYXQsIGZvciBlYWNoIGNvbnN0cmFpbnQsIG5vIGlucHV0IHZhcmlhYmxlIGNhbiBpbmZsdWVuY2UgYW4gb3V0cHV0IHZhcmlhYmxlIG9mIGFub3RoZXIgY29uc3RyYWludCBpbiBDLiBUaGUgdGVybXMgaW5wdXQgdmFyaWFibGUgYW5kIG91dHB1dCB2YXJpYWJsZSBhcmUgZGVmaW5lZCBiZWxvdy4gQW4gaW5mZXJlbmNlIHZhcmlhYmxlIM6xIGNhbiBpbmZsdWVuY2UgYW4gaW5mZXJlbmNlIHZhcmlhYmxlIM6yIGlmIM6xIGRlcGVuZHMgb24gdGhlIHJlc29sdXRpb24gb2YgzrIgKMKnMTguNCksIG9yIHZpY2UgdmVyc2E7IG9yIGlmIHRoZXJlIGV4aXN0cyBhIHRoaXJkIGluZmVyZW5jZSB2YXJpYWJsZSDOsyBzdWNoIHRoYXQgzrEgY2FuIGluZmx1ZW5jZSDOsyBhbmQgzrMgY2FuIGluZmx1ZW5jZSDOsi4KKyAgICAgICAgLy8KKyAgICAgICAgLy9JZiB0aGlzIHN1YnNldCBpcyBlbXB0eSwgdGhlbiB0aGVyZSBpcyBhIGN5Y2xlIChvciBjeWNsZXMpIGluIHRoZSBncmFwaCBvZiBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjb25zdHJhaW50cy4gSW4gdGhpcyBjYXNlLCBhbGwgY29uc3RyYWludHMgYXJlIGNvbnNpZGVyZWQgdGhhdCBwYXJ0aWNpcGF0ZSBpbiBhIGRlcGVuZGVuY3kgY3ljbGUgKG9yIGN5Y2xlcykgYW5kIGRvIG5vdCBkZXBlbmQgb24gYW55IGNvbnN0cmFpbnRzIG91dHNpZGUgb2YgdGhlIGN5Y2xlIChvciBjeWNsZXMpLiBBIHNpbmdsZSBjb25zdHJhaW50IGlzIHNlbGVjdGVkIGZyb20gdGhlIGNvbnNpZGVyZWQgY29uc3RyYWludHMsIGFzIGZvbGxvd3M6CisgICAgICAgIC8vCisgICAgICAgIC8vSWYgYW55IG9mIHRoZSBjb25zaWRlcmVkIGNvbnN0cmFpbnRzIGhhdmUgdGhlIGZvcm0g4oC5RXhwcmVzc2lvbiDihpIgVOKAuiwgdGhlbiB0aGUgc2VsZWN0ZWQgY29uc3RyYWludCBpcyB0aGUgY29uc2lkZXJlZCBjb25zdHJhaW50IG9mIHRoaXMgZm9ybSB0aGF0IGNvbnRhaW5zIHRoZSBleHByZXNzaW9uIHRvIHRoZSBsZWZ0ICjCpzMuNSkgb2YgdGhlIGV4cHJlc3Npb24gb2YgZXZlcnkgb3RoZXIgY29uc2lkZXJlZCBjb25zdHJhaW50IG9mIHRoaXMgZm9ybS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIElmIG5vIGNvbnNpZGVyZWQgY29uc3RyYWludCBoYXMgdGhlIGZvcm0g4oC5RXhwcmVzc2lvbiDihpIgVOKAuiwgdGhlbiB0aGUgc2VsZWN0ZWQgY29uc3RyYWludCBpcyB0aGUgY29uc2lkZXJlZCBjb25zdHJhaW50IHRoYXQgY29udGFpbnMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGxlZnQgb2YgdGhlIGV4cHJlc3Npb24gb2YgZXZlcnkgb3RoZXIgY29uc2lkZXJlZCBjb25zdHJhaW50LgorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgVGhlIHNlbGVjdGVkIGNvbnN0cmFpbnQocykgYXJlIHJlbW92ZWQgZnJvbSBDLgorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgVGhlIGlucHV0IHZhcmlhYmxlcyDOsTEsIC4uLiwgzrFtIG9mIGFsbCB0aGUgc2VsZWN0ZWQgY29uc3RyYWludChzKSBhcmUgcmVzb2x2ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBXaGVyZSBUMSwgLi4uLCBUbSBhcmUgdGhlIGluc3RhbnRpYXRpb25zIG9mIM6xMSwgLi4uLCDOsW0sIHRoZSBzdWJzdGl0dXRpb24gW86xMTo9VDEsIC4uLiwgzrFtOj1UbV0gaXMgYXBwbGllZCB0byBldmVyeSBjb25zdHJhaW50LgorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgVGhlIGNvbnN0cmFpbnQocykgcmVzdWx0aW5nIGZyb20gc3Vic3RpdHV0aW9uIGFyZSByZWR1Y2VkIGFuZCBpbmNvcnBvcmF0ZWQgd2l0aCB0aGUgY3VycmVudCBib3VuZCBzZXQuCisgICAgICAgIC8vCisgICAgICAgIC8vRmluYWxseSwgaWYgQjQgZG9lcyBub3QgY29udGFpbiB0aGUgYm91bmQgZmFsc2UsIHRoZSBpbmZlcmVuY2UgdmFyaWFibGVzIGluIEI0IGFyZSByZXNvbHZlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy9JZiByZXNvbHV0aW9uIHN1Y2NlZWRzIHdpdGggaW5zdGFudGlhdGlvbnMgVDEsIC4uLiwgVHAgZm9yIGluZmVyZW5jZSB2YXJpYWJsZXMgzrExLCAuLi4sIM6xcCwgbGV0IM64JyBiZSB0aGUgc3Vic3RpdHV0aW9uIFtQMTo9VDEsIC4uLiwgUHA6PVRwXS4gVGhlbjoKKyAgICAgICAgLy8KKyAgICAgICAgLy9JZiB1bmNoZWNrZWQgY29udmVyc2lvbiB3YXMgbmVjZXNzYXJ5IGZvciB0aGUgbWV0aG9kIHRvIGJlIGFwcGxpY2FibGUgZHVyaW5nIGNvbnN0cmFpbnQgc2V0IHJlZHVjdGlvbiBpbiDCpzE4LjUuMSwgdGhlbiB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBpbnZvY2F0aW9uIHR5cGUgb2YgbSBhcmUgb2J0YWluZWQgYnkgYXBwbHlpbmcgzrgnIHRvIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgbSdzIHR5cGUsIGFuZCB0aGUgcmV0dXJuIHR5cGUgYW5kIHRocm93biB0eXBlcyBvZiB0aGUgaW52b2NhdGlvbiB0eXBlIG9mIG0gYXJlIGdpdmVuIGJ5IHRoZSBlcmFzdXJlIG9mIHRoZSByZXR1cm4gdHlwZSBhbmQgdGhyb3duIHR5cGVzIG9mIG0ncyB0eXBlLgorICAgICAgICAvLworICAgICAgICAvL0lmIHVuY2hlY2tlZCBjb252ZXJzaW9uIHdhcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgbWV0aG9kIHRvIGJlIGFwcGxpY2FibGUsIHRoZW4gdGhlIGludm9jYXRpb24gdHlwZSBvZiBtIGlzIG9idGFpbmVkIGJ5IGFwcGx5aW5nIM64JyB0byB0aGUgdHlwZSBvZiBtLgorICAgICAgICAvLworICAgICAgICAvL0lmIEI0IGNvbnRhaW5zIHRoZSBib3VuZCBmYWxzZSwgb3IgaWYgcmVzb2x1dGlvbiBmYWlscywgdGhlbiBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCisgICAgICAgIC8vCisgICAgICAgIC8vSW52b2NhdGlvbiB0eXBlIGluZmVyZW5jZSBtYXkgcmVxdWlyZSBjYXJlZnVsbHkgc2VxdWVuY2luZyB0aGUgcmVkdWN0aW9uIG9mIGNvbnN0cmFpbnQgZm9ybXVsYXMgb2YgdGhlIGZvcm1zIOKAuUV4cHJlc3Npb24g4oaSIFTigLosIOKAuUxhbWJkYUV4cHJlc3Npb24g4oaSdGhyb3dzIFTigLosIGFuZCDigLlNZXRob2RSZWZlcmVuY2Ug4oaSdGhyb3dzIFTigLouIFRvIGZhY2lsaXRhdGUgdGhpcyBzZXF1ZW5jaW5nLCB0aGUgaW5wdXQgdmFyaWFibGVzIG9mIHRoZXNlIGNvbnN0cmFpbnRzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgICAgICAgIC8vCisgICAgICAgIC8vRm9yIOKAuUxhbWJkYUV4cHJlc3Npb24g4oaSIFTigLo6CisgICAgICAgIC8vCisgICAgICAgIC8vSWYgVCBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGUsIGl0IGlzIHRoZSAob25seSkgaW5wdXQgdmFyaWFibGUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBJZiBUIGlzIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSwgYW5kIGEgZnVuY3Rpb24gdHlwZSBjYW4gYmUgZGVyaXZlZCBmcm9tIFQgKMKnMTUuMjcuMyksIHRoZW4gdGhlIGlucHV0IHZhcmlhYmxlcyBpbmNsdWRlIGkpIGlmIHRoZSBsYW1iZGEgZXhwcmVzc2lvbiBpcyBpbXBsaWNpdGx5IHR5cGVkLCB0aGUgaW5mZXJlbmNlIHZhcmlhYmxlcyBtZW50aW9uZWQgYnkgdGhlIGZ1bmN0aW9uIHR5cGUncyBwYXJhbWV0ZXIgdHlwZXM7IGFuZCBpaSkgaWYgdGhlIGZ1bmN0aW9uIHR5cGUncyByZXR1cm4gdHlwZSwgUiwgaXMgbm90IHZvaWQsIHRoZW4gZm9yIGVhY2ggcmVzdWx0IGV4cHJlc3Npb24gZSBpbiB0aGUgbGFtYmRhIGJvZHkgKG9yIGZvciB0aGUgYm9keSBpdHNlbGYgaWYgaXQgaXMgYW4gZXhwcmVzc2lvbiksIHRoZSBpbnB1dCB2YXJpYWJsZXMgb2Yg4oC5ZSDihpIgUuKAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy9PdGhlcndpc2UsIHRoZXJlIGFyZSBubyBpbnB1dCB2YXJpYWJsZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vRm9yIOKAuUxhbWJkYUV4cHJlc3Npb24g4oaSdGhyb3dzIFTigLo6CisgICAgICAgIC8vCisgICAgICAgIC8vSWYgVCBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGUsIGl0IGlzIHRoZSAob25seSkgaW5wdXQgdmFyaWFibGUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBJZiBUIGlzIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSwgYW5kIGEgZnVuY3Rpb24gdHlwZSBjYW4gYmUgZGVyaXZlZCwgYXMgZGVzY3JpYmVkIGluIMKnMTUuMjcuMywgdGhlIGlucHV0IHZhcmlhYmxlcyBpbmNsdWRlIGkpIGlmIHRoZSBsYW1iZGEgZXhwcmVzc2lvbiBpcyBpbXBsaWNpdGx5IHR5cGVkLCB0aGUgaW5mZXJlbmNlIHZhcmlhYmxlcyBtZW50aW9uZWQgYnkgdGhlIGZ1bmN0aW9uIHR5cGUncyBwYXJhbWV0ZXIgdHlwZXM7IGFuZCBpaSkgdGhlIGluZmVyZW5jZSB2YXJpYWJsZXMgbWVudGlvbmVkIGJ5IHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmV0dXJuIHR5cGUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBPdGhlcndpc2UsIHRoZXJlIGFyZSBubyBpbnB1dCB2YXJpYWJsZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBGb3Ig4oC5TWV0aG9kUmVmZXJlbmNlIOKGkiBU4oC6OgorICAgICAgICAvLworICAgICAgICAvL0lmIFQgaXMgYW4gaW5mZXJlbmNlIHZhcmlhYmxlLCBpdCBpcyB0aGUgKG9ubHkpIGlucHV0IHZhcmlhYmxlLgorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgSWYgVCBpcyBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHR5cGUgd2l0aCBhIGZ1bmN0aW9uIHR5cGUsIGFuZCBpZiB0aGUgbWV0aG9kIHJlZmVyZW5jZSBpcyBpbmV4YWN0ICjCpzE1LjEzLjEpLCB0aGUgaW5wdXQgdmFyaWFibGVzIGFyZSB0aGUgaW5mZXJlbmNlIHZhcmlhYmxlcyBtZW50aW9uZWQgYnkgdGhlIGZ1bmN0aW9uIHR5cGUncyBwYXJhbWV0ZXIgdHlwZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vT3RoZXJ3aXNlLCB0aGVyZSBhcmUgbm8gaW5wdXQgdmFyaWFibGVzLgorICAgICAgICAvLworICAgICAgICAvL0ZvciDigLlNZXRob2RSZWZlcmVuY2Ug4oaSdGhyb3dzIFTigLo6CisgICAgICAgIC8vCisgICAgICAgIC8vSWYgVCBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGUsIGl0IGlzIHRoZSAob25seSkgaW5wdXQgdmFyaWFibGUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICBJZiBUIGlzIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSB3aXRoIGEgZnVuY3Rpb24gdHlwZSwgYW5kIGlmIHRoZSBtZXRob2QgcmVmZXJlbmNlIGlzIGluZXhhY3QgKMKnMTUuMTMuMSksIHRoZSBpbnB1dCB2YXJpYWJsZXMgYXJlIHRoZSBpbmZlcmVuY2UgdmFyaWFibGVzIG1lbnRpb25lZCBieSB0aGUgZnVuY3Rpb24gdHlwZSdzIHBhcmFtZXRlciB0eXBlcyBhbmQgdGhlIGZ1bmN0aW9uIHR5cGUncyByZXR1cm4gdHlwZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIE90aGVyd2lzZSwgdGhlcmUgYXJlIG5vIGlucHV0IHZhcmlhYmxlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIEZvciDigLlFeHByZXNzaW9uIOKGkiBU4oC6LCBpZiBFeHByZXNzaW9uIGlzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uOgorICAgICAgICAvLworICAgICAgICAvL1doZXJlIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbiBvZiBFeHByZXNzaW9uIGlzIEV4cHJlc3Npb24nLCB0aGUgaW5wdXQgdmFyaWFibGVzIGFyZSB0aGUgaW5wdXQgdmFyaWFibGVzIG9mIOKAuUV4cHJlc3Npb24nIOKGkiBU4oC6LgorICAgICAgICAvLworICAgICAgICAvL0ZvciDigLlDb25kaXRpb25hbEV4cHJlc3Npb24g4oaSIFTigLo6CisgICAgICAgIC8vCisgICAgICAgIC8vV2hlcmUgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaGFzIHRoZSBmb3JtIGUxID8gZTIgOiBlMywgdGhlIGlucHV0IHZhcmlhYmxlcyBhcmUgdGhlIGlucHV0IHZhcmlhYmxlcyBvZiDigLllMiDihpIgVOKAuiBhbmQg4oC5ZTMg4oaSIFTigLouCisgICAgICAgIC8vCisgICAgICAgIC8vRm9yIGFsbCBvdGhlciBjb25zdHJhaW50IGZvcm11bGFzLCB0aGVyZSBhcmUgbm8gaW5wdXQgdmFyaWFibGVzLgorICAgICAgICAvLworICAgICAgICAvL1RoZSBvdXRwdXQgdmFyaWFibGVzIG9mIHRoZXNlIGNvbnN0cmFpbnRzIGFyZSBhbGwgaW5mZXJlbmNlIHZhcmlhYmxlcyBtZW50aW9uZWQgYnkgdGhlIHR5cGUgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgY29uc3RyYWludCwgVCwgdGhhdCBhcmUgbm90IGlucHV0IHZhcmlhYmxlcy4KKworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmdW5jdGlvbmFsSW50ZXJmYWNlUGFyYW1ldGVyaXphdGlvbkluZmVyZW5jZShMYW1iZGFFeHByIGxhbWJkYUV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAvLyBXaGVyZSBhIGxhbWJkYSBleHByZXNzaW9uIHdpdGggZXhwbGljaXQgcGFyYW1ldGVyIHR5cGVzIFAxLCAuLi4sIFBuIHRhcmdldHMgYSBmdW5jdGlvbmFsIGludGVyZmFjZQorICAgICAgICAvLyB0eXBlIEY8QTEsIC4uLiwgQW0+IHdpdGggYXQgbGVhc3Qgb25lIHdpbGRjYXJkIHR5cGUgYXJndW1lbnQsIHRoZW4gYSBwYXJhbWV0ZXJpemF0aW9uIG9mIEYgbWF5IGJlIGRlcml2ZWQKKyAgICAgICAgLy8gYXMgdGhlIGdyb3VuZCB0YXJnZXQgdHlwZSBvZiB0aGUgbGFtYmRhIGV4cHJlc3Npb24gYXMgZm9sbG93cy4KKworICAgICAgICBpbnQgbiA9IGxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpLnNpemUoKTsKKworICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZ1bmN0aW9uYWwgSW50ZXJmYWNlIHdpdGhvdXQgdHlwZSBhcmd1bWVudHMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExldCBRMSwgLi4uLCBRayBiZSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBmdW5jdGlvbiB0eXBlIG9mIHRoZSB0eXBlIEY8zrExLCAuLi4sIM6xbT4sCisgICAgICAgIC8vIHdoZXJlIM6xMSwgLi4uLCDOsW0gYXJlIGZyZXNoIGluZmVyZW5jZSB2YXJpYWJsZXMuCisKKyAgICAgICAgaW50IGsgPSBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKTsKKyAgICAgICAgTGlzdDxJbmZlcmVuY2VWYXJpYWJsZT4gYWxwaGFzID0gSW5mZXJlbmNlVmFyaWFibGUuaW5zdGFudGlhdGUoaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSk7CisKKyAgICAgICAgVHlwZUluZmVyZW5jZUNhY2hlLnJlY29yZEluZmVyZW5jZVZhcmlhYmxlcyh0eXBlU29sdmVyLCBsYW1iZGFFeHByLCBhbHBoYXMpOworCisgICAgICAgIC8vIElmIG4g4omgIGssIG5vIHZhbGlkIHBhcmFtZXRlcml6YXRpb24gZXhpc3RzLgorCisgICAgICAgIGlmIChuICE9IGspIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHZhbGlkYSBwYXJhbWV0ZXJpemF0aW9uIGNhbiBleGlzdCBoYXMgbj0iICsgIiBhbmQgaz0iICsgayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIGEgc2V0IG9mIGNvbnN0cmFpbnQgZm9ybXVsYXMgaXMgZm9ybWVkIHdpdGgsIGZvcgorICAgICAgICAvLyBhbGwgaSAoMSDiiaQgaSDiiaQgbiksIOKAuVBpID0gUWnigLouIFRoaXMgY29uc3RyYWludCBmb3JtdWxhIHNldCBpcyByZWR1Y2VkIHRvIGZvcm0gdGhlIGJvdW5kIHNldCBCLgorCisgICAgICAgIENvbnN0cmFpbnRGb3JtdWxhU2V0IGNvbnN0cmFpbnRGb3JtdWxhU2V0ID0gQ29uc3RyYWludEZvcm11bGFTZXQuZW1wdHkoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG47IGkrKykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvL1R5cGUgcGkgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0VG9Vc2FnZShsYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKS5nZXQoaSkuZ2V0VHlwZSgpLCBsYW1iZGFFeHByKTsKKyAgICAgICAgICAgIC8vVHlwZSBxaSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnRUb1VzYWdlKGludGVyZmFjZURlY2xhcmF0aW9uLmdldG0uZ2V0KGkpLmdldFR5cGUoKSwgbGFtYmRhRXhwcik7CisgICAgICAgICAgICAvL2NvbnN0cmFpbnRGb3JtdWxhU2V0ID0gY29uc3RyYWludEZvcm11bGFTZXQud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTYW1lQXNUeXBlKHBpLCBxaSkpOworICAgICAgICB9CisgICAgICAgIEJvdW5kU2V0IEIgPSBjb25zdHJhaW50Rm9ybXVsYVNldC5yZWR1Y2UodHlwZVNvbHZlcik7CisKKyAgICAgICAgLy8gSWYgQiBjb250YWlucyB0aGUgYm91bmQgZmFsc2UsIG5vIHZhbGlkIHBhcmFtZXRlcml6YXRpb24gZXhpc3RzLiBPdGhlcndpc2UsIGEgbmV3IHBhcmFtZXRlcml6YXRpb24gb2YgdGhlCisgICAgICAgIC8vIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHR5cGUsIEY8QScxLCAuLi4sIEEnbT4sIGlzIGNvbnN0cnVjdGVkIGFzIGZvbGxvd3MsIGZvciAxIOKJpCBpIOKJpCBtOgorICAgICAgICAvLworICAgICAgICAvLyAtIElmIEIgY29udGFpbnMgYW4gaW5zdGFudGlhdGlvbiAowqcxOC4xLjMpIGZvciDOsWksIFQsIHRoZW4gQSdpID0gVC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBPdGhlcndpc2UsIEEnaSA9IEFpLgorICAgICAgICAvLworICAgICAgICAvLyBJZiBGPEEnMSwgLi4uLCBBJ20+IGlzIG5vdCBhIHdlbGwtZm9ybWVkIHR5cGUgKHRoYXQgaXMsIHRoZSB0eXBlIGFyZ3VtZW50cyBhcmUgbm90IHdpdGhpbiB0aGVpciBib3VuZHMpLCBvciBpZiBGPEEnMSwgLi4uLCBBJ20+IGlzIG5vdCBhIHN1YnR5cGUgb2YgRjxBMSwgLi4uLCBBbT4sIG5vIHZhbGlkIHBhcmFtZXRlcml6YXRpb24gZXhpc3RzLiBPdGhlcndpc2UsIHRoZSBpbmZlcnJlZCBwYXJhbWV0ZXJpemF0aW9uIGlzIGVpdGhlciBGPEEnMSwgLi4uLCBBJ20+LCBpZiBhbGwgdGhlIHR5cGUgYXJndW1lbnRzIGFyZSB0eXBlcywgb3IgdGhlIG5vbi13aWxkY2FyZCBwYXJhbWV0ZXJpemF0aW9uICjCpzkuOSkgb2YgRjxBJzEsIC4uLiwgQSdtPiwgaWYgb25lIG9yIG1vcmUgdHlwZSBhcmd1bWVudHMgYXJlIHN0aWxsIHdpbGRjYXJkcy4KKworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaWYgbTIgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIG0xCisgICAgICogQHBhcmFtIG1ldGhvZENhbGwKKyAgICAgKiBAcGFyYW0gbTEKKyAgICAgKiBAcGFyYW0gbTIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtb3JlU3BlY2lmaWNNZXRob2RJbmZlcmVuY2UoTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbCwgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtMSwgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtMikgeworICAgICAgICAvLyBXaGVuIHRlc3RpbmcgdGhhdCBvbmUgYXBwbGljYWJsZSBtZXRob2QgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIGFub3RoZXIgKMKnMTUuMTIuMi41KSwgd2hlcmUgdGhlIHNlY29uZCBtZXRob2QKKyAgICAgICAgLy8gaXMgZ2VuZXJpYywgaXQgaXMgbmVjZXNzYXJ5IHRvIHRlc3Qgd2hldGhlciBzb21lIGluc3RhbnRpYXRpb24gb2YgdGhlIHNlY29uZCBtZXRob2QncyB0eXBlIHBhcmFtZXRlcnMgY2FuIGJlCisgICAgICAgIC8vIGluZmVycmVkIHRvIG1ha2UgdGhlIGZpcnN0IG1ldGhvZCBtb3JlIHNwZWNpZmljIHRoYW4gdGhlIHNlY29uZC4KKworICAgICAgICBpZiAoIW0yLmlzR2VuZXJpYygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNMiBpcyBub3QgZ2VuZXJpYyAobTI6ICIgKyBtMiArICIpIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBMZXQgbTEgYmUgdGhlIGZpcnN0IG1ldGhvZCBhbmQgbTIgYmUgdGhlIHNlY29uZCBtZXRob2QuIFdoZXJlIG0yIGhhcyB0eXBlIHBhcmFtZXRlcnMgUDEsIC4uLiwgUHAsCisgICAgICAgIC8vIGxldCDOsTEsIC4uLiwgzrFwIGJlIGluZmVyZW5jZSB2YXJpYWJsZXMsIGFuZCBsZXQgzrggYmUgdGhlIHN1YnN0aXR1dGlvbiBbUDE6Pc6xMSwgLi4uLCBQcDo9zrFwXS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTGV0IGUxLCAuLi4sIGVrIGJlIHRoZSBhcmd1bWVudCBleHByZXNzaW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnZvY2F0aW9uLiBUaGVuOgorICAgICAgICAvLworICAgICAgICAvLyAtIElmIG0xIGFuZCBtMiBhcmUgYXBwbGljYWJsZSBieSBzdHJpY3Qgb3IgbG9vc2UgaW52b2NhdGlvbiAowqcxNS4xMi4yLjIsIMKnMTUuMTIuMi4zKSwgdGhlbiBsZXQgUzEsIC4uLiwgU2sgYmUgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMgb2YgbTEsIGFuZCBsZXQgVDEsIC4uLiwgVGsgYmUgdGhlIHJlc3VsdCBvZiDOuCBhcHBsaWVkIHRvIHRoZSBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzIG9mIG0yLgorICAgICAgICAvLworICAgICAgICAvLyAtIElmIG0xIGFuZCBtMiBhcmUgYXBwbGljYWJsZSBieSB2YXJpYWJsZSBhcml0eSBpbnZvY2F0aW9uICjCpzE1LjEyLjIuNCksIHRoZW4gbGV0IFMxLCAuLi4sIFNrIGJlIHRoZSBmaXJzdCBrIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciB0eXBlcyBvZiBtMSwgYW5kIGxldCBUMSwgLi4uLCBUayBiZSB0aGUgcmVzdWx0IG9mIM64IGFwcGxpZWQgdG8gdGhlIGZpcnN0IGsgdmFyaWFibGUgYXJpdHkgcGFyYW1ldGVyIHR5cGVzIG9mIG0yLgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgbm8gc3Vic3RpdHV0aW9uIGlzIGFwcGxpZWQgdG8gUzEsIC4uLiwgU2s7IGV2ZW4gaWYgbTEgaXMgZ2VuZXJpYywgdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBtMSBhcmUgdHJlYXRlZCBhcyB0eXBlIHZhcmlhYmxlcywgbm90IGluZmVyZW5jZSB2YXJpYWJsZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBwcm9jZXNzIHRvIGRldGVybWluZSBpZiBtMSBpcyBtb3JlIHNwZWNpZmljIHRoYW4gbTIgaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBGaXJzdCwgYW4gaW5pdGlhbCBib3VuZCBzZXQsIEIsIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGRlY2xhcmVkIGJvdW5kcyBvZiBQMSwgLi4uLCBQcCwgYXMgc3BlY2lmaWVkIGluIMKnMTguMS4zLgorICAgICAgICAvLworICAgICAgICAvLyAtIFNlY29uZCwgZm9yIGFsbCBpICgxIOKJpCBpIOKJpCBrKSwgYSBzZXQgb2YgY29uc3RyYWludCBmb3JtdWxhcyBvciBib3VuZHMgaXMgZ2VuZXJhdGVkLgorICAgICAgICAvLworICAgICAgICAvLyAgIElmIFRpIGlzIGEgcHJvcGVyIHR5cGUsIHRoZSByZXN1bHQgaXMgdHJ1ZSBpZiBTaSBpcyBtb3JlIHNwZWNpZmljIHRoYW4gVGkgZm9yIGVpICjCpzE1LjEyLjIuNSksIGFuZCBmYWxzZSBvdGhlcndpc2UuIChOb3RlIHRoYXQgU2kgaXMgYWx3YXlzIGEgcHJvcGVyIHR5cGUuKQorICAgICAgICAvLworICAgICAgICAvLyAgIE90aGVyd2lzZSwgaWYgVGkgaXMgbm90IGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSwgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYSDigLlTaSA8OiBUaeKAuiBpcyBnZW5lcmF0ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgT3RoZXJ3aXNlLCBUaSBpcyBhIHBhcmFtZXRlcml6YXRpb24gb2YgYSBmdW5jdGlvbmFsIGludGVyZmFjZSwgSS4gSXQgbXVzdCBiZSBkZXRlcm1pbmVkIHdoZXRoZXIgU2kgc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgZml2ZSBjb25kaXRpb25zOgorICAgICAgICAvLworICAgICAgICAvLyAgIDEuIFNpIGlzIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAyLiBTaSBpcyBub3QgYSBzdXBlcmludGVyZmFjZSBvZiBJLCBub3IgYSBwYXJhbWV0ZXJpemF0aW9uIG9mIGEgc3VwZXJpbnRlcmZhY2Ugb2YgSS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAzLiBTaSBpcyBub3QgYSBzdWJpbnRlcmZhY2Ugb2YgSSwgbm9yIGEgcGFyYW1ldGVyaXphdGlvbiBvZiBhIHN1YmludGVyZmFjZSBvZiBJLgorICAgICAgICAvLworICAgICAgICAvLyAgIDQuIElmIFNpIGlzIGFuIGludGVyc2VjdGlvbiB0eXBlLCBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgaW50ZXJzZWN0aW9uIGlzIG5vdCBhIHN1cGVyaW50ZXJmYWNlIG9mIEksIG5vciBhIHBhcmFtZXRlcml6YXRpb24gb2YgYSBzdXBlcmludGVyZmFjZSBvZiBJLgorICAgICAgICAvLworICAgICAgICAvLyAgIDUuIElmIFNpIGlzIGFuIGludGVyc2VjdGlvbiB0eXBlLCBubyBlbGVtZW50IG9mIHRoZSBpbnRlcnNlY3Rpb24gaXMgYSBzdWJpbnRlcmZhY2Ugb2YgSSwgbm9yIGEgcGFyYW1ldGVyaXphdGlvbiBvZiBhIHN1YmludGVyZmFjZSBvZiBJLgorICAgICAgICAvLworICAgICAgICAvLyAgIElmIGFsbCBmaXZlIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZW4gdGhlIGZvbGxvd2luZyBjb25zdHJhaW50IGZvcm11bGFzIG9yIGJvdW5kcyBhcmUgZ2VuZXJhdGVkICh3aGVyZSBVMSAuLi4gVWsgYW5kIFIxIGFyZSB0aGUgcGFyYW1ldGVyIHR5cGVzIGFuZCByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gdHlwZSBvZiB0aGUgY2FwdHVyZSBvZiBTaSwgYW5kIFYxIC4uLiBWayBhbmQgUjIgYXJlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYW5kIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiB0eXBlIG9mIFRpKToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIElmIGVpIGlzIGFuIGV4cGxpY2l0bHkgdHlwZWQgbGFtYmRhIGV4cHJlc3Npb246CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAtIEZvciBhbGwgaiAoMSDiiaQgaiDiiaQgayksIOKAuVVqID0gVmrigLouCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAtIElmIFIyIGlzIHZvaWQsIHRydWUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAtIE90aGVyd2lzZSwgaWYgUjEgYW5kIFIyIGFyZSBmdW5jdGlvbmFsIGludGVyZmFjZSB0eXBlcywgYW5kIG5laXRoZXIgaW50ZXJmYWNlIGlzIGEgc3ViaW50ZXJmYWNlIG9mIHRoZSBvdGhlciwgYW5kIGVpIGhhcyBhdCBsZWFzdCBvbmUgcmVzdWx0IGV4cHJlc3Npb24sIHRoZW4gdGhlc2UgcnVsZXMgYXJlIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gUjEgYW5kIFIyLCBmb3IgZWFjaCByZXN1bHQgZXhwcmVzc2lvbiBpbiBlaS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gT3RoZXJ3aXNlLCBpZiBSMSBpcyBhIHByaW1pdGl2ZSB0eXBlIGFuZCBSMiBpcyBub3QsIGFuZCBlaSBoYXMgYXQgbGVhc3Qgb25lIHJlc3VsdCBleHByZXNzaW9uLCBhbmQgZWFjaCByZXN1bHQgZXhwcmVzc2lvbiBvZiBlaSBpcyBhIHN0YW5kYWxvbmUgZXhwcmVzc2lvbiAowqcxNS4yKSBvZiBhIHByaW1pdGl2ZSB0eXBlLCB0cnVlLgorICAgICAgICAvLworICAgICAgICAvLyAgICAgLSBPdGhlcndpc2UsIGlmIFIyIGlzIGEgcHJpbWl0aXZlIHR5cGUgYW5kIFIxIGlzIG5vdCwgYW5kIGVpIGhhcyBhdCBsZWFzdCBvbmUgcmVzdWx0IGV4cHJlc3Npb24sIGFuZCBlYWNoIHJlc3VsdCBleHByZXNzaW9uIG9mIGVpIGlzIGVpdGhlciBhIHN0YW5kYWxvbmUgZXhwcmVzc2lvbiBvZiBhIHJlZmVyZW5jZSB0eXBlIG9yIGEgcG9seSBleHByZXNzaW9uLCB0cnVlLgorICAgICAgICAvLworICAgICAgICAvLyAgICAgLSBPdGhlcndpc2UsIOKAuVIxIDw6IFIy4oC6LgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gSWYgZWkgaXMgYW4gZXhhY3QgbWV0aG9kIHJlZmVyZW5jZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gRm9yIGFsbCBqICgxIOKJpCBqIOKJpCBrKSwg4oC5VWogPSBWauKAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gSWYgUjIgaXMgdm9pZCwgdHJ1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gT3RoZXJ3aXNlLCBpZiBSMSBpcyBhIHByaW1pdGl2ZSB0eXBlIGFuZCBSMiBpcyBub3QsIGFuZCB0aGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uIGZvciBlaSBoYXMgYSBwcmltaXRpdmUgcmV0dXJuIHR5cGUsIHRydWUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAtIE90aGVyd2lzZSBpZiBSMiBpcyBhIHByaW1pdGl2ZSB0eXBlIGFuZCBSMSBpcyBub3QsIGFuZCB0aGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uIGZvciBlaSBoYXMgYSByZWZlcmVuY2UgcmV0dXJuIHR5cGUsIHRydWUuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAtIE90aGVyd2lzZSwg4oC5UjEgPDogUjLigLouCisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSBJZiBlaSBpcyBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgdGhlc2UgcnVsZXMgYXJlIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uLgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gSWYgZWkgaXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uLCB0aGVzZSBydWxlcyBhcmUgYXBwbGllZCByZWN1cnNpdmVseSB0byBlYWNoIG9mIHRoZSBzZWNvbmQgYW5kIHRoaXJkIG9wZXJhbmRzLgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gT3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICBJZiB0aGUgZml2ZSBjb25zdHJhaW50cyBvbiBTaSBhcmUgbm90IHNhdGlzZmllZCwgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYSDigLlTaSA8OiBUaeKAuiBpcyBnZW5lcmF0ZWQgaW5zdGVhZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBUaGlyZCwgaWYgbTIgaXMgYXBwbGljYWJsZSBieSB2YXJpYWJsZSBhcml0eSBpbnZvY2F0aW9uIGFuZCBoYXMgaysxIHBhcmFtZXRlcnMsIHRoZW4gd2hlcmUgU2srMSBpcyB0aGUgaysxJ3RoIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciB0eXBlIG9mIG0xIGFuZCBUaysxIGlzIHRoZSByZXN1bHQgb2YgzrggYXBwbGllZCB0byB0aGUgaysxJ3RoIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciB0eXBlIG9mIG0yLCB0aGUgY29uc3RyYWludCDigLlTaysxIDw6IFRrKzHigLogaXMgZ2VuZXJhdGVkLgorICAgICAgICAvLworICAgICAgICAvLyAtIEZvdXJ0aCwgdGhlIGdlbmVyYXRlZCBib3VuZHMgYW5kIGNvbnN0cmFpbnQgZm9ybXVsYXMgYXJlIHJlZHVjZWQgYW5kIGluY29ycG9yYXRlZCB3aXRoIEIgdG8gcHJvZHVjZSBhIGJvdW5kIHNldCBCJy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICBJZiBCJyBkb2VzIG5vdCBjb250YWluIHRoZSBib3VuZCBmYWxzZSwgYW5kIHJlc29sdXRpb24gb2YgYWxsIHRoZSBpbmZlcmVuY2UgdmFyaWFibGVzIGluIEInIHN1Y2NlZWRzLCB0aGVuIG0xIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBtMi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICBPdGhlcndpc2UsIG0xIGlzIG5vdCBtb3JlIHNwZWNpZmljIHRoYW4gbTIuCisKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvLy8KKyAgICAvLy8gUHJpdmF0ZSBzdGF0aWMgbWV0aG9kcworICAgIC8vLworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kVXNhZ2UgaW5zdGFudGlhdGlvblNldFRvTWV0aG9kVXNhZ2UoUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgSW5zdGFudGlhdGlvblNldCBpbnN0YW50aWF0aW9uU2V0KSB7CisgICAgICAgIGlmIChpbnN0YW50aWF0aW9uU2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RVc2FnZShtZXRob2REZWNsYXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHBhcmFtVHlwZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGk9MDtpPG1ldGhvZERlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCk7aSsrKSB7CisgICAgICAgICAgICBwYXJhbVR5cGVzLmFkZChpbnN0YW50aWF0aW9uU2V0LmFwcGx5KG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtKGkpLmdldFR5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIFJlc29sdmVkVHlwZSByZXR1cm5UeXBlID0gaW5zdGFudGlhdGlvblNldC5hcHBseShtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFVzYWdlKG1ldGhvZERlY2xhcmF0aW9uLCBwYXJhbVR5cGVzLCByZXR1cm5UeXBlKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gUHJpdmF0ZSBpbnN0YW5jZSBtZXRob2RzCisgICAgLy8vCisKKyAgICAvKioKKyAgICAgKiBXaGVuIGluZmVyZW5jZSBiZWdpbnMsIGEgYm91bmQgc2V0IGlzIHR5cGljYWxseSBnZW5lcmF0ZWQgZnJvbSBhIGxpc3Qgb2YgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIFAxLCAuLi4sIFBwCisgICAgICogYW5kIGFzc29jaWF0ZWQgaW5mZXJlbmNlIHZhcmlhYmxlcyDOsTEsIC4uLiwgzrFwCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9ucworICAgICAqIEBwYXJhbSBpbmZlcmVuY2VWYXJpYWJsZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBCb3VuZFNldCBib3VuZFNldHVwKExpc3Q8UmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbnMsIExpc3Q8SW5mZXJlbmNlVmFyaWFibGU+IGluZmVyZW5jZVZhcmlhYmxlcykgeworICAgICAgICBpZiAodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9ucy5zaXplKCkgIT0gaW5mZXJlbmNlVmFyaWFibGVzLnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiBpbmZlcmVuY2UgYmVnaW5zLCBhIGJvdW5kIHNldCBpcyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYSBsaXN0IG9mCisgICAgICAgIC8vIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyBQMSwgLi4uLCBQcCBhbmQgYXNzb2NpYXRlZCBpbmZlcmVuY2UgdmFyaWFibGVzIM6xMSwgLi4uLCDOsXAuCisgICAgICAgIC8vIFN1Y2ggYSBib3VuZCBzZXQgaXMgY29uc3RydWN0ZWQgYXMgZm9sbG93cy4gRm9yIGVhY2ggbCAoMSDiiaQgbCDiiaQgcCk6CisKKyAgICAgICAgQm91bmRTZXQgYm91bmRTZXQgPSBCb3VuZFNldC5lbXB0eSgpOworCisgICAgICAgIGZvciAoaW50IGw9MDtsPHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbnMuc2l6ZSgpO2wrKykgeworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gUGwgPSB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb25zLmdldChsKTsKKyAgICAgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGFscGhhTCA9IGluZmVyZW5jZVZhcmlhYmxlcy5nZXQobCk7CisKKyAgICAgICAgICAgIC8vIC0gSWYgUGwgaGFzIG5vIFR5cGVCb3VuZCwgdGhlIGJvdW5kIM6xbCA8OiBPYmplY3QgYXBwZWFycyBpbiB0aGUgc2V0LgorCisgICAgICAgICAgICBpZiAoUGwuZ2V0Qm91bmRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYm91bmRTZXQgPSBib3VuZFNldC53aXRoQm91bmQobmV3IFN1YnR5cGVPZkJvdW5kKGFscGhhTCwgb2JqZWN0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGZvciBlYWNoIHR5cGUgVCBkZWxpbWl0ZWQgYnkgJiBpbiB0aGUgVHlwZUJvdW5kLCB0aGUgYm91bmQgzrFsIDw6IFRbUDE6Pc6xMSwgLi4uLCBQcDo9zrFwXSBhcHBlYXJzCisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHNldDsgaWYgdGhpcyByZXN1bHRzIGluIG5vIHByb3BlciB1cHBlciBib3VuZHMgZm9yIM6xbCAob25seSBkZXBlbmRlbmNpZXMpLCB0aGVuIHRoZQorICAgICAgICAgICAgICAgIC8vIGJvdW5kIM6xbCA8OiBPYmplY3QgYWxzbyBhcHBlYXJzIGluIHRoZSBzZXQuCisKKyAgICAgICAgICAgICAgICBmb3IgKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kIGJvdW5kIDogUGwuZ2V0Qm91bmRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIFQgPSBib3VuZC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24uZW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wO2o8dHlwZVBhcmFtZXRlckRlY2xhcmF0aW9ucy5zaXplKCk7aisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24ud2l0aFBhaXIodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9ucy5nZXQoaiksIGluZmVyZW5jZVZhcmlhYmxlcy5nZXQoaikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBUV2l0aFN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb24uYXBwbHkoVCk7CisKKyAgICAgICAgICAgICAgICAgICAgYm91bmRTZXQgPSBib3VuZFNldC53aXRoQm91bmQobmV3IFN1YnR5cGVPZkJvdW5kKGFscGhhTCwgVFdpdGhTdWJzdGl0dXRpb25zKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kU2V0LmdldFByb3BlclVwcGVyQm91bmRzRm9yKGFscGhhTCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZFNldCA9IGJvdW5kU2V0LndpdGhCb3VuZChuZXcgU3VidHlwZU9mQm91bmQoYWxwaGFMLCBvYmplY3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBib3VuZFNldDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYXBwZWFySW5UaHJvd3NDbGF1c2UoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gcCwgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICBmb3IgKGludCBqPTA7ajxtZXRob2REZWNsYXJhdGlvbi5nZXROdW1iZXJPZlNwZWNpZmllZEV4Y2VwdGlvbnMoKTtqKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVkVHlwZSB0aHJvd25UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0U3BlY2lmaWVkRXhjZXB0aW9uKGopOworICAgICAgICAgICAgaWYgKHRocm93blR5cGUuaXNUeXBlVmFyaWFibGUoKSAmJiB0aHJvd25UeXBlLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZXF1YWxzKHApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSZXNvbHZlZFR5cGU+IGZvcm1hbFBhcmFtZXRlclR5cGVzKFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpPTA7aTxtZXRob2REZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpO2krKykgeworICAgICAgICAgICAgdHlwZXMuYWRkKG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtKGkpLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0ltcGxpY2l0bHlUeXBlZChMYW1iZGFFeHByIGxhbWJkYUV4cHIpIHsKKyAgICAgICAgcmV0dXJuIGxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLmFueU1hdGNoKHAgLT4gcC5nZXRUeXBlKCkgaW5zdGFuY2VvZiBVbmtub3duVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5leGFjdChNZXRob2RSZWZlcmVuY2VFeHByIG1ldGhvZFJlZmVyZW5jZUV4cHIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUGVydGluZW50VG9BcHBsaWNhYmlsaXR5KEV4cHJlc3Npb24gYXJndW1lbnQpIHsKKyAgICAgICAgLy8gQW4gYXJndW1lbnQgZXhwcmVzc2lvbiBpcyBjb25zaWRlcmVkIHBlcnRpbmVudCB0byBhcHBsaWNhYmlsaXR5IGZvciBhIHBvdGVudGlhbGx5IGFwcGxpY2FibGUgbWV0aG9kIG0KKyAgICAgICAgLy8gdW5sZXNzIGl0IGhhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBBbiBpbXBsaWNpdGx5IHR5cGVkIGxhbWJkYSBleHByZXNzaW9uICjCpzE1LjI3LjEpLgorCisgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIExhbWJkYUV4cHIpIHsKKyAgICAgICAgICAgIExhbWJkYUV4cHIgbGFtYmRhRXhwciA9IChMYW1iZGFFeHByKWFyZ3VtZW50OworICAgICAgICAgICAgaWYgKGlzSW1wbGljaXRseVR5cGVkKGxhbWJkYUV4cHIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gLSBBbiBpbmV4YWN0IG1ldGhvZCByZWZlcmVuY2UgZXhwcmVzc2lvbiAowqcxNS4xMy4xKS4KKworICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBNZXRob2RSZWZlcmVuY2VFeHByKSB7CisgICAgICAgICAgICBNZXRob2RSZWZlcmVuY2VFeHByIG1ldGhvZFJlZmVyZW5jZUV4cHIgPSAoTWV0aG9kUmVmZXJlbmNlRXhwcilhcmd1bWVudDsKKyAgICAgICAgICAgIGlmIChpc0luZXhhY3QobWV0aG9kUmVmZXJlbmNlRXhwcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtIElmIG0gaXMgYSBnZW5lcmljIG1ldGhvZCBhbmQgdGhlIG1ldGhvZCBpbnZvY2F0aW9uIGRvZXMgbm90IHByb3ZpZGUgZXhwbGljaXQgdHlwZSBhcmd1bWVudHMsIGFuCisgICAgICAgIC8vICAgZXhwbGljaXRseSB0eXBlZCBsYW1iZGEgZXhwcmVzc2lvbiBvciBhbiBleGFjdCBtZXRob2QgcmVmZXJlbmNlIGV4cHJlc3Npb24gZm9yIHdoaWNoIHRoZQorICAgICAgICAvLyAgIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IHR5cGUgKGFzIGRlcml2ZWQgZnJvbSB0aGUgc2lnbmF0dXJlIG9mIG0pIGlzIGEgdHlwZSBwYXJhbWV0ZXIgb2YgbS4KKworICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBMYW1iZGFFeHByKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE1ldGhvZFJlZmVyZW5jZUV4cHIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gLSBBbiBleHBsaWNpdGx5IHR5cGVkIGxhbWJkYSBleHByZXNzaW9uIHdob3NlIGJvZHkgaXMgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIG5vdCBwZXJ0aW5lbnQgdG8gYXBwbGljYWJpbGl0eS4KKworICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBMYW1iZGFFeHByKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gQW4gZXhwbGljaXRseSB0eXBlZCBsYW1iZGEgZXhwcmVzc2lvbiB3aG9zZSBib2R5IGlzIGEgYmxvY2ssIHdoZXJlIGF0IGxlYXN0IG9uZSByZXN1bHQgZXhwcmVzc2lvbiBpcyBub3QKKyAgICAgICAgLy8gICBwZXJ0aW5lbnQgdG8gYXBwbGljYWJpbGl0eS4KKworICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBMYW1iZGFFeHByKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gQSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gKMKnMTUuOC41KSB3aG9zZSBjb250YWluZWQgZXhwcmVzc2lvbiBpcyBub3QgcGVydGluZW50IHRvIGFwcGxpY2FiaWxpdHkuCisKKyAgICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgRW5jbG9zZWRFeHByKSB7CisgICAgICAgICAgICBFbmNsb3NlZEV4cHIgZW5jbG9zZWRFeHByID0gKEVuY2xvc2VkRXhwcilhcmd1bWVudDsKKyAgICAgICAgICAgIHJldHVybiBpc1BlcnRpbmVudFRvQXBwbGljYWJpbGl0eShlbmNsb3NlZEV4cHIuZ2V0SW5uZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAtIEEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiAowqcxNS4yNSkgd2hvc2Ugc2Vjb25kIG9yIHRoaXJkIG9wZXJhbmQgaXMgbm90IHBlcnRpbmVudCB0byBhcHBsaWNhYmlsaXR5LgorCisgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcikgeworICAgICAgICAgICAgQ29uZGl0aW9uYWxFeHByIGNvbmRpdGlvbmFsRXhwciA9IChDb25kaXRpb25hbEV4cHIpYXJndW1lbnQ7CisgICAgICAgICAgICByZXR1cm4gaXNQZXJ0aW5lbnRUb0FwcGxpY2FiaWxpdHkoY29uZGl0aW9uYWxFeHByLmdldFRoZW5FeHByKCkpICYmCisgICAgICAgICAgICAgICAgICAgIGlzUGVydGluZW50VG9BcHBsaWNhYmlsaXR5KGNvbmRpdGlvbmFsRXhwci5nZXRFbHNlRXhwcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgT3B0aW9uYWw8Q29uc3RyYWludEZvcm11bGFTZXQ+IHRlc3RGb3JBcHBsaWNhYmlsaXR5QnlTdHJpY3RJbnZvY2F0aW9uKExpc3Q8UmVzb2x2ZWRUeXBlPiBGcywgTGlzdDxFeHByZXNzaW9uPiBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb24gdGhldGEpIHsKKyAgICAgICAgaW50IG4gPSBGcy5zaXplKCk7CisgICAgICAgIGludCBrID0gZXMuc2l6ZSgpOworCisgICAgICAgIC8vIElmIGsg4omgIG4sIG9yIGlmIHRoZXJlIGV4aXN0cyBhbiBpICgxIOKJpCBpIOKJpCBuKSBzdWNoIHRoYXQgZWkgaXMgcGVydGluZW50IHRvIGFwcGxpY2FiaWxpdHkgKMKnMTUuMTIuMi4yKQorICAgICAgICAvLyBhbmQgZWl0aGVyOgorICAgICAgICAvLyBpKSBlaSBpcyBhIHN0YW5kYWxvbmUgZXhwcmVzc2lvbiBvZiBhIHByaW1pdGl2ZSB0eXBlIGJ1dCBGaSBpcyBhIHJlZmVyZW5jZSB0eXBlLCBvcgorICAgICAgICAvLyBpaSkgRmkgaXMgYSBwcmltaXRpdmUgdHlwZSBidXQgZWkgaXMgbm90IGEgc3RhbmRhbG9uZSBleHByZXNzaW9uIG9mIGEgcHJpbWl0aXZlIHR5cGU7CisgICAgICAgIGlmIChrICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDtpPG47aSsrKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGVpID0gZXMuZ2V0KGkpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGZpID0gRnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGlzUGVydGluZW50VG9BcHBsaWNhYmlsaXR5KGVpKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1N0YW5kYWxvbmVFeHByZXNzaW9uKGVpKSAmJiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGVpKS5pc1ByaW1pdGl2ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaS5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpLmlzUHJpbWl0aXZlKCkgJiYgKCFpc1N0YW5kYWxvbmVFeHByZXNzaW9uKGVpKSB8fCAhSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShlaSkuaXNQcmltaXRpdmUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRoZW4gdGhlIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZWVkIHdpdGggaW5mZXJlbmNlLgorICAgICAgICAvLworICAgICAgICAvLyBPdGhlcndpc2UsIEMgaW5jbHVkZXMsIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgaykgd2hlcmUgZWkgaXMgcGVydGluZW50IHRvIGFwcGxpY2FiaWxpdHksIOKAuWVpIOKGkiBGaSDOuOKAui4KKworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoY29uc3RyYWludFNldEZyb21Bcmd1bWVudHNTdWJzdGl0dXRpb24oRnMsIGVzLCB0aGV0YSwgaykpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHR5cGVXaXRoU3Vic3RpdHV0aW9uKFJlc29sdmVkVHlwZSBvcmlnaW5hbFR5cGUsIFN1YnN0aXR1dGlvbiBzdWJzdGl0dXRpb24pIHsKKyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi5hcHBseShvcmlnaW5hbFR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgT3B0aW9uYWw8Q29uc3RyYWludEZvcm11bGFTZXQ+IHRlc3RGb3JBcHBsaWNhYmlsaXR5QnlMb29zZUludm9jYXRpb24oTGlzdDxSZXNvbHZlZFR5cGU+IEZzLCBMaXN0PEV4cHJlc3Npb24+IGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHRoZXRhKSB7CisgICAgICAgIGludCBuID0gRnMuc2l6ZSgpOworICAgICAgICBpbnQgayA9IGVzLnNpemUoKTsKKworICAgICAgICAvLyBJZiBrIOKJoCBuLCB0aGUgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2NlZWQgd2l0aCBpbmZlcmVuY2UuCisKKyAgICAgICAgaWYgKGsgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIEMgaW5jbHVkZXMsIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgaykgd2hlcmUgZWkgaXMgcGVydGluZW50IHRvIGFwcGxpY2FiaWxpdHksIOKAuWVpIOKGkiBGaSDOuOKAui4KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKGNvbnN0cmFpbnRTZXRGcm9tQXJndW1lbnRzU3Vic3RpdHV0aW9uKEZzLCBlcywgdGhldGEsIGspKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnN0cmFpbnRGb3JtdWxhU2V0IGNvbnN0cmFpbnRTZXRGcm9tQXJndW1lbnRzU3Vic3RpdHV0aW9uKExpc3Q8UmVzb2x2ZWRUeXBlPiBGcywgTGlzdDxFeHByZXNzaW9uPiBlcywgU3Vic3RpdHV0aW9uIHRoZXRhLCBpbnQgaykgeworICAgICAgICBDb25zdHJhaW50Rm9ybXVsYVNldCBjb25zdHJhaW50Rm9ybXVsYVNldCA9IENvbnN0cmFpbnRGb3JtdWxhU2V0LmVtcHR5KCk7CisgICAgICAgIGZvciAoaW50IGk9MDtpPGs7aSsrKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGVpID0gZXMuZ2V0KGkpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGZpID0gRnMuZ2V0KGkpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIGZpVGhldGEgPSB0eXBlV2l0aFN1YnN0aXR1dGlvbihmaSwgdGhldGEpOworICAgICAgICAgICAgY29uc3RyYWludEZvcm11bGFTZXQgPSBjb25zdHJhaW50Rm9ybXVsYVNldC53aXRoQ29uc3RyYWludCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGUodHlwZVNvbHZlciwgZWksIGZpVGhldGEpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3RyYWludEZvcm11bGFTZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBPcHRpb25hbDxDb25zdHJhaW50Rm9ybXVsYVNldD4gdGVzdEZvckFwcGxpY2FiaWxpdHlCeVZhcmlhYmxlQXJpdHlJbnZvY2F0aW9uKExpc3Q8UmVzb2x2ZWRUeXBlPiBGcywgTGlzdDxFeHByZXNzaW9uPiBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic3RpdHV0aW9uIHRoZXRhKSB7CisgICAgICAgIGludCBrID0gZXMuc2l6ZSgpOworCisgICAgICAgIC8vIExldCBGJzEsIC4uLiwgRidrIGJlIHRoZSBmaXJzdCBrIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciB0eXBlcyBvZiBtICjCpzE1LjEyLjIuNCkuIEMgaW5jbHVkZXMsCisgICAgICAgIC8vIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgaykgd2hlcmUgZWkgaXMgcGVydGluZW50IHRvIGFwcGxpY2FiaWxpdHksIOKAuWVpIOKGkiBGJ2kgzrjigLouCisKKyAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IEZzRmlyc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGk9MDtpPGs7aSsrKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgRkZpcnN0SSA9IGkgPCBGcy5zaXplKCkgPyBGcy5nZXQoaSkgOiBGcy5nZXQoRnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBGc0ZpcnN0LmFkZChGRmlyc3RJKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihjb25zdHJhaW50U2V0RnJvbUFyZ3VtZW50c1N1YnN0aXR1dGlvbihGc0ZpcnN0LCBlcywgdGhldGEsIGspKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL1R5cGVJbmZlcmVuY2VDYWNoZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9UeXBlSW5mZXJlbmNlQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTZhYTAwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9UeXBlSW5mZXJlbmNlQ2FjaGUuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlSW5mZXJlbmNlQ2FjaGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFR5cGVTb2x2ZXIsIElkZW50aXR5SGFzaE1hcDxMYW1iZGFFeHByLCBNYXA8U3RyaW5nLCBSZXNvbHZlZFR5cGU+Pj4gdHlwZUZvckxhbWJkYVBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFR5cGVTb2x2ZXIsIElkZW50aXR5SGFzaE1hcDxMYW1iZGFFeHByLCBMaXN0PEluZmVyZW5jZVZhcmlhYmxlPj4+IGluZmVyZW5jZVZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWNvcmQoVHlwZVNvbHZlciB0eXBlU29sdmVyLCBMYW1iZGFFeHByIGxhbWJkYUV4cHIsIFN0cmluZyBwYXJhbU5hbWUsIFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICghdHlwZUZvckxhbWJkYVBhcmFtZXRlcnMuY29udGFpbnNLZXkodHlwZVNvbHZlcikpIHsKKyAgICAgICAgICAgIHR5cGVGb3JMYW1iZGFQYXJhbWV0ZXJzLnB1dCh0eXBlU29sdmVyLCBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0eXBlRm9yTGFtYmRhUGFyYW1ldGVycy5nZXQodHlwZVNvbHZlcikuY29udGFpbnNLZXkobGFtYmRhRXhwcikpIHsKKyAgICAgICAgICAgIHR5cGVGb3JMYW1iZGFQYXJhbWV0ZXJzLmdldCh0eXBlU29sdmVyKS5wdXQobGFtYmRhRXhwciwgbmV3IEhhc2hNYXA8PigpKTsKKyAgICAgICAgfQorICAgICAgICB0eXBlRm9yTGFtYmRhUGFyYW1ldGVycy5nZXQodHlwZVNvbHZlcikuZ2V0KGxhbWJkYUV4cHIpLnB1dChwYXJhbU5hbWUsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiByZXRyaWV2ZShUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIExhbWJkYUV4cHIgbGFtYmRhRXhwciwgU3RyaW5nIHBhcmFtTmFtZSkgeworICAgICAgICBpZiAoIXR5cGVGb3JMYW1iZGFQYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KHR5cGVTb2x2ZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXR5cGVGb3JMYW1iZGFQYXJhbWV0ZXJzLmdldCh0eXBlU29sdmVyKS5jb250YWluc0tleShsYW1iZGFFeHByKSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0eXBlRm9yTGFtYmRhUGFyYW1ldGVycy5nZXQodHlwZVNvbHZlcikuZ2V0KGxhbWJkYUV4cHIpLmNvbnRhaW5zS2V5KHBhcmFtTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZih0eXBlRm9yTGFtYmRhUGFyYW1ldGVycy5nZXQodHlwZVNvbHZlcikuZ2V0KGxhbWJkYUV4cHIpLmdldChwYXJhbU5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkSW5mZXJlbmNlVmFyaWFibGVzKFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgTGFtYmRhRXhwciBsYW1iZGFFeHByLCBMaXN0PEluZmVyZW5jZVZhcmlhYmxlPiBfaW5mZXJlbmNlVmFyaWFibGVzKSB7CisgICAgICAgIGlmICghaW5mZXJlbmNlVmFyaWFibGVzLmNvbnRhaW5zS2V5KHR5cGVTb2x2ZXIpKSB7CisgICAgICAgICAgICBpbmZlcmVuY2VWYXJpYWJsZXMucHV0KHR5cGVTb2x2ZXIsIG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgfQorICAgICAgICBpbmZlcmVuY2VWYXJpYWJsZXMuZ2V0KHR5cGVTb2x2ZXIpLnB1dChsYW1iZGFFeHByLCBfaW5mZXJlbmNlVmFyaWFibGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPExpc3Q8SW5mZXJlbmNlVmFyaWFibGU+PiByZXRyaWV2ZUluZmVyZW5jZVZhcmlhYmxlcyhUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIExhbWJkYUV4cHIgbGFtYmRhRXhwcikgeworICAgICAgICBpZiAoIWluZmVyZW5jZVZhcmlhYmxlcy5jb250YWluc0tleSh0eXBlU29sdmVyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbmZlcmVuY2VWYXJpYWJsZXMuZ2V0KHR5cGVTb2x2ZXIpLmNvbnRhaW5zS2V5KGxhbWJkYUV4cHIpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoaW5mZXJlbmNlVmFyaWFibGVzLmdldCh0eXBlU29sdmVyKS5nZXQobGFtYmRhRXhwcikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL0NhcHR1cmVzQm91bmQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL0NhcHR1cmVzQm91bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNiYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9ib3VuZHMvQ2FwdHVyZXNCb3VuZC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuYm91bmRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkJvdW5kOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkluZmVyZW5jZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBDYXB0dXJlKEc8QTEsIC4uLiwgQW4+KTogVGhlIHZhcmlhYmxlcyDOsTEsIC4uLiwgzrFuIHJlcHJlc2VudCB0aGUgcmVzdWx0IG9mIGNhcHR1cmUgY29udmVyc2lvbiAowqc1LjEuMTApCisgKiBhcHBsaWVkIHRvIEc8QTEsIC4uLiwgQW4+ICh3aGVyZSBBMSwgLi4uLCBBbiBtYXkgYmUgdHlwZXMgb3Igd2lsZGNhcmRzIGFuZCBtYXkgbWVudGlvbiBpbmZlcmVuY2UgdmFyaWFibGVzKS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENhcHR1cmVzQm91bmQgZXh0ZW5kcyBCb3VuZCB7CisgICAgcHJpdmF0ZSBMaXN0PEluZmVyZW5jZVZhcmlhYmxlPiBpbmZlcmVuY2VWYXJpYWJsZXM7CisgICAgcHJpdmF0ZSBMaXN0PFJlc29sdmVkVHlwZT4gdHlwZXNPcldpbGRjYXJkczsKKworICAgIHB1YmxpYyBDYXB0dXJlc0JvdW5kKExpc3Q8SW5mZXJlbmNlVmFyaWFibGU+IGluZmVyZW5jZVZhcmlhYmxlcywgTGlzdDxSZXNvbHZlZFR5cGU+IHR5cGVzT3JXaWxkY2FyZHMpIHsKKyAgICAgICAgdGhpcy5pbmZlcmVuY2VWYXJpYWJsZXMgPSBpbmZlcmVuY2VWYXJpYWJsZXM7CisgICAgICAgIHRoaXMudHlwZXNPcldpbGRjYXJkcyA9IHR5cGVzT3JXaWxkY2FyZHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTYXRpc2ZpZWQoSW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb24gaW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb24pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gdXNlZEluZmVyZW5jZVZhcmlhYmxlcygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8SW5mZXJlbmNlVmFyaWFibGU+IGdldEluZmVyZW5jZVZhcmlhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIGluZmVyZW5jZVZhcmlhYmxlczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGU+IGdldFR5cGVzT3JXaWxkY2FyZHMoKSB7CisgICAgICAgIHJldHVybiB0eXBlc09yV2lsZGNhcmRzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIENhcHR1cmVzQm91bmQgdGhhdCA9IChDYXB0dXJlc0JvdW5kKSBvOworCisgICAgICAgIGlmICghaW5mZXJlbmNlVmFyaWFibGVzLmVxdWFscyh0aGF0LmluZmVyZW5jZVZhcmlhYmxlcykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHR5cGVzT3JXaWxkY2FyZHMuZXF1YWxzKHRoYXQudHlwZXNPcldpbGRjYXJkcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGluZmVyZW5jZVZhcmlhYmxlcy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHR5cGVzT3JXaWxkY2FyZHMuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkNhcHR1cmVzQm91bmR7IiArCisgICAgICAgICAgICAgICAgImluZmVyZW5jZVZhcmlhYmxlcz0iICsgaW5mZXJlbmNlVmFyaWFibGVzICsKKyAgICAgICAgICAgICAgICAiLCB0eXBlc09yV2lsZGNhcmRzPSIgKyB0eXBlc09yV2lsZGNhcmRzICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9ib3VuZHMvRmFsc2VCb3VuZC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9ib3VuZHMvRmFsc2VCb3VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTU0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9GYWxzZUJvdW5kLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5ib3VuZHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5Cb3VuZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5JbmZlcmVuY2VWYXJpYWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5JbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIE5vIHZhbGlkIGNob2ljZSBvZiBpbmZlcmVuY2UgdmFyaWFibGVzIGV4aXN0cy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEZhbHNlQm91bmQgZXh0ZW5kcyBCb3VuZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBGYWxzZUJvdW5kIElOU1RBTkNFID0gbmV3IEZhbHNlQm91bmQoKTsKKworICAgIHByaXZhdGUgRmFsc2VCb3VuZCgpIHsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmFsc2VCb3VuZCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIElOU1RBTkNFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiRmFsc2VCb3VuZHt9IjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZChJbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbiBpbmZlcmVuY2VWYXJpYWJsZVN1YnN0aXR1dGlvbikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gdXNlZEluZmVyZW5jZVZhcmlhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9ib3VuZHMvU2FtZUFzQm91bmQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL1NhbWVBc0JvdW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwNzU2YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL1NhbWVBc0JvdW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5ib3VuZHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQm91bmQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5mZXJlbmNlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5zdGFudGlhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuVHlwZUhlbHBlci5pc0luZmVyZW5jZVZhcmlhYmxlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLmlzUHJvcGVyVHlwZTsKKworLyoqCisgKiBTID0gVCwgd2hlcmUgYXQgbGVhc3Qgb25lIG9mIFMgb3IgVCBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGU6IFMgaXMgdGhlIHNhbWUgYXMgVC4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFNhbWVBc0JvdW5kIGV4dGVuZHMgQm91bmQgeworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHM7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgdDsKKworICAgIHB1YmxpYyBTYW1lQXNCb3VuZChSZXNvbHZlZFR5cGUgcywgUmVzb2x2ZWRUeXBlIHQpIHsKKyAgICAgICAgaWYgKCFpc0luZmVyZW5jZVZhcmlhYmxlKHMpICYmICFpc0luZmVyZW5jZVZhcmlhYmxlKHQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmUgb2YgUyBvciBUIHNob3VsZCBiZSBhbiBpbmZlcmVuY2UgdmFyaWFibGUiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnMgPSBzOworICAgICAgICB0aGlzLnQgPSB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFNhbWVBc0JvdW5kIHRoYXQgPSAoU2FtZUFzQm91bmQpIG87CisKKyAgICAgICAgaWYgKCFzLmVxdWFscyh0aGF0LnMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0LmVxdWFscyh0aGF0LnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU2FtZUFzQm91bmR7IiArCisgICAgICAgICAgICAgICAgInM9IiArIHMgKworICAgICAgICAgICAgICAgICIsIHQ9IiArIHQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gcy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEluZmVyZW5jZVZhcmlhYmxlPiB1c2VkSW5mZXJlbmNlVmFyaWFibGVzKCkgeworICAgICAgICBTZXQ8SW5mZXJlbmNlVmFyaWFibGU+IHZhcmlhYmxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgdmFyaWFibGVzLmFkZEFsbChUeXBlSGVscGVyLnVzZWRJbmZlcmVuY2VWYXJpYWJsZXMocykpOworICAgICAgICB2YXJpYWJsZXMuYWRkQWxsKFR5cGVIZWxwZXIudXNlZEluZmVyZW5jZVZhcmlhYmxlcyh0KSk7CisgICAgICAgIHJldHVybiB2YXJpYWJsZXM7CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSBnZXRTKCkgeworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFQoKSB7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQURlcGVuZGVuY3koKSB7CisgICAgICAgIHJldHVybiAhaXNBbkluc3RhbnRpYXRpb24oKS5pc1ByZXNlbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8SW5zdGFudGlhdGlvbj4gaXNBbkluc3RhbnRpYXRpb24oKSB7CisgICAgICAgIGlmIChpc0luZmVyZW5jZVZhcmlhYmxlKHMpICYmIGlzUHJvcGVyVHlwZSh0KSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBJbnN0YW50aWF0aW9uKChJbmZlcmVuY2VWYXJpYWJsZSkgcywgdCkpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1Byb3BlclR5cGUocykgJiYgaXNJbmZlcmVuY2VWYXJpYWJsZSh0KSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBJbnN0YW50aWF0aW9uKChJbmZlcmVuY2VWYXJpYWJsZSkgdCwgcykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkKEluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uIGluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL1N1YnR5cGVPZkJvdW5kLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9TdWJ0eXBlT2ZCb3VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1N2U3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9TdWJ0eXBlT2ZCb3VuZC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuYm91bmRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLmlzSW5mZXJlbmNlVmFyaWFibGU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLlR5cGVIZWxwZXIuaXNQcm9wZXJUeXBlOworCisvKioKKyAqIFMgPDogVCwgd2hlcmUgYXQgbGVhc3Qgb25lIG9mIFMgb3IgVCBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGU6IFMgaXMgYSBzdWJ0eXBlIG9mIFQKKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFN1YnR5cGVPZkJvdW5kIGV4dGVuZHMgQm91bmQgeworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHM7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgdDsKKworICAgIHB1YmxpYyBTdWJ0eXBlT2ZCb3VuZChSZXNvbHZlZFR5cGUgcywgUmVzb2x2ZWRUeXBlIHQpIHsKKyAgICAgICAgaWYgKCFpc0luZmVyZW5jZVZhcmlhYmxlKHMpICYmICFpc0luZmVyZW5jZVZhcmlhYmxlKHQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmUgb2YgUyBvciBUIHNob3VsZCBiZSBhbiBpbmZlcmVuY2UgdmFyaWFibGUiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnMgPSBzOworICAgICAgICB0aGlzLnQgPSB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFN1YnR5cGVPZkJvdW5kIHRoYXQgPSAoU3VidHlwZU9mQm91bmQpIG87CisKKyAgICAgICAgaWYgKCFzLmVxdWFscyh0aGF0LnMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0LmVxdWFscyh0aGF0LnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU3VidHlwZU9mQm91bmR7IiArCisgICAgICAgICAgICAgICAgInM9IiArIHMgKworICAgICAgICAgICAgICAgICIsIHQ9IiArIHQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gcy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFMoKSB7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8SW5mZXJlbmNlVmFyaWFibGU+IHVzZWRJbmZlcmVuY2VWYXJpYWJsZXMoKSB7CisgICAgICAgIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gdmFyaWFibGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICB2YXJpYWJsZXMuYWRkQWxsKFR5cGVIZWxwZXIudXNlZEluZmVyZW5jZVZhcmlhYmxlcyhzKSk7CisgICAgICAgIHZhcmlhYmxlcy5hZGRBbGwoVHlwZUhlbHBlci51c2VkSW5mZXJlbmNlVmFyaWFibGVzKHQpKTsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb2x2ZWRUeXBlIGdldFQoKSB7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxQcm9wZXJVcHBlckJvdW5kPiBpc1Byb3BlclVwcGVyQm91bmQoKSB7CisgICAgICAgIGlmIChpc0luZmVyZW5jZVZhcmlhYmxlKHMpICYmIGlzUHJvcGVyVHlwZSh0KSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBQcm9wZXJVcHBlckJvdW5kKChJbmZlcmVuY2VWYXJpYWJsZSkgcywgdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcHRpb25hbDxQcm9wZXJMb3dlckJvdW5kPiBpc1Byb3Blckxvd2VyQm91bmQoKSB7CisgICAgICAgIGlmIChpc1Byb3BlclR5cGUocykgJiYgaXNJbmZlcmVuY2VWYXJpYWJsZSh0KSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBQcm9wZXJMb3dlckJvdW5kKChJbmZlcmVuY2VWYXJpYWJsZSkgdCwgcykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQURlcGVuZGVuY3koKSB7CisgICAgICAgIHJldHVybiAhaXNQcm9wZXJMb3dlckJvdW5kKCkuaXNQcmVzZW50KCkgJiYgIWlzUHJvcGVyVXBwZXJCb3VuZCgpLmlzUHJlc2VudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkKEluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uIGluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL1Rocm93c0JvdW5kLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9UaHJvd3NCb3VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZWEzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9UaHJvd3NCb3VuZC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuYm91bmRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQm91bmQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5mZXJlbmNlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5mZXJlbmNlVmFyaWFibGVTdWJzdGl0dXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRoZSBpbmZlcmVuY2UgdmFyaWFibGUgzrEgYXBwZWFycyBpbiBhIHRocm93cyBjbGF1c2UuCisgKgorICogQSBib3VuZCBvZiB0aGUgZm9ybSB0aHJvd3MgzrEgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWw6IGl0IGRpcmVjdHMgcmVzb2x1dGlvbiB0byBvcHRpbWl6ZSB0aGUgaW5zdGFudGlhdGlvbiBvZiDOsSBzbworICogdGhhdCwgaWYgcG9zc2libGUsIGl0IGlzIG5vdCBhIGNoZWNrZWQgZXhjZXB0aW9uIHR5cGUuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJvd3NCb3VuZCBleHRlbmRzIEJvdW5kIHsKKyAgICBwcml2YXRlIEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlOworCisgICAgcHVibGljIFRocm93c0JvdW5kKEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlKSB7CisgICAgICAgIHRoaXMuaW5mZXJlbmNlVmFyaWFibGUgPSBpbmZlcmVuY2VWYXJpYWJsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBUaHJvd3NCb3VuZCB0aGF0ID0gKFRocm93c0JvdW5kKSBvOworCisgICAgICAgIHJldHVybiBpbmZlcmVuY2VWYXJpYWJsZS5lcXVhbHModGhhdC5pbmZlcmVuY2VWYXJpYWJsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJUaHJvd3NCb3VuZHsiICsKKyAgICAgICAgICAgICAgICAiaW5mZXJlbmNlVmFyaWFibGU9IiArIGluZmVyZW5jZVZhcmlhYmxlICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGluZmVyZW5jZVZhcmlhYmxlLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxJbmZlcmVuY2VWYXJpYWJsZT4gdXNlZEluZmVyZW5jZVZhcmlhYmxlcygpIHsKKyAgICAgICAgU2V0PEluZmVyZW5jZVZhcmlhYmxlPiB2YXJpYWJsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIHZhcmlhYmxlcy5hZGQoaW5mZXJlbmNlVmFyaWFibGUpOworICAgICAgICByZXR1cm4gdmFyaWFibGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU2F0aXNmaWVkKEluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uIGluZmVyZW5jZVZhcmlhYmxlU3Vic3RpdHV0aW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGhyb3dzQm91bmRPbihJbmZlcmVuY2VWYXJpYWJsZSBpbmZlcmVuY2VWYXJpYWJsZSkgeworICAgICAgICByZXR1cm4gaW5mZXJlbmNlVmFyaWFibGUuZXF1YWxzKHRoaXMuaW5mZXJlbmNlVmFyaWFibGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvY29uc3RyYWludGZvcm11bGFzL0V4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvY29uc3RyYWludGZvcm11bGFzL0V4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA0MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvRXhwcmVzc2lvbkNvbXBhdGlibGVXaXRoVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzM1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmNvbnN0cmFpbnRmb3JtdWxhczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5QYWlyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5FeHByZXNzaW9uSGVscGVyLmlzUG9seUV4cHJlc3Npb247CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkV4cHJlc3Npb25IZWxwZXIuaXNTdGFuZGFsb25lRXhwcmVzc2lvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuVHlwZUhlbHBlci5pc0NvbXBhdGlibGVJbkFMb29zZUludm9jYXRpb25Db250ZXh0OworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLmlzUHJvcGVyVHlwZTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLio7CisKKy8qKgorICogQW4gZXhwcmVzc2lvbiBpcyBjb21wYXRpYmxlIGluIGEgbG9vc2UgaW52b2NhdGlvbiBjb250ZXh0IHdpdGggdHlwZSBUCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlIGV4dGVuZHMgQ29uc3RyYWludEZvcm11bGEgeworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIFQ7CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbkNvbXBhdGlibGVXaXRoVHlwZShUeXBlU29sdmVyIHR5cGVTb2x2ZXIsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUmVzb2x2ZWRUeXBlIFQpIHsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5UID0gVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVkdWN0aW9uUmVzdWx0IHJlZHVjZShCb3VuZFNldCBjdXJyZW50Qm91bmRTZXQpIHsKKyAgICAgICAgLy8gSWYgVCBpcyBhIHByb3BlciB0eXBlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gaXMgY29tcGF0aWJsZSBpbiBhIGxvb3NlCisgICAgICAgIC8vIGludm9jYXRpb24gY29udGV4dCB3aXRoIFQgKMKnNS4zKSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKworICAgICAgICBpZiAoaXNQcm9wZXJUeXBlKFQpKSB7CisgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlSW5BTG9vc2VJbnZvY2F0aW9uQ29udGV4dCh0eXBlU29sdmVyLCBleHByZXNzaW9uLCBUKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQudHJ1ZVJlc3VsdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LmZhbHNlUmVzdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgc3RhbmRhbG9uZSBleHByZXNzaW9uICjCpzE1LjIpIG9mIHR5cGUgUywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcworICAgICAgICAvLyB0byDigLlTIOKGkiBU4oC6LgorCisgICAgICAgIGlmIChpc1N0YW5kYWxvbmVFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgcyA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUoZXhwcmVzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5lbXB0eSgpLndpdGhDb25zdHJhaW50KG5ldyBUeXBlQ29tcGF0aWJsZVdpdGhUeXBlKHR5cGVTb2x2ZXIsIHMsIFQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGV4cHJlc3Npb24gaXMgYSBwb2x5IGV4cHJlc3Npb24gKMKnMTUuMikuIFRoZSByZXN1bHQgZGVwZW5kcyBvbiB0aGUgZm9ybSBvZiB0aGUgZXhwcmVzc2lvbjoKKworICAgICAgICBpZiAoaXNQb2x5RXhwcmVzc2lvbihleHByZXNzaW9uKSkgeworCisgICAgICAgICAgICAvLyAtIElmIHRoZSBleHByZXNzaW9uIGlzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIG9mIHRoZSBmb3JtICggRXhwcmVzc2lvbicgKSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcworICAgICAgICAgICAgLy8gICB0byDigLlFeHByZXNzaW9uJyDihpIgVOKAui4KKworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBFbmNsb3NlZEV4cHIpIHsKKyAgICAgICAgICAgICAgICBFbmNsb3NlZEV4cHIgZW5jbG9zZWRFeHByID0gKEVuY2xvc2VkRXhwcilleHByZXNzaW9uOworICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQub25lQ29uc3RyYWludChuZXcgRXhwcmVzc2lvbkNvbXBhdGlibGVXaXRoVHlwZSh0eXBlU29sdmVyLCBlbmNsb3NlZEV4cHIuZ2V0SW5uZXIoKSwgVCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAtIElmIHRoZSBleHByZXNzaW9uIGlzIGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBvciBhIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24sIHRoZQorICAgICAgICAgICAgLy8gICBjb25zdHJhaW50IHJlZHVjZXMgdG8gdGhlIGJvdW5kIHNldCBCMyB3aGljaCB3b3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZXhwcmVzc2lvbidzIGludm9jYXRpb24KKyAgICAgICAgICAgIC8vICAgdHlwZSB3aGVuIHRhcmdldGluZyBULCBhcyBkZWZpbmVkIGluIMKnMTguNS4yLiAoRm9yIGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiwgdGhlCisgICAgICAgICAgICAvLyAgIGNvcnJlc3BvbmRpbmcgIm1ldGhvZCIgdXNlZCBmb3IgaW5mZXJlbmNlIGlzIGRlZmluZWQgaW4gwqcxNS45LjMpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgVGhpcyBib3VuZCBzZXQgbWF5IGNvbnRhaW4gbmV3IGluZmVyZW5jZSB2YXJpYWJsZXMsIGFzIHdlbGwgYXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlc2UgbmV3CisgICAgICAgICAgICAvLyAgIHZhcmlhYmxlcyBhbmQgdGhlIGluZmVyZW5jZSB2YXJpYWJsZXMgaW4gVC4KKworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBPYmplY3RDcmVhdGlvbkV4cHIpIHsKKyAgICAgICAgICAgICAgICBCb3VuZFNldCBCMyA9IG5ldyBUeXBlSW5mZXJlbmNlKHR5cGVTb2x2ZXIpLmludm9jYXRpb25UeXBlSW5mZXJlbmNlQm91bmRzU2V0QjMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LmJvdW5kcyhCMyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgTWV0aG9kQ2FsbEV4cHIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLSBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gZTEgPyBlMiA6IGUzLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHR3bworICAgICAgICAgICAgLy8gICBjb25zdHJhaW50IGZvcm11bGFzLCDigLllMiDihpIgVOKAuiBhbmQg4oC5ZTMg4oaSIFTigLouCisKKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQ29uZGl0aW9uYWxFeHByKSB7CisgICAgICAgICAgICAgICAgQ29uZGl0aW9uYWxFeHByIGNvbmRpdGlvbmFsRXhwciA9IChDb25kaXRpb25hbEV4cHIpZXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LndpdGhDb25zdHJhaW50cygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlKHR5cGVTb2x2ZXIsIGNvbmRpdGlvbmFsRXhwci5nZXRUaGVuRXhwcigpLCBUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlKHR5cGVTb2x2ZXIsIGNvbmRpdGlvbmFsRXhwci5nZXRFbHNlRXhwcigpLCBUKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC0gSWYgdGhlIGV4cHJlc3Npb24gaXMgYSBsYW1iZGEgZXhwcmVzc2lvbiBvciBhIG1ldGhvZCByZWZlcmVuY2UgZXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyBzcGVjaWZpZWQKKyAgICAgICAgICAgIC8vICAgYmVsb3cuCisKKyAgICAgICAgICAgIC8vIEEgY29uc3RyYWludCBmb3JtdWxhIG9mIHRoZSBmb3JtIOKAuUxhbWJkYUV4cHJlc3Npb24g4oaSIFTigLosIHdoZXJlIFQgbWVudGlvbnMgYXQgbGVhc3Qgb25lIGluZmVyZW5jZSB2YXJpYWJsZSwgaXMgcmVkdWNlZCBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIExhbWJkYUV4cHIpIHsKKyAgICAgICAgICAgICAgICBMYW1iZGFFeHByIGxhbWJkYUV4cHIgPSAoTGFtYmRhRXhwcilleHByZXNzaW9uOworCisgICAgICAgICAgICAgICAgLy8gLSBJZiBUIGlzIG5vdCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHR5cGUgKMKnOS44KSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKworICAgICAgICAgICAgICAgIGlmICghRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmlzRnVuY3Rpb25hbEludGVyZmFjZVR5cGUoVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5mYWxzZVJlc3VsdCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBsZXQgVCcgYmUgdGhlIGdyb3VuZCB0YXJnZXQgdHlwZSBkZXJpdmVkIGZyb20gVCwgYXMgc3BlY2lmaWVkIGluIMKnMTUuMjcuMy4gSWYgwqcxOC41LjMKKyAgICAgICAgICAgICAgICAvLyAgIGlzIHVzZWQgdG8gZGVyaXZlIGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSB3aGljaCBpcyBwYXJhbWV0ZXJpemVkLCB0aGVuIHRoZSB0ZXN0IHRoYXQKKyAgICAgICAgICAgICAgICAvLyAgIEY8QScxLCAuLi4sIEEnbT4gaXMgYSBzdWJ0eXBlIG9mIEY8QTEsIC4uLiwgQW0+IGlzIG5vdCBwZXJmb3JtZWQgKGluc3RlYWQsIGl0IGlzIGFzc2VydGVkIHdpdGggYQorICAgICAgICAgICAgICAgIC8vICAgY29uc3RyYWludCBmb3JtdWxhIGJlbG93KS4gTGV0IHRoZSB0YXJnZXQgZnVuY3Rpb24gdHlwZSBmb3IgdGhlIGxhbWJkYSBleHByZXNzaW9uIGJlIHRoZQorICAgICAgICAgICAgICAgIC8vICAgZnVuY3Rpb24gdHlwZSBvZiBUJy4gVGhlbjoKKworICAgICAgICAgICAgICAgIFBhaXI8UmVzb2x2ZWRUeXBlLCBCb29sZWFuPiByZXN1bHQgPSBUeXBlSGVscGVyLmdyb3VuZFRhcmdldFR5cGVPZkxhbWJkYShsYW1iZGFFeHByLCBULCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFR5cGUgVEZpcnN0ID0gcmVzdWx0LmE7CisgICAgICAgICAgICAgICAgTWV0aG9kVHlwZSB0YXJnZXRGdW5jdGlvblR5cGUgPSBUeXBlSGVscGVyLmdldEZ1bmN0aW9uVHlwZShURmlyc3QpOworICAgICAgICAgICAgICAgIHRhcmdldEZ1bmN0aW9uVHlwZSA9IHJlcGxhY2VUeXBlVmFyaWFibGVzV2l0aEluZmVyZW5jZVZhcmlhYmxlcyh0YXJnZXRGdW5jdGlvblR5cGUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuYikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyAgIC0gSWYgbm8gdmFsaWQgZnVuY3Rpb24gdHlwZSBjYW4gYmUgZm91bmQsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgRmVkZXJpY286IFRISVMgU0hPVUxEIE5PVCBIQVBQRU4sIElOIENBU0UgV0UgV0lMTCBUSFJPVyBBTiBFWENFUFRJT04KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgLSBPdGhlcndpc2UsIHRoZSBjb25ncnVlbmNlIG9mIExhbWJkYUV4cHJlc3Npb24gd2l0aCB0aGUgdGFyZ2V0IGZ1bmN0aW9uIHR5cGUgaXMgYXNzZXJ0ZWQgYXMKKyAgICAgICAgICAgICAgICAvLyAgICAgZm9sbG93czoKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICAtIElmIHRoZSBudW1iZXIgb2YgbGFtYmRhIHBhcmFtZXRlcnMgZGlmZmVycyBmcm9tIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGUsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RnVuY3Rpb25UeXBlLmdldEZvcm1hbEFyZ3VtZW50VHlwZXMoKS5zaXplKCkgIT0gbGFtYmRhRXhwci5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQuZmFsc2VSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyAgICAgLSBJZiB0aGUgbGFtYmRhIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSB0eXBlZCBhbmQgb25lIG9yIG1vcmUgb2YgdGhlIGZ1bmN0aW9uIHR5cGUncyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlcyBpcyBub3QgYSBwcm9wZXIgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICAgIFRoaXMgY29uZGl0aW9uIG5ldmVyIGFyaXNlcyBpbiBwcmFjdGljZSwgZHVlIHRvIHRoZSBoYW5kbGluZyBvZiBpbXBsaWNpdGx5IHR5cGVkIGxhbWJkYQorICAgICAgICAgICAgICAgIC8vICAgICAgIGV4cHJlc3Npb25zIGluIMKnMTguNS4xIGFuZCB0aGUgc3Vic3RpdHV0aW9uIGFwcGxpZWQgdG8gdGhlIHRhcmdldCB0eXBlIGluIMKnMTguNS4yLgorCisgICAgICAgICAgICAgICAgLy8gICAgIC0gSWYgdGhlIGZ1bmN0aW9uIHR5cGUncyByZXN1bHQgaXMgdm9pZCBhbmQgdGhlIGxhbWJkYSBib2R5IGlzIG5laXRoZXIgYSBzdGF0ZW1lbnQgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgIC8vICAgICAgIG5vciBhIHZvaWQtY29tcGF0aWJsZSBibG9jaywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGdW5jdGlvblR5cGUuZ2V0UmV0dXJuVHlwZSgpLmlzVm9pZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vICAgICAtIElmIHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmVzdWx0IGlzIG5vdCB2b2lkIGFuZCB0aGUgbGFtYmRhIGJvZHkgaXMgYSBibG9jayB0aGF0IGlzIG5vdAorICAgICAgICAgICAgICAgIC8vICAgICAgIHZhbHVlLWNvbXBhdGlibGUsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisKKyAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEZ1bmN0aW9uVHlwZS5nZXRSZXR1cm5UeXBlKCkuaXNWb2lkKCkgJiYgbGFtYmRhRXhwci5nZXRCb2R5KCkgaW5zdGFuY2VvZiBCbG9ja1N0bXQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc1ZhbHVlQ29tcGF0aWJsZUJsb2NrKGxhbWJkYUV4cHIuZ2V0Qm9keSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LmZhbHNlUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gICAgIC0gT3RoZXJ3aXNlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQgZm9ybXVsYXM6CisgICAgICAgICAgICAgICAgTGlzdDxDb25zdHJhaW50Rm9ybXVsYT4gY29uc3RyYWludHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgICAgICAgICAvLyAgICAgICAtIElmIHRoZSBsYW1iZGEgcGFyYW1ldGVycyBoYXZlIGV4cGxpY2l0bHkgZGVjbGFyZWQgdHlwZXMgRjEsIC4uLiwgRm4gYW5kIHRoZSBmdW5jdGlvbiB0eXBlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICBoYXMgcGFyYW1ldGVyIHR5cGVzIEcxLCAuLi4sIEduLCB0aGVuIGkpIGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgbiksIOKAuUZpID0gR2nigLosIGFuZCBpaSkg4oC5VCcgPDogVOKAui4KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzRXhwbGljaXRseURlY2xhcmVkVHlwZXMgPSBsYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5hbnlNYXRjaChwIC0+ICEocC5nZXRUeXBlKCkgaW5zdGFuY2VvZiBVbmtub3duVHlwZSkpOworICAgICAgICAgICAgICAgIGlmIChoYXNFeHBsaWNpdGx5RGVjbGFyZWRUeXBlcykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyAgICAgICAtIElmIHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmV0dXJuIHR5cGUgaXMgYSAobm9uLXZvaWQpIHR5cGUgUiwgYXNzdW1lIHRoZSBsYW1iZGEncyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIHR5cGVzIGFyZSB0aGUgc2FtZSBhcyB0aGUgZnVuY3Rpb24gdHlwZSdzIHBhcmFtZXRlciB0eXBlcy4gVGhlbjoKKworICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0RnVuY3Rpb25UeXBlLmdldFJldHVyblR5cGUoKS5pc1ZvaWQoKSkgeworCisgICAgICAgICAgICAgICAgICAgIFJlc29sdmVkVHlwZSBSID0gdGFyZ2V0RnVuY3Rpb25UeXBlLmdldFJldHVyblR5cGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVHlwZUhlbHBlci5pc1Byb3BlclR5cGUoUikpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAtIElmIFIgaXMgYSBwcm9wZXIgdHlwZSwgYW5kIGlmIHRoZSBsYW1iZGEgYm9keSBvciBzb21lIHJlc3VsdCBleHByZXNzaW9uIGluIHRoZSBsYW1iZGEgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGlzIG5vdCBjb21wYXRpYmxlIGluIGFuIGFzc2lnbm1lbnQgY29udGV4dCB3aXRoIFIsIHRoZW4gZmFsc2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW1iZGFFeHByLmdldEJvZHkoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gcmVzdWx0RXhwcmVzc2lvbnMgPSBFeHByZXNzaW9uSGVscGVyLmdldFJlc3VsdEV4cHJlc3Npb25zKChCbG9ja1N0bXQpbGFtYmRhRXhwci5nZXRCb2R5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRXhwcmVzc2lvbiBlIDogcmVzdWx0RXhwcmVzc2lvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFeHByZXNzaW9uSGVscGVyLmlzQ29tcGF0aWJsZUluQXNzaWdubWVudENvbnRleHQoZSwgUiwgdHlwZVNvbHZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQuZmFsc2VSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBlID0gKChFeHByZXNzaW9uU3RtdClsYW1iZGFFeHByLmdldEJvZHkoKSkuZ2V0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRXhwcmVzc2lvbkhlbHBlci5pc0NvbXBhdGlibGVJbkFzc2lnbm1lbnRDb250ZXh0KGUsIFIsIHR5cGVTb2x2ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQuZmFsc2VSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIC0gT3RoZXJ3aXNlLCBpZiBSIGlzIG5vdCBhIHByb3BlciB0eXBlLCB0aGVuIHdoZXJlIHRoZSBsYW1iZGEgYm9keSBoYXMgdGhlIGZvcm0gRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICB0aGUgY29uc3RyYWludCDigLlFeHByZXNzaW9uIOKGkiBS4oC6OyBvciB3aGVyZSB0aGUgbGFtYmRhIGJvZHkgaXMgYSBibG9jayB3aXRoIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGV4cHJlc3Npb25zIGUxLCAuLi4sIGVtLCBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG0pLCDigLllaSDihpIgUuKAui4KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbWJkYUV4cHIuZ2V0Qm9keSgpIGluc3RhbmNlb2YgQmxvY2tTdG10KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxsUmV0dXJuRXhwcmVzc2lvbnMoKEJsb2NrU3RtdClsYW1iZGFFeHByLmdldEJvZHkoKSkuZm9yRWFjaChlIC0+IGNvbnN0cmFpbnRzLmFkZChuZXcgRXhwcmVzc2lvbkNvbXBhdGlibGVXaXRoVHlwZSh0eXBlU29sdmVyLCBlLCBSKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGRURFUklDTzogQWRkZWQgLSBTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpLnNpemUoKTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHBhcmFtVHlwZSA9IHRhcmdldEZ1bmN0aW9uVHlwZS5nZXRGb3JtYWxBcmd1bWVudFR5cGVzKCkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlSW5mZXJlbmNlQ2FjaGUucmVjb3JkKHR5cGVTb2x2ZXIsIGxhbWJkYUV4cHIsIGxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVyKGkpLmdldE5hbWVBc1N0cmluZygpLCBwYXJhbVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGRURFUklDTzogQWRkZWQgLSBFbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGUgPSAoKEV4cHJlc3Npb25TdG10KWxhbWJkYUV4cHIuZ2V0Qm9keSgpKS5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMuYWRkKG5ldyBFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlKHR5cGVTb2x2ZXIsIGUsIFIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQud2l0aENvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQSBjb25zdHJhaW50IGZvcm11bGEgb2YgdGhlIGZvcm0g4oC5TWV0aG9kUmVmZXJlbmNlIOKGkiBU4oC6LCB3aGVyZSBUIG1lbnRpb25zIGF0IGxlYXN0IG9uZSBpbmZlcmVuY2UgdmFyaWFibGUsIGlzIHJlZHVjZWQgYXMgZm9sbG93czoKKworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXRob2RSZWZlcmVuY2VFeHByKSB7CisKKyAgICAgICAgICAgICAgICAvLyAtIElmIFQgaXMgbm90IGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdHlwZSwgb3IgaWYgVCBpcyBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHR5cGUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gdHlwZSAowqc5LjkpLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGlmIHRoZXJlIGRvZXMgbm90IGV4aXN0IGEgcG90ZW50aWFsbHkgYXBwbGljYWJsZSBtZXRob2QgZm9yIHRoZSBtZXRob2QgcmVmZXJlbmNlIHdoZW4gdGFyZ2V0aW5nIFQsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgaWYgdGhlIG1ldGhvZCByZWZlcmVuY2UgaXMgZXhhY3QgKMKnMTUuMTMuMSksIHRoZW4gbGV0IFAxLCAuLi4sIFBuIGJlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIGZ1bmN0aW9uIHR5cGUgb2YgVCwgYW5kIGxldCBGMSwgLi4uLCBGayBiZSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBwb3RlbnRpYWxseSBhcHBsaWNhYmxlIG1ldGhvZC4gVGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBhIG5ldyBzZXQgb2YgY29uc3RyYWludHMsIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgIC0gSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBuID0gaysxLCB0aGUgcGFyYW1ldGVyIG9mIHR5cGUgUDEgaXMgdG8gYWN0IGFzIHRoZSB0YXJnZXQgcmVmZXJlbmNlIG9mIHRoZSBpbnZvY2F0aW9uLiBUaGUgbWV0aG9kIHJlZmVyZW5jZSBleHByZXNzaW9uIG5lY2Vzc2FyaWx5IGhhcyB0aGUgZm9ybSBSZWZlcmVuY2VUeXBlIDo6IFtUeXBlQXJndW1lbnRzXSBJZGVudGlmaWVyLiBUaGUgY29uc3RyYWludCByZWR1Y2VzIHRvIOKAuVAxIDw6IFJlZmVyZW5jZVR5cGXigLogYW5kLCBmb3IgYWxsIGkgKDIg4omkIGkg4omkIG4pLCDigLlQaSDihpIgRmktMeKAui4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBJbiBhbGwgb3RoZXIgY2FzZXMsIG4gPSBrLCBhbmQgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0bywgZm9yIGFsbCBpICgxIOKJpCBpIOKJpCBuKSwg4oC5UGkg4oaSIEZp4oC6LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAtIElmIHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmVzdWx0IGlzIG5vdCB2b2lkLCBsZXQgUiBiZSBpdHMgcmV0dXJuIHR5cGUuIFRoZW4sIGlmIHRoZSByZXN1bHQgb2YgdGhlIHBvdGVudGlhbGx5IGFwcGxpY2FibGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uIGlzIHZvaWQsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuIE90aGVyd2lzZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlSJyDihpIgUuKAuiwgd2hlcmUgUicgaXMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBjYXB0dXJlIGNvbnZlcnNpb24gKMKnNS4xLjEwKSB0byB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHBvdGVudGlhbGx5IGFwcGxpY2FibGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIHRoZSBtZXRob2QgcmVmZXJlbmNlIGlzIGluZXhhY3QsIGFuZDoKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgLSBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgZnVuY3Rpb24gdHlwZSdzIHBhcmFtZXRlciB0eXBlcyBpcyBub3QgYSBwcm9wZXIgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICBUaGlzIGNvbmRpdGlvbiBuZXZlciBhcmlzZXMgaW4gcHJhY3RpY2UsIGR1ZSB0byB0aGUgaGFuZGxpbmcgb2YgaW5leGFjdCBtZXRob2QgcmVmZXJlbmNlcyBpbiDCpzE4LjUuMSBhbmQgdGhlIHN1YnN0aXR1dGlvbiBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgdHlwZSBpbiDCpzE4LjUuMi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgLSBPdGhlcndpc2UsIGEgc2VhcmNoIGZvciBhIGNvbXBpbGUtdGltZSBkZWNsYXJhdGlvbiBpcyBwZXJmb3JtZWQsIGFzIHNwZWNpZmllZCBpbiDCpzE1LjEzLjEuIElmIHRoZXJlIGlzIG5vIGNvbXBpbGUtdGltZSBkZWNsYXJhdGlvbiBmb3IgdGhlIG1ldGhvZCByZWZlcmVuY2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuIE90aGVyd2lzZSwgdGhlcmUgaXMgYSBjb21waWxlLXRpbWUgZGVjbGFyYXRpb24sIGFuZDoKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICAtIElmIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIHR5cGUgaXMgdm9pZCwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgIC0gT3RoZXJ3aXNlLCBpZiB0aGUgbWV0aG9kIHJlZmVyZW5jZSBleHByZXNzaW9uIGVsaWRlcyBUeXBlQXJndW1lbnRzLCBhbmQgdGhlIGNvbXBpbGUtdGltZSBkZWNsYXJhdGlvbiBpcyBhIGdlbmVyaWMgbWV0aG9kLCBhbmQgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBjb21waWxlLXRpbWUgZGVjbGFyYXRpb24gbWVudGlvbnMgYXQgbGVhc3Qgb25lIG9mIHRoZSBtZXRob2QncyB0eXBlIHBhcmFtZXRlcnMsIHRoZW4gdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0aGUgYm91bmQgc2V0IEIzIHdoaWNoIHdvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtZXRob2QgcmVmZXJlbmNlJ3MgaW52b2NhdGlvbiB0eXBlIHdoZW4gdGFyZ2V0aW5nIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiDCpzE4LjUuMi4gQjMgbWF5IGNvbnRhaW4gbmV3IGluZmVyZW5jZSB2YXJpYWJsZXMsIGFzIHdlbGwgYXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlc2UgbmV3IHZhcmlhYmxlcyBhbmQgdGhlIGluZmVyZW5jZSB2YXJpYWJsZXMgaW4gVC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICAtIE90aGVyd2lzZSwgbGV0IFIgYmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiB0eXBlLCBhbmQgbGV0IFInIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgY2FwdHVyZSBjb252ZXJzaW9uICjCpzUuMS4xMCkgdG8gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBpbnZvY2F0aW9uIHR5cGUgKMKnMTUuMTIuMi42KSBvZiB0aGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uLiBJZiBSJyBpcyB2b2lkLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlOyBvdGhlcndpc2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8g4oC5Uicg4oaSIFLigLouCisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGFwcGVuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IGdldEFsbFJldHVybkV4cHJlc3Npb25zKEJsb2NrU3RtdCBibG9ja1N0bXQpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrU3RtdC5maW5kQWxsKFJldHVyblN0bXQuY2xhc3MpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihyIC0+IHIuZ2V0RXhwcmVzc2lvbigpLmlzUHJlc2VudCgpKQorICAgICAgICAgICAgICAgIC5tYXAociAtPiByLmdldEV4cHJlc3Npb24oKS5nZXQoKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0xpc3QoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsdWVDb21wYXRpYmxlQmxvY2soU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICAvLyBBIGJsb2NrIGxhbWJkYSBib2R5IGlzIHZhbHVlLWNvbXBhdGlibGUgaWYgaXQgY2Fubm90IGNvbXBsZXRlIG5vcm1hbGx5ICjCpzE0LjIxKSBhbmQgZXZlcnkgcmV0dXJuIHN0YXRlbWVudAorICAgICAgICAvLyBpbiB0aGUgYmxvY2sgaGFzIHRoZSBmb3JtIHJldHVybiBFeHByZXNzaW9uOy4KKworICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgQmxvY2tTdG10KSB7CisgICAgICAgICAgICBpZiAoIUNvbnRyb2xGbG93TG9naWMuZ2V0SW5zdGFuY2UoKS5jYW5Db21wbGV0ZU5vcm1hbGx5KHN0YXRlbWVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8UmV0dXJuU3RtdD4gcmV0dXJuU3RtdHMgPSBzdGF0ZW1lbnQuZmluZEFsbChSZXR1cm5TdG10LmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5TdG10cy5zdHJlYW0oKS5hbGxNYXRjaChyIC0+IHIuZ2V0RXhwcmVzc2lvbigpLmlzUHJlc2VudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgRXhwcmVzc2lvbkNvbXBhdGlibGVXaXRoVHlwZSB0aGF0ID0gKEV4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGUpIG87CisKKyAgICAgICAgaWYgKCF0eXBlU29sdmVyLmVxdWFscyh0aGF0LnR5cGVTb2x2ZXIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghZXhwcmVzc2lvbi5lcXVhbHModGhhdC5leHByZXNzaW9uKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gVC5lcXVhbHModGhhdC5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gdHlwZVNvbHZlci5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGV4cHJlc3Npb24uaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBULmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBleyIgKworICAgICAgICAgICAgICAgICJ0eXBlU29sdmVyPSIgKyB0eXBlU29sdmVyICsKKyAgICAgICAgICAgICAgICAiLCBleHByZXNzaW9uPSIgKyBleHByZXNzaW9uICsKKyAgICAgICAgICAgICAgICAiLCBUPSIgKyBUICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRob2RUeXBlIHJlcGxhY2VUeXBlVmFyaWFibGVzV2l0aEluZmVyZW5jZVZhcmlhYmxlcyhNZXRob2RUeXBlIG1ldGhvZFR5cGUpIHsKKyAgICAgICAgLy8gRmluZCBhbGwgdHlwZSB2YXJpYWJsZQorICAgICAgICBNYXA8UmVzb2x2ZWRUeXBlVmFyaWFibGUsIEluZmVyZW5jZVZhcmlhYmxlPiBjb3JyZXNwb25kZW5jZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBuZXdGb3JtYWxBcmd1bWVudFR5cGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKFJlc29sdmVkVHlwZSBmb3JtYWxBcmcgOiBtZXRob2RUeXBlLmdldEZvcm1hbEFyZ3VtZW50VHlwZXMoKSkgeworICAgICAgICAgICAgbmV3Rm9ybWFsQXJndW1lbnRUeXBlcy5hZGQocmVwbGFjZVR5cGVWYXJpYWJsZXNXaXRoSW5mZXJlbmNlVmFyaWFibGVzKGZvcm1hbEFyZywgY29ycmVzcG9uZGVuY2VzKSk7CisgICAgICAgIH0KKyAgICAgICAgUmVzb2x2ZWRUeXBlIG5ld1JldHVyblR5cGUgPSByZXBsYWNlVHlwZVZhcmlhYmxlc1dpdGhJbmZlcmVuY2VWYXJpYWJsZXMobWV0aG9kVHlwZS5nZXRSZXR1cm5UeXBlKCksIGNvcnJlc3BvbmRlbmNlcyk7CisgICAgICAgIHJldHVybiBuZXcgTWV0aG9kVHlwZShtZXRob2RUeXBlLmdldFR5cGVQYXJhbWV0ZXJzKCksIG5ld0Zvcm1hbEFyZ3VtZW50VHlwZXMsIG5ld1JldHVyblR5cGUsIG1ldGhvZFR5cGUuZ2V0RXhjZXB0aW9uVHlwZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgcmVwbGFjZVR5cGVWYXJpYWJsZXNXaXRoSW5mZXJlbmNlVmFyaWFibGVzKFJlc29sdmVkVHlwZSBvcmlnaW5hbFR5cGUsIE1hcDxSZXNvbHZlZFR5cGVWYXJpYWJsZSwgSW5mZXJlbmNlVmFyaWFibGU+IGNvcnJlc3BvbmRlbmNlcykgeworICAgICAgICBpZiAob3JpZ2luYWxUeXBlLmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmICghY29ycmVzcG9uZGVuY2VzLmNvbnRhaW5zS2V5KG9yaWdpbmFsVHlwZS5hc1R5cGVWYXJpYWJsZSgpKSkgeworICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlcy5wdXQob3JpZ2luYWxUeXBlLmFzVHlwZVZhcmlhYmxlKCksIEluZmVyZW5jZVZhcmlhYmxlLnVubmFtZWQob3JpZ2luYWxUeXBlLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb3JyZXNwb25kZW5jZXMuZ2V0KG9yaWdpbmFsVHlwZS5hc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3JpZ2luYWxUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKG9yaWdpbmFsVHlwZS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9MYW1iZGFUaHJvd3NDb21wYXRpYmxlV2l0aFR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvY29uc3RyYWludGZvcm11bGFzL0xhbWJkYVRocm93c0NvbXBhdGlibGVXaXRoVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9MYW1iZGFUaHJvd3NDb21wYXRpYmxlV2l0aFR5cGUuamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmNvbnN0cmFpbnRmb3JtdWxhczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5Cb3VuZFNldDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5Db25zdHJhaW50Rm9ybXVsYTsKKworLyoqCisgKiBUaGUgY2hlY2tlZCBleGNlcHRpb25zIHRocm93biBieSB0aGUgYm9keSBvZiB0aGUgTGFtYmRhRXhwcmVzc2lvbiBhcmUgZGVjbGFyZWQgYnkgdGhlIHRocm93cyBjbGF1c2Ugb2YgdGhlCisgKiBmdW5jdGlvbiB0eXBlIGRlcml2ZWQgZnJvbSBULgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgTGFtYmRhVGhyb3dzQ29tcGF0aWJsZVdpdGhUeXBlIGV4dGVuZHMgQ29uc3RyYWludEZvcm11bGEgeworICAgIHByaXZhdGUgTGFtYmRhRXhwciBsYW1iZGFFeHByZXNzaW9uOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIFQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVkdWN0aW9uUmVzdWx0IHJlZHVjZShCb3VuZFNldCBjdXJyZW50Qm91bmRTZXQpIHsKKyAgICAgICAgLy8gQSBjb25zdHJhaW50IGZvcm11bGEgb2YgdGhlIGZvcm0g4oC5TGFtYmRhRXhwcmVzc2lvbiDihpJ0aHJvd3MgVOKAuiBpcyByZWR1Y2VkIGFzIGZvbGxvd3M6CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gSWYgVCBpcyBub3QgYSBmdW5jdGlvbmFsIGludGVyZmFjZSB0eXBlICjCpzkuOCksIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBsZXQgdGhlIHRhcmdldCBmdW5jdGlvbiB0eXBlIGZvciB0aGUgbGFtYmRhIGV4cHJlc3Npb24gYmUgZGV0ZXJtaW5lZCBhcyBzcGVjaWZpZWQgaW4gwqcxNS4yNy4zLiBJZiBubyB2YWxpZCBmdW5jdGlvbiB0eXBlIGNhbiBiZSBmb3VuZCwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBPdGhlcndpc2UsIGlmIHRoZSBsYW1iZGEgZXhwcmVzc2lvbiBpcyBpbXBsaWNpdGx5IHR5cGVkLCBhbmQgb25lIG9yIG1vcmUgb2YgdGhlIGZ1bmN0aW9uIHR5cGUncyBwYXJhbWV0ZXIgdHlwZXMgaXMgbm90IGEgcHJvcGVyIHR5cGUsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgVGhpcyBjb25kaXRpb24gbmV2ZXIgYXJpc2VzIGluIHByYWN0aWNlLCBkdWUgdG8gdGhlIHN1YnN0aXR1dGlvbiBhcHBsaWVkIHRvIHRoZSB0YXJnZXQgdHlwZSBpbiDCpzE4LjUuMi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBPdGhlcndpc2UsIGlmIHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmV0dXJuIHR5cGUgaXMgbmVpdGhlciB2b2lkIG5vciBhIHByb3BlciB0eXBlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorICAgICAgICAvLworICAgICAgICAvLyAgIFRoaXMgY29uZGl0aW9uIG5ldmVyIGFyaXNlcyBpbiBwcmFjdGljZSwgZHVlIHRvIHRoZSBzdWJzdGl0dXRpb24gYXBwbGllZCB0byB0aGUgdGFyZ2V0IHR5cGUgaW4gwqcxOC41LjIuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBsZXQgRTEsIC4uLiwgRW4gYmUgdGhlIHR5cGVzIGluIHRoZSBmdW5jdGlvbiB0eXBlJ3MgdGhyb3dzIGNsYXVzZSB0aGF0IGFyZSBub3QgcHJvcGVyIHR5cGVzLiBJZiB0aGUgbGFtYmRhIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSB0eXBlZCwgbGV0IGl0cyBwYXJhbWV0ZXIgdHlwZXMgYmUgdGhlIGZ1bmN0aW9uIHR5cGUncyBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBsYW1iZGEgYm9keSBpcyBhIHBvbHkgZXhwcmVzc2lvbiBvciBhIGJsb2NrIGNvbnRhaW5pbmcgYSBwb2x5IHJlc3VsdCBleHByZXNzaW9uLCBsZXQgdGhlIHRhcmdldGVkIHJldHVybiB0eXBlIGJlIHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmV0dXJuIHR5cGUuIExldCBYMSwgLi4uLCBYbSBiZSB0aGUgY2hlY2tlZCBleGNlcHRpb24gdHlwZXMgdGhhdCB0aGUgbGFtYmRhIGJvZHkgY2FuIHRocm93ICjCpzExLjIpLiBUaGVuIHRoZXJlIGFyZSB0d28gY2FzZXM6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSBJZiBuID0gMCAodGhlIGZ1bmN0aW9uIHR5cGUncyB0aHJvd3MgY2xhdXNlIGNvbnNpc3RzIG9ubHkgb2YgcHJvcGVyIHR5cGVzKSwgdGhlbiBpZiB0aGVyZSBleGlzdHMgc29tZSBpICgxIOKJpCBpIOKJpCBtKSBzdWNoIHRoYXQgWGkgaXMgbm90IGEgc3VidHlwZSBvZiBhbnkgcHJvcGVyIHR5cGUgaW4gdGhlIHRocm93cyBjbGF1c2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2U7IG90aGVyd2lzZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlLgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gSWYgbiA+IDAsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gYSBzZXQgb2Ygc3VidHlwaW5nIGNvbnN0cmFpbnRzOiBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG0pLCBpZiBYaSBpcyBub3QgYSBzdWJ0eXBlIG9mIGFueSBwcm9wZXIgdHlwZSBpbiB0aGUgdGhyb3dzIGNsYXVzZSwgdGhlbiB0aGUgY29uc3RyYWludHMgaW5jbHVkZSwgZm9yIGFsbCBqICgxIOKJpCBqIOKJpCBuKSwg4oC5WGkgPDogRWrigLouIEluIGFkZGl0aW9uLCBmb3IgYWxsIGogKDEg4omkIGog4omkIG4pLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRoZSBib3VuZCB0aHJvd3MgRWouCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIExhbWJkYVRocm93c0NvbXBhdGlibGVXaXRoVHlwZSB0aGF0ID0gKExhbWJkYVRocm93c0NvbXBhdGlibGVXaXRoVHlwZSkgbzsKKworICAgICAgICBpZiAoIWxhbWJkYUV4cHJlc3Npb24uZXF1YWxzKHRoYXQubGFtYmRhRXhwcmVzc2lvbikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFQuZXF1YWxzKHRoYXQuVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGxhbWJkYUV4cHJlc3Npb24uaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBULmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJMYW1iZGFUaHJvd3NDb21wYXRpYmxlV2l0aFR5cGV7IiArCisgICAgICAgICAgICAgICAgImxhbWJkYUV4cHJlc3Npb249IiArIGxhbWJkYUV4cHJlc3Npb24gKworICAgICAgICAgICAgICAgICIsIFQ9IiArIFQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9NZXRob2RSZWZlcmVuY2VUaHJvd3NDb21wYXRpYmxlV2l0aFR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvY29uc3RyYWludGZvcm11bGFzL01ldGhvZFJlZmVyZW5jZVRocm93c0NvbXBhdGlibGVXaXRoVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWUzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9NZXRob2RSZWZlcmVuY2VUaHJvd3NDb21wYXRpYmxlV2l0aFR5cGUuamF2YQpAQCAtMCwwICsxLDYyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmNvbnN0cmFpbnRmb3JtdWxhczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5Cb3VuZFNldDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5Db25zdHJhaW50Rm9ybXVsYTsKKworLyoqCisgKiBUaGUgY2hlY2tlZCBleGNlcHRpb25zIHRocm93biBieSB0aGUgcmVmZXJlbmNlZCBtZXRob2QgYXJlIGRlY2xhcmVkIGJ5IHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBmdW5jdGlvbiB0eXBlCisgKiBkZXJpdmVkIGZyb20gVC4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZFJlZmVyZW5jZVRocm93c0NvbXBhdGlibGVXaXRoVHlwZSBleHRlbmRzIENvbnN0cmFpbnRGb3JtdWxhIHsKKyAgICBwcml2YXRlIE1ldGhvZFJlZmVyZW5jZUV4cHIgbWV0aG9kUmVmZXJlbmNlOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIFQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVkdWN0aW9uUmVzdWx0IHJlZHVjZShCb3VuZFNldCBjdXJyZW50Qm91bmRTZXQpIHsKKyAgICAgICAgLy8gQSBjb25zdHJhaW50IGZvcm11bGEgb2YgdGhlIGZvcm0g4oC5TWV0aG9kUmVmZXJlbmNlIOKGknRocm93cyBU4oC6IGlzIHJlZHVjZWQgYXMgZm9sbG93czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiBUIGlzIG5vdCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHR5cGUsIG9yIGlmIFQgaXMgYSBmdW5jdGlvbmFsIGludGVyZmFjZSB0eXBlIGJ1dCBkb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gdHlwZSAowqc5LjkpLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorICAgICAgICAvLworICAgICAgICAvLyAtIE90aGVyd2lzZSwgbGV0IHRoZSB0YXJnZXQgZnVuY3Rpb24gdHlwZSBmb3IgdGhlIG1ldGhvZCByZWZlcmVuY2UgZXhwcmVzc2lvbiBiZSB0aGUgZnVuY3Rpb24gdHlwZSBvZiBULiBJZiB0aGUgbWV0aG9kIHJlZmVyZW5jZSBpcyBpbmV4YWN0ICjCpzE1LjEzLjEpIGFuZCBvbmUgb3IgbW9yZSBvZiB0aGUgZnVuY3Rpb24gdHlwZSdzIHBhcmFtZXRlciB0eXBlcyBpcyBub3QgYSBwcm9wZXIgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBPdGhlcndpc2UsIGlmIHRoZSBtZXRob2QgcmVmZXJlbmNlIGlzIGluZXhhY3QgYW5kIHRoZSBmdW5jdGlvbiB0eXBlJ3MgcmVzdWx0IGlzIG5laXRoZXIgdm9pZCBub3IgYSBwcm9wZXIgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byBmYWxzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBPdGhlcndpc2UsIGxldCBFMSwgLi4uLCBFbiBiZSB0aGUgdHlwZXMgaW4gdGhlIGZ1bmN0aW9uIHR5cGUncyB0aHJvd3MgY2xhdXNlIHRoYXQgYXJlIG5vdCBwcm9wZXIgdHlwZXMuIExldCBYMSwgLi4uLCBYbSBiZSB0aGUgY2hlY2tlZCBleGNlcHRpb25zIGluIHRoZSB0aHJvd3MgY2xhdXNlIG9mIHRoZSBpbnZvY2F0aW9uIHR5cGUgb2YgdGhlIG1ldGhvZCByZWZlcmVuY2UncyBjb21waWxlLXRpbWUgZGVjbGFyYXRpb24gKMKnMTUuMTMuMikgKGFzIGRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24gdHlwZSdzIHBhcmFtZXRlciB0eXBlcyBhbmQgcmV0dXJuIHR5cGUpLiBUaGVuIHRoZXJlIGFyZSB0d28gY2FzZXM6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSBJZiBuID0gMCAodGhlIGZ1bmN0aW9uIHR5cGUncyB0aHJvd3MgY2xhdXNlIGNvbnNpc3RzIG9ubHkgb2YgcHJvcGVyIHR5cGVzKSwgdGhlbiBpZiB0aGVyZSBleGlzdHMgc29tZSBpICgxIOKJpCBpIOKJpCBtKSBzdWNoIHRoYXQgWGkgaXMgbm90IGEgc3VidHlwZSBvZiBhbnkgcHJvcGVyIHR5cGUgaW4gdGhlIHRocm93cyBjbGF1c2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2U7IG90aGVyd2lzZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlLgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gSWYgbiA+IDAsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gYSBzZXQgb2Ygc3VidHlwaW5nIGNvbnN0cmFpbnRzOiBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG0pLCBpZiBYaSBpcyBub3QgYSBzdWJ0eXBlIG9mIGFueSBwcm9wZXIgdHlwZSBpbiB0aGUgdGhyb3dzIGNsYXVzZSwgdGhlbiB0aGUgY29uc3RyYWludHMgaW5jbHVkZSwgZm9yIGFsbCBqICgxIOKJpCBqIOKJpCBuKSwg4oC5WGkgPDogRWrigLouIEluIGFkZGl0aW9uLCBmb3IgYWxsIGogKDEg4omkIGog4omkIG4pLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRoZSBib3VuZCB0aHJvd3MgRWouCisKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgTWV0aG9kUmVmZXJlbmNlVGhyb3dzQ29tcGF0aWJsZVdpdGhUeXBlIHRoYXQgPSAoTWV0aG9kUmVmZXJlbmNlVGhyb3dzQ29tcGF0aWJsZVdpdGhUeXBlKSBvOworCisgICAgICAgIGlmICghbWV0aG9kUmVmZXJlbmNlLmVxdWFscyh0aGF0Lm1ldGhvZFJlZmVyZW5jZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFQuZXF1YWxzKHRoYXQuVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IG1ldGhvZFJlZmVyZW5jZS5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIFQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1ldGhvZFJlZmVyZW5jZVRocm93c0NvbXBhdGlibGVXaXRoVHlwZXsiICsKKyAgICAgICAgICAgICAgICAibWV0aG9kUmVmZXJlbmNlPSIgKyBtZXRob2RSZWZlcmVuY2UgKworICAgICAgICAgICAgICAgICIsIFQ9IiArIFQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9UeXBlQ29tcGF0aWJsZVdpdGhUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9UeXBlQ29tcGF0aWJsZVdpdGhUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMzA2NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvY29uc3RyYWludGZvcm11bGFzL1R5cGVDb21wYXRpYmxlV2l0aFR5cGUuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5jb25zdHJhaW50Zm9ybXVsYXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkJvdW5kU2V0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkNvbnN0cmFpbnRGb3JtdWxhOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLmlzQ29tcGF0aWJsZUluQUxvb3NlSW52b2NhdGlvbkNvbnRleHQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLlR5cGVIZWxwZXIuaXNQcm9wZXJUeXBlOworCisvKioKKyAqIEEgdHlwZSBTIGlzIGNvbXBhdGlibGUgaW4gYSBsb29zZSBpbnZvY2F0aW9uIGNvbnRleHQgd2l0aCB0eXBlIFQKKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFR5cGVDb21wYXRpYmxlV2l0aFR5cGUgZXh0ZW5kcyBDb25zdHJhaW50Rm9ybXVsYSB7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgczsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSB0OworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHVibGljIFR5cGVDb21wYXRpYmxlV2l0aFR5cGUoVHlwZVNvbHZlciB0eXBlU29sdmVyLCBSZXNvbHZlZFR5cGUgcywgUmVzb2x2ZWRUeXBlIHQpIHsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgdGhpcy50ID0gdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVkdWN0aW9uUmVzdWx0IHJlZHVjZShCb3VuZFNldCBjdXJyZW50Qm91bmRTZXQpIHsKKyAgICAgICAgLy8gQSBjb25zdHJhaW50IGZvcm11bGEgb2YgdGhlIGZvcm0g4oC5UyDihpIgVOKAuiBpcyByZWR1Y2VkIGFzIGZvbGxvd3M6CisgICAgICAgIC8vCisgICAgICAgIC8vIDEuIElmIFMgYW5kIFQgYXJlIHByb3BlciB0eXBlcywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlIGlmIFMgaXMgY29tcGF0aWJsZSBpbiBhIGxvb3NlIGludm9jYXRpb24gY29udGV4dCB3aXRoIFQgKMKnNS4zKSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKworICAgICAgICBpZiAoaXNQcm9wZXJUeXBlKHMpICYmIGlzUHJvcGVyVHlwZSh0KSkgeworICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZUluQUxvb3NlSW52b2NhdGlvbkNvbnRleHQocywgdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LnRydWVSZXN1bHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5mYWxzZVJlc3VsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBTIGlzIGEgcHJpbWl0aXZlIHR5cGUsIGxldCBTJyBiZSB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGJveGluZyBjb252ZXJzaW9uICjCpzUuMS43KSB0byBTLiBUaGVuIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8g4oC5Uycg4oaSIFTigLouCisKKyAgICAgICAgaWYgKHMuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgUmVmbGVjdGlvblR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICAgICAgUmVzb2x2ZWRUeXBlIHNGaXJzdCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShzLmFzUHJpbWl0aXZlKCkuZ2V0Qm94VHlwZVFOYW1lKCkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQub25lQ29uc3RyYWludChuZXcgVHlwZUNvbXBhdGlibGVXaXRoVHlwZSh0eXBlU29sdmVyLCBzRmlyc3QsIHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgVCBpcyBhIHByaW1pdGl2ZSB0eXBlLCBsZXQgVCcgYmUgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBib3hpbmcgY29udmVyc2lvbiAowqc1LjEuNykgdG8gVC4gVGhlbiB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIOKAuVMgPSBUJ+KAui4KKworICAgICAgICBpZiAodC5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBSZWZsZWN0aW9uVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgdEZpcnN0ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVTb2x2ZXIuc29sdmVUeXBlKHQuYXNQcmltaXRpdmUoKS5nZXRCb3hUeXBlUU5hbWUoKSksIHR5cGVTb2x2ZXIpOworICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5vbmVDb25zdHJhaW50KG5ldyBUeXBlU2FtZUFzVHlwZShzLCB0Rmlyc3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBmb3VydGggYW5kIGZpZnRoIGNhc2VzIGFyZSBpbXBsaWNpdCB1c2VzIG9mIHVuY2hlY2tlZCBjb252ZXJzaW9uICjCpzUuMS45KS4gVGhlc2UsIGFsb25nIHdpdGggYW55IHVzZSBvZgorICAgICAgICAvLyB1bmNoZWNrZWQgY29udmVyc2lvbiBpbiB0aGUgZmlyc3QgY2FzZSwgbWF5IHJlc3VsdCBpbiBjb21waWxlLXRpbWUgdW5jaGVja2VkIHdhcm5pbmdzLCBhbmQgbWF5IGluZmx1ZW5jZSBhCisgICAgICAgIC8vIG1ldGhvZCdzIGludm9jYXRpb24gdHlwZSAowqcxNS4xMi4yLjYpLgorCisgICAgICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgVCBpcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSBvZiB0aGUgZm9ybSBHPFQxLCAuLi4sIFRuPiwgYW5kIHRoZXJlIGV4aXN0cyBubyB0eXBlIG9mIHRoZQorICAgICAgICAvLyAgICBmb3JtIEc8Li4uPiB0aGF0IGlzIGEgc3VwZXJ0eXBlIG9mIFMsIGJ1dCB0aGUgcmF3IHR5cGUgRyBpcyBhIHN1cGVydHlwZSBvZiBTLCB0aGVuIHRoZSBjb25zdHJhaW50IHJlZHVjZXMKKyAgICAgICAgLy8gICAgdG8gdHJ1ZS4KKworICAgICAgICBpZiAodC5pc1JlZmVyZW5jZVR5cGUoKSAmJiAhdC5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRUeXBlUGFyYW1ldGVycygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gRklYTUUgSSByZWFsbHkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCB0aGUgc3BlY2lmaWNhdGlvbiBtZWFucy4uLgorCisgICAgICAgICAgICAvLyB0aGVyZSBleGlzdHMgYSB0eXBlIG9mIHRoZSBmb3JtIEc8Li4uPiB0aGF0IGlzIGEgc3VwZXJ0eXBlIG9mIFM/CisgICAgICAgICAgICBib29sZWFuIGNvbmRpdGlvbjEgPSB0LmlzQXNzaWduYWJsZUJ5KHMpOworCisgICAgICAgICAgICAvLyB0aGUgcmF3IHR5cGUgRyBpcyBhIHN1cGVydHlwZSBvZiBTCisgICAgICAgICAgICBSZXNvbHZlZFR5cGUgRyA9IHQuYXNSZWZlcmVuY2VUeXBlKCkudG9SYXdUeXBlKCk7CisgICAgICAgICAgICBib29sZWFuIGNvbmRpdGlvbjIgPSBHLmlzQXNzaWduYWJsZUJ5KHMpOworCisgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbjEgJiYgY29uZGl0aW9uMikgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQudHJ1ZVJlc3VsdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3Rocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gNS4gT3RoZXJ3aXNlLCBpZiBUIGlzIGFuIGFycmF5IHR5cGUgb2YgdGhlIGZvcm0gRzxUMSwgLi4uLCBUbj5bXWssIGFuZCB0aGVyZSBleGlzdHMgbm8gdHlwZSBvZiB0aGUgZm9ybQorICAgICAgICAvLyAgICBHPC4uLj5bXWsgdGhhdCBpcyBhIHN1cGVydHlwZSBvZiBTLCBidXQgdGhlIHJhdyB0eXBlIEdbXWsgaXMgYSBzdXBlcnR5cGUgb2YgUywgdGhlbiB0aGUgY29uc3RyYWludAorICAgICAgICAvLyAgICByZWR1Y2VzIHRvIHRydWUuIChUaGUgbm90YXRpb24gW11rIGluZGljYXRlcyBhbiBhcnJheSB0eXBlIG9mIGsgZGltZW5zaW9ucy4pCisKKyAgICAgICAgaWYgKHQuaXNBcnJheSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDYuIE90aGVyd2lzZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlTIDw6IFTigLoKKworICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LmVtcHR5KCkud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTdWJ0eXBlT2ZUeXBlKHR5cGVTb2x2ZXIsIHMsIHQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBUeXBlQ29tcGF0aWJsZVdpdGhUeXBlIHRoYXQgPSAoVHlwZUNvbXBhdGlibGVXaXRoVHlwZSkgbzsKKworICAgICAgICBpZiAoIXMuZXF1YWxzKHRoYXQucykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHQuZXF1YWxzKHRoYXQudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHMuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyB0Lmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJUeXBlQ29tcGF0aWJsZVdpdGhUeXBleyIgKworICAgICAgICAgICAgICAgICJzPSIgKyBzICsKKyAgICAgICAgICAgICAgICAiLCB0PSIgKyB0ICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvVHlwZUNvbnRhaW5lZEJ5VHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvVHlwZUNvbnRhaW5lZEJ5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTI3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9UeXBlQ29udGFpbmVkQnlUeXBlLmphdmEKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5jb25zdHJhaW50Zm9ybXVsYXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQm91bmRTZXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQ29uc3RyYWludEZvcm11bGE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuVHlwZUhlbHBlci5pc1Byb3BlclR5cGU7CisKKy8qKgorICogQSB0eXBlIGFyZ3VtZW50IFMgaXMgY29udGFpbmVkIGJ5IGEgdHlwZSBhcmd1bWVudCBUCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlQ29udGFpbmVkQnlUeXBlIGV4dGVuZHMgQ29uc3RyYWludEZvcm11bGEgeworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIFM7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgVDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWR1Y3Rpb25SZXN1bHQgcmVkdWNlKEJvdW5kU2V0IGN1cnJlbnRCb3VuZFNldCkgeworICAgICAgICAvLyBBIGNvbnN0cmFpbnQgZm9ybXVsYSBvZiB0aGUgZm9ybSDigLlTIDw9IFTigLosIHdoZXJlIFMgYW5kIFQgYXJlIHR5cGUgYXJndW1lbnRzICjCpzQuNS4xKSwgaXMgcmVkdWNlZCBhcyBmb2xsb3dzOgorICAgICAgICAvLworICAgICAgICAvLyAtIElmIFQgaXMgYSB0eXBlOgorCisgICAgICAgIGlmIChpc1Byb3BlclR5cGUoVCkgJiYgIVQuaXNXaWxkY2FyZCgpKSB7CisKKyAgICAgICAgICAgIC8vICAgLSBJZiBTIGlzIGEgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlTID0gVOKAui4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gSWYgUyBpcyBhIHdpbGRjYXJkLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gSWYgVCBpcyBhIHdpbGRjYXJkIG9mIHRoZSBmb3JtID8sIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gdHJ1ZS4KKworICAgICAgICBpZiAoVC5pc1dpbGRjYXJkKCkgJiYgIVQuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LnRydWVSZXN1bHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gSWYgVCBpcyBhIHdpbGRjYXJkIG9mIHRoZSBmb3JtID8gZXh0ZW5kcyBUJzoKKworICAgICAgICBpZiAoVC5pc1dpbGRjYXJkKCkgJiYgVC5hc1dpbGRjYXJkKCkuaXNFeHRlbmRzKCkpIHsKKworICAgICAgICAgICAgLy8gICAtIElmIFMgaXMgYSB0eXBlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIOKAuVMgPDogVCfigLouCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAtIElmIFMgaXMgYSB3aWxkY2FyZCBvZiB0aGUgZm9ybSA/LCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIOKAuU9iamVjdCA8OiBUJ+KAui4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gSWYgUyBpcyBhIHdpbGRjYXJkIG9mIHRoZSBmb3JtID8gZXh0ZW5kcyBTJywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlTJyA8OiBUJ+KAui4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gSWYgUyBpcyBhIHdpbGRjYXJkIG9mIHRoZSBmb3JtID8gc3VwZXIgUycsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8g4oC5T2JqZWN0ID0gVCfigLouCisKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gLSBJZiBUIGlzIGEgd2lsZGNhcmQgb2YgdGhlIGZvcm0gPyBzdXBlciBUJzoKKworICAgICAgICBpZiAoVC5pc1dpbGRjYXJkKCkgJiYgVC5hc1dpbGRjYXJkKCkuaXNTdXBlcigpKSB7CisKKyAgICAgICAgICAgIC8vICAgLSBJZiBTIGlzIGEgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlUJyA8OiBT4oC6LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgLSBJZiBTIGlzIGEgd2lsZGNhcmQgb2YgdGhlIGZvcm0gPyBzdXBlciBTJywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlUJyA8OiBTJ+KAui4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFR5cGVDb250YWluZWRCeVR5cGUgdGhhdCA9IChUeXBlQ29udGFpbmVkQnlUeXBlKSBvOworCisgICAgICAgIGlmICghUy5lcXVhbHModGhhdC5TKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gVC5lcXVhbHModGhhdC5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gUy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIFQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlR5cGVDb250YWluZWRCeVR5cGV7IiArCisgICAgICAgICAgICAgICAgIlM9IiArIFMgKworICAgICAgICAgICAgICAgICIsIFQ9IiArIFQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9UeXBlU2FtZUFzVHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvVHlwZVNhbWVBc1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJkYzUxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvVHlwZVNhbWVBc1R5cGUuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5jb25zdHJhaW50Zm9ybXVsYXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQm91bmRTZXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQ29uc3RyYWludEZvcm11bGE7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuYm91bmRzLlNhbWVBc0JvdW5kOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuVHlwZUhlbHBlci5pc0luZmVyZW5jZVZhcmlhYmxlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLmlzUHJvcGVyVHlwZTsKKworLyoqCisgKiBBIHR5cGUgUyBpcyB0aGUgc2FtZSBhcyBhIHR5cGUgVCAowqc0LjMuNCksIG9yIGEgdHlwZSBhcmd1bWVudCBTIGlzIHRoZSBzYW1lIGFzIHR5cGUgYXJndW1lbnQgVAorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgVHlwZVNhbWVBc1R5cGUgZXh0ZW5kcyBDb25zdHJhaW50Rm9ybXVsYSB7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgUzsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBUOworCisgICAgcHVibGljIFR5cGVTYW1lQXNUeXBlKFJlc29sdmVkVHlwZSBzLCBSZXNvbHZlZFR5cGUgdCkgeworICAgICAgICBTID0gczsKKyAgICAgICAgVCA9IHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlZHVjdGlvblJlc3VsdCByZWR1Y2UoQm91bmRTZXQgY3VycmVudEJvdW5kU2V0KSB7CisgICAgICAgIC8vIEEgY29uc3RyYWludCBmb3JtdWxhIG9mIHRoZSBmb3JtIOKAuVMgPSBU4oC6LCB3aGVyZSBTIGFuZCBUIGFyZSB0eXBlcywgaXMgcmVkdWNlZCBhcyBmb2xsb3dzOgorCisgICAgICAgIGlmICghUy5pc1dpbGRjYXJkKCkgJiYgIVQuaXNXaWxkY2FyZCgpKSB7CisKKyAgICAgICAgICAgIC8vIC0gSWYgUyBhbmQgVCBhcmUgcHJvcGVyIHR5cGVzLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRydWUgaWYgUyBpcyB0aGUgc2FtZSBhcyBUICjCpzQuMy40KSwgYW5kIGZhbHNlCisgICAgICAgICAgICAvLyAgIG90aGVyd2lzZS4KKworICAgICAgICAgICAgaWYgKGlzUHJvcGVyVHlwZShTKSAmJiBpc1Byb3BlclR5cGUoVCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUy5lcXVhbHMoVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC50cnVlUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5mYWxzZVJlc3VsdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGlmIFMgb3IgVCBpcyB0aGUgbnVsbCB0eXBlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorCisgICAgICAgICAgICBpZiAoUy5pc051bGwoKSB8fCBULmlzTnVsbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5mYWxzZVJlc3VsdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgaWYgUyBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGUsIM6xLCBhbmQgVCBpcyBub3QgYSBwcmltaXRpdmUgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0aGUKKyAgICAgICAgICAgIC8vICAgYm91bmQgzrEgPSBULgorCisgICAgICAgICAgICBpZiAoaXNJbmZlcmVuY2VWYXJpYWJsZShTKSAmJiAhVC5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5vbmVCb3VuZChuZXcgU2FtZUFzQm91bmQoUywgVCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgaWYgVCBpcyBhbiBpbmZlcmVuY2UgdmFyaWFibGUsIM6xLCBhbmQgUyBpcyBub3QgYSBwcmltaXRpdmUgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0aGUKKyAgICAgICAgICAgIC8vICAgYm91bmQgUyA9IM6xLgorCisgICAgICAgICAgICBpZiAoaXNJbmZlcmVuY2VWYXJpYWJsZShUKSAmJiAhUy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC5vbmVCb3VuZChuZXcgU2FtZUFzQm91bmQoUywgVCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgaWYgUyBhbmQgVCBhcmUgY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGVzIHdpdGggdGhlIHNhbWUgZXJhc3VyZSwgd2hlcmUgUyBoYXMKKyAgICAgICAgICAgIC8vICAgdHlwZSBhcmd1bWVudHMgQjEsIC4uLiwgQm4gYW5kIFQgaGFzIHR5cGUgYXJndW1lbnRzIEExLCAuLi4sIEFuLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIC8vICAgbmV3IGNvbnN0cmFpbnRzOiBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG4pLCDigLlCaSA9IEFp4oC6LgorCisgICAgICAgICAgICBpZiAoUy5pc1JlZmVyZW5jZVR5cGUoKSAmJiBULmlzUmVmZXJlbmNlVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICYmIFMuYXNSZWZlcmVuY2VUeXBlKCkudG9SYXdUeXBlKCkuZXF1YWxzKFQuYXNSZWZlcmVuY2VUeXBlKCkudG9SYXdUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgUmVkdWN0aW9uUmVzdWx0IHJlcyA9IFJlZHVjdGlvblJlc3VsdC5lbXB0eSgpOworICAgICAgICAgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBCcyA9IFMuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFJlc29sdmVkVHlwZT4gQXMgPSBULmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTYW1lQXNUeXBlKEJzLmdldChpKSwgQXMuZ2V0KGkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBpZiBTIGFuZCBUIGFyZSBhcnJheSB0eXBlcywgUydbXSBhbmQgVCdbXSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlTJyA9IFQn4oC6LgorCisgICAgICAgICAgICBpZiAoUy5pc0FycmF5KCkgJiYgVC5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0Lm9uZUNvbnN0cmFpbnQobmV3IFR5cGVTYW1lQXNUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgUy5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisKKyAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQuZmFsc2VSZXN1bHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgYWRkcmVzcyBpbnRlcnNlY3Rpb24gdHlwZXMgYWJvdmUsIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZSBmb3IgcmVkdWN0aW9uIHRvIGVuY291bnRlciBhbgorICAgICAgICAvLyBpbnRlcnNlY3Rpb24gdHlwZSB0aGF0IGlzIG5vdCBhIHByb3BlciB0eXBlLgorCisgICAgICAgIC8vIEEgY29uc3RyYWludCBmb3JtdWxhIG9mIHRoZSBmb3JtIOKAuVMgPSBU4oC6LCB3aGVyZSBTIGFuZCBUIGFyZSB0eXBlIGFyZ3VtZW50cyAowqc0LjUuMSksIGlzIHJlZHVjZWQgYXMgZm9sbG93czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiBTIGFuZCBUIGFyZSB0eXBlcywgdGhlIGNvbnN0cmFpbnQgaXMgcmVkdWNlZCBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gSWYgUyBoYXMgdGhlIGZvcm0gPyBhbmQgVCBoYXMgdGhlIGZvcm0gPywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlLgorICAgICAgICAvLworICAgICAgICAvLyAtIElmIFMgaGFzIHRoZSBmb3JtID8gYW5kIFQgaGFzIHRoZSBmb3JtID8gZXh0ZW5kcyBUJywgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlPYmplY3QgPSBUJ+KAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiBTIGhhcyB0aGUgZm9ybSA/IGV4dGVuZHMgUycgYW5kIFQgaGFzIHRoZSBmb3JtID8sIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8g4oC5UycgPSBPYmplY3TigLouCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gSWYgUyBoYXMgdGhlIGZvcm0gPyBleHRlbmRzIFMnIGFuZCBUIGhhcyB0aGUgZm9ybSA/IGV4dGVuZHMgVCcsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8g4oC5UycgPSBUJ+KAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiBTIGhhcyB0aGUgZm9ybSA/IHN1cGVyIFMnIGFuZCBUIGhhcyB0aGUgZm9ybSA/IHN1cGVyIFQnLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIOKAuVMnID0gVCfigLouCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorCisKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgVHlwZVNhbWVBc1R5cGUgdGhhdCA9IChUeXBlU2FtZUFzVHlwZSkgbzsKKworICAgICAgICBpZiAoIVMuZXF1YWxzKHRoYXQuUykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFQuZXF1YWxzKHRoYXQuVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IFMuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBULmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJUeXBlU2FtZUFzVHlwZXsiICsKKyAgICAgICAgICAgICAgICAiUz0iICsgUyArCisgICAgICAgICAgICAgICAgIiwgVD0iICsgVCArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvY29uc3RyYWludGZvcm11bGFzL1R5cGVTdWJ0eXBlT2ZUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9UeXBlU3VidHlwZU9mVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzdmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9UeXBlU3VidHlwZU9mVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmNvbnN0cmFpbnRmb3JtdWxhczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkSW50ZXJzZWN0aW9uVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLk51bGxUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkJvdW5kU2V0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLkNvbnN0cmFpbnRGb3JtdWxhOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmJvdW5kcy5TdWJ0eXBlT2ZCb3VuZDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5UeXBlSGVscGVyLmlzSW5mZXJlbmNlVmFyaWFibGU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLlR5cGVIZWxwZXIuaXNQcm9wZXJUeXBlOworCisvKioKKyAqIEEgcmVmZXJlbmNlIHR5cGUgUyBpcyBhIHN1YnR5cGUgb2YgYSByZWZlcmVuY2UgdHlwZSBUCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlU3VidHlwZU9mVHlwZSBleHRlbmRzIENvbnN0cmFpbnRGb3JtdWxhIHsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBTOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIFQ7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwdWJsaWMgVHlwZVN1YnR5cGVPZlR5cGUoVHlwZVNvbHZlciB0eXBlU29sdmVyLCBSZXNvbHZlZFR5cGUgUywgUmVzb2x2ZWRUeXBlIFQpIHsKKyAgICAgICAgdGhpcy50eXBlU29sdmVyID0gdHlwZVNvbHZlcjsKKyAgICAgICAgdGhpcy5TID0gUzsKKyAgICAgICAgdGhpcy5UID0gVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVkdWN0aW9uUmVzdWx0IHJlZHVjZShCb3VuZFNldCBjdXJyZW50Qm91bmRTZXQpIHsKKyAgICAgICAgLy8gQSBjb25zdHJhaW50IGZvcm11bGEgb2YgdGhlIGZvcm0g4oC5UyA8OiBU4oC6IGlzIHJlZHVjZWQgYXMgZm9sbG93czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBJZiBTIGFuZCBUIGFyZSBwcm9wZXIgdHlwZXMsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gdHJ1ZSBpZiBTIGlzIGEgc3VidHlwZSBvZiBUICjCpzQuMTApLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorCisgICAgICAgIGlmIChpc1Byb3BlclR5cGUoUykgJiYgaXNQcm9wZXJUeXBlKFQpKSB7CisgICAgICAgICAgICBpZiAoVC5pc0Fzc2lnbmFibGVCeShTKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQudHJ1ZVJlc3VsdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVkdWN0aW9uUmVzdWx0LmZhbHNlUmVzdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtIE90aGVyd2lzZSwgaWYgUyBpcyB0aGUgbnVsbCB0eXBlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRydWUuCisKKyAgICAgICAgaWYgKFMgaW5zdGFuY2VvZiBOdWxsVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIFJlZHVjdGlvblJlc3VsdC50cnVlUmVzdWx0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyAtIE90aGVyd2lzZSwgaWYgVCBpcyB0aGUgbnVsbCB0eXBlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLgorCisgICAgICAgIGlmIChUIGluc3RhbmNlb2YgTnVsbFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQuZmFsc2VSZXN1bHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBpZiBTIGlzIGFuIGluZmVyZW5jZSB2YXJpYWJsZSwgzrEsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gdGhlIGJvdW5kIM6xIDw6IFQuCisKKyAgICAgICAgaWYgKGlzSW5mZXJlbmNlVmFyaWFibGUoUykpIHsKKyAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQub25lQm91bmQobmV3IFN1YnR5cGVPZkJvdW5kKFMsIFQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBpZiBUIGlzIGFuIGluZmVyZW5jZSB2YXJpYWJsZSwgzrEsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gdGhlIGJvdW5kIFMgPDogzrEuCisKKyAgICAgICAgaWYgKGlzSW5mZXJlbmNlVmFyaWFibGUoVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQub25lQm91bmQobmV3IFN1YnR5cGVPZkJvdW5kKFMsIFQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZFREVSSUNPIC0gQWRkZWQgc3RhcnQKKyAgICAgICAgLy9pZiAoVC5pc1R5cGVWYXJpYWJsZSgpKSB7CisgICAgICAgIC8vICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQub25lQm91bmQobmV3IFN1YnR5cGVPZkJvdW5kKFMsIFQpKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vIEZFREVSSUNPIC0gQWRkZWQgZW5kCisKKyAgICAgICAgLy8gLSBPdGhlcndpc2UsIHRoZSBjb25zdHJhaW50IGlzIHJlZHVjZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtIG9mIFQ6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSBJZiBUIGlzIGEgcGFyYW1ldGVyaXplZCBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZSwgb3IgYW4gaW5uZXIgY2xhc3MgdHlwZSBvZiBhIHBhcmFtZXRlcml6ZWQgY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGUgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpLCBsZXQgQTEsIC4uLiwgQW4gYmUgdGhlIHR5cGUgYXJndW1lbnRzIG9mIFQuIEFtb25nIHRoZSBzdXBlcnR5cGVzIG9mIFMsIGEgY29ycmVzcG9uZGluZyBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZSBpcyBpZGVudGlmaWVkLCB3aXRoIHR5cGUgYXJndW1lbnRzIEIxLCAuLi4sIEJuLiBJZiBubyBzdWNoIHR5cGUgZXhpc3RzLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIGZhbHNlLiBPdGhlcndpc2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gdGhlIGZvbGxvd2luZyBuZXcgY29uc3RyYWludHM6IGZvciBhbGwgaSAoMSDiiaQgaSDiiaQgbiksIOKAuUJpIDw9IEFp4oC6LgorICAgICAgICAvLworICAgICAgICAvLyAgIC0gSWYgVCBpcyBhbnkgb3RoZXIgY2xhc3Mgb3IgaW50ZXJmYWNlIHR5cGUsIHRoZW4gdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlIGlmIFQgaXMgYW1vbmcgdGhlIHN1cGVydHlwZXMgb2YgUywgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIElmIFQgaXMgYW4gYXJyYXkgdHlwZSwgVCdbXSwgdGhlbiBhbW9uZyB0aGUgc3VwZXJ0eXBlcyBvZiBTIHRoYXQgYXJlIGFycmF5IHR5cGVzLCBhIG1vc3Qgc3BlY2lmaWMgdHlwZSBpcyBpZGVudGlmaWVkLCBTJ1tdICh0aGlzIG1heSBiZSBTIGl0c2VsZikuIElmIG5vIHN1Y2ggYXJyYXkgdHlwZSBleGlzdHMsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuIE90aGVyd2lzZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gSWYgbmVpdGhlciBTJyBub3IgVCcgaXMgYSBwcmltaXRpdmUgdHlwZSwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byDigLlTJyA8OiBUJ+KAui4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIC0gT3RoZXJ3aXNlLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRydWUgaWYgUycgYW5kIFQnIGFyZSB0aGUgc2FtZSBwcmltaXRpdmUgdHlwZSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAtIElmIFQgaXMgYSB0eXBlIHZhcmlhYmxlLCB0aGVyZSBhcmUgdGhyZWUgY2FzZXM6CisKKyAgICAgICAgaWYgKFQuaXNUeXBlVmFyaWFibGUoKSkgeworCisgICAgICAgICAgICAvLyAgICAgLSBJZiBTIGlzIGFuIGludGVyc2VjdGlvbiB0eXBlIG9mIHdoaWNoIFQgaXMgYW4gZWxlbWVudCwgdGhlIGNvbnN0cmFpbnQgcmVkdWNlcyB0byB0cnVlLgorCisgICAgICAgICAgICBpZiAoUyBpbnN0YW5jZW9mIFJlc29sdmVkSW50ZXJzZWN0aW9uVHlwZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAgICAgLSBPdGhlcndpc2UsIGlmIFQgaGFzIGEgbG93ZXIgYm91bmQsIEIsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8g4oC5UyA8OiBC4oC6LgorCisgICAgICAgICAgICBpZiAoVC5hc1R5cGVWYXJpYWJsZSgpLmFzVHlwZVBhcmFtZXRlcigpLmhhc0xvd2VyQm91bmQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQub25lQ29uc3RyYWludChuZXcgVHlwZVN1YnR5cGVPZlR5cGUodHlwZVNvbHZlciwgUywgVC5hc1R5cGVWYXJpYWJsZSgpLmFzVHlwZVBhcmFtZXRlcigpLmdldExvd2VyQm91bmQoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAgICAgLSBPdGhlcndpc2UsIHRoZSBjb25zdHJhaW50IHJlZHVjZXMgdG8gZmFsc2UuCisKKyAgICAgICAgICAgIHJldHVybiBSZWR1Y3Rpb25SZXN1bHQuZmFsc2VSZXN1bHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vICAgLSBJZiBUIGlzIGFuIGludGVyc2VjdGlvbiB0eXBlLCBJMSAmIC4uLiAmIEluLCB0aGUgY29uc3RyYWludCByZWR1Y2VzIHRvIHRoZSBmb2xsb3dpbmcgbmV3IGNvbnN0cmFpbnRzOiBmb3IgYWxsIGkgKDEg4omkIGkg4omkIG4pLCDigLlTIDw6IElp4oC6LgorICAgICAgICAvLworCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUyA9ICIrIFMgKyAiLCBUID0gIiArIFQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIFR5cGVTdWJ0eXBlT2ZUeXBlIHRoYXQgPSAoVHlwZVN1YnR5cGVPZlR5cGUpIG87CisKKyAgICAgICAgaWYgKCFTLmVxdWFscyh0aGF0LlMpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBULmVxdWFscyh0aGF0LlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBTLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgVC5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVHlwZVN1YnR5cGVPZlR5cGV7IiArCisgICAgICAgICAgICAgICAgIlM9IiArIFMgKworICAgICAgICAgICAgICAgICIsIFQ9IiArIFQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9BYXJUeXBlU29sdmVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9BYXJUeXBlU29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMWVmMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0FhclR5cGVTb2x2ZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEFhclR5cGVTb2x2ZXIgaW1wbGVtZW50cyBUeXBlU29sdmVyIHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciBwYXJlbnQ7CisgICAgcHJpdmF0ZSBGaWxlIGFhckZpbGU7CisgICAgcHJpdmF0ZSBKYXJUeXBlU29sdmVyIGRlbGVnYXRlOworCisgICAgcHVibGljIEFhclR5cGVTb2x2ZXIoRmlsZSBhYXJGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmFhckZpbGUgPSBhYXJGaWxlOworCisgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGFhckZpbGUpOworICAgICAgICBaaXBFbnRyeSBjbGFzc2VzSmFyRW50cnkgPSBqYXJGaWxlLmdldEVudHJ5KCJjbGFzc2VzLmphciIpOworICAgICAgICBpZiAoY2xhc3Nlc0phckVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVGhlIGdpdmVuIGZpbGUgKCVzKSBpcyBtYWxmb3JtZWQ6IGVudHJ5IGNsYXNzZXMuamFyIHdhcyBub3QgZm91bmQiLCBhYXJGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZWdhdGUgPSBuZXcgSmFyVHlwZVNvbHZlcihqYXJGaWxlLmdldElucHV0U3RyZWFtKGNsYXNzZXNKYXJFbnRyeSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlU29sdmVyIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVHlwZVNvbHZlciBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHJ5VG9Tb2x2ZVR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnRyeVRvU29sdmVUeXBlKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0NvbWJpbmVkVHlwZVNvbHZlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvQ29tYmluZWRUeXBlU29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5ZjM3NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0NvbWJpbmVkVHlwZVNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENvbWJpbmVkVHlwZVNvbHZlciBpbXBsZW1lbnRzIFR5cGVTb2x2ZXIgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHBhcmVudDsKKyAgICBwcml2YXRlIExpc3Q8VHlwZVNvbHZlcj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBDb21iaW5lZFR5cGVTb2x2ZXIoVHlwZVNvbHZlci4uLiBlbGVtZW50cykgeworICAgICAgICBmb3IgKFR5cGVTb2x2ZXIgZWwgOiBlbGVtZW50cykgeworICAgICAgICAgICAgYWRkKGVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlU29sdmVyIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVHlwZVNvbHZlciBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKFR5cGVTb2x2ZXIgdHlwZVNvbHZlcikgeworICAgICAgICB0aGlzLmVsZW1lbnRzLmFkZCh0eXBlU29sdmVyKTsKKyAgICAgICAgdHlwZVNvbHZlci5zZXRQYXJlbnQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHJ5VG9Tb2x2ZVR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChUeXBlU29sdmVyIHRzIDogZWxlbWVudHMpIHsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVzID0gdHMudHJ5VG9Tb2x2ZVR5cGUobmFtZSk7CisgICAgICAgICAgICBpZiAocmVzLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbiB7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVzID0gdHJ5VG9Tb2x2ZVR5cGUobmFtZSk7CisgICAgICAgIGlmIChyZXMuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0phclR5cGVTb2x2ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0phclR5cGVTb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U5Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvSmFyVHlwZVNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlCisgKiBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGphdmFzc2lzdC5DbGFzc1Bvb2w7CitpbXBvcnQgamF2YXNzaXN0LkN0Q2xhc3M7CitpbXBvcnQgamF2YXNzaXN0Lk5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSmFyVHlwZVNvbHZlciBpbXBsZW1lbnRzIFR5cGVTb2x2ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgSmFyVHlwZVNvbHZlciBpbnN0YW5jZTsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciBwYXJlbnQ7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDbGFzc3BhdGhFbGVtZW50PiBjbGFzc3BhdGhFbGVtZW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIENsYXNzUG9vbCBjbGFzc1Bvb2wgPSBuZXcgQ2xhc3NQb29sKGZhbHNlKTsKKworICAgIHB1YmxpYyBKYXJUeXBlU29sdmVyKFN0cmluZyBwYXRoVG9KYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFkZFBhdGhUb0phcihwYXRoVG9KYXIpOworICAgIH0KKworICAgIHB1YmxpYyBKYXJUeXBlU29sdmVyKElucHV0U3RyZWFtIGphcklucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhZGRQYXRoVG9KYXIoamFySW5wdXRTdHJlYW0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSmFyVHlwZVNvbHZlciBnZXRKYXJUeXBlU29sdmVyKFN0cmluZyBwYXRoVG9KYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBKYXJUeXBlU29sdmVyKHBhdGhUb0phcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnN0YW5jZS5hZGRQYXRoVG9KYXIocGF0aFRvSmFyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIGR1bXBUb1RlbXBGaWxlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiamFyX2ZpbGVfZnJvbV9pbnB1dF9zdHJlYW0iLCAiLmphciIpOworICAgICAgICB0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbOCAqIDEwMjRdOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZW1wRmlsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUGF0aFRvSmFyKElucHV0U3RyZWFtIGphcklucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhZGRQYXRoVG9KYXIoZHVtcFRvVGVtcEZpbGUoamFySW5wdXRTdHJlYW0pLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUGF0aFRvSmFyKFN0cmluZyBwYXRoVG9KYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGFzc1Bvb2wuYXBwZW5kQ2xhc3NQYXRoKHBhdGhUb0phcik7CisgICAgICAgICAgICBjbGFzc1Bvb2wuYXBwZW5kU3lzdGVtUGF0aCgpOworICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShwYXRoVG9KYXIpOworICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlID0gamFyRmlsZS5lbnRyaWVzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBlbnRyeSA9IGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsICYmICFlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5UGF0aFRvQ2xhc3NOYW1lKGVudHJ5LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY2xhc3NwYXRoRWxlbWVudHMucHV0KG5hbWUsIG5ldyBDbGFzc3BhdGhFbGVtZW50KGphckZpbGUsIGVudHJ5LCBuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZVNvbHZlciBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFR5cGVTb2x2ZXIgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGVudHJ5UGF0aFRvQ2xhc3NOYW1lKFN0cmluZyBlbnRyeVBhdGgpIHsKKyAgICAgICAgaWYgKCFlbnRyeVBhdGguZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGVudHJ5UGF0aC5zdWJzdHJpbmcoMCwgZW50cnlQYXRoLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOworICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7CisgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiB0cnlUb1NvbHZlVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVsZW1lbnRzLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGNsYXNzcGF0aEVsZW1lbnRzLmdldChuYW1lKS50b0N0Q2xhc3MoKSwgZ2V0Um9vdCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBzb2x2ZVR5cGUoU3RyaW5nIG5hbWUpIHRocm93cyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbiB7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVmID0gdHJ5VG9Tb2x2ZVR5cGUobmFtZSk7CisgICAgICAgIGlmIChyZWYuaXNTb2x2ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ2xhc3NwYXRoRWxlbWVudCB7CisgICAgICAgIHByaXZhdGUgSmFyRmlsZSBqYXJGaWxlOworICAgICAgICBwcml2YXRlIEphckVudHJ5IGVudHJ5OworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoOworCisgICAgICAgIENsYXNzcGF0aEVsZW1lbnQoSmFyRmlsZSBqYXJGaWxlLCBKYXJFbnRyeSBlbnRyeSwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMuamFyRmlsZSA9IGphckZpbGU7CisgICAgICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgQ3RDbGFzcyB0b0N0Q2xhc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzUG9vbC5tYWtlQ2xhc3MoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvSmF2YVBhcnNlclR5cGVTb2x2ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0phdmFQYXJzZXJUeXBlU29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlMzM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0phdmFQYXJzZXJUeXBlU29sdmVyLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyVHlwZVNvbHZlciBpbXBsZW1lbnRzIFR5cGVTb2x2ZXIgeworCisgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciBwYXJlbnQ7CisKKyAgICBwcml2YXRlIENhY2hlPFN0cmluZywgT3B0aW9uYWw8Q29tcGlsYXRpb25Vbml0Pj4gcGFyc2VkRmlsZXMgPSBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpLnNvZnRWYWx1ZXMoKS5idWlsZCgpOworICAgIHByaXZhdGUgQ2FjaGU8U3RyaW5nLCBMaXN0PENvbXBpbGF0aW9uVW5pdD4+IHBhcnNlZERpcmVjdG9yaWVzID0gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKS5zb2Z0VmFsdWVzKCkuYnVpbGQoKTsKKyAgICBwcml2YXRlIENhY2hlPFN0cmluZywgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPj4gZm91bmRUeXBlcyA9IENhY2hlQnVpbGRlci5uZXdCdWlsZGVyKCkuc29mdFZhbHVlcygpLmJ1aWxkKCk7CisKKyAgICBwdWJsaWMgSmF2YVBhcnNlclR5cGVTb2x2ZXIoRmlsZSBzcmNEaXIpIHsKKyAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkgfHwgIXNyY0Rpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTcmNEaXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5OiAiICsgc3JjRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNyY0RpciA9IHNyY0RpcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkphdmFQYXJzZXJUeXBlU29sdmVyeyIgKworICAgICAgICAgICAgICAgICJzcmNEaXI9IiArIHNyY0RpciArCisgICAgICAgICAgICAgICAgIiwgcGFyZW50PSIgKyBwYXJlbnQgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZVNvbHZlciBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFR5cGVTb2x2ZXIgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworCisgICAgcHJpdmF0ZSBPcHRpb25hbDxDb21waWxhdGlvblVuaXQ+IHBhcnNlKEZpbGUgc3JjRmlsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlZEZpbGVzLmdldChzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpLCAoKSAtPiB7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8Q29tcGlsYXRpb25Vbml0PiBjdTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjdSA9IE9wdGlvbmFsLm9mKEphdmFQYXJzZXIucGFyc2Uoc3JjRmlsZSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ID0gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIklzc3VlIHdoaWxlIHBhcnNpbmcgIiArIHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3U7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PENvbXBpbGF0aW9uVW5pdD4gcGFyc2VEaXJlY3RvcnkoRmlsZSBzcmNEaXJlY3RvcnkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZWREaXJlY3Rvcmllcy5nZXQoc3JjRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpLCAoKSAtPiB7CisgICAgICAgICAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IHVuaXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gc3JjRGlyZWN0b3J5Lmxpc3RGaWxlcygpOworICAgICAgICAgICAgICAgIGlmIChmaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8Q29tcGlsYXRpb25Vbml0PiB1bml0ID0gcGFyc2UoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXQuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMuYWRkKHVuaXQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pdHM7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHJ5VG9Tb2x2ZVR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGVudW1zCisgICAgICAgIC8vIFRPRE8gc3VwcG9ydCBpbnRlcmZhY2VzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZm91bmRUeXBlcy5nZXQobmFtZSwgKCkgLT4geworICAgICAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gcmVzdWx0ID0gdHJ5VG9Tb2x2ZVR5cGVVbmNhY2hlZChuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQocmVzdWx0LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHJ5VG9Tb2x2ZVR5cGVVbmNhY2hlZChTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmdbXSBuYW1lRWxlbWVudHMgPSBuYW1lLnNwbGl0KCJcXC4iKTsKKworICAgICAgICBmb3IgKGludCBpID0gbmFtZUVsZW1lbnRzLmxlbmd0aDsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gc3JjRGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmaWxlUGF0aCArPSAiLyIgKyBuYW1lRWxlbWVudHNbal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlUGF0aCArPSAiLmphdmEiOworCisgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAiIjsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gMTsgaiA8IG5hbWVFbGVtZW50cy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChqICE9IGkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lICs9ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHlwZU5hbWUgKz0gbmFtZUVsZW1lbnRzW2pdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8Q29tcGlsYXRpb25Vbml0PiBjb21waWxhdGlvblVuaXQgPSBwYXJzZShzcmNGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0LmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4+IGFzdFR5cGVEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5maW5kVHlwZShjb21waWxhdGlvblVuaXQuZ2V0KCksIHR5cGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzdFR5cGVEZWNsYXJhdGlvbi5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodGhpcykuZ2V0VHlwZURlY2xhcmF0aW9uKGFzdFR5cGVEZWNsYXJhdGlvbi5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IGNvbXBpbGF0aW9uVW5pdHMgPSBwYXJzZURpcmVjdG9yeShzcmNGaWxlLmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0IDogY29tcGlsYXRpb25Vbml0cykgeworICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+PiBhc3RUeXBlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZmluZFR5cGUoY29tcGlsYXRpb25Vbml0LCB0eXBlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhc3RUeXBlRGVjbGFyYXRpb24uaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHRoaXMpLmdldFR5cGVEZWNsYXJhdGlvbihhc3RUeXBlRGVjbGFyYXRpb24uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvTWVtb3J5VHlwZVNvbHZlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvTWVtb3J5VHlwZVNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTVjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9NZW1vcnlUeXBlU29sdmVyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgVHlwZVNvbHZlciB3aGljaCBvbmx5IGNvbnNpZGVyIHRoZSBUeXBlRGVjbGFyYXRpb25zIHByb3ZpZGVkIHRvIGl0LgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgTWVtb3J5VHlwZVNvbHZlciBpbXBsZW1lbnRzIFR5cGVTb2x2ZXIgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHBhcmVudDsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbk1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiTWVtb3J5VHlwZVNvbHZlcnsiICsKKyAgICAgICAgICAgICAgICAicGFyZW50PSIgKyBwYXJlbnQgKworICAgICAgICAgICAgICAgICIsIGRlY2xhcmF0aW9uTWFwPSIgKyBkZWNsYXJhdGlvbk1hcCArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1lbW9yeVR5cGVTb2x2ZXIpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgTWVtb3J5VHlwZVNvbHZlciB0aGF0ID0gKE1lbW9yeVR5cGVTb2x2ZXIpIG87CisKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsID8gIXBhcmVudC5lcXVhbHModGhhdC5wYXJlbnQpIDogdGhhdC5wYXJlbnQgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gIShkZWNsYXJhdGlvbk1hcCAhPSBudWxsID8gIWRlY2xhcmF0aW9uTWFwLmVxdWFscyh0aGF0LmRlY2xhcmF0aW9uTWFwKSA6IHRoYXQuZGVjbGFyYXRpb25NYXAgIT0gbnVsbCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGRlY2xhcmF0aW9uTWFwICE9IG51bGwgPyBkZWNsYXJhdGlvbk1hcC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGVTb2x2ZXIgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUeXBlU29sdmVyIHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMuZGVjbGFyYXRpb25NYXAucHV0KG5hbWUsIHR5cGVEZWNsYXJhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gdHJ5VG9Tb2x2ZVR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGRlY2xhcmF0aW9uTWFwLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChkZWNsYXJhdGlvbk1hcC5nZXQobmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL1JlZmxlY3Rpb25UeXBlU29sdmVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9SZWZsZWN0aW9uVHlwZVNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDU0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9SZWZsZWN0aW9uVHlwZVNvbHZlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvblR5cGVTb2x2ZXIgaW1wbGVtZW50cyBUeXBlU29sdmVyIHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciBwYXJlbnQ7CisKKyAgICBwdWJsaWMgUmVmbGVjdGlvblR5cGVTb2x2ZXIoYm9vbGVhbiBqcmVPbmx5KSB7CisgICAgICAgIHRoaXMuanJlT25seSA9IGpyZU9ubHk7CisgICAgfQorCisgICAgcHVibGljIFJlZmxlY3Rpb25UeXBlU29sdmVyKCkgeworICAgICAgICB0aGlzKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBqcmVPbmx5OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGVTb2x2ZXIgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUeXBlU29sdmVyIHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiB0cnlUb1NvbHZlVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoIWpyZU9ubHkgfHwgKG5hbWUuc3RhcnRzV2l0aCgiamF2YS4iKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFJlZmxlY3Rpb25UeXBlU29sdmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyBjb3VsZCByZXR1cm4gbnVsbCB3aGVuIHRoZSBjbGFzcyB3YXMgbG9hZGVkIHRocm91Z2ggdGhlIGJvb3RzdHJhcCBjbGFzc2xvYWRlcgorICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL2xhbmcvQ2xhc3MuaHRtbCNnZXRDbGFzc0xvYWRlci0tCisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBSZWZsZWN0aW9uVHlwZVNvbHZlciBoYXMgYmVlbiBwcm9iYWJseSBsb2FkZWQgdGhyb3VnaCB0aGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlci4gVGhpcyB1c2FnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBKYXZhU3ltYm9sU29sdmVyIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGNsYXp6LCBnZXRSb290KCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGl0IGNvdWxkIGJlIGFuIGlubmVyIGNsYXNzCisgICAgICAgICAgICAgICAgaW50IGxhc3REb3QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3REb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkTmFtZSA9IG5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBwYXJlbnQgPSB0cnlUb1NvbHZlVHlwZShwYXJlbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbj4gaW5uZXJDbGFzcyA9IHBhcmVudC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5pbnRlcm5hbFR5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpLmZpbmRGaXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ2xhc3MuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChpbm5lckNsYXNzLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvdXRpbHMvU3ltYm9sU29sdmVyUXVpY2tTZXR1cC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3V0aWxzL1N5bWJvbFNvbHZlclF1aWNrU2V0dXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQzZDUzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWNvcmUvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3V0aWxzL1N5bWJvbFNvbHZlclF1aWNrU2V0dXAuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTggVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci51dGlsczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVByb2JsZW1FeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuKjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5maWxlLkZpbGVWaXNpdFJlc3VsdC4qOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gYWRkIGFsbCBqYXJzIGFuZCByb290cyBvZiBqYXZhIGZpbGVzIG9mIHRoZSBwcm92aWRlZCBwYXRoIHRvIGEgVHlwZVNvbHZlciBpbnN0YW5jZS4KKyAqIEl0IHRyYXZlcnNlcyB0aGUgZmlsZSBkaXJlY3RvcnkgdHJlZSBhbmQgYWRkcyBhbGwgZmlsZXMgZW5kaW5nIGluIGVpdGhlciAuamF2YSBvciAuamFyLgorICovCitwdWJsaWMgY2xhc3MgU3ltYm9sU29sdmVyUXVpY2tTZXR1cCB7CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIERpckZpbHRlciB7CisgICAgICAgIGJvb2xlYW4gZmlsdGVyKFBhdGggcGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQYXRoIHJvb3Q7CisgICAgcHJpdmF0ZSBDb21iaW5lZFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKGZhbHNlKSk7CisgICAgcHJpdmF0ZSBEaXJGaWx0ZXIgZGlyRmlsdGVyID0gcGF0aCAtPiBmYWxzZTsKKworICAgIHB1YmxpYyBTeW1ib2xTb2x2ZXJRdWlja1NldHVwKFBhdGggcm9vdCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKHJvb3QpOworICAgICAgICBpZiAoIUZpbGVzLmlzRGlyZWN0b3J5KHJvb3QpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmx5IGRpcmVjdG9yaWVzIGFyZSBhbGxvd2VkIGFzIHJvb3QgcGF0aCEiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJvb3QgPSByb290Lm5vcm1hbGl6ZSgpOworICAgICAgICBMb2cuaW5mbygiTmV3IHN5bWJvbCBzb3VyY2Ugcm9vdCBhdCBcIiVzXCIiLCB0aGlzLnJvb3QpOworICAgIH0KKworICAgIHB1YmxpYyBTeW1ib2xTb2x2ZXJRdWlja1NldHVwKFBhdGggcm9vdCwgRGlyRmlsdGVyIGRpckZpbHRlcikgeworICAgICAgICB0aGlzKHJvb3QpOworICAgICAgICB0aGlzLmRpckZpbHRlciA9IGRpckZpbHRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZVNvbHZlciB3YWxrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZXMud2Fsa0ZpbGVUcmVlKHJvb3QsIG5ldyBKYXZhU3ltYm9sU29sdmVyV2Fsa2VyKCkpOworICAgICAgICBGaWxlcy53YWxrRmlsZVRyZWUocm9vdCwgbmV3IEphclZpc2l0b3IoKSk7CisgICAgICAgIHJldHVybiB0eXBlU29sdmVyOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxUeXBlU29sdmVyPiB0cnlUb1dhbGsoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2Yod2FsaygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmVycm9yKGUsICJVbmFibGUgdG8gd2FsayByb290ICIgKyByb290KTsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFR5cGVTb2x2ZXIgZ2V0VHlwZVNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHBhdGggdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRSb290KCkgeworICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrcyB0aGUgZGlyZWN0b3J5IGFuZCBhZGRzIHRoZSByb290cyBvZiB0aGUgamF2YSBmaWxlcyB0byB0aGUgVHlwZVNvbHZlcgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgSmF2YVN5bWJvbFNvbHZlcldhbGtlciBleHRlbmRzIFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxQYXRoPiByb290cyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCB2aXNpdEZpbGUoUGF0aCBmaWxlLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzIGF0dHIpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGF0dHIuaXNSZWd1bGFyRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgUGF0aE1hdGNoZXIgbWF0Y2hlciA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRQYXRoTWF0Y2hlcigiZ2xvYjoqKi5qYXZhIik7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcyhmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8UGF0aD4gcm9vdCA9IEphdmFQYXJzZXIucGFyc2UoZmlsZS50b0ZpbGUoKSkuZ2V0U3RvcmFnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoQ29tcGlsYXRpb25Vbml0LlN0b3JhZ2U6OmdldFNvdXJjZVJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3QuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIocm9vdC5nZXQoKS50b0ZpbGUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb290cy5hZGQocm9vdC5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnRyYWNlKCJBZGRlZCBkaXIgIiArIHJvb3QuZ2V0KCkgKyAiIHRvIHRoZSBUeXBlU29sdmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1NJQkxJTkdTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihlLCAiVW5hYmxlIHRvIHBhcnNlIGZpbGUgIiArIGZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENPTlRJTlVFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgcHJlVmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoRmlsZXMuaXNIaWRkZW4oZGlyKSB8fCBkaXJGaWx0ZXIuZmlsdGVyKGRpcikgfHwgcm9vdHMuc3RyZWFtKCkuYW55TWF0Y2goZGlyOjpzdGFydHNXaXRoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX1NVQlRSRUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ09OVElOVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEphclZpc2l0b3IgZXh0ZW5kcyBTaW1wbGVGaWxlVmlzaXRvcjxQYXRoPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKFBhdGggZmlsZSwgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGF0dHIuaXNSZWd1bGFyRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgUGF0aE1hdGNoZXIgbWF0Y2hlciA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRQYXRoTWF0Y2hlcigiZ2xvYjoqKi5qYXIiKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVTb2x2ZXIuYWRkKG5ldyBKYXJUeXBlU29sdmVyKGZpbGUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDT05USU5VRTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljLy5naXRpZ25vcmUgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIyZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACitidWlsZAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLnNldHRpbmdzCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljLmltbCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMuaW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjUzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljLmltbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPG1vZHVsZSBvcmcuamV0YnJhaW5zLmlkZWEubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RzTWFuYWdlci5pc01hdmVuTW9kdWxlPSJ0cnVlIiB0eXBlPSJKQVZBX01PRFVMRSIgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iTmV3TW9kdWxlUm9vdE1hbmFnZXIiIExBTkdVQUdFX0xFVkVMPSJKREtfMV84Ij4KKyAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQvY2xhc3NlcyIgLz4KKyAgICA8b3V0cHV0LXRlc3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC90ZXN0LWNsYXNzZXMiIC8+CisgICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy9tYWluL2phdmEiIGlzVGVzdFNvdXJjZT0iZmFsc2UiIC8+CisgICAgICA8ZXhjbHVkZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0IiAvPgorICAgIDwvY29udGVudD4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJpbmhlcml0ZWRKZGsiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ic291cmNlRm9sZGVyIiBmb3JUZXN0cz0iZmFsc2UiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IG9yZy5qYXZhc3Npc3Q6amF2YXNzaXN0OjMuMjIuMC1HQSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlIiBtb2R1bGUtbmFtZT0iamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsIiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgbW9kdWxlLW5hbWU9ImphdmFwYXJzZXItY29yZSIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJNYXZlbjogY29tLmdvb2dsZS5ndWF2YTpndWF2YToyMy40LWpyZSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IGNvbS5nb29nbGUuY29kZS5maW5kYnVnczpqc3IzMDU6MS4zLjkiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9Ik1hdmVuOiBjb20uZ29vZ2xlLmVycm9ycHJvbmU6ZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnM6Mi4wLjE4IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJNYXZlbjogY29tLmdvb2dsZS5qMm9iamM6ajJvYmpjLWFubm90YXRpb25zOjEuMSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IG9yZy5jb2RlaGF1cy5tb2pvOmFuaW1hbC1zbmlmZmVyLWFubm90YXRpb25zOjEuMTQiIGxldmVsPSJwcm9qZWN0IiAvPgorICA8L2NvbXBvbmVudD4KKzwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9wb20ueG1sIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNzg1NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9wb20ueG1sCkBAIC0wLDAgKzEsMTIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamF2YXBhcnNlcjwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+My41LjE2LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxkZXNjcmlwdGlvbj5BIFN5bWJvbCBTb2x2ZXIgZm9yIEphdmEsIGJ1aWx0IG9uIHRvcCBvZiBKYXZhUGFyc2VyIChsb2dpYyk8L2Rlc2NyaXB0aW9uPgorCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5BIGJ1c2luZXNzLWZyaWVuZGx5IE9TUyBsaWNlbnNlPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGphdmEudmVyc2lvbj4xLjg8L2phdmEudmVyc2lvbj4KKyAgICAgICAgPGJ1aWxkLnRpbWVzdGFtcD4ke21hdmVuLmJ1aWxkLnRpbWVzdGFtcH08L2J1aWxkLnRpbWVzdGFtcD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFuaW1hbC1zbmlmZmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjE2PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNYWtlIHN1cmUgb25seSB0aGUgQVBJIG9mIHRoaXMgSkRLIGlzIHVzZWQgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qby5zaWduYXR1cmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhMTg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hbmltYWwtc25pZmZlcjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMC4wLU0xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2UtdmVyc2lvbnM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZW5mb3JjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlSmF2YVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1ha2Ugc3VyZSBhIGNvbXBpbGVyIG9mIHRoaXMgdmVyc2lvbiBpcyB1c2VkIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcXVpcmVKYXZhVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVuZm9yY2VCeXRlY29kZVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1ha2Ugc3VyZSB0aGUgZGVwZW5kZW5jaWVzIGFyZSBjb21waWxlZCBmb3Igb3VyIEphdmEgdmVyc2lvbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhKZGtWZXJzaW9uPiR7amF2YS52ZXJzaW9ufTwvbWF4SmRrVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbmZvcmNlQnl0ZWNvZGVWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXh0cmEtZW5mb3JjZXItcnVsZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYmV0YS02PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwhLS0gU2V0IEpQTVMgbW9kdWxlIG5hbWUgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEF1dG9tYXRpYy1Nb2R1bGUtTmFtZT5jb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljPC9BdXRvbWF0aWMtTW9kdWxlLU5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9BYnN0cmFjdENsYXNzRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3NzBlNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIGNvbW1vbiBhbmNlc3RvciBmb3IgYWxsIENsYXNzRGVjbGFyYXRpb25zLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW1wbGVtZW50cyBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24geworCisgICAgLy8vCisgICAgLy8vIFB1YmxpYworICAgIC8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKSAhPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QWxsU3VwZXJDbGFzc2VzKCkgeworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gc3VwZXJjbGFzc2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBzdXBlckNsYXNzID0gZ2V0U3VwZXJDbGFzcygpOworICAgICAgICBpZiAoc3VwZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBlcmNsYXNzZXMuYWRkKHN1cGVyQ2xhc3MpOworICAgICAgICAgICAgc3VwZXJjbGFzc2VzLmFkZEFsbChzdXBlckNsYXNzLmdldEFsbENsYXNzZXNBbmNlc3RvcnMoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VwZXJjbGFzc2VzLnJlbW92ZUlmKHMgLT4gcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSkgeworICAgICAgICAgICAgc3VwZXJjbGFzc2VzLmFkZChvYmplY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyY2xhc3NlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEFsbEludGVyZmFjZXMoKSB7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGludGVyZmFjZURlY2xhcmF0aW9uIDogZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChpbnRlcmZhY2VEZWNsYXJhdGlvbik7CisgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZEFsbChpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzQW5jZXN0b3JzKCkpOworICAgICAgICB9CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBzdXBlckNsYXNzID0gdGhpcy5nZXRTdXBlckNsYXNzKCk7CisgICAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVyZmFjZXMuYWRkQWxsKHN1cGVyQ2xhc3MuZ2V0QWxsSW50ZXJmYWNlc0FuY2VzdG9ycygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50ZXJmYWNlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFzQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBQcm90ZWN0ZWQKKyAgICAvLy8KKworICAgIC8qKgorICAgICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPYmplY3QgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvYmplY3QoKTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGZmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0Fic3RyYWN0VHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENvbW1vbiBhbmNlc3RvciBmb3IgbW9zdCB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGltcGxlbWVudHMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFNldDxNZXRob2RVc2FnZT4gZ2V0QWxsTWV0aG9kcygpIHsKKyAgICAgICAgU2V0PE1ldGhvZFVzYWdlPiBtZXRob2RzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIFNldDxTdHJpbmc+IG1ldGhvZHNTaWduYXR1cmVzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIGZvciAoUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IGdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICBtZXRob2RzLmFkZChuZXcgTWV0aG9kVXNhZ2UobWV0aG9kRGVjbGFyYXRpb24pKTsKKyAgICAgICAgICAgIG1ldGhvZHNTaWduYXR1cmVzLmFkZChtZXRob2REZWNsYXJhdGlvbi5nZXRTaWduYXR1cmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA6IGdldEFsbEFuY2VzdG9ycygpKSB7CisgICAgICAgICAgICBmb3IgKE1ldGhvZFVzYWdlIG11IDogYW5jZXN0b3IuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbXUuZ2V0RGVjbGFyYXRpb24oKS5nZXRTaWduYXR1cmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZHNTaWduYXR1cmVzLmNvbnRhaW5zKHNpZ25hdHVyZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kc1NpZ25hdHVyZXMuYWRkKHNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKG11KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZCh0aGlzKS5pc1ByZXNlbnQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvQ29uZmlsaWN0aW5nR2VuZXJpY1R5cGVzRXhjZXB0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0NvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGZmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0NvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHVibGljIENvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbihSZXNvbHZlZFR5cGUgZm9ybWFsVHlwZSwgUmVzb2x2ZWRUeXBlIGFjdHVhbFR5cGUpIHsKKyAgICAgICAgc3VwZXIoU3RyaW5nLmZvcm1hdCgiTm8gbWF0Y2hpbmcgYmV0d2VlbiAlcyAoZm9ybWFsKSBhbmQgJXMgKGFjdHVhbCkiLCBmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjZTE4YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljIHsKKworICAgIHByaXZhdGUgRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZ1bmN0aW9uYWwgbWV0aG9kIGRlZmluZWQgYnkgdGhlIHR5cGUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiBnZXRGdW5jdGlvbmFsTWV0aG9kKFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpICYmIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uYWxNZXRob2QodHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZnVuY3Rpb25hbCBtZXRob2QgZGVmaW5lZCBieSB0aGUgdHlwZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IGdldEZ1bmN0aW9uYWxNZXRob2QoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7CisgICAgICAgIC8vV2UgbmVlZCB0byBmaW5kIGFsbCBhYnN0cmFjdCBtZXRob2RzCisgICAgICAgIFNldDxNZXRob2RVc2FnZT4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbS5nZXREZWNsYXJhdGlvbigpLmlzQWJzdHJhY3QoKSkKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbWV0aG9kcyBpbmhlcml0ZWQgYnkgT2JqZWN0OgorICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBjYXNlIG9mIENvbXBhcmF0b3Igd2hpY2ggZGVmaW5lIGVxdWFscy4gSXQgd291bGQgYmUgY29uc2lkZXJlZCBhIGZ1bmN0aW9uYWwgbWV0aG9kLgorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiAhZGVjbGFyZWRPbk9iamVjdChtKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisgICAgICAgIGlmIChtZXRob2RzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YobWV0aG9kcy5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uYWxJbnRlcmZhY2VUeXBlKFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBnZXRGdW5jdGlvbmFsTWV0aG9kKHR5cGUpLmlzUHJlc2VudCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaWduYXR1cmUoTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIG0uZ2V0TmFtZSgpLCBTdHJpbmcuam9pbigiLCAiLCBBcnJheXMuc3RyZWFtKG0uZ2V0UGFyYW1ldGVycygpKS5tYXAocCAtPiB0b1NpZ25hdHVyZShwKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1NpZ25hdHVyZShQYXJhbWV0ZXIgcCkgeworICAgICAgICByZXR1cm4gcC5nZXRUeXBlKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBPQkpFQ1RfTUVUSE9EU19TSUdOQVRVUkVTID0gQXJyYXlzLnN0cmVhbShPYmplY3QuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpCisgICAgICAgICAgICAubWFwKG1ldGhvZCAtPiBnZXRTaWduYXR1cmUobWV0aG9kKSkKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWNsYXJlZE9uT2JqZWN0KE1ldGhvZFVzYWdlIG0pIHsKKyAgICAgICAgcmV0dXJuIE9CSkVDVF9NRVRIT0RTX1NJR05BVFVSRVMuY29udGFpbnMobS5nZXREZWNsYXJhdGlvbigpLmdldFNpZ25hdHVyZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0luZmVyZW5jZUNvbnRleHQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvSW5mZXJlbmNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkM2RmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0luZmVyZW5jZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS4qOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEluZmVyZW5jZUNvbnRleHQgeworCisgICAgcHJpdmF0ZSBpbnQgbmV4dEluZmVyZW5jZVZhcmlhYmxlSWQgPSAwOworICAgIHByaXZhdGUgT2JqZWN0UHJvdmlkZXIgb2JqZWN0UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBMaXN0PEluZmVyZW5jZVZhcmlhYmxlVHlwZT4gaW5mZXJlbmNlVmFyaWFibGVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIEluZmVyZW5jZUNvbnRleHQoT2JqZWN0UHJvdmlkZXIgb2JqZWN0UHJvdmlkZXIpIHsKKyAgICAgICAgdGhpcy5vYmplY3RQcm92aWRlciA9IG9iamVjdFByb3ZpZGVyOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW5mZXJlbmNlVmFyaWFibGVUeXBlPiBpbmZlcmVuY2VWYXJpYWJsZVR5cGVNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBwcml2YXRlIEluZmVyZW5jZVZhcmlhYmxlVHlwZSBpbmZlcmVuY2VWYXJpYWJsZVR5cGVGb3JUcChSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCkgeworICAgICAgICBpZiAoIWluZmVyZW5jZVZhcmlhYmxlVHlwZU1hcC5jb250YWluc0tleSh0cC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZVR5cGUgaW5mZXJlbmNlVmFyaWFibGVUeXBlID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlVHlwZShuZXh0SW5mZXJlbmNlVmFyaWFibGVJZCsrLCBvYmplY3RQcm92aWRlcik7CisgICAgICAgICAgICBpbmZlcmVuY2VWYXJpYWJsZVR5cGVzLmFkZChpbmZlcmVuY2VWYXJpYWJsZVR5cGUpOworICAgICAgICAgICAgaW5mZXJlbmNlVmFyaWFibGVUeXBlLnNldENvcnJlc3BvbmRpbmdUcCh0cCk7CisgICAgICAgICAgICBpbmZlcmVuY2VWYXJpYWJsZVR5cGVNYXAucHV0KHRwLmdldE5hbWUoKSwgaW5mZXJlbmNlVmFyaWFibGVUeXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5mZXJlbmNlVmFyaWFibGVUeXBlTWFwLmdldCh0cC5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIHdpdGggdGhlIGluZmVyZW5jZSB2YXJpYWJsZSBpbnNlcnRlZAorICAgICAqLworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgYWRkUGFpcihSZXNvbHZlZFR5cGUgdGFyZ2V0LCBSZXNvbHZlZFR5cGUgYWN0dWFsKSB7CisgICAgICAgIHRhcmdldCA9IHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKHRhcmdldCk7CisgICAgICAgIGFjdHVhbCA9IHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKGFjdHVhbCk7CisgICAgICAgIHJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UodGFyZ2V0LCBhY3R1YWwpOworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgYWRkU2luZ2xlKFJlc29sdmVkVHlwZSBhY3R1YWwpIHsKKyAgICAgICAgcmV0dXJuIHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKGFjdHVhbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UoUmVzb2x2ZWRUeXBlIGZvcm1hbFR5cGUsIFJlc29sdmVkVHlwZSBhY3R1YWxUeXBlKSB7CisgICAgICAgIGlmIChmb3JtYWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpICYmIGFjdHVhbFR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpIHsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBmb3JtYWxUeXBlQXNSZWZlcmVuY2UgPSBmb3JtYWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFjdHVhbFR5cGVBc1JlZmVyZW5jZSA9IGFjdHVhbFR5cGUuYXNSZWZlcmVuY2VUeXBlKCk7CisKKyAgICAgICAgICAgIGlmICghZm9ybWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYWN0dWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gYWN0dWFsVHlwZUFzUmVmZXJlbmNlLmdldEFsbEFuY2VzdG9ycygpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYWxQYXJhbVR5cGVRTmFtZSA9IGZvcm1hbFR5cGVBc1JlZmVyZW5jZS5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGNvcnJlc3BvbmRpbmdGb3JtYWxUeXBlID0gYW5jZXN0b3JzLnN0cmVhbSgpLmZpbHRlcigoYSkgLT4gYS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGZvcm1hbFBhcmFtVHlwZVFOYW1lKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29ycmVzcG9uZGluZ0Zvcm1hbFR5cGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ycyA9IGZvcm1hbFR5cGVBc1JlZmVyZW5jZS5nZXRBbGxBbmNlc3RvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbFBhcmFtVHlwZVFuYW1lID0gYWN0dWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXNvbHZlZFR5cGU+IGNvcnJlc3BvbmRpbmdBY3R1YWxUeXBlID0gYW5jZXN0b3JzLnN0cmVhbSgpLmZpbHRlcihhIC0+IGEuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhhY3R1YWxQYXJhbVR5cGVRbmFtZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3JyZXNwb25kaW5nQWN0dWFsVHlwZS5pc0VtcHR5KCkpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbihmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nRm9ybWFsVHlwZSA9IGNvcnJlc3BvbmRpbmdBY3R1YWxUeXBlOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVBc1JlZmVyZW5jZSA9IGNvcnJlc3BvbmRpbmdGb3JtYWxUeXBlLmdldCgwKS5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hbFR5cGVBc1JlZmVyZW5jZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGFjdHVhbFR5cGVBc1JlZmVyZW5jZS5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmb3JtYWxUeXBlQXNSZWZlcmVuY2UudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFR5cGVBc1JlZmVyZW5jZS5pc1Jhd1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZXNvbHZlZFR5cGUgZm9ybWFsVHlwZVBhcmFtZXRlciA6IGZvcm1hbFR5cGVBc1JlZmVyZW5jZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb3JyZXNwb25kYW5jZShmb3JtYWxUeXBlUGFyYW1ldGVyLCBhY3R1YWxUeXBlQXNSZWZlcmVuY2UudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYWxUeXBlIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlICYmICFhY3R1YWxUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBmb3JtYWxUeXBlKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGFjdHVhbFR5cGUpOworICAgICAgICAgICAgaWYgKGFjdHVhbFR5cGUgaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAoKEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgYWN0dWFsVHlwZSkucmVnaXN0ZXJFcXVpdmFsZW50VHlwZShmb3JtYWxUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxUeXBlLmlzTnVsbCgpKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsVHlwZS5lcXVhbHMoZm9ybWFsVHlwZSkpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxUeXBlLmlzQXJyYXkoKSAmJiBmb3JtYWxUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmVnaXN0ZXJDb3JyZXNwb25kYW5jZShmb3JtYWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYWxUeXBlLmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgaWYgKChhY3R1YWxUeXBlIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKSAmJiBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5pc0JvdW5kZWQoKSkgeworICAgICAgICAgICAgICAgICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBhY3R1YWxUeXBlKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGFjdHVhbFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY3R1YWxUeXBlLmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgICAgIFJlc29sdmVkV2lsZGNhcmQgZm9ybWFsV2lsZGNhcmQgPSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKTsKKyAgICAgICAgICAgICAgICBSZXNvbHZlZFdpbGRjYXJkIGFjdHVhbFdpbGRjYXJkID0gYWN0dWFsVHlwZS5hc1dpbGRjYXJkKCk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hbFdpbGRjYXJkLmlzQm91bmRlZCgpICYmIGZvcm1hbFdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkgaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hbFdpbGRjYXJkLmlzU3VwZXIoKSAmJiBhY3R1YWxXaWxkY2FyZC5pc1N1cGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGFjdHVhbFdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hbFdpbGRjYXJkLmlzRXh0ZW5kcygpICYmIGFjdHVhbFdpbGRjYXJkLmlzRXh0ZW5kcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkucmVnaXN0ZXJFcXVpdmFsZW50VHlwZShhY3R1YWxXaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFjdHVhbFR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpeworICAgICAgICAgICAgICAgIGlmIChmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5pc0JvdW5kZWQoKSl7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UoZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgYWN0dWFsVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbFR5cGUgaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZVR5cGUpeworICAgICAgICAgICAgaWYgKGZvcm1hbFR5cGUgaW5zdGFuY2VvZiBSZXNvbHZlZFJlZmVyZW5jZVR5cGUpeworICAgICAgICAgICAgICAgICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBhY3R1YWxUeXBlKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGZvcm1hbFR5cGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYWxUeXBlIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKXsKKyAgICAgICAgICAgICAgICAoKEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgYWN0dWFsVHlwZSkucmVnaXN0ZXJFcXVpdmFsZW50VHlwZShmb3JtYWxUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxUeXBlLmlzQ29uc3RyYWludCgpKXsKKyAgICAgICAgICAgIFJlc29sdmVkTGFtYmRhQ29uc3RyYWludFR5cGUgY29uc3RyYWludFR5cGUgPSBhY3R1YWxUeXBlLmFzQ29uc3RyYWludFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChjb25zdHJhaW50VHlwZS5nZXRCb3VuZCgpIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKXsKKyAgICAgICAgICAgICAgICAoKEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgY29uc3RyYWludFR5cGUuZ2V0Qm91bmQoKSkucmVnaXN0ZXJFcXVpdmFsZW50VHlwZShmb3JtYWxUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChmb3JtYWxUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UoZm9ybWFsVHlwZSwgb2JqZWN0UHJvdmlkZXIuYnlOYW1lKGFjdHVhbFR5cGUuYXNQcmltaXRpdmUoKS5nZXRCb3hUeXBlUU5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGZvcm1hbFR5cGUuZGVzY3JpYmUoKSArICIgIiArIGFjdHVhbFR5cGUuZGVzY3JpYmUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBwbGFjZUluZmVyZW5jZVZhcmlhYmxlcyhSZXNvbHZlZFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZS5pc1dpbGRjYXJkKCkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZChwbGFjZUluZmVyZW5jZVZhcmlhYmxlcyh0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuYXNXaWxkY2FyZCgpLmlzU3VwZXIoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFdpbGRjYXJkLnN1cGVyQm91bmQocGxhY2VJbmZlcmVuY2VWYXJpYWJsZXModHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzVHlwZVZhcmlhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZlcmVuY2VWYXJpYWJsZVR5cGVGb3JUcCh0eXBlLmFzVHlwZVBhcmFtZXRlcigpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiBwbGFjZUluZmVyZW5jZVZhcmlhYmxlcyh0cCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkQXJyYXlUeXBlKHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKHR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzTnVsbCgpIHx8IHR5cGUuaXNQcmltaXRpdmUoKSB8fCB0eXBlLmlzVm9pZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzQ29uc3RyYWludCgpKXsKKyAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZExhbWJkYUNvbnN0cmFpbnRUeXBlLmJvdW5kKHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKHR5cGUuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0eXBlLmRlc2NyaWJlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFJlc29sdmVkVHlwZSByZXNvbHZlKFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKSB7CisgICAgICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZVR5cGUgaW5mZXJlbmNlVmFyaWFibGVUeXBlID0gKEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgdHlwZTsKKyAgICAgICAgICAgIHJldHVybiBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuZXF1aXZhbGVudFR5cGUoKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiByZXNvbHZlKHRwKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc051bGwoKSB8fCB0eXBlLmlzUHJpbWl0aXZlKCkgfHwgdHlwZS5pc1ZvaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRBcnJheVR5cGUocmVzb2x2ZSh0eXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1dpbGRjYXJkKCkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZChyZXNvbHZlKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5hc1dpbGRjYXJkKCkuaXNTdXBlcigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkV2lsZGNhcmQuc3VwZXJCb3VuZChyZXNvbHZlKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24odHlwZS5kZXNjcmliZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvSW5mZXJlbmNlVmFyaWFibGVUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0luZmVyZW5jZVZhcmlhYmxlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmU5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbG9naWMvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0luZmVyZW5jZVZhcmlhYmxlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRXaWxkY2FyZDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIEFuIGVsZW1lbnQgdXNpbmcgZHVyaW5nIHR5cGUgaW5mZXJlbmNlLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgSW5mZXJlbmNlVmFyaWFibGVUeXBlIGltcGxlbWVudHMgUmVzb2x2ZWRUeXBlIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkluZmVyZW5jZVZhcmlhYmxlVHlwZXsiICsKKyAgICAgICAgICAgICAgICAiaWQ9IiArIGlkICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgaWQ7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nVHA7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb3JyZXNwb25kaW5nVHAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gY29ycmVzcG9uZGluZ1RwKSB7CisgICAgICAgIHRoaXMuY29ycmVzcG9uZGluZ1RwID0gY29ycmVzcG9uZGluZ1RwOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFJlc29sdmVkVHlwZT4gZXF1aXZhbGVudFR5cGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgIHByaXZhdGUgT2JqZWN0UHJvdmlkZXIgb2JqZWN0UHJvdmlkZXI7CisKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckVxdWl2YWxlbnRUeXBlKFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMuZXF1aXZhbGVudFR5cGVzLmFkZCh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZVR5cGUpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgSW5mZXJlbmNlVmFyaWFibGVUeXBlIHRoYXQgPSAoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBvOworCisgICAgICAgIHJldHVybiBpZCA9PSB0aGF0LmlkOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFJlc29sdmVkVHlwZT4gc3VwZXJUeXBlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgIHB1YmxpYyBJbmZlcmVuY2VWYXJpYWJsZVR5cGUoaW50IGlkLCBPYmplY3RQcm92aWRlciBvYmplY3RQcm92aWRlcikgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMub2JqZWN0UHJvdmlkZXIgPSBvYmplY3RQcm92aWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEluZmVyZW5jZVZhcmlhYmxlVHlwZSBmcm9tV2lsZGNhcmQoUmVzb2x2ZWRXaWxkY2FyZCB3aWxkY2FyZCwgaW50IGlkLCBPYmplY3RQcm92aWRlciBvYmplY3RQcm92aWRlcikgeworICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZVR5cGUgaW5mZXJlbmNlVmFyaWFibGVUeXBlID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlVHlwZShpZCwgb2JqZWN0UHJvdmlkZXIpOworICAgICAgICBpZiAod2lsZGNhcmQuaXNFeHRlbmRzKCkpIHsKKyAgICAgICAgICAgIGluZmVyZW5jZVZhcmlhYmxlVHlwZS5zdXBlclR5cGVzLmFkZCh3aWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2lsZGNhcmQuaXNTdXBlcigpKSB7CisgICAgICAgICAgICAvLyBJIGFtIG5vdCBzdXJlIGFib3V0IHRoaXMgb25lLi4uCisgICAgICAgICAgICBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuc3VwZXJUeXBlcy5hZGQod2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZmVyZW5jZVZhcmlhYmxlVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlKCkgeworICAgICAgICByZXR1cm4gIkluZmVyZW5jZVZhcmlhYmxlXyIgKyBpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFR5cGUgb3RoZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8UmVzb2x2ZWRUeXBlPiBjb25jcmV0ZUVxdWl2YWxlbnRUeXBlc0Fsc29JbmRpcmVjdGx5KFNldDxJbmZlcmVuY2VWYXJpYWJsZVR5cGU+IGNvbnNpZGVyZWQsIEluZmVyZW5jZVZhcmlhYmxlVHlwZSBpbmZlcmVuY2VWYXJpYWJsZVR5cGUpIHsKKyAgICAgICAgY29uc2lkZXJlZC5hZGQoaW5mZXJlbmNlVmFyaWFibGVUeXBlKTsKKyAgICAgICAgU2V0PFJlc29sdmVkVHlwZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICByZXN1bHQuYWRkQWxsKGluZmVyZW5jZVZhcmlhYmxlVHlwZS5lcXVpdmFsZW50VHlwZXMuc3RyZWFtKCkuZmlsdGVyKHQgLT4gIXQuaXNUeXBlVmFyaWFibGUoKSAmJiAhKHQgaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZVR5cGUpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgICAgICBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuZXF1aXZhbGVudFR5cGVzLnN0cmVhbSgpLmZpbHRlcih0IC0+IHQgaW5zdGFuY2VvZiBJbmZlcmVuY2VWYXJpYWJsZVR5cGUpLmZvckVhY2godCAtPiB7CisgICAgICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZVR5cGUgaXZ0ID0gKEluZmVyZW5jZVZhcmlhYmxlVHlwZSl0OworICAgICAgICAgICAgaWYgKCFjb25zaWRlcmVkLmNvbnRhaW5zKGl2dCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKGNvbmNyZXRlRXF1aXZhbGVudFR5cGVzQWxzb0luZGlyZWN0bHkoY29uc2lkZXJlZCwgaXZ0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZXF1aXZhbGVudFR5cGUoKSB7CisgICAgICAgIFNldDxSZXNvbHZlZFR5cGU+IGNvbmNyZXRlRXF1aXZhbGVudCA9IGNvbmNyZXRlRXF1aXZhbGVudFR5cGVzQWxzb0luZGlyZWN0bHkobmV3IEhhc2hTZXQ8PigpLCB0aGlzKTsKKyAgICAgICAgaWYgKGNvbmNyZXRlRXF1aXZhbGVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChjb3JyZXNwb25kaW5nVHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RQcm92aWRlci5vYmplY3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFR5cGVWYXJpYWJsZShjb3JyZXNwb25kaW5nVHApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25jcmV0ZUVxdWl2YWxlbnQuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25jcmV0ZUVxdWl2YWxlbnQuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgU2V0PFJlc29sdmVkVHlwZT4gbm90VHlwZVZhcmlhYmxlcyA9IGVxdWl2YWxlbnRUeXBlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodCAtPiAhdC5pc1R5cGVWYXJpYWJsZSgpICYmICFoYXNJbmZlcmVuY2VWYXJpYWJsZXModCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgaWYgKG5vdFR5cGVWYXJpYWJsZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBub3RUeXBlVmFyaWFibGVzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB9IGVsc2UgaWYgKG5vdFR5cGVWYXJpYWJsZXMuc2l6ZSgpID09IDAgJiYgIXN1cGVyVHlwZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoc3VwZXJUeXBlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlclR5cGVzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTdXBlciB0eXBlcyBhcmU6ICIgKyBzdXBlclR5cGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVxdWl2YWxlbnQgdHlwZXMgYXJlOiAiICsgZXF1aXZhbGVudFR5cGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbmZlcmVuY2VWYXJpYWJsZXMoUmVzb2x2ZWRUeXBlIHR5cGUpeworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEluZmVyZW5jZVZhcmlhYmxlVHlwZSl7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlLmlzUmVmZXJlbmNlVHlwZSgpKXsKKyAgICAgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSByZWZUeXBlID0gdHlwZS5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlIHQgOiByZWZUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkpeworICAgICAgICAgICAgICAgIGlmIChoYXNJbmZlcmVuY2VWYXJpYWJsZXModCkpeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZS5pc1dpbGRjYXJkKCkpeworICAgICAgICAgICAgUmVzb2x2ZWRXaWxkY2FyZCB3aWxkY2FyZFR5cGUgPSB0eXBlLmFzV2lsZGNhcmQoKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNJbmZlcmVuY2VWYXJpYWJsZXMod2lsZGNhcmRUeXBlLmdldEJvdW5kZWRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvT2JqZWN0UHJvdmlkZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYy9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvT2JqZWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI1YzNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9PYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT2JqZWN0UHJvdmlkZXIgeworICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBvYmplY3QoKTsKKyAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYnlOYW1lKFN0cmluZyBxbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvLmdpdGlnbm9yZSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzczYzkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE5IEBACisqLmNsYXNzCisKKyMgTW9iaWxlIFRvb2xzIGZvciBKYXZhIChKMk1FKQorLm10ai50bXAvCisKKyMgUGFja2FnZSBGaWxlcyAjCisqLmphcgorKi53YXIKKyouZWFyCisKKyMgdmlydHVhbCBtYWNoaW5lIGNyYXNoIGxvZ3MsIHNlZSBodHRwOi8vd3d3LmphdmEuY29tL2VuL2Rvd25sb2FkL2hlbHAvZXJyb3JfaG90c3BvdC54bWwKK2hzX2Vycl9waWQqCisuaWRlYQorKi5pbWwKK3RhcmdldAorYnVpbGQKKy8uY2xhc3NwYXRoCisvLnByb2plY3QKKy5zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsL3BvbS54bWwgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDgyNGUzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsL3BvbS54bWwKQEAgLTAsMCArMSwxMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4zLjUuMTYtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPGRlc2NyaXB0aW9uPkEgU3ltYm9sIFNvbHZlciBmb3IgSmF2YSwgYnVpbHQgb24gdG9wIG9mIEphdmFQYXJzZXIgKG1vZGVsKTwvZGVzY3JpcHRpb24+CisKKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC0zLjAuaHRtbDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkEgYnVzaW5lc3MtZnJpZW5kbHkgT1NTIGxpY2Vuc2U8L2NvbW1lbnRzPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8amF2YS52ZXJzaW9uPjEuODwvamF2YS52ZXJzaW9uPgorICAgICAgICA8YnVpbGQudGltZXN0YW1wPiR7bWF2ZW4uYnVpbGQudGltZXN0YW1wfTwvYnVpbGQudGltZXN0YW1wPgorICAgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+ICAgIAorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5pbWFsLXNuaWZmZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNYWtlIHN1cmUgb25seSB0aGUgQVBJIG9mIHRoaXMgSkRLIGlzIHVzZWQgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qby5zaWduYXR1cmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhMTg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hbmltYWwtc25pZmZlcjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2UtdmVyc2lvbnM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZW5mb3JjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlSmF2YVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1ha2Ugc3VyZSBhIGNvbXBpbGVyIG9mIHRoaXMgdmVyc2lvbiBpcyB1c2VkIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcXVpcmVKYXZhVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVuZm9yY2VCeXRlY29kZVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1ha2Ugc3VyZSB0aGUgZGVwZW5kZW5jaWVzIGFyZSBjb21waWxlZCBmb3Igb3VyIEphdmEgdmVyc2lvbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhKZGtWZXJzaW9uPiR7amF2YS52ZXJzaW9ufTwvbWF4SmRrVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbmZvcmNlQnl0ZWNvZGVWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXh0cmEtZW5mb3JjZXItcnVsZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYmV0YS02PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwhLS0gU2V0IEpQTVMgbW9kdWxlIG5hbWUgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEF1dG9tYXRpYy1Nb2R1bGUtTmFtZT5jb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsPC9BdXRvbWF0aWMtTW9kdWxlLU5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvcmVzb2x1dGlvbi9TeW1ib2xSZWZlcmVuY2UuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvcmVzb2x1dGlvbi9TeW1ib2xSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDU0ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9yZXNvbHV0aW9uL1N5bWJvbFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZERlY2xhcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIEEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiBJdCBjYW4gc29sdmVkIG9yIG5vdCBzb2x2ZWQuIElmIHNvbHZlZCB0aGUgY29ycmVzcG9uZGluZworICogZGVjbGFyYXRpb24gd2lsbCBiZSBwcm92aWRlZC4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFN5bWJvbFJlZmVyZW5jZTxTIGV4dGVuZHMgUmVzb2x2ZWREZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBPcHRpb25hbDw/IGV4dGVuZHMgUz4gY29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uOworCisgICAgcHJpdmF0ZSBTeW1ib2xSZWZlcmVuY2UoT3B0aW9uYWw8PyBleHRlbmRzIFM+IGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbikgeworICAgICAgICB0aGlzLmNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiA9IGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzb2x2ZSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIHN5bWJvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxTIGV4dGVuZHMgUmVzb2x2ZWREZWNsYXJhdGlvbiwgUzIgZXh0ZW5kcyBTPiBTeW1ib2xSZWZlcmVuY2U8Uz4gc29sdmVkKFMyIHN5bWJvbERlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ltYm9sUmVmZXJlbmNlPFM+KE9wdGlvbmFsLm9mKHN5bWJvbERlY2xhcmF0aW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIHVuc29sdmVkIHJlZmVyZW5jZSBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxTIGV4dGVuZHMgUmVzb2x2ZWREZWNsYXJhdGlvbiwgUzIgZXh0ZW5kcyBTPiBTeW1ib2xSZWZlcmVuY2U8Uz4gdW5zb2x2ZWQoQ2xhc3M8UzI+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBuZXcgU3ltYm9sUmVmZXJlbmNlPD4oT3B0aW9uYWwuZW1wdHkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJTeW1ib2xSZWZlcmVuY2V7IiArIGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiArICJ9IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbi4gSWYgbm90IHNvbHZlIHRoaXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTIGdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1NvbHZlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiBub3QgYXZhaWxhYmxlIGZvciB1bnNvbHZlZCBzeW1ib2wuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbi5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgcmVmZXJlbmNlIHNvbHZlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NvbHZlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbi5pc1ByZXNlbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxPIGV4dGVuZHMgUmVzb2x2ZWREZWNsYXJhdGlvbj4gU3ltYm9sUmVmZXJlbmNlPE8+IGFkYXB0KFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgTz4gcmVmLCBDbGFzczxPPiBjbGF6eikgeworICAgICAgICBpZiAocmVmLmlzU29sdmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGNsYXp6KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvcmVzb2x1dGlvbi9UeXBlU29sdmVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3Jlc29sdXRpb24vVHlwZVNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTQzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3Jlc29sdXRpb24vVHlwZVNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKKy8qKgorICogQW4gZWxlbWVudCBhYmxlIHRvIGZpbmQgVHlwZURlY2xhcmF0aW9uIGZyb20gdGhlaXIgbmFtZS4KKyAqIFR5cGVTb2x2ZXJzIGFyZSBvcmdhbml6ZWQgaW4gaGllcmFyY2hpZXMuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHlwZVNvbHZlciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSBvZiB0eXBlIHNvbHZlci4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFR5cGVTb2x2ZXIgZ2V0Um9vdCgpIHsKKyAgICAgICAgaWYgKGdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLmdldFJvb3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcmVudCBvZiB0aGUgdGhpcyBUeXBlU29sdmVyLiBUaGlzIGNhbiByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBUeXBlU29sdmVyIGdldFBhcmVudCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJlbnQgb2YgdGhpcyBUeXBlU29sdmVyLgorICAgICAqLworICAgIHZvaWQgc2V0UGFyZW50KFR5cGVTb2x2ZXIgcGFyZW50KTsKKworICAgIC8qKgorICAgICAqIFRyeSB0byBzb2x2ZSB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJdCBhbHdheXMgcmV0dXJuIGEgU3ltYm9sUmVmZXJlbmNlIHdoaWNoIGNhbiBiZSBzb2x2ZWQKKyAgICAgKiBvciB1bnNvbHZlZC4KKyAgICAgKi8KKyAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IHRyeVRvU29sdmVUeXBlKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFNvbHZlIHRoZSBnaXZlbiB0eXBlLiBFaXRoZXIgdGhlIHR5cGUgaXMgZm91bmQgYW5kIHJldHVybmVkIG9yIGFuIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHNvbHZlVHlwZShTdHJpbmcgbmFtZSkgdGhyb3dzIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uIHsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiByZWYgPSB0cnlUb1NvbHZlVHlwZShuYW1lKTsKKyAgICAgICAgaWYgKHJlZi5pc1NvbHZlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKG5hbWUsIHRoaXMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvcmVzb2x1dGlvbi9WYWx1ZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9yZXNvbHV0aW9uL1ZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1Mzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvcmVzb2x1dGlvbi9WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworCisvKioKKyAqIEFueSB0eXBlIG9mIHZhbHVlLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgVmFsdWUgeworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBWYWx1ZShSZXNvbHZlZFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWYWx1ZSBmcm9tIGEgVmFsdWVEZWNsYXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZhbHVlIGZyb20oUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uIGRlY2wpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBkZWNsLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZSh0eXBlLCBkZWNsLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJWYWx1ZXsiICsKKyAgICAgICAgICAgICAgICAidHlwZVVzYWdlPSIgKyB0eXBlICsKKyAgICAgICAgICAgICAgICAiLCBuYW1lPSciICsgbmFtZSArICdcJycgKworICAgICAgICAgICAgICAgICd9JzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvbHZlZFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vTnVsbFR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbC9zcmMvbWFpbi9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9OdWxsVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2NmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWwvc3JjL21haW4vamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vTnVsbFR5cGUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW07CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CisKKy8qKgorICogVGhpcyBpcyBhIHZpcnR1YWwgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBudWxsIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIE51bGxUeXBlIGltcGxlbWVudHMgUmVzb2x2ZWRUeXBlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbFR5cGUgSU5TVEFOQ0UgPSBuZXcgTnVsbFR5cGUoKTsKKworICAgIHByaXZhdGUgTnVsbFR5cGUoKSB7CisgICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBkZXNjcmliZSgpIHsKKyAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSBvdGhlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gYXNzaWduIGEgdmFsdWUgdG8gbnVsbCwgaXQgY2FuIG9ubHkgYmUgYXNzaWduZWQiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nLy5naXRpZ25vcmUgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTRiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAordGFyZ2V0CitidWlsZAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLnNldHRpbmdzCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy5pbWwgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy5pbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1M2YyYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nLmltbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPG1vZHVsZSBvcmcuamV0YnJhaW5zLmlkZWEubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RzTWFuYWdlci5pc01hdmVuTW9kdWxlPSJ0cnVlIiB0eXBlPSJKQVZBX01PRFVMRSIgdmVyc2lvbj0iNCI+CisgIDxjb21wb25lbnQgbmFtZT0iTmV3TW9kdWxlUm9vdE1hbmFnZXIiIExBTkdVQUdFX0xFVkVMPSJKREtfMV84Ij4KKyAgICA8b3V0cHV0IHVybD0iZmlsZTovLyRNT0RVTEVfRElSJC90YXJnZXQvY2xhc3NlcyIgLz4KKyAgICA8b3V0cHV0LXRlc3QgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC90ZXN0LWNsYXNzZXMiIC8+CisgICAgPGNvbnRlbnQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkIj4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy90ZXN0L2phdmEiIGlzVGVzdFNvdXJjZT0idHJ1ZSIgLz4KKyAgICAgIDxzb3VyY2VGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3NyYy90ZXN0L3Jlc291cmNlcyIgdHlwZT0iamF2YS10ZXN0LXJlc291cmNlIiAvPgorICAgICAgPGV4Y2x1ZGVGb2xkZXIgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldCIgLz4KKyAgICA8L2NvbnRlbnQ+CisgICAgPG9yZGVyRW50cnkgdHlwZT0iaW5oZXJpdGVkSmRrIiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9InNvdXJjZUZvbGRlciIgZm9yVGVzdHM9ImZhbHNlIiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjoganVuaXQ6anVuaXQ6NC4xMiIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBvcmcuaGFtY3Jlc3Q6aGFtY3Jlc3QtY29yZToxLjMiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgbW9kdWxlLW5hbWU9ImphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYyIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJNYXZlbjogb3JnLmphdmFzc2lzdDpqYXZhc3Npc3Q6My4yMi4wLUdBIiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJNYXZlbjogY29tLmdvb2dsZS5ndWF2YTpndWF2YToyMy40LWpyZSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IGNvbS5nb29nbGUuY29kZS5maW5kYnVnczpqc3IzMDU6MS4zLjkiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIG5hbWU9Ik1hdmVuOiBjb20uZ29vZ2xlLmVycm9ycHJvbmU6ZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnM6Mi4wLjE4IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBuYW1lPSJNYXZlbjogY29tLmdvb2dsZS5qMm9iamM6ajJvYmpjLWFubm90YXRpb25zOjEuMSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgbmFtZT0iTWF2ZW46IG9yZy5jb2RlaGF1cy5tb2pvOmFuaW1hbC1zbmlmZmVyLWFubm90YXRpb25zOjEuMTQiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogb3JnLm1vY2tpdG86bW9ja2l0by1jb3JlOjIuMTMuMCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBuZXQuYnl0ZWJ1ZGR5OmJ5dGUtYnVkZHk6MS43LjkiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogbmV0LmJ5dGVidWRkeTpieXRlLWJ1ZGR5LWFnZW50OjEuNy45IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IG9yZy5vYmplbmVzaXM6b2JqZW5lc2lzOjIuNiIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlIiBtb2R1bGUtbmFtZT0iamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLW1vZGVsIiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9Im1vZHVsZSIgbW9kdWxlLW5hbWU9ImphdmFwYXJzZXItY29yZSIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJtb2R1bGUiIG1vZHVsZS1uYW1lPSJqYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZSIgLz4KKyAgPC9jb21wb25lbnQ+Cis8L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9wb20ueG1sIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA0MmQyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmcvcG9tLnhtbApAQCAtMCwwICsxLDIzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4xNi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZzwvYXJ0aWZhY3RJZD4KKyAgICA8ZGVzY3JpcHRpb24+QSBTeW1ib2wgU29sdmVyIGZvciBKYXZhLCBidWlsdCBvbiB0b3Agb2YgSmF2YVBhcnNlciAodGVzdHMpPC9kZXNjcmlwdGlvbj4KKworICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5HTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC5odG1sPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+QSBidXNpbmVzcy1mcmllbmRseSBPU1MgbGljZW5zZTwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICA8L2xpY2Vuc2VzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5Ob25TbG93VGVzdHM8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZWRHcm91cHM+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLlNsb3dUZXN0PC9leGNsdWRlZEdyb3Vwcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYWxsZWw+bWV0aG9kczwvcGFyYWxsZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRocmVhZENvdW50PjQ8L3RocmVhZENvdW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisKKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+QWxzb1Nsb3dUZXN0czwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYWxsZWw+bWV0aG9kczwvcGFyYWxsZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRocmVhZENvdW50PjQ8L3RocmVhZENvdW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmphY29jbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNvY28tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphY29jby1pbml0aWFsaXplPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcmVwYXJlLWFnZW50PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amFjb2NvLXNpdGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlcG9ydDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktcmVzb3VyY2VzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL2phdmFwYXJzZXItY29yZS90YXJnZXQvY2xhc3NlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnVucGFjay10ZXN0LWpzcy1zb3VyY2VzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnVucGFjazwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamF2YXBhcnNlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmEtc3ltYm9sLXNvbHZlci1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MC42LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9zcmMvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamF2YXBhcnNlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmEtc3ltYm9sLXNvbHZlci1sb2dpYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjAuNi4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvc3JjL2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YS1zeW1ib2wtc29sdmVyLW1vZGVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MC42LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9zcmMvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXRlc3QtanNzLWxpYnM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIxLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2xpYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My41LjEwPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9saWIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmlvLmphdmFzbGFuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmFzbGFuZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9saWIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjE5LjAtR0E8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2xpYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8IS0tIG5vIG5lZWQgdG8gcmVsZWFzZSB0aGlzIG1vZHVsZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1zeW1ib2wtc29sdmVyLWxvZ2ljPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItbW9kZWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9TbG93VGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvU2xvd1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc5MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvU2xvd1Rlc3QuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisvKioKKyAqIFRlc3QgY2F0ZWdvcnkgbWFya2VyLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNsb3dUZXN0IHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRQcmltaXRpdmVUeXBlVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVzb2x1dGlvbi90eXBlcy9SZXNvbHZlZFByaW1pdGl2ZVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0YjJiMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3Jlc29sdXRpb24vdHlwZXMvUmVzb2x2ZWRQcmltaXRpdmVUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBSZXNvbHZlZFByaW1pdGl2ZVR5cGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBleGFtcGxlT2ZTd2l0Y2goUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHJwdCkgeworICAgICAgICBzd2l0Y2ggKHJwdCkgeworICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJJIjsKKyAgICAgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIiOworICAgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJEIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ5VGhlU3dpdGNoU3RhdGVtZW50KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlUiLCBleGFtcGxlT2ZTd2l0Y2goUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVIiwgZXhhbXBsZU9mU3dpdGNoKFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIGV4YW1wbGVPZlN3aXRjaChSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQllURSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlUiLCBleGFtcGxlT2ZTd2l0Y2goUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JUKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSSIsIGV4YW1wbGVPZlN3aXRjaChSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5UKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVSIsIGV4YW1wbGVPZlN3aXRjaChSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlUiLCBleGFtcGxlT2ZTd2l0Y2goUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FUKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRCIsIGV4YW1wbGVPZlN3aXRjaChSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0Fic3RyYWN0VGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0Fic3RyYWN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTIxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvQWJzdHJhY3RUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEZpbGUgYWRhcHRQYXRoKEZpbGUgcGF0aCkgeworICAgICAgICBpZiAocGF0aC5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIHVuZGVySmF2YVBhcnNlckNvcmUgPSBuZXcgRmlsZSgiamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3RpbmcvIiArIHBhdGguZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGlmICh1bmRlckphdmFQYXJzZXJDb3JlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVySmF2YVBhcnNlckNvcmU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkkgY2Fubm90IGFkYXB0IHRoZSBwYXRoICIgKyBwYXRoLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGFkYXB0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gYWRhcHRQYXRoKG5ldyBGaWxlKHBhdGgpKS5nZXRQYXRoKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNKYXZhOSgpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIikuc3RhcnRzV2l0aCgiOS4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0phdmE4KCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKS5zdGFydHNXaXRoKCIxLjguIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0ZpbmRpbmdBbGxGaWVsZHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9GaW5kaW5nQWxsRmllbGRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiNzBlOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9GaW5kaW5nQWxsRmllbGRzLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgRmluZGluZ0FsbEZpZWxkcyBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaW5kQWxsSW5oZXJpdGVkRmllbGRzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQUNsYXNzV2l0aEZpZWxkcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NDID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQyIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzQyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCB0eXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiYSIsICJiIiwgImMiKSwKKyAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkubWFwKFJlc29sdmVkRGVjbGFyYXRpb246OmdldE5hbWUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaW5kQWxsSW5oZXJpdGVkRmllbGRzQW5kR2VuZXJpY3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJBQ2xhc3NXaXRoRmllbGRzQW5kR2VuZXJpY3MiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzQyA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkMiKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc0MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgdHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImEiLCAiYiIsICJjIiksCisgICAgICAgICAgICAgICAgdHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpLnN0cmVhbSgpLm1hcChSZXNvbHZlZERlY2xhcmF0aW9uOjpnZXROYW1lKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IiwgdHlwZURlY2xhcmF0aW9uLmdldEZpZWxkKCJiIikuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTExMy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTEzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3YTJlMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTExMy5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTExMyBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUxMTMiKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTEzcHJvdmlkZWRDb2RlRG9lc05vdENyYXNoKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXRoVG9Tb3VyY2VGaWxlID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUxMTMvY29tL2Zvby9XaWRnZXQuamF2YSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKG5ldyBGaWxlKHBhdGhUb1NvdXJjZUZpbGUpKTsKKworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIHBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmZpbmRBbGwoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihub2RlIC0+IG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoImRvU29tZXRoaW5nIikpLmZpbmRBbnkoKS5vckVsc2UobnVsbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLmZpbmRBbGwoTWV0aG9kQ2FsbEV4cHIuY2xhc3MpLmZvckVhY2gocGFyc2VyRmFjYWRlOjpzb2x2ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTExM3N1cGVyQ2xhc3NJc1Jlc29sdmVkQ29ycmVjdGx5KCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXRoVG9Tb3VyY2VGaWxlID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUxMTMvY29tL2Zvby9XaWRnZXQuamF2YSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKG5ldyBGaWxlKHBhdGhUb1NvdXJjZUZpbGUpKTsKKworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBqc3NFeHRlbmRlZFdpZGdldCA9IG5ldyBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbihjdS5nZXRDbGFzc0J5TmFtZSgiV2lkZ2V0IikuZ2V0KCksIHR5cGVTb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3VwZXJDbGFzcyA9IGpzc0V4dGVuZGVkV2lkZ2V0LmdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZm9vLmJhc2UuV2lkZ2V0Iiwgc3VwZXJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTE2LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxMTYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQzNDZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTE2LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTExNiBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhcnJheVR5cGVJc05vdFBhcnRPZlRoZVRyZWUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTExNiIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJKYXZhVGVzdCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmb28iKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSB0eXBlTm9kZSA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZSgpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuY29udmVydCh0eXBlTm9kZSwgdHlwZU5vZGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIsIHR5cGUuZGVzY3JpYmUoKSk7CisKKyAgICAgICAgRXhwcmVzc2lvblN0bXQgZXhwcmVzc2lvblN0bXQgPSAoRXhwcmVzc2lvblN0bXQpIG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOworICAgICAgICBFeHByZXNzaW9uIGFyZ1JlZiA9IGV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nW10iLCBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoYXJnUmVmKS5kZXNjcmliZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxMjguamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTEyOC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjhiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxMjguamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUxMjggZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzcmNEaXIgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTEyOCIpKTsKKyAgICAgICAgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCksIG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihzcmNEaXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZlcmlmeUphdmFUZXN0Q2xhc3NJc1NvbHZlZCgpIHsKKyAgICAgICAgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImZvby5KYXZhVGVzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbG9vcE9uU3RhdGljYWxseUltcG9ydGVkVHlwZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGVXaXRoU3RhbmRhcmRFeHRlbnNpb24oImlzc3VlMTI4L2Zvby9Jc3N1ZTEyOCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJKYXZhVGVzdCIpOworICAgICAgICBFeHByZXNzaW9uU3RtdCBleHByZXNzaW9uU3RtdCA9IChFeHByZXNzaW9uU3RtdCljbGF6ei5nZXRNZXRob2RzQnlOYW1lKCJ0ZXN0IikuZ2V0KDApLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoMCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGxFeHByID0gKE1ldGhvZENhbGxFeHByKSBleHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShtZXRob2RDYWxsRXhwcikuaXNTb2x2ZWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTM2NC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTM2NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDg2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxMzY0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBEb21pbmlrIEhhcmR0a2UKKyAqIEBzaW5jZSAwMi4wMi4yMDE4CisgKi8KK3B1YmxpYyBjbGFzcyBJc3N1ZTEzNjQgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKyAgICBwcml2YXRlIEphdmFQYXJzZXIgamF2YVBhcnNlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGZha2VPYmplY3QgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCk7CisgICAgICAgIGZha2VPYmplY3Quc2V0TmFtZShuZXcgU2ltcGxlTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgVHlwZVNvbHZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFR5cGVTb2x2ZXIgZ2V0UGFyZW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUeXBlU29sdmVyIHBhcmVudCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IHRyeVRvU29sdmVUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbihmYWtlT2JqZWN0LCB0aGlzKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcuc2V0U3ltYm9sUmVzb2x2ZXIobmV3IEphdmFTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikpOworICAgICAgICBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIoY29uZmlnKTsKKyAgICB9CisKKyAgICBAVGVzdCh0aW1lb3V0ID0gMTAwMCkKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlU3ViQ2xhc3NPZk9iamVjdCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSBTdHJpbmcuam9pbihTeXN0ZW0ubGluZVNlcGFyYXRvcigpLAorICAgICAgICAgICAgICAgICJwYWNrYWdlIGdyYXBoOyIsCisgICAgICAgICAgICAgICAgInB1YmxpYyBjbGFzcyBWZXJ0ZXggeyIsCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7IiwKKyAgICAgICAgICAgICAgICAiICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsiLAorICAgICAgICAgICAgICAgICIgICAgfSIsCisgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICk7CisKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiBwYXJzZVJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBQcm92aWRlcnMucHJvdmlkZXIoY29kZSkpOworICAgICAgICBhc3NlcnRUcnVlKHBhcnNlUmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXJzZVJlc3VsdC5nZXRSZXN1bHQoKS5pc1ByZXNlbnQoKSk7CisKKyAgICAgICAgTGlzdDxNZXRob2RDYWxsRXhwcj4gbWV0aG9kQ2FsbEV4cHJzID0gcGFyc2VSZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCkuZmluZEFsbChNZXRob2RDYWxsRXhwci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RDYWxsRXhwcnMuc2l6ZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0aG9kQ2FsbEV4cHJzLmdldCgwKS5jYWxjdWxhdGVSZXNvbHZlZFR5cGUoKTsKKyAgICAgICAgICAgIGZhaWwoIkFuIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgLy8gYWxsIGlzIGZpbmUgaWYgYW4gVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTE0NC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjOGZmNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTE0NC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTE0NCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHNyY0RpciA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMTQ0IikpOworICAgICAgICB0eXBlU29sdmVyID0gbmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyY0Rpcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTE0NCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGVXaXRoU3RhbmRhcmRFeHRlbnNpb24oImlzc3VlMTQ0L0hlbGxvV29ybGQiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiSGVsbG9Xb3JsZCIpOworICAgICAgICBFeHByZXNzaW9uU3RtdCBleHByZXNzaW9uU3RtdCA9IChFeHByZXNzaW9uU3RtdCljbGF6ei5nZXRNZXRob2RzQnlOYW1lKCJtYWluIikuZ2V0KDApLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoMCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGxFeHByID0gKE1ldGhvZENhbGxFeHByKSBleHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIEV4cHJlc3Npb24gZmlyc3RQYXJhbWV0ZXIgPSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudCgwKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisKKyAgICAgICAgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShmaXJzdFBhcmFtZXRlcikuaXNTb2x2ZWQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTQ0V2l0aFJlZmxlY3Rpb25UeXBlU29sdmVyKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZVdpdGhTdGFuZGFyZEV4dGVuc2lvbigiaXNzdWUxNDQvSGVsbG9Xb3JsZCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJIZWxsb1dvcmxkIik7CisgICAgICAgIEV4cHJlc3Npb25TdG10IGV4cHJlc3Npb25TdG10ID0gKEV4cHJlc3Npb25TdG10KWNsYXp6LmdldE1ldGhvZHNCeU5hbWUoIm1haW4iKS5nZXQoMCkuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSAoTWV0aG9kQ2FsbEV4cHIpIGV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgRXhwcmVzc2lvbiBmaXJzdFBhcmFtZXRlciA9IG1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50KDApOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIodHJ1ZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKGZpcnN0UGFyYW1ldGVyKS5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTQ0V2l0aENvbWJpbmVkVHlwZVNvbHZlcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGVXaXRoU3RhbmRhcmRFeHRlbnNpb24oImlzc3VlMTQ0L0hlbGxvV29ybGQiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiSGVsbG9Xb3JsZCIpOworICAgICAgICBFeHByZXNzaW9uU3RtdCBleHByZXNzaW9uU3RtdCA9IChFeHByZXNzaW9uU3RtdCljbGF6ei5nZXRNZXRob2RzQnlOYW1lKCJtYWluIikuZ2V0KDApLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoMCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGxFeHByID0gKE1ldGhvZENhbGxFeHByKSBleHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIEV4cHJlc3Npb24gZmlyc3RQYXJhbWV0ZXIgPSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudCgwKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IENvbWJpbmVkVHlwZVNvbHZlcih0eXBlU29sdmVyLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIodHJ1ZSkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShmaXJzdFBhcmFtZXRlcikuaXNTb2x2ZWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTU2LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxNTYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAwYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTU2LmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIElzc3VlMTU2IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc1Rocm91Z2hDbGFzc0FuZFRoaXMoKSB7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlMTU2Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIklzc3VlMTU2Iik7CisgICAgICAgIExpc3Q8TWV0aG9kQ2FsbEV4cHI+IG1ldGhvZHMgPSBjbGF6ei5nZXRDaGlsZE5vZGVzKCkuZ2V0KDIpLmdldENoaWxkTm9kZXMoKS5nZXQoMSkuZmluZEFsbChNZXRob2RDYWxsRXhwci5jbGFzcyk7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNoYXIiLCBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUobWV0aG9kcy5nZXQoMCkpLmRlc2NyaWJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTE4LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxOC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGRkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxOC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUxOCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0eXBlRGVjbGFyYXRpb25TdXBlckNsYXNzSW1wbGljaXRseUluY2x1ZGVPYmplY3QoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTE4Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkZvbyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJiYXIiKTsKKyAgICAgICAgRXhwcmVzc2lvblN0bXQgZXhwciA9IChFeHByZXNzaW9uU3RtdCkgbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMSk7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoZXhwci5nZXRFeHByZXNzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTE4NS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTg1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhZDBiMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTE4NS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisKK3B1YmxpYyBjbGFzcyBJc3N1ZTE4NSBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNzdWUoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzcmMgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9yZWN1cnNpb24taXNzdWUiKSk7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyYykpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFnZW5kYUN1ID0gSmF2YVBhcnNlci5wYXJzZShhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9yZWN1cnNpb24taXNzdWUvVXNhZ2UuamF2YSIpKSk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGZvbyA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChhZ2VuZGFDdSwgImZvbyIpLmdldCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZvbyk7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbWJpbmVkVHlwZVNvbHZlcikuZ2V0VHlwZShmb28pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTg2LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUxODYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTkwZTllCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMTg2LmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUxODYgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbGFtYmRhRmxhdE1hcElzc3VlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiSXNzdWUxODYiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiSmF2YVRlc3QiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZm9vIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGxFeHByID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZERlY2xhcmF0aW9uLCAiZmxhdE1hcCIpLmdldCgpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLnN0cmVhbS5TdHJlYW08amF2YS5sYW5nLlN0cmluZz4iLCBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUobWV0aG9kQ2FsbEV4cHIpLmRlc2NyaWJlKCkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsYW1iZGFQcmltaXRpdmVzSXNzdWUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTE4NiIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJKYXZhVGVzdCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJiYXIiKTsKKyAgICAgICAgTGlzdDxMYW1iZGFFeHByPiBsYW1iZGFzID0gbWV0aG9kRGVjbGFyYXRpb24uZmluZEFsbChMYW1iZGFFeHByLmNsYXNzKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBqYXZhLmxhbmcuU3RyaW5nPiIsIGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShsYW1iZGFzLmdldCgwKSkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgamF2YS5sYW5nLlN0cmluZywgPyBleHRlbmRzIGphdmEubGFuZy5JbnRlZ2VyPiIsIGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShsYW1iZGFzLmdldCgxKSkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIGphdmEubGFuZy5JbnRlZ2VyPiIsIGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShsYW1iZGFzLmdldCgyKSkuZGVzY3JpYmUoKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIwMC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjAwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzNTk4NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIwMC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUyMDAgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUyMDAoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTIwMCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJKYXZhVGVzdCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmb28iKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgICAgICBMaXN0PFJldHVyblN0bXQ+IG5vZGVzQnlUeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZmluZEFsbChSZXR1cm5TdG10LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTxKYXZhVGVzdC5Tb2x2ZWQ+IiwgamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKChub2Rlc0J5VHlwZS5nZXQoMCkpLmdldEV4cHJlc3Npb24oKS5nZXQoKSkuZGVzY3JpYmUoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIyOC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjI4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkNWJkYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIyOC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIElzc3VlMjI4IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZpbmdNZXRob2RXaXRQcmltaXRpdmVQYXJhbWV0ZXJUeXBlQXNVc2FnZSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAKKyAgICAgICAgICAgICAgICAgICJjbGFzcyBUZXN0IHsgIgorICAgICAgICAgICAgICAgICsgIiAgbG9uZyBsID0gY2FsbCgxKTsgIgorICAgICAgICAgICAgICAgICsgIiAgbG9uZyBjYWxsKGZpbmFsIGxvbmcgaSkgeyAiCisgICAgICAgICAgICAgICAgKyAiICAgIHJldHVybiBpOyAiCisgICAgICAgICAgICAgICAgKyAiICB9IgorICAgICAgICAgICAgICAgICsgIn0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsID0gY3UuZmluZEFsbChNZXRob2RDYWxsRXhwci5jbGFzcykuZ2V0KDApOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIHBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgTWV0aG9kVXNhZ2Ugc29sdmVkQ2FsbCA9IHBhcnNlckZhY2FkZS5zb2x2ZU1ldGhvZEFzVXNhZ2UobWV0aG9kQ2FsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygibG9uZyIsIHNvbHZlZENhbGwuZ2V0UGFyYW1UeXBlKDApLmRlc2NyaWJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIzMi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjMyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0NTUwZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIzMi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIElzc3VlMjMyIGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTIzMigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlMjMyIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbHMgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3NPckludGVyZmFjZShjdSwgIk9mRG91YmxlIik7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjbHMsIHR5cGVTb2x2ZXIpOworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IGNvbnRleHQuc29sdmVUeXBlKCJPZlByaW1pdGl2ZTxEb3VibGUsIERvdWJsZUNvbnN1bWVyLCBPZkRvdWJsZT4iLCB0eXBlU29sdmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUyMzUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTIzNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNGQxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUyMzUuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBJc3N1ZTIzNSBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3R7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWV0aG9kOworCisgICAgcHVibGljIElzc3VlMjM1KFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZGF0YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAibmV3X0Jhcl9CYXpfZGlyZWN0IiwKKyAgICAgICAgICAgICAgICAibmV3X0Jhcl9CYXoiLAorICAgICAgICAgICAgICAgICJuZXdfQmFyIiwKKyAgICAgICAgICAgICAgICAibmV3X0Zvb19CYXIiCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTIzNSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlMjM1Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbHMgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3NPckludGVyZmFjZShjdSwgIkZvbyIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG0gPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNscywgdGhpcy5tZXRob2QpOworICAgICAgICBFeHByZXNzaW9uU3RtdCBzdG10ID0gKEV4cHJlc3Npb25TdG10KSBtLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOworICAgICAgICBPYmplY3RDcmVhdGlvbkV4cHIgZXhwcmVzc2lvbiA9IChPYmplY3RDcmVhdGlvbkV4cHIpIHN0bXQuZ2V0RXhwcmVzc2lvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChqYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlKGV4cHJlc3Npb24uZ2V0VHlwZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjQxLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUyNDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQyMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjQxLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUyNDEgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0eworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTdGF0aWNhbGx5SW1wb3J0ZWRNZW1iZXJUeXBlKCkgeworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIikpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjKSk7CisgICAgICAgIAkJCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgICAgICAKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlMjQxIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbHMgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3NPckludGVyZmFjZShjdSwgIk1haW4iKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHYgPSBOYXZpZ2F0b3IuZGVtYW5kVmFyaWFibGVEZWNsYXJhdGlvbihjbHMsICJmb28iKS5nZXQoKTsKKyAgICAgICAgCisgICAgICAgIFR5cGUgdCA9IHYuZ2V0VHlwZSgpOworICAgICAgICBSZXNvbHZlZFR5cGUgdDIgPSBqYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnQodCwgdCk7CisgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHQyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc3N1ZTI0MS5UeXBlV2l0aE1lbWJlclR5cGUuTWVtYmVySW50ZXJmYWNlIiwgdHlwZU5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTI1MS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkYzBhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTI1MS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgSXNzdWUyNTEgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0eworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTdGF0aWNhbGx5SW1wb3J0ZWRNZW1iZXJUeXBlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiSXNzdWUyNTEiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNscyA9IE5hdmlnYXRvci5kZW1hbmRDbGFzc09ySW50ZXJmYWNlKGN1LCAiTWFpbiIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG0gPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNscywgImJhciIpOworICAgICAgICBFeHByZXNzaW9uU3RtdCBzdG10ID0gKEV4cHJlc3Npb25TdG10KSBtLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDEpOworICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gKE1ldGhvZENhbGxFeHByKSBzdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoamF2YVBhcnNlckZhY2FkZS5zb2x2ZShleHByZXNzaW9uKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjc2LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUyNzYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmFhYWIwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMjc2LmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDb250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTI3NiBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3R7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN0YXRpY2FsbHlJbXBvcnRlZE1lbWJlclR5cGUoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZShhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI3Ni9mb28vQy5qYXZhIikpKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNscyA9IE5hdmlnYXRvci5kZW1hbmRDbGFzc09ySW50ZXJmYWNlKGN1LCAiQyIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKAorICAgICAgICAJCW5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCAKKyAgICAgICAgCQluZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUyNzYiKSkpKTsKKyAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IGNscy5maW5kQWxsKE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBpc1NvbHZlZCA9IGZhbHNlOworICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDogbWV0aG9kcykgeworICAgICAgICAJaWYgKG1ldGhvZC5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMoIm92ZXJyaWRlTWUiKSkgeworICAgICAgICAJCU1ldGhvZENvbnRleHQgY29udGV4dCA9IG5ldyBNZXRob2RDb250ZXh0KG1ldGhvZCwgdHlwZVNvbHZlcik7CisgICAgICAgIAkJaXNTb2x2ZWQgPSBjb250ZXh0LnNvbHZlVHlwZSgiRmluZE1lSWZZb3VDYW4iLCB0eXBlU29sdmVyKS5pc1NvbHZlZCgpOworICAgICAgICAJfQorICAgICAgICB9CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGlzU29sdmVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUzMDAuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTMwMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTliOGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWUzMDAuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTMwMCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaWVsZEFjY2Vzc0lzc3VlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGF0aFRvU291cmNlRmlsZSA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMzAwL0lzc3VlMzAwLmphdmEiKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZShwYXRoVG9Tb3VyY2VGaWxlKSk7CisKKyAgICAgICAgZmluYWwgRmllbGRBY2Nlc3NFeHByIGZpZWxkQWNjZXNzID0gTmF2aWdhdG9yLmZpbmROb2RlT2ZHaXZlbkNsYXNzKGN1LCBGaWVsZEFjY2Vzc0V4cHIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkQWNjZXNzKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLAorICAgICAgICAgICAgICAgIG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTMwMCIpKSkpOworICAgICAgICBmaW5hbCBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKyAgICAgICAgZmluYWwgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IGphdmFQYXJzZXJGYWNhZGUuc29sdmUoZmllbGRBY2Nlc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVCwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFR5cGUoKS5hc1ByaW1pdGl2ZSgpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTMxNC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMzE0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwZmY3OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTMxNC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTMxNCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3R7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVJlc29sdmVyOworICAgIHByaXZhdGUgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlOworCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGUgZ2V0RXhwcmVzc2lvblR5cGUoVHlwZVNvbHZlciB0eXBlU29sdmVyLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgcmV0dXJuIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUoZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVSZXNvbHZlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlUmVmZXJlbmNlVG9GaWVsZEluaGVyaXRlZEJ5SW50ZXJmYWNlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJwYWNrYWdlIGZvby5iYXI7XG4iKworICAgICAgICAgICAgICAgICJpbnRlcmZhY2UgIEEge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgaW50IGEgPSAwO1xuIiArCisgICAgICAgICAgICAgICAgIiAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIFxuIiArCisgICAgICAgICAgICAgICAgIiAgICBjbGFzcyBCIGltcGxlbWVudHMgQSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBpbnQgZ2V0QSgpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICByZXR1cm4gYTtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIH1cbiIgKworICAgICAgICAgICAgICAgICIgICAgfSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIE5hbWVFeHByIHJlZlRvQSA9IE5hdmlnYXRvci5maW5kTmFtZUV4cHJlc3Npb24oTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQiIpLCAiYSIpLmdldCgpOworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc3ltYm9sUmVmZXJlbmNlID0gamF2YVBhcnNlckZhY2FkZS5zb2x2ZShyZWZUb0EpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmlzRmllbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTM0My5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMzQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzNGM2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTM0My5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUzNDMgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0eworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVSZXNvbHZlcjsKKyAgICBwcml2YXRlIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZTsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIGdldEV4cHJlc3Npb25UeXBlKFR5cGVTb2x2ZXIgdHlwZVNvbHZlciwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgdHlwZVJlc29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlUmVzb2x2ZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVN0cmluZ0xpdGVyYWxPdXRzaWRlQVNUKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoamF2YVBhcnNlckZhY2FkZS5jbGFzc1RvUmVzb2x2ZWRUeXBlKFN0cmluZy5jbGFzcyksIGdldEV4cHJlc3Npb25UeXBlKHR5cGVSZXNvbHZlciwgbmV3IFN0cmluZ0xpdGVyYWxFeHByKCIiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUludGVnZXJMaXRlcmFsT3V0c2lkZUFTVCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmFQYXJzZXJGYWNhZGUuY2xhc3NUb1Jlc29sdmVkVHlwZShpbnQuY2xhc3MpLCBnZXRFeHByZXNzaW9uVHlwZSh0eXBlUmVzb2x2ZXIsIG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoMikpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0b1Jlc29sdmVEb3VibGVXZU5lZWRUaGVBU1QoKSB7CisgICAgICAgIGdldEV4cHJlc3Npb25UeXBlKHR5cGVSZXNvbHZlciwgSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oIm5ldyBEb3VibGVbXXsyLjBkLCAzLjBkfVsxXSIpKTsKKyAgICB9CisKKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRvUmVzb2x2ZUZsb2F0V2VOZWVkVGhlQVNUKCkgeworICAgICAgICBnZXRFeHByZXNzaW9uVHlwZSh0eXBlUmVzb2x2ZXIsIEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKCJuZXcgRmxvYXRbXXsyLjBkLCAzLjBkfSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVNZXRob2RDYWxsT25TdHJpbmdMaXRlcmFsT3V0c2lkZUFTVCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmFQYXJzZXJGYWNhZGUuY2xhc3NUb1Jlc29sdmVkVHlwZShpbnQuY2xhc3MpLCBnZXRFeHByZXNzaW9uVHlwZSh0eXBlUmVzb2x2ZXIsIG5ldyBNZXRob2RDYWxsRXhwcihuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoImhlbGxvIiksICJsZW5ndGgiKSkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVMb2NhbGVPdXRzaWRlQVNUKCkgeworICAgICAgICBnZXRFeHByZXNzaW9uVHlwZSh0eXBlUmVzb2x2ZXIsIG5ldyBGaWVsZEFjY2Vzc0V4cHIobmV3IE5hbWVFeHByKCJMb2NhbGUiKSwgIlVTIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTM0Ny5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0lzc3VlMzQ3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NTViZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTM0Ny5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSXNzdWUzNDcgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0eworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGU7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2aW5nUmVmZXJlbmNlVG9FbnVtRGVjbGFyYXRpb25JblNhbWVGaWxlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJwYWNrYWdlIGZvby5iYXI7XG5lbnVtIEZvbyB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIEZPT19BLCBGT09fQlxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICJjbGFzcyBVc2luZ0ZvbyB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIEZvbyBteUZvb0ZpZWxkO1xuIiArCisgICAgICAgICAgICAgICAgIn0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZmluZE5vZGVPZkdpdmVuQ2xhc3MoY3UsIEZpZWxkRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBSZXNvbHZlZFR5cGUgZmllbGRUeXBlID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGZpZWxkRGVjbGFyYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZmllbGRUeXBlLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZpZWxkVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKS5pc0VudW0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vLmJhci5Gb28iLCBmaWVsZFR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9Jc3N1ZTg0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWU4NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjkyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSXNzdWU4NC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIElzc3VlODQgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyaWFkaWNJc3N1ZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlODQiKTsKKyAgICAgICAgZmluYWwgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChjdSwgInZhcmlhZGljTWV0aG9kIikuZ2V0KCk7CisKKyAgICAgICAgZmluYWwgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBmaW5hbCBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShtZXRob2RDYWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvSmF2YVBhcnNlckFQSUludGVncmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0phdmFQYXJzZXJBUElJbnRlZ3JhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjMwNzIyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0phdmFQYXJzZXJBUElJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlN0cmVhbVByb3ZpZGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyQVBJSW50ZWdyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHN0cmluZzsKKyAgICBwcml2YXRlIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBsaXN0T2ZCb29sZWFuOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUiKSk7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcigpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUuYWRkKG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihzcmMpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzIikpKSk7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlOworCisgICAgICAgIFR5cGVTb2x2ZXIgdHMgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgc3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHRzLnNvbHZlVHlwZShTdHJpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHMpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYm9vbGVhbkMgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHMuc29sdmVUeXBlKEJvb2xlYW4uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHMpOworICAgICAgICBsaXN0T2ZCb29sZWFuID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHRzLnNvbHZlVHlwZShMaXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIEltbXV0YWJsZUxpc3Qub2YoYm9vbGVhbkMpLCB0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uRGVjbGFyYXRpb25SZXNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvQW5ub3RhdGlvbnMuamF2YS50eHQiKSk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlV2l0aFN5bWJvbFJlc29sdXRpb24oZik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeUFubm90YXRpb24iLCBkZWNsYXJhdGlvbi5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIFJlc29sdmVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uIHJlc29sdmVkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5yZXNvbHZlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25SZXNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvQW5ub3RhdGlvbnMuamF2YS50eHQiKSk7CisgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbiA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIHBhcnNlckNvbmZpZ3VyYXRpb24uc2V0U3ltYm9sUmVzb2x2ZXIobmV3IEphdmFTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgSmF2YVBhcnNlcihwYXJzZXJDb25maWd1cmF0aW9uKS5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIG5ldyBTdHJlYW1Qcm92aWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGYpKSkuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeUFubm90YXRpb25XaXRoRmllbGRzIiwgZGVjbGFyYXRpb24uZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbWVtYmVyRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKWRlY2xhcmF0aW9uLmdldE1lbWJlcigwKTsKKyAgICAgICAgUmVzb2x2ZWRBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gcmVzb2x2ZWREZWNsYXJhdGlvbiA9IG1lbWJlckRlY2xhcmF0aW9uLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsYXNzRGVjbGFyYXRpb25SZXNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdC5qYXZhIikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVdpdGhTeW1ib2xSZXNvbHV0aW9uKGYpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIGRlY2xhcmF0aW9uLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZURlY2xhcmF0aW9uUmVzb2x2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZiA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL01ldGhvZFR5cGVQYXJhbXMuamF2YS50eHQiKSk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlV2l0aFN5bWJvbFJlc29sdXRpb24oZik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJWb2lkVmlzaXRvciIsIGRlY2xhcmF0aW9uLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGRlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkpOworICAgICAgICBkZWNsYXJhdGlvbi5yZXNvbHZlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgcGFyc2VXaXRoU3ltYm9sUmVzb2x1dGlvbihGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbiA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIHBhcnNlckNvbmZpZ3VyYXRpb24uc2V0U3ltYm9sUmVzb2x2ZXIobmV3IEphdmFTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikpOworICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXIocGFyc2VyQ29uZmlndXJhdGlvbikucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBuZXcgU3RyZWFtUHJvdmlkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmKSkpLmdldFJlc3VsdCgpLmdldCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29uc3RydWN0b3JEZWNsYXJhdGlvblJlc29sdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQ29tcGlsYXRpb25Vbml0LmphdmEiKSk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlV2l0aFN5bWJvbFJlc29sdXRpb24oZik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXREZWZhdWx0Q29uc3RydWN0b3IoKS5nZXQoKTsKKyAgICAgICAgUmVzb2x2ZWRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHJlc29sdmVkQ29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24ucmVzb2x2ZSgpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGVudW1EZWNsYXJhdGlvblJlc29sdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyLmphdmEiKSk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlV2l0aFN5bWJvbFJlc29sdXRpb24oZik7CisgICAgICAgIEVudW1EZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IChFbnVtRGVjbGFyYXRpb24pIGN1LmdldFR5cGUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQWNjZXNzU3BlY2lmaWVyIiwgZGVjbGFyYXRpb24uZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbiByZXNvbHZlZERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24ucmVzb2x2ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZW51bUNvbnN0YW50RGVjbGFyYXRpb25SZXNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FjY2Vzc1NwZWNpZmllci5qYXZhIikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVdpdGhTeW1ib2xSZXNvbHV0aW9uKGYpOworICAgICAgICBFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gKEVudW1EZWNsYXJhdGlvbikgY3UuZ2V0VHlwZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY2Nlc3NTcGVjaWZpZXIiLCBlbnVtRGVjbGFyYXRpb24uZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGVudW1EZWNsYXJhdGlvbi5nZXRFbnRyeSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQVUJMSUMiLCBkZWNsYXJhdGlvbi5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIFJlc29sdmVkRW51bUNvbnN0YW50RGVjbGFyYXRpb24gcmVzb2x2ZWREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZpZWxkRGVjbGFyYXRpb25SZXNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdC5qYXZhIikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVdpdGhTeW1ib2xSZXNvbHV0aW9uKGYpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIGN1LmdldFR5cGUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29tcGlsYXRpb25Vbml0IiwgY2xhc3NEZWNsYXJhdGlvbi5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBjbGFzc0RlY2xhcmF0aW9uLmdldEZpZWxkcygpLmdldCgwKTsKKyAgICAgICAgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIHJlc29sdmVkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi5yZXNvbHZlKCk7CisgICAgfQorCisgICAgLy8gVE9ETyBtYWtlIFZhcmlhYmxlRGVjbGFyYXRvciByZXNvbHZhYmxlCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZERlY2xhcmF0aW9uUmVzb2x2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZiA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Db21waWxhdGlvblVuaXQuamF2YSIpKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VXaXRoU3ltYm9sUmVzb2x1dGlvbihmKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBjdS5nZXRUeXBlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBpbGF0aW9uVW5pdCIsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0TWV0aG9kc0J5TmFtZSgiZ2V0Q29tbWVudHMiKS5nZXQoMCk7CisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gcmVzb2x2ZWREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLnJlc29sdmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRDb21tZW50cyIsIHJlc29sdmVkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc29sdmVkRGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJEZWNsYXJhdGlvblJlc29sdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQ29tcGlsYXRpb25Vbml0LmphdmEiKSk7CisgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbiA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIHBhcnNlckNvbmZpZ3VyYXRpb24uc2V0U3ltYm9sUmVzb2x2ZXIobmV3IEphdmFTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgSmF2YVBhcnNlcihwYXJzZXJDb25maWd1cmF0aW9uKS5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIG5ldyBTdHJlYW1Qcm92aWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGYpKSkuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgY3UuZ2V0VHlwZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21waWxhdGlvblVuaXQiLCBjbGFzc0RlY2xhcmF0aW9uLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBjbGFzc0RlY2xhcmF0aW9uLmdldE1ldGhvZHNCeU5hbWUoInNldENvbW1lbnRzIikuZ2V0KDApOworICAgICAgICBQYXJhbWV0ZXIgZGVjbGFyYXRpb24gPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXIoMCk7CisgICAgICAgIFJlc29sdmVkUGFyYW1ldGVyRGVjbGFyYXRpb24gcmVzb2x2ZWREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLnJlc29sdmUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9KYXZhU3ltYm9sU29sdmVyVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL0phdmFTeW1ib2xTb2x2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4YTkwNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9KYXZhU3ltYm9sU29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSmF2YVN5bWJvbFNvbHZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZU1ldGhvZERlY2xhcmF0aW9uKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiU3ltYm9sUmVzb2x2ZXJFeGFtcGxlIik7CisgICAgICAgIG5ldyBKYXZhU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLmluamVjdChjdSk7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1ldGhvZHMoKS5nZXQoMCk7CisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gcmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQVtdIiwgcmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdIiwgcmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbSgwKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50W10iLCByZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtKDEpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVBcnJheVR5cGUoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJTeW1ib2xSZXNvbHZlckV4YW1wbGUiKTsKKyAgICAgICAgbmV3IEphdmFTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuaW5qZWN0KGN1KTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWV0aG9kcygpLmdldCgwKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlc29sdmVkVHlwZSA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGUoKS5yZXNvbHZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQVtdIiwgcmVzb2x2ZWRUeXBlLmRlc2NyaWJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvQ29udmVydFRvVXNhZ2VUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0NvbnZlcnRUb1VzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWRhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0NvbnZlcnRUb1VzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBDb252ZXJ0VG9Vc2FnZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VHlwZVRvVXNhZ2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJMb2NhbFR5cGVEZWNsYXJhdGlvbnMiKTsKKyAgICAgICAgTGlzdDxOYW1lRXhwcj4gbiA9IGN1LmZpbmRBbGwoTmFtZUV4cHIuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgdXNhZ2VEZXNjcmliZShuLCAiYSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIHVzYWdlRGVzY3JpYmUobiwgImIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzPGphdmEubGFuZy5JbnRlZ2VyPiIsIHVzYWdlRGVzY3JpYmUobiwgImMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzPD8gc3VwZXIgamF2YS5sYW5nLkludGVnZXI+IiwgdXNhZ2VEZXNjcmliZShuLCAiZCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5JbnRlZ2VyPiIsIHVzYWdlRGVzY3JpYmUobiwgImUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuQ2xhc3M8PyBzdXBlciBqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5JbnRlZ2VyPj4+IiwgdXNhZ2VEZXNjcmliZShuLCAiZiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3M8PyBzdXBlciBqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5DbGFzczw/IHN1cGVyIGphdmEubGFuZy5JbnRlZ2VyPj4+IiwgdXNhZ2VEZXNjcmliZShuLCAiZyIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1c2FnZURlc2NyaWJlKExpc3Q8TmFtZUV4cHI+IG4sIFN0cmluZyBuYW1lKXsKKyAgICAgICAgcmV0dXJuIG4uc3RyZWFtKCkuZmlsdGVyKHggLT4geC5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgLm1hcChKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTo6Z2V0VHlwZSkKKyAgICAgICAgICAgICAgICAubWFwKFJlc29sdmVkVHlwZTo6ZGVzY3JpYmUpCisgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0RpZmZlcmVudGlhdGVEb3RFeHByZXNzaW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9EaWZmZXJlbnRpYXRlRG90RXhwcmVzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjVhODdiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9EaWZmZXJlbnRpYXRlRG90RXhwcmVzc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBEaWZmZXJlbnRpYXRlRG90RXhwcmVzc2lvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgY29tYmluZWRUeXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcigpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMiKSkpKTsKKyAgICAgICAgdHlwZVNvbHZlciA9IGNvbWJpbmVkVHlwZVNvbHZlcjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZENhbGxzRnJvbUZpZWxkT2JqZWN0cygpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gKChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoIkZpZWxkRG90RXhwcmVzc2lvbnMiKSkuZ2V0V3JhcHBlZE5vZGUoKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWFpbk1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJtYWluIik7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworCisgICAgICAgIE1ldGhvZENhbGxFeHByIGZpcnN0RmllbGRNZXRob2RDYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1haW5NZXRob2QsICJmaXJzdENvbnRhaW5lck1ldGhvZCIpLmdldCgpOworICAgICAgICBNZXRob2RDYWxsRXhwciBzZWNvbmRGaWVsZE1ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWFpbk1ldGhvZCwgInNlY29uZENvbnRhaW5lck1ldGhvZCIpLmdldCgpOworICAgICAgICBNZXRob2RDYWxsRXhwciB0aGlyZEZpZWxkTWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtYWluTWV0aG9kLCAidGhpcmRDb250YWluZXJNZXRob2QiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShmaXJzdEZpZWxkTWV0aG9kQ2FsbCkuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKHNlY29uZEZpZWxkTWV0aG9kQ2FsbCkuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKHRoaXJkRmllbGRNZXRob2RDYWxsKS5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0YXRpY01ldGhvZENhbGxzRnJvbUlubmVyQ2xhc3NlcygpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gKChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoIklubmVyQ2xhc3NEb3RFeHByZXNzaW9ucyIpKS5nZXRXcmFwcGVkTm9kZSgpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtYWluTWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgIm1haW4iKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtYWluTWV0aG9kLCAibWV0aG9kQ2FsbCIpLmdldCgpOworICAgICAgICBNZXRob2RDYWxsRXhwciBpbm5lck1ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWFpbk1ldGhvZCwgImlubmVyTWV0aG9kQ2FsbCIpLmdldCgpOworICAgICAgICBNZXRob2RDYWxsRXhwciBpbm5lcklubmVyTWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtYWluTWV0aG9kLCAiaW5uZXJJbm5lck1ldGhvZENhbGwiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShtZXRob2RDYWxsKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFQYXJzZXJGYWNhZGUuc29sdmUoaW5uZXJNZXRob2RDYWxsKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFQYXJzZXJGYWNhZGUuc29sdmUoaW5uZXJJbm5lck1ldGhvZENhbGwpLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RhdGljRmllbGRDYWxsc0Zyb21Jbm5lckNsYXNzZXMoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9ICgoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJJbm5lclN0YXRpY0NsYXNzRmllbGREb3RFeHByZXNzaW9ucyIpKS5nZXRXcmFwcGVkTm9kZSgpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtYWluTWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgIm1haW4iKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbFdpdGhOZXN0ZWRTdGF0aWNGaWVsZFBhcmFtID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1haW5NZXRob2QsICJwYXJzZUludCIpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKG1ldGhvZENhbGxXaXRoTmVzdGVkU3RhdGljRmllbGRQYXJhbSkuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYWNrYWdlU3RhdGljTWV0aG9kQ2FsbHMoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9ICgoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJQYWNrYWdlRG90RXhwcmVzc2lvbnMiKSkuZ2V0V3JhcHBlZE5vZGUoKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWFpbk1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJtYWluIik7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworCisgICAgICAgIE1ldGhvZENhbGxFeHByIHN0YXRpY01ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWFpbk1ldGhvZCwgInN0YXRpY01ldGhvZCIpLmdldCgpOworCisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWFpbk1ldGhvZCwgIm1ldGhvZENhbGwiKS5nZXQoKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgaW5uZXJNZXRob2RDYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1haW5NZXRob2QsICJpbm5lck1ldGhvZENhbGwiKS5nZXQoKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgaW5uZXJJbm5lck1ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWFpbk1ldGhvZCwgImlubmVySW5uZXJNZXRob2RDYWxsIikuZ2V0KCk7CisKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZmlyc3RGaWVsZE1ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWFpbk1ldGhvZCwgImZpcnN0Q29udGFpbmVyTWV0aG9kIikuZ2V0KCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIHNlY29uZEZpZWxkTWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtYWluTWV0aG9kLCAic2Vjb25kQ29udGFpbmVyTWV0aG9kIikuZ2V0KCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIHRoaXJkRmllbGRNZXRob2RDYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1haW5NZXRob2QsICJ0aGlyZENvbnRhaW5lck1ldGhvZCIpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKHN0YXRpY01ldGhvZENhbGwpLmlzU29sdmVkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKG1ldGhvZENhbGwpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShpbm5lck1ldGhvZENhbGwpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShpbm5lcklubmVyTWV0aG9kQ2FsbCkuaXNTb2x2ZWQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFQYXJzZXJGYWNhZGUuc29sdmUoZmlyc3RGaWVsZE1ldGhvZENhbGwpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZShzZWNvbmRGaWVsZE1ldGhvZENhbGwpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamF2YVBhcnNlckZhY2FkZS5zb2x2ZSh0aGlyZEZpZWxkTWV0aG9kQ2FsbCkuaXNTb2x2ZWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDI5NDU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhbm9ueW1vdXNDbGFzc0FzTWV0aG9kQXJndW1lbnQoKSB7CisgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkFub255bW91c0NsYXNzRGVjbGFyYXRpb25zIik7CisgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGFDbGFzcyA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkFub255bW91c0NsYXNzRGVjbGFyYXRpb25zIik7CisgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChhQ2xhc3MsICJmb29CYXIxIik7CisgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJvZiIpLmdldCgpOworCisgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbWJpbmVkVHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKG1ldGhvZENhbGwpOworCisgICAgYXNzZXJ0VGhhdChtZXRob2RVc2FnZS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSwKKyAgICAgICAgICAgICAgIGlzKCJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9ucy5QYXJEby5vZihBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9ucy5Eb0ZuPEksIE8+KSIpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGNhbGxpbmdTdXBlckNsYXNzSW5uZXJDbGFzc01ldGhvZCgpIHsKKyAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMiKTsKKyAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYUNsYXNzID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMiKTsKKyAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGFDbGFzcywgImZvb0JhcjIiKTsKKyAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImlubmVyQ2xhc3NNZXRob2QiKS5nZXQoKTsKKworICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPQorICAgICAgICBKYXZhUGFyc2VyRmFjYWRlLmdldChjb21iaW5lZFR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShtZXRob2RDYWxsKTsKKworICAgIGFzc2VydFRoYXQobWV0aG9kVXNhZ2UuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCksCisgICAgICAgICAgICAgICBpcygiQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMuRG9Gbi5Qcm9jZXNzQ29udGV4dC5pbm5lckNsYXNzTWV0aG9kKCkiKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBjYWxsaW5nQW5vbnltb3VzQ2xhc3NJbm5lck1ldGhvZCgpIHsKKyAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMiKTsKKyAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYUNsYXNzID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMiKTsKKyAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGFDbGFzcywgImZvb0JhcjMiKTsKKyAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImNhbGxBbm5vbkNsYXNzSW5uZXJNZXRob2QiKS5nZXQoKTsKKworICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPQorICAgICAgICBKYXZhUGFyc2VyRmFjYWRlLmdldChjb21iaW5lZFR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShtZXRob2RDYWxsKTsKKworICAgIGFzc2VydFRydWUobWV0aG9kVXNhZ2UuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShtZXRob2RVc2FnZS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKS5jb250YWlucygiQW5vbnltb3VzLSIpKTsKKyAgICBhc3NlcnRUcnVlKG1ldGhvZFVzYWdlLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpLmVuZHNXaXRoKCJjYWxsQW5ub25DbGFzc0lubmVyTWV0aG9kKCkiKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB1c2luZ0Fub255bW91c1N1cGVyQ2xhc3NJbm5lclR5cGUoKSB7CisgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkFub255bW91c0NsYXNzRGVjbGFyYXRpb25zIik7CisgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGFDbGFzcyA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkFub255bW91c0NsYXNzRGVjbGFyYXRpb25zIik7CisgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChhQ2xhc3MsICJmb29CYXI0Iik7CisgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJ0b1N0cmluZyIpLmdldCgpOworCisgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbWJpbmVkVHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKG1ldGhvZENhbGwpOworCisgICAgYXNzZXJ0VGhhdChtZXRob2RVc2FnZS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSwgaXMoImphdmEubGFuZy5FbnVtLnRvU3RyaW5nKCkiKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB1c2luZ0Fub255bW91c0NsYXNzSW5uZXJUeXBlKCkgeworICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9ucyIpOworICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBhQ2xhc3MgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9ucyIpOworICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoYUNsYXNzLCAiZm9vQmFyNSIpOworICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAidG9TdHJpbmciKS5nZXQoKTsKKworICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPQorICAgICAgICBKYXZhUGFyc2VyRmFjYWRlLmdldChjb21iaW5lZFR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShtZXRob2RDYWxsKTsKKworICAgIGFzc2VydFRoYXQobWV0aG9kVXNhZ2UuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCksIGlzKCJqYXZhLmxhbmcuRW51bS50b1N0cmluZygpIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzBiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDg5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXJOZXdDb2RlOworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHN0cmluZzsKKyAgICBwcml2YXRlIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBsaXN0T2ZCb29sZWFuOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UiKSk7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihzcmMpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvZ2VuZXJhdGVkIikpKSk7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBjb21iaW5lZFR5cGVTb2x2ZXI7CisKKyAgICAgICAgRmlsZSBzcmNOZXdDb2RlID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZSIpKTsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyY05ld0NvZGUpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzIikpKSk7CisgICAgICAgIHR5cGVTb2x2ZXJOZXdDb2RlID0gY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZTsKKworICAgICAgICBUeXBlU29sdmVyIHRzID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIHN0cmluZyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0cy5zb2x2ZVR5cGUoU3RyaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHRzKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGJvb2xlYW5DID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHRzLnNvbHZlVHlwZShCb29sZWFuLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHRzKTsKKyAgICAgICAgbGlzdE9mQm9vbGVhbiA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0cy5zb2x2ZVR5cGUoTGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCBJbW11dGFibGVMaXN0Lm9mKGJvb2xlYW5DKSwgdHMpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IG1pc2MKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQ2xhc3MoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb21waWxhdGlvblVuaXQuaXNDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ludGVyZmFjZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb21waWxhdGlvblVuaXQuaXNJbnRlcmZhY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbnVtKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbXBpbGF0aW9uVW5pdC5pc0VudW0oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUeXBlVmFyaWFibGUoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29tcGlsYXRpb25Vbml0LmlzVHlwZVBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGUoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb21waWxhdGlvblVuaXQuaXNUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzVHlwZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBpbGF0aW9uVW5pdCwgY29tcGlsYXRpb25Vbml0LmFzVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0NsYXNzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29tcGlsYXRpb25Vbml0LCBjb21waWxhdGlvblVuaXQuYXNDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0ludGVyZmFjZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgY29tcGlsYXRpb25Vbml0LmFzSW50ZXJmYWNlKCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNFbnVtKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBjb21waWxhdGlvblVuaXQuYXNFbnVtKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdCIsIGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc05hbWUoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29tcGlsYXRpb25Vbml0IiwgY29tcGlsYXRpb25Vbml0LmdldENsYXNzTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWFsaWZpZWROYW1lKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0IiwgY29tcGlsYXRpb25Vbml0LmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgYW5jZXN0b3JzCisgICAgLy8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlcmNsYXNzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGNvbXBpbGF0aW9uVW5pdC5nZXRTdXBlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlcmNsYXNzV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsU3VwZXJjbGFzc2VzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjdSA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsICJqYXZhLmxhbmcuT2JqZWN0IiksIGN1LmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3Nlc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChzIC0+IHMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLmFueU1hdGNoKHMgLT4gcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChzIC0+IHMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKSk7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yID0gbnVsbDsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludGVyZmFjZXNXaXRob3V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigpLCBjb21waWxhdGlvblVuaXQuZ2V0SW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworCisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvaWQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZSIpLCBjb2lkLmdldEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGludGVyZmF6ZSA9IG51bGw7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aERlY2xhcmF0aW9uIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdC5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxJbnRlcmZhY2VzV2l0aG91dFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImphdmEubGFuZy5DbG9uZWFibGUiKSwgY29tcGlsYXRpb25Vbml0LmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb2lkID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZSIpLCBjb2lkLmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGludGVyZmF6ZSA9IG51bGw7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aERlY2xhcmF0aW9uIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdC5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoNyk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsb25lYWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuY2VzdG9yc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5zaXplKCkpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA9IG51bGw7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdCIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEFuY2VzdG9yc1dpdGhvdXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY3UgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsICJqYXZhLmxhbmcuT2JqZWN0IiksIGN1LmdldEFsbEFuY2VzdG9ycygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEFuY2VzdG9yc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuc2l6ZSgpKTsKKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgPSBudWxsOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsb25lYWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCg4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoOSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCgxMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdC5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVGVzdCBmaWVsZHMKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpZWxkRm9yRXhpc3RpbmdGaWVsZCgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFJlc29sdmVkRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gbnVsbDsKKworICAgICAgICAvLyBkZWNsYXJlZCBmaWVsZAorICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRGaWVsZCgibW9kaWZpZXJzIik7CisgICAgICAgIGFzc2VydEVxdWFscygibW9kaWZpZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5FbnVtU2V0IiwgZmllbGREZWNsYXJhdGlvbi5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjY2Vzc1NwZWNpZmllci5QUklWQVRFLCBmaWVsZERlY2xhcmF0aW9uLmFjY2Vzc1NwZWNpZmllcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBmaWVsZERlY2xhcmF0aW9uLmlzU3RhdGljKCkpOworCisgICAgICAgIC8vIGluaGVyaXRlZCBmaWVsZAorICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRGaWVsZCgiYW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbm5vdGF0aW9ucyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY2Nlc3NTcGVjaWZpZXIuUFJJVkFURSwgZmllbGREZWNsYXJhdGlvbi5hY2Nlc3NTcGVjaWZpZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRGb3JVbmV4aXN0aW5nRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEZpZWxkKCJ1bmV4aXN0aW5nIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsRmllbGRzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgTGlzdDxSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24+IGFsbEZpZWxkcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxNiwgYWxsRmllbGRzLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGlmaWVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlUGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dzXyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib2R5IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFubm90YXRpb25zIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PREVfQllfQkVHSU5fUE9TSVRJT04iLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygicmFuZ2UiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoOSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50Tm9kZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGRyZW5Ob2RlcyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMSk7CisgICAgICAgIGFzc2VydEVxdWFscygib3JwaGFuQ29tbWVudHMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXJEYXRhIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21tZW50IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDE0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9CRUdJTl9MSU5FIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDE1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9FTkRfTElORSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxHZW5lcmljRmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY0ZpZWxkcy5qYXZhLnR4dCIpKSk7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSBuZXcgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24oTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQ0IiKSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNsYXNzRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkuc2l6ZSgpKTsKKworICAgICAgICBSZWZlcmVuY2VUeXBlSW1wbCBydENsYXNzRGVjbGFyYXRpb24gPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwoY2xhc3NEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzIiwgY2xhc3NEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0cmluZywgY2xhc3NEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKS5nZXQoMCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0cmluZywgcnRDbGFzc0RlY2xhcmF0aW9uLmdldEZpZWxkVHlwZSgicyIpLmdldCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInQiLCBjbGFzc0RlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpLmdldCgxKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5Cb29sZWFuPiIsIGNsYXNzRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkuZ2V0KDEpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RPZkJvb2xlYW4sIHJ0Q2xhc3NEZWNsYXJhdGlvbi5nZXRGaWVsZFR5cGUoInQiKS5nZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpIiwgY2xhc3NEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQsIGNsYXNzRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkuZ2V0KDIpLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5ULCBydENsYXNzRGVjbGFyYXRpb24uZ2V0RmllbGRUeXBlKCJpIikuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN0YXRpY0ZpZWxkcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIExpc3Q8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBhbGxGaWVsZHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN0YXRpY0ZpZWxkcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgYWxsRmllbGRzLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PREVfQllfQkVHSU5fUE9TSVRJT04iLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQUJTT0xVVEVfQkVHSU5fTElORSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9FTkRfTElORSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxOb25TdGF0aWNGaWVsZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxOb25TdGF0aWNGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzLCBhbGxGaWVsZHMuc2l6ZSgpKTsKKworICAgICAgICBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IG51bGw7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9kaWZpZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInR5cGVQYXJhbWV0ZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJvd3NfIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvZHkiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiYW5ub3RhdGlvbnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNyk7CisgICAgICAgIGFzc2VydEVxdWFscygicmFuZ2UiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50Tm9kZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZHJlbk5vZGVzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcnBoYW5Db21tZW50cyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidXNlckRhdGEiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbW1lbnQiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVjbGFyZWRGaWVsZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBMaXN0PFJlc29sdmVkRmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgYWxsRmllbGRzLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGlmaWVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlUGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dzXyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib2R5IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IG1ldGhvZHMKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFNldDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBhbGxNZXRob2RzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCBhbGxNZXRob2RzLnNpemUoKSk7CisKKyAgICAgICAgTGlzdDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBzb3J0ZWRNZXRob2RzID0gYWxsTWV0aG9kcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoKG8xLCBvMikgLT4gbzEuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkuY29tcGFyZVRvKG8yLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpIiwgc29ydGVkTWV0aG9kcy5nZXQoMCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpIiwgc29ydGVkTWV0aG9kcy5nZXQoMSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEJvZHkoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKCkiLCBzb3J0ZWRNZXRob2RzLmdldCgzKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDQpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pIiwgc29ydGVkTWV0aG9kcy5nZXQoNSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEphdmFEb2MoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDYpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDcpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lKCkiLCBzb3J0ZWRNZXRob2RzLmdldCg4KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDkpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkiLCBzb3J0ZWRNZXRob2RzLmdldCgxMCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFRocm93cygpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTEpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTMpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pIiwgc29ydGVkTWV0aG9kcy5nZXQoMTQpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTUpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTYpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+KSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDE3KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VGhyb3dzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPikiLCBzb3J0ZWRNZXRob2RzLmdldCgxOCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFR5cGVQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyPikiLCBzb3J0ZWRNZXRob2RzLmdldCgxOSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbE1ldGhvZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTZXQ8TWV0aG9kVXNhZ2U+IGFsbE1ldGhvZHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbE1ldGhvZHMoKTsKKworICAgICAgICBMaXN0PE1ldGhvZFVzYWdlPiBzb3J0ZWRNZXRob2RzID0gYWxsTWV0aG9kcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoKG8xLCBvMikgLT4gbzEuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkuY29tcGFyZVRvKG8yLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBMaXN0PFN0cmluZz4gc2lnbmF0dXJlcyA9IHNvcnRlZE1ldGhvZHMuc3RyZWFtKCkubWFwKG0gLT4gbS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFkZE9ycGhhbkNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5jbG9uZSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmNvbnRhaW5zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEVuZCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldE5vZGVzQnlUeXBlKGphdmEubGFuZy5DbGFzczxOPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0T3JwaGFuQ29tbWVudHMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZU9mVHlwZShqYXZhLmxhbmcuQ2xhc3M8VD4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0VXNlckRhdGEoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Vc2VyRGF0YUtleTxNPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzQ29tbWVudCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmhhc2hDb2RlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaXNQb3NpdGlvbmVkQWZ0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5pc1Bvc2l0aW9uZWRCZWZvcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRCZWdpbihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEJsb2NrQ29tbWVudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0RW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0TGluZUNvbW1lbnQoamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFJhbmdlKGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0VXNlckRhdGEoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Vc2VyRGF0YUtleTxNPiwgTSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEJvZHkoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiwgYm9vbGVhbikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SmF2YURvYygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lRXhwcigpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TmFtZUV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VGhyb3dzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRNYXJrZXJBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRNYXJrZXJBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9uQnlDbGFzcyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0QW5ub3RhdGlvbkJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuaXNBbm5vdGF0aW9uUHJlc2VudChqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuaXNBbm5vdGF0aW9uUHJlc2VudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LmNyZWF0ZUJvZHkoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5zZXRKYXZhRG9jQ29tbWVudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmFkZE1vZGlmaWVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNBYnN0cmFjdCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNGaW5hbCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNOYXRpdmUoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzUHJpdmF0ZSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNQcm90ZWN0ZWQoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzUHVibGljKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1N0YXRpYygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNTdHJpY3RmcCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNTeW5jaHJvbml6ZWQoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzVHJhbnNpZW50KCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1ZvbGF0aWxlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZEFuZEdldFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGphdmEubGFuZy5DbGFzczw/PiwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5hZGRQYXJhbWV0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihqYXZhLmxhbmcuQ2xhc3M8Pz4sIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5nZXRQYXJhbUJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5nZXRQYXJhbUJ5VHlwZShqYXZhLmxhbmcuQ2xhc3M8Pz4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmdldFBhcmFtQnlUeXBlKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuYWRkVGhyb3dzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmFkZFRocm93cyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5UaHJvd2FibGU+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmlzVGhyb3dzKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZT4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0LmZpbmFsaXplKCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0Lm5vdGlmeSgpIiwKKyAgICAgICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdC5ub3RpZnlBbGwoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3QucmVnaXN0ZXJOYXRpdmVzKCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0LndhaXQoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3Qud2FpdChsb25nKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3Qud2FpdChsb25nLCBpbnQpIiksIHNpZ25hdHVyZXMpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IGNvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uc3RydWN0b3JzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgTGlzdDxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBjb25zdHJ1Y3RvcnMuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSIsIGNvbnN0cnVjdG9ycy5nZXQoMCkuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4sIGphdmEubGFuZy5TdHJpbmcpIiwgY29uc3RydWN0b3JzLmdldCgxKS5nZXRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29uc3RydWN0b3JEZWNsYXJhdGlvbihqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KSIsIGNvbnN0cnVjdG9ycy5nZXQoMikuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLCBqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KSIsIGNvbnN0cnVjdG9ycy5nZXQoMykuZ2V0U2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBSZXNvbHV0aW9uCisgICAgLy8vCisKKyAgICAvL1N5bWJvbFJlZmVyZW5jZTxNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8VHlwZT4gcGFyYW1ldGVyVHlwZXMpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlTWV0aG9kRXhpc3RpbmcoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVzID0gbnVsbDsKKworICAgICAgICByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKCJpc1N0YXRpYyIsIEltbXV0YWJsZUxpc3Qub2YoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNTdGF0aWMoKSIsIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgiaXNUaHJvd3MiLCBJbW11dGFibGVMaXN0Lm9mKFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihSdW50aW1lRXhjZXB0aW9uLmNsYXNzLmdldENsYXNzKCksIHR5cGVTb2x2ZXJOZXdDb2RlKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmlzVGhyb3dzKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZT4pIiwgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKworICAgICAgICByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKCJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YoUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlck5ld0NvZGUpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLlN0cmluZykiLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworCisgICAgICAgIC8vIFRoaXMgaXMgc29sdmVkIGJlY2F1c2UgaXQgaXMgcmF3CisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzVGhyb3dzIiwgSW1tdXRhYmxlTGlzdC5vZihSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoQ2xhc3MuY2xhc3MsIHR5cGVTb2x2ZXJOZXdDb2RlKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmlzVGhyb3dzKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZT4pIiwgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZU1ldGhvZE5vdEV4aXN0aW5nKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IG51bGw7CisKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgidW5leGlzdGluZ01ldGhvZCIsIEltbXV0YWJsZUxpc3Qub2YoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVzLmlzU29sdmVkKCkpOworCisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzU3RhdGljIiwgSW1tdXRhYmxlTGlzdC5vZihSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZU1ldGhvZE5vdEV4aXN0aW5nQmVjYXVzZU9mVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVzID0gbnVsbDsKKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3RyaW5nVHlwZSA9IChSZXNvbHZlZFJlZmVyZW5jZVR5cGUpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihTdHJpbmcuY2xhc3MsIHR5cGVTb2x2ZXJOZXdDb2RlKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJhd0NsYXNzVHlwZSA9IChSZXNvbHZlZFJlZmVyZW5jZVR5cGUpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihDbGFzcy5jbGFzcywgdHlwZVNvbHZlck5ld0NvZGUpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgY2xhc3NPZlN0cmluZ1R5cGUgPSAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSByYXdDbGFzc1R5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMocmF3Q2xhc3NUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApLCBzdHJpbmdUeXBlKTsKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgiaXNUaHJvd3MiLCBJbW11dGFibGVMaXN0Lm9mKGNsYXNzT2ZTdHJpbmdUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVzLmlzU29sdmVkKCkpOworICAgIH0KKworCisgICAgLy8vCisgICAgLy8vIEFzc2lnbmFiaWxpdHkKKyAgICAvLy8KKworICAgIC8vIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoVHlwZSB0eXBlKTsKKworICAgIC8vIGJvb2xlYW4gY2FuQmVBc3NpZ25lZFRvKFR5cGVEZWNsYXJhdGlvbiBvdGhlcikKKworICAgIC8vIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoVHlwZURlY2xhcmF0aW9uIG90aGVyKTsKKworICAgIC8vLworICAgIC8vLyBBbm5vdGF0aW9ucworICAgIC8vLworCisgICAgLy8gaGFzRGlyZWN0bHlBbm5vdGF0aW9uCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNEaXJlY3RseUFubm90YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9Bbm5vdGF0aW9ucy5qYXZhLnR4dCIpKSk7CisKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY2EgPSBuZXcgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24oTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQ0EiKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjYS5oYXNEaXJlY3RseUFubm90YXRpb24oImZvby5iYXIuTXlBbm5vdGF0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNhLmhhc0RpcmVjdGx5QW5ub3RhdGlvbigiZm9vLmJhci5NeUFubm90YXRpb24yIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNhLmhhc0RpcmVjdGx5QW5ub3RhdGlvbigiTXlBbm5vdGF0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNhLmhhc0RpcmVjdGx5QW5ub3RhdGlvbigiZm9vLmJhci5NeVVuZXhpc3RpbmdBbm5vdGF0aW9uIikpOworCisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNiID0gbmV3IEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkNCIiksIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNiLmhhc0RpcmVjdGx5QW5ub3RhdGlvbigiZm9vLmJhci5NeUFubm90YXRpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjYi5oYXNEaXJlY3RseUFubm90YXRpb24oImZvby5iYXIuTXlBbm5vdGF0aW9uMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYi5oYXNEaXJlY3RseUFubm90YXRpb24oIk15QW5ub3RhdGlvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYi5oYXNEaXJlY3RseUFubm90YXRpb24oImZvby5iYXIuTXlVbmV4aXN0aW5nQW5ub3RhdGlvbiIpKTsKKyAgICB9CisKKyAgICAvLyBoYXNBbm5vdGF0aW9uCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBbm5vdGF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvQW5ub3RhdGlvbnMuamF2YS50eHQiKSkpOworCisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNhID0gbmV3IEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkNBIiksIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY2EuaGFzQW5ub3RhdGlvbigiZm9vLmJhci5NeUFubm90YXRpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY2EuaGFzQW5ub3RhdGlvbigiZm9vLmJhci5NeUFubm90YXRpb24yIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNhLmhhc0Fubm90YXRpb24oIk15QW5ub3RhdGlvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYS5oYXNBbm5vdGF0aW9uKCJmb28uYmFyLk15VW5leGlzdGluZ0Fubm90YXRpb24iKSk7CisKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY2IgPSBuZXcgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24oTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQ0IiKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjYi5oYXNBbm5vdGF0aW9uKCJmb28uYmFyLk15QW5ub3RhdGlvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNiLmhhc0Fubm90YXRpb24oImZvby5iYXIuTXlBbm5vdGF0aW9uMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYi5oYXNBbm5vdGF0aW9uKCJNeUFubm90YXRpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY2IuaGFzQW5ub3RhdGlvbigiZm9vLmJhci5NeVVuZXhpc3RpbmdBbm5vdGF0aW9uIikpOworICAgIH0KKworICAgIC8vLworICAgIC8vLworICAgIC8vLworCisgICAgLy8gTGlzdDxUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCk7CisKKyAgICAvLyBBY2Nlc3NMZXZlbCBhY2Nlc3NMZXZlbCgpOworCisgICAgLy8vCisgICAgLy8vIENvbnRhaW5tZW50CisgICAgLy8vCisKKyAgICAvLyBTZXQ8VHlwZURlY2xhcmF0aW9uPiBpbnRlcm5hbFR5cGVzKCkKKworICAgIC8vIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTcxZjRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5BYnN0cmFjdFRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgRmlsZSBzcmNOZXdDb2RlID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZSIpKTsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyY05ld0NvZGUpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzIikpKSk7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IG1pc2MKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQ2xhc3MoKSB7CisgICAgICAgIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtb2RpZmllci5pc0NsYXNzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzSW50ZXJmYWNlKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbW9kaWZpZXIuaXNJbnRlcmZhY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbnVtKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBtb2RpZmllci5pc0VudW0oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUeXBlVmFyaWFibGUoKSB7CisgICAgICAgIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtb2RpZmllci5pc1R5cGVQYXJhbWV0ZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUeXBlKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBtb2RpZmllci5pc1R5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNUeXBlKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhtb2RpZmllciwgbW9kaWZpZXIuYXNUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzQ2xhc3MoKSB7CisgICAgICAgIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgbW9kaWZpZXIuYXNDbGFzcygpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzSW50ZXJmYWNlKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIG1vZGlmaWVyLmFzSW50ZXJmYWNlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNFbnVtKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhtb2RpZmllciwgbW9kaWZpZXIuYXNFbnVtKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdCIsIG1vZGlmaWVyLmdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1vZGlmaWVyIiwgbW9kaWZpZXIuZ2V0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIiwgbW9kaWZpZXIuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVGVzdCBhbmNlc3RvcnMKKyAgICAvLy8KKworICAgIC8qQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1dpdGhvdXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGNvbXBpbGF0aW9uVW5pdC5nZXRTdXBlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlcmNsYXNzV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsU3VwZXJjbGFzc2VzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjdSA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsICJqYXZhLmxhbmcuT2JqZWN0IiksIGN1LmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3Nlc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5zaXplKCkpOworCisgICAgICAgIFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgPSBudWxsOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZXJmYWNlc1dpdGhvdXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoKSwgY29tcGlsYXRpb25Vbml0LmdldEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb2lkID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGUiKSwgY29pZC5nZXRJbnRlcmZhY2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZXJmYWNlc1dpdGhQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5zaXplKCkpOworCisgICAgICAgIFJlZmVyZW5jZVR5cGUgaW50ZXJmYXplID0gbnVsbDsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFEb2MuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEludGVyZmFjZXNXaXRob3V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIiksIGNvbXBpbGF0aW9uVW5pdC5nZXRBbGxJbnRlcmZhY2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29pZCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiamF2YS5sYW5nLkNsb25lYWJsZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGUiKSwgY29pZC5nZXRBbGxJbnRlcmZhY2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsSW50ZXJmYWNlc1dpdGhQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5zaXplKCkpOworCisgICAgICAgIFJlZmVyZW5jZVR5cGUgaW50ZXJmYXplID0gbnVsbDsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFEb2MuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5jZXN0b3JzV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLnNpemUoKSk7CisKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA9IG51bGw7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdCIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEFuY2VzdG9yc1dpdGhvdXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY3UgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsICJqYXZhLmxhbmcuT2JqZWN0IiksIGN1LmdldEFsbEFuY2VzdG9ycygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEFuY2VzdG9yc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuc2l6ZSgpKTsKKworICAgICAgICBSZWZlcmVuY2VUeXBlIGFuY2VzdG9yID0gbnVsbDsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbG9uZWFibGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoNyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgZmllbGRzCisgICAgLy8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZEZvckV4aXN0aW5nRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIC8vIGRlY2xhcmVkIGZpZWxkCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEZpZWxkKCJtb2RpZmllcnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RpZmllcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkVudW1TZXQiLCBmaWVsZERlY2xhcmF0aW9uLmdldFR5cGUoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQWNjZXNzTGV2ZWwuUFJJVkFURSwgZmllbGREZWNsYXJhdGlvbi5hY2Nlc3NMZXZlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBmaWVsZERlY2xhcmF0aW9uLmlzU3RhdGljKCkpOworCisgICAgICAgIC8vIGluaGVyaXRlZCBmaWVsZAorICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRGaWVsZCgiYW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbm5vdGF0aW9ucyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY2Nlc3NMZXZlbC5QUklWQVRFLCBmaWVsZERlY2xhcmF0aW9uLmFjY2Vzc0xldmVsKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpZWxkRm9yVW5leGlzdGluZ0ZpZWxkKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRGaWVsZCgidW5leGlzdGluZyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIExpc3Q8RmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE2LCBhbGxGaWVsZHMuc2l6ZSgpKTsKKworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGlmaWVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlUGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dzXyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib2R5IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFubm90YXRpb25zIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PREVfQllfQkVHSU5fUE9TSVRJT04iLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygicmFuZ2UiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoOSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50Tm9kZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGRyZW5Ob2RlcyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMSk7CisgICAgICAgIGFzc2VydEVxdWFscygib3JwaGFuQ29tbWVudHMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXJEYXRhIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21tZW50IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDE0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9CRUdJTl9MSU5FIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDE1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9FTkRfTElORSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxTdGF0aWNGaWVsZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBMaXN0PEZpZWxkRGVjbGFyYXRpb24+IGFsbEZpZWxkcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3RhdGljRmllbGRzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBhbGxGaWVsZHMuc2l6ZSgpKTsKKworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PREVfQllfQkVHSU5fUE9TSVRJT04iLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQUJTT0xVVEVfQkVHSU5fTElORSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9FTkRfTElORSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxOb25TdGF0aWNGaWVsZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBMaXN0PEZpZWxkRGVjbGFyYXRpb24+IGFsbEZpZWxkcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsTm9uU3RhdGljRmllbGRzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMywgYWxsRmllbGRzLnNpemUoKSk7CisKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gbnVsbDsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RpZmllcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHlwZVBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbWV0ZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRocm93c18iLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9keSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbm5vdGF0aW9ucyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyYW5nZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnROb2RlIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkcmVuTm9kZXMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9ycGhhbkNvbW1lbnRzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDExKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1c2VyRGF0YSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tbWVudCIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZWNsYXJlZEZpZWxkcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIExpc3Q8RmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgYWxsRmllbGRzLnNpemUoKSk7CisKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gbnVsbDsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RpZmllcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHlwZVBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbWV0ZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRocm93c18iLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9keSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVGVzdCBtZXRob2RzCisgICAgLy8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZWNsYXJlZE1ldGhvZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTZXQ8TWV0aG9kRGVjbGFyYXRpb24+IGFsbE1ldGhvZHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIGFsbE1ldGhvZHMuc2l6ZSgpKTsKKworICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBzb3J0ZWRNZXRob2RzID0gYWxsTWV0aG9kcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoKG8xLCBvMikgLT4gbzEuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkuY29tcGFyZVRvKG8yLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpIiwgc29ydGVkTWV0aG9kcy5nZXQoMCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpIiwgc29ydGVkTWV0aG9kcy5nZXQoMSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEJvZHkoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKCkiLCBzb3J0ZWRNZXRob2RzLmdldCgzKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDQpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pIiwgc29ydGVkTWV0aG9kcy5nZXQoNSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEphdmFEb2MoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDYpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDcpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lKCkiLCBzb3J0ZWRNZXRob2RzLmdldCg4KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDkpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkiLCBzb3J0ZWRNZXRob2RzLmdldCgxMCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFRocm93cygpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTEpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTMpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pIiwgc29ydGVkTWV0aG9kcy5nZXQoMTQpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTUpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpIiwgc29ydGVkTWV0aG9kcy5nZXQoMTYpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+KSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDE3KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VGhyb3dzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPikiLCBzb3J0ZWRNZXRob2RzLmdldCgxOCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFR5cGVQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyPikiLCBzb3J0ZWRNZXRob2RzLmdldCgxOSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbE1ldGhvZHMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTZXQ8TWV0aG9kVXNhZ2U+IGFsbE1ldGhvZHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbE1ldGhvZHMoKTsKKworICAgICAgICBMaXN0PE1ldGhvZFVzYWdlPiBzb3J0ZWRNZXRob2RzID0gYWxsTWV0aG9kcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoKG8xLCBvMikgLT4gbzEuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkuY29tcGFyZVRvKG8yLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBMaXN0PFN0cmluZz4gc2lnbmF0dXJlcyA9IHNvcnRlZE1ldGhvZHMuc3RyZWFtKCkubWFwKG0gLT4gbS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFkZE9ycGhhbkNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5jbG9uZSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmNvbnRhaW5zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEVuZCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldE5vZGVzQnlUeXBlKGphdmEubGFuZy5DbGFzczxOPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0T3JwaGFuQ29tbWVudHMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZU9mVHlwZShqYXZhLmxhbmcuQ2xhc3M8VD4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0VXNlckRhdGEoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Vc2VyRGF0YUtleTxNPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzQ29tbWVudCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmhhc2hDb2RlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaXNQb3NpdGlvbmVkQWZ0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5pc1Bvc2l0aW9uZWRCZWZvcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRCZWdpbihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEJsb2NrQ29tbWVudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0RW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0TGluZUNvbW1lbnQoamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFJhbmdlKGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0VXNlckRhdGEoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Vc2VyRGF0YUtleTxNPiwgTSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEJvZHkoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiwgYm9vbGVhbikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SmF2YURvYygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lRXhwcigpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TmFtZUV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VGhyb3dzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRNYXJrZXJBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRNYXJrZXJBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5hZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9uQnlDbGFzcyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0QW5ub3RhdGlvbkJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuaXNBbm5vdGF0aW9uUHJlc2VudChqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuaXNBbm5vdGF0aW9uUHJlc2VudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LmNyZWF0ZUJvZHkoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5zZXRKYXZhRG9jQ29tbWVudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmFkZE1vZGlmaWVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNBYnN0cmFjdCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNGaW5hbCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNOYXRpdmUoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzUHJpdmF0ZSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNQcm90ZWN0ZWQoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzUHVibGljKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1N0YXRpYygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNTdHJpY3RmcCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNTeW5jaHJvbml6ZWQoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzVHJhbnNpZW50KCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1ZvbGF0aWxlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZEFuZEdldFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGphdmEubGFuZy5DbGFzczw/PiwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5hZGRQYXJhbWV0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihqYXZhLmxhbmcuQ2xhc3M8Pz4sIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5nZXRQYXJhbUJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5nZXRQYXJhbUJ5VHlwZShqYXZhLmxhbmcuQ2xhc3M8Pz4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmdldFBhcmFtQnlUeXBlKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuYWRkVGhyb3dzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmFkZFRocm93cyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5UaHJvd2FibGU+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmlzVGhyb3dzKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZT4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0LmZpbmFsaXplKCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0Lm5vdGlmeSgpIiwKKyAgICAgICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdC5ub3RpZnlBbGwoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3QucmVnaXN0ZXJOYXRpdmVzKCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0LndhaXQoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3Qud2FpdChsb25nKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3Qud2FpdChsb25nLCBpbnQpIiksIHNpZ25hdHVyZXMpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IGNvbnN0cnVjdG9ycworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uc3RydWN0b3JzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgTGlzdDxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBjb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldENvbnN0cnVjdG9ycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgY29uc3RydWN0b3JzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkiLCBjb25zdHJ1Y3RvcnMuZ2V0KDApLmdldFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+LCBqYXZhLmxhbmcuU3RyaW5nKSIsIGNvbnN0cnVjdG9ycy5nZXQoMSkuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyPiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkiLCBjb25zdHJ1Y3RvcnMuZ2V0KDIpLmdldFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZSwgamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyPiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkiLCBjb25zdHJ1Y3RvcnMuZ2V0KDMpLmdldFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gUmVzb2x1dGlvbgorICAgIC8vLworCisgICAgLy9TeW1ib2xSZWZlcmVuY2U8TWV0aG9kRGVjbGFyYXRpb24+IHNvbHZlTWV0aG9kKFN0cmluZyBuYW1lLCBMaXN0PFR5cGU+IHBhcmFtZXRlclR5cGVzKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZU1ldGhvZEV4aXN0aW5nKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPE1ldGhvZERlY2xhcmF0aW9uPiByZXMgPSBudWxsOworCisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzU3RhdGljIiwgSW1tdXRhYmxlTGlzdC5vZigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1N0YXRpYygpIiwgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKworICAgICAgICByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKCJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YoUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MuZ2V0Q2xhc3MoKSwgdHlwZVNvbHZlck5ld0NvZGUpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuVGhyb3dhYmxlPikiLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworCisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzVGhyb3dzIiwgSW1tdXRhYmxlTGlzdC5vZihSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyTmV3Q29kZSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5pc1Rocm93cyhqYXZhLmxhbmcuU3RyaW5nKSIsIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBzb2x2ZWQgYmVjYXVzZSBpdCBpcyByYXcKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgiaXNUaHJvd3MiLCBJbW11dGFibGVMaXN0Lm9mKFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihDbGFzcy5jbGFzcywgdHlwZVNvbHZlck5ld0NvZGUpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuVGhyb3dhYmxlPikiLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlTWV0aG9kTm90RXhpc3RpbmcoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8TWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IG51bGw7CisKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgidW5leGlzdGluZ01ldGhvZCIsIEltbXV0YWJsZUxpc3Qub2YoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVzLmlzU29sdmVkKCkpOworCisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzU3RhdGljIiwgSW1tdXRhYmxlTGlzdC5vZihQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVNZXRob2ROb3RFeGlzdGluZ0JlY2F1c2VPZlR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPE1ldGhvZERlY2xhcmF0aW9uPiByZXMgPSBudWxsOworCisgICAgICAgIFJlZmVyZW5jZVR5cGUgc3RyaW5nVHlwZSA9IChSZWZlcmVuY2VUeXBlKSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyTmV3Q29kZSk7CisgICAgICAgIFJlZmVyZW5jZVR5cGUgcmF3Q2xhc3NUeXBlID0gKFJlZmVyZW5jZVR5cGUpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihDbGFzcy5jbGFzcywgdHlwZVNvbHZlck5ld0NvZGUpOworICAgICAgICBSZWZlcmVuY2VUeXBlIGNsYXNzT2ZTdHJpbmdUeXBlID0gKFJlZmVyZW5jZVR5cGUpIHJhd0NsYXNzVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcygiVCIsIHN0cmluZ1R5cGUpOworICAgICAgICByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKCJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YoY2xhc3NPZlN0cmluZ1R5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xVbmV4aXN0aW5nKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBWYWx1ZURlY2xhcmF0aW9uPiByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlU3ltYm9sKCJ1bmV4aXN0aW5nIiwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVzLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sVG9EZWNsYXJlZEZpZWxkKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBWYWx1ZURlY2xhcmF0aW9uPiByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlU3ltYm9sKCJuYW1lIiwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaXNGaWVsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbFRvSW5oZXJpdGVkUHVibGljRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFZhbHVlRGVjbGFyYXRpb24+IHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVTeW1ib2woIk5PREVfQllfQkVHSU5fUE9TSVRJT04iLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5pc0ZpZWxkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sVG9Jbmhlcml0ZWRQcml2YXRlRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFZhbHVlRGVjbGFyYXRpb24+IHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVTeW1ib2woInBhcmVudE5vZGUiLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIEFzc2lnbmFiaWxpdHkKKyAgICAvLy8KKworICAgIC8vIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoVHlwZSB0eXBlKTsKKworICAgIC8vIGJvb2xlYW4gY2FuQmVBc3NpZ25lZFRvKFR5cGVEZWNsYXJhdGlvbiBvdGhlcikKKworICAgIC8vIGJvb2xlYW4gaXNBc3NpZ25hYmxlQnkoVHlwZURlY2xhcmF0aW9uIG90aGVyKTsKKworICAgIC8vLworICAgIC8vLyBBbm5vdGF0aW9ucworICAgIC8vLworCisgICAgLy8gaGFzRGlyZWN0bHlBbm5vdGF0aW9uCisKKyAgICAvLyBoYXNBbm5vdGF0aW9uCisKKyAgICAvLy8KKyAgICAvLy8KKyAgICAvLy8KKworICAgIC8vIExpc3Q8VHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uPiBnZXRUeXBlUGFyYW1ldGVycygpOworCisgICAgLy8gQWNjZXNzTGV2ZWwgYWNjZXNzTGV2ZWwoKTsKKworICAgIC8vLworICAgIC8vLyBDb250YWlubWVudAorICAgIC8vLworCisgICAgLy8gU2V0PFR5cGVEZWNsYXJhdGlvbj4gaW50ZXJuYWxUeXBlcygpCisKKyAgICAvLyBPcHRpb25hbDxUeXBlRGVjbGFyYXRpb24+IGNvbnRhaW5lclR5cGUoKSovCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1ZTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5BYnN0cmFjdFRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBGaWxlIHNyY05ld0NvZGUgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlIikpOworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZSA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjTmV3Q29kZSkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMiKSkpKTsKKyAgICAgICAgdHlwZVNvbHZlciA9IGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGU7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgbWlzYworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDbGFzcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG5vZGVXaXRoQW5ub3RhdGlvbnMuaXNDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ludGVyZmFjZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbm9kZVdpdGhBbm5vdGF0aW9ucy5pc0ludGVyZmFjZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VudW0oKSB7CisgICAgICAgIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBub2RlV2l0aEFubm90YXRpb25zLmlzRW51bSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG5vZGVXaXRoQW5ub3RhdGlvbnMuaXNUeXBlUGFyYW1ldGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVHlwZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbm9kZVdpdGhBbm5vdGF0aW9ucy5pc1R5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNUeXBlKCkgeworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscyhub2RlV2l0aEFubm90YXRpb25zLCBub2RlV2l0aEFubm90YXRpb25zLmFzVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0NsYXNzKCkgeworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscyhub2RlV2l0aEFubm90YXRpb25zLCBub2RlV2l0aEFubm90YXRpb25zLmFzQ2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNJbnRlcmZhY2UoKSB7CisgICAgICAgIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vZGVXaXRoQW5ub3RhdGlvbnMsIG5vZGVXaXRoQW5ub3RhdGlvbnMuYXNJbnRlcmZhY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNFbnVtKCkgeworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIG5vZGVXaXRoQW5ub3RhdGlvbnMuYXNFbnVtKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcyIsIG5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2xhc3NOYW1lKCkgeworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscygiTm9kZVdpdGhBbm5vdGF0aW9ucyIsIG5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIiwgbm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IGFuY2VzdG9ycworICAgIC8vLworCisgICAgLypAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlcmNsYXNzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3NXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24iLCBjb21waWxhdGlvblVuaXQuZ2V0U3VwZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBjb21waWxhdGlvblVuaXQuZ2V0U3VwZXJDbGFzcygpLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxTdXBlcmNsYXNzZXNXaXRob3V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGN1ID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgImphdmEubGFuZy5PYmplY3QiKSwgY3UuZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsU3VwZXJjbGFzc2VzV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLnNpemUoKSk7CisKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA9IG51bGw7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlcmZhY2VzV2l0aG91dFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigpLCBjb21waWxhdGlvblVuaXQuZ2V0SW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworCisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvaWQgPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZSIpLCBjb2lkLmdldEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLnNpemUoKSk7CisKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBpbnRlcmZhemUgPSBudWxsOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFEb2MiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZS5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdCIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsSW50ZXJmYWNlc1dpdGhvdXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImphdmEubGFuZy5DbG9uZWFibGUiKSwgY29tcGlsYXRpb25Vbml0LmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb2lkID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZSIpLCBjb2lkLmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLnNpemUoKSk7CisKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBpbnRlcmZhemUgPSBudWxsOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFEb2MiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZS5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdCIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDcpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbG9uZWFibGUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmNlc3RvcnNXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuc2l6ZSgpKTsKKworICAgICAgICBSZWZlcmVuY2VUeXBlIGFuY2VzdG9yID0gbnVsbDsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDcpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQW5jZXN0b3JzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjdSA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImphdmEubGFuZy5DbG9uZWFibGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgImphdmEubGFuZy5PYmplY3QiKSwgY3UuZ2V0QWxsQW5jZXN0b3JzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQW5jZXN0b3JzV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscygxMiwgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5zaXplKCkpOworCisgICAgICAgIFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgPSBudWxsOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsb25lYWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCg4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoOSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCgxMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdC5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVGVzdCBmaWVsZHMKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpZWxkRm9yRXhpc3RpbmdGaWVsZCgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IG51bGw7CisKKyAgICAgICAgLy8gZGVjbGFyZWQgZmllbGQKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0RmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGlmaWVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuRW51bVNldCIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY2Nlc3NMZXZlbC5QUklWQVRFLCBmaWVsZERlY2xhcmF0aW9uLmFjY2Vzc0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGZpZWxkRGVjbGFyYXRpb24uaXNTdGF0aWMoKSk7CisKKyAgICAgICAgLy8gaW5oZXJpdGVkIGZpZWxkCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEZpZWxkKCJhbm5vdGF0aW9ucyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFubm90YXRpb25zIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgZmllbGREZWNsYXJhdGlvbi5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjY2Vzc0xldmVsLlBSSVZBVEUsIGZpZWxkRGVjbGFyYXRpb24uYWNjZXNzTGV2ZWwoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRGb3JVbmV4aXN0aW5nRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEZpZWxkKCJ1bmV4aXN0aW5nIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsRmllbGRzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgTGlzdDxGaWVsZERlY2xhcmF0aW9uPiBhbGxGaWVsZHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIGFsbEZpZWxkcy5zaXplKCkpOworCisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IG51bGw7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9kaWZpZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInR5cGVQYXJhbWV0ZXJzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJvd3NfIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvZHkiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiYW5ub3RhdGlvbnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNyk7CisgICAgICAgIGFzc2VydEVxdWFscygiTk9ERV9CWV9CRUdJTl9QT1NJVElPTiIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyYW5nZSIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnROb2RlIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZHJlbk5vZGVzIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDExKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcnBoYW5Db21tZW50cyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMik7CisgICAgICAgIGFzc2VydEVxdWFscygidXNlckRhdGEiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbW1lbnQiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFCU09MVVRFX0JFR0lOX0xJTkUiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFCU09MVVRFX0VORF9MSU5FIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN0YXRpY0ZpZWxkcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIExpc3Q8RmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdGF0aWNGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFsbEZpZWxkcy5zaXplKCkpOworCisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IG51bGw7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTk9ERV9CWV9CRUdJTl9QT1NJVElPTiIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQlNPTFVURV9CRUdJTl9MSU5FIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFCU09MVVRFX0VORF9MSU5FIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbE5vblN0YXRpY0ZpZWxkcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIExpc3Q8RmllbGREZWNsYXJhdGlvbj4gYWxsRmllbGRzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxOb25TdGF0aWNGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzLCBhbGxGaWVsZHMuc2l6ZSgpKTsKKworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGlmaWVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlUGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dzXyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib2R5IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFubm90YXRpb25zIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDcpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJhbmdlIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudE5vZGUiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoOSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGRyZW5Ob2RlcyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygib3JwaGFuQ29tbWVudHMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoMTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXJEYXRhIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDEyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21tZW50IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkRmllbGRzKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgTGlzdDxGaWVsZERlY2xhcmF0aW9uPiBhbGxGaWVsZHMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg2LCBhbGxGaWVsZHMuc2l6ZSgpKTsKKworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBudWxsOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGlmaWVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0eXBlUGFyYW1ldGVycyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24gPSBhbGxGaWVsZHMuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtZXRlcnMiLCBmaWVsZERlY2xhcmF0aW9uLmdldE5hbWUoKSk7CisKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbiA9IGFsbEZpZWxkcy5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhyb3dzXyIsIGZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKKworICAgICAgICBmaWVsZERlY2xhcmF0aW9uID0gYWxsRmllbGRzLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib2R5IiwgZmllbGREZWNsYXJhdGlvbi5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IG1ldGhvZHMKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFNldDxNZXRob2REZWNsYXJhdGlvbj4gYWxsTWV0aG9kcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMCwgYWxsTWV0aG9kcy5zaXplKCkpOworCisgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IHNvcnRlZE1ldGhvZHMgPSBhbGxNZXRob2RzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLnNvcnRlZCgobzEsIG8yKSAtPiBvMS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKS5jb21wYXJlVG8obzIuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkiLCBzb3J0ZWRNZXRob2RzLmdldCgwKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkiLCBzb3J0ZWRNZXRob2RzLmdldCgxKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0Qm9keSgpIiwgc29ydGVkTWV0aG9kcy5nZXQoMikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDMpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4pIiwgc29ydGVkTWV0aG9kcy5nZXQoNCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikiLCBzb3J0ZWRNZXRob2RzLmdldCg1KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SmF2YURvYygpIiwgc29ydGVkTWV0aG9kcy5nZXQoNikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpIiwgc29ydGVkTWV0aG9kcy5nZXQoNykuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE5hbWUoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDgpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lRXhwcigpIiwgc29ydGVkTWV0aG9kcy5nZXQoOSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDEwKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkiLCBzb3J0ZWRNZXRob2RzLmdldCgxMSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkiLCBzb3J0ZWRNZXRob2RzLmdldCgxMikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkiLCBzb3J0ZWRNZXRob2RzLmdldCgxMykuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikiLCBzb3J0ZWRNZXRob2RzLmdldCgxNCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykiLCBzb3J0ZWRNZXRob2RzLmdldCgxNSkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE5hbWVFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikiLCBzb3J0ZWRNZXRob2RzLmdldCgxNikuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4pIiwgc29ydGVkTWV0aG9kcy5nZXQoMTcpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRUaHJvd3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+KSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDE4KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VHlwZVBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+KSIsIHNvcnRlZE1ldGhvZHMuZ2V0KDE5KS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsTWV0aG9kcygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFNldDxNZXRob2RVc2FnZT4gYWxsTWV0aG9kcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsTWV0aG9kcygpOworCisgICAgICAgIExpc3Q8TWV0aG9kVXNhZ2U+IHNvcnRlZE1ldGhvZHMgPSBhbGxNZXRob2RzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLnNvcnRlZCgobzEsIG8yKSAtPiBvMS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKS5jb21wYXJlVG8obzIuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBzaWduYXR1cmVzID0gc29ydGVkTWV0aG9kcy5zdHJlYW0oKS5tYXAobSAtPiBtLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWRkT3JwaGFuQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmNsb25lKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuY29udGFpbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENoaWxkcmVuTm9kZXMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0RW5kKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Tm9kZXNCeVR5cGUoamF2YS5sYW5nLkNsYXNzPE4+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRPcnBoYW5Db21tZW50cygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlT2ZUeXBlKGphdmEubGFuZy5DbGFzczxUPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRVc2VyRGF0YShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlVzZXJEYXRhS2V5PE0+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5oYXNDb21tZW50KCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzaENvZGUoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5pc1Bvc2l0aW9uZWRBZnRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmlzUG9zaXRpb25lZEJlZm9yZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEJlZ2luKGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QmxvY2tDb21tZW50KGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRFbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRMaW5lQ29tbWVudChqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UmFuZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRVc2VyRGF0YShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlVzZXJEYXRhS2V5PE0+LCBNKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoamF2YS5sYW5nLkNsYXNzPD8+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uc2V0QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0Qm9keSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb25Bc1N0cmluZygpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRKYXZhRG9jKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE5hbWUoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE5hbWVFeHByKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUaHJvd3MoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0UGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRUaHJvd3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+KSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFR5cGVQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmFkZEFubm90YXRpb24oamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmFkZEFubm90YXRpb24oamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmFkZE1hcmtlckFubm90YXRpb24oamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmFkZE1hcmtlckFubm90YXRpb24oamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmdldEFubm90YXRpb25CeUNsYXNzKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9uQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5pc0Fubm90YXRpb25QcmVzZW50KGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5pc0Fubm90YXRpb25QcmVzZW50KGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuY3JlYXRlQm9keSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLnNldEphdmFEb2NDb21tZW50KGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuYWRkTW9kaWZpZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4uLikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc0Fic3RyYWN0KCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc0ZpbmFsKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc05hdGl2ZSgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNQcml2YXRlKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1Byb3RlY3RlZCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNQdWJsaWMoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzU3RhdGljKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1N0cmljdGZwKCkiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5pc1N5bmNocm9uaXplZCgpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuaXNUcmFuc2llbnQoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzVm9sYXRpbGUoKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5hZGRBbmRHZXRQYXJhbWV0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5hZGRBbmRHZXRQYXJhbWV0ZXIoamF2YS5sYW5nLkNsYXNzPD8+LCBqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5hZGRBbmRHZXRQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkUGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkUGFyYW1ldGVyKGphdmEubGFuZy5DbGFzczw/PiwgamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkUGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmdldFBhcmFtQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmdldFBhcmFtQnlUeXBlKGphdmEubGFuZy5DbGFzczw/PikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuZ2V0UGFyYW1CeVR5cGUoamF2YS5sYW5nLlN0cmluZykiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5hZGRUaHJvd3MoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUpIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuYWRkVGhyb3dzKGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLlRocm93YWJsZT4pIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuVGhyb3dhYmxlPikiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5pc1Rocm93cyhqYXZhLmxhbmcuU3RyaW5nKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3QuZmluYWxpemUoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3Qubm90aWZ5KCkiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0Lm5vdGlmeUFsbCgpIiwKKyAgICAgICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdC5yZWdpc3Rlck5hdGl2ZXMoKSIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3Qud2FpdCgpIiwKKyAgICAgICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdC53YWl0KGxvbmcpIiwKKyAgICAgICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdC53YWl0KGxvbmcsIGludCkiKSwgc2lnbmF0dXJlcyk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgY29uc3RydWN0b3JzCisgICAgLy8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25zdHJ1Y3RvcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBMaXN0PENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBjb25zdHJ1Y3RvcnMuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oKSIsIGNvbnN0cnVjdG9ycy5nZXQoMCkuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4sIGphdmEubGFuZy5TdHJpbmcpIiwgY29uc3RydWN0b3JzLmdldCgxKS5nZXRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29uc3RydWN0b3JEZWNsYXJhdGlvbihqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KSIsIGNvbnN0cnVjdG9ycy5nZXQoMikuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnN0cnVjdG9yRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLCBqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KSIsIGNvbnN0cnVjdG9ycy5nZXQoMykuZ2V0U2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBSZXNvbHV0aW9uCisgICAgLy8vCisKKyAgICAvL1N5bWJvbFJlZmVyZW5jZTxNZXRob2REZWNsYXJhdGlvbj4gc29sdmVNZXRob2QoU3RyaW5nIG5hbWUsIExpc3Q8VHlwZT4gcGFyYW1ldGVyVHlwZXMpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlTWV0aG9kRXhpc3RpbmcoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8TWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IG51bGw7CisKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgiaXNTdGF0aWMiLCBJbW11dGFibGVMaXN0Lm9mKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmlzU3RhdGljKCkiLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworCisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzVGhyb3dzIiwgSW1tdXRhYmxlTGlzdC5vZihSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoUnVudGltZUV4Y2VwdGlvbi5jbGFzcy5nZXRDbGFzcygpLCB0eXBlU29sdmVyTmV3Q29kZSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5pc1Rocm93cyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5UaHJvd2FibGU+KSIsIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgiaXNUaHJvd3MiLCBJbW11dGFibGVMaXN0Lm9mKFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihTdHJpbmcuY2xhc3MsIHR5cGVTb2x2ZXJOZXdDb2RlKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmlzVGhyb3dzKGphdmEubGFuZy5TdHJpbmcpIiwgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKworICAgICAgICAvLyBUaGlzIGlzIHNvbHZlZCBiZWNhdXNlIGl0IGlzIHJhdworICAgICAgICByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKCJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YoUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKENsYXNzLmNsYXNzLCB0eXBlU29sdmVyTmV3Q29kZSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5pc1Rocm93cyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5UaHJvd2FibGU+KSIsIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVNZXRob2ROb3RFeGlzdGluZygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxNZXRob2REZWNsYXJhdGlvbj4gcmVzID0gbnVsbDsKKworICAgICAgICByZXMgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKCJ1bmV4aXN0aW5nTWV0aG9kIiwgSW1tdXRhYmxlTGlzdC5vZigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXMuaXNTb2x2ZWQoKSk7CisKKyAgICAgICAgcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZCgiaXNTdGF0aWMiLCBJbW11dGFibGVMaXN0Lm9mKFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZU1ldGhvZE5vdEV4aXN0aW5nQmVjYXVzZU9mVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8TWV0aG9kRGVjbGFyYXRpb24+IHJlcyA9IG51bGw7CisKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBzdHJpbmdUeXBlID0gKFJlZmVyZW5jZVR5cGUpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihTdHJpbmcuY2xhc3MsIHR5cGVTb2x2ZXJOZXdDb2RlKTsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSByYXdDbGFzc1R5cGUgPSAoUmVmZXJlbmNlVHlwZSkgUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKENsYXNzLmNsYXNzLCB0eXBlU29sdmVyTmV3Q29kZSk7CisgICAgICAgIFJlZmVyZW5jZVR5cGUgY2xhc3NPZlN0cmluZ1R5cGUgPSAoUmVmZXJlbmNlVHlwZSkgcmF3Q2xhc3NUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKCJUIiwgc3RyaW5nVHlwZSk7CisgICAgICAgIHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVNZXRob2QoImlzVGhyb3dzIiwgSW1tdXRhYmxlTGlzdC5vZihjbGFzc09mU3RyaW5nVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbFVuZXhpc3RpbmcoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFZhbHVlRGVjbGFyYXRpb24+IHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVTeW1ib2woInVuZXhpc3RpbmciLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xUb0RlY2xhcmVkRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFZhbHVlRGVjbGFyYXRpb24+IHJlcyA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc29sdmVTeW1ib2woIm5hbWUiLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5pc0ZpZWxkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sVG9Jbmhlcml0ZWRQdWJsaWNGaWVsZCgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgVmFsdWVEZWNsYXJhdGlvbj4gcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZVN5bWJvbCgiTk9ERV9CWV9CRUdJTl9QT1NJVElPTiIsIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmlzRmllbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xUb0luaGVyaXRlZFByaXZhdGVGaWVsZCgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgVmFsdWVEZWNsYXJhdGlvbj4gcmVzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zb2x2ZVN5bWJvbCgicGFyZW50Tm9kZSIsIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gQXNzaWduYWJpbGl0eQorICAgIC8vLworCisgICAgLy8gYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShUeXBlIHR5cGUpOworCisgICAgLy8gYm9vbGVhbiBjYW5CZUFzc2lnbmVkVG8oVHlwZURlY2xhcmF0aW9uIG90aGVyKQorCisgICAgLy8gYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShUeXBlRGVjbGFyYXRpb24gb3RoZXIpOworCisgICAgLy8vCisgICAgLy8vIEFubm90YXRpb25zCisgICAgLy8vCisKKyAgICAvLyBoYXNEaXJlY3RseUFubm90YXRpb24KKworICAgIC8vIGhhc0Fubm90YXRpb24KKworICAgIC8vLworICAgIC8vLworICAgIC8vLworCisgICAgLy8gTGlzdDxUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24+IGdldFR5cGVQYXJhbWV0ZXJzKCk7CisKKyAgICAvLyBBY2Nlc3NMZXZlbCBhY2Nlc3NMZXZlbCgpOworCisgICAgLy8vCisgICAgLy8vIENvbnRhaW5tZW50CisgICAgLy8vCisKKyAgICAvLyBTZXQ8VHlwZURlY2xhcmF0aW9uPiBpbnRlcm5hbFR5cGVzKCkKKworICAgIC8vIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbj4gY29udGFpbmVyVHlwZSgpKi8KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9Jc3N1ZTI1Ny5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0lzc3VlMjU3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwYjUxNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9Jc3N1ZTI1Ny5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgSXNzdWUyNTcgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGF0aFRvSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUyNTcvaXNzdWUyNTcuamFyIik7CisgICAgICAgIEZpbGUgamFyID0gbmV3IEZpbGUocGF0aFRvSmFyKTsKKyAgICAgICAgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIobmV3IEphclR5cGVTb2x2ZXIoamFyLmdldEFic29sdXRlUGF0aCgpKSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmVyaWZ5QkNhbkJlU29sdmVkKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJuZXQudGVzdGJ1Zy5CIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTI1NygpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGF0aFRvU291cmNlRmlsZSA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjU3L0EuamF2YS50eHQiKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZShwYXRoVG9Tb3VyY2VGaWxlKSk7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1ldGhvZHNCeU5hbWUoInJ1biIpLmdldCgwKS5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50KDApOworICAgICAgICBFeHByZXNzaW9uU3RtdCBleHByZXNzaW9uU3RtdCA9IChFeHByZXNzaW9uU3RtdClzdGF0ZW1lbnQ7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShleHByZXNzaW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdENsYXNzRGVjbGFyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1NTk3NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIG5ld1R5cGVTb2x2ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGF0aFRvSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTIuMS4wLmphciIpOworICAgICAgICB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisKKyAgICAgICAgU3RyaW5nIG5ld1BhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0zLjAuMC1hbHBoYS4yLmphciIpOworICAgICAgICBuZXdUeXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmFyVHlwZVNvbHZlcihuZXdQYXRoVG9KYXIpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgbWlzYworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDbGFzcygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb21waWxhdGlvblVuaXQuaXNDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ludGVyZmFjZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29tcGlsYXRpb25Vbml0LmlzSW50ZXJmYWNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzRW51bSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29tcGlsYXRpb25Vbml0LmlzRW51bSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29tcGlsYXRpb25Vbml0LmlzVHlwZVBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGUoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29tcGlsYXRpb25Vbml0LmlzVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1R5cGUoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29tcGlsYXRpb25Vbml0LCBjb21waWxhdGlvblVuaXQuYXNUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzQ2xhc3MoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29tcGlsYXRpb25Vbml0LCBjb21waWxhdGlvblVuaXQuYXNDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0ludGVyZmFjZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hc0ludGVyZmFjZSgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzRW51bSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hc0VudW0oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdCIsIGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc05hbWUoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBpbGF0aW9uVW5pdCIsIGNvbXBpbGF0aW9uVW5pdC5nZXRDbGFzc05hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiLCBjb21waWxhdGlvblVuaXQuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVGVzdCBhbmNlc3RvcnMKKyAgICAvLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3MoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGNvbXBpbGF0aW9uVW5pdC5nZXRTdXBlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlcmNsYXNzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBjb21waWxhdGlvblVuaXQuZ2V0U3VwZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgbmV3VHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiIsIGNvbXBpbGF0aW9uVW5pdC5nZXRTdXBlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGNvbXBpbGF0aW9uVW5pdC5nZXRTdXBlckNsYXNzKCkudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3NlcygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjdSA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgImphdmEubGFuZy5PYmplY3QiKSwgY3UuZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQW5jZXN0b3JzKCkgeworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGN1ID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCAiamF2YS5sYW5nLk9iamVjdCIpLCBjdS5nZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlcmZhY2VzKCkgeworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigpLCBjb21waWxhdGlvblVuaXQuZ2V0SW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworCisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29pZCA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGUiKSwgY29pZC5nZXRJbnRlcmZhY2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsSW50ZXJmYWNlcygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoKSwgY29tcGlsYXRpb25Vbml0LmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNvaWQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YWJsZU5vZGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlIiksIGNvaWQuZ2V0QWxsSW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3Nlc1dpdGhvdXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjdSA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgImphdmEubGFuZy5PYmplY3QiKSwgY3UuZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsU3VwZXJjbGFzc2VzV2l0aFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgbmV3VHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLmFueU1hdGNoKHMgLT4gcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkuYW55TWF0Y2gocyAtPiBzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLmFueU1hdGNoKHMgLT4gcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikpKTsKKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYW5jZXN0b3IgPSBudWxsOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZXJmYWNlc1dpdGhvdXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigpLCBjb21waWxhdGlvblVuaXQuZ2V0SW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworCisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29pZCA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4dGVuZHMiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJbXBsZW1lbnRzIiksIGNvaWQuZ2V0SW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludGVyZmFjZXNXaXRoUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIG5ld1R5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuc2l6ZSgpKTsKKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgaW50ZXJmYXplID0gbnVsbDsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFEb2MuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEludGVyZmFjZXNXaXRob3V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgbmV3VHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImphdmEubGFuZy5DbG9uZWFibGUiKSwgY29tcGlsYXRpb25Vbml0LmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNvaWQgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgbmV3VHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFeHRlbmRzIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5DbG9uZWFibGUiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEltcGxlbWVudHMiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycyIpLCBjb2lkLmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGludGVyZmF6ZSA9IG51bGw7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aERlY2xhcmF0aW9uIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdC5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoNyk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsb25lYWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldCg4KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFuY2VzdG9yc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIG5ld1R5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5zaXplKCkpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvciA9IG51bGw7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdCIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10LlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEFuY2VzdG9yc1dpdGhvdXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjdSA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiamF2YS5sYW5nLkNsb25lYWJsZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCAiamF2YS5sYW5nLk9iamVjdCIpLCBjdS5nZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSBuZXdUeXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yID0gbnVsbDsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbG9uZWFibGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoNyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkuZ2V0KDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKS5nZXQoMTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEVudW1EZWNsYXJhdGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2ZDY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5BYnN0cmFjdFRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0zLjAuMC1hbHBoYS4yLmphciIpOworICAgICAgICB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgbWlzYworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDbGFzcygpIHsKKyAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbW9kaWZpZXIuaXNDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ludGVyZmFjZSgpIHsKKyAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbW9kaWZpZXIuaXNJbnRlcmZhY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbnVtKCkgeworICAgICAgICBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZXNvbHZlZEVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1vZGlmaWVyLmlzRW51bSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbW9kaWZpZXIuaXNUeXBlUGFyYW1ldGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVHlwZSgpIHsKKyAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBtb2RpZmllci5pc1R5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNUeXBlKCkgeworICAgICAgICBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZXNvbHZlZEVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVyLCBtb2RpZmllci5hc1R5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNDbGFzcygpIHsKKyAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIG1vZGlmaWVyLmFzQ2xhc3MoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0ludGVyZmFjZSgpIHsKKyAgICAgICAgUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVzb2x2ZWRFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIG1vZGlmaWVyLmFzSW50ZXJmYWNlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNFbnVtKCkgeworICAgICAgICBSZXNvbHZlZEVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZXNvbHZlZEVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVyLCBtb2RpZmllci5hc0VudW0oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIFJlc29sdmVkRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKFJlc29sdmVkRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QiLCBtb2RpZmllci5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc05hbWUoKSB7CisgICAgICAgIFJlc29sdmVkRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKFJlc29sdmVkRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1vZGlmaWVyIiwgbW9kaWZpZXIuZ2V0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIFJlc29sdmVkRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKFJlc29sdmVkRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiLCBtb2RpZmllci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIC8vLworICAgIC8vLyBUZXN0IGFuY2VzdG9ycworICAgIC8vLworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5M2VjNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0zLjAuMC1hbHBoYS4yLmphciIpOworICAgICAgICB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgbWlzYworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDbGFzcygpIHsKKyAgICAgICAgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBub2RlV2l0aEFubm90YXRpb25zLmlzQ2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNJbnRlcmZhY2UoKSB7CisgICAgICAgIEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBub2RlV2l0aEFubm90YXRpb25zLmlzSW50ZXJmYWNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzRW51bSgpIHsKKyAgICAgICAgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBub2RlV2l0aEFubm90YXRpb25zLmlzRW51bSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBub2RlV2l0aEFubm90YXRpb25zLmlzVHlwZVBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGUoKSB7CisgICAgICAgIEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBub2RlV2l0aEFubm90YXRpb25zLmlzVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1R5cGUoKSB7CisgICAgICAgIEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscyhub2RlV2l0aEFubm90YXRpb25zLCBub2RlV2l0aEFubm90YXRpb25zLmFzVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0NsYXNzKCkgeworICAgICAgICBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBub2RlV2l0aEFubm90YXRpb25zLmFzQ2xhc3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0ludGVyZmFjZSgpIHsKKyAgICAgICAgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gbm9kZVdpdGhBbm5vdGF0aW9ucyA9IChKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vZGVXaXRoQW5ub3RhdGlvbnMsIG5vZGVXaXRoQW5ub3RhdGlvbnMuYXNJbnRlcmZhY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNFbnVtKCkgeworICAgICAgICBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBub2RlV2l0aEFubm90YXRpb25zLmFzRW51bSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiBub2RlV2l0aEFubm90YXRpb25zID0gKEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzIiwgbm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc05hbWUoKSB7CisgICAgICAgIEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscygiTm9kZVdpdGhBbm5vdGF0aW9ucyIsIG5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uIG5vZGVXaXRoQW5ub3RhdGlvbnMgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIsIG5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8KKyAgICAvLy8gVGVzdCBhbmNlc3RvcnMKKyAgICAvLy8KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0Z1bmN0aW9uSW50ZXJmYWNlTG9naWNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvRnVuY3Rpb25JbnRlcmZhY2VMb2dpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEyY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0Z1bmN0aW9uSW50ZXJmYWNlTG9naWNUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBGdW5jdGlvbkludGVyZmFjZUxvZ2ljVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGdW5jdGlvbmFsTWV0aG9kTmVnYXRpdmVDYXNlT25DbGFzcygpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKHN0cmluZykuaXNQcmVzZW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZ1bmN0aW9uYWxNZXRob2RQb3NpdGl2ZUNhc2VzT25JbnRlcmZhY2VzKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIGZ1bmN0aW9uID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oRnVuY3Rpb24uY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKGZ1bmN0aW9uKS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbHkiLCBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChmdW5jdGlvbikuZ2V0KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIGNvbnN1bWVyID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ29uc3VtZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKGNvbnN1bWVyKS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWNjZXB0IiwgRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QoY29uc3VtZXIpLmdldCgpLmdldE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0luZmVyZW5jZUNvbnRleHRUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvSW5mZXJlbmNlQ29udGV4dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWYyMDdmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0luZmVyZW5jZUNvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5NeU9iamVjdFByb3ZpZGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKi8KK3B1YmxpYyBjbGFzcyBJbmZlcmVuY2VDb250ZXh0VGVzdCB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBzdHJpbmc7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgb2JqZWN0OworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGxpc3RPZlN0cmluZzsKKyAgICBwcml2YXRlIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBsaXN0T2ZFOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHBFOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIHN0cmluZyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIG9iamVjdCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGxpc3RPZlN0cmluZyA9IGxpc3RPZihzdHJpbmcpOworICAgICAgICB0cEUgPSBtb2NrKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgd2hlbih0cEUuZ2V0TmFtZSgpKS50aGVuUmV0dXJuKCJUIik7CisKKyAgICAgICAgbGlzdE9mRSA9IGxpc3RPZihuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUodHBFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgbGlzdE9mKFJlc29sdmVkVHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTGlzdC5jbGFzcywgdHlwZVNvbHZlciksIEltbXV0YWJsZUxpc3Qub2YoZWxlbWVudFR5cGUpLCB0eXBlU29sdmVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vVmFyaWFibGVzQXJlUGxhY2VkV2hlbk5vdE5lZWRlZCgpIHsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlc3VsdCA9IG5ldyBJbmZlcmVuY2VDb250ZXh0KE15T2JqZWN0UHJvdmlkZXIuSU5TVEFOQ0UpLmFkZFBhaXIob2JqZWN0LCBzdHJpbmcpOworICAgICAgICBhc3NlcnRFcXVhbHMob2JqZWN0LCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGxhY2luZ0FTaW5nbGVWYXJpYWJsZVRvcExldmVsKCkgeworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzdWx0ID0gbmV3IEluZmVyZW5jZUNvbnRleHQoTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSkuYWRkUGFpcihuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUodHBFKSwgbGlzdE9mU3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbmZlcmVuY2VWYXJpYWJsZVR5cGUoMCwgTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSksIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwbGFjaW5nQVNpbmdsZVZhcmlhYmxlSW5zaWRlKCkgeworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzdWx0ID0gbmV3IEluZmVyZW5jZUNvbnRleHQoTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSkuYWRkUGFpcihsaXN0T2ZFLCBsaXN0T2ZTdHJpbmcpOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdE9mKG5ldyBJbmZlcmVuY2VWYXJpYWJsZVR5cGUoMCwgTXlPYmplY3RQcm92aWRlci5JTlNUQU5DRSkpLCByZXN1bHQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vQXJyYXlUeXBlVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vQXJyYXlUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGU0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9BcnJheVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZEFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRWb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBBcnJheVR5cGVUZXN0IHsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRBcnJheVR5cGUgYXJyYXlPZkJvb2xlYW5zOworICAgIHByaXZhdGUgUmVzb2x2ZWRBcnJheVR5cGUgYXJyYXlPZlN0cmluZ3M7CisgICAgcHJpdmF0ZSBSZXNvbHZlZEFycmF5VHlwZSBhcnJheU9mTGlzdE9mQTsKKyAgICBwcml2YXRlIFJlc29sdmVkQXJyYXlUeXBlIGFycmF5T2ZMaXN0T2ZTdHJpbmdzOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgT0JKRUNUOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgU1RSSU5HOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHBBOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIE9CSkVDVCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFNUUklORyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFycmF5T2ZCb29sZWFucyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTik7CisgICAgICAgIGFycmF5T2ZTdHJpbmdzID0gbmV3IFJlc29sdmVkQXJyYXlUeXBlKFNUUklORyk7CisgICAgICAgIHRwQSA9IFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLm9uVHlwZSgiQSIsICJmb28uQmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICBhcnJheU9mTGlzdE9mQSA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBSZXNvbHZlZFR5cGVWYXJpYWJsZSh0cEEpKSwgdHlwZVNvbHZlcikpOworICAgICAgICBhcnJheU9mTGlzdE9mU3RyaW5ncyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpLCB0eXBlU29sdmVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBcnJheSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGFycmF5T2ZCb29sZWFucy5pc0FycmF5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYXJyYXlPZlN0cmluZ3MuaXNBcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mQm9vbGVhbnMuaXNQcmltaXRpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZlN0cmluZ3MuaXNQcmltaXRpdmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNOdWxsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZCb29sZWFucy5pc051bGwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZlN0cmluZ3MuaXNOdWxsKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYXJyYXlPZkJvb2xlYW5zLmlzUmVmZXJlbmNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYXJyYXlPZlN0cmluZ3MuaXNSZWZlcmVuY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZCb29sZWFucy5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZlN0cmluZ3MuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVm9pZCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mQm9vbGVhbnMuaXNWb2lkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZTdHJpbmdzLmlzVm9pZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mQm9vbGVhbnMuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZlN0cmluZ3MuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWZlcmVuY2VUeXBlVXNhZ2UoKSB7CisgICAgICAgIGFycmF5T2ZCb29sZWFucy5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIGFycmF5T2ZCb29sZWFucy5hc1R5cGVQYXJhbWV0ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1ByaW1pdGl2ZSgpIHsKKyAgICAgICAgYXJyYXlPZkJvb2xlYW5zLmFzUHJpbWl0aXZlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNBcnJheVR5cGVVc2FnZSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcnJheU9mQm9vbGVhbnMgPT0gYXJyYXlPZkJvb2xlYW5zLmFzQXJyYXlUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFycmF5T2ZTdHJpbmdzID09IGFycmF5T2ZTdHJpbmdzLmFzQXJyYXlUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFycmF5T2ZMaXN0T2ZBID09IGFycmF5T2ZMaXN0T2ZBLmFzQXJyYXlUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzRGVzY3JpYmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9vbGVhbltdIiwgYXJyYXlPZkJvb2xlYW5zLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIsIGFycmF5T2ZTdHJpbmdzLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VQYXJhbSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcnJheU9mQm9vbGVhbnMgPT0gYXJyYXlPZkJvb2xlYW5zLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgT0JKRUNUKSk7CisgICAgICAgIGFzc2VydFRydWUoYXJyYXlPZlN0cmluZ3MgPT0gYXJyYXlPZlN0cmluZ3MucmVwbGFjZVR5cGVWYXJpYWJsZXModHBBLCBPQkpFQ1QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5T2ZMaXN0T2ZTdHJpbmdzLCBhcnJheU9mTGlzdE9mU3RyaW5ncy5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIE9CSkVDVCkpOworICAgICAgICBSZXNvbHZlZEFycmF5VHlwZSBhcnJheU9mTGlzdE9mT2JqZWN0cyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKE9CSkVDVCksIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGFycmF5T2ZMaXN0T2ZBLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgT0JKRUNUKS5pc0FycmF5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZihPQkpFQ1QpLAorICAgICAgICAgICAgICAgIGFycmF5T2ZMaXN0T2ZBLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgT0JKRUNUKS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBhcnJheU9mTGlzdE9mQS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIE9CSkVDVCkuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihPQkpFQ1QpLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBhcnJheU9mTGlzdE9mQS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIE9CSkVDVCkuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXJyYXlPZkxpc3RPZk9iamVjdHMsIGFycmF5T2ZMaXN0T2ZBLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgT0JKRUNUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhcnJheU9mTGlzdE9mU3RyaW5ncywgYXJyYXlPZkxpc3RPZkEucmVwbGFjZVR5cGVWYXJpYWJsZXModHBBLCBTVFJJTkcpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhcnJheU9mTGlzdE9mQSAhPSBhcnJheU9mTGlzdE9mQS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIE9CSkVDVCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXNzaWduYWJsZUJ5KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZCb29sZWFucy5pc0Fzc2lnbmFibGVCeShPQkpFQ1QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mQm9vbGVhbnMuaXNBc3NpZ25hYmxlQnkoU1RSSU5HKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZkJvb2xlYW5zLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZkJvb2xlYW5zLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYXJyYXlPZkJvb2xlYW5zLmlzQXNzaWduYWJsZUJ5KGFycmF5T2ZCb29sZWFucykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZCb29sZWFucy5pc0Fzc2lnbmFibGVCeShhcnJheU9mU3RyaW5ncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZCb29sZWFucy5pc0Fzc2lnbmFibGVCeShhcnJheU9mTGlzdE9mQSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZCb29sZWFucy5pc0Fzc2lnbmFibGVCeShhcnJheU9mTGlzdE9mU3RyaW5ncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGFycmF5T2ZCb29sZWFucykpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYXJyYXlPZlN0cmluZ3MuaXNBc3NpZ25hYmxlQnkoYXJyYXlPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mU3RyaW5ncy5pc0Fzc2lnbmFibGVCeShhcnJheU9mTGlzdE9mQSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGFycmF5T2ZMaXN0T2ZTdHJpbmdzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZkxpc3RPZkEuaXNBc3NpZ25hYmxlQnkoYXJyYXlPZkJvb2xlYW5zKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZkxpc3RPZkEuaXNBc3NpZ25hYmxlQnkoYXJyYXlPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGFycmF5T2ZMaXN0T2ZBLmlzQXNzaWduYWJsZUJ5KGFycmF5T2ZMaXN0T2ZBKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYXJyYXlPZkxpc3RPZkEuaXNBc3NpZ25hYmxlQnkoYXJyYXlPZkxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mTGlzdE9mU3RyaW5ncy5pc0Fzc2lnbmFibGVCeShhcnJheU9mQm9vbGVhbnMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhcnJheU9mTGlzdE9mU3RyaW5ncy5pc0Fzc2lnbmFibGVCeShhcnJheU9mU3RyaW5ncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGFycmF5T2ZMaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGFycmF5T2ZMaXN0T2ZBKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBhcnJheU9mTGlzdE9mU3RyaW5ncy5pc0Fzc2lnbmFibGVCeShhcnJheU9mTGlzdE9mU3RyaW5ncykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vTnVsbFR5cGVUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9OdWxsVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGYyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vTnVsbFR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZEFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRWb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIE51bGxUeXBlVGVzdCB7CisKKyAgICBwcml2YXRlIFJlc29sdmVkQXJyYXlUeXBlIGFycmF5T2ZCb29sZWFuczsKKyAgICBwcml2YXRlIFJlc29sdmVkQXJyYXlUeXBlIGFycmF5T2ZMaXN0T2ZBOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgT0JKRUNUOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgU1RSSU5HOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIE9CSkVDVCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFNUUklORyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFycmF5T2ZCb29sZWFucyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTik7CisgICAgICAgIGFycmF5T2ZMaXN0T2ZBID0gbmV3IFJlc29sdmVkQXJyYXlUeXBlKG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YobmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLm9uVHlwZSgiQSIsICJmb28uQmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKSksIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIE51bGxUeXBlLklOU1RBTkNFLmlzQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcmltaXRpdmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgTnVsbFR5cGUuSU5TVEFOQ0UuaXNQcmltaXRpdmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNOdWxsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgTnVsbFR5cGUuSU5TVEFOQ0UuaXNOdWxsKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgTnVsbFR5cGUuSU5TVEFOQ0UuaXNSZWZlcmVuY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIE51bGxUeXBlLklOU1RBTkNFLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ZvaWQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgTnVsbFR5cGUuSU5TVEFOQ0UuaXNWb2lkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVHlwZVZhcmlhYmxlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIE51bGxUeXBlLklOU1RBTkNFLmlzVHlwZVZhcmlhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzUmVmZXJlbmNlVHlwZVVzYWdlKCkgeworICAgICAgICBOdWxsVHlwZS5JTlNUQU5DRS5hc1JlZmVyZW5jZVR5cGUoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1R5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIE51bGxUeXBlLklOU1RBTkNFLmFzVHlwZVBhcmFtZXRlcigpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzQXJyYXlUeXBlVXNhZ2UoKSB7CisgICAgICAgIE51bGxUeXBlLklOU1RBTkNFLmFzQXJyYXlUeXBlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNEZXNjcmliZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgTnVsbFR5cGUuSU5TVEFOQ0UuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIE51bGxUeXBlLklOU1RBTkNFLmlzQXNzaWduYWJsZUJ5KE51bGxUeXBlLklOU1RBTkNFKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIE51bGxUeXBlLklOU1RBTkNFLmlzQXNzaWduYWJsZUJ5KE9CSkVDVCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBOdWxsVHlwZS5JTlNUQU5DRS5pc0Fzc2lnbmFibGVCeShTVFJJTkcpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgTnVsbFR5cGUuSU5TVEFOQ0UuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgTnVsbFR5cGUuSU5TVEFOQ0UuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRSkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vUHJpbWl0aXZlVHlwZVRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1ByaW1pdGl2ZVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3OWRiZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1ByaW1pdGl2ZVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZEFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRWb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIFByaW1pdGl2ZVR5cGVUZXN0IHsKKworICAgIHByaXZhdGUgUmVzb2x2ZWRBcnJheVR5cGUgYXJyYXlPZkJvb2xlYW5zOworICAgIHByaXZhdGUgUmVzb2x2ZWRBcnJheVR5cGUgYXJyYXlPZkxpc3RPZkE7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBPQkpFQ1Q7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBTVFJJTkc7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBwcml2YXRlIFJlZmVyZW5jZVR5cGVJbXBsIGJvb2xlYW5Cb3g7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBjaGFyYWN0ZXJCb3g7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBieXRlQm94OworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgc2hvcnRCb3g7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBpbnRlZ2VyQm94OworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgbG9uZ0JveDsKKyAgICBwcml2YXRlIFJlZmVyZW5jZVR5cGVJbXBsIGZsb2F0Qm94OworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgZG91YmxlQm94OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIE9CSkVDVCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFNUUklORyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFycmF5T2ZCb29sZWFucyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTik7CisgICAgICAgIGFycmF5T2ZMaXN0T2ZBID0gbmV3IFJlc29sdmVkQXJyYXlUeXBlKG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YobmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLm9uVHlwZSgiQSIsICJmb28uQmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKSksIHR5cGVTb2x2ZXIpKTsKKworICAgICAgICBib29sZWFuQm94ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCb29sZWFuLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGNoYXJhY3RlckJveCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQ2hhcmFjdGVyLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGJ5dGVCb3ggPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJ5dGUuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgc2hvcnRCb3ggPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFNob3J0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGludGVnZXJCb3ggPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEludGVnZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgbG9uZ0JveCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTG9uZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBmbG9hdEJveCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRmxvYXQuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgZG91YmxlQm94ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihEb3VibGUuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXJyYXkoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBwdHUuaXNBcnJheSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUHJpbWl0aXZlKCkgeworICAgICAgICBmb3IgKFJlc29sdmVkUHJpbWl0aXZlVHlwZSBwdHUgOiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBwdHUuaXNQcmltaXRpdmUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBwdHUuaXNOdWxsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2UoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBwdHUuaXNSZWZlcmVuY2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBwdHUuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNWb2lkKCkgeworICAgICAgICBmb3IgKFJlc29sdmVkUHJpbWl0aXZlVHlwZSBwdHUgOiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcHR1LmlzVm9pZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVHlwZVZhcmlhYmxlKCkgeworICAgICAgICBmb3IgKFJlc29sdmVkUHJpbWl0aXZlVHlwZSBwdHUgOiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcHR1LmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWZlcmVuY2VUeXBlVXNhZ2UoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwdHUuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICBmb3IgKFJlc29sdmVkUHJpbWl0aXZlVHlwZSBwdHUgOiBSZXNvbHZlZFByaW1pdGl2ZVR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHR1LmFzVHlwZVBhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzQXJyYXlUeXBlVXNhZ2UoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwdHUuYXNBcnJheVR5cGUoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0Rlc2NyaWJlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTi5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFyIiwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYnl0ZSIsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNob3J0IiwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibG9uZyIsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsb2F0IiwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FULmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRvdWJsZSIsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnlPdGhlclByaW1pdGl2ZVR5cGVzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTi5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkRPVUJMRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUi5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUi5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5UKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUi5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUi5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQllURS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQllURS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQllURSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5TSE9SVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQllURS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5GTE9BVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5TSE9SVC5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5TSE9SVC5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5ULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5ULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVC5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5ULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5TSE9SVCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5GTE9BVC5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FULmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FUKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0Fzc2lnbmFibGVCeUJveGVkVHlwZXMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTi5pc0Fzc2lnbmFibGVCeShib29sZWFuQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoY2hhcmFjdGVyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOLmlzQXNzaWduYWJsZUJ5KHNob3J0Qm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4uaXNBc3NpZ25hYmxlQnkoaW50ZWdlckJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOLmlzQXNzaWduYWJsZUJ5KGxvbmdCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTi5pc0Fzc2lnbmFibGVCeShmbG9hdEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOLmlzQXNzaWduYWJsZUJ5KGRvdWJsZUJveCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoYm9vbGVhbkJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoY2hhcmFjdGVyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSLmlzQXNzaWduYWJsZUJ5KHNob3J0Qm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkNIQVIuaXNBc3NpZ25hYmxlQnkoaW50ZWdlckJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSLmlzQXNzaWduYWJsZUJ5KGxvbmdCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQ0hBUi5pc0Fzc2lnbmFibGVCeShmbG9hdEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5DSEFSLmlzQXNzaWduYWJsZUJ5KGRvdWJsZUJveCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUuaXNBc3NpZ25hYmxlQnkoYm9vbGVhbkJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KGNoYXJhY3RlckJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUuaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KHNob3J0Qm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJZVEUuaXNBc3NpZ25hYmxlQnkoaW50ZWdlckJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KGxvbmdCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQllURS5pc0Fzc2lnbmFibGVCeShmbG9hdEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CWVRFLmlzQXNzaWduYWJsZUJ5KGRvdWJsZUJveCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmlzQXNzaWduYWJsZUJ5KGJvb2xlYW5Cb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQuaXNBc3NpZ25hYmxlQnkoY2hhcmFjdGVyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQuaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmlzQXNzaWduYWJsZUJ5KHNob3J0Qm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLlNIT1JULmlzQXNzaWduYWJsZUJ5KGludGVnZXJCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQuaXNBc3NpZ25hYmxlQnkobG9uZ0JveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5TSE9SVC5pc0Fzc2lnbmFibGVCeShmbG9hdEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5TSE9SVC5pc0Fzc2lnbmFibGVCeShkb3VibGVCb3gpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoYm9vbGVhbkJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVC5pc0Fzc2lnbmFibGVCeShjaGFyYWN0ZXJCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVC5pc0Fzc2lnbmFibGVCeShzaG9ydEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVC5pc0Fzc2lnbmFibGVCeShpbnRlZ2VyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVC5pc0Fzc2lnbmFibGVCeShsb25nQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLklOVC5pc0Fzc2lnbmFibGVCeShmbG9hdEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQuaXNBc3NpZ25hYmxlQnkoZG91YmxlQm94KSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShib29sZWFuQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShjaGFyYWN0ZXJCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HLmlzQXNzaWduYWJsZUJ5KGJ5dGVCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HLmlzQXNzaWduYWJsZUJ5KHNob3J0Qm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShpbnRlZ2VyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShsb25nQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkxPTkcuaXNBc3NpZ25hYmxlQnkoZmxvYXRCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuTE9ORy5pc0Fzc2lnbmFibGVCeShkb3VibGVCb3gpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5GTE9BVC5pc0Fzc2lnbmFibGVCeShib29sZWFuQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoY2hhcmFjdGVyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FULmlzQXNzaWduYWJsZUJ5KHNob3J0Qm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQuaXNBc3NpZ25hYmxlQnkoaW50ZWdlckJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkZMT0FULmlzQXNzaWduYWJsZUJ5KGxvbmdCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5GTE9BVC5pc0Fzc2lnbmFibGVCeShmbG9hdEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5GTE9BVC5pc0Fzc2lnbmFibGVCeShkb3VibGVCb3gpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoYm9vbGVhbkJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkRPVUJMRS5pc0Fzc2lnbmFibGVCeShjaGFyYWN0ZXJCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoYnl0ZUJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkRPVUJMRS5pc0Fzc2lnbmFibGVCeShzaG9ydEJveCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkRPVUJMRS5pc0Fzc2lnbmFibGVCeShpbnRlZ2VyQm94KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFLmlzQXNzaWduYWJsZUJ5KGxvbmdCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoZmxvYXRCb3gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIFJlc29sdmVkUHJpbWl0aXZlVHlwZS5ET1VCTEUuaXNBc3NpZ25hYmxlQnkoZG91YmxlQm94KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnlBbnl0aGluZ0Vsc2UoKSB7CisgICAgICAgIGZvciAoUmVzb2x2ZWRQcmltaXRpdmVUeXBlIHB0dSA6IFJlc29sdmVkUHJpbWl0aXZlVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBwdHUuaXNBc3NpZ25hYmxlQnkoT0JKRUNUKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHB0dS5pc0Fzc2lnbmFibGVCeShTVFJJTkcpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcHR1LmlzQXNzaWduYWJsZUJ5KE51bGxUeXBlLklOU1RBTkNFKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHB0dS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHB0dS5pc0Fzc2lnbmFibGVCeShhcnJheU9mQm9vbGVhbnMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcHR1LmlzQXNzaWduYWJsZUJ5KGFycmF5T2ZMaXN0T2ZBKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1JlZmVyZW5jZVR5cGVUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9SZWZlcmVuY2VUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGIzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9SZWZlcmVuY2VUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW07CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBSZWZlcmVuY2VUeXBlVGVzdCB7CisKKyAgICBwcml2YXRlIFJlZmVyZW5jZVR5cGVJbXBsIGxpc3RPZkE7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBsaXN0T2ZTdHJpbmdzOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgbGlua2VkTGlzdE9mU3RyaW5nOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgY29sbGVjdGlvbk9mU3RyaW5nOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgbGlzdE9mV2lsZGNhcmRFeHRlbmRzU3RyaW5nOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgbGlzdE9mV2lsZGNhcmRTdXBlclN0cmluZzsKKyAgICBwcml2YXRlIFJlZmVyZW5jZVR5cGVJbXBsIG9iamVjdDsKKyAgICBwcml2YXRlIFJlZmVyZW5jZVR5cGVJbXBsIHN0cmluZzsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBvYmplY3QgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBsaXN0T2ZBID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTGlzdC5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ub25UeXBlKCJBIiwgImZvby5CYXIiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGxpc3RPZlN0cmluZ3MgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgbGlua2VkTGlzdE9mU3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihMaW5rZWRMaXN0LmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgY29sbGVjdGlvbk9mU3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ29sbGVjdGlvbi5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGxpc3RPZldpbGRjYXJkRXh0ZW5kc1N0cmluZyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQoc3RyaW5nKSksIHR5cGVTb2x2ZXIpOworICAgICAgICBsaXN0T2ZXaWxkY2FyZFN1cGVyU3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTGlzdC5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihSZXNvbHZlZFdpbGRjYXJkLnN1cGVyQm91bmQoc3RyaW5nKSksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlcml2YXRpb25PZlR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBSZWZsZWN0aW9uVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIHJlZjEgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoTGlua2VkTGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZjEudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmMS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFIiwgcmVmMS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXJyYXkoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgb2JqZWN0LmlzQXJyYXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3RyaW5nLmlzQXJyYXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlzdE9mQS5pc0FycmF5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZlN0cmluZ3MuaXNBcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBvYmplY3QuaXNQcmltaXRpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3RyaW5nLmlzUHJpbWl0aXZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZkEuaXNQcmltaXRpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlzdE9mU3RyaW5ncy5pc1ByaW1pdGl2ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgb2JqZWN0LmlzTnVsbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdHJpbmcuaXNOdWxsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZkEuaXNOdWxsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZlN0cmluZ3MuaXNOdWxsKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgb2JqZWN0LmlzUmVmZXJlbmNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3RyaW5nLmlzUmVmZXJlbmNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbGlzdE9mQS5pc1JlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3RPZlN0cmluZ3MuaXNSZWZlcmVuY2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgb2JqZWN0LmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN0cmluZy5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsaXN0T2ZBLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3RPZlN0cmluZ3MuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVm9pZCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBvYmplY3QuaXNWb2lkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN0cmluZy5pc1ZvaWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlzdE9mQS5pc1ZvaWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlzdE9mU3RyaW5ncy5pc1ZvaWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUeXBlVmFyaWFibGUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgb2JqZWN0LmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN0cmluZy5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZBLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZlN0cmluZ3MuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWZlcmVuY2VUeXBlVXNhZ2UoKSB7CisgICAgICAgIGFzc2VydFRydWUob2JqZWN0ID09IG9iamVjdC5hc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydFRydWUoc3RyaW5nID09IHN0cmluZy5hc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydFRydWUobGlzdE9mQSA9PSBsaXN0T2ZBLmFzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0T2ZTdHJpbmdzID09IGxpc3RPZlN0cmluZ3MuYXNSZWZlcmVuY2VUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgb2JqZWN0LmFzVHlwZVBhcmFtZXRlcigpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzQXJyYXlUeXBlVXNhZ2UoKSB7CisgICAgICAgIG9iamVjdC5hc0FycmF5VHlwZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzRGVzY3JpYmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIG9iamVjdC5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgc3RyaW5nLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PEE+IiwgbGlzdE9mQS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiIsIGxpc3RPZlN0cmluZ3MuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVBhcmFtKCkgeworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cEEgPSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5vblR5cGUoIkEiLCAiZm9vLkJhciIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmplY3QgPT0gb2JqZWN0LnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgb2JqZWN0KSk7CisgICAgICAgIGFzc2VydFRydWUoc3RyaW5nID09IHN0cmluZy5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIG9iamVjdCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdE9mU3RyaW5ncywgbGlzdE9mU3RyaW5ncy5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIG9iamVjdCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdE9mU3RyaW5ncywgbGlzdE9mQS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEEsIHN0cmluZykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXNzaWduYWJsZUJ5U2ltcGxlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgb2JqZWN0LmlzQXNzaWduYWJsZUJ5KHN0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN0cmluZy5pc0Fzc2lnbmFibGVCeShvYmplY3QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGxpc3RPZkEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZBLmlzQXNzaWduYWJsZUJ5KGxpc3RPZlN0cmluZ3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG9iamVjdC5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3RyaW5nLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZBLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgb2JqZWN0LmlzQXNzaWduYWJsZUJ5KE51bGxUeXBlLklOU1RBTkNFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzdHJpbmcuaXNBc3NpZ25hYmxlQnkoTnVsbFR5cGUuSU5TVEFOQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3RPZlN0cmluZ3MuaXNBc3NpZ25hYmxlQnkoTnVsbFR5cGUuSU5TVEFOQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3RPZkEuaXNBc3NpZ25hYmxlQnkoTnVsbFR5cGUuSU5TVEFOQ0UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0Fzc2lnbmFibGVCeUJveGVkUHJpbWl0aXZlKCl7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBudW1iZXJUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihOdW1iZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLHR5cGVTb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgaW50VHlwZSA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oSW50ZWdlci5jbGFzcywgdHlwZVNvbHZlciksdHlwZVNvbHZlcik7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBkb3VibGVUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihEb3VibGUuY2xhc3MsIHR5cGVTb2x2ZXIpLHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgbnVtYmVyVHlwZS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5UKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgbnVtYmVyVHlwZS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgbnVtYmVyVHlwZS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuU0hPUlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsICBudW1iZXJUeXBlLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5MT05HKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgbnVtYmVyVHlwZS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRkxPQVQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBudW1iZXJUeXBlLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgaW50VHlwZS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5UKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgZG91YmxlVHlwZS5pc0Fzc2lnbmFibGVCeShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuRE9VQkxFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnlHZW5lcmljcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGxpc3RPZldpbGRjYXJkRXh0ZW5kc1N0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZlN0cmluZ3MuaXNBc3NpZ25hYmxlQnkobGlzdE9mV2lsZGNhcmRFeHRlbmRzU3RyaW5nKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsaXN0T2ZXaWxkY2FyZEV4dGVuZHNTdHJpbmcuaXNBc3NpZ25hYmxlQnkobGlzdE9mU3RyaW5ncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZldpbGRjYXJkRXh0ZW5kc1N0cmluZy5pc0Fzc2lnbmFibGVCeShsaXN0T2ZXaWxkY2FyZFN1cGVyU3RyaW5nKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsaXN0T2ZXaWxkY2FyZFN1cGVyU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZXaWxkY2FyZFN1cGVyU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGxpc3RPZldpbGRjYXJkRXh0ZW5kc1N0cmluZykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXNzaWduYWJsZUJ5R2VuZXJpY3NJbmhlcml0YW5jZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbGxlY3Rpb25PZlN0cmluZy5pc0Fzc2lnbmFibGVCeShjb2xsZWN0aW9uT2ZTdHJpbmcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbGxlY3Rpb25PZlN0cmluZy5pc0Fzc2lnbmFibGVCeShsaXN0T2ZTdHJpbmdzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjb2xsZWN0aW9uT2ZTdHJpbmcuaXNBc3NpZ25hYmxlQnkobGlua2VkTGlzdE9mU3RyaW5nKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGNvbGxlY3Rpb25PZlN0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbGlzdE9mU3RyaW5ncy5pc0Fzc2lnbmFibGVCeShsaXN0T2ZTdHJpbmdzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGxpbmtlZExpc3RPZlN0cmluZykpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlua2VkTGlzdE9mU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGNvbGxlY3Rpb25PZlN0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpbmtlZExpc3RPZlN0cmluZy5pc0Fzc2lnbmFibGVCeShsaXN0T2ZTdHJpbmdzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsaW5rZWRMaXN0T2ZTdHJpbmcuaXNBc3NpZ25hYmxlQnkobGlua2VkTGlzdE9mU3RyaW5nKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQW5jZXN0b3JzQ29uc2lkZXJpbmdUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaW5rZWRMaXN0T2ZTdHJpbmcuZ2V0QWxsQW5jZXN0b3JzKCkuY29udGFpbnMob2JqZWN0KSk7CisgICAgICAgIGFzc2VydFRydWUobGlua2VkTGlzdE9mU3RyaW5nLmdldEFsbEFuY2VzdG9ycygpLmNvbnRhaW5zKGxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaW5rZWRMaXN0T2ZTdHJpbmcuZ2V0QWxsQW5jZXN0b3JzKCkuY29udGFpbnMoY29sbGVjdGlvbk9mU3RyaW5nKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpbmtlZExpc3RPZlN0cmluZy5nZXRBbGxBbmNlc3RvcnMoKS5jb250YWlucyhsaXN0T2ZBKSk7CisgICAgfQorCisgICAgY2xhc3MgRm9vIHsKKworICAgIH0KKworICAgIGNsYXNzIEJhciBleHRlbmRzIEZvbyB7CisKKyAgICB9CisKKyAgICBjbGFzcyBCYXp6ZXI8QSwgQiwgQz4geworCisgICAgfQorCisgICAgY2xhc3MgTW9yZUJhenppbmc8QSwgQj4gZXh0ZW5kcyBCYXp6ZXI8QiwgU3RyaW5nLCBBPiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNDb25zaWRlcmluZ0dlbmVyaWNzQ2FzZXMoKSB7CisgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIGZvbyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIGJhciA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQmFyLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIGxlZnQsIHJpZ2h0OworCisgICAgICAgIC8vWUVTIE1vcmVCYXp6aW5nPEZvbywgQmFyPiBlMSA9IG5ldyBNb3JlQmF6emluZzxGb28sIEJhcj4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoZm9vLCBiYXIpLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihmb28sIGJhciksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworCisgICAgICAgIC8vWUVTIE1vcmVCYXp6aW5nPD8gZXh0ZW5kcyBGb28sIEJhcj4gZTIgPSBuZXcgTW9yZUJhenppbmc8Rm9vLCBCYXI+KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihNb3JlQmF6emluZy5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKFJlc29sdmVkV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGZvbyksIGJhciksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgTW9yZUJhenppbmc8Rm9vLCA/IGV4dGVuZHMgQmFyPiBlMyA9IG5ldyBNb3JlQmF6emluZzxGb28sIEJhcj4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoZm9vLCBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZChiYXIpKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihNb3JlQmF6emluZy5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoZm9vLCBiYXIpLCB0eXBlU29sdmVyKSkKKyAgICAgICAgKTsKKworICAgICAgICAvL1lFUyBNb3JlQmF6emluZzw/IGV4dGVuZHMgRm9vLCA/IGV4dGVuZHMgRm9vPiBlNCA9IG5ldyBNb3JlQmF6emluZzxGb28sIEJhcj4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQoZm9vKSwgUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQoZm9vKSksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgTW9yZUJhenppbmc8PyBleHRlbmRzIEZvbywgPyBleHRlbmRzIEZvbz4gZTUgPSBuZXcgTW9yZUJhenppbmc8QmFyLCBCYXI+KCk7CisgICAgICAgIGxlZnQgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKFJlc29sdmVkV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGZvbyksIFJlc29sdmVkV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGZvbykpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgcmlnaHQgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGJhciwgYmFyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsZWZ0LmlzQXNzaWduYWJsZUJ5KHJpZ2h0KSk7CisKKyAgICAgICAgLy9ZRVMgQmF6emVyPE9iamVjdCwgU3RyaW5nLCBTdHJpbmc+IGU2ID0gbmV3IE1vcmVCYXp6aW5nPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBsZWZ0ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2Yob2JqZWN0LCBzdHJpbmcsIHN0cmluZyksIHR5cGVTb2x2ZXIpOworICAgICAgICByaWdodCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nLCBvYmplY3QpLCB0eXBlU29sdmVyKTsKKworICAgICAgICAvLyBUbyBkZWJ1ZyB0aGUgZm9sbG93aW5nCisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSByaWdodC5nZXRBbGxBbmNlc3RvcnMoKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIG1vcmVCYXp6aW5nQW5jZXN0b3IgPSBhbmNlc3RvcnMuc3RyZWFtKCkuZmlsdGVyKGEgLT4gYS5nZXRRdWFsaWZpZWROYW1lKCkuZW5kc1dpdGgoIkJhenplciIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbGVmdC5pc0Fzc2lnbmFibGVCeShyaWdodCkpOworCisgICAgICAgIC8vWUVTIEJhenplcjxTdHJpbmcsU3RyaW5nLFN0cmluZz4gZTcgPSBuZXcgTW9yZUJhenppbmc8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmcsIHN0cmluZywgc3RyaW5nKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihNb3JlQmF6emluZy5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nLCBzdHJpbmcpLCB0eXBlU29sdmVyKSkKKyAgICAgICAgKTsKKworICAgICAgICAvL1lFUyBCYXp6ZXI8QmFyLFN0cmluZyxGb28+IGU4ID0gbmV3IE1vcmVCYXp6aW5nPEZvbywgQmFyPigpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwKKyAgICAgICAgICAgICAgICBuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQmF6emVyLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoYmFyLCBzdHJpbmcsIGZvbyksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgQmF6emVyPEZvbyxTdHJpbmcsQmFyPiBlOSA9IG5ldyBNb3JlQmF6emluZzxCYXIsIEZvbz4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJhenplci5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgc3RyaW5nLCBiYXIpLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIGZvbyksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworCisgICAgICAgIC8vTk8gQmF6emVyPEJhcixTdHJpbmcsRm9vPiBuMSA9IG5ldyBNb3JlQmF6emluZzxCYXIsIEZvbz4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIHN0cmluZywgZm9vKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihNb3JlQmF6emluZy5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoYmFyLCBmb28pLCB0eXBlU29sdmVyKSkKKyAgICAgICAgKTsKKworICAgICAgICAvL05PIEJhenplcjxCYXIsU3RyaW5nLEJhcj4gbjIgPSBuZXcgTW9yZUJhenppbmc8QmFyLCBGb28+KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwKKyAgICAgICAgICAgICAgICBuZXcgUmVmZXJlbmNlVHlwZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQmF6emVyLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoYmFyLCBzdHJpbmcsIGZvbyksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGJhciwgZm9vKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9OTyBCYXp6ZXI8Rm9vLE9iamVjdCxCYXI+IG4zID0gbmV3IE1vcmVCYXp6aW5nPEJhciwgRm9vPigpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJhenplci5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgb2JqZWN0LCBiYXIpLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIGZvbyksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hhclNlcXVlbmNlSXNBc3NpZ25hYmxlVG9PYmplY3QoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZWZlcmVuY2VUeXBlSW1wbCBjaGFyU2VxdWVuY2UgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihDaGFyU2VxdWVuY2UuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgUmVmZXJlbmNlVHlwZUltcGwgb2JqZWN0ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjaGFyU2VxdWVuY2UuaXNBc3NpZ25hYmxlQnkob2JqZWN0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBvYmplY3QuaXNBc3NpZ25hYmxlQnkoY2hhclNlcXVlbmNlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRUeXBlRXhpc3RpbmcoKSB7CisgICAgICAgIGNsYXNzIEZvbzxBPiB7CisgICAgICAgICAgICBMaXN0PEE+IGVsZW1lbnRzOworICAgICAgICB9CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlZmVyZW5jZVR5cGVJbXBsIHJlZiA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMaXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuZ2V0RmllbGRUeXBlKCJlbGVtZW50cyIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCByZWYuZ2V0RmllbGRUeXBlKCJlbGVtZW50cyIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmFzVHlwZVBhcmFtZXRlcigpLmdldE5hbWUoKSk7CisKKyAgICAgICAgcmVmID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihGb28uY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihTdHJpbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKSksCisgICAgICAgICAgICAgICAgdHlwZVNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMaXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuZ2V0RmllbGRUeXBlKCJlbGVtZW50cyIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZFR5cGVVbmV4aXN0aW5nKCkgeworICAgICAgICBjbGFzcyBGb288QT4geworICAgICAgICAgICAgTGlzdDxBPiBlbGVtZW50czsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZWZlcmVuY2VUeXBlSW1wbCByZWYgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEZvby5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVmLmdldEZpZWxkVHlwZSgiYmFyIikuaXNQcmVzZW50KCkpOworCisgICAgICAgIHJlZiA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpLAorICAgICAgICAgICAgICAgIHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVmLmdldEZpZWxkVHlwZSgiYmFyIikuaXNQcmVzZW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVQYXJhbVZhbHVlKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYXJyYXlsaXN0ID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEFycmF5TGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFic3RyYWN0TGlzdCA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBhYnN0cmFjdENvbGxlY3Rpb24gPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIGxpc3QgPSBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkSW50ZXJmYWNlRGVjbGFyYXRpb24gY29sbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ29sbGVjdGlvbi5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiBpdGVyYWJsZSA9IG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oSXRlcmFibGUuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFycmF5TGlzdE9mU3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGFycmF5bGlzdCwgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmcpLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2Yoc3RyaW5nKSwgYXJyYXlMaXN0T2ZTdHJpbmcudHlwZVBhcmFtVmFsdWUoYXJyYXlsaXN0LmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhPcHRpb25hbC5vZihzdHJpbmcpLCBhcnJheUxpc3RPZlN0cmluZy50eXBlUGFyYW1WYWx1ZShhYnN0cmFjdExpc3QuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE9wdGlvbmFsLm9mKHN0cmluZyksIGFycmF5TGlzdE9mU3RyaW5nLnR5cGVQYXJhbVZhbHVlKGFic3RyYWN0Q29sbGVjdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2Yoc3RyaW5nKSwgYXJyYXlMaXN0T2ZTdHJpbmcudHlwZVBhcmFtVmFsdWUobGlzdC5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2Yoc3RyaW5nKSwgYXJyYXlMaXN0T2ZTdHJpbmcudHlwZVBhcmFtVmFsdWUoY29sbGVjdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2Yoc3RyaW5nKSwgYXJyYXlMaXN0T2ZTdHJpbmcudHlwZVBhcmFtVmFsdWUoaXRlcmFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNPblJhd1R5cGUoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVJlc29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBhcnJheWxpc3QgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQXJyYXlMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgcmF3QXJyYXlMaXN0ID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGFycmF5bGlzdCwgdHlwZVJlc29sdmVyKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGFuY2VzdG9ycyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcmF3QXJyYXlMaXN0LmdldEFsbEFuY2VzdG9ycygpLmZvckVhY2goYSAtPiBhbmNlc3RvcnMucHV0KGEuZ2V0UXVhbGlmaWVkTmFtZSgpLCBhKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBhbmNlc3RvcnMuc2l6ZSgpKTsKKworICAgICAgICBSZXNvbHZlZFR5cGVWYXJpYWJsZSB0diA9IG5ldyBSZXNvbHZlZFR5cGVWYXJpYWJsZShhcnJheWxpc3QuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oUmFuZG9tQWNjZXNzLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuUmFuZG9tQWNjZXNzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2YodHYpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0diksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEudXRpbC5MaXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ2xvbmVhYmxlLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLmxhbmcuQ2xvbmVhYmxlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ29sbGVjdGlvbi5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0diksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEudXRpbC5Db2xsZWN0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2YodHYpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVSZXNvbHZlciksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEubGFuZy5PYmplY3QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihJdGVyYWJsZS5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0diksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEubGFuZy5JdGVyYWJsZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKFNlcmlhbGl6YWJsZS5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5pby5TZXJpYWxpemFibGUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQW5jZXN0b3JzT25UeXBlV2l0aFNwZWNpZmllZFR5cGVQYXJhbWV0ZXJzRm9ySW50ZXJmYWNlKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIGxpc3QgPSBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGxpc3RPZlN0cmluZyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChsaXN0LCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgTWFwPFN0cmluZywgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGxpc3RPZlN0cmluZy5nZXRBbGxBbmNlc3RvcnMoKS5mb3JFYWNoKGEgLT4gYW5jZXN0b3JzLnB1dChhLmdldFF1YWxpZmllZE5hbWUoKSwgYSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgYW5jZXN0b3JzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKENvbGxlY3Rpb24uY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5sYW5nLk9iamVjdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKEl0ZXJhYmxlLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEubGFuZy5JdGVyYWJsZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNPblR5cGVXaXRoU3BlY2lmaWVkVHlwZVBhcmFtZXRlcnNGb3JDbGFzc0Fic3RyYWN0Q29sbGVjdGlvbigpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFic3RyYWN0Q29sbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFic3RyYWN0Q29sbGVjdGlvbk9mU3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGFic3RyYWN0Q29sbGVjdGlvbiwgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmcpLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBhYnN0cmFjdENvbGxlY3Rpb25PZlN0cmluZy5nZXRBbGxBbmNlc3RvcnMoKS5mb3JFYWNoKGEgLT4gYW5jZXN0b3JzLnB1dChhLmdldFF1YWxpZmllZE5hbWUoKSwgYSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgYW5jZXN0b3JzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKENvbGxlY3Rpb24uY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5sYW5nLk9iamVjdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKEl0ZXJhYmxlLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEubGFuZy5JdGVyYWJsZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNPblR5cGVXaXRoU3BlY2lmaWVkVHlwZVBhcmFtZXRlcnNGb3JDbGFzc0Fic3RyYWN0TGlzdCgpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFic3RyYWN0TGlzdCA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFic3RyYWN0TGlzdE9mU3RyaW5nID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGFic3RyYWN0TGlzdCwgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmcpLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBhYnN0cmFjdExpc3RPZlN0cmluZy5nZXRBbGxBbmNlc3RvcnMoKS5mb3JFYWNoKGEgLT4gYW5jZXN0b3JzLnB1dChhLmdldFF1YWxpZmllZE5hbWUoKSwgYSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgYW5jZXN0b3JzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEudXRpbC5MaXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ29sbGVjdGlvbi5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmcpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLmxhbmcuT2JqZWN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oSXRlcmFibGUuY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5sYW5nLkl0ZXJhYmxlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbEFuY2VzdG9yc09uVHlwZVdpdGhTcGVjaWZpZWRUeXBlUGFyYW1ldGVyc0ZvckNsYXNzQXJyYXlMaXN0KCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYXJyYXlsaXN0ID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEFycmF5TGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHN0cmluZyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgYXJyYXlMaXN0T2ZTdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwoYXJyYXlsaXN0LCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgTWFwPFN0cmluZywgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGFycmF5TGlzdE9mU3RyaW5nLmdldEFsbEFuY2VzdG9ycygpLmZvckVhY2goYSAtPiBhbmNlc3RvcnMucHV0KGEuZ2V0UXVhbGlmaWVkTmFtZSgpLCBhKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBhbmNlc3RvcnMuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oUmFuZG9tQWNjZXNzLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuUmFuZG9tQWNjZXNzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS51dGlsLkxpc3QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihDbG9uZWFibGUuY2xhc3MsIHR5cGVSZXNvbHZlciksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEubGFuZy5DbG9uZWFibGUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihDb2xsZWN0aW9uLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCBJbW11dGFibGVMaXN0Lm9mKHN0cmluZyksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEudXRpbC5Db2xsZWN0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBYnN0cmFjdExpc3QuY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS51dGlsLkFic3RyYWN0TGlzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLmxhbmcuT2JqZWN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oSXRlcmFibGUuY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5sYW5nLkl0ZXJhYmxlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oU2VyaWFsaXphYmxlLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlUGFyYW1ldGVyc1ZhbHVlcygpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHN0cmVhbSA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKFN0cmVhbS5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0cmVhbS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihTdHJlYW0uY2xhc3MsIHR5cGVSZXNvbHZlcikuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkpLCBzdHJlYW0udHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUeXBlVmFyaWFibGVzKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIHN0cmVhbUludGVyZmFjZSA9IG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oU3RyZWFtLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3RyZWFtID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHN0cmVhbUludGVyZmFjZSwgdHlwZVJlc29sdmVyKTsKKworICAgICAgICBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIHN0cmVhbU1hcCA9IHN0cmVhbUludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMoIm1hcCIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gc3RyZWFtTWFwUiA9IHN0cmVhbU1hcC5maW5kVHlwZVBhcmFtZXRlcigiVCIpLmdldCgpOworICAgICAgICBSZXNvbHZlZFR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgPSBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUoc3RyZWFtTWFwUik7CisgICAgICAgIHN0cmVhbSA9IHN0cmVhbS5kZXJpdmVUeXBlUGFyYW1ldGVycyhzdHJlYW0udHlwZVBhcmFtZXRlcnNNYXAoKS50b0J1aWxkZXIoKS5zZXRWYWx1ZShzdHJlYW0uZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCksIHR5cGVWYXJpYWJsZSkuYnVpbGQoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHBUb1JlcGxhY2UgPSBzdHJlYW1JbnRlcmZhY2UuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZXBsYWNlZCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJlYW1SZXBsYWNlZCA9IHN0cmVhbS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cFRvUmVwbGFjZSwgcmVwbGFjZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5zdHJlYW0uU3RyZWFtPGphdmEubGFuZy5TdHJpbmc+Iiwgc3RyZWFtUmVwbGFjZWQuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVR5cGVWYXJpYWJsZXNXaXRoTGFtYmRhSW5CZXR3ZWVuKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIHN0cmVhbUludGVyZmFjZSA9IG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oU3RyZWFtLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3RyZWFtID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHN0cmVhbUludGVyZmFjZSwgdHlwZVJlc29sdmVyKTsKKworICAgICAgICBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIHN0cmVhbU1hcCA9IHN0cmVhbUludGVyZmFjZS5nZXREZWNsYXJlZE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMoIm1hcCIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gc3RyZWFtTWFwUiA9IHN0cmVhbU1hcC5maW5kVHlwZVBhcmFtZXRlcigiVCIpLmdldCgpOworICAgICAgICBSZXNvbHZlZFR5cGVWYXJpYWJsZSB0eXBlVmFyaWFibGUgPSBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUoc3RyZWFtTWFwUik7CisgICAgICAgIHN0cmVhbSA9IHN0cmVhbS5kZXJpdmVUeXBlUGFyYW1ldGVycyhzdHJlYW0udHlwZVBhcmFtZXRlcnNNYXAoKS50b0J1aWxkZXIoKS5zZXRWYWx1ZShzdHJlYW0uZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCksIHR5cGVWYXJpYWJsZSkuYnVpbGQoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHBUb1JlcGxhY2UgPSBzdHJlYW1JbnRlcmZhY2UuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZXBsYWNlZCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIFJlc29sdmVkVHlwZSBzdHJlYW1SZXBsYWNlZCA9IHN0cmVhbS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cFRvUmVwbGFjZSwgcmVwbGFjZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5zdHJlYW0uU3RyZWFtPGphdmEubGFuZy5TdHJpbmc+Iiwgc3RyZWFtUmVwbGFjZWQuZGVzY3JpYmUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9UeXBlVmFyaWFibGVVc2FnZVRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1R5cGVWYXJpYWJsZVVzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDhiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9UeXBlVmFyaWFibGVVc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW07CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBUeXBlVmFyaWFibGVVc2FnZVRlc3QgeworCisgICAgcHJpdmF0ZSBSZXNvbHZlZFR5cGVWYXJpYWJsZSB0cEE7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCB0cFN0cmluZzsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgdHBBID0gbmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLm9uVHlwZSgiQSIsICJmb28uQmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKKyAgICAgICAgCisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgdHBTdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXNzaWduYWJsZUJ5U2ltcGxlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHRwU3RyaW5nLmlzQXNzaWduYWJsZUJ5KHRwQSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vVm9pZFR5cGVUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9Wb2lkVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg4ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vVm9pZFR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZEFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRWb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIFZvaWRUeXBlVGVzdCB7CisKKyAgICBwcml2YXRlIFJlc29sdmVkQXJyYXlUeXBlIGFycmF5T2ZCb29sZWFuczsKKyAgICBwcml2YXRlIFJlc29sdmVkQXJyYXlUeXBlIGFycmF5T2ZMaXN0T2ZBOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgT0JKRUNUOworICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZUltcGwgU1RSSU5HOworICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlU29sdmVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIE9CSkVDVCA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFNUUklORyA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFycmF5T2ZCb29sZWFucyA9IG5ldyBSZXNvbHZlZEFycmF5VHlwZShSZXNvbHZlZFByaW1pdGl2ZVR5cGUuQk9PTEVBTik7CisgICAgICAgIGFycmF5T2ZMaXN0T2ZBID0gbmV3IFJlc29sdmVkQXJyYXlUeXBlKG5ldyBSZWZlcmVuY2VUeXBlSW1wbCgKKyAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKExpc3QuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YobmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLm9uVHlwZSgiQSIsICJmb28uQmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKSksIHR5cGVTb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UuaXNBcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzUHJpbWl0aXZlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzTnVsbCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzTnVsbCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlZmVyZW5jZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzUmVmZXJlbmNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlVHlwZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ZvaWQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzVm9pZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzVHlwZVZhcmlhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzUmVmZXJlbmNlVHlwZVVzYWdlKCkgeworICAgICAgICBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmFzUmVmZXJlbmNlVHlwZSgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzVHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRS5hc1R5cGVQYXJhbWV0ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0FycmF5VHlwZVVzYWdlKCkgeworICAgICAgICBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmFzQXJyYXlUeXBlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNEZXNjcmliZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0Fzc2lnbmFibGVCeSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRS5pc0Fzc2lnbmFibGVCeShOdWxsVHlwZS5JTlNUQU5DRSkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzQXNzaWduYWJsZUJ5KE9CSkVDVCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzQXNzaWduYWJsZUJ5KFNUUklORykpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBSZXNvbHZlZFZvaWRUeXBlLklOU1RBTkNFLmlzQXNzaWduYWJsZUJ5KFJlc29sdmVkUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIFJlc29sdmVkVm9pZFR5cGUuSU5TVEFOQ0UuaXNBc3NpZ25hYmxlQnkoUmVzb2x2ZWRWb2lkVHlwZS5JTlNUQU5DRSkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vV2lsZGNhcmRVc2FnZVRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1dpbGRjYXJkVXNhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ODA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1dpbGRjYXJkVXNhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGVWYXJpYWJsZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFdpbGRjYXJkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBXaWxkY2FyZFVzYWdlVGVzdCB7CisKKyAgICBjbGFzcyBGb28geworICAgIH0KKworICAgIGNsYXNzIEJhciBleHRlbmRzIEZvbyB7CisgICAgfQorCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBmb287CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBiYXI7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBvYmplY3Q7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2VUeXBlSW1wbCBzdHJpbmc7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFdpbGRjYXJkIHVuYm91bmRlZCA9IFJlc29sdmVkV2lsZGNhcmQuVU5CT1VOREVEOworICAgIHByaXZhdGUgUmVzb2x2ZWRXaWxkY2FyZCBzdXBlckZvbzsKKyAgICBwcml2YXRlIFJlc29sdmVkV2lsZGNhcmQgc3VwZXJCYXI7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFdpbGRjYXJkIGV4dGVuZHNGb287CisgICAgcHJpdmF0ZSBSZXNvbHZlZFdpbGRjYXJkIGV4dGVuZHNCYXI7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFdpbGRjYXJkIHN1cGVyQTsKKyAgICBwcml2YXRlIFJlc29sdmVkV2lsZGNhcmQgZXh0ZW5kc0E7CisgICAgcHJpdmF0ZSBSZXNvbHZlZFdpbGRjYXJkIHN1cGVyU3RyaW5nOworICAgIHByaXZhdGUgUmVzb2x2ZWRXaWxkY2FyZCBleHRlbmRzU3RyaW5nOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlVmFyaWFibGUgYTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBmb28gPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEZvby5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBiYXIgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJhci5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBvYmplY3QgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBzdHJpbmcgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBzdXBlckZvbyA9IFJlc29sdmVkV2lsZGNhcmQuc3VwZXJCb3VuZChmb28pOworICAgICAgICBzdXBlckJhciA9IFJlc29sdmVkV2lsZGNhcmQuc3VwZXJCb3VuZChiYXIpOworICAgICAgICBleHRlbmRzRm9vID0gUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQoZm9vKTsKKyAgICAgICAgZXh0ZW5kc0JhciA9IFJlc29sdmVkV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGJhcik7CisgICAgICAgIGEgPSBuZXcgUmVzb2x2ZWRUeXBlVmFyaWFibGUoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24ub25UeXBlKCJBIiwgImZvby5CYXIiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOworICAgICAgICBzdXBlckEgPSBSZXNvbHZlZFdpbGRjYXJkLnN1cGVyQm91bmQoYSk7CisgICAgICAgIGV4dGVuZHNBID0gUmVzb2x2ZWRXaWxkY2FyZC5leHRlbmRzQm91bmQoYSk7CisgICAgICAgIHN1cGVyU3RyaW5nID0gUmVzb2x2ZWRXaWxkY2FyZC5zdXBlckJvdW5kKHN0cmluZyk7CisgICAgICAgIGV4dGVuZHNTdHJpbmcgPSBSZXNvbHZlZFdpbGRjYXJkLmV4dGVuZHNCb3VuZChzdHJpbmcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzQXJyYXkoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdW5ib3VuZGVkLmlzQXJyYXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3VwZXJGb28uaXNBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdXBlckJhci5pc0FycmF5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dGVuZHNGb28uaXNBcnJheSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBleHRlbmRzQmFyLmlzQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNQcmltaXRpdmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdW5ib3VuZGVkLmlzUHJpbWl0aXZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN1cGVyRm9vLmlzUHJpbWl0aXZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN1cGVyQmFyLmlzUHJpbWl0aXZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dGVuZHNGb28uaXNQcmltaXRpdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZXh0ZW5kc0Jhci5pc1ByaW1pdGl2ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdW5ib3VuZGVkLmlzTnVsbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdXBlckZvby5pc051bGwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3VwZXJCYXIuaXNOdWxsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dGVuZHNGb28uaXNOdWxsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dGVuZHNCYXIuaXNOdWxsKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdW5ib3VuZGVkLmlzUmVmZXJlbmNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3VwZXJGb28uaXNSZWZlcmVuY2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzdXBlckJhci5pc1JlZmVyZW5jZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGV4dGVuZHNGb28uaXNSZWZlcmVuY2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBleHRlbmRzQmFyLmlzUmVmZXJlbmNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlVHlwZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB1bmJvdW5kZWQuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN1cGVyRm9vLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdXBlckJhci5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZXh0ZW5kc0Zvby5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZXh0ZW5kc0Jhci5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNWb2lkKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHVuYm91bmRlZC5pc1ZvaWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3VwZXJGb28uaXNWb2lkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN1cGVyQmFyLmlzVm9pZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBleHRlbmRzRm9vLmlzVm9pZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBleHRlbmRzQmFyLmlzVm9pZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB1bmJvdW5kZWQuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3VwZXJGb28uaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgc3VwZXJCYXIuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZXh0ZW5kc0Zvby5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBleHRlbmRzQmFyLmlzVHlwZVZhcmlhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzV2lsZGNhcmQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB1bmJvdW5kZWQuaXNXaWxkY2FyZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN1cGVyRm9vLmlzV2lsZGNhcmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzdXBlckJhci5pc1dpbGRjYXJkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZXh0ZW5kc0Zvby5pc1dpbGRjYXJkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZXh0ZW5kc0Jhci5pc1dpbGRjYXJkKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzQXJyYXlUeXBlVXNhZ2UoKSB7CisgICAgICAgIHVuYm91bmRlZC5hc0FycmF5VHlwZSgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFzUmVmZXJlbmNlVHlwZVVzYWdlKCkgeworICAgICAgICB1bmJvdW5kZWQuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICB1bmJvdW5kZWQuYXNUeXBlUGFyYW1ldGVyKCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNQcmltaXRpdmUoKSB7CisgICAgICAgIHVuYm91bmRlZC5hc1ByaW1pdGl2ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzV2lsZGNhcmQoKSB7CisgICAgICAgIGFzc2VydFRydWUodW5ib3VuZGVkID09IHVuYm91bmRlZC5hc1dpbGRjYXJkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHN1cGVyRm9vID09IHN1cGVyRm9vLmFzV2lsZGNhcmQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc3VwZXJCYXIgPT0gc3VwZXJCYXIuYXNXaWxkY2FyZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShleHRlbmRzRm9vID09IGV4dGVuZHNGb28uYXNXaWxkY2FyZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShleHRlbmRzQmFyID09IGV4dGVuZHNCYXIuYXNXaWxkY2FyZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0Rlc2NyaWJlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIj8iLCB1bmJvdW5kZWQuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPyBzdXBlciBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmRVc2FnZVRlc3QuRm9vIiwgc3VwZXJGb28uZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPyBzdXBlciBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmRVc2FnZVRlc3QuQmFyIiwgc3VwZXJCYXIuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZFVzYWdlVGVzdC5Gb28iLCBleHRlbmRzRm9vLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIj8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmRVc2FnZVRlc3QuQmFyIiwgZXh0ZW5kc0Jhci5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUGFyYW0oKSB7CisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwQSA9IFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLm9uVHlwZSgiQSIsICJmb28uQmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cEIgPSBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5vblR5cGUoIkIiLCAiZm9vLkJhciIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bmJvdW5kZWQgPT0gdW5ib3VuZGVkLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgc3RyaW5nKSk7CisgICAgICAgIGFzc2VydFRydWUoc3VwZXJGb28gPT0gc3VwZXJGb28ucmVwbGFjZVR5cGVWYXJpYWJsZXModHBBLCBzdHJpbmcpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShleHRlbmRzRm9vID09IGV4dGVuZHNGb28ucmVwbGFjZVR5cGVWYXJpYWJsZXModHBBLCBzdHJpbmcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN1cGVyU3RyaW5nLCBzdXBlckEucmVwbGFjZVR5cGVWYXJpYWJsZXModHBBLCBzdHJpbmcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dGVuZHNTdHJpbmcsIGV4dGVuZHNBLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQSwgc3RyaW5nKSk7CisgICAgICAgIGFzc2VydFRydWUoc3VwZXJBID09IHN1cGVyQS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cEIsIHN0cmluZykpOworICAgICAgICBhc3NlcnRUcnVlKGV4dGVuZHNBID09IGV4dGVuZHNBLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwQiwgc3RyaW5nKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnlTaW1wbGUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdW5ib3VuZGVkLmlzQXNzaWduYWJsZUJ5KG9iamVjdCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgb2JqZWN0LmlzQXNzaWduYWJsZUJ5KHVuYm91bmRlZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHN0cmluZy5pc0Fzc2lnbmFibGVCeSh1bmJvdW5kZWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN1cGVyRm9vLmlzQXNzaWduYWJsZUJ5KGZvbykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGZvby5pc0Fzc2lnbmFibGVCeShzdXBlckZvbykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGV4dGVuZHNGb28uaXNBc3NpZ25hYmxlQnkoZm9vKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBmb28uaXNBc3NpZ25hYmxlQnkoZXh0ZW5kc0ZvbykpOworICAgIH0KKworICAgIC8qQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnlHZW5lcmljcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGxpc3RPZldpbGRjYXJkRXh0ZW5kc1N0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZlN0cmluZ3MuaXNBc3NpZ25hYmxlQnkobGlzdE9mV2lsZGNhcmRFeHRlbmRzU3RyaW5nKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAgbGlzdE9mV2lsZGNhcmRFeHRlbmRzU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0T2ZXaWxkY2FyZEV4dGVuZHNTdHJpbmcuaXNBc3NpZ25hYmxlQnkobGlzdE9mV2lsZGNhcmRTdXBlclN0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgIGxpc3RPZldpbGRjYXJkU3VwZXJTdHJpbmcuaXNBc3NpZ25hYmxlQnkobGlzdE9mU3RyaW5ncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZldpbGRjYXJkU3VwZXJTdHJpbmcuaXNBc3NpZ25hYmxlQnkobGlzdE9mV2lsZGNhcmRFeHRlbmRzU3RyaW5nKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNBc3NpZ25hYmxlQnlHZW5lcmljc0luaGVyaXRhbmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29sbGVjdGlvbk9mU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGNvbGxlY3Rpb25PZlN0cmluZykpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29sbGVjdGlvbk9mU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbGxlY3Rpb25PZlN0cmluZy5pc0Fzc2lnbmFibGVCeShsaW5rZWRMaXN0T2ZTdHJpbmcpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3RPZlN0cmluZ3MuaXNBc3NpZ25hYmxlQnkoY29sbGVjdGlvbk9mU3RyaW5nKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsaXN0T2ZTdHJpbmdzLmlzQXNzaWduYWJsZUJ5KGxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3RPZlN0cmluZ3MuaXNBc3NpZ25hYmxlQnkobGlua2VkTGlzdE9mU3RyaW5nKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaW5rZWRMaXN0T2ZTdHJpbmcuaXNBc3NpZ25hYmxlQnkoY29sbGVjdGlvbk9mU3RyaW5nKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlua2VkTGlzdE9mU3RyaW5nLmlzQXNzaWduYWJsZUJ5KGxpc3RPZlN0cmluZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpbmtlZExpc3RPZlN0cmluZy5pc0Fzc2lnbmFibGVCeShsaW5rZWRMaXN0T2ZTdHJpbmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNDb25zaWRlcmluZ1R5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBhc3NlcnRUcnVlKGxpbmtlZExpc3RPZlN0cmluZy5nZXRBbGxBbmNlc3RvcnMoKS5jb250YWlucyhvYmplY3QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaW5rZWRMaXN0T2ZTdHJpbmcuZ2V0QWxsQW5jZXN0b3JzKCkuY29udGFpbnMobGlzdE9mU3RyaW5ncykpOworICAgICAgICBhc3NlcnRUcnVlKGxpbmtlZExpc3RPZlN0cmluZy5nZXRBbGxBbmNlc3RvcnMoKS5jb250YWlucyhjb2xsZWN0aW9uT2ZTdHJpbmcpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlua2VkTGlzdE9mU3RyaW5nLmdldEFsbEFuY2VzdG9ycygpLmNvbnRhaW5zKGxpc3RPZkEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNDb25zaWRlcmluZ0dlbmVyaWNzQ2FzZXMoKSB7CisgICAgICAgIFJlZmVyZW5jZVR5cGVVc2FnZSBmb28gPSBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihGb28uY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgUmVmZXJlbmNlVHlwZVVzYWdlIGJhciA9IG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJhci5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworICAgICAgICBSZWZlcmVuY2VUeXBlVXNhZ2UgbGVmdCwgcmlnaHQ7CisKKyAgICAgICAgLy9ZRVMgTW9yZUJhenppbmc8Rm9vLCBCYXI+IGUxID0gbmV3IE1vcmVCYXp6aW5nPEZvbywgQmFyPigpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwKKyAgICAgICAgICAgICAgICBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihmb28sIGJhciksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworCisgICAgICAgIC8vWUVTIE1vcmVCYXp6aW5nPD8gZXh0ZW5kcyBGb28sIEJhcj4gZTIgPSBuZXcgTW9yZUJhenppbmc8Rm9vLCBCYXI+KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihXaWxkY2FyZFVzYWdlLmV4dGVuZHNCb3VuZChmb28pLCBiYXIpLCB0eXBlU29sdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihNb3JlQmF6emluZy5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoZm9vLCBiYXIpLCB0eXBlU29sdmVyKSkKKyAgICAgICAgKTsKKworICAgICAgICAvL1lFUyBNb3JlQmF6emluZzxGb28sID8gZXh0ZW5kcyBCYXI+IGUzID0gbmV3IE1vcmVCYXp6aW5nPEZvbywgQmFyPigpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwKKyAgICAgICAgICAgICAgICBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoZm9vLCBXaWxkY2FyZFVzYWdlLmV4dGVuZHNCb3VuZChiYXIpKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgTW9yZUJhenppbmc8PyBleHRlbmRzIEZvbywgPyBleHRlbmRzIEZvbz4gZTQgPSBuZXcgTW9yZUJhenppbmc8Rm9vLCBCYXI+KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihXaWxkY2FyZFVzYWdlLmV4dGVuZHNCb3VuZChmb28pLCBXaWxkY2FyZFVzYWdlLmV4dGVuZHNCb3VuZChmb28pKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgTW9yZUJhenppbmc8PyBleHRlbmRzIEZvbywgPyBleHRlbmRzIEZvbz4gZTUgPSBuZXcgTW9yZUJhenppbmc8QmFyLCBCYXI+KCk7CisgICAgICAgIGxlZnQgPSBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihNb3JlQmF6emluZy5jbGFzcywgdHlwZVNvbHZlciksCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihXaWxkY2FyZFVzYWdlLmV4dGVuZHNCb3VuZChmb28pLCBXaWxkY2FyZFVzYWdlLmV4dGVuZHNCb3VuZChmb28pKSwgdHlwZVNvbHZlcik7CisgICAgICAgIHJpZ2h0ID0gbmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoYmFyLCBiYXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxlZnQuaXNBc3NpZ25hYmxlQnkocmlnaHQpKTsKKworICAgICAgICAvL1lFUyBCYXp6ZXI8T2JqZWN0LCBTdHJpbmcsIFN0cmluZz4gZTYgPSBuZXcgTW9yZUJhenppbmc8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIGxlZnQgPSBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2Yob2JqZWN0LCBzdHJpbmcsIHN0cmluZyksIHR5cGVTb2x2ZXIpOworICAgICAgICByaWdodCA9IG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UoCisgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKHN0cmluZywgb2JqZWN0KSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBsZWZ0LmlzQXNzaWduYWJsZUJ5KHJpZ2h0KSk7CisKKyAgICAgICAgLy9ZRVMgQmF6emVyPFN0cmluZyxTdHJpbmcsU3RyaW5nPiBlNyA9IG5ldyBNb3JlQmF6emluZzxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmcsIHN0cmluZywgc3RyaW5nKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKHN0cmluZywgc3RyaW5nKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgQmF6emVyPEJhcixTdHJpbmcsRm9vPiBlOCA9IG5ldyBNb3JlQmF6emluZzxGb28sIEJhcj4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIHN0cmluZywgZm9vKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGZvbywgYmFyKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9ZRVMgQmF6emVyPEZvbyxTdHJpbmcsQmFyPiBlOSA9IG5ldyBNb3JlQmF6emluZzxCYXIsIEZvbz4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihmb28sIHN0cmluZywgYmFyKSwgdHlwZVNvbHZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oTW9yZUJhenppbmcuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKGJhciwgZm9vKSwgdHlwZVNvbHZlcikpCisgICAgICAgICk7CisKKyAgICAgICAgLy9OTyBCYXp6ZXI8QmFyLFN0cmluZyxGb28+IG4xID0gbmV3IE1vcmVCYXp6aW5nPEJhciwgRm9vPigpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsCisgICAgICAgICAgICAgICAgbmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXp6ZXIuY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsc3RyaW5nLGZvbyksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIGZvbyksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworCisgICAgICAgIC8vTk8gQmF6emVyPEJhcixTdHJpbmcsQmFyPiBuMiA9IG5ldyBNb3JlQmF6emluZzxCYXIsIEZvbz4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQmF6emVyLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoYmFyLCBzdHJpbmcsIGZvbyksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIGZvbyksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworCisgICAgICAgIC8vTk8gQmF6emVyPEZvbyxPYmplY3QsQmFyPiBuMyA9IG5ldyBNb3JlQmF6emluZzxCYXIsIEZvbz4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQmF6emVyLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoZm9vLCBvYmplY3QsIGJhciksIHR5cGVTb2x2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE1vcmVCYXp6aW5nLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihiYXIsIGZvbyksIHR5cGVTb2x2ZXIpKQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hhclNlcXVlbmNlSXNBc3NpZ25hYmxlVG9PYmplY3QoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBKcmVUeXBlU29sdmVyKCk7CisgICAgICAgIFJlZmVyZW5jZVR5cGVVc2FnZSBjaGFyU2VxdWVuY2UgPSBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ2hhclNlcXVlbmNlLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisgICAgICAgIFJlZmVyZW5jZVR5cGVVc2FnZSBvYmplY3QgPSBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjaGFyU2VxdWVuY2UuaXNBc3NpZ25hYmxlQnkob2JqZWN0KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBvYmplY3QuaXNBc3NpZ25hYmxlQnkoY2hhclNlcXVlbmNlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRUeXBlRXhpc3RpbmcoKSB7CisgICAgICAgIGNsYXNzIEZvbzxBPiB7CisgICAgICAgICAgICBMaXN0PEE+IGVsZW1lbnRzOworICAgICAgICB9CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IEpyZVR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVmZXJlbmNlVHlwZVVzYWdlIHJlZiA9IG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEZvby5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuZ2V0RmllbGRUeXBlKCJlbGVtZW50cyIpLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1R5cGVQYXJhbWV0ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICByZWYgPSBuZXcgUmVmZXJlbmNlVHlwZVVzYWdlKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihGb28uY2xhc3MsIHR5cGVTb2x2ZXIpLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YobmV3IFJlZmVyZW5jZVR5cGVVc2FnZShuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpLAorICAgICAgICAgICAgICAgIHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuZ2V0RmllbGRUeXBlKCJlbGVtZW50cyIpLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZi5nZXRGaWVsZFR5cGUoImVsZW1lbnRzIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmdldEZpZWxkVHlwZSgiZWxlbWVudHMiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCByZWYuZ2V0RmllbGRUeXBlKCJlbGVtZW50cyIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRUeXBlVW5leGlzdGluZygpIHsKKyAgICAgICAgY2xhc3MgRm9vPEE+IHsKKyAgICAgICAgICAgIExpc3Q8QT4gZWxlbWVudHM7CisgICAgICAgIH0KKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgSnJlVHlwZVNvbHZlcigpOworICAgICAgICBSZWZlcmVuY2VUeXBlVXNhZ2UgcmVmID0gbmV3IFJlZmVyZW5jZVR5cGVVc2FnZShuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWYuZ2V0RmllbGRUeXBlKCJiYXIiKS5pc1ByZXNlbnQoKSk7CisKKyAgICAgICAgcmVmID0gbmV3IFJlZmVyZW5jZVR5cGVVc2FnZShuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlU29sdmVyKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBSZWZlcmVuY2VUeXBlVXNhZ2UobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpKSwKKyAgICAgICAgICAgICAgICB0eXBlU29sdmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlZi5nZXRGaWVsZFR5cGUoImJhciIpLmlzUHJlc2VudCgpKTsKKyAgICB9Ki8KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlMGUyMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworICAgIAorICAgIHByaXZhdGUgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoZmFsc2UpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDbGFzcygpIHsKKyAgICAgICAgY2xhc3MgRm9vPEU+IHsKKyAgICAgICAgICAgIEUgZmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgRm9vPFN0cmluZz4geworICAgICAgICB9CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gZm9vID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEZvby5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGJhciA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXIuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZvby5pc0NsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYmFyLmlzQ2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1NpbXBsZUltcGxpY2l0KCkgeworICAgICAgICBjbGFzcyBGb288RT4geworICAgICAgICAgICAgRSBmaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVJlc29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGZvbyA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihGb28uY2xhc3MsIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIGZvby5nZXRTdXBlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBmb28uZ2V0U3VwZXJDbGFzcygpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3NTaW1wbGUoKSB7CisgICAgICAgIGNsYXNzIEJhciB7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MgRm9vPEU+IGV4dGVuZHMgQmFyIHsKKyAgICAgICAgICAgIEUgZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBmb28gPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQmFyIiwgZm9vLmdldFN1cGVyQ2xhc3MoKS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIGZvby5nZXRTdXBlckNsYXNzKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1dpdGhHZW5lcmljU2ltcGxlKCkgeworICAgICAgICBjbGFzcyBGb288RT4geworICAgICAgICAgICAgRSBmaWVsZDsKKyAgICAgICAgfQorICAgICAgICBjbGFzcyBCYXIgZXh0ZW5kcyBGb288U3RyaW5nPiB7CisgICAgICAgIH0KKworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBmb28gPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYmFyID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJhci5jbGFzcywgdHlwZVJlc29sdmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbyIsIGJhci5nZXRTdXBlckNsYXNzKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJhci5nZXRTdXBlckNsYXNzKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgYmFyLmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3NXaXRoR2VuZXJpY0luaGVyaXRhbmNlU2FtZU5hbWUoKSB7CisgICAgICAgIGNsYXNzIEZvbzxFPiB7CisgICAgICAgICAgICBFIGZpZWxkOworICAgICAgICB9CisgICAgICAgIGNsYXNzIEJhcjxFPiBleHRlbmRzIEZvbzxFPiB7CisgICAgICAgIH0KKworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBmb28gPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oRm9vLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYmFyID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEJhci5jbGFzcywgdHlwZVJlc29sdmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbyIsIGJhci5nZXRTdXBlckNsYXNzKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJhci5nZXRTdXBlckNsYXNzKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYmFyLmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFIiwgYmFyLmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYmFyLmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1R5cGVQYXJhbWV0ZXIoKS5kZWNsYXJlZE9uVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBiYXIuZ2V0U3VwZXJDbGFzcygpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmFzVHlwZVBhcmFtZXRlcigpLmRlY2xhcmVkT25NZXRob2QoKSk7CisgICAgICAgIGFzc2VydFRydWUoYmFyLmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRRdWFsaWZpZWROYW1lKCkuZW5kc1dpdGgoIkJhci5FIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3NXaXRoR2VuZXJpY0luaGVyaXRhbmNlRGlmZmVyZW50TmFtZSgpIHsKKyAgICAgICAgY2xhc3MgRm9vPEU+IHsKKyAgICAgICAgICAgIEUgZmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MgQmFyIGV4dGVuZHMgRm9vPFN0cmluZz4geworICAgICAgICB9CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gZm9vID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEZvby5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGJhciA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXIuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZvby5pc0NsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYmFyLmlzQ2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGREZWNsYXJhdGlvblR5cGVWYXJpYWJsZUluaGVyaXRhbmNlKCkgeworICAgICAgICBjbGFzcyBGb288RT4geworICAgICAgICAgICAgRSBmaWVsZDsKKyAgICAgICAgfQorICAgICAgICBjbGFzcyBCYXIgZXh0ZW5kcyBGb288U3RyaW5nPiB7CisgICAgICAgIH0KKworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGZvbyA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihGb28uY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIGJhciA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihCYXIuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgUmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uIGZvb0ZpZWxkID0gZm9vLmdldEZpZWxkKCJmaWVsZCIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZm9vRmllbGQuZ2V0VHlwZSgpLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkUiLCBmb29GaWVsZC5nZXRUeXBlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBSZXNvbHZlZEZpZWxkRGVjbGFyYXRpb24gYmFyRmllbGQgPSBiYXIuZ2V0RmllbGQoImZpZWxkIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBiYXJGaWVsZC5nZXRUeXBlKCkuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgYmFyRmllbGQuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVjbGFyZWRNZXRob2RzKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBzdHJpbmcgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBMaXN0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBzdHJpbmcuZ2V0RGVjbGFyZWRNZXRob2RzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbS5hY2Nlc3NTcGVjaWZpZXIoKSAhPSBBY2Nlc3NTcGVjaWZpZXIuUFJJVkFURSAmJiBtLmFjY2Vzc1NwZWNpZmllcigpICE9IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoKGEsIGIpIC0+IGEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhiLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGlmIChpc0phdmE5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg2OSwgbWV0aG9kcy5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDY3LCBtZXRob2RzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFyQXQiLCBtZXRob2RzLmdldCgwKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1ldGhvZHMuZ2V0KDApLmlzQWJzdHJhY3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RzLmdldCgwKS5nZXROdW1iZXJPZlBhcmFtcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBtZXRob2RzLmdldCgwKS5nZXRQYXJhbSgwKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgICAgIGlmIChpc0phdmE5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29tcGFyZVRvIiwgbWV0aG9kcy5nZXQoNikuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbWV0aG9kcy5nZXQoNikuaXNBYnN0cmFjdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RzLmdldCg2KS5nZXROdW1iZXJPZlBhcmFtcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG1ldGhvZHMuZ2V0KDYpLmdldFBhcmFtKDApLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29uY2F0IiwgbWV0aG9kcy5nZXQoNikuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbWV0aG9kcy5nZXQoNikuaXNBYnN0cmFjdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RzLmdldCg2KS5nZXROdW1iZXJPZlBhcmFtcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG1ldGhvZHMuZ2V0KDYpLmdldFBhcmFtKDApLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludGVyZmFjZXMoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVJlc29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBhcnJheWxpc3QgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQXJyYXlMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICAvLyBTZXJpYWxpemFibGUsIENsb25lYWJsZSwgTGlzdDxFPiwgUmFuZG9tQWNjZXNzCisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoU2VyaWFsaXphYmxlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICBDbG9uZWFibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgIExpc3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzcy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLAorICAgICAgICAgICAgICAgIGFycmF5bGlzdC5nZXRJbnRlcmZhY2VzKCkuc3RyZWFtKCkubWFwKGkgLT4gaS5nZXRRdWFsaWZpZWROYW1lKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsSW50ZXJmYWNlcygpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFycmF5bGlzdCA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBcnJheUxpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIC8vIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBJdGVyYWJsZTxFPiwgQ29sbGVjdGlvbjxFPiwgTGlzdDxFPiwgUmFuZG9tQWNjZXNzCisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoU2VyaWFsaXphYmxlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICBDbG9uZWFibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgIExpc3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzcy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCisgICAgICAgICAgICAgICAgSXRlcmFibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwKKyAgICAgICAgICAgICAgICBhcnJheWxpc3QuZ2V0QWxsSW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3NlcygpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFycmF5bGlzdCA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBcnJheUxpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLAorICAgICAgICAgICAgICAgIEFic3RyYWN0TGlzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLAorICAgICAgICAgICAgICAgIGFycmF5bGlzdC5nZXRBbGxTdXBlckNsYXNzZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIHN0cmluZyA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihTdHJpbmcuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksCisgICAgICAgICAgICAgICAgc3RyaW5nLmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYXJyYXlsaXN0ID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEFycmF5TGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwiLCBhcnJheWxpc3QuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBzdHJpbmcgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZyIsIHN0cmluZy5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc05hbWUoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVJlc29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBhcnJheWxpc3QgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQXJyYXlMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFycmF5TGlzdCIsIGFycmF5bGlzdC5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBzdHJpbmcgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oU3RyaW5nLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN0cmluZyIsIHN0cmluZy5nZXRDbGFzc05hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGFycmF5bGlzdCA9IG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihBcnJheUxpc3QuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkFycmF5TGlzdCIsIGFycmF5bGlzdC5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gc3RyaW5nID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgc3RyaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgLy8gc29sdmVNZXRob2QKKyAgICAvLyBpc0Fzc2lnbmFibGVCeQorICAgIC8vIGNhbkJlQXNzaWduZWRUbworICAgIC8vIGhhc0ZpZWxkCisgICAgLy8gc29sdmVTeW1ib2wKKyAgICAvLyBzb2x2ZVR5cGUKKyAgICAvLyBnZXREZWNsYXJlZE1ldGhvZHMKKyAgICAvLyBnZXRBbGxNZXRob2RzCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxGaWVsZHMoKSB7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVJlc29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBhcnJheWxpc3QgPSBuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oQXJyYXlMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJtb2RDb3VudCIsICJzZXJpYWxWZXJzaW9uVUlEIiwgIk1BWF9BUlJBWV9TSVpFIiwgInNpemUiLCAiZWxlbWVudERhdGEiLCAiRU1QVFlfRUxFTUVOVERBVEEiLCAiREVGQVVMVENBUEFDSVRZX0VNUFRZX0VMRU1FTlREQVRBIiwgIkRFRkFVTFRfQ0FQQUNJVFkiKSwKKyAgICAgICAgICAgICAgICBhcnJheWxpc3QuZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkubWFwKFJlc29sdmVkRGVjbGFyYXRpb246OmdldE5hbWUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgLy8vCisgICAgLy8vIFRlc3QgYW5jZXN0b3JzCisgICAgLy8vICAgIAorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsQW5jZXN0b3JzKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gYXJyYXlsaXN0ID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEFycmF5TGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgTWFwPFN0cmluZywgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbmNlc3RvcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGFycmF5bGlzdC5nZXRBbGxBbmNlc3RvcnMoKS5mb3JFYWNoKGEgLT4gYW5jZXN0b3JzLnB1dChhLmdldFF1YWxpZmllZE5hbWUoKSwgYSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgYW5jZXN0b3JzLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlID0gbmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKGFycmF5bGlzdC5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihSYW5kb21BY2Nlc3MuY2xhc3MsIHR5cGVSZXNvbHZlciksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEudXRpbC5SYW5kb21BY2Nlc3MiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0eXBlVmFyaWFibGUpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0eXBlVmFyaWFibGUpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuTGlzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKENsb25lYWJsZS5jbGFzcywgdHlwZVJlc29sdmVyKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5sYW5nLkNsb25lYWJsZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKENvbGxlY3Rpb24uY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2YodHlwZVZhcmlhYmxlKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS51dGlsLkNvbGxlY3Rpb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKEFic3RyYWN0TGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0eXBlVmFyaWFibGUpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuQWJzdHJhY3RMaXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVSZXNvbHZlciksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEubGFuZy5PYmplY3QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihJdGVyYWJsZS5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0eXBlVmFyaWFibGUpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLmxhbmcuSXRlcmFibGUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MsIHR5cGVSZXNvbHZlciksIHR5cGVSZXNvbHZlciksIGFuY2VzdG9ycy5nZXQoImphdmEuaW8uU2VyaWFsaXphYmxlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1cGVyY2xhc3NXaXRob3V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVJlc29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBjb21waWxhdGlvblVuaXQuZ2V0U3VwZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0ID0gKFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKSB0eXBlUmVzb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgY29tcGlsYXRpb25Vbml0LmdldFN1cGVyQ2xhc3MoKS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3Nlc1dpdGhvdXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24gY3UgPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsICJqYXZhLmxhbmcuT2JqZWN0IiksIGN1LmdldEFsbFN1cGVyQ2xhc3NlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVyY2xhc3Nlc1dpdGhUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVJlc29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkuYW55TWF0Y2gocyAtPiBzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkuYW55TWF0Y2gocyAtPiBzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24iKSkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChzIC0+IHMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuc3RyZWFtKCkuYW55TWF0Y2gocyAtPiBzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBhbmNlc3RvcjsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsU3VwZXJDbGFzc2VzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbFN1cGVyQ2xhc3NlcygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlcmZhY2VzV2l0aG91dFBhcmFtZXRlcnMoKSB7CisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdCA9IChSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVJlc29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigpLCBjb21waWxhdGlvblVuaXQuZ2V0SW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworCisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvaWQgPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0Lm9mKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4dGVuZHMiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhGaW5hbE1vZGlmaWVyIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhDb25zdHJ1Y3RvcnMiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEltcGxlbWVudHMiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlJlc29sdmFibGUiKSwKKyAgICAgICAgICAgICAgICBjb2lkLmdldEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAodCAtPiB0LmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5zaXplKCkpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBpbnRlcmZhemU7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdC5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoQWNjZXNzTW9kaWZpZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhZG9jLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU2ltcGxlTmFtZS5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEludGVyZmFjZXMoKS5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3duRXhjZXB0aW9ucyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpLmdldCg3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsSW50ZXJmYWNlc1dpdGhvdXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXQgPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImphdmEubGFuZy5DbG9uZWFibGUiLCAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGUiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuSGFzUGFyZW50Tm9kZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFJhbmdlIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUb2tlblJhbmdlIikuc3RyZWFtKCkuc29ydGVkKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwKKyAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuZ2V0QWxsSW50ZXJmYWNlcygpLnN0cmVhbSgpLm1hcChpIC0+IGkuZ2V0UXVhbGlmaWVkTmFtZSgpKS5zb3J0ZWQoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKworICAgICAgICBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbiBjb2lkID0gKFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKSB0eXBlUmVzb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQub2YoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRXh0ZW5kcyIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMiLAorICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuQ2xvbmVhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkhhc1BhcmVudE5vZGUiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJbXBsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2MiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoRmluYWxNb2RpZmllciIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFByb3RlY3RlZE1vZGlmaWVyIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHJpdmF0ZU1vZGlmaWVyIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RhdGljTW9kaWZpZXIiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHVibGljTW9kaWZpZXIiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnMiLAorICAgICAgICAgICAgICAgICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhTdHJpY3RmcE1vZGlmaWVyIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhSYW5nZSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVG9rZW5SYW5nZSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQ29uc3RydWN0b3JzIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uUmVzb2x2YWJsZSIpLCBjb2lkLmdldEFsbEludGVyZmFjZXMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxJbnRlcmZhY2VzV2l0aFBhcmFtZXRlcnMoKSB7CisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBpbnRlcmZhY2VzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzNCwgaW50ZXJmYWNlcy5zaXplKCkpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBpbnRlcmZhemU7CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJsb2NrU3RtdCIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoQWNjZXNzTW9kaWZpZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHVibGljTW9kaWZpZXIiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFB1YmxpY01vZGlmaWVyLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhQcml2YXRlTW9kaWZpZXIiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFByaXZhdGVNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhQcm90ZWN0ZWRNb2RpZmllciIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHJvdGVjdGVkTW9kaWZpZXIuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhZG9jIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2MuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93bkV4Y2VwdGlvbnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsb25lYWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkhhc1BhcmVudE5vZGUuVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUmFuZ2UiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFJhbmdlLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVG9rZW5SYW5nZSIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVG9rZW5SYW5nZS5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoQWNjZXNzTW9kaWZpZXJzLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFB1YmxpY01vZGlmaWVyIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhQdWJsaWNNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHJpdmF0ZU1vZGlmaWVyIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhQcml2YXRlTW9kaWZpZXIuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHJvdGVjdGVkTW9kaWZpZXIiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFByb3RlY3RlZE1vZGlmaWVyLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU2ltcGxlTmFtZS5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93bkV4Y2VwdGlvbnMiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3duRXhjZXB0aW9ucy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBpbnRlcmZhemUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKS5nZXQoaSsrKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzIiwgaW50ZXJmYXplLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBpbnRlcmZhemUudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYyIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhZG9jLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFic3RyYWN0TW9kaWZpZXIiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFic3RyYWN0TW9kaWZpZXIuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RhdGljTW9kaWZpZXIiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFN0YXRpY01vZGlmaWVyLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGludGVyZmF6ZSA9IGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlcygpLmdldChpKyspOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXIiLCBpbnRlcmZhemUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGludGVyZmF6ZS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXIuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgaW50ZXJmYXplID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxJbnRlcmZhY2VzKCkuZ2V0KGkrKyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RyaWN0ZnBNb2RpZmllciIsIGludGVyZmF6ZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgaW50ZXJmYXplLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RyaWN0ZnBNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmNlc3RvcnNXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yOworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKTsKKyAgICAgICAgYW5jZXN0b3JzLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmcoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOjpnZXRRdWFsaWZpZWROYW1lKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uVCIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3duRXhjZXB0aW9ucyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3duRXhjZXB0aW9ucy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZVBhcmFtZXRlcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KDcpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoOCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uUmVzb2x2YWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsQW5jZXN0b3JzV2l0aG91dFR5cGVQYXJhbWV0ZXJzKCkgeworICAgICAgICBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbiBjdSA9IChSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVJlc29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5vZigiamF2YS5sYW5nLkNsb25lYWJsZSIsICJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlIiwgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsCisgICAgICAgICAgICAgICAgImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVG9rZW5SYW5nZSIsICJqYXZhLmxhbmcuT2JqZWN0IiwgImNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlIiwKKyAgICAgICAgICAgICAgICAiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhSYW5nZSIpLCBjdS5nZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5tYXAoaSAtPiBpLmdldFF1YWxpZmllZE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxBbmNlc3RvcnNXaXRoVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVSZXNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGFuY2VzdG9yOworICAgICAgICBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gYW5jZXN0b3JzID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKTsKKyAgICAgICAgYW5jZXN0b3JzLnNvcnQoQ29tcGFyYXRvci5jb21wYXJpbmcoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOjpnZXRRdWFsaWZpZWROYW1lKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlLlQiKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2FsbGFibGVEZWNsYXJhdGlvbi5UIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQmxvY2tTdG10IiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRGVjbGFyYXRpb24iLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2MiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFkb2MuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YWRvYy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUmFuZ2UiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhSYW5nZS5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFNpbXBsZU5hbWUuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3duRXhjZXB0aW9ucyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3duRXhjZXB0aW9ucy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd25FeGNlcHRpb25zLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRva2VuUmFuZ2UiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUb2tlblJhbmdlLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIsIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWVCeVNpZ25hdHVyZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZVBhcmFtZXRlcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFic3RyYWN0TW9kaWZpZXIiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBYnN0cmFjdE1vZGlmaWVyLk4iKS5nZXQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnMiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhBY2Nlc3NNb2RpZmllcnMuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycyIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEFjY2Vzc01vZGlmaWVycy5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoRmluYWxNb2RpZmllciIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aEZpbmFsTW9kaWZpZXIuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFByaXZhdGVNb2RpZmllciIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFByaXZhdGVNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHJvdGVjdGVkTW9kaWZpZXIiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhQcm90ZWN0ZWRNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoUHVibGljTW9kaWZpZXIiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhQdWJsaWNNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RhdGljTW9kaWZpZXIiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIiwgYW5jZXN0b3IudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhTdGF0aWNNb2RpZmllci5OIikuZ2V0KCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMubW9kaWZpZXJzLk5vZGVXaXRoU3RyaWN0ZnBNb2RpZmllciIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlQnlTaWduYXR1cmUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLm1vZGlmaWVycy5Ob2RlV2l0aFN0cmljdGZwTW9kaWZpZXIuTiIpLmdldCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGUiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3JzLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5SZXNvbHZhYmxlIiwgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKworICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9ycy5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsb25lYWJsZSIsIGFuY2VzdG9yLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhbmNlc3Rvci5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgICAgIGFzc2VydFRydWUoYW5jZXN0b3JzLmlzRW1wdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzc5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5BYnN0cmFjdFRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoZmFsc2UpOworCisgICAgLy8vCisgICAgLy8vIFRlc3QgbWlzYworICAgIC8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDbGFzcygpIHsKKyAgICAgICAgUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1vZGlmaWVyLmlzQ2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNJbnRlcmZhY2UoKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtb2RpZmllci5pc0ludGVyZmFjZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VudW0oKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1vZGlmaWVyLmlzRW51bSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGVWYXJpYWJsZSgpIHsKKyAgICAgICAgUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1vZGlmaWVyLmlzVHlwZVBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1R5cGUoKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1vZGlmaWVyLmlzVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1R5cGUoKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVyLCBtb2RpZmllci5hc1R5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNDbGFzcygpIHsKKyAgICAgICAgUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBtb2RpZmllci5hc0NsYXNzKCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNJbnRlcmZhY2UoKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgbW9kaWZpZXIuYXNJbnRlcmZhY2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0VudW0oKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVyLCBtb2RpZmllci5hc0VudW0oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24gbW9kaWZpZXIgPSAoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0IiwgbW9kaWZpZXIuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2xhc3NOYW1lKCkgeworICAgICAgICBSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uIG1vZGlmaWVyID0gKFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiTW9kaWZpZXIiLCBtb2RpZmllci5nZXRDbGFzc05hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVhbGlmaWVkTmFtZSgpIHsKKyAgICAgICAgUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbiBtb2RpZmllciA9IChSZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIiLCBtb2RpZmllci5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI2NjEwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZVZhcmlhYmxlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24gbGlzdCA9IG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTGlzdC5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gbGlzdC5nZXREZWNsYXJlZE1ldGhvZHMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoKGEsIGIpIC0+IGEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhiLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGlmIChpc0phdmE5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MCwgbWV0aG9kcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGVhciIsIG1ldGhvZHMuZ2V0KDQpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbWV0aG9kcy5nZXQoNCkuaXNBYnN0cmFjdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtZXRob2RzLmdldCg0KS5nZXROdW1iZXJPZlBhcmFtcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29udGFpbnMiLCBtZXRob2RzLmdldCg1KS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1ldGhvZHMuZ2V0KDUpLmlzQWJzdHJhY3QoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0aG9kcy5nZXQoNSkuZ2V0TnVtYmVyT2ZQYXJhbXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbWV0aG9kcy5nZXQoNSkuZ2V0UGFyYW0oMCkuZ2V0VHlwZSgpLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBtZXRob2RzLmdldCg1KS5nZXRQYXJhbSgwKS5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyOCwgbWV0aG9kcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGVhciIsIG1ldGhvZHMuZ2V0KDQpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbWV0aG9kcy5nZXQoNCkuaXNBYnN0cmFjdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtZXRob2RzLmdldCg0KS5nZXROdW1iZXJPZlBhcmFtcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29udGFpbnMiLCBtZXRob2RzLmdldCg1KS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1ldGhvZHMuZ2V0KDUpLmlzQWJzdHJhY3QoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0aG9kcy5nZXQoNSkuZ2V0TnVtYmVyT2ZQYXJhbXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbWV0aG9kcy5nZXQoNSkuZ2V0UGFyYW0oMCkuZ2V0VHlwZSgpLmlzUmVmZXJlbmNlVHlwZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBtZXRob2RzLmdldCg1KS5nZXRQYXJhbSgwKS5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbEFuY2VzdG9ycygpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiBsaXN0ID0gbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworICAgICAgICBNYXA8U3RyaW5nLCBSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGFuY2VzdG9ycyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbGlzdC5nZXRBbGxBbmNlc3RvcnMoKS5mb3JFYWNoKGEgLT4gYW5jZXN0b3JzLnB1dChhLmdldFF1YWxpZmllZE5hbWUoKSwgYSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgYW5jZXN0b3JzLnNpemUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlVmFyaWFibGUgdHlwZVZhcmlhYmxlID0gbmV3IFJlc29sdmVkVHlwZVZhcmlhYmxlKGxpc3QuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oQ29sbGVjdGlvbi5jbGFzcywgdHlwZVJlc29sdmVyKSwgSW1tdXRhYmxlTGlzdC5vZih0eXBlVmFyaWFibGUpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpLCB0eXBlUmVzb2x2ZXIpLCBhbmNlc3RvcnMuZ2V0KCJqYXZhLmxhbmcuT2JqZWN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oSXRlcmFibGUuY2xhc3MsIHR5cGVSZXNvbHZlciksIEltbXV0YWJsZUxpc3Qub2YodHlwZVZhcmlhYmxlKSwgdHlwZVJlc29sdmVyKSwgYW5jZXN0b3JzLmdldCgiamF2YS5sYW5nLkl0ZXJhYmxlIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTViZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZSgpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gb2JqZWN0ID0gbmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVJlc29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRJbnRlcmZhY2VEZWNsYXJhdGlvbiBsaXN0ID0gbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihMaXN0LmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gaGFzaENvZGUgPSBvYmplY3QuZ2V0QWxsTWV0aG9kcygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0uZ2V0TmFtZSgpLmVxdWFscygiaGFzaENvZGUiKSkuZmluZEZpcnN0KCkuZ2V0KCkuZ2V0RGVjbGFyYXRpb24oKTsKKyAgICAgICAgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBlcXVhbHMgPSBvYmplY3QuZ2V0QWxsTWV0aG9kcygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0uZ2V0TmFtZSgpLmVxdWFscygiZXF1YWxzIikpLmZpbmRGaXJzdCgpLmdldCgpLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gY29udGFpbnNBbGwgPSBsaXN0LmdldEFsbE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMoImNvbnRhaW5zQWxsIikpLmZpbmRGaXJzdCgpLmdldCgpLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gc3ViTGlzdCA9IGxpc3QuZ2V0QWxsTWV0aG9kcygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0uZ2V0TmFtZSgpLmVxdWFscygic3ViTGlzdCIpKS5maW5kRmlyc3QoKS5nZXQoKS5nZXREZWNsYXJhdGlvbigpOworCisgICAgICAgIGFzc2VydEVxdWFscygiaGFzaENvZGUoKSIsIGhhc2hDb2RlLmdldFNpZ25hdHVyZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkiLCBlcXVhbHMuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRhaW5zQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PikiLCBjb250YWluc0FsbC5nZXRTaWduYXR1cmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViTGlzdChpbnQsIGludCkiLCBzdWJMaXN0LmdldFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmljUmV0dXJuVHlwZSgpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlUmVzb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKworICAgICAgICBSZXNvbHZlZEludGVyZmFjZURlY2xhcmF0aW9uIG1hcCA9IG5ldyBSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24oTWFwLmNsYXNzLCB0eXBlUmVzb2x2ZXIpOworCisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gcHV0ID0gbWFwLmdldEFsbE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMoInB1dCIpKS5maW5kRmlyc3QoKS5nZXQoKS5nZXREZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcHV0LmdldFJldHVyblR5cGUoKS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHB1dC5nZXRSZXR1cm5UeXBlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZGVjbGFyZWRPblR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5WIiwgcHV0LmdldFJldHVyblR5cGUoKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEdlbmVyaWNQYXJhbWV0ZXJzKCkgeworICAgICAgICBUeXBlU29sdmVyIHR5cGVSZXNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIFJlc29sdmVkSW50ZXJmYWNlRGVjbGFyYXRpb24gbWFwID0gbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihNYXAuY2xhc3MsIHR5cGVSZXNvbHZlcik7CisKKyAgICAgICAgUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbiBwdXQgPSBtYXAuZ2V0QWxsTWV0aG9kcygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0uZ2V0TmFtZSgpLmVxdWFscygicHV0IikpLmZpbmRGaXJzdCgpLmdldCgpLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBwdXQuZ2V0UGFyYW0oMCkuZ2V0VHlwZSgpLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcHV0LmdldFBhcmFtKDApLmdldFR5cGUoKS5hc1R5cGVQYXJhbWV0ZXIoKS5kZWNsYXJlZE9uVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLksiLCBwdXQuZ2V0UGFyYW0oMCkuZ2V0VHlwZSgpLmFzVHlwZVBhcmFtZXRlcigpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHB1dC5nZXRQYXJhbSgxKS5nZXRUeXBlKCkuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBwdXQuZ2V0UGFyYW0oMSkuZ2V0VHlwZSgpLmFzVHlwZVBhcmFtZXRlcigpLmRlY2xhcmVkT25UeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAuViIsIHB1dC5nZXRQYXJhbSgxKS5nZXRUeXBlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BYnN0cmFjdFJlc29sdXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BYnN0cmFjdFJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkOTI2NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0Fic3RyYWN0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5BYnN0cmFjdFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IHBhcnNlU2FtcGxlV2l0aFN0YW5kYXJkRXh0ZW5zaW9uKFN0cmluZyBzYW1wbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBwYXJzZVNhbXBsZShzYW1wbGVOYW1lLCAiamF2YSIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgcGFyc2VTYW1wbGUoU3RyaW5nIHNhbXBsZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlU2FtcGxlKHNhbXBsZU5hbWUsICJqYXZhLnR4dCIpOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGlsYXRpb25Vbml0IHBhcnNlU2FtcGxlKFN0cmluZyBzYW1wbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShzYW1wbGVOYW1lICsgIi4iICsgZXh0ZW5zaW9uKTsKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCBzYW1wbGUgIiArIHNhbXBsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlKGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BbmFseXNlSmF2YVBhcnNlclRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0FuYWx5c2VKYXZhUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWY2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BbmFseXNlSmF2YVBhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5TbG93VGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLkFic3RyYWN0VGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLlNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwuY2F0ZWdvcmllcy5DYXRlZ29yeTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BDYXRlZ29yeShTbG93VGVzdC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbmFseXNlSmF2YVBhcnNlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBzcmMgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlIikpOworCisgICAgcHJpdmF0ZSBTb3VyY2VGaWxlSW5mb0V4dHJhY3RvciBnZXRTb3VyY2VGaWxlSW5mb0V4dHJhY3RvcigpIHsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyYykpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQiKSkpKTsKKyAgICAgICAgU291cmNlRmlsZUluZm9FeHRyYWN0b3Igc291cmNlRmlsZUluZm9FeHRyYWN0b3IgPSBuZXcgU291cmNlRmlsZUluZm9FeHRyYWN0b3IoKTsKKyAgICAgICAgc291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc2V0VHlwZVNvbHZlcihjb21iaW5lZFR5cGVTb2x2ZXIpOworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zZXRQcmludEZpbGVOYW1lKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcmVhZEZpbGUoRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBGaWxlcy5yZWFkQWxsQnl0ZXMoUGF0aHMuZ2V0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZW5jb2RlZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgZmlsZU5hbWUgKyAiLmphdmEiKTsKKyAgICAgICAgU291cmNlRmlsZUluZm9FeHRyYWN0b3Igc291cmNlRmlsZUluZm9FeHRyYWN0b3IgPSBnZXRTb3VyY2VGaWxlSW5mb0V4dHJhY3RvcigpOworICAgICAgICBPdXRwdXRTdHJlYW0gb3V0RXJyU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBQcmludFN0cmVhbSBvdXRFcnIgPSBuZXcgUHJpbnRTdHJlYW0ob3V0RXJyU3RyZWFtKTsKKworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zZXRPdXQob3V0RXJyKTsKKyAgICAgICAgc291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc2V0RXJyKG91dEVycik7CisgICAgICAgIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnNvbHZlKHNvdXJjZUZpbGUpOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gb3V0RXJyU3RyZWFtLnRvU3RyaW5nKCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSAic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0LyIgKyBmaWxlTmFtZS5yZXBsYWNlQWxsKCIvIiwgIl8iKSArICIudHh0IjsKKyAgICAgICAgRmlsZSBkc3RGaWxlID0gYWRhcHRQYXRoKG5ldyBGaWxlKHBhdGgpKTsKKworICAgICAgICBpZiAoREVCVUcgJiYgKHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmdldEtvKCkgIT0gMCB8fCBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5nZXRVbnN1cHBvcnRlZCgpICE9IDApKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoIk5vIGZhaWx1cmVzIGV4cGVjdGVkIHdoZW4gYW5hbHl6aW5nICIgKyBwYXRoLCAwID09IHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmdldEtvKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGFuYWx5emluZyAiICsgcGF0aCwgMCA9PSBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5nZXRVbnN1cHBvcnRlZCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSByZWFkRmlsZShkc3RGaWxlKTsKKworICAgICAgICBTdHJpbmdbXSBvdXRwdXRMaW5lcyA9IG91dHB1dC5zcGxpdCgiXG4iKTsKKyAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWRMaW5lcyA9IGV4cGVjdGVkLnNwbGl0KCJcbiIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4ob3V0cHV0TGluZXMubGVuZ3RoLCBleHBlY3RlZExpbmVzLmxlbmd0aCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaW5lICIgKyAoaSArIDEpICsgIiBvZiAiICsgcGF0aCArICIgaXMgZGlmZmVyZW50IGZyb20gd2hhdCBpcyBleHBlY3RlZCIsIGV4cGVjdGVkTGluZXNbaV0udHJpbSgpLCBvdXRwdXRMaW5lc1tpXS50cmltKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTGluZXMubGVuZ3RoLCBvdXRwdXRMaW5lcy5sZW5ndGgpOworCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUuY2xlYXJJbnN0YW5jZXMoKTsKKworICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZmlsZSB1bmNvbW1lbnQgdGhlc2UgbGluZXMKKyAgICAgICAgLy9QcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZHN0RmlsZS5nZXRBYnNvbHV0ZUZpbGUoKSwgIlVURi04Iik7CisgICAgICAgIC8vd3JpdGVyLnByaW50KG91dHB1dCk7CisgICAgICAgIC8vd3JpdGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZVBvc2l0aW9uVXRpbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9Qb3NpdGlvblV0aWxzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUphdmFQYXJzZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N0YXRlbWVudCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VDYXRjaENsYXVzZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NhdGNoQ2xhdXNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZVN0YXRlbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9MYWJlbGVkU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0JyZWFrU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1JldHVyblN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Eb1N0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQ29udGludWVTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQmxvY2tTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRXhwcmVzc2lvblN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FbXB0eVN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3dpdGNoRW50cnlTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3luY2hyb25pemVkU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvcmVhY2hTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1doaWxlU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1Rocm93U3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1RyeVN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UeXBlRGVjbGFyYXRpb25TdG10Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUV4cHJlc3Npb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9GaWVsZEFjY2Vzc0V4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DaGFyTGl0ZXJhbEV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ludGVnZXJMaXRlcmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5Q3JlYXRpb25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TdXBlckV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUluaXRpYWxpemVyRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0VuY2xvc2VkRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0V4cHJlc3Npb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UaGlzRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQW5ub3RhdGlvbkV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N0cmluZ0xpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTnVsbExpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvT2JqZWN0Q3JlYXRpb25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Eb3VibGVMaXRlcmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsTWluVmFsdWVFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWFya2VyQW5ub3RhdGlvbkV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MYW1iZGFFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvUXVhbGlmaWVkTmFtZUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZW1iZXJWYWx1ZVBhaXIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUFjY2Vzc0V4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DbGFzc0V4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NvbmRpdGlvbmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQm9vbGVhbkxpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQmluYXJ5RXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VUeXBlcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0NsYXNzT3JJbnRlcmZhY2VUeXBlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUHJpbWl0aXZlVHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1dpbGRjYXJkVHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1Vua25vd25UeXBlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1ZvaWRUeXBlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVHlwZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VWaXNpdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0VxdWFsc1Zpc2l0b3IiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Nb2RpZmllclZpc2l0b3JBZGFwdGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvRHVtcFZpc2l0b3IiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3JBZGFwdGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JBZGFwdGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNsb25lVmlzaXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0Nsb25lVmlzaXRvciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VTb3VyY2VzSGVscGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvU291cmNlc0hlbHBlciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9MaW5lQ29tbWVudCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnRzUGFyc2VyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0phdmFkb2NDb21tZW50Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0Jsb2NrQ29tbWVudCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlVGhlUmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9pbnRlcm5hbC9VdGlscyIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1EZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L1BhcmFtZXRlciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1Db25zdGFudERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVHlwZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01vZGlmaWVyU2V0Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9ySWQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9CYXNlUGFyYW1ldGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhYmxlTm9kZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25EZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01ldGhvZERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlUeXBlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Jbml0aWFsaXplckRlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQm9keURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRmllbGREZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9XaXRoRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NdWx0aVR5cGVQYXJhbWV0ZXIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvVHJlZVZpc2l0b3IiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFja2FnZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0RvY3VtZW50YWJsZU5vZGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvTmFtZWROb2RlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9UeXBlUGFyYW1ldGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0ltcG9ydERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvUG9zaXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9BU1RIZWxwZXIiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0FuYWx5c2VKYXZhU3ltYm9sU29sdmVyMDYwVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQW5hbHlzZUphdmFTeW1ib2xTb2x2ZXIwNjBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjZTEyYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0FuYWx5c2VKYXZhU3ltYm9sU29sdmVyMDYwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlNsb3dUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuU291cmNlRmlsZUluZm9FeHRyYWN0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwuY2F0ZWdvcmllcy5DYXRlZ29yeTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogV2UgYW5hbHl6ZSBKYXZhUGFyc2VyIHZlcnNpb24gMC42LjAuCisgKi8KK0BDYXRlZ29yeShTbG93VGVzdC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbmFseXNlSmF2YVN5bWJvbFNvbHZlcjA2MFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgcm9vdCA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAiKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBzcmMgPSBhZGFwdFBhdGgobmV3IEZpbGUocm9vdCArICIvc3JjIikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgbGliID0gYWRhcHRQYXRoKG5ldyBGaWxlKHJvb3QgKyAiL2xpYiIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIGV4cGVjdGVkT3V0cHV0ID0gYWRhcHRQYXRoKG5ldyBGaWxlKHJvb3QgKyAiL2V4cGVjdGVkX291dHB1dCIpKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yIGdldFNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yKCkgeworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgY29tYmluZWRUeXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcigpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIobmV3IEZpbGUoc3JjICsgIi9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIpKSk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKG5ldyBGaWxlKHNyYyArICIvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljIikpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIobmV3IEZpbGUoc3JjICsgIi9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiKSkpOworICAgICAgICB0cnkgeworCQkJY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmFyVHlwZVNvbHZlcihsaWIgKyAiL2d1YXZhLTIxLjAuamFyIikpOworCQkJY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmFyVHlwZVNvbHZlcihsaWIgKyAiL2phdmFwYXJzZXItY29yZS0zLjMuMC5qYXIiKSk7CisJCQljb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBKYXJUeXBlU29sdmVyKGxpYiArICIvamF2YXNsYW5nLTIuMC4zLmphciIpKTsKKwkJCWNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IEphclR5cGVTb2x2ZXIobGliICsgIi9qYXZhc3Npc3QtMy4xOS4wLUdBLmphciIpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJQXNzZXJ0LmZhaWwoIm9uZSBvciBtb3JlIGphciBkZXBlbmRlbmNpZXMgY291bGQgbm90IGJlIGZvdW5kLiIpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorICAgICAgICBTb3VyY2VGaWxlSW5mb0V4dHJhY3RvciBzb3VyY2VGaWxlSW5mb0V4dHJhY3RvciA9IG5ldyBTb3VyY2VGaWxlSW5mb0V4dHJhY3RvcigpOworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zZXRUeXBlU29sdmVyKGNvbWJpbmVkVHlwZVNvbHZlcik7CisgICAgICAgIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnNldFByaW50RmlsZU5hbWUoZmFsc2UpOworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zZXRWZXJib3NlKHRydWUpOworICAgICAgICByZXR1cm4gc291cmNlRmlsZUluZm9FeHRyYWN0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU291cmNlRmlsZUluZm9FeHRyYWN0b3Igc291cmNlRmlsZUluZm9FeHRyYWN0b3IgPSBnZXRTb3VyY2VGaWxlSW5mb0V4dHJhY3RvcigpOworCisgICAgc3RhdGljIFN0cmluZyByZWFkRmlsZShGaWxlIGZpbGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gZW5jb2RlZCA9IEZpbGVzLnJlYWRBbGxCeXRlcyhQYXRocy5nZXQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhlbmNvZGVkLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSBpcyBvbmUgb2YgImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImphdmEtc3ltYm9sLXNvbHZlci1sb2dpYyIsICJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiCisgICAgICogQHBhcmFtIGZpbGVOYW1lIGRlc2NyaWJlcyB0aGUgZmlsZSBiZWluZyBhbmFseXplZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgcHJvamVjdE5hbWUgKyAiLyIgKyBmaWxlTmFtZSArICIuamF2YSIpOworICAgICAgICBPdXRwdXRTdHJlYW0gb3V0RXJyU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBQcmludFN0cmVhbSBvdXRFcnIgPSBuZXcgUHJpbnRTdHJlYW0ob3V0RXJyU3RyZWFtKTsKKworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zZXRPdXQob3V0RXJyKTsKKyAgICAgICAgc291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc2V0RXJyKG91dEVycik7CisgICAgICAgIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnNvbHZlTWV0aG9kQ2FsbHMoc291cmNlRmlsZSk7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBvdXRFcnJTdHJlYW0udG9TdHJpbmcoKTsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IGFkYXB0UGF0aChleHBlY3RlZE91dHB1dCkuZ2V0UGF0aCgpICsgIi8iICsgcHJvamVjdE5hbWUgKyAiLyIgKyBmaWxlTmFtZS5yZXBsYWNlQWxsKCIvIiwgIl8iKSArICIudHh0IjsKKyAgICAgICAgRmlsZSBkc3RGaWxlID0gbmV3IEZpbGUocGF0aCk7CisKKyAgICAgICAgaWYgKGlzSmF2YTkoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGg5ID0gYWRhcHRQYXRoKGV4cGVjdGVkT3V0cHV0KS5nZXRQYXRoKCkgKyAiLyIgKyBwcm9qZWN0TmFtZSArICIvIiArIGZpbGVOYW1lLnJlcGxhY2VBbGwoIi8iLCAiXyIpICsgIl9KOS50eHQiOworICAgICAgICAgICAgRmlsZSBkc3RGaWxlOSA9IG5ldyBGaWxlKHBhdGg5KTsKKyAgICAgICAgICAgIGlmIChkc3RGaWxlOS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoOTsKKyAgICAgICAgICAgICAgICBkc3RGaWxlID0gZHN0RmlsZTk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoREVCVUcgJiYgKHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmdldEtvKCkgIT0gMCB8fCBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5nZXRVbnN1cHBvcnRlZCgpICE9IDApKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoIk5vIGZhaWx1cmVzIGV4cGVjdGVkIHdoZW4gYW5hbHl6aW5nICIgKyBwYXRoLCAwID09IHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmdldEtvKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGFuYWx5emluZyAiICsgcGF0aCwgMCA9PSBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5nZXRVbnN1cHBvcnRlZCgpKTsKKworICAgICAgICBpZiAoIWRzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmaWxlIHVuY29tbWVudCB0aGVzZSBsaW5lcworLy8gICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZHN0RmlsZS5nZXRBYnNvbHV0ZUZpbGUoKSwgIlVURi04Iik7CisvLyAgICAgICAgICAgIHdyaXRlci5wcmludChvdXRwdXQpOworLy8gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IHJlYWRGaWxlKGRzdEZpbGUpOworCisgICAgICAgIFN0cmluZ1tdIG91dHB1dExpbmVzID0gb3V0cHV0LnNwbGl0KCJcbiIpOworICAgICAgICBTdHJpbmdbXSBleHBlY3RlZExpbmVzID0gZXhwZWN0ZWQuc3BsaXQoIlxuIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbihvdXRwdXRMaW5lcy5sZW5ndGgsIGV4cGVjdGVkTGluZXMubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgIiArIChpICsgMSkgKyAiIG9mICIgKyBwYXRoICsgIiBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGlzIGV4cGVjdGVkIiwgZXhwZWN0ZWRMaW5lc1tpXS50cmltKCksIG91dHB1dExpbmVzW2ldLnRyaW0oKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaW5lcy5sZW5ndGgsIG91dHB1dExpbmVzLmxlbmd0aCk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZS5jbGVhckluc3RhbmNlcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VDb3JlU291cmNlRmlsZUluZm9FeHRyYWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvU291cmNlRmlsZUluZm9FeHRyYWN0b3IiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29yZUNvcmVSZXNvbHV0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2NvcmUvcmVzb2x1dGlvbi9Db250ZXh0Iik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2NvcmUvcmVzb2x1dGlvbi9Db250ZXh0SGVscGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVEZWNsYXJhdGlvbnNDb21tb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvZGVjbGFyYXRpb25zL2NvbW1vbi9NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVKYXZhcGFyc2VyTmF2aWdhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXIvTmF2aWdhdG9yIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVKYXZhcGFyc2VybW9kZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0RlZmF1bHRWaXNpdG9yQWRhcHRlciIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvSmF2YVBhcnNlckZhY2FkZSIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvSmF2YVBhcnNlckZhY3RvcnkiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL0xhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9UeXBlRXh0cmFjdG9yIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VDb3JlSmF2YXBhcnNlcm1vZGVsQ29udGV4dHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0Fic3RyYWN0SmF2YVBhcnNlckNvbnRleHQiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0Fic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dCIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkNvbnRleHQiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0NhdGNoQ2xhdXNlQ29udGV4dCIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dCIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQ29tcGlsYXRpb25Vbml0Q29udGV4dCIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvQ29uc3RydWN0b3JDb250ZXh0Iik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Db250ZXh0SGVscGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9FbnVtRGVjbGFyYXRpb25Db250ZXh0Iik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9GaWVsZEFjY2Vzc0NvbnRleHQiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0ZvcmVjaFN0YXRlbWVudENvbnRleHQiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0ZvclN0YXRlbWVudENvbnRleHQiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL0phdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9MYW1iZGFFeHByQ29udGV4dCIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvY29udGV4dHMvTWV0aG9kQ2FsbEV4cHJDb250ZXh0Iik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9NZXRob2RDb250ZXh0Iik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9TdGF0ZW1lbnRDb250ZXh0Iik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9jb250ZXh0cy9Td2l0Y2hFbnRyeUNvbnRleHQiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2NvbnRleHRzL1RyeVdpdGhSZXNvdXJjZUNvbnRleHQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29yZUphdmFwYXJzZXJtb2RlbERlY2xhcmF0aW9ucygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0RlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSGVscGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJUeXBlQWRhcHRlciIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJUeXBlUGFyYW1ldGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdGlvbnMvSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVKYXZhcGFyc2VybW9kZWxEZWNsYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvQWJzdHJhY3RTeW1ib2xEZWNsYXJhdG9yIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFwYXJzZXJtb2RlbC9kZWNsYXJhdG9ycy9GaWVsZFN5bWJvbERlY2xhcmF0b3IiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXBhcnNlcm1vZGVsL2RlY2xhcmF0b3JzL05vU3ltYm9sRGVjbGFyYXRvciIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvUGFyYW1ldGVyU3ltYm9sRGVjbGFyYXRvciIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhcGFyc2VybW9kZWwvZGVjbGFyYXRvcnMvVmFyaWFibGVTeW1ib2xEZWNsYXJhdG9yIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVKYXZhc3Npc3Rtb2RlbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdEZhY3RvcnkiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0RmllbGREZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9qYXZhc3Npc3Rtb2RlbC9KYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2phdmFzc2lzdG1vZGVsL0phdmFzc2lzdFR5cGVQYXJhbWV0ZXIiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvamF2YXNzaXN0bW9kZWwvSmF2YXNzaXN0VXRpbHMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29yZU1vZGVsVHlwZXN5c3RlbSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL0xhenlUeXBlIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vUmVmZXJlbmNlVHlwZUltcGwiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29yZVJlZmxlY3Rpb25tb2RlbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvTXlPYmplY3RQcm92aWRlciIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzQWRhcHRlciIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uRmFjdG9yeSIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvUmVmbGVjdGlvbk1ldGhvZERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9SZWZsZWN0aW9uUGFyYW1ldGVyRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVmbGVjdGlvbm1vZGVsL1JlZmxlY3Rpb25UeXBlUGFyYW1ldGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVSZWZsZWN0aW9ubW9kZWxDb21wYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWNvcmUiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZWZsZWN0aW9ubW9kZWwvY29tcGFyYXRvcnMvQ2xhc3NDb21wYXJhdG9yIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9jb21wYXJhdG9ycy9NZXRob2RDb21wYXJhdG9yIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3JlZmxlY3Rpb25tb2RlbC9jb21wYXJhdG9ycy9QYXJhbWV0ZXJDb21wYXJhdG9yIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVSZXNvbHV0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9NZXRob2RSZXNvbHV0aW9uTG9naWMiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9TeW1ib2xEZWNsYXJhdG9yIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3ltYm9sU29sdmVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUNvcmVSZXNvbHV0aW9uVHlwZXNvbHZlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9Db21iaW5lZFR5cGVTb2x2ZXIiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9KYXJUeXBlU29sdmVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvSmF2YVBhcnNlclR5cGVTb2x2ZXIiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1jb3JlIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9NZW1vcnlUeXBlU29sdmVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItY29yZSIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvUmVmbGVjdGlvblR5cGVTb2x2ZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlTG9naWMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKwkJcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1sb2dpYyIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0Fic3RyYWN0Q2xhc3NEZWNsYXJhdGlvbiIpOworCQlwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24iKTsKKwkJcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1sb2dpYyIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL0NvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbiIpOworCQlwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbG9naWMvRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljIik7CisJCXBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9JbmZlcmVuY2VDb250ZXh0Iik7CisJCXBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9sb2dpYy9JbmZlcmVuY2VWYXJpYWJsZVR5cGUiKTsKKwkJcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1sb2dpYyIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL2xvZ2ljL09iamVjdFByb3ZpZGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZU1vZGVsRGVjbGFyYXRpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvQWNjZXNzTGV2ZWwiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL2RlY2xhcmF0aW9ucy9Bbm5vdGF0aW9uRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL2RlY2xhcmF0aW9ucy9DbGFzc0RlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvZGVjbGFyYXRpb25zL0RlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvRW51bURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvRmllbGREZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvZGVjbGFyYXRpb25zL0hhc0FjY2Vzc0xldmVsIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvSW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL2RlY2xhcmF0aW9ucy9NZXRob2RBbWJpZ3VpdHlFeGNlcHRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL2RlY2xhcmF0aW9ucy9NZXRob2REZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvZGVjbGFyYXRpb25zL01ldGhvZExpa2VEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvZGVjbGFyYXRpb25zL1BhcmFtZXRlckRlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvVHlwZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvVHlwZVBhcmFtZXRyaXphYmxlIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9kZWNsYXJhdGlvbnMvVmFsdWVEZWNsYXJhdGlvbiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VNb2RlbE1ldGhvZHNNZXRob2RVc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvbWV0aG9kcy9NZXRob2RVc2FnZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VNb2RlbFJlc29sdXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3Jlc29sdXRpb24vU3ltYm9sUmVmZXJlbmNlIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC9yZXNvbHV0aW9uL1R5cGVTb2x2ZXIiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3Jlc29sdXRpb24vVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24iKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3Jlc29sdXRpb24vVmFsdWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlTW9kZWxUeXBlc3lzdGVtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL0FycmF5VHlwZSIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9MYW1iZGFDb25zdHJhaW50VHlwZSIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9OdWxsVHlwZSIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9QcmltaXRpdmVUeXBlIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1JlZmVyZW5jZVR5cGUiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vVHlwZSIpOworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9UeXBlVHJhbnNmb3JtZXIiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vVHlwZVZhcmlhYmxlIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1ZvaWRUeXBlIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL1dpbGRjYXJkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZU1vZGVsVHlwZXN5c3RlbVBhcmFtZXRyaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsIiwgImNvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvbW9kZWwvdHlwZXN5c3RlbS9wYXJhbWV0cml6YXRpb24vVHlwZVBhcmFtZXRlcnNNYXAiKTsKKyAgICAgICAgcGFyc2UoImphdmEtc3ltYm9sLXNvbHZlci1tb2RlbCIsICJjb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL21vZGVsL3R5cGVzeXN0ZW0vcGFyYW1ldHJpemF0aW9uL1R5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyIik7CisgICAgICAgIHBhcnNlKCJqYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwiLCAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9tb2RlbC90eXBlc3lzdGVtL3BhcmFtZXRyaXphdGlvbi9UeXBlUGFyYW1ldHJpemVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQW5hbHlzZU5ld0phdmFQYXJzZXJIZWxwZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQW5hbHlzZU5ld0phdmFQYXJzZXJIZWxwZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDYwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BbmFseXNlTmV3SmF2YVBhcnNlckhlbHBlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBXZSBhbmFsaXplIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBKYXZhUGFyc2VyLCBhZnRlciB0aGUgcHJvamVjdCBtb3ZlZCB0byBKYXZhIDguCisgKi8KK3B1YmxpYyBjbGFzcyBBbmFseXNlTmV3SmF2YVBhcnNlckhlbHBlcnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUiKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBUeXBlU29sdmVyIFRZUEVTT0xWRVIgPSB0eXBlU29sdmVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBUeXBlU29sdmVyIHR5cGVTb2x2ZXIoKSB7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihzcmMpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMiKSkpKTsKKyAgICAgICAgcmV0dXJuIGNvbWJpbmVkVHlwZVNvbHZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBwYXJzZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNyYy5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIGZpbGVOYW1lICsgIi5qYXZhIik7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlKHNvdXJjZUZpbGUpOworICAgIH0KKworLy8gICAgQFRlc3QKKy8vICAgIHB1YmxpYyB2b2lkIG8xVHlwZUlzQ29ycmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworLy8gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvUG9zaXRpb25VdGlscyIpOworLy8gICAgICAgIE5hbWVFeHByIG8xID0gTmF2aWdhdG9yLmZpbmRBbGxOb2Rlc09mR2l2ZW5DbGFzcyhjdSwgTmFtZUV4cHIuY2xhc3MpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5nZXROYW1lKCkhPW51bGwgJiYgaXQuZ2V0TmFtZSgpLmVxdWFscygibzEiKSkuZmluZEZpcnN0KCkuZ2V0KCk7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEphdmFQYXJzZXJGYWNhZGUuZ2V0KFRZUEVTT0xWRVIpLnNvbHZlKG8xKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkpOworLy8gICAgfQorLy8KKy8vICAgIEBUZXN0CisvLyAgICBwdWJsaWMgdm9pZCBvMlR5cGVJc0NvcnJlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKy8vICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Bvc2l0aW9uVXRpbHMiKTsKKy8vICAgICAgICBOYW1lRXhwciBvMiA9IE5hdmlnYXRvci5maW5kQWxsTm9kZXNPZkdpdmVuQ2xhc3MoY3UsIE5hbWVFeHByLmNsYXNzKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZ2V0TmFtZSgpIT1udWxsICYmIGl0LmdldE5hbWUoKS5lcXVhbHMoIm8yIikpLmZpbmRGaXJzdCgpLmdldCgpOworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihKYXZhUGFyc2VyRmFjYWRlLmdldChUWVBFU09MVkVSKS5zb2x2ZShvMikuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpKTsKKy8vICAgIH0KKy8vCisvLyAgICAvLyBUbyBjYWxjdWxhdGUgdGhlIHR5cGUgb2YgbzEgYW5kIG8yIEkgbmVlZCB0byBmaXJzdCBjYWxjdWxhdGUgdGhlIHR5cGUgb2YgdGhlIGxhbWJkYQorLy8gICAgQFRlc3QKKy8vICAgIHB1YmxpYyB2b2lkIGxhbWJkYVR5cGVJc0NvcnJlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKy8vICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Bvc2l0aW9uVXRpbHMiKTsKKy8vICAgICAgICBMYW1iZGFFeHByIGxhbWJkYSA9IE5hdmlnYXRvci5maW5kQWxsTm9kZXNPZkdpdmVuQ2xhc3MoY3UsIExhbWJkYUV4cHIuY2xhc3MpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5nZXRSYW5nZSgpLmJlZ2luLmxpbmUgPT0gNTApLmZpbmRGaXJzdCgpLmdldCgpOworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihKYXZhUGFyc2VyRmFjYWRlLmdldChUWVBFU09MVkVSKS5nZXRUeXBlKGxhbWJkYSkpOworLy8gICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub2Rlc1R5cGVJc0NvcnJlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Bvc2l0aW9uVXRpbHMiKTsKKyAgICAgICAgTmFtZUV4cHIgbm9kZXMgPSBjdS5maW5kQWxsKE5hbWVFeHByLmNsYXNzKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZ2V0TmFtZSgpICE9IG51bGwgJiYgaXQuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKCJub2RlcyIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChUWVBFU09MVkVSKS5zb2x2ZShub2RlcykuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PFQ+IiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUIiwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb24oamF2YS51dGlsLkxpc3Q8VD4pLlQiLCB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmFzVHlwZVBhcmFtZXRlcigpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmFzVHlwZVBhcmFtZXRlcigpLmdldEJvdW5kcygpLnNpemUoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kIGJvdW5kID0gdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRCb3VuZHMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBib3VuZC5pc0V4dGVuZHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlIiwgYm91bmQuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQW5hbHlzZU5ld0phdmFQYXJzZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BbmFseXNlTmV3SmF2YVBhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MwZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQW5hbHlzZU5ld0phdmFQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuU2xvd1Rlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5Tb3VyY2VGaWxlSW5mb0V4dHJhY3RvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLmNhdGVnb3JpZXMuQ2F0ZWdvcnk7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFdlIGFuYWx5emUgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIEphdmFQYXJzZXIsIGFmdGVyIHRoZSBwcm9qZWN0IG1vdmVkIHRvIEphdmEgOC4KKyAqLworQENhdGVnb3J5KFNsb3dUZXN0LmNsYXNzKQorcHVibGljIGNsYXNzIEFuYWx5c2VOZXdKYXZhUGFyc2VyVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBzcmMgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlIikpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU291cmNlRmlsZUluZm9FeHRyYWN0b3IgZ2V0U291cmNlRmlsZUluZm9FeHRyYWN0b3IoKSB7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciBjb21iaW5lZFR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihzcmMpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMiKSkpKTsKKyAgICAgICAgU291cmNlRmlsZUluZm9FeHRyYWN0b3Igc291cmNlRmlsZUluZm9FeHRyYWN0b3IgPSBuZXcgU291cmNlRmlsZUluZm9FeHRyYWN0b3IoKTsKKyAgICAgICAgc291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc2V0VHlwZVNvbHZlcihjb21iaW5lZFR5cGVTb2x2ZXIpOworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zZXRQcmludEZpbGVOYW1lKGZhbHNlKTsKKyAgICAgICAgc291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc2V0VmVyYm9zZSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yID0gZ2V0U291cmNlRmlsZUluZm9FeHRyYWN0b3IoKTsKKworICAgIHN0YXRpYyBTdHJpbmcgcmVhZEZpbGUoRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBGaWxlcy5yZWFkQWxsQnl0ZXMoUGF0aHMuZ2V0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZW5jb2RlZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgZmlsZU5hbWUgKyAiLmphdmEiKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG91dEVyclN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0RXJyID0gbmV3IFByaW50U3RyZWFtKG91dEVyclN0cmVhbSk7CisKKyAgICAgICAgc291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc2V0T3V0KG91dEVycik7CisgICAgICAgIHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnNldEVycihvdXRFcnIpOworICAgICAgICBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zb2x2ZU1ldGhvZENhbGxzKHNvdXJjZUZpbGUpOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gb3V0RXJyU3RyZWFtLnRvU3RyaW5nKCk7CisKKyAgICAgICAgRmlsZSBleHBlY3RlZE91dHB1dCA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBhZGFwdFBhdGgoZXhwZWN0ZWRPdXRwdXQpLmdldFBhdGgoKSArICIvIiArIGZpbGVOYW1lLnJlcGxhY2VBbGwoIi8iLCAiXyIpICsgIi50eHQiOworICAgICAgICBGaWxlIGRzdEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKworICAgICAgICBpZiAoaXNKYXZhOSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aDkgPSBhZGFwdFBhdGgoZXhwZWN0ZWRPdXRwdXQpLmdldFBhdGgoKSArICIvIiArIGZpbGVOYW1lLnJlcGxhY2VBbGwoIi8iLCAiXyIpICsgIl9KOS50eHQiOworICAgICAgICAgICAgRmlsZSBkc3RGaWxlOSA9IG5ldyBGaWxlKHBhdGg5KTsKKyAgICAgICAgICAgIGlmIChkc3RGaWxlOS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoOTsKKyAgICAgICAgICAgICAgICBkc3RGaWxlID0gZHN0RmlsZTk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoREVCVUcgJiYgKHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmdldEtvKCkgIT0gMCB8fCBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5nZXRVbnN1cHBvcnRlZCgpICE9IDApKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoIk5vIGZhaWx1cmVzIGV4cGVjdGVkIHdoZW4gYW5hbHl6aW5nICIgKyBwYXRoLCAwID09IHNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmdldEtvKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGFuYWx5emluZyAiICsgcGF0aCwgMCA9PSBzb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5nZXRVbnN1cHBvcnRlZCgpKTsKKworICAgICAgICBpZiAoIWRzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmaWxlIHVuY29tbWVudCB0aGVzZSBsaW5lcworICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGRzdEZpbGUuZ2V0QWJzb2x1dGVGaWxlKCksICJVVEYtOCIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG91dHB1dCk7CisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IHJlYWRGaWxlKGRzdEZpbGUpOworCisgICAgICAgIFN0cmluZ1tdIG91dHB1dExpbmVzID0gb3V0cHV0LnNwbGl0KCJcbiIpOworICAgICAgICBTdHJpbmdbXSBleHBlY3RlZExpbmVzID0gZXhwZWN0ZWQuc3BsaXQoIlxuIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbihvdXRwdXRMaW5lcy5sZW5ndGgsIGV4cGVjdGVkTGluZXMubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgIiArIChpICsgMSkgKyAiIG9mICIgKyBwYXRoICsgIiBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGlzIGV4cGVjdGVkIiwgZXhwZWN0ZWRMaW5lc1tpXS50cmltKCksIG91dHB1dExpbmVzW2ldLnRyaW0oKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaW5lcy5sZW5ndGgsIG91dHB1dExpbmVzLmxlbmd0aCk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZS5jbGVhckluc3RhbmNlcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VVdGlsc1V0aWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVXRpbHMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29tbWVudHNJbnNlcnRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0NvbW1lbnRzSW5zZXJ0ZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlUG9zaXRpb25VdGlscygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Bvc2l0aW9uVXRpbHMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlTW9kaWZpZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvTW9kaWZpZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlTm9kZVdpdGhNZW1iZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE1lbWJlcnMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQXN0U3RtdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQmxvY2tTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQnJlYWtTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQ2F0Y2hDbGF1c2UiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Db250aW51ZVN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Eb1N0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FbXB0eVN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHByZXNzaW9uU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvclN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Gb3JlYWNoU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0lmU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0xhYmVsZWRTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvUmV0dXJuU3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N0YXRlbWVudCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaEVudHJ5U3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaFN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9TeW5jaHJvbml6ZWRTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVGhyb3dTdG10Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHJ5U3RtdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1R5cGVEZWNsYXJhdGlvblN0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9XaGlsZVN0bXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQXN0RXhwcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Bbm5vdGF0aW9uRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5QWNjZXNzRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5Q3JlYXRpb25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlJbml0aWFsaXplckV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Bc3NpZ25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQmluYXJ5RXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Jvb2xlYW5MaXRlcmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2hhckxpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2xhc3NFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ29uZGl0aW9uYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRG91YmxlTGl0ZXJhbEV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9FbmNsb3NlZEV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9FeHByZXNzaW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRmllbGRBY2Nlc3NFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvSW5zdGFuY2VPZkV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbEV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xhbWJkYUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MaXRlcmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsTWluVmFsdWVFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWFya2VyQW5ub3RhdGlvbkV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZW1iZXJWYWx1ZVBhaXIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OYW1lRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTnVsbExpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvT2JqZWN0Q3JlYXRpb25FeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvUXVhbGlmaWVkTmFtZUV4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N0cmluZ0xpdGVyYWxFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3VwZXJFeHByIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVGhpc0V4cHIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UeXBlRXhwciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUFzdEJvZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Cb2R5RGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VtcHR5VHlwZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bUNvbnN0YW50RGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtRGVjbGFyYXRpb24iKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9GaWVsZERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01ldGhvZERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvUGFyYW1ldGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVHlwZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9ySWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQXN0Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQmxvY2tDb21tZW50Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQ29tbWVudHNDb2xsZWN0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0phdmFkb2NDb21tZW50Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0xpbmVDb21tZW50Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUFzdFJlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5QnJhY2tldFBhaXIiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQXJyYXlDcmVhdGlvbkxldmVsIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9FeGFtcGxlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0ltcG9ydERlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFja2FnZURlY2xhcmF0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1VzZXJEYXRhS2V5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUFzdE5vZGVUeXBlcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhBbm5vdGF0aW9ucyIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhCbG9ja1N0bXQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQm9keSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhEZWNsYXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFbGVtZW50VHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFeHRlbmRzIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEltcGxlbWVudHMiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoSmF2YURvYyIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNb2RpZmllcnMiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTmFtZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhQYXJhbWV0ZXJzIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFN0YXRlbWVudHMiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVGhyb3dhYmxlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZUFyZ3VtZW50cyIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhWYXJpYWJsZXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQXN0VHlwZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9BcnJheVR5cGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9DbGFzc09ySW50ZXJmYWNlVHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0ludGVyc2VjdGlvblR5cGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9QcmltaXRpdmVUeXBlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9UeXBlUGFyYW1ldGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5pb25UeXBlIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5rbm93blR5cGUiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Wb2lkVHlwZSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1dpbGRjYXJkVHlwZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VBc3RWaXNpdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvQ2xvbmVWaXNpdG9yIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvRXF1YWxzVmlzaXRvciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JBZGFwdGVyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yQWRhcHRlciIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1RyZWVWaXNpdG9yIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3IiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvckFkYXB0ZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlRHVtcFZpc2l0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9EdW1wVmlzaXRvciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VVdGlscygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL0NsYXNzVXRpbHMiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9QYWlyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUFsbE90aGVyTm9kZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VQcm9ibGVtRXhjZXB0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VSZXN1bHQiKTsKKyAgICAgICAgcGFyc2UoImNvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVN0YXJ0Iik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VyQ29uZmlndXJhdGlvbiIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Bvc2l0aW9uIik7CisgICAgICAgIHBhcnNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvYmxlbSIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb3ZpZGVycyIpOworICAgICAgICBwYXJzZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1JhbmdlIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BcnJheUV4cHJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9BcnJheUV4cHJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiOTczMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0FycmF5RXhwclRlc3QuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBTZWUgaXNzdWUgIzE3CisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheUV4cHJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmVyaWZ5QW5BcnJheUFjY2Vzc0V4cHJUeXBlSXNDYWxjdWxhdGVkUHJvcGVybHkoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBTdHJpbmdbXSBhcnJTUUw7IFN0cmluZyB0b0V4YW1pbmUgPSBhcnJTUUxbMV07IH0iOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJ0b0V4YW1pbmUiKS5nZXQoKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKGZpZWxkLmdldFZhcmlhYmxlcygpLmdldCgwKS5nZXRJbml0aWFsaXplcigpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vQ29udGV4dFRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0NvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjYzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0NvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitwdWJsaWMgY2xhc3MgQ29udGV4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBNZW1vcnlUeXBlU29sdmVyKCksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKworICAgIHByaXZhdGUgQ29tcGlsYXRpb25Vbml0IHBhcnNlU2FtcGxlKFN0cmluZyBzYW1wbGVOYW1lKSB7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gQ29udGV4dFRlc3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHNhbXBsZU5hbWUgKyAiLmphdmEudHh0Iik7CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlKGlzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVEZWNsYXJlZEZpZWxkUmVmZXJlbmNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiUmVmZXJlbmNlc1RvRmllbGQiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlJlZmVyZW5jZXNUb0ZpZWxkIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDEgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAibWV0aG9kMSIpOworICAgICAgICBFeHByZXNzaW9uU3RtdCBzdG10ID0gKEV4cHJlc3Npb25TdG10KSBtZXRob2QxLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOworICAgICAgICBBc3NpZ25FeHByIGFzc2lnbkV4cHIgPSAoQXNzaWduRXhwcikgc3RtdC5nZXRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcik7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZSBzeW1ib2xSZWZlcmVuY2UgPSBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2woImkiLCBhc3NpZ25FeHByLmdldFRhcmdldCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImkiLCBzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5pc0ZpZWxkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUluaGVyaXRlZEZpZWxkUmVmZXJlbmNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiUmVmZXJlbmNlc1RvRmllbGQiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlJlZmVyZW5jZXNUb0ZpZWxkRXh0ZW5kaW5nQ2xhc3MiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMSA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QocmVmZXJlbmNlc1RvRmllbGQsICJtZXRob2QyIik7CisgICAgICAgIEV4cHJlc3Npb25TdG10IHN0bXQgPSAoRXhwcmVzc2lvblN0bXQpIG1ldGhvZDEuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCk7CisgICAgICAgIEFzc2lnbkV4cHIgYXNzaWduRXhwciA9IChBc3NpZ25FeHByKSBzdG10LmdldEV4cHJlc3Npb24oKTsKKworICAgICAgICBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKTsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlIHN5bWJvbFJlZmVyZW5jZSA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbCgiaSIsIGFzc2lnbkV4cHIuZ2V0VGFyZ2V0KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaSIsIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmlzRmllbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlUGFyYW1ldGVyUmVmZXJlbmNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiUmVmZXJlbmNlc1RvUGFyYW1ldGVyIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gcmVmZXJlbmNlc1RvRmllbGQgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJSZWZlcmVuY2VUb1BhcmFtZXRlciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QxID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChyZWZlcmVuY2VzVG9GaWVsZCwgImFNZXRob2QiKTsKKyAgICAgICAgTmFtZUV4cHIgZm9vID0gTmF2aWdhdG9yLmZpbmROYW1lRXhwcmVzc2lvbihtZXRob2QxLCAiZm9vIikuZ2V0KCk7CisKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcik7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZSBzeW1ib2xSZWZlcmVuY2UgPSBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2woImZvbyIsIGZvbyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5pc1BhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VUb0ltcG9ydGVkVHlwZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHJlZmVyZW5jZXNUb0ZpZWxkID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTmF2aWdhdG9yIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QocmVmZXJlbmNlc1RvRmllbGQsICJmaW5kVHlwZSIpOworICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKTsKKworICAgICAgICBSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24gY29tcGlsYXRpb25Vbml0RGVjbCA9IG1vY2soUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgd2hlbihjb21waWxhdGlvblVuaXREZWNsLmdldE5hbWUoKSkudGhlblJldHVybigiQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIHdoZW4oY29tcGlsYXRpb25Vbml0RGVjbC5nZXRRdWFsaWZpZWROYW1lKCkpLnRoZW5SZXR1cm4oImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Iik7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG1vY2soVHlwZVNvbHZlci5jbGFzcyk7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci5nZXRSb290KCkpLnRoZW5SZXR1cm4odHlwZVNvbHZlcik7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci5zb2x2ZVR5cGUoImphdmEubGFuZy5PYmplY3QiKSkudGhlblJldHVybihuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSk7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKSkudGhlblJldHVybihTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGNvbXBpbGF0aW9uVW5pdERlY2wpKTsKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gc3ltYm9sU29sdmVyLnNvbHZlVHlwZSgiQ29tcGlsYXRpb25Vbml0IiwgcGFyYW0pOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29tcGlsYXRpb25Vbml0IiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VVc2luZ1F1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJOYXZpZ2F0b3IyIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gcmVmZXJlbmNlc1RvRmllbGQgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJOYXZpZ2F0b3IiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChyZWZlcmVuY2VzVG9GaWVsZCwgImZpbmRUeXBlIik7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApOworCisgICAgICAgIFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbiBjb21waWxhdGlvblVuaXREZWNsID0gbW9jayhSZXNvbHZlZENsYXNzRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICB3aGVuKGNvbXBpbGF0aW9uVW5pdERlY2wuZ2V0TmFtZSgpKS50aGVuUmV0dXJuKCJDb21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgd2hlbihjb21waWxhdGlvblVuaXREZWNsLmdldFF1YWxpZmllZE5hbWUoKSkudGhlblJldHVybigiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbW9jayhUeXBlU29sdmVyLmNsYXNzKTsKKyAgICAgICAgLy93aGVuKHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoImphdmEubGFuZy5jb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIpKS50aGVuUmV0dXJuKFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChDbGFzc0RlY2xhcmF0aW9uLmNsYXNzKSk7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci5nZXRSb290KCkpLnRoZW5SZXR1cm4odHlwZVNvbHZlcik7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci5zb2x2ZVR5cGUoImphdmEubGFuZy5PYmplY3QiKSkudGhlblJldHVybihuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSk7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiKSkudGhlblJldHVybihTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGNvbXBpbGF0aW9uVW5pdERlY2wpKTsKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcik7CisgICAgICAgIAorICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBzeW1ib2xTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCIsIHBhcmFtKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbXBpbGF0aW9uVW5pdCIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0IiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlUmVmZXJlbmNlVG9DbGFzc2VzSW5UaGVTYW1lUGFja2FnZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvcjMiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk5hdmlnYXRvciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAiZmluZFR5cGUiKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCk7CisKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIGNvbXBpbGF0aW9uVW5pdERlY2wgPSBtb2NrKFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIHdoZW4oY29tcGlsYXRpb25Vbml0RGVjbC5nZXROYW1lKCkpLnRoZW5SZXR1cm4oIkNvbXBpbGF0aW9uVW5pdCIpOworICAgICAgICB3aGVuKGNvbXBpbGF0aW9uVW5pdERlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpKS50aGVuUmV0dXJuKCJteS5wYWNrYWdlei5Db21waWxhdGlvblVuaXQiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbW9jayhUeXBlU29sdmVyLmNsYXNzKTsKKyAgICAgICAgd2hlbih0eXBlU29sdmVyLmdldFJvb3QoKSkudGhlblJldHVybih0eXBlU29sdmVyKTsKKyAgICAgICAgd2hlbih0eXBlU29sdmVyLnNvbHZlVHlwZSgiamF2YS5sYW5nLk9iamVjdCIpKS50aGVuUmV0dXJuKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgd2hlbih0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJteS5wYWNrYWdlei5Db21waWxhdGlvblVuaXQiKSkudGhlblJldHVybihTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGNvbXBpbGF0aW9uVW5pdERlY2wpKTsKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gc3ltYm9sU29sdmVyLnNvbHZlVHlwZSgiQ29tcGlsYXRpb25Vbml0IiwgcGFyYW0pOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29tcGlsYXRpb25Vbml0IiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXkucGFja2FnZXouQ29tcGlsYXRpb25Vbml0IiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlUmVmZXJlbmNlVG9DbGFzc0luSmF2YUxhbmcoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJOYXZpZ2F0b3IiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk5hdmlnYXRvciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAiZmluZFR5cGUiKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMSk7CisKKyAgICAgICAgUmVzb2x2ZWRDbGFzc0RlY2xhcmF0aW9uIHN0cmluZ0RlY2wgPSBtb2NrKFJlc29sdmVkQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIHdoZW4oc3RyaW5nRGVjbC5nZXROYW1lKCkpLnRoZW5SZXR1cm4oIlN0cmluZyIpOworICAgICAgICB3aGVuKHN0cmluZ0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpKS50aGVuUmV0dXJuKCJqYXZhLmxhbmcuU3RyaW5nIik7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG1vY2soVHlwZVNvbHZlci5jbGFzcyk7CisgICAgICAgIHdoZW4odHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgibWUudG9tYXNzZXR0aS5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5TdHJpbmciKSkudGhlblJldHVybihTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpKTsKKyAgICAgICAgd2hlbih0eXBlU29sdmVyLmdldFJvb3QoKSkudGhlblJldHVybih0eXBlU29sdmVyKTsKKyAgICAgICAgd2hlbih0eXBlU29sdmVyLnNvbHZlVHlwZSgiamF2YS5sYW5nLk9iamVjdCIpKS50aGVuUmV0dXJuKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVTb2x2ZXIpKTsKKyAgICAgICAgd2hlbih0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIikpLnRoZW5SZXR1cm4oU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChzdHJpbmdEZWNsKSk7CisgICAgICAgIFN5bWJvbFNvbHZlciBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZiA9IHN5bWJvbFNvbHZlci5zb2x2ZVR5cGUoIlN0cmluZyIsIHBhcmFtKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN0cmluZyIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VUb01ldGhvZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTmF2aWdhdG9yIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gcmVmZXJlbmNlc1RvRmllbGQgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJOYXZpZ2F0b3IiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChyZWZlcmVuY2VzVG9GaWVsZCwgImZpbmRUeXBlIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxUb0dldFR5cGVzID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImdldFR5cGVzIikuZ2V0KCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0yLjEuMC5qYXIiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIodHJ1ZSkpOworICAgICAgICBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKTsKKworICAgICAgICBNZXRob2RVc2FnZSByZWYgPSBzeW1ib2xTb2x2ZXIuc29sdmVNZXRob2QoImdldFR5cGVzIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIGNhbGxUb0dldFR5cGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImdldFR5cGVzIiwgcmVmLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQiLCByZWYuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisKKyAgICAgICAgLy92ZXJpZnkodHlwZVNvbHZlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlQ2FzY2FkZU9mUmVmZXJlbmNlc1RvTWV0aG9kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJOYXZpZ2F0b3IiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk5hdmlnYXRvciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAiZmluZFR5cGUiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbFRvU3RyZWFtID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgInN0cmVhbSIpLmdldCgpOworCisgICAgICAgIFN0cmluZyBwYXRoVG9KYXIgPSBhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyLWNvcmUtMi4xLjAuamFyIik7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIobmV3IEphclR5cGVTb2x2ZXIocGF0aFRvSmFyKSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKHRydWUpKTsKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZFVzYWdlIHJlZiA9IHN5bWJvbFNvbHZlci5zb2x2ZU1ldGhvZCgic3RyZWFtIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIGNhbGxUb1N0cmVhbSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdHJlYW0iLCByZWYuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIsIHJlZi5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VUb01ldGhvZENhbGxlZE9uQXJyYXlBY2Nlc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJBcnJheUFjY2VzcyIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQXJyYXlBY2Nlc3MiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImFjY2VzcyIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsVG9UcmltID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgInRyaW0iKS5nZXQoKTsKKworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIikpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjKSk7CisgICAgICAgIFN5bWJvbFNvbHZlciBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpOworICAgICAgICBNZXRob2RVc2FnZSByZWYgPSBzeW1ib2xTb2x2ZXIuc29sdmVNZXRob2QoInRyaW0iLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgY2FsbFRvVHJpbSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cmltIiwgcmVmLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlZi5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VUb0pyZVR5cGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJOYXZpZ2F0b3JTaW1wbGlmaWVkIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJOYXZpZ2F0b3IiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImZvbyIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSBzdHJlYW1KYXZhUGFyc2VyVHlwZSA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGUoKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHN0cmVhbVR5cGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHN0cmVhbUphdmFQYXJzZXJUeXBlLCBtZXRob2QpOworCisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLnN0cmVhbS5TdHJlYW08amF2YS5sYW5nLlN0cmluZz4iLCBzdHJlYW1UeXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZVRvTWV0aG9kV2l0aExhbWJkYSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvclNpbXBsaWZpZWQiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk5hdmlnYXRvciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZmluZFR5cGUiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAiZmlsdGVyIikuZ2V0KCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKG1ldGhvZENhbGxFeHByKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5zdHJlYW0uU3RyZWFtPGphdmEubGFuZy5TdHJpbmc+IiwgcmVmLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVmLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZVRvTGFtYmRhUGFyYW1CYXNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTmF2aWdhdG9yU2ltcGxpZmllZCIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTmF2aWdhdG9yIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmaW5kVHlwZSIpOworICAgICAgICBOYW1lRXhwciByZWZUb1QgPSBOYXZpZ2F0b3IuZmluZE5hbWVFeHByZXNzaW9uKG1ldGhvZCwgInQiKS5nZXQoKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUocmVmVG9UKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIj8gc3VwZXIgamF2YS5sYW5nLlN0cmluZyIsIHJlZi5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VUb0xhbWJkYVBhcmFtU2ltcGxpZmllZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvclNpbXBsaWZpZWQiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk5hdmlnYXRvciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZmluZFR5cGUiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJpc0VtcHR5IikuZ2V0KCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFN5bWJvbFNvbHZlciBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpOworICAgICAgICBNZXRob2RVc2FnZSByZWYgPSBzeW1ib2xTb2x2ZXIuc29sdmVNZXRob2QoImlzRW1wdHkiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgY2FsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc0VtcHR5IiwgcmVmLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlZi5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVHZW5lcmljUmV0dXJuVHlwZU9mTWV0aG9kSW5KYXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTmF2aWdhdG9yIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmaW5kVHlwZSIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImdldFR5cGVzIikuZ2V0KCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0yLjEuMC5qYXIiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSwgbmV3IEphclR5cGVTb2x2ZXIocGF0aFRvSmFyKSk7CisgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKGNhbGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0VHlwZXMiLCBtZXRob2RVc2FnZS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+IiwgbWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uIiwgbWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVVc2FnZU9mRmlyc3RNZXRob2RJbkdlbmVyaWNDbGFzcygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTmF2aWdhdG9yIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJOYXZpZ2F0b3IiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImZpbmRUeXBlIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxUb0dldFR5cGVzID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImdldFR5cGVzIikuZ2V0KCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0yLjEuMC5qYXIiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSwgbmV3IEphclR5cGVTb2x2ZXIocGF0aFRvSmFyKSk7CisgICAgICAgIE1ldGhvZFVzYWdlIGZpbHRlclVzYWdlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKGNhbGxUb0dldFR5cGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+IiwgZmlsdGVyVXNhZ2UucmV0dXJuVHlwZSgpLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZmlsdGVyVXNhZ2UucmV0dXJuVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uIiwgZmlsdGVyVXNhZ2UucmV0dXJuVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVVc2FnZU9mTWV0aG9kSW5HZW5lcmljQ2xhc3MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTmF2aWdhdG9yIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmaW5kVHlwZSIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsVG9TdHJlYW0gPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAic3RyZWFtIikuZ2V0KCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0yLjEuMC5qYXIiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSwgbmV3IEphclR5cGVTb2x2ZXIocGF0aFRvSmFyKSk7CisgICAgICAgIE1ldGhvZFVzYWdlIGZpbHRlclVzYWdlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKGNhbGxUb1N0cmVhbSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPiIsIGZpbHRlclVzYWdlLnJldHVyblR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlVXNhZ2VPZkNhc2NhZGVNZXRob2RJbkdlbmVyaWNDbGFzcygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTmF2aWdhdG9yIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJOYXZpZ2F0b3IiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImZpbmRUeXBlIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxUb0ZpbHRlciA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJmaWx0ZXIiKS5nZXQoKTsKKworICAgICAgICBTdHJpbmcgcGF0aFRvSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTIuMS4wLmphciIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpKTsKKyAgICAgICAgTWV0aG9kVXNhZ2UgZmlsdGVyVXNhZ2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbFRvRmlsdGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5zdHJlYW0uU3RyZWFtPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+IiwgZmlsdGVyVXNhZ2UucmV0dXJuVHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUxhbWJkYVR5cGUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTmF2aWdhdG9yIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmaW5kVHlwZSIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsVG9GaWx0ZXIgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAiZmlsdGVyIikuZ2V0KCk7CisgICAgICAgIEV4cHJlc3Npb24gbGFtYmRhRXhwciA9IGNhbGxUb0ZpbHRlci5nZXRBcmd1bWVudHMoKS5nZXQoMCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGhUb0phciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0yLjEuMC5qYXIiKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSwgbmV3IEphclR5cGVTb2x2ZXIocGF0aFRvSmFyKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlT2ZMYW1iZGFFeHByID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShsYW1iZGFFeHByKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPiIsIHR5cGVPZkxhbWJkYUV4cHIuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlUmVmZXJlbmNlVG9MYW1iZGFQYXJhbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTmF2aWdhdG9yIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJOYXZpZ2F0b3IiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImZpbmRUeXBlIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxUb0dldE5hbWUgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAiZ2V0TmFtZSIpLmdldCgpOworICAgICAgICBFeHByZXNzaW9uIHJlZmVyZW5jZVRvVCA9IGNhbGxUb0dldE5hbWUuZ2V0U2NvcGUoKS5nZXQoKTsKKworICAgICAgICBTdHJpbmcgcGF0aFRvSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTIuMS4wLmphciIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGVPZlQgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKHJlZmVyZW5jZVRvVCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI/IHN1cGVyIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24iLCB0eXBlT2ZULmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZVRvQ2FsbE9uTGFtYmRhUGFyYW0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk5hdmlnYXRvciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTmF2aWdhdG9yIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmaW5kVHlwZSIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsVG9HZXROYW1lID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImdldE5hbWUiKS5nZXQoKTsKKworICAgICAgICBTdHJpbmcgcGF0aFRvSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTIuMS4wLmphciIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9KYXIpKTsKKyAgICAgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbFRvR2V0TmFtZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXROYW1lIiwgbWV0aG9kVXNhZ2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uIiwgbWV0aG9kVXNhZ2UuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlUmVmZXJlbmNlVG9PdmVybG9hZE1ldGhvZFdpdGhOdWxsUGFyYW0oKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJPdmVybG9hZGVkTWV0aG9kcyIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiT3ZlcmxvYWRlZE1ldGhvZHMiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgIm0xIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAib3ZlcmxvYWRlZCIpLmdldCgpOworCisgICAgICAgIFJlZmxlY3Rpb25UeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgTWV0aG9kVXNhZ2UgcmVmID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKGNhbGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygib3ZlcmxvYWRlZCIsIHJlZi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVmLmdldE5vUGFyYW1zKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZ2V0UGFyYW1UeXBlcygpLmdldCgwKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVSZWZlcmVuY2VUb092ZXJsb2FkTWV0aG9kRmluZFN0cmljdGVyKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiT3ZlcmxvYWRlZE1ldGhvZHMiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk92ZXJsb2FkZWRNZXRob2RzIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJtMiIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgIm92ZXJsb2FkZWQiKS5nZXQoKTsKKworICAgICAgICBSZWZsZWN0aW9uVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIE1ldGhvZFVzYWdlIHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShjYWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm92ZXJsb2FkZWQiLCByZWYuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZi5nZXROb1BhcmFtcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmdldFBhcmFtVHlwZXMoKS5nZXQoMCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlSW5oZXJpdGVkTWV0aG9kRnJvbUludGVyZmFjZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkludGVyZmFjZUluaGVyaXRhbmNlIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJUZXN0Iik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJ0ZXN0Iik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAiZm9vYmFyIikuZ2V0KCk7CisKKyAgICAgICAgRmlsZSBzcmMgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcyIpKTsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSwgbmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyYykpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUoY2FsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZVRvT3ZlcmxvYWRNZXRob2RGaW5kT25seUNvbXBhdGlibGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJPdmVybG9hZGVkTWV0aG9kcyIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiT3ZlcmxvYWRlZE1ldGhvZHMiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgIm0zIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAib3ZlcmxvYWRlZCIpLmdldCgpOworCisgICAgICAgIFJlZmxlY3Rpb25UeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgTWV0aG9kVXNhZ2UgcmVmID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKGNhbGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygib3ZlcmxvYWRlZCIsIHJlZi5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVmLmdldE5vUGFyYW1zKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCByZWYuZ2V0UGFyYW1UeXBlcygpLmdldCgwKS5kZXNjcmliZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0RlZmF1bHRQYWNrYWdlVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vRGVmYXVsdFBhY2thZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZWFkMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0RlZmF1bHRQYWNrYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdENsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLk1lbW9yeVR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBTZWUgaXNzdWUgIzE2CisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0UGFja2FnZVRlc3QgeworCisgICAgcHJpdmF0ZSBjbGFzcyBNeUNsYXNzRGVjbGFyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdENsYXNzRGVjbGFyYXRpb24geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWU7CisKKyAgICAgICAgcHJpdmF0ZSBNeUNsYXNzRGVjbGFyYXRpb24oU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMucXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24+IGludGVybmFsVHlwZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFJlc29sdmVkUmVmZXJlbmNlVHlwZT4gZ2V0QW5jZXN0b3JzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UmVzb2x2ZWRGaWVsZERlY2xhcmF0aW9uPiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IGdldERlY2xhcmVkTWV0aG9kcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUJ5KFJlc29sdmVkVHlwZSB0eXBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVCeShSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyZWN0bHlBbm5vdGF0aW9uKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGdldFN1cGVyQ2xhc3MoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZFJlZmVyZW5jZVR5cGU+IGdldEludGVyZmFjZXMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxSZXNvbHZlZENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGdldENvbnN0cnVjdG9ycygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgb2JqZWN0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9wdGlvbmFsPFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uPiBjb250YWluZXJUeXBlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFDbGFzc0luRGVmYXVsdFBhY2thZ2VDYW5CZUFjY2Vzc2VkRnJvbVRoZURlZmF1bHRQYWNrYWdlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIGV4dGVuZHMgQiB7fSI7CisgICAgICAgIE1lbW9yeVR5cGVTb2x2ZXIgbWVtb3J5VHlwZVNvbHZlciA9IG5ldyBNZW1vcnlUeXBlU29sdmVyKCk7CisgICAgICAgIG1lbW9yeVR5cGVTb2x2ZXIuYWRkRGVjbGFyYXRpb24oIkIiLCBuZXcgTXlDbGFzc0RlY2xhcmF0aW9uKCJCIikpOworCisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIGpwVHlwZSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSkuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRFeHRlbmRlZFR5cGVzKDApOworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzb2x2ZWRUeXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobWVtb3J5VHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UoanBUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCIiwgcmVzb2x2ZWRUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhQ2xhc3NJbkRlZmF1bHRQYWNrYWdlQ2FuQmVBY2Nlc3NlZEZyb21PdXRzaWRlVGhlRGVmYXVsdFBhY2thZ2VJbXBvcnRpbmdJdCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicGFja2FnZSBteVBhY2thZ2U7IGltcG9ydCBCOyBjbGFzcyBBIGV4dGVuZHMgQiB7fSI7CisgICAgICAgIE1lbW9yeVR5cGVTb2x2ZXIgbWVtb3J5VHlwZVNvbHZlciA9IG5ldyBNZW1vcnlUeXBlU29sdmVyKCk7CisgICAgICAgIG1lbW9yeVR5cGVTb2x2ZXIuYWRkRGVjbGFyYXRpb24oIkIiLCBuZXcgTXlDbGFzc0RlY2xhcmF0aW9uKCJCIikpOworCisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIGpwVHlwZSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSkuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRFeHRlbmRlZFR5cGVzKDApOworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzb2x2ZWRUeXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobWVtb3J5VHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UoanBUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCIiwgcmVzb2x2ZWRUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBhQ2xhc3NJbkRlZmF1bHRQYWNrYWdlQ2FuQmVBY2Nlc3NlZEZyb21PdXRzaWRlVGhlRGVmYXVsdFBhY2thZ2VXaXRob3V0SW1wb3J0aW5nSXQoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInBhY2thZ2UgbXlQYWNrYWdlOyBjbGFzcyBBIGV4dGVuZHMgQiB7fSI7CisgICAgICAgIE1lbW9yeVR5cGVTb2x2ZXIgbWVtb3J5VHlwZVNvbHZlciA9IG5ldyBNZW1vcnlUeXBlU29sdmVyKCk7CisgICAgICAgIG1lbW9yeVR5cGVTb2x2ZXIuYWRkRGVjbGFyYXRpb24oIkIiLCBuZXcgTXlDbGFzc0RlY2xhcmF0aW9uKCJCIikpOworCisgICAgICAgIFJlc29sdmVkVHlwZSByZXNvbHZlZFR5cGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChtZW1vcnlUeXBlU29sdmVyKS5jb252ZXJ0VG9Vc2FnZShKYXZhUGFyc2VyLnBhcnNlKGNvZGUpLmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0RXh0ZW5kZWRUeXBlcygwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIHJlc29sdmVkVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0VudW1SZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vRW51bVJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlYWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0VudW1SZXNvbHV0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgRW51bVJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN3aXRjaE9uRW51bSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIlN3aXRjaE9uRW51bSIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiU3dpdGNoT25FbnVtIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmb28iKTsKKyAgICAgICAgU3dpdGNoU3RtdCBzd2l0Y2hTdG10ID0gTmF2aWdhdG9yLmZpbmRTd2l0Y2gobWV0aG9kKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gc3dpdGNoU3RtdC5nZXRFbnRyaWVzKCkuZ2V0KDApLmdldExhYmVsKCkuZ2V0KCk7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3dpdGNoT25FbnVtLk15RW51bSIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGVudW1BbmRTdGF0aWNJbml0aWFsaXplcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkVudW1BbmRTdGF0aWNJbml0aWFsaXplciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTXlDbGFzcyIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKGNsYXp6LCAicHV0IikuZ2V0KCk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKGNhbGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk15Q2xhc3MuUHJpbWl0aXZlIiwgcmVmLmRlc2NyaWJlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vRmllbGRzUmVzb2x1dGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0ZpZWxkc1Jlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5NWU3MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0ZpZWxkc1Jlc29sdXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgRmllbGRzUmVzb2x1dGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWNjZXNzQ2xhc3NGaWVsZFRocm91Z2hUaGlzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQWNjZXNzQ2xhc3NNZW1iZXJUaHJvdWdoVGhpcyIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWNjZXNzQ2xhc3NNZW1iZXJUaHJvdWdoVGhpcyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZ2V0TGFiZWwyIik7CisgICAgICAgIFJldHVyblN0bXQgcmV0dXJuU3RtdCA9IChSZXR1cm5TdG10KSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworCisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuZ2V0VHlwZShleHByZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWNjZXNzQ2xhc3NGaWVsZFRocm91Z2hUaGlzV2l0aENvbXBldGluZ1N5bWJvbEluUGFyZW50Q29udGV4dCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkFjY2Vzc0NsYXNzTWVtYmVyVGhyb3VnaFRoaXMiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkFjY2Vzc0NsYXNzTWVtYmVyVGhyb3VnaFRoaXMiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgInNldExhYmVsIik7CisgICAgICAgIEV4cHJlc3Npb25TdG10IGV4cHJlc3Npb25TdG10ID0gKEV4cHJlc3Npb25TdG10KSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCk7CisgICAgICAgIEFzc2lnbkV4cHIgYXNzaWduRXhwciA9IChBc3NpZ25FeHByKSBleHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIEZpZWxkQWNjZXNzRXhwciBmaWVsZEFjY2Vzc0V4cHIgPSAoRmllbGRBY2Nlc3NFeHByKSBhc3NpZ25FeHByLmdldFRhcmdldCgpOworCisgICAgICAgIEZpbGUgc3JjID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMiKSk7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjKSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKTsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbChmaWVsZEFjY2Vzc0V4cHIuZ2V0TmFtZSgpLmdldElkKCksIGZpZWxkQWNjZXNzRXhwcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmlzRmllbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3NFbnVtRmllbGRUaHJvdWdoVGhpcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkFjY2Vzc0VudW1NZW1iZXJUaHJvdWdoVGhpcyIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uIGVudW1EZWNsID0gTmF2aWdhdG9yLmRlbWFuZEVudW0oY3UsICJBY2Nlc3NFbnVtTWVtYmVyVGhyb3VnaFRoaXMiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChlbnVtRGVjbCwgImdldExhYmVsIik7CisgICAgICAgIFNpbXBsZU5hbWUgZXhwcmVzc2lvbiA9IE5hdmlnYXRvci5maW5kU2ltcGxlTmFtZShtZXRob2QsICJsYWJlbCIpLmdldCgpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxhYmVsIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3NFbnVtTWV0aG9kVGhyb3VnaFRoaXMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJBY2Nlc3NFbnVtTWVtYmVyVGhyb3VnaFRoaXMiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbCA9IE5hdmlnYXRvci5kZW1hbmRFbnVtKGN1LCAiQWNjZXNzRW51bU1lbWJlclRocm91Z2hUaGlzIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoZW51bURlY2wsICJnZXRMYWJlbDIiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gKFJldHVyblN0bXQpIG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3NGaWVsZFRocm91Z2hTdXBlcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkFjY2Vzc1Rocm91Z2hTdXBlciIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWNjZXNzVGhyb3VnaFN1cGVyLlN1YkNsYXNzIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmaWVsZFRlc3QiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gKFJldHVyblN0bXQpIG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZGVzY3JpYmUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vR2VuZXJpY3NSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vR2VuZXJpY3NSZXNvbHV0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYzRiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9HZW5lcmljc1Jlc29sdXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY3NSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlRmllbGRXaXRoR2VuZXJpY1R5cGVUb1N0cmluZygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkdlbmVyaWNzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkdlbmVyaWNzIik7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciBmaWVsZFMgPSBOYXZpZ2F0b3IuZGVtYW5kRmllbGQoY2xhenosICJzIik7CisKKyAgICAgICAgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gc3ltYm9sUmVmZXJlbmNlID0gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sQXNWYWx1ZSgicyIsIGZpZWxkUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHN5bWJvbFJlZmVyZW5jZS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicyIsIHN5bWJvbFJlZmVyZW5jZS5nZXQoKS5nZXROYW1lKCkpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gc3ltYm9sUmVmZXJlbmNlLmdldCgpLmdldFR5cGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUZpZWxkV2l0aEdlbmVyaWNUeXBlVG9EZWNsYXJlZENsYXNzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiR2VuZXJpY3MiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiR2VuZXJpY3MiKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIGZpZWxkUyA9IE5hdmlnYXRvci5kZW1hbmRGaWVsZChjbGF6eiwgImciKTsKKworICAgICAgICBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiBzeW1ib2xSZWZlcmVuY2UgPSBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xBc1ZhbHVlKCJnIiwgZmllbGRTKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnIiwgc3ltYm9sUmVmZXJlbmNlLmdldCgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBzeW1ib2xSZWZlcmVuY2UuZ2V0KCkuZ2V0VHlwZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWUudG9tYXNzZXR0aS5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5HZW5lcmljcyIsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlRmllbGRXaXRoR2VuZXJpY1R5cGVUb0ludGVnZXIoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJHZW5lcmljcyIpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgZmllbGRTID0gTmF2aWdhdG9yLmRlbWFuZEZpZWxkKGNsYXp6LCAiaSIpOworCisgICAgICAgIFN5bWJvbFNvbHZlciBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHN5bWJvbFJlZmVyZW5jZSA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEFzVmFsdWUoImkiLCBmaWVsZFMpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzeW1ib2xSZWZlcmVuY2UuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImkiLCBzeW1ib2xSZWZlcmVuY2UuZ2V0KCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IHN5bWJvbFJlZmVyZW5jZS5nZXQoKS5nZXRUeXBlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlRmllbGRPZlZhcmlhYmxlVHlwZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkdlbmVyaWNzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlNvbWVDb2xsZWN0aW9uIik7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciBmaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRGaWVsZChjbGF6eiwgImEiKTsKKworICAgICAgICBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcihuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiBzeW1ib2xSZWZlcmVuY2UgPSBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xBc1ZhbHVlKCJhIiwgZmllbGQpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzeW1ib2xSZWZlcmVuY2UuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBzeW1ib2xSZWZlcmVuY2UuZ2V0KCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IHN5bWJvbFJlZmVyZW5jZS5nZXQoKS5nZXRUeXBlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUZpZWxkT2ZHZW5lcmljUmVmZXJyaW5nVG9WYXJpYWJsZVR5cGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJTb21lQ29sbGVjdGlvbiIpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgZmllbGQgPSBOYXZpZ2F0b3IuZGVtYW5kRmllbGQoY2xhenosICJhcyIpOworCisgICAgICAgIFN5bWJvbFNvbHZlciBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHN5bWJvbFJlZmVyZW5jZSA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEFzVmFsdWUoImFzIiwgZmllbGQpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBzeW1ib2xSZWZlcmVuY2UuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFzIiwgc3ltYm9sUmVmZXJlbmNlLmdldCgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBzeW1ib2xSZWZlcmVuY2UuZ2V0KCkuZ2V0VHlwZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHR5cGUuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8QT4iLCB0eXBlLmRlc2NyaWJlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlUGFyYW0gPSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdHlwZVBhcmFtLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCB0eXBlUGFyYW0uZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVXNhZ2VPZkdlbmVyaWNGaWVsZFNpbXBsZUNhc2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJTb21lQ29sbGVjdGlvbiIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmb28xIik7CisKKyAgICAgICAgRXhwcmVzc2lvblN0bXQgc3RtdCA9IChFeHByZXNzaW9uU3RtdCkgbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBzdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuZ2V0VHlwZShleHByZXNzaW9uKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHR5cGUuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHR5cGUuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgLy9QUklNQSBVTiBURVNUIENIRSBESUNBIENIRSBJTCBUSVBPIERFTCBDQU1QTyBBUyBlJyBMSVNUPEE+IE5PTiBMSVNUPEU+CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVXNhZ2VPZkdlbmVyaWNGaWVsZEludGVybWVkaWF0ZUNhc2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJTb21lQ29sbGVjdGlvbiIpOworCisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciBmaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRGaWVsZChjbGF6eiwgImFzIik7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuZ2V0VHlwZShmaWVsZCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PEE+IiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVVc2FnZU9mR2VuZXJpY0ZpZWxkQWR2YW5jZWRDYXNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiR2VuZXJpY3MiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiU29tZUNvbGxlY3Rpb24iKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZm9vMiIpOworCisgICAgICAgIEV4cHJlc3Npb25TdG10IHN0bXQgPSAoRXhwcmVzc2lvblN0bXQpIG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gc3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGUoZXhwcmVzc2lvbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoMCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVXNhZ2VPZk1ldGhvZE9mR2VuZXJpY0NsYXNzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiR2VuZXJpY3MiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiR2VuZXJpY01ldGhvZENhbGxzLkRlcml2ZWQiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImNhbGxlciIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImNhbGxlZSIpLmdldCgpOworCisgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlTWV0aG9kQXNVc2FnZShleHByZXNzaW9uKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNhbGxlZSIsIG1ldGhvZFVzYWdlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlRWxlbWVudE9mTGlzdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkVsZW1lbnRPZkxpc3QiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiRWxlbWVudE9mTGlzdCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZm9vIik7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IgPSBOYXZpZ2F0b3IuZGVtYW5kVmFyaWFibGVEZWNsYXJhdGlvbihtZXRob2QsICJhIikuZ2V0KCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRvci5nZXRJbml0aWFsaXplcigpLmdldCgpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGUoZXhwcmVzc2lvbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbW1lbnQiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUVsZW1lbnRPZkxpc3RBZHZhbmNlZEV4YW1wbGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJFbGVtZW50T2ZMaXN0Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkVsZW1lbnRPZkxpc3QiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImFubm90YXRpb25zIik7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IgPSBOYXZpZ2F0b3IuZGVtYW5kVmFyaWFibGVEZWNsYXJhdGlvbihtZXRob2QsICJhIikuZ2V0KCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRvci5nZXRJbml0aWFsaXplcigpLmdldCgpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGUoZXhwcmVzc2lvbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFubm90YXRpb25FeHByIiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdlbmVyaWNzSW5oZXJpdGFuY2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJNZXRob2RUeXBlUGFyYW1zIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlZvaWRWaXNpdG9yQWRhcHRlciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAidmlzaXQiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJhY2NlcHQiKS5nZXQoKTsKKyAgICAgICAgRXhwcmVzc2lvbiB0aGlzUmVmID0gY2FsbC5nZXRBcmd1bWVudHMoKS5nZXQoMCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB2b2lkVmlzaXRvckFkYXB0ZXJPZkEgPSBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUodGhpc1JlZik7CisgICAgICAgIExpc3Q8UmVzb2x2ZWRSZWZlcmVuY2VUeXBlPiBhbGxBbmNlc3RvcnMgPSB2b2lkVmlzaXRvckFkYXB0ZXJPZkEuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0QWxsQW5jZXN0b3JzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBhbGxBbmNlc3RvcnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZFR5cGVQYXJhbXMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJNZXRob2RUeXBlUGFyYW1zIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlZvaWRWaXNpdG9yQWRhcHRlciIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAidmlzaXQiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJhY2NlcHQiKS5nZXQoKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKGNhbGwpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdHlwZS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsYXNzQ2FzdFNjb3BlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NDYXN0Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkNsYXNzQ2FzdCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZ2V0Tm9kZXNCeVR5cGUiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJjYXN0IikuZ2V0KCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBjYWxsLmdldFNjb3BlKCkuZ2V0KCk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZShzY29wZSk7CisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odHlwZVVzYWdlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHR5cGUuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzPE4+IiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsYXNzQ2FzdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzQ2FzdCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJDbGFzc0Nhc3QiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImdldE5vZGVzQnlUeXBlIik7CisgICAgICAgIFJldHVyblN0bXQgcmV0dXJuU3RtdCA9IE5hdmlnYXRvci5maW5kUmV0dXJuU3RtdChtZXRob2QpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGUocmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk4iLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHlwZVBhcmFtT25SZXR1cm5UeXBlU3RlcDEoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJUeXBlUGFyYW1PblJldHVyblR5cGUiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiVHlwZVBhcmFtT25SZXR1cm5UeXBlIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJub2RlRXF1YWxzIik7CisgICAgICAgIFRoaXNFeHByIHRoaXNFeHByID0gTmF2aWdhdG9yLmZpbmROb2RlT2ZHaXZlbkNsYXNzKG1ldGhvZCwgVGhpc0V4cHIuY2xhc3MpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGUodGhpc0V4cHIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdHlwZS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUeXBlUGFyYW1PblJldHVyblR5cGUiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHlwZVBhcmFtT25SZXR1cm5UeXBlU3RlcDIoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJUeXBlUGFyYW1PblJldHVyblR5cGUiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiVHlwZVBhcmFtT25SZXR1cm5UeXBlIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJub2RlRXF1YWxzIik7CisgICAgICAgIE5hbWVFeHByIG4xID0gTmF2aWdhdG9yLmZpbmROYW1lRXhwcmVzc2lvbihtZXRob2QsICJuMSIpLmdldCgpOworCisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLmdldFR5cGUobjEpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlQiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHlwZVBhcmFtT25SZXR1cm5UeXBlU3RlcDMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJUeXBlUGFyYW1PblJldHVyblR5cGUiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiVHlwZVBhcmFtT25SZXR1cm5UeXBlIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJub2RlRXF1YWxzIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGwgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAiYWNjZXB0IikuZ2V0KCk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShjYWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHR5cGUuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLkJvb2xlYW4iLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHlwZVBhcmFtT25SZXR1cm5UeXBlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiVHlwZVBhcmFtT25SZXR1cm5UeXBlIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlR5cGVQYXJhbU9uUmV0dXJuVHlwZSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAibm9kZUVxdWFscyIpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHR5cGUuaXNUeXBlVmFyaWFibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9vbGVhbiIsIHR5cGUuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgLypAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdlbmVyaWNDb2xsZWN0aW9uV2l0aFdpbGRjYXJkc0FuZEV4dGVuc2lvbnNQcmVwKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiR2VuZXJpY0NvbGxlY3Rpb25XaXRoRXh0ZW5zaW9uIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkZvbyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiYmFyIik7CisgICAgICAgIFJldHVyblN0bXQgcmV0dXJuU3RtdCA9IE5hdmlnYXRvci5maW5kUmV0dXJuU3RtdChtZXRob2QpOworCisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBKcmVUeXBlU29sdmVyKCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGwgPSAoTWV0aG9kQ2FsbEV4cHIpIHJldHVyblN0bXQuZ2V0RXhwcigpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKworICAgICAgICBMaXN0PFR5cGVVc2FnZT4gcGFyYW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGlmIChjYWxsLmdldEFyZ3MoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gcGFyYW0gOiBjYWxsLmdldEFyZ3MoKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQoamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKHBhcmFtLCBmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY2FsbCwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgUmVmZXJlbmNlVHlwZVVzYWdlIHR5cGVPZlNjb3BlID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNhbGwuZ2V0U2NvcGUoKSkuYXNSZWZlcmVuY2VUeXBlKCk7CisgICAgICAgIG1lLnRvbWFzc2V0dGkuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdHlwZU9mU2NvcGUuZ2V0VHlwZURlY2xhcmF0aW9uKCk7CisgICAgICAgIExpc3Q8VHlwZVVzYWdlPiB0eXBlUGFyYW1ldGVyc1ZhbHVlcyA9IHR5cGVPZlNjb3BlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCk7CisKKyAgICAgICAgTGlzdDxNZXRob2RVc2FnZT4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogTGlzdC5jbGFzcy5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKS5lcXVhbHMoImFkZEFsbCIpICYmICFtLmlzQnJpZGdlKCkgJiYgIW0uaXNTeW50aGV0aWMoKSkgeworICAgICAgICAgICAgICAgIG1lLnRvbWFzc2V0dGkuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb2ssIGUnIGlsIHByaW1vCisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZVR5cGVVc2FnZSBwYXJhbVR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbSgwKS5nZXRUeXBlKHR5cGVTb2x2ZXIpLmFzUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHBhcmFtVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldCgwKS5pc1dpbGRjYXJkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNZXRob2RVc2FnZSBtdSA9IG5ldyBNZXRob2RVc2FnZShtZXRob2REZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIGZvciAoVHlwZVBhcmFtZXRlciB0cCA6IHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICAgICAgICAgIG11ID0gbXUucmVwbGFjZVR5cGVQYXJhbWV0ZXIodHAuZ2V0TmFtZSgpLCB0eXBlUGFyYW1ldGVyc1ZhbHVlcy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKG11KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShNZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBcHBsaWNhYmxlKG1ldGhvZHMuZ2V0KDApLCAiYWRkQWxsIiwgcGFyYW1zLCB0eXBlU29sdmVyKSk7CisgICAgICAgIC8vT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IG1ldGhvZFVzYWdlID0gTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZVVzYWdlKG1ldGhvZHMsICJhZGRBbGwiLCBwYXJhbXMsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIC8vT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IG1ldGhvZFVzYWdlID0gdHlwZURlY2xhcmF0aW9uLnNvbHZlTWV0aG9kQXNVc2FnZSgiYWRkQWxsIiwgcGFyYW1zLCB0eXBlU29sdmVyLCBjb250ZXh0LCB0eXBlUGFyYW1ldGVyc1ZhbHVlcyk7CisKKyAgICAgICAgLy9PcHRpb25hbDxNZXRob2RVc2FnZT4gbWV0aG9kVXNhZ2UgPSBjb250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZSgiYWRkQWxsIiwgcGFyYW1zLCB0eXBlU29sdmVyKTsKKworICAgICAgICAvL2Fzc2VydFRydWUobWV0aG9kVXNhZ2UuaXNQcmVzZW50KCkpOworCisgICAgfSovCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdlbmVyaWNDb2xsZWN0aW9uV2l0aFdpbGRjYXJkc0FuZEV4dGVuc2lvbnMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljQ29sbGVjdGlvbldpdGhFeHRlbnNpb24iKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiRm9vIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJiYXIiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG1ldGhvZCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIEV4cHJlc3Npb24gcmV0dXJuU3RtdEV4cHIgPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUocmV0dXJuU3RtdEV4cHIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdHlwZS5pc1R5cGVWYXJpYWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZFdpdGhHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljQ29sbGVjdGlvbldpdGhFeHRlbnNpb24iKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiRm9vIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJiYXIiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJmb28iKS5nZXQoKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisKKyAgICAgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPSBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlTWV0aG9kQXNVc2FnZShtZXRob2RDYWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1ldGhvZFVzYWdlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmljQ29sbGVjdGlvbldpdGhXaWxkY2FyZHMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljQ29sbGVjdGlvbiIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJGb28iKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImJhciIpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgRXhwcmVzc2lvbiByZXR1cm5TdG10RXhwciA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShyZXR1cm5TdG10RXhwcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0eXBlLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0phdmFQYXJzZXJGYWNhZGVSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vSmF2YVBhcnNlckZhY2FkZVJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZWMyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0phdmFQYXJzZXJGYWNhZGVSZXNvbHV0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUmVmZXJlbmNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRVbmlvblR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5KYXZhU3ltYm9sU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlckZhY2FkZVJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHR5cGVEZWNsYXJhdGlvblN1cGVyQ2xhc3NJbXBsaWNpdGx5SW5jbHVkZU9iamVjdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkdlbmVyaWNzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkdlbmVyaWNzIik7CisgICAgICAgIFJlc29sdmVkVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhenopOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgc3VwZXJjbGFzcyA9IHR5cGVEZWNsYXJhdGlvbi5hc0NsYXNzKCkuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgc3VwZXJjbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIC8vIFNlZSBpc3N1ZSA0MgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmluZ1JlZmVyZW5jZVRvVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInB1YmxpYyBjbGFzcyBCbGEge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgdm9pZCBtYWluKClcbiIgKworICAgICAgICAgICAgICAgICIgICAge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgdHJ5XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgaW50IGkgPSAwO1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgU3RyaW5nIHM7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCk7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIH1cbiIgKworICAgICAgICAgICAgICAgICJ9IjsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSBOYXZpZ2F0b3IuZmluZE5vZGVPZkdpdmVuQ2xhc3MoSmF2YVBhcnNlci5wYXJzZShjb2RlKSwgTWV0aG9kQ2FsbEV4cHIuY2xhc3MpOworICAgICAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobWV0aG9kQ2FsbEV4cHIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5UaHJvd2FibGUuZ2V0TWVzc2FnZSgpIiwgbWV0aG9kVXNhZ2UuZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIC8vIFNlZSBpc3N1ZSA0NgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmluZ1JlZmVyZW5jZVRvQ2F0Y2hDbGF1c2VQYXJhbSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicHVibGljIGNsYXNzIEJsYSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIG1haW4oKVxuIiArCisgICAgICAgICAgICAgICAgIiAgICB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB0cnlcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICBpbnQgaSA9IDA7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSlcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICBTdHJpbmcgcztcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKTtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIH1cbiIgKworICAgICAgICAgICAgICAgICIgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIn0iOworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IE5hdmlnYXRvci5maW5kTm9kZU9mR2l2ZW5DbGFzcyhKYXZhUGFyc2VyLnBhcnNlKGNvZGUpLCBNZXRob2RDYWxsRXhwci5jbGFzcyk7CisgICAgICAgIE5hbWVFeHByIG5hbWVFID0gKE5hbWVFeHByKW1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkuZ2V0KCk7CisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiBzeW1ib2xSZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUobmFtZUUpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgc3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmlzUGFyYW1ldGVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImUiLCBzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNQYXJhbWV0ZXIoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1BhcmFtZXRlcigpLmdldFR5cGUoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIC8vIFNlZSBpc3N1ZSA0NworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmluZ1JlZmVyZW5jZVRvQW5BbmNlc3RvckludGVybmFsQ2xhc3MoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInB1YmxpYyBjbGFzcyBGb28ge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBwdWJsaWMgY2xhc3MgQmFzZSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBwdWJsaWMgY2xhc3MgWCB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIH1cbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIGNsYXNzIERlcml2ZWQgZXh0ZW5kcyBCYXNlIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIHB1YmxpYyBYIHggPSBudWxsO1xuIiArCisgICAgICAgICAgICAgICAgIiAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAifSI7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5maW5kTm9kZU9mR2l2ZW5DbGFzcyhKYXZhUGFyc2VyLnBhcnNlKGNvZGUpLCBGaWVsZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgVHlwZSBqcFR5cGUgPSBmaWVsZERlY2xhcmF0aW9uLmdldENvbW1vblR5cGUoKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIGpzc1R5cGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuY29udmVydFRvVXNhZ2UoanBUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb28uQmFzZS5YIiwganNzVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIC8vIFNlZSBpc3N1ZSAxMTkKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVHJ5V2l0aFJlc291cmNlVmFyaWFibGUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsgY2xhc3MgQSB7IHZvaWQgZm9vKCkgeyB0cnkgKFNjYW5uZXIgc2MgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHNjLm5leHRMaW5lKCk7XG4iICsKKyAgICAgICAgICAgICAgICAifSB9IH0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChjdSwgIm5leHRMaW5lIikuZ2V0KCk7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBtZXRob2RDYWxsRXhwci5nZXRTY29wZSgpLmdldCgpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKHNjb3BlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5TY2FubmVyIiwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGlsYXRpb25Vbml0IHBhcnNlV2l0aFR5cGVTb2x2ZXIoU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb24gcGFyc2VyQ29uZmlndXJhdGlvbiA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIHBhcnNlckNvbmZpZ3VyYXRpb24uc2V0U3ltYm9sUmVzb2x2ZXIobmV3IEphdmFTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikpOworICAgICAgICBKYXZhUGFyc2VyIGphdmFQYXJzZXIgPSBuZXcgSmF2YVBhcnNlcihwYXJzZXJDb25maWd1cmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIGphdmFQYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBuZXcgU3RyaW5nUHJvdmlkZXIoY29kZSkpLmdldFJlc3VsdCgpLmdldCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNdWx0aUNhdGNoVHlwZSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgdHJ5IHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIiAgICB9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VXaXRoVHlwZVNvbHZlcihjb2RlKTsKKyAgICAgICAgQ2F0Y2hDbGF1c2UgY2F0Y2hDbGF1c2UgPSBOYXZpZ2F0b3IuZmluZE5vZGVPZkdpdmVuQ2xhc3MoY3UsIENhdGNoQ2xhdXNlLmNsYXNzKTsKKyAgICAgICAgVHlwZSBqcFR5cGUgPSBjYXRjaENsYXVzZS5nZXRQYXJhbWV0ZXIoKS5nZXRUeXBlKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSBqc3NUeXBlID0ganBUeXBlLnJlc29sdmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGpzc1R5cGUgaW5zdGFuY2VvZiBSZXNvbHZlZFVuaW9uVHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vTGFtYmRhUmVzb2x1dGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0xhbWJkYVJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyMGM1MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL0xhbWJkYVJlc29sdXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgTGFtYmRhUmVzb2x1dGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlc29sdXRpb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbGFtYmRhTWFwUGFyYW1ldGVyKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTGFtYmRhIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBZ2VuZGEiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImxhbWJkYU1hcCIpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSAoTWV0aG9kQ2FsbEV4cHIpIHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKS5nZXQoMCk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShleHByZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBqYXZhLmxhbmcuU3RyaW5nLCA/IGV4dGVuZHMgamF2YS5sYW5nLlN0cmluZz4iLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGVyc29uc1N0cmVhbSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxhbWJkYSIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJsYW1iZGFNYXAiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG1ldGhvZCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworICAgICAgICBleHByZXNzaW9uID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKGV4cHJlc3Npb24sICJzdHJlYW0iKS5nZXQoKTsKKworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5zdHJlYW0uU3RyZWFtPGphdmEubGFuZy5TdHJpbmc+IiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYU1hcCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxhbWJkYSIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG0xID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImxhbWJkYU1hcCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtMiA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJsYW1iZGFNYXAyIik7CisgICAgICAgIFJldHVyblN0bXQgcmV0dXJuU3RtdDEgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobTEpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQyID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG0yKTsKKyAgICAgICAgRXhwcmVzc2lvbiBlMSA9IHJldHVyblN0bXQxLmdldEV4cHJlc3Npb24oKS5nZXQoKTsKKyAgICAgICAgRXhwcmVzc2lvbiBlMiA9IHJldHVyblN0bXQyLmdldEV4cHJlc3Npb24oKS5nZXQoKTsKKworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlMSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShlMSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlMiA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShlMik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLnN0cmVhbS5TdHJlYW08amF2YS5sYW5nLlN0cmluZz4iLCB0eXBlMS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTxqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbT4iLCB0eXBlMi5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYVJlZHVjZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxhbWJkYSIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJyZWR1Y2UiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG1ldGhvZCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwciA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUxID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGV4cHIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5PcHRpb25hbDxqYXZhLmxhbmcuSW50ZWdlcj4iLCB0eXBlMS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYUJpZnVuYygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxhbWJkYSIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJiaWZ1bmMiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG1ldGhvZCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwciA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUxID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGV4cHIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHR5cGUxLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbGFtYmRhQ29sbGVjdFBhcmFtKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTGFtYmRhQ29sbGVjdCIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJsYW1iZGFNYXAiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG1ldGhvZCk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGxFeHByID0gKE1ldGhvZENhbGxFeHByKSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKTsKKyAgICAgICAgLy8gQ29sbGVjdG9ycy50b0xpc3QoKQorICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKS5nZXQoMCk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShleHByZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcjxULCA/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3Q8VD4+IiwgdHlwZS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYUNvbGxlY3QoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJMYW1iZGFDb2xsZWN0Iik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBZ2VuZGEiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImxhbWJkYU1hcCIpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IGphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShleHByZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiIsIHR5cGUuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsYW1iZGFCbG9ja0V4cGxpY2l0UmV0dXJuKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTGFtYmRhTXVsdGkiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkFnZW5kYSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAibGFtYmRhU2luZ2xlUmV0dXJuIik7CisgICAgICAgIFJldHVyblN0bXQgcmV0dXJuU3RtdCA9IE5hdmlnYXRvci5maW5kUmV0dXJuU3RtdChtZXRob2QpOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKTsKKworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbGFtYmRhQmxvY2tNdWx0aUxpbmVSZXR1cm4oKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJMYW1iZGFNdWx0aSIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJtdWx0aUxpbmVSZXR1cm4iKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gTmF2aWdhdG9yLmZpbmRSZXR1cm5TdG10KG1ldGhvZCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHR5cGUgPSBqYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoZXhwcmVzc2lvbik7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHR5cGUuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0eXBlT2ZWb2lkTGFtYmRhKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTGFtYmRhVm9pZCIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJsYW1iZGFFbXB0eSIpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisgICAgICAgIExhbWJkYUV4cHIgbGFtYmRhRXhwciA9IE5hdmlnYXRvci5maW5kTm9kZU9mR2l2ZW5DbGFzcyhleHByZXNzaW9uLCBMYW1iZGFFeHByLmNsYXNzKTsKKworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGxhbWJkYUV4cHIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZvaWQiLCB0eXBlLmRlc2NyaWJlKCkpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9NZXRob2RzUmVzb2x1dGlvbkxvZ2ljVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vTWV0aG9kc1Jlc29sdXRpb25Mb2dpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTM2MDdkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vTWV0aG9kc1Jlc29sdXRpb25Mb2dpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIE1ldGhvZHNSZXNvbHV0aW9uTG9naWNUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgRmlsZSBzcmNOZXdDb2RlID0gYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZSIpKTsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlck5ld0NvZGUuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKHNyY05ld0NvZGUpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzIikpKSk7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29tcGF0aWJpbGl0eVNob3VsZENvbnNpZGVyQWxzb1R5cGVWYXJpYWJsZXNOZWdhdGl2ZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHN0cmluZ1R5cGUgPSAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoU3RyaW5nLmNsYXNzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJhd0NsYXNzVHlwZSA9IChSZXNvbHZlZFJlZmVyZW5jZVR5cGUpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihDbGFzcy5jbGFzcywgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByYXdDbGFzc1R5cGUuaXNSYXdUeXBlKCkpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgY2xhc3NPZlN0cmluZ1R5cGUgPSAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSByYXdDbGFzc1R5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMocmF3Q2xhc3NUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApLCBzdHJpbmdUeXBlKTsKKyAgICAgICAgTWV0aG9kVXNhZ2UgbXUgPSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEFsbE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldERlY2xhcmF0aW9uKCkuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKCJpc1Rocm93cyhqYXZhLmxhbmcuQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5UaHJvd2FibGU+KSIpKS5maW5kRmlyc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0FwcGxpY2FibGUobXUsICJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YoY2xhc3NPZlN0cmluZ1R5cGUpLCB0eXBlU29sdmVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21wYXRpYmlsaXR5U2hvdWxkQ29uc2lkZXJBbHNvVHlwZVZhcmlhYmxlc1JhdygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJhd0NsYXNzVHlwZSA9IChSZXNvbHZlZFJlZmVyZW5jZVR5cGUpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihDbGFzcy5jbGFzcywgdHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZFVzYWdlIG11ID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbS5nZXREZWNsYXJhdGlvbigpLmdldFNpZ25hdHVyZSgpLmVxdWFscygiaXNUaHJvd3MoamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuVGhyb3dhYmxlPikiKSkuZmluZEZpcnN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0FwcGxpY2FibGUobXUsICJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YocmF3Q2xhc3NUeXBlKSwgdHlwZVNvbHZlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29tcGF0aWJpbGl0eVNob3VsZENvbnNpZGVyQWxzb1R5cGVWYXJpYWJsZXNQb3NpdGl2ZSgpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIHJ1bnRpbWVFeGNlcHRpb24gPSAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywgdHlwZVNvbHZlcik7CisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZSByYXdDbGFzc1R5cGUgPSAoUmVzb2x2ZWRSZWZlcmVuY2VUeXBlKSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoQ2xhc3MuY2xhc3MsIHR5cGVTb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGUgY2xhc3NPZlJ1bnRpbWVUeXBlID0gKFJlc29sdmVkUmVmZXJlbmNlVHlwZSkgcmF3Q2xhc3NUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHJhd0NsYXNzVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSwgcnVudGltZUV4Y2VwdGlvbik7CisgICAgICAgIE1ldGhvZFVzYWdlIG11ID0gY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbS5nZXREZWNsYXJhdGlvbigpLmdldFNpZ25hdHVyZSgpLmVxdWFscygiaXNUaHJvd3MoamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuVGhyb3dhYmxlPikiKSkuZmluZEZpcnN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0FwcGxpY2FibGUobXUsICJpc1Rocm93cyIsIEltbXV0YWJsZUxpc3Qub2YoY2xhc3NPZlJ1bnRpbWVUeXBlKSwgdHlwZVNvbHZlcikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL01ldGhvZHNSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vTWV0aG9kc1Jlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2ZGM5NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL01ldGhvZHNSZXNvbHV0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgTWV0aG9kc1Jlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kQWNjZXNzVGhyb3VnaFN1cGVyKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQWNjZXNzVGhyb3VnaFN1cGVyIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBY2Nlc3NUaHJvdWdoU3VwZXIuU3ViQ2xhc3MiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgIm1ldGhvZFRlc3QiKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gKFJldHVyblN0bXQpIG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZFdpdGhDbGFzc0V4cHJlc3Npb25Bc1BhcmFtZXRlcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzRXhwcmVzc2lvbiIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQ2xhc3NFeHByZXNzaW9uIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJmb28iKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJub25lT2YiKS5nZXQoKTsKKworICAgICAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZU1ldGhvZEFzVXNhZ2UoZXhwcmVzc2lvbik7CisgICAgICAgIGFzc2VydEVxdWFscygibm9uZU9mIiwgbWV0aG9kVXNhZ2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kSW5JbnRlcmZhY2VQYXJlbnQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJNZXRob2RDYWxscyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJNZXRob2RDYWxscyIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJpbmhlcml0ZWRJbnRlcmZhY2VNZXRob2QiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJ0b1N0cmluZyIpLmdldCgpOworCisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgamF2YVBhcnNlckZhY2FkZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpOworICAgICAgICBNZXRob2RVc2FnZSBjYWxsMSA9IGphdmFQYXJzZXJGYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKSIsIGNhbGwxLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kV2l0aFR5cGVQcm9tb3Rpb25zVG9Mb25nKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiSXNzdWUzMzgiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiVHlwZVByb21vdGlvbnMiKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiY2FsbGluZ0xvbmciKTsKKworICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxvbmdQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMSkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibG9uZ1BhcmFtIiwgcmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgyKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsb25nUGFyYW0iLCByZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDMpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxvbmdQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kV2l0aFR5cGVQcm9tb3Rpb25zVG9JbnQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTMzOCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJUeXBlUHJvbW90aW9ucyIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJjYWxsaW5nSW50Iik7CisKKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMSkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW50UGFyYW0iLCByZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDIpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImludFBhcmFtIiwgcmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgzKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZFdpdGhUeXBlUHJvbW90aW9uc1RvU2hvcnQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTMzOCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJUeXBlUHJvbW90aW9ucyIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJjYWxsaW5nU2hvcnQiKTsKKworICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNob3J0UGFyYW0iLCByZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDEpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNob3J0UGFyYW0iLCByZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDIpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMykuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RXaXRoVHlwZVByb21vdGlvbnNUb0J5dGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTMzOCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJUeXBlUHJvbW90aW9ucyIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJjYWxsaW5nQnl0ZSIpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYnl0ZVBhcmFtIiwgcmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgxKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDIpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMykuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RXaXRoVHlwZVByb21vdGlvbnNUb0xvbmdXaXRoRXh0cmFQYXJhbSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlMzM4Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlR5cGVQcm9tb3Rpb25zV2l0aEV4dHJhUGFyYW0iKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiY2FsbGluZ0xvbmciKTsKKworICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxvbmdQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMSkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibG9uZ1BhcmFtIiwgcmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgyKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJsb25nUGFyYW0iLCByZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDMpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImxvbmdQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kV2l0aFR5cGVQcm9tb3Rpb25zVG9JbnRXaXRoRXh0cmFQYXJhbSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIklzc3VlMzM4Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIlR5cGVQcm9tb3Rpb25zV2l0aEV4dHJhUGFyYW0iKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiY2FsbGluZ0ludCIpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW50UGFyYW0iLCByZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDEpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImludFBhcmFtIiwgcmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgyKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMykuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RXaXRoVHlwZVByb21vdGlvbnNUb1Nob3J0V2l0aEV4dHJhUGFyYW0oKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJJc3N1ZTMzOCIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJUeXBlUHJvbW90aW9uc1dpdGhFeHRyYVBhcmFtIik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImNhbGxpbmdTaG9ydCIpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygic2hvcnRQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMSkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygic2hvcnRQYXJhbSIsIHJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMikuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgzKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZFdpdGhUeXBlUHJvbW90aW9uc1RvQnl0ZVdpdGhFeHRyYVBhcmFtKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiSXNzdWUzMzgiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiVHlwZVByb21vdGlvbnNXaXRoRXh0cmFQYXJhbSIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJjYWxsaW5nQnl0ZSIpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCkuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYnl0ZVBhcmFtIiwgcmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgxKS5hc0V4cHJlc3Npb25TdG10KCkuZ2V0RXhwcmVzc2lvbigpLmFzTWV0aG9kQ2FsbEV4cHIoKTsKKyAgICAgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWZlcmVuY2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBleHByZXNzaW9uID0gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDIpLmFzRXhwcmVzc2lvblN0bXQoKS5nZXRFeHByZXNzaW9uKCkuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVmZXJlbmNlLmlzU29sdmVkKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMykuYXNFeHByZXNzaW9uU3RtdCgpLmdldEV4cHJlc3Npb24oKS5hc01ldGhvZENhbGxFeHByKCk7CisgICAgICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmZXJlbmNlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpLnNvbHZlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWZlcmVuY2UuaXNTb2x2ZWQoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2FsbE9uVGhpc0luQW5vbnltb3VzQ2xhc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJUaGlzSW5Bbm9ueW1vdXNDbGFzcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJCYXIiKTsKKworICAgICAgICBNZXRob2RDYWxsRXhwciBmb29DYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKGNsYXp6LCAiZm9vIikuZ2V0KCk7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZmVyZW5jZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShmb29DYWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZmVyZW5jZS5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRoaXNJbkFub255bW91c0NsYXNzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiVGhpc0luQW5vbnltb3VzQ2xhc3MiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQmFyIik7CisKKyAgICAgICAgVGhpc0V4cHIgdGhpc0V4cHJlc3Npb24gPSBOYXZpZ2F0b3IuZmluZE5vZGVPZkdpdmVuQ2xhc3MoY2xhenosIFRoaXNFeHByLmNsYXNzKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgdHlwZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5nZXRUeXBlKHRoaXNFeHByZXNzaW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSBpbnN0YW5jZW9mIEphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9RdWFsaWZpZWROYW1lUmVzb2x1dGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1F1YWxpZmllZE5hbWVSZXNvbHV0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9RdWFsaWZpZWROYW1lUmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZVJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVMb2NhbFZhcmlhYmxlSW5QYXJlbnRPZlBhcmVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIlF1YWxpZmllZE5hbWVUZXN0Iik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gcmVmZXJlbmNlc1RvRmllbGQgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJRdWFsaWZpZWROYW1lVGVzdCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAiZm9vMSIpOworICAgICAgICBOYW1lRXhwciBuYW1lRXhwciA9IE5hdmlnYXRvci5maW5kTmFtZUV4cHJlc3Npb24obWV0aG9kLCAicyIpLmdldCgpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUobmFtZUV4cHIpOworICAgICAgICBhc3NlcnRUcnVlKHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuU2Nhbm5lciIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N0YXRlbWVudENvbnRleHRSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3RhdGVtZW50Q29udGV4dFJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2YWJmNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N0YXRlbWVudENvbnRleHRSZXNvbHV0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFN0YXRlbWVudENvbnRleHRSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlTG9jYWxWYXJpYWJsZUluUGFyZW50T2ZQYXJlbnQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJMb2NhbFZhcmlhYmxlSW5QYXJlbnQiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkxvY2FsVmFyaWFibGVJblBhcmVudCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAiZm9vMSIpOworICAgICAgICBOYW1lRXhwciBuYW1lRXhwciA9IE5hdmlnYXRvci5maW5kTmFtZUV4cHJlc3Npb24obWV0aG9kLCAicyIpLmdldCgpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSkuc29sdmUobmFtZUV4cHIpOworICAgICAgICBhc3NlcnRUcnVlKHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFR5cGUoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUxvY2FsVmFyaWFibGVJblBhcmVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxvY2FsVmFyaWFibGVJblBhcmVudCIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHJlZmVyZW5jZXNUb0ZpZWxkID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTG9jYWxWYXJpYWJsZUluUGFyZW50Iik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QocmVmZXJlbmNlc1RvRmllbGQsICJmb28zIik7CisgICAgICAgIE5hbWVFeHByIG5hbWVFeHByID0gTmF2aWdhdG9yLmZpbmROYW1lRXhwcmVzc2lvbihtZXRob2QsICJzIikuZ2V0KCk7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShuYW1lRXhwcik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlTG9jYWxWYXJpYWJsZUluU2FtZVBhcmVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxvY2FsVmFyaWFibGVJblBhcmVudCIpOworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHJlZmVyZW5jZXNUb0ZpZWxkID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTG9jYWxWYXJpYWJsZUluUGFyZW50Iik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QocmVmZXJlbmNlc1RvRmllbGQsICJmb28yIik7CisgICAgICAgIE5hbWVFeHByIG5hbWVFeHByID0gTmF2aWdhdG9yLmZpbmROYW1lRXhwcmVzc2lvbihtZXRob2QsICJzIikuZ2V0KCk7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKS5zb2x2ZShuYW1lRXhwcik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlTG9jYWxBbmRTZXZlcmFsQW5uaWRhdGVkTGV2ZWxzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTG9jYWxWYXJpYWJsZUluUGFyZW50Iik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gcmVmZXJlbmNlc1RvRmllbGQgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJMb2NhbFZhcmlhYmxlSW5QYXJlbnQiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChyZWZlcmVuY2VzVG9GaWVsZCwgImZvbzQiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJhZGQiKS5nZXQoKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmUoY2FsbC5nZXRTY29wZSgpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8Q29tbWVudD4iLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworCisgICAgICAgIE1ldGhvZFVzYWdlIG1ldGhvZFVzYWdlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuc29sdmVNZXRob2RBc1VzYWdlKGNhbGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFkZCIsIG1ldGhvZFVzYWdlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlTWV0aG9kT25HZW5lcmljQ2xhc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJMb2NhbFZhcmlhYmxlSW5QYXJlbnQiKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiByZWZlcmVuY2VzVG9GaWVsZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkxvY2FsVmFyaWFibGVJblBhcmVudCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKHJlZmVyZW5jZXNUb0ZpZWxkLCAiZm9vNSIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgImFkZCIpLmdldCgpOworCisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZShjYWxsLmdldFNjb3BlKCkuZ2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxDb21tZW50PiIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisKKyAgICAgICAgTWV0aG9kVXNhZ2UgbWV0aG9kVXNhZ2UgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWRkIiwgbWV0aG9kVXNhZ2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlclRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZlNjAxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3ltYm9sU29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLkFic3RyYWN0VGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIFN5bWJvbFNvbHZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXJOZXdDb2RlOworICAgIHByaXZhdGUgU3ltYm9sU29sdmVyIHN5bWJvbFNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKworICAgICAgICBGaWxlIHNyY05ld0NvZGUgPSBhZGFwdFBhdGgobmV3IEZpbGUoInNyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlIikpOworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZSA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyTmV3Q29kZS5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjTmV3Q29kZSkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoYWRhcHRQYXRoKG5ldyBGaWxlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMiKSkpKTsKKyAgICAgICAgdHlwZVNvbHZlck5ld0NvZGUgPSBjb21iaW5lZFR5cGVTb2x2ZXJOZXdDb2RlOworCisgICAgICAgIHN5bWJvbFNvbHZlciA9IG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlck5ld0NvZGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sVW5leGlzdGluZygpIHsKKyAgICAgICAgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA9IChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlck5ld0NvZGUuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiByZXMgPSBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xJblR5cGUoY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgInVuZXhpc3RpbmciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xUb0RlY2xhcmVkRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVzID0gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sICJuYW1lIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaXNGaWVsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbFRvSW5oZXJpdGVkUHVibGljRmllbGQoKSB7CisgICAgICAgIEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSAoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVzID0gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGNvbnN0cnVjdG9yRGVjbGFyYXRpb24sICJOT0RFX0JZX0JFR0lOX1BPU0lUSU9OIik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXMuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaXNGaWVsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbFRvSW5oZXJpdGVkUHJpdmF0ZUZpZWxkKCkgeworICAgICAgICBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uID0gKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyTmV3Q29kZS5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlcyA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEluVHlwZShjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCAicGFyZW50Tm9kZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlcy5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVBhY2thZ2VMb2NhbENsYXNzKCkgeworICAgICAgICBhc3NlcnRUcnVlKHR5cGVTb2x2ZXJOZXdDb2RlLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkZvb0NsYXNzIikuaXNDbGFzcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9TeW1ib2xTb2x2ZXJXaXRoSmF2YXNzaXN0Q2xhc3NUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9TeW1ib2xTb2x2ZXJXaXRoSmF2YXNzaXN0Q2xhc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxMDNmMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlcldpdGhKYXZhc3Npc3RDbGFzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLkFic3RyYWN0VGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBTeW1ib2xTb2x2ZXJXaXRoSmF2YXNzaXN0Q2xhc3NUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKyAgICBwcml2YXRlIFN5bWJvbFNvbHZlciBzeW1ib2xTb2x2ZXI7CisgICAgcHJpdmF0ZSBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb25Db25jcmV0ZUNsYXNzOworICAgIHByaXZhdGUgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uU3ViQ2xhc3NPd25KYXI7CisgICAgcHJpdmF0ZSBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VyT3duSmFyOworICAgIHByaXZhdGUgSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uU3ViQ2xhc3NJbmNsdWRlZEphcjsKKyAgICBwcml2YXRlIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbkludGVyZmFjZVVzZXJJbmNsdWRlZEphcjsKKyAgICBwcml2YXRlIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvblN1YkNsYXNzRXhjbHVkZWRKYXI7CisgICAgcHJpdmF0ZSBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VyRXhjbHVkZWRKYXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aFRvTWFpbkphciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL21haW5famFyLmphciIpOworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aFRvSW5jbHVkZWRKYXIgPSBhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9pbmNsdWRlZF9qYXIvaW5jbHVkZWRfamFyLmphciIpOworICAgICAgICB0eXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcihuZXcgSmFyVHlwZVNvbHZlcihwYXRoVG9JbmNsdWRlZEphciksIG5ldyBKYXJUeXBlU29sdmVyKHBhdGhUb01haW5KYXIpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisKKyAgICAgICAgc3ltYm9sU29sdmVyID0gbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKTsKKworICAgICAgICBjbGFzc0RlY2xhcmF0aW9uQ29uY3JldGVDbGFzcyA9IChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXIuQ29uY3JldGVDbGFzcyIpOworICAgICAgICBjbGFzc0RlY2xhcmF0aW9uU3ViQ2xhc3NPd25KYXIgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyLlN1YkNsYXNzT3duSmFyIik7CisgICAgICAgIGNsYXNzRGVjbGFyYXRpb25TdWJDbGFzc0luY2x1ZGVkSmFyID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5TdWJDbGFzc0luY2x1ZGVkSmFyIik7CisgICAgICAgIGNsYXNzRGVjbGFyYXRpb25TdWJDbGFzc0V4Y2x1ZGVkSmFyID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5TdWJDbGFzc0V4Y2x1ZGVkSmFyIik7CisgICAgICAgIGNsYXNzRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VyT3duSmFyID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5JbnRlcmZhY2VVc2VyT3duSmFyIik7CisgICAgICAgIGNsYXNzRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIgPSAoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyLkludGVyZmFjZVVzZXJJbmNsdWRlZEphciIpOworICAgICAgICBjbGFzc0RlY2xhcmF0aW9uSW50ZXJmYWNlVXNlckV4Y2x1ZGVkSmFyID0gKEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5JbnRlcmZhY2VVc2VyRXhjbHVkZWRKYXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhblNvbHZlRmlyc3RPd25GaWVsZCgpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIlNUQVRJQ19TVFJJTkciLCBjbGFzc0RlY2xhcmF0aW9uQ29uY3JldGVDbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xJblR5cGVDYW5Tb2x2ZVNlY29uZE93bkZpZWxkKCkgeworICAgICAgICBhc3NlcnRDYW5Tb2x2ZVN5bWJvbCgiU0VDT05EX1NUUklORyIsIGNsYXNzRGVjbGFyYXRpb25Db25jcmV0ZUNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhbnRSZXNvbHZlTm9uRXhpc3RlbnRGaWVsZCgpIHsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlZFN5bWJvbCA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEluVHlwZShjbGFzc0RlY2xhcmF0aW9uQ29uY3JldGVDbGFzcywgIkZJRUxEX1RIQVRfRE9FU19OT1RfRVhJU1QiKTsKKworICAgICAgICBhc3NlcnRGYWxzZShzb2x2ZWRTeW1ib2wuaXNTb2x2ZWQoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvbHZlZFN5bWJvbC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHVuc29sdmVkIHN5bWJvbC4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiByZXF1ZXN0aW5nIENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiBvbiB1bnNvbHZlZCBTeW1ib2xSZWZlcm5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZUZpZWxkSW5TdXBlcigpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIlNVUEVSX0ZJRUxEIiwgY2xhc3NEZWNsYXJhdGlvblN1YkNsYXNzT3duSmFyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhblJlc29sdmVGaWVsZEluU3VwZXJJbmNsdWRlZEphcigpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIlNVUEVSX0ZJRUxEIiwgY2xhc3NEZWNsYXJhdGlvblN1YkNsYXNzSW5jbHVkZWRKYXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlVGhyb3dzRXhjZXB0aW9uT25SZXNvbHZlRmllbGRJblN1cGVyRXhjbHVkZWRKYXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xJblR5cGUoY2xhc3NEZWNsYXJhdGlvblN1YkNsYXNzRXhjbHVkZWRKYXIsICJTVVBFUl9GSUVMRCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbnNvbHZlZCBzeW1ib2wgOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5leGNsdWRlZF9qYXIuU3VwZXJDbGFzc0V4Y2x1ZGVkSmFyIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkV4Y2VwdGVkIE5vdEZvdW5kRXhjZXB0aW9uIHdyYXBwZWQgaW4gYSBSdW50aW1lRXhjZXB0aW9uLCBidXQgZ290IG5vIGV4Y2VwdGlvbi4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhblJlc29sdmVGaWVsZEluSW50ZXJmYWNlKCkgeworICAgICAgICBhc3NlcnRDYW5Tb2x2ZVN5bWJvbCgiSU5URVJGQUNFX0ZJRUxEIiwgY2xhc3NEZWNsYXJhdGlvbkludGVyZmFjZVVzZXJPd25KYXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZUZpZWxkSW5JbnRlcmZhY2VJbmNsdWRlZEphcigpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIklOVEVSRkFDRV9GSUVMRCIsIGNsYXNzRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlVGhyb3dzRXhjZXB0aW9uT25SZXNvbHZlRmllbGRJbkludGVyZmFjZUV4Y2x1ZGVkSmFyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGNsYXNzRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VyRXhjbHVkZWRKYXIsICJJTlRFUkZBQ0VfRklFTEQiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5zb2x2ZWQgc3ltYm9sIDogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMuZXhjbHVkZWRfamFyLkludGVyZmFjZUV4Y2x1ZGVkSmFyIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkV4Y2VwdGVkIE5vdEZvdW5kRXhjZXB0aW9uIHdyYXBwZWQgaW4gYSBSdW50aW1lRXhjZXB0aW9uLCBidXQgZ290IG5vIGV4Y2VwdGlvbi4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q2FuU29sdmVTeW1ib2woU3RyaW5nIHN5bWJvbE5hbWUsIEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgeworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVkU3ltYm9sID0gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGNsYXNzRGVjbGFyYXRpb24sIHN5bWJvbE5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUoc29sdmVkU3ltYm9sLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3ltYm9sTmFtZSwgc29sdmVkU3ltYm9sLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzRmllbGQoKS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlcldpdGhKYXZhc3Npc3RFbnVtVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3ltYm9sU29sdmVyV2l0aEphdmFzc2lzdEVudW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwZDJmMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlcldpdGhKYXZhc3Npc3RFbnVtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLlVuc29sdmVkU3ltYm9sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5BYnN0cmFjdFRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIFN5bWJvbFNvbHZlcldpdGhKYXZhc3Npc3RFbnVtVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyOworICAgIHByaXZhdGUgSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbkNvbmNyZXRlOworICAgIHByaXZhdGUgSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbkludGVyZmFjZVVzZXJPd25KYXI7CisgICAgcHJpdmF0ZSBKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uSW50ZXJmYWNlVXNlckluY2x1ZGVkSmFyOworICAgIHByaXZhdGUgSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbkludGVyZmFjZVVzZXJFeGNsdWRlZEphcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoVG9NYWluSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvbWFpbl9qYXIuamFyIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoVG9JbmNsdWRlZEphciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9pbmNsdWRlZF9qYXIuamFyIik7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBKYXJUeXBlU29sdmVyKHBhdGhUb0luY2x1ZGVkSmFyKSwgbmV3IEphclR5cGVTb2x2ZXIocGF0aFRvTWFpbkphciksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKworICAgICAgICBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpOworCisgICAgICAgIGVudW1EZWNsYXJhdGlvbkNvbmNyZXRlID0gKEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyLkNvbmNyZXRlRW51bSIpOworICAgICAgICBlbnVtRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VyT3duSmFyID0gKEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyLkVudW1JbnRlcmZhY2VVc2VyT3duSmFyIik7CisgICAgICAgIGVudW1EZWNsYXJhdGlvbkludGVyZmFjZVVzZXJJbmNsdWRlZEphciA9IChKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5FbnVtSW50ZXJmYWNlVXNlckluY2x1ZGVkSmFyIik7CisgICAgICAgIGVudW1EZWNsYXJhdGlvbkludGVyZmFjZVVzZXJFeGNsdWRlZEphciA9IChKYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5FbnVtSW50ZXJmYWNlVXNlckV4Y2x1ZGVkSmFyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xJblR5cGVDYW5SZXNvbHZlRmlyc3RFbnVtVmFsdWUoKSB7CisgICAgICAgIGFzc2VydENhblNvbHZlU3ltYm9sKCJFTlVNX1ZBTF9PTkUiLCBlbnVtRGVjbGFyYXRpb25Db25jcmV0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29sdmVTeW1ib2xJblR5cGVDYW5SZXNvbHZlU2Vjb25kRW51bVZhbHVlKCkgeworICAgICAgICBhc3NlcnRDYW5Tb2x2ZVN5bWJvbCgiRU5VTV9WQUxfVFdPIiwgZW51bURlY2xhcmF0aW9uQ29uY3JldGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZUZpcnN0Tm9ybWFsRmllbGQoKSB7CisgICAgICAgIGFzc2VydENhblNvbHZlU3ltYm9sKCJTVEFUSUNfU1RSSU5HIiwgZW51bURlY2xhcmF0aW9uQ29uY3JldGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZVNlY29uZE5vcm1hbEZpZWxkKCkgeworICAgICAgICBhc3NlcnRDYW5Tb2x2ZVN5bWJvbCgiU0VDT05EX1NUUklORyIsIGVudW1EZWNsYXJhdGlvbkNvbmNyZXRlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhbnRSZXNvbHZlTm9uRXhpc3RlbnRGaWVsZCgpIHsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlZFN5bWJvbCA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEluVHlwZShlbnVtRGVjbGFyYXRpb25Db25jcmV0ZSwgIkZJRUxEX1RIQVRfRE9FU19OT1RfRVhJU1QiKTsKKworICAgICAgICBhc3NlcnRGYWxzZShzb2x2ZWRTeW1ib2wuaXNTb2x2ZWQoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvbHZlZFN5bWJvbC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHVuc29sdmVkIHN5bWJvbC4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiByZXF1ZXN0aW5nIENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiBvbiB1bnNvbHZlZCBTeW1ib2xSZWZlcm5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZUZpZWxkSW5JbnRlcmZhY2UoKSB7CisgICAgICAgIGFzc2VydENhblNvbHZlU3ltYm9sKCJJTlRFUkZBQ0VfRklFTEQiLCBlbnVtRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VyT3duSmFyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhblJlc29sdmVGaWVsZEluSW50ZXJmYWNlSW5jbHVkZWRKYXIoKSB7CisgICAgICAgIGFzc2VydENhblNvbHZlU3ltYm9sKCJJTlRFUkZBQ0VfRklFTEQiLCBlbnVtRGVjbGFyYXRpb25JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlVGhyb3dzRXhjZXB0aW9uT25SZXNvbHZlRmllbGRJbkludGVyZmFjZUV4Y2x1ZGVkSmFyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGVudW1EZWNsYXJhdGlvbkludGVyZmFjZVVzZXJFeGNsdWRlZEphciwgIklOVEVSRkFDRV9GSUVMRCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbnNvbHZlZCBzeW1ib2wgOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5leGNsdWRlZF9qYXIuSW50ZXJmYWNlRXhjbHVkZWRKYXIiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhjZXB0ZWQgTm90Rm91bmRFeGNlcHRpb24gd3JhcHBlZCBpbiBhIFJ1bnRpbWVFeGNlcHRpb24sIGJ1dCBnb3Qgbm8gZXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDYW5Tb2x2ZVN5bWJvbChTdHJpbmcgc3ltYm9sTmFtZSwgSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbikgeworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVkU3ltYm9sID0gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGVudW1EZWNsYXJhdGlvbiwgc3ltYm9sTmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzb2x2ZWRTeW1ib2wuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzeW1ib2xOYW1lLCBzb2x2ZWRTeW1ib2wuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNGaWVsZCgpLmdldE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vU3ltYm9sU29sdmVyV2l0aEphdmFzc2lzdEludGVyZmFjZVRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlcldpdGhKYXZhc3Npc3RJbnRlcmZhY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0NWU4MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1N5bWJvbFNvbHZlcldpdGhKYXZhc3Npc3RJbnRlcmZhY2VUZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBTeW1ib2xTb2x2ZXJXaXRoSmF2YXNzaXN0SW50ZXJmYWNlVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisgICAgcHJpdmF0ZSBTeW1ib2xTb2x2ZXIgc3ltYm9sU29sdmVyOworICAgIHByaXZhdGUgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb25TdGFuZGFsb25lOworICAgIHByaXZhdGUgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb25TdWJJbnRlcmZhY2VPd25KYXI7CisgICAgcHJpdmF0ZSBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsYXJhdGlvblN1YkludGVyZmFjZUluY2x1ZGVkSmFyOworICAgIHByaXZhdGUgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb25TdWJJbnRlcmZhY2VFeGNsdWRlZEphcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoVG9NYWluSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvbWFpbl9qYXIuamFyIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoVG9JbmNsdWRlZEphciA9IGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9pbmNsdWRlZF9qYXIuamFyIik7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBKYXJUeXBlU29sdmVyKHBhdGhUb0luY2x1ZGVkSmFyKSwgbmV3IEphclR5cGVTb2x2ZXIocGF0aFRvTWFpbkphciksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKworICAgICAgICBzeW1ib2xTb2x2ZXIgPSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpOworCisgICAgICAgIGludGVyZmFjZURlY2xhcmF0aW9uU3RhbmRhbG9uZSA9IChKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyLlN0YW5kYWxvbmVJbnRlcmZhY2UiKTsKKyAgICAgICAgaW50ZXJmYWNlRGVjbGFyYXRpb25TdWJJbnRlcmZhY2VPd25KYXIgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5TdWJJbnRlcmZhY2VPd25KYXIiKTsKKyAgICAgICAgaW50ZXJmYWNlRGVjbGFyYXRpb25TdWJJbnRlcmZhY2VJbmNsdWRlZEphciA9IChKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZVNvbHZlci5zb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyLlN1YkludGVyZmFjZUluY2x1ZGVkSmFyIik7CisgICAgICAgIGludGVyZmFjZURlY2xhcmF0aW9uU3ViSW50ZXJmYWNlRXhjbHVkZWRKYXIgPSAoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVTb2x2ZXIuc29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phci5TdWJJbnRlcmZhY2VFeGNsdWRlZEphciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZUZpcnN0Tm9ybWFsRmllbGQoKSB7CisgICAgICAgIGFzc2VydENhblNvbHZlU3ltYm9sKCJTVEFUSUNfU1RSSU5HIiwgaW50ZXJmYWNlRGVjbGFyYXRpb25TdGFuZGFsb25lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhblJlc29sdmVTZWNvbmROb3JtYWxGaWVsZCgpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIlNFQ09ORF9TVFJJTkciLCBpbnRlcmZhY2VEZWNsYXJhdGlvblN0YW5kYWxvbmUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FudFJlc29sdmVOb25FeGlzdGVudEZpZWxkKCkgeworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gc29sdmVkU3ltYm9sID0gc3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGludGVyZmFjZURlY2xhcmF0aW9uU3RhbmRhbG9uZSwgIkZJRUxEX1RIQVRfRE9FU19OT1RfRVhJU1QiKTsKKworICAgICAgICBhc3NlcnRGYWxzZShzb2x2ZWRTeW1ib2wuaXNTb2x2ZWQoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvbHZlZFN5bWJvbC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHVuc29sdmVkIHN5bWJvbC4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiByZXF1ZXN0aW5nIENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbiBvbiB1bnNvbHZlZCBTeW1ib2xSZWZlcm5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlQ2FuUmVzb2x2ZUZpZWxkSW5FeHRlbmRlZEludGVyZmFjZU93bkphcigpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIklOVEVSRkFDRV9GSUVMRCIsIGludGVyZmFjZURlY2xhcmF0aW9uU3ViSW50ZXJmYWNlT3duSmFyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb2x2ZVN5bWJvbEluVHlwZUNhblJlc29sdmVGaWVsZEluRXh0ZW5kZWRJbnRlcmZhY2VJbmNsdWRlZEphcigpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVTeW1ib2woIklOVEVSRkFDRV9GSUVMRCIsIGludGVyZmFjZURlY2xhcmF0aW9uU3ViSW50ZXJmYWNlSW5jbHVkZWRKYXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvbHZlU3ltYm9sSW5UeXBlVGhyb3dzRXhjZXB0aW9uT25SZXNvbHZlRmllbGRJbkV4dGVuZGVkSW50ZXJmYWNlRXhjbHVkZWRKYXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xJblR5cGUoaW50ZXJmYWNlRGVjbGFyYXRpb25TdWJJbnRlcmZhY2VFeGNsdWRlZEphciwgIklOVEVSRkFDRV9GSUVMRCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbnNvbHZlZCBzeW1ib2wgOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5leGNsdWRlZF9qYXIuSW50ZXJmYWNlRXhjbHVkZWRKYXIiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRXhjZXB0ZWQgTm90Rm91bmRFeGNlcHRpb24gd3JhcHBlZCBpbiBhIFJ1bnRpbWVFeGNlcHRpb24sIGJ1dCBnb3Qgbm8gZXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDYW5Tb2x2ZVN5bWJvbChTdHJpbmcgc3ltYm9sTmFtZSwgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHNvbHZlZFN5bWJvbCA9IHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEluVHlwZShpbnRlcmZhY2VEZWNsYXJhdGlvbiwgc3ltYm9sTmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzb2x2ZWRTeW1ib2wuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzeW1ib2xOYW1lLCBzb2x2ZWRTeW1ib2wuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNGaWVsZCgpLmdldE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9WYXJpYWRpY1Jlc29sdXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9WYXJpYWRpY1Jlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjMGNhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL1ZhcmlhZGljUmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgVmFyaWFkaWNSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisJQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTcoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljc19pc3N1ZTciKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiU29tZUNvbGxlY3Rpb24iKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZm9vMyIpOworCisgICAgICAgIFJldHVyblN0bXQgc3RtdCA9IChSZXR1cm5TdG10KSBtZXRob2QuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIFJlc29sdmVkVHlwZSB0eXBlID0gamF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdHlwZS5pc1JlZmVyZW5jZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMaXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5Mb25nPiIsIHR5cGUuZGVzY3JpYmUoKSk7CisgICAgfQorCQorCUBUZXN0CisgICAgcHVibGljIHZvaWQgbWV0aG9kQ2FsbFdpdGhSZWZlcmVuY2VUeXBlQXNWYXJpZGljQXJndW1lbnRJc1NvbHZlZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk1ldGhvZENhbGxzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk1ldGhvZENhbGxzIik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgInZhcmlhZGljTWV0aG9kIik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxFeHByID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgInZhcmlhZGljTWV0aG9kIikuZ2V0KCk7CisgICAgICAgIAorICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZFVzYWdlIGNhbGxlZSA9IGphdmFQYXJzZXJGYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKGNhbGxFeHByKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJpYWRpY01ldGhvZCIsIGNhbGxlZS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVZhcmlhZGljTWV0aG9kV2l0aEdlbmVyaWNBcmd1bWVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk1ldGhvZENhbGxzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk1ldGhvZENhbGxzIik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImdlbmVyaWNNZXRob2RUZXN0Iik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGNhbGxFeHByID0gTmF2aWdhdG9yLmZpbmRNZXRob2RDYWxsKG1ldGhvZCwgInZhcmlhZGljV2l0aEdlbmVyaWNBcmciKS5nZXQoKTsKKworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZFVzYWdlIGNhbGxlZSA9IGphdmFQYXJzZXJGYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKGNhbGxFeHByKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJpYWRpY1dpdGhHZW5lcmljQXJnIiwgY2FsbGVlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RNb3N0U3BlY2lmaWNWYXJpYWRpYygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIk1ldGhvZENhbGxzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk1ldGhvZENhbGxzIik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgInZhcmlhZGljVGVzdCIpOworICAgICAgICBMaXN0PE1ldGhvZENhbGxFeHByPiBjYWxscyA9IG1ldGhvZC5maW5kQWxsKE1ldGhvZENhbGxFeHByLmNsYXNzKTsKKworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIikpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLCBuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjKSk7CisKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIE1ldGhvZFVzYWdlIGNhbGwxID0gamF2YVBhcnNlckZhY2FkZS5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbHMuZ2V0KDApKTsKKyAgICAgICAgTWV0aG9kVXNhZ2UgY2FsbDIgPSBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlTWV0aG9kQXNVc2FnZShjYWxscy5nZXQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIGNhbGwxLnJldHVyblR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgY2FsbDIucmV0dXJuVHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9WYXJUeXBlVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9WYXJUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZDBlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL1ZhclR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5WYXJUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5KYXZhU3ltYm9sU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC5KQVZBXzEwOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFZhclR5cGVUZXN0IHsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgIHByaXZhdGUgZmluYWwgSmF2YVBhcnNlciBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgLnNldExhbmd1YWdlTGV2ZWwoSkFWQV8xMCkKKyAgICAgICAgICAgIC5zZXRTeW1ib2xSZXNvbHZlcihuZXcgSmF2YVN5bWJvbFNvbHZlcih0eXBlU29sdmVyKSkpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlQVByaW1pdGl2ZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdCA9IGphdmFQYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHt2b2lkIHgoKXt2YXIgYWJjID0gMTt9fSIpKS5nZXRSZXN1bHQoKS5nZXQoKTsKKyAgICAgICAgVmFyVHlwZSB2YXJUeXBlID0gYXN0LmZpbmRGaXJzdChWYXJUeXBlLmNsYXNzKS5nZXQoKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgcmVzb2x2ZWRUeXBlID0gdmFyVHlwZS5yZXNvbHZlKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQsIHJlc29sdmVkVHlwZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlQVJlZmVyZW5jZVR5cGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3QgPSBqYXZhUGFyc2VyLnBhcnNlKFBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7dm9pZCB4KCl7dmFyIGFiYyA9IFwiXCI7fX0iKSkuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgICAgIFZhclR5cGUgdmFyVHlwZSA9IGFzdC5maW5kRmlyc3QoVmFyVHlwZS5jbGFzcykuZ2V0KCk7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHJlc29sdmVkVHlwZSA9IHZhclR5cGUucmVzb2x2ZSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpLCByZXNvbHZlZFR5cGUpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGZhaWxSZXNvbHZlTm9Jbml0aWFsaXplcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdCA9IGphdmFQYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHt2b2lkIHgoKXt2YXIgYWJjO319IikpLmdldFJlc3VsdCgpLmdldCgpOworICAgICAgICBWYXJUeXBlIHZhclR5cGUgPSBhc3QuZmluZEZpcnN0KFZhclR5cGUuY2xhc3MpLmdldCgpOworCisgICAgICAgIHZhclR5cGUucmVzb2x2ZSgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGZhaWxSZXNvbHZlV3JvbmdMb2NhdGlvbigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdCA9IGphdmFQYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHt2b2lkIHgodmFyIHgpe307fSIpKS5nZXRSZXN1bHQoKS5nZXQoKTsKKyAgICAgICAgVmFyVHlwZSB2YXJUeXBlID0gYXN0LmZpbmRGaXJzdChWYXJUeXBlLmNsYXNzKS5nZXQoKTsKKworICAgICAgICB2YXJUeXBlLnJlc29sdmUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHRSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTU5NDE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLmphdmFwYXJzZXIuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RBbWJpZ3VpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uTWV0aG9kVXNhZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFZhbHVlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRQcmltaXRpdmVUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db21waWxhdGlvblVuaXRDb250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5OdWxsVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLk1lbW9yeVR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCisvKioKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dFJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0UGFyZW50Rm9yVG9wQ2xhc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhUeXBlVmFyaWFibGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobnVsbCA9PSBjb250ZXh0LmdldFBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKSwgY29udGV4dC5nZXRQYXJlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZUV4aXN0aW5nR2VuZXJpY1R5cGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhUeXBlVmFyaWFibGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBhID0gY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKCJBIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gYiA9IGNvbnRleHQuc29sdmVHZW5lcmljVHlwZSgiQiIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IGMgPSBjb250ZXh0LnNvbHZlR2VuZXJpY1R5cGUoIkMiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIGEuZ2V0KCkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBhLmdldCgpLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIGIuZ2V0KCkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBiLmdldCgpLmlzVHlwZVZhcmlhYmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYy5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQyIsIGMuZ2V0KCkuZGVzY3JpYmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBjLmdldCgpLmlzVHlwZVZhcmlhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVVbmV4aXN0aW5nR2VuZXJpY1R5cGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhUeXBlVmFyaWFibGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBkID0gY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKCJEIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBkLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9EZWNsYXJlZEluc3RhbmNlRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhTeW1ib2xzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2woImkiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xSZWZlcnJpbmdUb0RlY2xhcmVkU3RhdGljRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhTeW1ib2xzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2woImoiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsb25nIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9Jbmhlcml0ZWRJbnN0YW5jZUZpZWxkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoU3ltYm9scyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlU3ltYm9sKCJrIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVN5bWJvbFJlZmVycmluZ1RvSW50ZXJmYWNlSW5oZXJpdGVkSW5zdGFuY2VGaWVsZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFN5bWJvbHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbCgibyIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVN5bWJvbFJlZmVycmluZ1RvSW5oZXJpdGVkU3RhdGljRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhTeW1ib2xzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2woIm0iLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFyIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9Vbmtub3duRWxlbWVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFN5bWJvbHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbCgienp6IiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVmLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xBc1ZhbHVlUmVmZXJyaW5nVG9EZWNsYXJlZEluc3RhbmNlRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhTeW1ib2xzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKCJpIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHJlZi5nZXQoKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVN5bWJvbEFzVmFsdWVSZWZlcnJpbmdUb0RlY2xhcmVkU3RhdGljRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhTeW1ib2xzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKCJqIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxvbmciLCByZWYuZ2V0KCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xBc1ZhbHVlUmVmZXJyaW5nVG9Jbmhlcml0ZWRJbnN0YW5jZUZpZWxkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoU3ltYm9scyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiByZWYgPSBjb250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZSgiayIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sQXNWYWx1ZVJlZmVycmluZ1RvSW50ZXJmYWNlSW5oZXJpdGVkSW5zdGFuY2VGaWVsZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFN5bWJvbHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoIm8iLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sQXNWYWx1ZVJlZmVycmluZ1RvSW5oZXJpdGVkU3RhdGljRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhTeW1ib2xzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKCJtIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoYXIiLCByZWYuZ2V0KCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xBc1ZhbHVlUmVmZXJyaW5nVG9Vbmtub3duRWxlbWVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFN5bWJvbHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoInp6eiIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVR5cGVSZWZUb0l0c2VsZigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgiQSIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVUeXBlUmVmVG9VbmV4aXN0aW5nKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoVHlwZXMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVUeXBlKCJGb28iLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVR5cGVSZWZUb09iamVjdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgiT2JqZWN0IiwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVUeXBlUmVmVG9KYXZhTGFuZ09iamVjdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgiamF2YS5sYW5nLk9iamVjdCIsIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVHlwZVJlZlRvSW50ZXJuYWxDbGFzcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgiQiIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVUeXBlUmVmVG9JbnRlcm5hbEVudW0oKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhUeXBlcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVR5cGUoIkUiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVHlwZVJlZlRvSW50ZXJuYWxPZkludGVybmFsQ2xhc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhUeXBlcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVR5cGUoIkMiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVR5cGVSZWZUb0Fub3RoZXJDbGFzc0luRmlsZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgiU3VwZXIiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVHlwZVJlZlRvUXVhbGlmaWVkSW50ZXJuYWxDbGFzcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgiQS5CIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVR5cGVSZWZUb1F1YWxpZmllZEludGVybmFsT2ZJbnRlcm5hbENsYXNzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoVHlwZXMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVUeXBlKCJCLkMiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVHlwZVJlZlRvTW9yZVF1YWxpZmllZEludGVybmFsT2ZJbnRlcm5hbENsYXNzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoVHlwZXMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVUeXBlKCJBLkIuQyIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RTaW1wbGVDYXNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoTWV0aG9kcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kKCJmb28wIiwgSW1tdXRhYmxlTGlzdC5vZigpLCBmYWxzZSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZGVjbGFyaW5nVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TnVtYmVyT2ZQYXJhbXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZE92ZXJyaWRlQ2FzZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aE1ldGhvZHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZU1ldGhvZCgiZm9vMSIsIEltbXV0YWJsZUxpc3Qub2YoKSwgZmFsc2UsIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmRlY2xhcmluZ1R5cGUoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE51bWJlck9mUGFyYW1zKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RJbmhlcml0ZWRDYXNlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoTWV0aG9kcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kKCJmb28yIiwgSW1tdXRhYmxlTGlzdC5vZigpLCBmYWxzZSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN1cGVyIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmRlY2xhcmluZ1R5cGUoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE51bWJlck9mUGFyYW1zKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RXaXRoUHJpbWl0aXZlUGFyYW1ldGVycygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aE1ldGhvZHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBSZXNvbHZlZFR5cGUgaW50VHlwZSA9IFJlc29sdmVkUHJpbWl0aXZlVHlwZS5JTlQ7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVNZXRob2QoImZvbzMiLCBJbW11dGFibGVMaXN0Lm9mKGludFR5cGUpLCBmYWxzZSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZGVjbGFyaW5nVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TnVtYmVyT2ZQYXJhbXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZFdpdGhNb3JlU3BlY2lhbGl6ZWRQYXJhbWV0ZXIoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhNZXRob2RzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHN0cmluZ1R5cGUgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kKCJmb280IiwgSW1tdXRhYmxlTGlzdC5vZihzdHJpbmdUeXBlKSwgZmFsc2UsIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmRlY2xhcmluZ1R5cGUoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE51bWJlck9mUGFyYW1zKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTWV0aG9kQW1iaWd1aXR5RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kV2l0aEFtYmlndW9zQ2FsbCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aE1ldGhvZHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZU1ldGhvZCgiZm9vNSIsIEltbXV0YWJsZUxpc3Qub2YoTnVsbFR5cGUuSU5TVEFOQ0UpLCBmYWxzZSwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RBc1VzYWdlU2ltcGxlQ2FzZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aE1ldGhvZHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gcmVmID0gY29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoImZvbzAiLCBJbW11dGFibGVMaXN0Lm9mKCksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIHJlZi5nZXQoKS5kZWNsYXJpbmdUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlZi5nZXQoKS5nZXROb1BhcmFtcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kQXNVc2FnZU92ZXJyaWRlQ2FzZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aE1ldGhvZHMiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkEiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gcmVmID0gY29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoImZvbzEiLCBJbW11dGFibGVMaXN0Lm9mKCksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIHJlZi5nZXQoKS5kZWNsYXJpbmdUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlZi5nZXQoKS5nZXROb1BhcmFtcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kQXNVc2FnZUluaGVyaXRlZENhc2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhNZXRob2RzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlZiA9IGNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKCJmb28yIiwgSW1tdXRhYmxlTGlzdC5vZigpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN1cGVyIiwgcmVmLmdldCgpLmRlY2xhcmluZ1R5cGUoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVmLmdldCgpLmdldE5vUGFyYW1zKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RBc1VzYWdlV2l0aFByaW1pdGl2ZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhNZXRob2RzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIGludFR5cGUgPSBSZXNvbHZlZFByaW1pdGl2ZVR5cGUuSU5UOworCisgICAgICAgIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZSgiZm9vMyIsIEltbXV0YWJsZUxpc3Qub2YoaW50VHlwZSksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIHJlZi5nZXQoKS5kZWNsYXJpbmdUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZi5nZXQoKS5nZXROb1BhcmFtcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kQXNVc2FnZVdpdGhNb3JlU3BlY2lhbGl6ZWRQYXJhbWV0ZXIoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDbGFzc1dpdGhNZXRob2RzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0KGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgUmVzb2x2ZWRUeXBlIHN0cmluZ1R5cGUgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKFN0cmluZy5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZSgiZm9vNCIsIEltbXV0YWJsZUxpc3Qub2Yoc3RyaW5nVHlwZSksIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSIsIHJlZi5nZXQoKS5kZWNsYXJpbmdUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZi5nZXQoKS5nZXROb1BhcmFtcygpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE1ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZEFzVXNhZ2VXaXRoQW1iaWd1b3NDYWxsKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoTWV0aG9kcyIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPE1ldGhvZFVzYWdlPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZSgiZm9vNSIsIEltbXV0YWJsZUxpc3Qub2YoTnVsbFR5cGUuSU5TVEFOQ0UpLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9Db21waWxhdGlvblVuaXRDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL2phdmFwYXJzZXIvY29udGV4dHMvQ29tcGlsYXRpb25Vbml0Q29udGV4dFJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3OWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL2phdmFwYXJzZXIvY29udGV4dHMvQ29tcGlsYXRpb25Vbml0Q29udGV4dFJlc29sdXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5qYXZhcGFyc2VyLmNvbnRleHRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQ29tcGlsYXRpb25Vbml0Q29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTnVsbFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuTWVtb3J5VHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdENvbnRleHRSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFBhcmVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVWYXJpYWJsZXMiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbXBpbGF0aW9uVW5pdENvbnRleHQoY3UsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIGFzc2VydFRydWUobnVsbCA9PSBjb250ZXh0LmdldFBhcmVudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlRXhpc3RpbmdHZW5lcmljVHlwZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzV2l0aFR5cGVWYXJpYWJsZXMiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbXBpbGF0aW9uVW5pdENvbnRleHQoY3UsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPFJlc29sdmVkVHlwZT4gYSA9IGNvbnRleHQuc29sdmVHZW5lcmljVHlwZSgiQSIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBPcHRpb25hbDxSZXNvbHZlZFR5cGU+IGIgPSBjb250ZXh0LnNvbHZlR2VuZXJpY1R5cGUoIkIiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBjID0gY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKCJDIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBiLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVW5leGlzdGluZ0dlbmVyaWNUeXBlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ2xhc3NXaXRoVHlwZVZhcmlhYmxlcyIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0Q29udGV4dChjdSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8UmVzb2x2ZWRUeXBlPiBkID0gY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKCJEIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBkLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9TdGF0aWNhbGx5SW1wb3J0ZWRWYWx1ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ29tcGlsYXRpb25Vbml0U3ltYm9scyIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0Q29udGV4dChjdSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIHR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgdHlwZVNvbHZlci5hZGQobmV3IEphclR5cGVTb2x2ZXIoYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvanVuaXQtNC44LjEuamFyIikpKTsKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2woIm91dCIsIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEuaW8uUHJpbnRTdHJlYW0iLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVN5bWJvbFJlZmVycmluZ1RvU3RhdGljYWxseUltcG9ydGVkVXNpbmdBc3Rlcmlza1ZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDb21waWxhdGlvblVuaXRTeW1ib2xzIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKTsKKworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgdHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICB0eXBlU29sdmVyLmFkZChuZXcgSmFyVHlwZVNvbHZlcihhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qdW5pdC00LjguMS5qYXIiKSkpOworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbCgiZXJyIiwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5pby5QcmludFN0cmVhbSIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9TdGF0aWNGaWVsZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ29tcGlsYXRpb25Vbml0U3ltYm9scyIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0Q29udGV4dChjdSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBSZXNvbHZlZFZhbHVlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2woImphdmEubGFuZy5TeXN0ZW0ub3V0IiwgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEuaW8uUHJpbnRTdHJlYW0iLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVN5bWJvbEFzVmFsdWVSZWZlcnJpbmdUb1N0YXRpY2FsbHlJbXBvcnRlZFZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDb21waWxhdGlvblVuaXRTeW1ib2xzIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKTsKKworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgdHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICB0eXBlU29sdmVyLmFkZChuZXcgSmFyVHlwZVNvbHZlcihhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qdW5pdC00LjguMS5qYXIiKSkpOworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoIm91dCIsIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmlvLlByaW50U3RyZWFtIiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sQXNWYWx1ZVJlZmVycmluZ1RvU3RhdGljYWxseUltcG9ydGVkVXNpbmdBc3Rlcmlza1ZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDb21waWxhdGlvblVuaXRTeW1ib2xzIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKTsKKworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgdHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworICAgICAgICB0eXBlU29sdmVyLmFkZChuZXcgSmFyVHlwZVNvbHZlcihhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qdW5pdC00LjguMS5qYXIiKSkpOworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoImVyciIsIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmlvLlByaW50U3RyZWFtIiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sQXNWYWx1ZVJlZmVycmluZ1RvU3RhdGljRmllbGQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNvbXBpbGF0aW9uVW5pdFN5bWJvbHMiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbXBpbGF0aW9uVW5pdENvbnRleHQoY3UsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiByZWYgPSBjb250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZSgiamF2YS5sYW5nLlN5c3RlbS5vdXQiLCBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEuaW8uUHJpbnRTdHJlYW0iLCByZWYuZ2V0KCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVUeXBlSW5TYW1lUGFja2FnZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNvbXBpbGF0aW9uVW5pdFdpdGhJbXBvcnRzIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKTsKKworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiBvdGhlckNsYXNzID0gbW9jayhSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIHdoZW4ob3RoZXJDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpLnRoZW5SZXR1cm4oImNvbS5mb28uT3RoZXJDbGFzc0luU2FtZVBhY2thZ2UiKTsKKyAgICAgICAgTWVtb3J5VHlwZVNvbHZlciBtZW1vcnlUeXBlU29sdmVyID0gbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKTsKKyAgICAgICAgbWVtb3J5VHlwZVNvbHZlci5hZGREZWNsYXJhdGlvbigiY29tLmZvby5PdGhlckNsYXNzSW5TYW1lUGFja2FnZSIsIG90aGVyQ2xhc3MpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVR5cGUoIk90aGVyQ2xhc3NJblNhbWVQYWNrYWdlIiwgbWVtb3J5VHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmZvby5PdGhlckNsYXNzSW5TYW1lUGFja2FnZSIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVUeXBlSW1wb3J0ZWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNvbXBpbGF0aW9uVW5pdFdpdGhJbXBvcnRzIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRUeXBlRGVjbGFyYXRpb24+IHJlZiA9IGNvbnRleHQuc29sdmVUeXBlKCJBc3NlcnQiLCBuZXcgSmFyVHlwZVNvbHZlcihhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qdW5pdC00LjguMS5qYXIiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5qdW5pdC5Bc3NlcnQiLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlVHlwZU5vdEltcG9ydGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJDb21waWxhdGlvblVuaXRXaXRoSW1wb3J0cyIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0Q29udGV4dChjdSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgU3ltYm9sUmVmZXJlbmNlPFJlc29sdmVkVHlwZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlVHlwZSgib3JnLmp1bml0LkFzc3VtZSIsIG5ldyBKYXJUeXBlU29sdmVyKGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2p1bml0LTQuOC4xLmphciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib3JnLmp1bml0LkFzc3VtZSIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVNZXRob2RTdGF0aWNhbGx5SW1wb3J0ZWRXaXRoQXN0ZXJpc2soKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNvbXBpbGF0aW9uVW5pdFdpdGhJbXBvcnRzIik7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb21waWxhdGlvblVuaXRDb250ZXh0KGN1LCB0eXBlU29sdmVyKTsKKworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgdHlwZVNvbHZlci5hZGQobmV3IEphclR5cGVTb2x2ZXIoYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvanVuaXQtNC44LjEuamFyIikpKTsKKyAgICAgICAgdHlwZVNvbHZlci5hZGQobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlTWV0aG9kKCJhc3NlcnRGYWxzZSIsIEltbXV0YWJsZUxpc3Qub2YoUmVzb2x2ZWRQcmltaXRpdmVUeXBlLkJPT0xFQU4pLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXNzZXJ0RmFsc2UiLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROdW1iZXJPZlBhcmFtcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKDApLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbSgwKS5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU1ldGhvZFN0YXRpY2FsbHlJbXBvcnRlZFdpdGhvdXRBc3RlcmlzaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQ29tcGlsYXRpb25Vbml0U3ltYm9scyIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0Q29udGV4dChjdSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgQ29tYmluZWRUeXBlU29sdmVyKCk7CisgICAgICAgIHR5cGVTb2x2ZXIuYWRkKG5ldyBKYXJUeXBlU29sdmVyKGFkYXB0UGF0aCgic3JjL3Rlc3QvcmVzb3VyY2VzL2p1bml0LTQuOC4xLmphciIpKSk7CisgICAgICAgIHR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8UmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZU1ldGhvZCgiYXNzZXJ0RXF1YWxzIiwgSW1tdXRhYmxlTGlzdC5vZihOdWxsVHlwZS5JTlNUQU5DRSwgTnVsbFR5cGUuSU5TVEFOQ0UpLCBmYWxzZSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXNzZXJ0RXF1YWxzIiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TnVtYmVyT2ZQYXJhbXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbSgwKS5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKDEpLmdldFR5cGUoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL0VudW1EZWNsYXJhdGlvbkNvbnRleHRSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9FbnVtRGVjbGFyYXRpb25Db250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FmMzBlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9FbnVtRGVjbGFyYXRpb25Db250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLmphdmFwYXJzZXIuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuRW51bURlY2xhcmF0aW9uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuTWVtb3J5VHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqLworcHVibGljIGNsYXNzIEVudW1EZWNsYXJhdGlvbkNvbnRleHRSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9EZWNsYXJlZEluc3RhbmNlRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJBbkVudW0iKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kRW51bShjdSwgIk15RW51bSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgRW51bURlY2xhcmF0aW9uQ29udGV4dChlbnVtRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgUmVzb2x2ZWRWYWx1ZURlY2xhcmF0aW9uPiByZWYgPSBjb250ZXh0LnNvbHZlU3ltYm9sKCJpIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3ltYm9sUmVmZXJyaW5nVG9EZWNsYXJlZFN0YXRpY0ZpZWxkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQW5FbnVtIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZEVudW0oY3UsICJNeUVudW0iKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IEVudW1EZWNsYXJhdGlvbkNvbnRleHQoZW51bURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbCgiaiIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxvbmciLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xSZWZlcnJpbmdUb1ZhbHVlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQW5FbnVtIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZEVudW0oY3UsICJNeUVudW0iKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IEVudW1EZWNsYXJhdGlvbkNvbnRleHQoZW51bURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBTeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIFJlc29sdmVkVmFsdWVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbCgiRTEiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeUVudW0iLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xBc1ZhbHVlUmVmZXJyaW5nVG9EZWNsYXJlZEluc3RhbmNlRmllbGQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJBbkVudW0iKTsKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gPSBOYXZpZ2F0b3IuZGVtYW5kRW51bShjdSwgIk15RW51bSIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgRW51bURlY2xhcmF0aW9uQ29udGV4dChlbnVtRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiByZWYgPSBjb250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZSgiaSIsIG5ldyBNZW1vcnlUeXBlU29sdmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCByZWYuZ2V0KCkuZ2V0VHlwZSgpLmRlc2NyaWJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTeW1ib2xBc1ZhbHVlUmVmZXJyaW5nVG9EZWNsYXJlZFN0YXRpY0ZpZWxkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQW5FbnVtIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZEVudW0oY3UsICJNeUVudW0iKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IEVudW1EZWNsYXJhdGlvbkNvbnRleHQoZW51bURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoImoiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibG9uZyIsIHJlZi5nZXQoKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZVN5bWJvbEFzVmFsdWVSZWZlcnJpbmdUb1ZhbHVlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiQW5FbnVtIik7CisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uID0gTmF2aWdhdG9yLmRlbWFuZEVudW0oY3UsICJNeUVudW0iKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IEVudW1EZWNsYXJhdGlvbkNvbnRleHQoZW51bURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKTsKKworICAgICAgICBPcHRpb25hbDxWYWx1ZT4gcmVmID0gY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoIkUxIiwgbmV3IE1lbW9yeVR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk15RW51bSIsIHJlZi5nZXQoKS5nZXRUeXBlKCkuZGVzY3JpYmUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL0ZpZWxkQWNjZXNzQ29udGV4dFJlc29sdXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL0ZpZWxkQWNjZXNzQ29udGV4dFJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzNzM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL2phdmFwYXJzZXIvY29udGV4dHMvRmllbGRBY2Nlc3NDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uamF2YXBhcnNlci5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLk1ldGhvZFVzYWdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYWx0ZSBMYW5na2FiZWwKKyAqLworcHVibGljIGNsYXNzIEZpZWxkQWNjZXNzQ29udGV4dFJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlTWV0aG9kQ2FsbEluRmllbGRBY2Nlc3NDb250ZXh0KCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTWV0aG9kQ2FsbHMiKTsKKworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTWV0aG9kQ2FsbHMiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImJhcjIiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSBOYXZpZ2F0b3IuZmluZE1ldGhvZENhbGwobWV0aG9kLCAiZ2V0U2VsZiIpLmdldCgpOworCisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBNZXRob2RVc2FnZSBtZXRob2RVc2FnZSA9IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShtZXRob2RDYWxsRXhwcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZFVzYWdlLmdldE5hbWUoKSwgImdldFNlbGYiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL0xhbWJkYUV4cHJDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL2phdmFwYXJzZXIvY29udGV4dHMvTGFtYmRhRXhwckNvbnRleHRSZXNvbHV0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTUxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL0xhbWJkYUV4cHJDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLmphdmFwYXJzZXIuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkxhbWJkYUV4cHJDb250ZXh0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1hbHRlIExhbmdrYWJlbAorICovCitwdWJsaWMgY2xhc3MgTGFtYmRhRXhwckNvbnRleHRSZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlUGFyYW1ldGVyT2ZMYW1iZGFJbk1ldGhvZENhbGxFeHByKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTGFtYmRhIik7CisKKyAgICAgICAgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkFnZW5kYSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAibGFtYmRhTWFwIik7CisgICAgICAgIFJldHVyblN0bXQgcmV0dXJuU3RtdCA9IE5hdmlnYXRvci5maW5kUmV0dXJuU3RtdChtZXRob2QpOworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IChNZXRob2RDYWxsRXhwcikgcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisgICAgICAgIExhbWJkYUV4cHIgbGFtYmRhRXhwciA9IChMYW1iZGFFeHByKSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKS5nZXQoMCk7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IExhbWJkYUV4cHJDb250ZXh0KGxhbWJkYUV4cHIsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIE9wdGlvbmFsPFZhbHVlPiByZWYgPSBjb250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZSgicCIsIHR5cGVTb2x2ZXIpOworICAgICAgICBhc3NlcnRUcnVlKHJlZi5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPyBzdXBlciBqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlUGFyYW1ldGVyT2ZMYW1iZGFJbkZpZWxkRGVjbCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkxhbWJkYSIpOworCisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJBZ2VuZGEiKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIGZpZWxkID0gTmF2aWdhdG9yLmRlbWFuZEZpZWxkKGNsYXp6LCAiZnVuY3Rpb25hbCIpOworICAgICAgICBMYW1iZGFFeHByIGxhbWJkYUV4cHIgPSAoTGFtYmRhRXhwcikgZmllbGQuZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKTsKKworICAgICAgICBGaWxlIHNyYyA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMiKTsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKSk7CisgICAgICAgIGNvbWJpbmVkVHlwZVNvbHZlci5hZGQobmV3IEphdmFQYXJzZXJUeXBlU29sdmVyKGFkYXB0UGF0aChzcmMpKSk7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IExhbWJkYUV4cHJDb250ZXh0KGxhbWJkYUV4cHIsIGNvbWJpbmVkVHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKCJwIiwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlUGFyYW1ldGVyT2ZMYW1iZGFJblZhckRlY2woKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJMYW1iZGEiKTsKKworICAgICAgICBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiQWdlbmRhIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhenosICJ0ZXN0RnVuY3Rpb25hbFZhciIpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyRGVjbCA9IE5hdmlnYXRvci5kZW1hbmRWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGhvZCwgImEiKS5nZXQoKTsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gKExhbWJkYUV4cHIpIHZhckRlY2wuZ2V0SW5pdGlhbGl6ZXIoKS5nZXQoKTsKKworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIikpOworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgY29tYmluZWRUeXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcigpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjKSk7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IExhbWJkYUV4cHJDb250ZXh0KGxhbWJkYUV4cHIsIGNvbWJpbmVkVHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8VmFsdWU+IHJlZiA9IGNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKCJwIiwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVmLmdldCgpLmdldFR5cGUoKS5kZXNjcmliZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL01ldGhvZENhbGxFeHByQ29udGV4dFJlc29sdXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL01ldGhvZENhbGxFeHByQ29udGV4dFJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkYWY3MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL2phdmFwYXJzZXIvY29udGV4dHMvTWV0aG9kQ2FsbEV4cHJDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLmphdmFwYXJzZXIuY29udGV4dHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5NZXRob2RVc2FnZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBNYWx0ZSBMYW5na2FiZWwKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZENhbGxFeHByQ29udGV4dFJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisgICAgcHJpdmF0ZSBNZXRob2RDYWxsRXhwciBnZXRNZXRob2RDYWxsRXhwcihTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIGNhbGxpbmdNZXRob2ROYW1lKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJNZXRob2RDYWxscyIpOworCisgICAgICAgIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJNZXRob2RDYWxscyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCBtZXRob2ROYW1lKTsKKyAgICAgICAgcmV0dXJuIE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsIGNhbGxpbmdNZXRob2ROYW1lKS5nZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbWJpbmVkVHlwZVNvbHZlciBjcmVhdGVUeXBlU29sdmVyKCkgeworICAgICAgICBGaWxlIHNyYyA9IGFkYXB0UGF0aChuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIikpOworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgY29tYmluZWRUeXBlU29sdmVyID0gbmV3IENvbWJpbmVkVHlwZVNvbHZlcigpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgSmF2YVBhcnNlclR5cGVTb2x2ZXIoc3JjKSk7CisgICAgICAgIHJldHVybiBjb21iaW5lZFR5cGVTb2x2ZXI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzb2x2ZU5lc3RlZE1ldGhvZENhbGxFeHByQ29udGV4dFdpdGhvdXRTY29wZSgpIHsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSBnZXRNZXRob2RDYWxsRXhwcigiYmFyMSIsICJmb28iKTsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBjcmVhdGVUeXBlU29sdmVyKCk7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IE1ldGhvZENhbGxFeHByQ29udGV4dChtZXRob2RDYWxsRXhwciwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlZiA9IGNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXRob2RDYWxscyIsIHJlZi5nZXQoKS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlR2VuZXJpY01ldGhvZENhbGxNdXN0VXNlUHJvdmlkZWRUeXBlQXJncygpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVHZW5lcmljTWV0aG9kQ2FsbE11c3RVc2VQcm92aWRlZFR5cGVBcmdzKCJnZW5lcmljTWV0aG9kMCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVTdGF0aWNHZW5lcmljTWV0aG9kQ2FsbE11c3RVc2VQcm92aWRlZFR5cGVBcmdzKCkgeworICAgICAgICBhc3NlcnRDYW5Tb2x2ZUdlbmVyaWNNZXRob2RDYWxsTXVzdFVzZVByb3ZpZGVkVHlwZUFyZ3MoInN0YXRpY0dlbmVyaWNNZXRob2QwIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENhblNvbHZlR2VuZXJpY01ldGhvZENhbGxNdXN0VXNlUHJvdmlkZWRUeXBlQXJncyhTdHJpbmcgY2FsbE1ldGhvZE5hbWUpIHsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbWV0aG9kQ2FsbEV4cHIgPSBnZXRNZXRob2RDYWxsRXhwcigiZ2VuZXJpY01ldGhvZFRlc3QiLCBjYWxsTWV0aG9kTmFtZSk7CisgICAgICAgIENvbWJpbmVkVHlwZVNvbHZlciB0eXBlU29sdmVyID0gY3JlYXRlVHlwZVNvbHZlcigpOworCisgICAgICAgIE1ldGhvZENhbGxFeHByQ29udGV4dCBjb250ZXh0ID0gbmV3IE1ldGhvZENhbGxFeHByQ29udGV4dChtZXRob2RDYWxsRXhwciwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgT3B0aW9uYWw8TWV0aG9kVXNhZ2U+IHJlZiA9IGNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKGNhbGxNZXRob2ROYW1lLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgdHlwZVNvbHZlcik7CisgICAgICAgIGFzc2VydFRydWUocmVmLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXRob2RDYWxscyIsIHJlZi5nZXQoKS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImphdmEubGFuZy5JbnRlZ2VyIiksIHJlZi5nZXQoKS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFR5cGVzKCkuc3RyZWFtKCkubWFwKHR5IC0+IHR5LmFzUmVmZXJlbmNlVHlwZSgpLmRlc2NyaWJlKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVHZW5lcmljTWV0aG9kQ2FsbENhbkluZmVyRnJvbUFyZ3VtZW50cygpIHsKKyAgICAgICAgYXNzZXJ0Q2FuU29sdmVHZW5lcmljTWV0aG9kQ2FsbENhbkluZmVyRnJvbUFyZ3VtZW50cygiZ2VuZXJpY01ldGhvZDEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvbHZlU3RhdGljR2VuZXJpY01ldGhvZENhbGxDYW5JbmZlckZyb21Bcmd1bWVudHMoKSB7CisgICAgICAgIGFzc2VydENhblNvbHZlR2VuZXJpY01ldGhvZENhbGxDYW5JbmZlckZyb21Bcmd1bWVudHMoInN0YXRpY0dlbmVyaWNNZXRob2QxIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENhblNvbHZlR2VuZXJpY01ldGhvZENhbGxDYW5JbmZlckZyb21Bcmd1bWVudHMoU3RyaW5nIGNhbGxNZXRob2ROYW1lKSB7CisgICAgICAgIE1ldGhvZENhbGxFeHByIG1ldGhvZENhbGxFeHByID0gZ2V0TWV0aG9kQ2FsbEV4cHIoImdlbmVyaWNNZXRob2RUZXN0IiwgY2FsbE1ldGhvZE5hbWUpOworICAgICAgICBDb21iaW5lZFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IGNyZWF0ZVR5cGVTb2x2ZXIoKTsKKworICAgICAgICBNZXRob2RDYWxsRXhwckNvbnRleHQgY29udGV4dCA9IG5ldyBNZXRob2RDYWxsRXhwckNvbnRleHQobWV0aG9kQ2FsbEV4cHIsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFJlc29sdmVkUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uIHN0cmluZ1R5cGUgPSB0eXBlU29sdmVyLnNvbHZlVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOworCisgICAgICAgIExpc3Q8UmVzb2x2ZWRUeXBlPiBhcmd1bWVudHNUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBhcmd1bWVudHNUeXBlcy5hZGQobmV3IFJlZmVyZW5jZVR5cGVJbXBsKHN0cmluZ1R5cGUsIHR5cGVTb2x2ZXIpKTsKKworICAgICAgICBPcHRpb25hbDxNZXRob2RVc2FnZT4gcmVmID0gY29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbE1ldGhvZE5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWYuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1ldGhvZENhbGxzIiwgcmVmLmdldCgpLmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiamF2YS5sYW5nLlN0cmluZyIpLCByZWYuZ2V0KCkudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRUeXBlcygpLnN0cmVhbSgpLm1hcCh0eSAtPiB0eS5hc1JlZmVyZW5jZVR5cGUoKS5kZXNjcmliZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2NvbnRleHRzL01ldGhvZENvbnRleHRSZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9NZXRob2RDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q5NzgwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vamF2YXBhcnNlci9jb250ZXh0cy9NZXRob2RDb250ZXh0UmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uamF2YXBhcnNlci5jb250ZXh0czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENvbnRleHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQWJzdHJhY3RSZXNvbHV0aW9uVGVzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuTWVtb3J5VHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hbHRlIExhbmdrYWJlbAorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kQ29udGV4dFJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIFR5cGVTb2x2ZXIgdHlwZVNvbHZlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc29sdmVUeXBlUmVmVG9Mb2NhbENsYXNzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiTWV0aG9kV2l0aFR5cGVzIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjZCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk1haW4iKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWQgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNkLCAibWV0aG9kV2l0aExvY2FsVHlwZXMiKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IE1ldGhvZENvbnRleHQobWQsIHR5cGVTb2x2ZXIpOworCisgICAgICAgIFN5bWJvbFJlZmVyZW5jZTxSZXNvbHZlZFR5cGVEZWNsYXJhdGlvbj4gcmVmID0gY29udGV4dC5zb2x2ZVR5cGUoIkxvY2FsQ2xhc3MiLCBuZXcgTWVtb3J5VHlwZVNvbHZlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlZi5pc1NvbHZlZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZVBhcmFtZXRlclJlc29sdXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9qYXZhcGFyc2VyL2RlY2xhcmF0aW9ucy9KYXZhUGFyc2VyVHlwZVBhcmFtZXRlclJlc29sdXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyZTc3MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL2phdmFwYXJzZXIvZGVjbGFyYXRpb25zL0phdmFQYXJzZXJUeXBlUGFyYW1ldGVyUmVzb2x1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLmphdmFwYXJzZXIuZGVjbGFyYXRpb25zOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRNZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi5kZWNsYXJhdGlvbnMuUmVzb2x2ZWRSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkFic3RyYWN0UmVzb2x1dGlvblRlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlclJlc29sdXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZXNvbHV0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEdlbmVyaWNBcmd1bWVudHMoU3RyaW5nIGNvbnRhaW5pbmdNZXRob2ROYW1lKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJHZW5lcmljTWV0aG9kQXJndW1lbnRzIik7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzRGVjbCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkdlbmVyaWNNZXRob2RBcmd1bWVudHMiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gY29udGFpbmluZ01ldGhvZCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhc3NEZWNsLCBjb250YWluaW5nTWV0aG9kTmFtZSk7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGJhciA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChjb250YWluaW5nTWV0aG9kLCAiYXBwbHkiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGphdmFQYXJzZXJGYWNhZGUuc29sdmUoYmFyKS5pc1NvbHZlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdlbmVyaWNNZXRob2RXaXRoR2VuZXJpY0NsYXNzQmFzZWRBcmd1bWVudCgpIHsKKyAgICAgICAgdGVzdEdlbmVyaWNBcmd1bWVudHMoInVzZUNhc2UxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmljTWV0aG9kV2l0aEdlbmVyaWNDbGFzc0FyZ3VtZW50KCkgeworICAgICAgICB0ZXN0R2VuZXJpY0FyZ3VtZW50cygidXNlQ2FzZTIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVkT25NZXRob2RQb3NpdGl2ZUNhc2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJNZXRob2RUeXBlUGFyYW1ldGVyIik7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpOworICAgICAgICBKYXZhUGFyc2VyRmFjYWRlIGphdmFQYXJzZXJGYWNhZGUgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzRGVjbCA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIkZvbyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGFzc0RlY2wsICJ1c2FnZSIpOworICAgICAgICBNZXRob2RDYWxsRXhwciBjYWxsVG9Gb28gPSAoTWV0aG9kQ2FsbEV4cHIpIE5hdmlnYXRvci5maW5kUmV0dXJuU3RtdChtZXRob2REZWNsKS5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisgICAgICAgIFJlc29sdmVkTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBqYXZhUGFyc2VyRmFjYWRlLnNvbHZlKGNhbGxUb0ZvbykuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCk7CisgICAgICAgIGZvciAoUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHAgOiBtZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRwIGluc3RhbmNlb2YgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDIiwgdHAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB0cC5kZWNsYXJlZE9uTWV0aG9kKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cC5kZWNsYXJlZE9uVHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVjbGFyZWRPbk1ldGhvZE5lZ2F0aXZlQ2FzZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIkNsYXNzVHlwZVBhcmFtZXRlciIpOworICAgICAgICBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICAgICAgSmF2YVBhcnNlckZhY2FkZSBqYXZhUGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0RlY2wgPSBOYXZpZ2F0b3IuZGVtYW5kQ2xhc3MoY3UsICJGb28iKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IE5hdmlnYXRvci5kZW1hbmRNZXRob2QoY2xhc3NEZWNsLCAidXNhZ2UiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbFRvRm9vID0gKE1ldGhvZENhbGxFeHByKSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kRGVjbCkuZ2V0RXhwcmVzc2lvbigpLmdldCgpOworICAgICAgICBSZXNvbHZlZE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gamF2YVBhcnNlckZhY2FkZS5zb2x2ZShjYWxsVG9Gb28pLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpOworICAgICAgICBSZXNvbHZlZFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBtZXRob2REZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSBpbnN0YW5jZW9mIEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApLmRlY2xhcmVkT25NZXRob2QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkuZGVjbGFyZWRPblR5cGUoKSk7CisgICAgICAgIGFzc2VydFRydWUodHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDEpIGluc3RhbmNlb2YgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkIiLCB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMSkuZGVjbGFyZWRPbk1ldGhvZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgxKS5kZWNsYXJlZE9uVHlwZSgpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vcmVmbGVjdGlvbm1vZGVsL1N5bWJvbFJlc29sdXRpb25SZXNvbHV0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vcmVmbGVjdGlvbm1vZGVsL1N5bWJvbFJlc29sdXRpb25SZXNvbHV0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDk4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi9yZWZsZWN0aW9ubW9kZWwvU3ltYm9sUmVzb2x1dGlvblJlc29sdXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnJlZmxlY3Rpb25tb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5BYnN0cmFjdFJlc29sdXRpb25UZXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5SZWZsZWN0aW9uVHlwZVNvbHZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFN5bWJvbFJlc29sdXRpb25SZXNvbHV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UmVzb2x1dGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRUeXBlT2ZGaWVsZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIlJlZmxlY3Rpb25GaWVsZE9mSXRzZWxmIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk15Q2xhc3MiKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIGZpZWxkID0gTmF2aWdhdG9yLmRlbWFuZEZpZWxkKGNsYXp6LCAiUFVCTElDIik7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGZpZWxkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCByZWYuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRUeXBlT2ZGaWVsZEFjY2VzcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VTYW1wbGUoIlJlZmxlY3Rpb25GaWVsZE9mSXRzZWxmIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk15Q2xhc3MiKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIGZpZWxkID0gTmF2aWdhdG9yLmRlbWFuZEZpZWxkKGNsYXp6LCAiUFVCTElDIik7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGZpZWxkLmdldEluaXRpYWxpemVyKCkuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHJlZi5kZXNjcmliZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbmRpdGlvbmFsRXhwcmVzc2lvbkV4YW1wbGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlU2FtcGxlKCJKcmVDb25kaXRpb25hbEV4cHJlc3Npb24iKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gTmF2aWdhdG9yLmRlbWFuZENsYXNzKGN1LCAiTXlDbGFzcyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBOYXZpZ2F0b3IuZGVtYW5kTWV0aG9kKGNsYXp6LCAiZm9vMSIpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBOYXZpZ2F0b3IuZmluZFJldHVyblN0bXQobWV0aG9kKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkuZ2V0KCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZGVzY3JpYmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb25kaXRpb25hbEV4cHJlc3Npb25FeGFtcGxlRm9sbG93VXAxKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZVNhbXBsZSgiSnJlQ29uZGl0aW9uYWxFeHByZXNzaW9uIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IE5hdmlnYXRvci5kZW1hbmRDbGFzcyhjdSwgIk15Q2xhc3MiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gTmF2aWdhdG9yLmRlbWFuZE1ldGhvZChjbGF6eiwgImZvbzEiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgZXhwcmVzc2lvbiA9IE5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChtZXRob2QsICJuZXh0IikuZ2V0KCk7CisKKyAgICAgICAgVHlwZVNvbHZlciB0eXBlU29sdmVyID0gbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCk7CisgICAgICAgIFJlc29sdmVkVHlwZSByZWYgPSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZWYuZGVzY3JpYmUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9TYW1lQXNCb3VuZFRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL1NhbWVBc0JvdW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNThkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9TYW1lQXNCb3VuZFRlc3QuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmJvdW5kczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQm91bmQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5mZXJlbmNlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5zdGFudGlhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBTYW1lQXNCb3VuZFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBzdHJpbmdUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZShTdHJpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlY29nbml6ZUluc3RhbnRpYXRpb24oKSB7CisgICAgICAgIC8vIHsgzrEgPSBTdHJpbmcgfSBjb250YWlucyBhIHNpbmdsZSBib3VuZCwgaW5zdGFudGlhdGluZyDOsSBhcyBTdHJpbmcuCisgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlKCLOsSIsIG51bGwpOworICAgICAgICBCb3VuZCBib3VuZDEgPSBuZXcgU2FtZUFzQm91bmQoaW5mZXJlbmNlVmFyaWFibGUsIHN0cmluZ1R5cGUpOworICAgICAgICBCb3VuZCBib3VuZDIgPSBuZXcgU2FtZUFzQm91bmQoc3RyaW5nVHlwZSwgaW5mZXJlbmNlVmFyaWFibGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhPcHRpb25hbC5vZihuZXcgSW5zdGFudGlhdGlvbihpbmZlcmVuY2VWYXJpYWJsZSwgc3RyaW5nVHlwZSkpLCBib3VuZDEuaXNBbkluc3RhbnRpYXRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhPcHRpb25hbC5vZihuZXcgSW5zdGFudGlhdGlvbihpbmZlcmVuY2VWYXJpYWJsZSwgc3RyaW5nVHlwZSkpLCBib3VuZDIuaXNBbkluc3RhbnRpYXRpb24oKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9TdWJ0eXBlT2ZCb3VuZFRlc3QuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVpbmZlcmVuY2UvYm91bmRzL1N1YnR5cGVPZkJvdW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZGEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2JvdW5kcy9TdWJ0eXBlT2ZCb3VuZFRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLmJvdW5kczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLmRlY2xhcmF0aW9ucy5SZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVzb2x1dGlvbi50eXBlcy5SZXNvbHZlZFJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24udHlwZXMuUmVzb2x2ZWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkV2lsZGNhcmQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlaW5mZXJlbmNlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuVHlwZUhlbHBlci5pc1Byb3BlclR5cGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CisKK3B1YmxpYyBjbGFzcyBTdWJ0eXBlT2ZCb3VuZFRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICBwcml2YXRlIFJlc29sdmVkUmVmZXJlbmNlVHlwZSBpdGVyYWJsZVR5cGUgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkuc29sdmVUeXBlKEl0ZXJhYmxlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpOworICAgIHByaXZhdGUgUmVzb2x2ZWRSZWZlcmVuY2VUeXBlIGxpc3RUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZShMaXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIGludGVnZXJUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZShJbnRlZ2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpOworICAgIHByaXZhdGUgUmVzb2x2ZWRUeXBlIGRvdWJsZVR5cGUgPSBuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkuc29sdmVUeXBlKERvdWJsZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCB0eXBlU29sdmVyKTsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBvYmplY3RUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlY29nbml6ZVByb3Blckxvd2VyQm91bmQxKCkgeworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gPSBtb2NrKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmNsYXNzKTsKKworICAgICAgICAvLyB7IEludGVnZXIgPDogzrEsIERvdWJsZSA8OiDOsSwgzrEgPDogT2JqZWN0IH0gZGVzY3JpYmVzIHR3byBwcm9wZXIgbG93ZXIgYm91bmRzIGFuZCBvbmUgcHJvcGVyIHVwcGVyIGJvdW5kIGZvciDOsS4KKworICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZSBpbmZlcmVuY2VWYXJpYWJsZSA9IG5ldyBJbmZlcmVuY2VWYXJpYWJsZSgizrEiLCB0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pOworICAgICAgICBCb3VuZCBib3VuZCA9IG5ldyBTdWJ0eXBlT2ZCb3VuZChpbnRlZ2VyVHlwZSwgaW5mZXJlbmNlVmFyaWFibGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhPcHRpb25hbC5vZihuZXcgUHJvcGVyTG93ZXJCb3VuZChpbmZlcmVuY2VWYXJpYWJsZSwgaW50ZWdlclR5cGUpKSwgYm91bmQuaXNQcm9wZXJMb3dlckJvdW5kKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVjb2duaXplUHJvcGVyTG93ZXJCb3VuZDIoKSB7CisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9IG1vY2soUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uY2xhc3MpOworCisgICAgICAgIC8vIHsgSW50ZWdlciA8OiDOsSwgRG91YmxlIDw6IM6xLCDOsSA8OiBPYmplY3QgfSBkZXNjcmliZXMgdHdvIHByb3BlciBsb3dlciBib3VuZHMgYW5kIG9uZSBwcm9wZXIgdXBwZXIgYm91bmQgZm9yIM6xLgorCisgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlKCLOsSIsIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbik7CisgICAgICAgIEJvdW5kIGJvdW5kID0gbmV3IFN1YnR5cGVPZkJvdW5kKGRvdWJsZVR5cGUsIGluZmVyZW5jZVZhcmlhYmxlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2YobmV3IFByb3Blckxvd2VyQm91bmQoaW5mZXJlbmNlVmFyaWFibGUsIGRvdWJsZVR5cGUpKSwgYm91bmQuaXNQcm9wZXJMb3dlckJvdW5kKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVjb2duaXplUHJvcGVyVXBwZXJCb3VuZDEoKSB7CisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9IG1vY2soUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uY2xhc3MpOworCisgICAgICAgIC8vIHsgSW50ZWdlciA8OiDOsSwgRG91YmxlIDw6IM6xLCDOsSA8OiBPYmplY3QgfSBkZXNjcmliZXMgdHdvIHByb3BlciBsb3dlciBib3VuZHMgYW5kIG9uZSBwcm9wZXIgdXBwZXIgYm91bmQgZm9yIM6xLgorCisgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGluZmVyZW5jZVZhcmlhYmxlID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlKCLOsSIsIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbik7CisgICAgICAgIEJvdW5kIGJvdW5kID0gbmV3IFN1YnR5cGVPZkJvdW5kKGluZmVyZW5jZVZhcmlhYmxlLCBvYmplY3RUeXBlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2YobmV3IFByb3BlclVwcGVyQm91bmQoaW5mZXJlbmNlVmFyaWFibGUsIG9iamVjdFR5cGUpKSwgYm91bmQuaXNQcm9wZXJVcHBlckJvdW5kKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVjb2duaXplUHJvcGVyVXBwZXJCb3VuZDIoKSB7CisgICAgICAgIFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjEgPSBtb2NrKFJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24gdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uMiA9IG1vY2soUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICAvLyB7IM6xIDw6IEl0ZXJhYmxlPD8+LCDOsiA8OiBPYmplY3QsIM6xIDw6IExpc3Q8zrI+IH0gZGVzY3JpYmVzIGEgcHJvcGVyIHVwcGVyIGJvdW5kIGZvciBlYWNoIG9mIM6xIGFuZCDOsiwgYWxvbmcgd2l0aCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGVtLgorCisgICAgICAgIEluZmVyZW5jZVZhcmlhYmxlIGFscGhhID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlKCLOsSIsIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjEpOworICAgICAgICBJbmZlcmVuY2VWYXJpYWJsZSBiZXRhID0gbmV3IEluZmVyZW5jZVZhcmlhYmxlKCLOsiIsIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbjIpOworICAgICAgICBSZXNvbHZlZFR5cGUgaXRlcmFibGVPZldpbGRjYXJkID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGl0ZXJhYmxlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgQXJyYXlzLmFzTGlzdChSZXNvbHZlZFdpbGRjYXJkLlVOQk9VTkRFRCksIHR5cGVTb2x2ZXIpOworICAgICAgICBSZXNvbHZlZFR5cGUgbGlzdE9mQmV0YSA9IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChsaXN0VHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgQXJyYXlzLmFzTGlzdChiZXRhKSwgdHlwZVNvbHZlcik7CisKKyAgICAgICAgQm91bmQgYm91bmQxID0gbmV3IFN1YnR5cGVPZkJvdW5kKGFscGhhLCBpdGVyYWJsZU9mV2lsZGNhcmQpOworICAgICAgICBCb3VuZCBib3VuZDIgPSBuZXcgU3VidHlwZU9mQm91bmQoYmV0YSwgb2JqZWN0VHlwZSk7CisgICAgICAgIEJvdW5kIGJvdW5kMyA9IG5ldyBTdWJ0eXBlT2ZCb3VuZChhbHBoYSwgbGlzdE9mQmV0YSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBpc1Byb3BlclR5cGUobGlzdE9mQmV0YSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2YobmV3IFByb3BlclVwcGVyQm91bmQoYWxwaGEsIGl0ZXJhYmxlT2ZXaWxkY2FyZCkpLCBib3VuZDEuaXNQcm9wZXJVcHBlckJvdW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoT3B0aW9uYWwub2YobmV3IFByb3BlclVwcGVyQm91bmQoYmV0YSwgb2JqZWN0VHlwZSkpLCBib3VuZDIuaXNQcm9wZXJVcHBlckJvdW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYm91bmQzLmlzQURlcGVuZGVuY3koKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvQ29uc3RyYWludEZvcm11bGFUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlaW5mZXJlbmNlL2NvbnN0cmFpbnRmb3JtdWxhcy9Db25zdHJhaW50Rm9ybXVsYVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTYzY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZWluZmVyZW5jZS9jb25zdHJhaW50Zm9ybXVsYXMvQ29uc3RyYWludEZvcm11bGFUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZWluZmVyZW5jZS5jb25zdHJhaW50Zm9ybXVsYXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnJlc29sdXRpb24uZGVjbGFyYXRpb25zLlJlc29sdmVkVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5yZXNvbHV0aW9uLnR5cGVzLlJlc29sdmVkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQm91bmRTZXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuQ29uc3RyYWludEZvcm11bGE7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVpbmZlcmVuY2UuSW5mZXJlbmNlVmFyaWFibGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CisKK3B1YmxpYyBjbGFzcyBDb25zdHJhaW50Rm9ybXVsYVRlc3QgeworCisgICAgcHJpdmF0ZSBUeXBlU29sdmVyIHR5cGVTb2x2ZXIgPSBuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIoKTsKKyAgICBwcml2YXRlIFJlc29sdmVkVHlwZSBzdHJpbmdUeXBlID0gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZShTdHJpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcik7CisKKyAgICAvKioKKyAgICAgKiBGcm9tIEpMUyAxOC4xLjIKKyAgICAgKgorICAgICAqIEZyb20gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJoaSIpLCB3ZSBoYXZlIHRoZSBjb25zdHJhaW50IGZvcm11bGEg4oC5ImhpIiDihpIgzrHigLouCisgICAgICogVGhyb3VnaCByZWR1Y3Rpb24sIHRoaXMgd2lsbCBiZWNvbWUgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYTog4oC5U3RyaW5nIDw6IM6x4oC6LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGVSZWR1Y2UxKCkgeworICAgICAgICBSZXNvbHZlZFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCA9IG1vY2soUmVzb2x2ZWRUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uY2xhc3MpOworCisgICAgICAgIEV4cHJlc3Npb24gZSA9IG5ldyBTdHJpbmdMaXRlcmFsRXhwcigiaGkiKTsKKyAgICAgICAgSW5mZXJlbmNlVmFyaWFibGUgaW5mZXJlbmNlVmFyaWFibGUgPSBuZXcgSW5mZXJlbmNlVmFyaWFibGUoIs6xIiwgdHApOworCisgICAgICAgIEV4cHJlc3Npb25Db21wYXRpYmxlV2l0aFR5cGUgZm9ybXVsYSA9IG5ldyBFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlKHR5cGVTb2x2ZXIsIGUsIGluZmVyZW5jZVZhcmlhYmxlKTsKKworICAgICAgICBDb25zdHJhaW50Rm9ybXVsYS5SZWR1Y3Rpb25SZXN1bHQgcmVzMSA9IGZvcm11bGEucmVkdWNlKEJvdW5kU2V0LmVtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgQ29uc3RyYWludEZvcm11bGEuUmVkdWN0aW9uUmVzdWx0LmVtcHR5KCkud2l0aENvbnN0cmFpbnQobmV3IFR5cGVDb21wYXRpYmxlV2l0aFR5cGUodHlwZVNvbHZlciwgc3RyaW5nVHlwZSwgaW5mZXJlbmNlVmFyaWFibGUpKSwKKyAgICAgICAgICAgICAgICByZXMxKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgQ29uc3RyYWludEZvcm11bGEuUmVkdWN0aW9uUmVzdWx0LmVtcHR5KCkud2l0aENvbnN0cmFpbnQobmV3IFR5cGVTdWJ0eXBlT2ZUeXBlKHR5cGVTb2x2ZXIsIHN0cmluZ1R5cGUsIGluZmVyZW5jZVZhcmlhYmxlKSksCisgICAgICAgICAgICAgICAgcmVzMS5nZXRDb25zdHJhaW50KDApLnJlZHVjZShCb3VuZFNldC5lbXB0eSgpKSk7CisgICAgfQorCisvLyAgICAvKioKKy8vICAgICAqIEZyb20gSkxTIDE4LjEuMgorLy8gICAgICoKKy8vICAgICAqIEZyb20gQXJyYXlzLmFzTGlzdCgxLCAyLjApLCB3ZSBoYXZlIHRoZSBjb25zdHJhaW50IGZvcm11bGFzIOKAuTEg4oaSIM6x4oC6IGFuZCDigLkyLjAg4oaSIM6x4oC6LiBUaHJvdWdoIHJlZHVjdGlvbiwKKy8vICAgICAqIHRoZXNlIHdpbGwgYmVjb21lIHRoZSBjb25zdHJhaW50IGZvcm11bGFzIOKAuWludCDihpIgzrHigLogYW5kIOKAuWRvdWJsZSDihpIgzrHigLosIGFuZCB0aGVuIOKAuUludGVnZXIgPDogzrHigLogYW5kIOKAuURvdWJsZSA8OiDOseKAui4KKy8vICAgICAqLworLy8gICAgQFRlc3QKKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlUmVkdWNlMigpIHsKKy8vICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEZyb20gSkxTIDE4LjEuMgorLy8gICAgICoKKy8vICAgICAqIEZyb20gdGhlIHRhcmdldCB0eXBlIG9mIHRoZSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIExpc3Q8VGhyZWFkPiBsdCA9IG5ldyBBcnJheUxpc3Q8PigpLCB3ZSBoYXZlIHRoZSBjb25zdHJhaW50CisvLyAgICAgKiBmb3JtdWxhIOKAuUFycmF5TGlzdDzOsT4g4oaSIExpc3Q8VGhyZWFkPuKAui4gVGhyb3VnaCByZWR1Y3Rpb24sIHRoaXMgd2lsbCBiZWNvbWUgdGhlIGNvbnN0cmFpbnQgZm9ybXVsYSDigLnOsSA8PSBUaHJlYWTigLosCisvLyAgICAgKiBhbmQgdGhlbiDigLnOsSA9IFRocmVhZOKAui4KKy8vICAgICAqLworLy8gICAgQFRlc3QKKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uQ29tcGF0aWJsZVdpdGhUeXBlUmVkdWNlMygpIHsKKy8vICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKy8vICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci9yZXNvbHV0aW9uL3R5cGVzb2x2ZXJzL0FhclR5cGVTb2x2ZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9BYXJUeXBlU29sdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmU5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9BYXJUeXBlU29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBGZWRlcmljbyBUb21hc3NldHRpCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuQWJzdHJhY3RUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBBYXJUeXBlU29sdmVyVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGluaXRpYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGF0aFRvSmFyID0gYWRhcHRQYXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMvYWFycy9zdXBwb3J0LWNvbXBhdC0yNC4yLjAuYWFyIik7CisgICAgICAgIEFhclR5cGVTb2x2ZXIgYWFyVHlwZVNvbHZlciA9IG5ldyBBYXJUeXBlU29sdmVyKG5ldyBGaWxlKHBhdGhUb0phcikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYWFyVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5BY3Rpdml0eUNvbXBhdCIpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYWFyVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5BY3Rpdml0eU1hbmFnZXJDb21wYXQiKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGFhclR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoImFuZHJvaWQuc3VwcG9ydC52NC5hcHAuTm90aWZpY2F0aW9uQ29tcGF0IikuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBhYXJUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJhbmRyb2lkLnN1cHBvcnQudjQuYXBwLk5vdGlmaWNhdGlvbkNvbXBhdC5BY3Rpb24iKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGFhclR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoImFuZHJvaWQuc3VwcG9ydC52NC5hcHAuTm90aWZpY2F0aW9uQ29tcGF0LkFjdGlvbi5CdWlsZGVyIikuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYWFyVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVFBhcnNlci5Gb28iKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBhYXJUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuRm9vIikuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYWFyVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiRm9vIikuaXNTb2x2ZWQoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9zeW1ib2xzb2x2ZXIvcmVzb2x1dGlvbi90eXBlc29sdmVycy9KYXJUeXBlU29sdmVyVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvSmFyVHlwZVNvbHZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZmY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3Jlc29sdXRpb24vdHlwZXNvbHZlcnMvSmFyVHlwZVNvbHZlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgRmVkZXJpY28gVG9tYXNzZXR0aQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLkFic3RyYWN0VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKworcHVibGljIGNsYXNzIEphclR5cGVTb2x2ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaW5pdGlhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXRoVG9KYXIgPSBhZGFwdFBhdGgoInNyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyLWNvcmUtMi4xLjAuamFyIik7CisgICAgICAgIEphclR5cGVTb2x2ZXIgamFyVHlwZVNvbHZlciA9IG5ldyBKYXJUeXBlU29sdmVyKHBhdGhUb0phcik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXJUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuU291cmNlc0hlbHBlciIpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgamFyVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZSgiY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuIikuaXNTb2x2ZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBqYXJUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuQVNUUGFyc2VyLkpKQ2FsbHMiKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXJUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJjb20uZ2l0aHViLmphdmFwYXJzZXIuQVNUUGFyc2VyLkZvbyIpLmlzU29sdmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGphclR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoImNvbS5naXRodWIuamF2YXBhcnNlci5Gb28iKS5pc1NvbHZlZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXJUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJGb28iKS5pc1NvbHZlZCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci91dGlscy9TeW1ib2xTb2x2ZXJRdWlja1NldHVwVGVzdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3ltYm9sc29sdmVyL3V0aWxzL1N5bWJvbFNvbHZlclF1aWNrU2V0dXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjMWJjNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N5bWJvbHNvbHZlci91dGlscy9TeW1ib2xTb2x2ZXJRdWlja1NldHVwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci51dGlsczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5KYXZhU3ltYm9sU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworCisKKy8qKgorICogVHJ5IHRvIHJlc29sdmUgYWxsIHRoZSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYW5kIE1ldGhvZENhbGxFeHByIGluIHNvbWUgcmVzb3VyY2VzIGZvbGRlci4gSWYgaXQgZmFpbHMgdG8gZG8KKyAqIHNvLCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duLgorICovCitwdWJsaWMgY2xhc3MgU3ltYm9sU29sdmVyUXVpY2tTZXR1cFRlc3QgeworCisgICAgcHJpdmF0ZSBQYXRoIHJvb3QgPSBQYXRocy5nZXQoInNyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cCIpOworICAgIHByaXZhdGUgUGFyc2VyQ29uZmlndXJhdGlvbiBwYXJzZXJDb25maWd1cmF0aW9uID0gbmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5bWJvbFNvbHZlclF1aWNrU2V0dXAgc3NyID0gbmV3IFN5bWJvbFNvbHZlclF1aWNrU2V0dXAocm9vdCk7CisgICAgICAgIFR5cGVTb2x2ZXIgdHlwZVNvbHZlciA9IHNzci53YWxrKCk7CisKKyAgICAgICAgcGFyc2VyQ29uZmlndXJhdGlvbi5zZXRTeW1ib2xSZXNvbHZlcihuZXcgSmF2YVN5bWJvbFNvbHZlcih0eXBlU29sdmVyKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgbm90UmVzb2x2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNvdXJjZVJvb3Qgc291cmNlUm9vdCA9IG5ldyBTb3VyY2VSb290KHJvb3QpOworICAgICAgICBzb3VyY2VSb290LnRyeVRvUGFyc2UoKTsKKyAgICAgICAgLy8gdHJ5IHRvIHJlc29sdmUsIHRoaXMgd2lsbCBmYWlsCisgICAgICAgIHNvdXJjZVJvb3QuZ2V0Q29tcGlsYXRpb25Vbml0cygpLmZvckVhY2goY29tcGlsYXRpb25Vbml0IC0+CisgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmZpbmRBbGwoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzKS5mb3JFYWNoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjo6cmVzb2x2ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNvdXJjZVJvb3Qgc291cmNlUm9vdCA9IG5ldyBTb3VyY2VSb290KHJvb3QsIHBhcnNlckNvbmZpZ3VyYXRpb24pOworICAgICAgICBzb3VyY2VSb290LnRyeVRvUGFyc2UoKTsKKyAgICAgICAgLy8gdHJ5IHRvIHJlc29sdmUsIHRoaXMgc2hvdWxkIHN1Y2NlZWQKKyAgICAgICAgc291cmNlUm9vdC5nZXRDb21waWxhdGlvblVuaXRzKCkuZm9yRWFjaChjb21waWxhdGlvblVuaXQgLT4KKyAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuZmluZEFsbChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MpLmZvckVhY2goQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOjpyZXNvbHZlKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BQ2xhc3NXaXRoRmllbGRzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FDbGFzc1dpdGhGaWVsZHMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlMTBiNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BQ2xhc3NXaXRoRmllbGRzLmphdmEudHh0CkBAIC0wLDAgKzEsMTEgQEAKK2NsYXNzIEEgeworICAgIFN0cmluZyBhOworfQorCitjbGFzcyBCIGV4dGVuZHMgQSB7CisgICAgZmxvYXQgYjsKK30KKworY2xhc3MgQyBleHRlbmRzIEIgeworICAgIGludCBjOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FDbGFzc1dpdGhGaWVsZHNBbmRHZW5lcmljcy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BQ2xhc3NXaXRoRmllbGRzQW5kR2VuZXJpY3MuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZWJiNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BQ2xhc3NXaXRoRmllbGRzQW5kR2VuZXJpY3MuamF2YS50eHQKQEAgLTAsMCArMSwxMyBAQAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBBIHsKKyAgICBTdHJpbmcgYTsKK30KKworY2xhc3MgQjxUPiBleHRlbmRzIEEgeworICAgIExpc3Q8VD4gYjsKK30KKworY2xhc3MgQyBleHRlbmRzIEI8U3RyaW5nPiB7CisgICAgaW50IGM7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQWNjZXNzQ2xhc3NNZW1iZXJUaHJvdWdoVGhpcy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BY2Nlc3NDbGFzc01lbWJlclRocm91Z2hUaGlzLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWQxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQWNjZXNzQ2xhc3NNZW1iZXJUaHJvdWdoVGhpcy5qYXZhLnR4dApAQCAtMCwwICsxLDE3IEBACitjbGFzcyBBY2Nlc3NDbGFzc01lbWJlclRocm91Z2hUaGlzIHsKKworCXByaXZhdGUgU3RyaW5nIGxhYmVsOworCisJcHVibGljIHZvaWQgc2V0TGFiZWwoZmluYWwgU3RyaW5nIGxhYmVsKSB7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsMSgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwyKCkgeworCQlyZXR1cm4gdGhpcy5sYWJlbDsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQWNjZXNzRW51bU1lbWJlclRocm91Z2hUaGlzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FjY2Vzc0VudW1NZW1iZXJUaHJvdWdoVGhpcy5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZhNGRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FjY2Vzc0VudW1NZW1iZXJUaHJvdWdoVGhpcy5qYXZhLnR4dApAQCAtMCwwICsxLDE1IEBACitlbnVtIEFjY2Vzc0VudW1NZW1iZXJUaHJvdWdoVGhpcyB7CisKKwlDT05TVEFOVCgiY29uc3RhbnQiKTsKKworCXByaXZhdGUgU3RyaW5nIGxhYmVsOworCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIHRoaXMubGFiZWw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYWJlbDIoKSB7CisJCXJldHVybiB0aGlzLmdldExhYmVsKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FjY2Vzc1Rocm91Z2hTdXBlci5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BY2Nlc3NUaHJvdWdoU3VwZXIuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNjdjZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BY2Nlc3NUaHJvdWdoU3VwZXIuamF2YS50eHQKQEAgLTAsMCArMSwyNSBAQAorY2xhc3MgQWNjZXNzVGhyb3VnaFN1cGVyIHsKKwkKKwljbGFzcyBTdXBlckNsYXNzIHsKKworCQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkOworCisJCXByb3RlY3RlZCBTdHJpbmcgbWV0aG9kKCkgeyAKKwkJCXJldHVybiBmaWVsZDsKKwkJfQorCisJfQorCisJY2xhc3MgU3ViQ2xhc3MgZXh0ZW5kcyBTdXBlckNsYXNzIHsKKworCQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkVGVzdCgpIHsgCisJCQlyZXR1cm4gc3VwZXIuZmllbGQ7CisJCX0KKworCQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZFRlc3QoKSB7IAorCQkJcmV0dXJuIHN1cGVyLm1ldGhvZCgpOworCQl9CisKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQW5FbnVtLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FuRW51bS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWNkNTZmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FuRW51bS5qYXZhLnR4dApAQCAtMCwwICsxLDkgQEAKK2VudW0gTXlFbnVtIHsKKyAgICBFMSwgRTI7CisgICAgaW50IGk7CisgICAgc3RhdGljIGxvbmcgajsKKworICAgIHZvaWQgZm9vKCl7CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0Fubm90YXRpb25zLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0Fubm90YXRpb25zLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQW5ub3RhdGlvbnMuamF2YS50eHQKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBmb28uYmFyOworCitwdWJsaWMgQGludGVyZmFjZSBNeUFubm90YXRpb24geworfQorCitwdWJsaWMgQGludGVyZmFjZSBNeUFubm90YXRpb24yIHsKK30KKworcHVibGljIEBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uV2l0aEZpZWxkcyB7CisgICAgaW50IGZpZWxkKCk7Cit9CisKK0BNeUFubm90YXRpb24KK2NsYXNzIENBIHsKKworfQorCitATXlBbm5vdGF0aW9uMgorY2xhc3MgQ0IgZXh0ZW5kcyBDQSB7CisKK30KKwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0Fub255bW91c0NsYXNzRGVjbGFyYXRpb25zLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0Fub255bW91c0NsYXNzRGVjbGFyYXRpb25zLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTQyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMuamF2YS50eHQKQEAgLTAsMCArMSw3MSBAQAorY2xhc3MgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbnMgeworCisgICAgc3RhdGljIGNsYXNzIERvRm48SSxPPiB7CisgICAgICAgIHN0YXRpYyBjbGFzcyBQcm9jZXNzQ29udGV4dCB7CisgICAgICAgICAgICBwdWJsaWMgTG9uZyBpbm5lckNsYXNzTWV0aG9kKCkge30KKyAgICAgICAgfQorCisgICAgICAgIGVudW0gTXlFbnVtIHsKKyAgICAgICAgICAgIEUxLCBFMiwgRTMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoUHJvY2Vzc0NvbnRleHQgY29udGV4dCkge30KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtPEksTz4ge30KKworICAgIHN0YXRpYyBjbGFzcyBQYXJEbyB7CisgICAgICAgIHN0YXRpYyA8SSxPPiBUcmFuc2Zvcm08SSxPPiBvZihEb0ZuPEksTz4gZG9GbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGZvb0JhcjEoKSB7CisgICAgICAgIFBhckRvLm9mKG5ldyBEb0ZuPEludGVnZXIsTG9uZz4oKSB7fSk7CisgICAgfQorCisgICAgdm9pZCBmb29CYXIyKCkgeworICAgICAgICBQYXJEby5vZihuZXcgRG9GbjxJbnRlZ2VyLExvbmc+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhQcm9jZXNzQ29udGV4dCBjKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5pbm5lckNsYXNzTWV0aG9kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgZm9vQmFyMygpIHsKKyAgICAgICAgUGFyRG8ub2YobmV3IERvRm48SW50ZWdlcixMb25nPigpIHsKKworICAgICAgICAgICAgdm9pZCBjYWxsQW5ub25DbGFzc0lubmVyTWV0aG9kKCkge30KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhQcm9jZXNzQ29udGV4dCBjKSB7CisgICAgICAgICAgICAgICAgY2FsbEFubm9uQ2xhc3NJbm5lck1ldGhvZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAgdm9pZCBmb29CYXI0KCkgeworICAgICAgICBQYXJEby5vZihuZXcgRG9GbjxJbnRlZ2VyLExvbmc+KCkgeworCisgICAgICAgICAgICB2b2lkIGNhbGxBbm5vbkNsYXNzSW5uZXJNZXRob2QoKSB7fQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFByb2Nlc3NDb250ZXh0IGMpIHsKKyAgICAgICAgICAgICAgICBNeUVudW0uRTMudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBmb29CYXI1KCkgeworICAgICAgICBQYXJEby5vZihuZXcgRG9GbjxJbnRlZ2VyLExvbmc+KCkgeworCisgICAgICAgICAgICB2b2lkIGNhbGxBbm5vbkNsYXNzSW5uZXJNZXRob2QoKSB7fQorCisgICAgICAgICAgICBlbnVtIE15SW5uZXJFbnVtIHsKKyAgICAgICAgICAgICAgICBFMSwgRTIsIEUzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFByb2Nlc3NDb250ZXh0IGMpIHsKKyAgICAgICAgICAgICAgICBNeUlubmVyRW51bS5FMy50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BcnJheUFjY2Vzcy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9BcnJheUFjY2Vzcy5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThhNzMwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0FycmF5QWNjZXNzLmphdmEudHh0CkBAIC0wLDAgKzEsOSBAQAorY2xhc3MgQXJyYXlBY2Nlc3MgeworCisJcHJpdmF0ZSBTdHJpbmdbXSBhcnJheTsKKworCXByaXZhdGUgY2hhciBhY2Nlc3MoKSB7CisJCXJldHVybiBhcnJheVswXS50cmltKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzQ2FzdC5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc0Nhc3QuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlYWI4MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc0Nhc3QuamF2YS50eHQKQEAgLTAsMCArMSwxMyBAQAorY2xhc3MgTm9kZSB7CisKK30KKworY2xhc3MgQ2xhc3NDYXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgPE4gZXh0ZW5kcyBOb2RlPiBMaXN0PE4+IGdldE5vZGVzQnlUeXBlKE5vZGUgY29udGFpbmVyLCBDbGFzczxOPiBjbGF6eikgeworICAgICAgICBMaXN0PE4+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxOPigpOworICAgICAgICBOb2RlIGNoaWxkOworICAgICAgICByZXR1cm4gY2xhenouY2FzdChjaGlsZCk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzRXhwcmVzc2lvbi5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc0V4cHJlc3Npb24uamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5MDM4YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc0V4cHJlc3Npb24uamF2YS50eHQKQEAgLTAsMCArMSw5IEBACitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK2NsYXNzIENsYXNzRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIHZvaWQgZm9vKCkgeworCQlFbnVtU2V0Lm5vbmVPZihqYXZhLnV0aWwuTG9jYWxlLkNhdGVnb3J5LmNsYXNzKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQ2xhc3NUeXBlUGFyYW1ldGVyLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzVHlwZVBhcmFtZXRlci5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg1NDNiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzVHlwZVBhcmFtZXRlci5qYXZhLnR4dApAQCAtMCwwICsxLDcgQEAKK2NsYXNzIEZvbzxBLCBCPiB7CisgICAgcHVibGljIHZvaWQgZm9vKEEgYSk7CisKKyAgICBwdWJsaWMgdm9pZCB1c2FnZShBIGEpIHsKKyAgICAgICAgcmV0dXJuIGZvbyhhKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzV2l0aE1ldGhvZHMuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQ2xhc3NXaXRoTWV0aG9kcy5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2U0NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzV2l0aE1ldGhvZHMuamF2YS50eHQKQEAgLTAsMCArMSwxNCBAQAorY2xhc3MgU3VwZXIgeworICAgIHB1YmxpYyB2b2lkIGZvbzEoKSB7IH0KKyAgICBwdWJsaWMgdm9pZCBmb28yKCkgeyB9Cit9CisKK2NsYXNzIEEgZXh0ZW5kcyBTdXBlciB7CisgICAgcHVibGljIHZvaWQgZm9vMCgpIHsgfQorICAgIHB1YmxpYyB2b2lkIGZvbzEoKSB7IH0KKyAgICBwdWJsaWMgdm9pZCBmb28zKGludCBpKSB7IH0KKyAgICBwdWJsaWMgdm9pZCBmb280KE9iamVjdCBvKSB7IH0KKyAgICBwdWJsaWMgdm9pZCBmb280KFN0cmluZyBhKSB7IH0KKyAgICBwdWJsaWMgdm9pZCBmb281KFN0cmluZyBhKSB7IH0KKyAgICBwdWJsaWMgdm9pZCBmb281KEEgYSkgeyB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQ2xhc3NXaXRoU3ltYm9scy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc1dpdGhTeW1ib2xzLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjkzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQ2xhc3NXaXRoU3ltYm9scy5qYXZhLnR4dApAQCAtMCwwICsxLDM5IEBACitjbGFzcyBTdXBlciB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gazsKKyAgICBwdWJsaWMgc3RhdGljIGNoYXIgbTsKK30KKworaW50ZXJmYWNlIFN1cGVyU3VwZXJJbnRlcmZhY2UgeworICAgIHB1YmxpYyBpbnQgbzsKK30KKworaW50ZXJmYWNlIFN1cGVySW50ZXJmYWNlIGV4dGVuZHMgU3VwZXJTdXBlckludGVyZmFjZSB7CisgICAgcHVibGljIGludCBwOworfQorCitjbGFzcyBBIGV4dGVuZHMgU3VwZXIgaW1wbGVtZW50cyBTdXBlckludGVyZmFjZSB7CisKKyAgICBwcml2YXRlIGludCBpOworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgajsKKworICAgIHB1YmxpYyB2b2lkIGZvbzEoKXsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9vMigpeworICAgICAgICByZXR1cm4gajsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmb28zKCl7CisgICAgICAgIHJldHVybiBrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvbzQoKXsKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9vNSgpeworICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc1dpdGhUeXBlVmFyaWFibGVzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzV2l0aFR5cGVWYXJpYWJsZXMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlMTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc1dpdGhUeXBlVmFyaWFibGVzLmphdmEudHh0CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgQTxBLCBCIGV4dGVuZHMgT2JqZWN0LCBDPiB7CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc1dpdGhUeXBlcy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9DbGFzc1dpdGhUeXBlcy5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzFlZDYwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NsYXNzV2l0aFR5cGVzLmphdmEudHh0CkBAIC0wLDAgKzEsMTkgQEAKK2NsYXNzIFN1cGVyIHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBrOworICAgIHByaXZhdGUgc3RhdGljIGNoYXIgbTsKKworfQorCitjbGFzcyBBIGV4dGVuZHMgU3VwZXIgeworCisgICAgY2xhc3MgQiB7CisgICAgICAgIGNsYXNzIEMgeworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIEUgeworICAgICAgICBFMSwgRTIKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Db21waWxhdGlvblVuaXRTeW1ib2xzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NvbXBpbGF0aW9uVW5pdFN5bWJvbHMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MGZhYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Db21waWxhdGlvblVuaXRTeW1ib2xzLmphdmEudHh0CkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBjb20uZm9vOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS4qOwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NvbXBpbGF0aW9uVW5pdFdpdGhJbXBvcnRzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0NvbXBpbGF0aW9uVW5pdFdpdGhJbXBvcnRzLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMGI0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvQ29tcGlsYXRpb25Vbml0V2l0aEltcG9ydHMuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIGNvbS5mb287CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvRWxlbWVudE9mTGlzdC5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9FbGVtZW50T2ZMaXN0LmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjcxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvRWxlbWVudE9mTGlzdC5qYXZhLnR4dApAQCAtMCwwICsxLDIzIEBACitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIENvbW1lbnQgeworCit9CisKK2NsYXNzIEFubm90YXRpb25FeHByIHsKKworfQorCitjbGFzcyBFbGVtZW50T2ZMaXN0IHsKKworICAgIHZvaWQgZm9vKCkgeworICAgICAgICBMaXN0PENvbW1lbnQ+IGNvbW1lbnRzID0gY29tbWVudHNDb2xsZWN0aW9uLmdldEFsbCgpOworICAgICAgICBPYmplY3QgYSA9IGNvbW1lbnRzLmdldCgwKTsKKyAgICB9CisKKyAgICB2b2lkIGFubm90YXRpb25zKCkgeworICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PEFubm90YXRpb25FeHByPigpOworICAgICAgICBPYmplY3QgYSA9IGFubm90YXRpb25zLmdldChhbm5vdGF0aW9ucy5zaXplKCktMSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0VudW1BbmRTdGF0aWNJbml0aWFsaXplci5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9FbnVtQW5kU3RhdGljSW5pdGlhbGl6ZXIuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYjJlNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9FbnVtQW5kU3RhdGljSW5pdGlhbGl6ZXIuamF2YS50eHQKQEAgLTAsMCArMSwyNSBAQAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitjbGFzcyBNeUNsYXNzIHsKKworICAgIHB1YmxpYyBlbnVtIFByaW1pdGl2ZSB7CisJCUJvb2xlYW4gKCJCb29sZWFuIiksCisJCUNoYXIgICAgKCJDaGFyYWN0ZXIiKSwKKwkJQnl0ZSAgICAoIkJ5dGUiKSwKKwkJU2hvcnQgICAoIlNob3J0IiksCisJCUludCAgICAgKCJJbnRlZ2VyIiksCisJCUxvbmcgICAgKCJMb25nIiksCisJCUZsb2F0ICAgKCJGbG9hdCIpLAorCQlEb3VibGUgICgiRG91YmxlIik7CisKKwkJZmluYWwgU3RyaW5nIG5hbWVPZkJveGVkVHlwZTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFByaW1pdGl2ZT4gdW5ib3hNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByaW1pdGl2ZT4oKTsKKwlzdGF0aWMgeworCQlmb3IoUHJpbWl0aXZlIHVuYm94ZWRUeXBlIDogUHJpbWl0aXZlLnZhbHVlcygpKSB7CisJCQl1bmJveE1hcC5wdXQodW5ib3hlZFR5cGUubmFtZU9mQm94ZWRUeXBlLCB1bmJveGVkVHlwZSk7CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY0NvbGxlY3Rpb24uamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY0NvbGxlY3Rpb24uamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkNDAyNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9HZW5lcmljQ29sbGVjdGlvbi5qYXZhLnR4dApAQCAtMCwwICsxLDEyIEBACitjbGFzcyBOb2RlIHsKKyAgICBhYnN0cmFjdCBqYXZhLnV0aWwuTGlzdDxOb2RlPiBnZXRDaGlsZHJlbk5vZGVzKCk7Cit9CisKK2NsYXNzIEZvbyB7CisKKyAgICBwdWJsaWMgT2JqZWN0IGJhcigpIHsKKyAgICAgICAgTm9kZSBub2RlOworICAgICAgICBqYXZhLnV0aWwuTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBqYXZhLnV0aWwuTGlua2VkTGlzdDxOb2RlPigpOworICAgICAgICByZXR1cm4gY2hpbGRyZW4uYWRkQWxsKG5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY0NvbGxlY3Rpb25XaXRoRXh0ZW5zaW9uLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNDb2xsZWN0aW9uV2l0aEV4dGVuc2lvbi5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI2MWNhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNDb2xsZWN0aW9uV2l0aEV4dGVuc2lvbi5qYXZhLnR4dApAQCAtMCwwICsxLDIxIEBACitjbGFzcyBOb2RlIHsKK30KKworY2xhc3MgQ29tbWVudCBleHRlbmRzIE5vZGUgeworfQorCitjbGFzcyBGb28geworCisgICAgcHVibGljIDxUPiB2b2lkIGZvbyhqYXZhLnV0aWwuTGlzdDxUPiB0MSwgamF2YS51dGlsLkxpc3Q8VD4gdDIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGJhcigpIHsKKyAgICAgICAgTm9kZSBub2RlOworICAgICAgICBqYXZhLnV0aWwuTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBqYXZhLnV0aWwuTGlua2VkTGlzdDxOb2RlPigpOworICAgICAgICBqYXZhLnV0aWwuTGlzdDxDb21tZW50PiBjb21tZW50c1RvQXR0cmlidXRlOworCisgICAgICAgIGZvbyhjaGlsZHJlbiwgY29tbWVudHNUb0F0dHJpYnV0ZSk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmFkZEFsbChjb21tZW50c1RvQXR0cmlidXRlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY0ZpZWxkcy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9HZW5lcmljRmllbGRzLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTNiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY0ZpZWxkcy5qYXZhLnR4dApAQCAtMCwwICsxLDE1IEBACitpbnRlcmZhY2UgSSB7CisgICAgaW50IGkgPSAwOworfQorCitjbGFzcyBDQTxUPiBpbXBsZW1lbnRzIEkgeworCisgICAgVCB0OworCit9CisKK2NsYXNzIENCIGV4dGVuZHMgQ0E8amF2YS51dGlsLkxpc3Q8Qm9vbGVhbj4+IHsKKworICAgIFN0cmluZyBzOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNNZXRob2RBcmd1bWVudHMuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY01ldGhvZEFyZ3VtZW50cy5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRiMWUxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNNZXRob2RBcmd1bWVudHMuamF2YS50eHQKQEAgLTAsMCArMSwzMyBAQAorY2xhc3MgR2VuZXJpY01ldGhvZEFyZ3VtZW50cyB7CisKKyAgICBzdGF0aWMgY2xhc3MgSXRlbXM8VD4geworICAgICAgICBwdWJsaWMgPE91dHB1dCBleHRlbmRzIFQ+IE91dHB1dCBhcHBseShUcmFuc2Zvcm08PyBzdXBlciBJdGVtczxUPiwgT3V0cHV0PiB0KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFuc2Zvcm1zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyA8SSwgTz4gVHJhbnNmb3JtPEksIE8+IG9mKERvRm48SSwgTz4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRyYW5zZm9ybTxJbnB1dCwgT3V0cHV0PiB7fQorCisgICAgc3RhdGljIGNsYXNzIERvRm48SW5wdXQsIE91dHB1dD4ge30KKworICAgIHN0YXRpYyBjbGFzcyBNeUZuMTxUPiBleHRlbmRzIERvRm48VCwgTG9uZz4ge30KKworICAgIHN0YXRpYyBjbGFzcyBNeUZuMiBleHRlbmRzIE15Rm4xPEludGVnZXI+IHt9CisKKyAgICBwcml2YXRlIEl0ZW1zPEludGVnZXI+IGl0ZW1zOworCisgICAgcHVibGljIHZvaWQgdXNlQ2FzZTEoKSB7CisgICAgICAgIGl0ZW1zLmFwcGx5KFRyYW5zZm9ybXMub2YobmV3IE15Rm4yKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1c2VDYXNlMigpIHsKKyAgICAgICAgaXRlbXMuYXBwbHkoVHJhbnNmb3Jtcy5vZihuZXcgRG9GbjxJbnRlZ2VyLExvbmc+KCl7fSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNzLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTFiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvR2VuZXJpY3MuamF2YS50eHQKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBtZS50b21hc3NldHRpLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJpY3MgeworCisgICAgT3B0aW9uYWw8U3RyaW5nPiBzOworICAgIE9wdGlvbmFsPEludGVnZXI+IGk7CisgICAgT3B0aW9uYWw8R2VuZXJpY3M+IGc7CisKK30KKworcHVibGljIGZpbmFsIGNsYXNzIFNvbWVDb2xsZWN0aW9uPEE+IHsKKworICAgIHB1YmxpYyBBIGE7CisgICAgcHVibGljIExpc3Q8QT4gYXM7CisKKyAgICBwdWJsaWMgdm9pZCBmb28xKCl7CisgICAgICAgIG5ldyBTb21lQ29sbGVjdGlvbjxTdHJpbmc+KCkuYTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmb28yKCl7CisgICAgICAgIG5ldyBTb21lQ29sbGVjdGlvbjxTdHJpbmc+KCkuYXM7CisgICAgfQorCit9CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljTWV0aG9kQ2FsbHMgeworCisgICAgcHVibGljIGNsYXNzIEJhc2UgPFQ+IHsKKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsZWUoVCBkYXRhKSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBEZXJpdmVkIGV4dGVuZHMgQmFzZTxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsZXIoKSB7CisgICAgICAgICAgICBjYWxsZWUoInRlc3QiKTsKKyAgICAgICAgfQorCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0dlbmVyaWNzX2lzc3VlNy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9HZW5lcmljc19pc3N1ZTcuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxMjE2OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9HZW5lcmljc19pc3N1ZTcuamF2YS50eHQKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBtZS50b21hc3NldHRpLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljcyB7CisKKyAgICBPcHRpb25hbDxTdHJpbmc+IHM7CisgICAgT3B0aW9uYWw8SW50ZWdlcj4gaTsKKyAgICBPcHRpb25hbDxHZW5lcmljcz4gZzsKKworfQorCitwdWJsaWMgZmluYWwgY2xhc3MgU29tZUNvbGxlY3Rpb248QT4geworCisgICAgcHVibGljIEEgYTsKKyAgICBwdWJsaWMgTGlzdDxBPiBhczsKKworICAgIHB1YmxpYyB2b2lkIGZvbzEoKXsKKyAgICAgICAgbmV3IFNvbWVDb2xsZWN0aW9uPFN0cmluZz4oKS5hOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvbzIoKXsKKyAgICAgICAgbmV3IFNvbWVDb2xsZWN0aW9uPFN0cmluZz4oKS5hczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxMb25nPiBmb28zKCl7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBMb25nW117MUwsMkx9KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9JbnRlcmZhY2VJbmhlcml0YW5jZS5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9JbnRlcmZhY2VJbmhlcml0YW5jZS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2IwMjdlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0ludGVyZmFjZUluaGVyaXRhbmNlLmphdmEudHh0CkBAIC0wLDAgKzEsMTYgQEAKK2NsYXNzIFRlc3R7CisKKyAgICBpbnRlcmZhY2UgRm9veworICAgICAgICBkb3VibGUgZm9vYmFyKCk7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEJhciBleHRlbmRzIEZvbyB7CisKKyAgICB9CisKKyAgICB2b2lkIHRlc3QoKXsKKyAgICAgICAgQmFyIGIgPSBudWxsOworICAgICAgICBiLmZvb2JhcigpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTExNi5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTExNi5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk2ZjZmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMTE2LmphdmEudHh0CkBAIC0wLDAgKzEsNyBAQAorcHVibGljIGNsYXNzIEphdmFUZXN0IHsKKyAgICBwdWJsaWMgU3RyaW5nW10gZmllbGQ7CisKKyAgICBwdWJsaWMgdm9pZCBmb28oU3RyaW5nW10gYXJnKXsKKyAgICAgICAgYXJnOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUxNTYuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUxNTYuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiN2RhNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTE1Ni5qYXZhLnR4dApAQCAtMCwwICsxLDkgQEAKK3B1YmxpYyBjbGFzcyBJc3N1ZTE1NiB7CisgICAgU3RyaW5nIG15RmllbGQ7CisKKyAgICBjbGFzcyBJbm5lciB7CisgICAgICAgIHZvaWQgZm9vKCkgeworICAgICAgICAgICAgSXNzdWUxNTYudGhpcy5teUZpZWxkLmNoYXJBdCgwKTsKKyAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTE4LmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMTguamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OTI5NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTE4LmphdmEudHh0CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0IGphdmEudXRpbC4qOworCitjbGFzcyBGb28geworICAgIHZvaWQgYmFyKCkgeworICAgICAgICBNYXAgbSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIG0ucHV0KCJhIiwgImIiKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMTg2LmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMTg2LmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2RlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUxODYuamF2YS50eHQKQEAgLTAsMCArMSwyMyBAQAoraW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKKworcHVibGljIGNsYXNzIEphdmFUZXN0IHsKKworICAgIHB1YmxpYyB2b2lkIGZvbygpeworICAgICAgICBMaXN0PFN0cmluZz4gbXlMaXN0ID0gQXJyYXlzLmFzTGlzdCgiYTEiLCAiYTIiLCAiYjEiLCAiYzIiLCAiYzEiKTsKKworICAgICAgICBTdHJlYW08U3RyaW5nPiBteVN0cmVhbSA9IG15TGlzdC5zdHJlYW0oKTsKKworICAgICAgICBteVN0cmVhbS5tYXAocyAtPiBzICsgIjopIikKKyAgICAgICAgCSAgICAgICAgLmZpbHRlcihzIC0+IHMubGVuZ3RoKCk+MSkKKyAgICAgICAgCQkgICAgLmZsYXRNYXAocyAtPiBBcnJheXMuc3RyZWFtKHMuc3BsaXQoIiIpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmFyKCl7CisgICAgICAgIFN0cmVhbTxTdHJpbmc+IG15U3RyZWFtOworICAgICAgICBteVN0cmVhbS5maWx0ZXIocyAtPiBzLmNvbnRhaW5zKCJIYW1sZXQiKSkKKyAgICAgICAgICAgIC5tYXAobCAtPiBsLmxlbmd0aCgpKQorICAgICAgICAgICAgLmZpbHRlcihzIC0+IHMgPiAxNSkKKyAgICAgICAgICAgIC5jb3VudCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUyMDAuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUyMDAuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyZmZlMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTIwMC5qYXZhLnR4dApAQCAtMCwwICsxLDMyIEBACitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBKYXZhVGVzdCB7CisgICAgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24geworICAgICAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZ2V0Tm9kZXNCeVR5cGUoQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xhc3MgSmF2YVBhcnNlckZhY2FkZSB7CisgICAgICAgIHB1YmxpYyBTb2x2ZWQgc29sdmUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNvbHZlZCgpOworICAgICAgICB9CisgICAgfQorICAgIGNsYXNzIFNvbHZlZCB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU29sdmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZm9vKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZERlY2wKKyAgICAgICAgICAgICAgICAuZ2V0Tm9kZXNCeVR5cGUoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcChzdGF0ZW1lbnQgLT4geworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhUGFyc2VyRmFjYWRlKCkuc29sdmUoc3RhdGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKHBhcnNlZCAtPiBwYXJzZWQgIT0gbnVsbCAmJiBwYXJzZWQuaXNTb2x2ZWQoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTIzMi5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTIzMi5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU1NzBhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMjMyLmphdmEudHh0CkBAIC0wLDAgKzEsMTIgQEAKK2NsYXNzIERvdWJsZSB7Cit9CisKK2NsYXNzIERvdWJsZUNvbnN1bWVyIHsKK30KKworaW50ZXJmYWNlIE9mRG91YmxlIGV4dGVuZHMgT2ZQcmltaXRpdmU8RG91YmxlLCBEb3VibGVDb25zdW1lciwgT2ZEb3VibGU+IHsKKworfQorCitpbnRlcmZhY2UgT2ZQcmltaXRpdmU8VCwgQywgUyBleHRlbmRzIE9mUHJpbWl0aXZlPFQsIEMsIFM+PiB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMjM1LmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMjM1LmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwY2E0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUyMzUuamF2YS50eHQKQEAgLTAsMCArMSwxNyBAQAorY2xhc3MgRm9vIHsKKyAgICBzdGF0aWMgY2xhc3MgQmFyIHsKKyAgICAgICAgc3RhdGljIGNsYXNzIEJheiB7fQorICAgIH0KKyAgICBzdGF0aWMgdm9pZCBuZXdfQmFyX0Jhel9kaXJlY3QoKSB7CisgICAgICAgIG5ldyBCYXIuQmF6KCk7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIG5ld19CYXJfQmF6KCkgeworICAgICAgICBuZXcgQmFyLkJheigpIHt9OworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBuZXdfQmFyKCkgeworICAgICAgICBuZXcgQmFyKCkge307CisgICAgfQorICAgIHN0YXRpYyB2b2lkIG5ld19Gb29fQmFyKCkgeworICAgICAgICBuZXcgRm9vLkJhcigpIHt9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTI0MS5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTI0MS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI4Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMjQxLmphdmEudHh0CkBAIC0wLDAgKzEsNyBAQAoraW1wb3J0IHN0YXRpYyBpc3N1ZTI0MS5UeXBlV2l0aE1lbWJlclR5cGUuTWVtYmVySW50ZXJmYWNlOyAKKworcHVibGljIGNsYXNzIE1haW4geworCisJcHJpdmF0ZSBNZW1iZXJJbnRlcmZhY2UgZm9vOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMjUxLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMjUxLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWU2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWUyNTEuamF2YS50eHQKQEAgLTAsMCArMSwxNyBAQAorY2xhc3MgTWFpbiB7CisJCisJY2xhc3MgRm9vIHsgfQorCQorCWludGVyZmFjZSBHZW5lcmljQmFzZSA8Rj4geyB9CisJCisJY2xhc3MgR2VuZXJpY0Rlcml2ZWQgPEYgZXh0ZW5kcyBGb28+IGltcGxlbWVudHMgR2VuZXJpY0Jhc2U8Rj4geyB9CisKKwlwcml2YXRlIDxCIGV4dGVuZHMgRm9vPiB2b2lkIGZvbyhHZW5lcmljQmFzZTxCPiBnKSB7IH0KKwkKKwlwcml2YXRlIDxEIGV4dGVuZHMgRm9vPiB2b2lkIGZvbyhHZW5lcmljRGVyaXZlZDxEPiBnKSB7IH0KKwkKKwl2b2lkIGJhcigpIHsKKwkJR2VuZXJpY0Rlcml2ZWQ8Rm9vPiBnZCA9IG5ldyBHZW5lcmljRGVyaXZlZDw+KCk7CisJCWZvbyhnZCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTMzOC5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Jc3N1ZTMzOC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTgwMTBlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlMzM4LmphdmEudHh0CkBAIC0wLDAgKzEsOTMgQEAKK2NsYXNzIFR5cGVQcm9tb3Rpb25zIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBieXRlUGFyYW0oYnl0ZSBwMSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG9ydFBhcmFtKHNob3J0IHAxKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGludFBhcmFtKGludCBwMSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb25nUGFyYW0obG9uZyBwMSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsaW5nTG9uZygpIHsKKyAgICAgICAgICAgIGxvbmdQYXJhbSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGxvbmdQYXJhbSgoc2hvcnQpMSk7CisgICAgICAgICAgICBsb25nUGFyYW0oMSk7CisgICAgICAgICAgICBsb25nUGFyYW0oMUwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2FsbGluZ0ludCgpIHsKKyAgICAgICAgICAgIGludFBhcmFtKChieXRlKTEpOworICAgICAgICAgICAgaW50UGFyYW0oKHNob3J0KTEpOworICAgICAgICAgICAgaW50UGFyYW0oMSk7CisgICAgICAgICAgICBpbnRQYXJhbSgxTCk7IC8vIGZhaWxzCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsaW5nU2hvcnQoKSB7CisgICAgICAgICAgICBzaG9ydFBhcmFtKChieXRlKTEpOworICAgICAgICAgICAgc2hvcnRQYXJhbSgoc2hvcnQpMSk7CisgICAgICAgICAgICBzaG9ydFBhcmFtKDEpOyAvLyBmYWlscworICAgICAgICAgICAgc2hvcnRQYXJhbSgxTCk7IC8vIGZhaWxzCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsaW5nQnl0ZSgpIHsKKyAgICAgICAgICAgIGJ5dGVQYXJhbSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGJ5dGVQYXJhbSgoc2hvcnQpMSk7IC8vIGZhaWxzCisgICAgICAgICAgICBieXRlUGFyYW0oMSk7IC8vIGZhaWxzCisgICAgICAgICAgICBieXRlUGFyYW0oMUwpOyAvLyBmYWlscworICAgICAgICB9CisgICAgfQorCitjbGFzcyBUeXBlUHJvbW90aW9uc1dpdGhFeHRyYVBhcmFtIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBieXRlUGFyYW0oaW50IHAwLCBieXRlIHAxKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3J0UGFyYW0oaW50IHAwLCBzaG9ydCBwMSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbnRQYXJhbShpbnQgcDAsIGludCBwMSkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb25nUGFyYW0oaW50IHAwLCBsb25nIHAxKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGxpbmdMb25nKCkgeworICAgICAgICAgICAgbG9uZ1BhcmFtKDYsIChieXRlKTEpOworICAgICAgICAgICAgbG9uZ1BhcmFtKDYsIChzaG9ydCkxKTsKKyAgICAgICAgICAgIGxvbmdQYXJhbSg2LCAxKTsKKyAgICAgICAgICAgIGxvbmdQYXJhbSg2LCAxTCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsaW5nSW50KCkgeworICAgICAgICAgICAgaW50UGFyYW0oNiwgKGJ5dGUpMSk7CisgICAgICAgICAgICBpbnRQYXJhbSg2LCAoc2hvcnQpMSk7CisgICAgICAgICAgICBpbnRQYXJhbSg2LCAxKTsKKyAgICAgICAgICAgIGludFBhcmFtKDYsIDFMKTsgLy8gZmFpbHMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGxpbmdTaG9ydCgpIHsKKyAgICAgICAgICAgIHNob3J0UGFyYW0oNiwgKGJ5dGUpMSk7CisgICAgICAgICAgICBzaG9ydFBhcmFtKDYsIChzaG9ydCkxKTsKKyAgICAgICAgICAgIHNob3J0UGFyYW0oNiwgMSk7IC8vIGZhaWxzCisgICAgICAgICAgICBzaG9ydFBhcmFtKDYsIDFMKTsgLy8gZmFpbHMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGxpbmdCeXRlKCkgeworICAgICAgICAgICAgYnl0ZVBhcmFtKDYsIChieXRlKTEpOworICAgICAgICAgICAgYnl0ZVBhcmFtKDYsIChzaG9ydCkxKTsgLy8gZmFpbHMKKyAgICAgICAgICAgIGJ5dGVQYXJhbSg2LCAxKTsgLy8gZmFpbHMKKyAgICAgICAgICAgIGJ5dGVQYXJhbSg2LCAxTCk7IC8vIGZhaWxzCisgICAgICAgIH0KKyAgICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlODQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSXNzdWU4NC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2MzYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0lzc3VlODQuamF2YS50eHQKQEAgLTAsMCArMSwxMCBAQAorcHVibGljIGNsYXNzIFZhcmlhZGljSXNzdWUgeworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgdmFyaWFkaWNNZXRob2QodHJ1ZSwgMSwgMiwgMyk7CisgIH0KKworICBzdGF0aWMgU3RyaW5nIHZhcmlhZGljTWV0aG9kKGJvb2xlYW4gYiwgaW50Li4uIGludHMpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9KcmVDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSnJlQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODI5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvSnJlQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEudHh0CkBAIC0wLDAgKzEsMTAgQEAKK2ltcG9ydCBqYXZhLmlvLio7CisKK2NsYXNzIE15Q2xhc3MgeworCisJcHVibGljIHZvaWQgZm9vMSgpIHsKKwkgICAgamF2YS51dGlsLlNjYW5uZXIgcyA9IG5ldyBqYXZhLnV0aWwuU2Nhbm5lcihpbiwgZW5jb2RpbmcpLnVzZURlbGltaXRlcigiXFxBIik7CisgICAgICAgIHJldHVybiBzLmhhc05leHQoKSA/IHMubmV4dCgpIDogIiI7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0xhbWJkYS5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9MYW1iZGEuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwY2JkZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9MYW1iZGEuamF2YS50eHQKQEAgLTAsMCArMSw0NCBAQAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOworCitARnVuY3Rpb25hbEludGVyZmFjZQorcHVibGljIGludGVyZmFjZSBMYW1iZGEgeworCVN0cmluZyBwcm9jZXNzKFN0cmluZyB2YWx1ZSk7Cit9CisKK3B1YmxpYyBjbGFzcyBBZ2VuZGEgeworCQorCUxhbWJkYSBmdW5jdGlvbmFsID0gcCAtPiBwLnRvTG93ZXJDYXNlKCk7CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwZXJzb25zOworCisgICAgcHVibGljIHZvaWQgbGFtYmRhTWFwKFN0cmluZyBwZXJzb25OYW1lKSB7CisgICAgICAgIHJldHVybiBwZXJzb25zLnN0cmVhbSgpLm1hcChwIC0+IHAudG9Mb3dlckNhc2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGFtYmRhTWFwMigpeworICAgICAgICByZXR1cm4gcGVyc29ucy5zdHJlYW0oKS5tYXAocCAtPiBwLmNvZGVQb2ludHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVkdWNlKCl7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gYTsKKyAgICAgICAgcmV0dXJuIGEuc3RyZWFtKCkucmVkdWNlKCh4LHkpIC0+IHggKiB5KTsKKyAgICB9CisKKyAgICBkb3VibGUgdGVzdChCaUZ1bmN0aW9uPEludGVnZXIsTGlzdCxTdHJpbmc+IGZ1bmMpeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGJpZnVuYygpeworICAgICAgICByZXR1cm4gdGVzdCgoeCx5KSAtPiBTdHJpbmcudmFsdWVPZihmdW5jKHgseSkpKTsKKyAgICB9CisKKyAgICBpbnQgZnVuYyhpbnQgYSwgTGlzdCBiKXsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZ1bmN0aW9uYWxWYXIoKSB7CisgICAgCUxhbWJkYSBhID0gcCAtPiBwLnRvTG93ZXJDYXNlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTGFtYmRhQ29sbGVjdC5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9MYW1iZGFDb2xsZWN0LmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTRkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTGFtYmRhQ29sbGVjdC5qYXZhLnR4dApAQCAtMCwwICsxLDEyIEBACitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitwdWJsaWMgY2xhc3MgQWdlbmRhIHsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHBlcnNvbnM7CisKKyAgICBwdWJsaWMgdm9pZCBsYW1iZGFNYXAoU3RyaW5nIHBlcnNvbk5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbnMuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9MYW1iZGFNdWx0aS5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9MYW1iZGFNdWx0aS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzc4NDUzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0xhbWJkYU11bHRpLmphdmEudHh0CkBAIC0wLDAgKzEsMzIgQEAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKKworcHVibGljIGNsYXNzIEFnZW5kYSB7CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwZXJzb25zOworCisgICAgcHVibGljIHZvaWQgbGFtYmRhSW1wbGllZFJldHVybigpIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbnMuc3RyZWFtKCkucGFyYWxsZWwoKS5tYXAoaSAtPiB7CisgICAgICAgICAgICBhZGRQZXJzb24oIiIpOworICAgICAgICB9KS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsYW1iZGFTaW5nbGVSZXR1cm4oKSB7CisgICAgICAgIHJldHVybiBwZXJzb25zLnN0cmVhbSgpLnBhcmFsbGVsKCkubWFwKGkgLT4geworICAgICAgICAgICAgcmV0dXJuIGFkZFBlcnNvbigiIik7CisgICAgICAgIH0pLmZpbmRGaXJzdCgpLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpTGluZVJldHVybigpIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbnMuc3RyZWFtKCkucGFyYWxsZWwoKS5tYXAoaSAtPiB7CisgICAgICAgICAgICBpbnQgaXJyZWxldmFudDsKKyAgICAgICAgICAgIHJldHVybiBhZGRQZXJzb24oIiIpOworICAgICAgICB9KS5maW5kRmlyc3QoKS5nZXQoKTsKKyAgICB9CisKKworICAgIFN0cmluZyBhZGRQZXJzb24oU3RyaW5nIHgpeworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTGFtYmRhVm9pZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9MYW1iZGFWb2lkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTZlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTGFtYmRhVm9pZC5qYXZhLnR4dApAQCAtMCwwICsxLDE0IEBACitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBBZ2VuZGEgeworCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGVyc29uczsKKworICAgIHB1YmxpYyB2b2lkIGxhbWJkYUVtcHR5KCkgeworICAgICAgICByZXR1cm4gcGVyc29ucy5zdHJlYW0oKS5mb3JFYWNoKHAgLT4geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHApOworICAgICAgICB9KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9Mb2NhbFR5cGVEZWNsYXJhdGlvbnMuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTG9jYWxUeXBlRGVjbGFyYXRpb25zLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4N2E0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTG9jYWxUeXBlRGVjbGFyYXRpb25zLmphdmEudHh0CkBAIC0wLDAgKzEsMTQgQEAKK2NsYXNzIEZvbyB7CisKKyAgICB2b2lkIGJhcigpeworICAgICAgICBpbnQgYTsKKyAgICAgICAgSW50ZWdlciBiOworICAgICAgICBDbGFzczxJbnRlZ2VyPiBjOworICAgICAgICBDbGFzczw/IHN1cGVyIEludGVnZXI+IGQ7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBJbnRlZ2VyPiBlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ2xhc3M8PyBzdXBlciBDbGFzczw/IGV4dGVuZHMgSW50ZWdlcj4+PiBmOworICAgICAgICBDbGFzczw/IHN1cGVyIENsYXNzPD8gZXh0ZW5kcyBDbGFzczw/IHN1cGVyIEludGVnZXI+Pj4gZzsKKyAgICAgICAgYTtiO2M7ZDtlO2Y7ZzsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTG9jYWxWYXJpYWJsZUluUGFyZW50LmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0xvY2FsVmFyaWFibGVJblBhcmVudC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjZhYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL0xvY2FsVmFyaWFibGVJblBhcmVudC5qYXZhLnR4dApAQCAtMCwwICsxLDU3IEBACitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIE5vZGUgeworfQorCitjbGFzcyBDb21tZW50IHsKK30KKworY2xhc3MgTG9jYWxWYXJpYWJsZUluUGFyZW50IHsKKworICAgIHZvaWQgZm9vMSgpIHsKKyAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBudWxsKXsKKyAgICAgICAgICAgIFN0cmluZyBzOworICAgICAgICAgICAgZm9yIChPYmplY3QgYyA6IG51bGwpeworICAgICAgICAgICAgICAgIGlmICh0cnVlKXsKKyAgICAgICAgICAgICAgICAgICAgczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGZvbzMoKSB7CisgICAgICAgZm9yIChOb2RlIGNoaWxkIDogbnVsbCl7CisgICAgICAgICAgICBTdHJpbmcgczsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IGMgOiBudWxsKXsKKyAgICAgICAgICAgICAgICBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBmb28yKCkgeworICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IG51bGwpeworICAgICAgICAgICAgU3RyaW5nIHM7CisgICAgICAgICAgICBzOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBmb280KCkgeworICAgICAgICBMaXN0PE5vZGU+IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZHJlbk5vZGVzKCk7CisgICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IGNoaWxkcmVuKXsKKyAgICAgICAgICAgIExpc3Q8Q29tbWVudD4gY29tbWVudHNJbnNpZGVDaGlsZCA9IG5ldyBMaW5rZWRMaXN0PENvbW1lbnQ+KCk7CisgICAgICAgICAgICBmb3IgKENvbW1lbnQgYyA6IGNvbW1lbnRzVG9BdHRyaWJ1dGUpeworICAgICAgICAgICAgICAgIGlmICh0cnVlKXsKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudHNJbnNpZGVDaGlsZC5hZGQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBmb281KCkgeworICAgICAgICBMaXN0PENvbW1lbnQ+IGNvbW1lbnRzSW5zaWRlQ2hpbGQ7CisgICAgICAgIENvbW1lbnQgYzsKKyAgICAgICAgY29tbWVudHNJbnNpZGVDaGlsZC5hZGQoYyk7CisgICAgfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTWV0aG9kQ2FsbHMuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTWV0aG9kQ2FsbHMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MTE5YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9NZXRob2RDYWxscy5qYXZhLnR4dApAQCAtMCwwICsxLDcwIEBACitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIE1ldGhvZENhbGxzIHsKKworICAgIHB1YmxpYyBpbnQgbWVtYmVyOworICAgIAorICAgIHB1YmxpYyBNZXRob2RDYWxscyBnZXRTZWxmKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgZm9vKCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBiYXIxKCkKKyAgICB7CisgICAgICAgIGdldFNlbGYoKS5nZXRTZWxmKCkuZm9vKCk7CisgICAgfQorCisgICAgaW50IGJhcjIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFNlbGYoKS5tOworICAgIH0KKworICAgIHZvaWQgaW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kKCl7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gbGlzdDsKKyAgICAgICAgbGlzdC50b1N0cmluZygpOworICAgIH0KKworICAgIHZvaWQgdmFyaWFkaWNUZXN0KCl7CisgICAgICAgIFN0cmluZ1tdIHZhckFyZyA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgIGZvb2JhcigiYSIpOworICAgICAgICBmb29iYXIodmFyQXJnKTsKKyAgICB9CisKKyAgICBpbnQgZm9vYmFyKFN0cmluZyBzKXsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgdm9pZCBmb29iYXIoU3RyaW5nLi4uIHMpeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdm9pZCB2YXJpYWRpY01ldGhvZChTdHJpbmcuLi4gcykKKyAgICB7CisgICAgICAgIHRoaXMudmFyaWFkaWNNZXRob2QoInRlc3QiKTsKKyAgICB9CisKKyAgICA8VD4gVCBnZW5lcmljTWV0aG9kMCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICA8VD4gVCBnZW5lcmljTWV0aG9kMShUIHgpIHsgcmV0dXJuIHg7IH0KKworICAgIHN0YXRpYyA8VD4gVCBzdGF0aWNHZW5lcmljTWV0aG9kMCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBzdGF0aWMgPFQ+IFQgc3RhdGljR2VuZXJpY01ldGhvZDEoVCB4KSB7IHJldHVybiB4OyB9CisKKyAgICBzdGF0aWMgY2xhc3MgR2VuZXJpY0NsYXNzPFQ+IHt9CisKKyAgICBzdGF0aWMgdm9pZCB2YXJpYWRpY1dpdGhHZW5lcmljQXJnKGludCBpLCBHZW5lcmljQ2xhc3M8Pz4uLi4gYykge30KKworICAgIHZvaWQgZ2VuZXJpY01ldGhvZFRlc3QoKSB7CisgICAgICAgIHRoaXMuPEludGVnZXI+Z2VuZXJpY01ldGhvZDAoKTsKKyAgICAgICAgdGhpcy5nZW5lcmljTWV0aG9kMSgiSGVsbG8iKTsKKworICAgICAgICBNZXRob2RDYWxscy48SW50ZWdlcj5zdGF0aWNHZW5lcmljTWV0aG9kMCgpOworICAgICAgICBNZXRob2RDYWxscy5zdGF0aWNHZW5lcmljTWV0aG9kMSgiSGVsbG8iKTsKKworICAgICAgICBNZXRob2RDYWxscy52YXJpYWRpY1dpdGhHZW5lcmljQXJnKDEsIG5ldyBHZW5lcmljQ2xhc3M8TG9uZz4oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL01ldGhvZFR5cGVQYXJhbWV0ZXIuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTWV0aG9kVHlwZVBhcmFtZXRlci5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDBhMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL01ldGhvZFR5cGVQYXJhbWV0ZXIuamF2YS50eHQKQEAgLTAsMCArMSw3IEBACitjbGFzcyBGb288QSwgQj4geworICAgIHB1YmxpYyA8Qz4gdm9pZCBmb28oQyBjKTsKKworICAgIHB1YmxpYyB2b2lkIHVzYWdlKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBmb28ocyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9NZXRob2RUeXBlUGFyYW1zLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL01ldGhvZFR5cGVQYXJhbXMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1MjY2NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9NZXRob2RUeXBlUGFyYW1zLmphdmEudHh0CkBAIC0wLDAgKzEsMzggQEAKK2NsYXNzIENvbXBpbGF0aW9uVW5pdCB7CisKK30KKworcHVibGljIGludGVyZmFjZSBWb2lkVmlzaXRvcjxBPiB7CisKKwl2b2lkIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEphdmFkb2NDb21tZW50IG4sIEEgYXJnKTsKK30KKworcHVibGljIGludGVyZmFjZSBHZW5lcmljVmlzaXRvcjxSLCBBPiB7CisKKwlSIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEphdmFkb2NDb21tZW50IG4sIEEgYXJnKTsKK30KKworY2xhc3MgSmF2YWRvY0NvbW1lbnQgeworCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworfQorCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVm9pZFZpc2l0b3JBZGFwdGVyPEE+IGltcGxlbWVudHMgVm9pZFZpc2l0b3I8QT4geworCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCSAgICBKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudDsKKwkJamF2YWRvY0NvbW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL01ldGhvZFdpdGhUeXBlcy5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9NZXRob2RXaXRoVHlwZXMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzNmUyMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9NZXRob2RXaXRoVHlwZXMuamF2YS50eHQKQEAgLTAsMCArMSw2IEBACitjbGFzcyBNYWluIHsKKyAgICBwdWJsaWMgdm9pZCBtZXRob2RXaXRoTG9jYWxUeXBlcygpIHsKKyAgICAgICAgY2xhc3MgTG9jYWxDbGFzcyB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTmF2aWdhdG9yLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvci5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdhNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvci5qYXZhLnR4dApAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIG1lLnRvbWFzc2V0dGkuc3ltYm9sc29sdmVyLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNvbnZlbmllbnRseSByZXRyaWV2ZSBjZXJ0YWluIG5vZGUgZnJvbSBhIEphdmFQYXJzZXIgQVNULgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yIHsKKworICAgIHByaXZhdGUgTmF2aWdhdG9yKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbj4gZmluZFR5cGUoQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY3UuZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoKHQpIC0+IHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvcjIuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTmF2aWdhdG9yMi5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTBhNDYzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvcjIuamF2YS50eHQKQEAgLTAsMCArMSwyMyBAQAoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY29udmVuaWVudGx5IHJldHJpZXZlIGNlcnRhaW4gbm9kZSBmcm9tIGEgSmF2YVBhcnNlciBBU1QuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOYXZpZ2F0b3IgeworCisgICAgcHJpdmF0ZSBOYXZpZ2F0b3IoKSB7CisgICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8VHlwZURlY2xhcmF0aW9uPiBmaW5kVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGN1LmdldFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKCh0KSAtPiB0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLmZpbmRGaXJzdCgpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9OYXZpZ2F0b3IzLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvcjMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlNzQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9OYXZpZ2F0b3IzLmphdmEudHh0CkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgbXkucGFja2FnZXo7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNvbnZlbmllbnRseSByZXRyaWV2ZSBjZXJ0YWluIG5vZGUgZnJvbSBhIEphdmFQYXJzZXIgQVNULgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yIHsKKworICAgIHByaXZhdGUgTmF2aWdhdG9yKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFR5cGVEZWNsYXJhdGlvbj4gZmluZFR5cGUoQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY3UuZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoKHQpIC0+IHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvclNpbXBsaWZpZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvTmF2aWdhdG9yU2ltcGxpZmllZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg1NmJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL05hdmlnYXRvclNpbXBsaWZpZWQuamF2YS50eHQKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBtZS50b21hc3NldHRpLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNvbnZlbmllbnRseSByZXRyaWV2ZSBjZXJ0YWluIG5vZGUgZnJvbSBhIEphdmFQYXJzZXIgQVNULgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmF2aWdhdG9yIHsKKworICAgIHByaXZhdGUgTmF2aWdhdG9yKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmluZFR5cGUoKSB7CisgICAgICAgIFN0cmVhbTxTdHJpbmc+IHMgPSBudWxsOworICAgICAgICBzLmZpbHRlcigodCktPnQuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmb28oU3RyZWFtPFN0cmluZz4gcyl7CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvT3ZlcmxvYWRlZE1ldGhvZHMuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvT3ZlcmxvYWRlZE1ldGhvZHMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmMzE3YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9PdmVybG9hZGVkTWV0aG9kcy5qYXZhLnR4dApAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIENyZWF0ZWQgYnkgZmVkZXJpY28gb24gMDIvMDgvMTUuCisgKi8KK3B1YmxpYyBjbGFzcyBPdmVybG9hZGVkTWV0aG9kcyB7CisKKyAgICBwdWJsaWMgdm9pZCBvdmVybG9hZGVkKE9iamVjdCBvKXsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG92ZXJsb2FkZWQoU3RyaW5nIG8peworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbTEoKXsKKyAgICAgICAgb3ZlcmxvYWRlZChudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtMigpeworICAgICAgICBTdHJpbmcgcyA9IG51bGw7CisgICAgICAgIG92ZXJsb2FkZWQocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbTMoKXsKKyAgICAgICAgT2JqZWN0IG8gPSBudWxsOworICAgICAgICBvdmVybG9hZGVkKG8pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9RdWFsaWZpZWROYW1lVGVzdC5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9RdWFsaWZpZWROYW1lVGVzdC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY4NmZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1F1YWxpZmllZE5hbWVUZXN0LmphdmEudHh0CkBAIC0wLDAgKzEsOCBAQAorY2xhc3MgUXVhbGlmaWVkTmFtZVRlc3QgeworCisJcHVibGljIHZvaWQgZm9vMSgpIHsKKwkJamF2YS51dGlsLlNjYW5uZXIgczsKKwkJcmV0dXJuIHM7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1JlZmVyZW5jZXNUb0ZpZWxkLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1JlZmVyZW5jZXNUb0ZpZWxkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODBlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvUmVmZXJlbmNlc1RvRmllbGQuamF2YS50eHQKQEAgLTAsMCArMSwxOCBAQAorY2xhc3MgUmVmZXJlbmNlc1RvRmllbGQgIHsKKworICAgIGludCBpOworCisgICAgcHVibGljIHZvaWQgbWV0aG9kMSgpeworICAgICAgICBpID0gMjsKKyAgICB9CisKK30KKworY2xhc3MgUmVmZXJlbmNlc1RvRmllbGRFeHRlbmRpbmdDbGFzcyBleHRlbmRzIFJlZmVyZW5jZXNUb0ZpZWxkIHsKKworICAgIHB1YmxpYyB2b2lkIG1ldGhvZDIoKXsKKyAgICAgICAgaSA9IDI7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9SZWZlcmVuY2VzVG9QYXJhbWV0ZXIuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvUmVmZXJlbmNlc1RvUGFyYW1ldGVyLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWQ5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvUmVmZXJlbmNlc1RvUGFyYW1ldGVyLmphdmEudHh0CkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2Ugc2FtcGxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKKworY2xhc3MgUmVmZXJlbmNlVG9QYXJhbWV0ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uRXhwciB7CisKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKGludCBmb28peworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZm9vKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9SZWZsZWN0aW9uRmllbGRPZkl0c2VsZi5qYXZhLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9SZWZsZWN0aW9uRmllbGRPZkl0c2VsZi5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWU4MTJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1JlZmxlY3Rpb25GaWVsZE9mSXRzZWxmLmphdmEudHh0CkBAIC0wLDAgKzEsNyBAQAoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCitwdWJsaWMgY2xhc3MgTXlDbGFzcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUMgPSBNb2RpZmllci5QVUJMSUM7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvU3dpdGNoT25FbnVtLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1N3aXRjaE9uRW51bS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2VjMzdiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1N3aXRjaE9uRW51bS5qYXZhLnR4dApAQCAtMCwwICsxLDE1IEBACitjbGFzcyBTd2l0Y2hPbkVudW0geworCisgICAgZW51bSBNeUVudW0geworICAgICAgICBFMSwgRTIsIEUzCisgICAgfQorCisJcHVibGljIHZvaWQgZm9vKCkgeworCSAgICBNeUVudW0gZTsKKwkJc3dpdGNoIChlKXsKKwkJICAgIGNhc2UgRTE6CisJCSAgICAgICAgYnJlYWs7CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvU3ltYm9sUmVzb2x2ZXJFeGFtcGxlLmphdmEudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1N5bWJvbFJlc29sdmVyRXhhbXBsZS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RhZWFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL1N5bWJvbFJlc29sdmVyRXhhbXBsZS5qYXZhLnR4dApAQCAtMCwwICsxLDExIEBACitjbGFzcyBBIHsKKyAgICBBW10gZm9vKFN0cmluZ1tdIHAxLCBpbnRbXSBwMikgeyB9Cit9CisKK2NsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgICBmbG9hdCBiOworfQorCitjbGFzcyBDIGV4dGVuZHMgQiB7CisgICAgaW50IGM7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvVGhpc0luQW5vbnltb3VzQ2xhc3MuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvVGhpc0luQW5vbnltb3VzQ2xhc3MuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ODM2NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9UaGlzSW5Bbm9ueW1vdXNDbGFzcy5qYXZhLnR4dApAQCAtMCwwICsxLDEzIEBACisgICAgY2xhc3MgRm9vIHsKKyAgICAgICAgdm9pZCBmb28oKSB7IH0KKyAgICB9CisKKyAgICBjbGFzcyBCYXIgeworICAgICAgICB2b2lkIGJhcigpIHsKKyAgICAgICAgICAgIG5ldyBGb28oKSB7CisgICAgICAgICAgICAgICAgdm9pZCBleHRyYUZvbygpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mb28oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9UeXBlUGFyYW1PblJldHVyblR5cGUuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvVHlwZVBhcmFtT25SZXR1cm5UeXBlLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDBiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvVHlwZVBhcmFtT25SZXR1cm5UeXBlLmphdmEudHh0CkBAIC0wLDAgKzEsMTUgQEAKK3B1YmxpYyBpbnRlcmZhY2UgR2VuZXJpY1Zpc2l0b3I8UiwgQT4geworCit9CisKK2NsYXNzIE5vZGUgeworICAgIHB1YmxpYyBhYnN0cmFjdCA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpOworfQorCitjbGFzcyBUeXBlUGFyYW1PblJldHVyblR5cGUgaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxCb29sZWFuLCBOb2RlPiB7CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2RlRXF1YWxzKGZpbmFsIFQgbjEsIGZpbmFsIFQgbjIpIHsKKwkJcmV0dXJuIG4xLmFjY2VwdCh0aGlzLCBuMikuYm9vbGVhblZhbHVlKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2FhcnMvc3VwcG9ydC1jb21wYXQtMjQuMi4wLmFhciBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9hYXJzL3N1cHBvcnQtY29tcGF0LTI0LjIuMC5hYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlNjJlMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9hYXJzL3N1cHBvcnQtY29tcGF0LTI0LjIuMC5hYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2RpZmZlcmVudGlhdGVfZG90X2V4cHJlc3Npb25zL0ZpZWxkRG90RXhwcmVzc2lvbnMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9GaWVsZERvdEV4cHJlc3Npb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmOWI3NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9GaWVsZERvdEV4cHJlc3Npb25zLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcHVibGljIGNsYXNzIEZpZWxkRG90RXhwcmVzc2lvbnMgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgSW5uZXJDbGFzc0ZpZWxkQ29udGFpbmVyLm91dGVyRmllbGQuY29udGFpbmVyRmllbGQuY29udGFpbmVyRmllbGQuZmlyc3RDb250YWluZXJNZXRob2QoKTsKKyAgICAgICAgSW5uZXJDbGFzc0ZpZWxkQ29udGFpbmVyLklubmVyQ2xhc3MuaW5uZXJGaWVsZC5jb250YWluZXJGaWVsZC5jb250YWluZXJGaWVsZC5zZWNvbmRDb250YWluZXJNZXRob2QoKTsKKyAgICAgICAgSW5uZXJDbGFzc0ZpZWxkQ29udGFpbmVyLklubmVyQ2xhc3MuSW5uZXJJbm5lckNsYXNzLklubmVySW5uZXJJbm5lckNsYXNzLmlubmVySW5uZXJJbm5lckZpZWxkLnRoaXJkQ29udGFpbmVyTWV0aG9kKCk7CisgICAgfQorfQorCitjbGFzcyBGaWVsZENvbnRhaW5lciB7CisgICAgRmllbGRDb250YWluZXIgY29udGFpbmVyRmllbGQgPSBuZXcgRmllbGRDb250YWluZXIoKTsKKyAgICBwdWJsaWMgU3RyaW5nIGZpcnN0Q29udGFpbmVyTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gImZpcnN0Q29udGFpbmVyTWV0aG9kKCkiOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIHNlY29uZENvbnRhaW5lck1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuICJzZWNvbmRDb250YWluZXJNZXRob2QoKSI7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgdGhpcmRDb250YWluZXJNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAidGhpcmRDb250YWluZXJNZXRob2QoKSI7CisgICAgfQorfQorCitjbGFzcyBJbm5lckNsYXNzRmllbGRDb250YWluZXIgeworICAgIEZpZWxkQ29udGFpbmVyIG91dGVyRmllbGQgPSBuZXcgRmllbGRDb250YWluZXIoKTsKKyAgICBjbGFzcyBJbm5lckNsYXNzIHsKKyAgICAgICAgRmllbGRDb250YWluZXIgaW5uZXJGaWVsZCA9IG5ldyBGaWVsZENvbnRhaW5lcigpOworICAgICAgICBjbGFzcyBJbm5lcklubmVyQ2xhc3MgeworICAgICAgICAgICAgRmllbGRDb250YWluZXIgaW5uZXJJbm5lckZpZWxkID0gbmV3IEZpZWxkQ29udGFpbmVyKCk7CisgICAgICAgICAgICBjbGFzcyBJbm5lcklubmVySW5uZXJDbGFzcyB7CisgICAgICAgICAgICAgICAgRmllbGRDb250YWluZXIgaW5uZXJJbm5lcklubmVyRmllbGQgPSBuZXcgRmllbGRDb250YWluZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9Jbm5lckNsYXNzRG90RXhwcmVzc2lvbnMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9Jbm5lckNsYXNzRG90RXhwcmVzc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I4OWYwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2RpZmZlcmVudGlhdGVfZG90X2V4cHJlc3Npb25zL0lubmVyQ2xhc3NEb3RFeHByZXNzaW9ucy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3B1YmxpYyBjbGFzcyBJbm5lckNsYXNzRG90RXhwcmVzc2lvbnMgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgSW5uZXJDbGFzc0NvbnRhaW5lci5Jbm5lckNsYXNzLm1ldGhvZENhbGwoKTsKKyAgICAgICAgSW5uZXJDbGFzc0NvbnRhaW5lci5Jbm5lckNsYXNzLklubmVySW5uZXJDbGFzcy5pbm5lck1ldGhvZENhbGwoKTsKKyAgICAgICAgSW5uZXJDbGFzc0NvbnRhaW5lci5Jbm5lckNsYXNzLklubmVySW5uZXJDbGFzcy5Jbm5lcklubmVySW5uZXJDbGFzcy5pbm5lcklubmVyTWV0aG9kQ2FsbCgpOworICAgIH0KK30KKworY2xhc3MgSW5uZXJDbGFzc0NvbnRhaW5lciB7CisgICAgY2xhc3MgSW5uZXJDbGFzcyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENhbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gIkNhbGxlZE1ldGhvZCI7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MgSW5uZXJJbm5lckNsYXNzIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlubmVyTWV0aG9kQ2FsbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNhbGxlZElubmVySW5uZXJDbGFzcyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzcyBJbm5lcklubmVySW5uZXJDbGFzcyB7CisgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5uZXJJbm5lck1ldGhvZENhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ2FsbGVkSW5uZXJJbm5lcklubmVyQ2xhc3MiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9Jbm5lclN0YXRpY0NsYXNzRmllbGREb3RFeHByZXNzaW9ucy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2RpZmZlcmVudGlhdGVfZG90X2V4cHJlc3Npb25zL0lubmVyU3RhdGljQ2xhc3NGaWVsZERvdEV4cHJlc3Npb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjYjJkMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9Jbm5lclN0YXRpY0NsYXNzRmllbGREb3RFeHByZXNzaW9ucy5qYXZhCkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0IGNvbS5wYWNrYWdlTmFtZS5Jbm5lclN0YXRpY0NsYXNzRmllbGRDb250YWluZXI7CisKK3B1YmxpYyBjbGFzcyBJbm5lclN0YXRpY0NsYXNzRmllbGREb3RFeHByZXNzaW9ucyB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAvLyBmb3JjZSB0aGUgc29sdmluZyBvZiB0aGUgYXJndW1lbnQKKyAgICAgICAgSW50ZWdlci5wYXJzZUludChJbm5lclN0YXRpY0NsYXNzRmllbGRDb250YWluZXIuSW5uZXJDbGFzcy5Jbm5lcklubmVyQ2xhc3MuTVlfSU5UKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvUGFja2FnZURvdEV4cHJlc3Npb25zLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvUGFja2FnZURvdEV4cHJlc3Npb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjNWQzNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9QYWNrYWdlRG90RXhwcmVzc2lvbnMuamF2YQpAQCAtMCwwICsxLDE2IEBACitwdWJsaWMgY2xhc3MgUGFja2FnZURvdEV4cHJlc3Npb25zIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIC8vIE1ldGhvZCBjYWxsIGZyb20gcGFja2FnZSBwcmVmaXgKKyAgICAgICAgY29tLnBhY2thZ2VOYW1lLkNsYXNzSW5QYWNrYWdlLnN0YXRpY01ldGhvZCgpOworCisgICAgICAgIC8vIFN0YXRpYyBtZXRob2QgY2FsbHMgaW5zaWRlIGlubmVyIGNsYXNzZXMgd2l0aCBwYWNrYWdlIHByZWZpeAorICAgICAgICBjb20ucGFja2FnZU5hbWUuSW5uZXJDbGFzc0NvbnRhaW5lci5Jbm5lckNsYXNzLm1ldGhvZENhbGwoKTsKKyAgICAgICAgY29tLnBhY2thZ2VOYW1lLklubmVyQ2xhc3NDb250YWluZXIuSW5uZXJDbGFzcy5Jbm5lcklubmVyQ2xhc3MuaW5uZXJNZXRob2RDYWxsKCk7CisgICAgICAgIGNvbS5wYWNrYWdlTmFtZS5Jbm5lckNsYXNzQ29udGFpbmVyLklubmVyQ2xhc3MuSW5uZXJJbm5lckNsYXNzLklubmVySW5uZXJJbm5lckNsYXNzLmlubmVySW5uZXJNZXRob2RDYWxsKCk7CisKKyAgICAgICAgLy8gTWV0aG9kIGNhbGxzIGZyb20gZmllbGQgb2JqZWN0cyB3aXRoIHBhY2thZ2UgcHJlZml4CisgICAgICAgIGNvbS5wYWNrYWdlTmFtZS5Jbm5lckNsYXNzRmllbGRDb250YWluZXIub3V0ZXJGaWVsZC5jb250YWluZXJGaWVsZC5jb250YWluZXJGaWVsZC5maXJzdENvbnRhaW5lck1ldGhvZCgpOworICAgICAgICBjb20ucGFja2FnZU5hbWUuSW5uZXJDbGFzc0ZpZWxkQ29udGFpbmVyLklubmVyQ2xhc3MuaW5uZXJGaWVsZC5jb250YWluZXJGaWVsZC5jb250YWluZXJGaWVsZC5zZWNvbmRDb250YWluZXJNZXRob2QoKTsKKyAgICAgICAgY29tLnBhY2thZ2VOYW1lLklubmVyQ2xhc3NGaWVsZENvbnRhaW5lci5Jbm5lckNsYXNzLklubmVySW5uZXJDbGFzcy5Jbm5lcklubmVySW5uZXJDbGFzcy5pbm5lcklubmVySW5uZXJGaWVsZC50aGlyZENvbnRhaW5lck1ldGhvZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9jb20vcGFja2FnZU5hbWUvQ2xhc3NJblBhY2thZ2UuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9jb20vcGFja2FnZU5hbWUvQ2xhc3NJblBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGRiMzNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2RpZmZlcmVudGlhdGVfZG90X2V4cHJlc3Npb25zL2NvbS9wYWNrYWdlTmFtZS9DbGFzc0luUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20ucGFja2FnZU5hbWU7CisKK3B1YmxpYyBjbGFzcyBDbGFzc0luUGFja2FnZSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhdGljTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gIkNsYXNzSW5QYWNrYWdlLnN0YXRpY01ldGhvZCgpIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvY29tL3BhY2thZ2VOYW1lL0lubmVyQ2xhc3NDb250YWluZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9jb20vcGFja2FnZU5hbWUvSW5uZXJDbGFzc0NvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODBiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvY29tL3BhY2thZ2VOYW1lL0lubmVyQ2xhc3NDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDE3IEBACitwdWJsaWMgY2xhc3MgSW5uZXJDbGFzc0NvbnRhaW5lciB7CisgICAgY2xhc3MgSW5uZXJDbGFzcyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENhbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gIkNhbGxlZE1ldGhvZCI7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MgSW5uZXJJbm5lckNsYXNzIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlubmVyTWV0aG9kQ2FsbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNhbGxlZElubmVySW5uZXJDbGFzcyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzcyBJbm5lcklubmVySW5uZXJDbGFzcyB7CisgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5uZXJJbm5lck1ldGhvZENhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ2FsbGVkSW5uZXJJbm5lcklubmVyQ2xhc3MiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9jb20vcGFja2FnZU5hbWUvSW5uZXJDbGFzc0ZpZWxkQ29udGFpbmVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvY29tL3BhY2thZ2VOYW1lL0lubmVyQ2xhc3NGaWVsZENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDliY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvY29tL3BhY2thZ2VOYW1lL0lubmVyQ2xhc3NGaWVsZENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3B1YmxpYyBjbGFzcyBJbm5lckNsYXNzRmllbGRDb250YWluZXIgeworICAgIEZpZWxkQ29udGFpbmVyIG91dGVyRmllbGQgPSBuZXcgRmllbGRDb250YWluZXIoKTsKKyAgICBjbGFzcyBJbm5lckNsYXNzIHsKKyAgICAgICAgRmllbGRDb250YWluZXIgaW5uZXJGaWVsZCA9IG5ldyBGaWVsZENvbnRhaW5lcigpOworICAgICAgICBjbGFzcyBJbm5lcklubmVyQ2xhc3MgeworICAgICAgICAgICAgRmllbGRDb250YWluZXIgaW5uZXJJbm5lckZpZWxkID0gbmV3IEZpZWxkQ29udGFpbmVyKCk7CisgICAgICAgICAgICBjbGFzcyBJbm5lcklubmVySW5uZXJDbGFzcyB7CisgICAgICAgICAgICAgICAgRmllbGRDb250YWluZXIgaW5uZXJJbm5lcklubmVyRmllbGQgPSBuZXcgRmllbGRDb250YWluZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgRmllbGRDb250YWluZXIgeworICAgIEZpZWxkQ29udGFpbmVyIGNvbnRhaW5lckZpZWxkID0gbmV3IEZpZWxkQ29udGFpbmVyKCk7CisgICAgcHVibGljIFN0cmluZyBmaXJzdENvbnRhaW5lck1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuICJmaXJzdENvbnRhaW5lck1ldGhvZCgpIjsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBzZWNvbmRDb250YWluZXJNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAic2Vjb25kQ29udGFpbmVyTWV0aG9kKCkiOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIHRoaXJkQ29udGFpbmVyTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gInRoaXJkQ29udGFpbmVyTWV0aG9kKCkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9kaWZmZXJlbnRpYXRlX2RvdF9leHByZXNzaW9ucy9jb20vcGFja2FnZU5hbWUvSW5uZXJTdGF0aWNDbGFzc0ZpZWxkQ29udGFpbmVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvY29tL3BhY2thZ2VOYW1lL0lubmVyU3RhdGljQ2xhc3NGaWVsZENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2M2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvZGlmZmVyZW50aWF0ZV9kb3RfZXhwcmVzc2lvbnMvY29tL3BhY2thZ2VOYW1lL0lubmVyU3RhdGljQ2xhc3NGaWVsZENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLnBhY2thZ2VOYW1lOworCitwdWJsaWMgY2xhc3MgSW5uZXJTdGF0aWNDbGFzc0ZpZWxkQ29udGFpbmVyIHsKKyAgICBzdGF0aWMgY2xhc3MgSW5uZXJDbGFzcyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENhbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gIkNhbGxlZE1ldGhvZCI7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIGNsYXNzIElubmVySW5uZXJDbGFzcyB7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNWV9JTlQgPSAiMSI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbm5lck1ldGhvZENhbGwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDYWxsZWRJbm5lcklubmVyQ2xhc3MiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMTEzL2NvbS9mb28vV2lkZ2V0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUxMTMvY29tL2Zvby9XaWRnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNhYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMTEzL2NvbS9mb28vV2lkZ2V0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqCisgKiAoQykgMjAxNiBBZ2lseXN5cyBOViwgTExDLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIENvbmZpZGVudGlhbCBJbmZvcm1hdGlvbiBvZiBBZ2lseXN5cyBOViwgTExDLgorICovCitwYWNrYWdlIGNvbS5mb287CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkNvbWJpbmVkVHlwZVNvbHZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLlJlZmxlY3Rpb25UeXBlU29sdmVyOworCitwdWJsaWMgY2xhc3MgV2lkZ2V0IGV4dGVuZHMgY29tLmZvby5iYXNlLldpZGdldCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUk9PVCA9ICIvVXNlcnMvcGVsb3F1aW5hL2Rldi9qYXZhc3ltYm9sc29sdmVyLWlzc3VlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9ST09UID0gUFJPSkVDVF9ST09UICsgIi9zcmMvbWFpbi9qYXZhIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSBKQVZBX1JPT1QgKyAiL2NvbS9mb28vV2lkZ2V0LmphdmEiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgc3JjID0gbmV3IEZpbGUoSkFWQV9ST09UKTsKKyAgICAgICAgQ29tYmluZWRUeXBlU29sdmVyIGNvbWJpbmVkVHlwZVNvbHZlciA9IG5ldyBDb21iaW5lZFR5cGVTb2x2ZXIoKTsKKyAgICAgICAgY29tYmluZWRUeXBlU29sdmVyLmFkZChuZXcgUmVmbGVjdGlvblR5cGVTb2x2ZXIodHJ1ZSkpOworICAgICAgICBjb21iaW5lZFR5cGVTb2x2ZXIuYWRkKG5ldyBKYXZhUGFyc2VyVHlwZVNvbHZlcihzcmMpKTsKKworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZShDTEFTUykpOworCisgICAgICAgIEphdmFQYXJzZXJGYWNhZGUgcGFyc2VyRmFjYWRlID0gSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tYmluZWRUeXBlU29sdmVyKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBjb21waWxhdGlvblVuaXQuZ2V0Tm9kZXNCeVR5cGUoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpLnN0cmVhbSgpCisgICAgICAgICAgICAgIC5maWx0ZXIobm9kZSAtPiBub2RlLmdldE5hbWUoKS5lcXVhbHMoImRvU29tZXRoaW5nIikpLmZpbmRBbnkoKS5vckVsc2UobnVsbCk7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLmdldE5vZGVzQnlUeXBlKE1ldGhvZENhbGxFeHByLmNsYXNzKS5mb3JFYWNoKHBhcnNlckZhY2FkZTo6c29sdmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCkgeworICAgICAgICBkb1NvbWV0aGluZ01vcmUobmV3IFdpZGdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1NvbWV0aGluZ01vcmUoV2lkZ2V0IHZhbHVlKSB7CisgICAgICAgIC8vIGRvZXMgc29tZXRoaW5nCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMTEzL2NvbS9mb28vYmFzZS9XaWRnZXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTExMy9jb20vZm9vL2Jhc2UvV2lkZ2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmZmZlZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTExMy9jb20vZm9vL2Jhc2UvV2lkZ2V0LmphdmEKQEAgLTAsMCArMSw2IEBACisvKioKKyAqIChDKSAyMDE2IEFnaWx5c3lzIE5WLCBMTEMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgQ29uZmlkZW50aWFsIEluZm9ybWF0aW9uIG9mIEFnaWx5c3lzIE5WLCBMTEMuCisgKi8KK3BhY2thZ2UgY29tLmZvby5iYXNlOworCitwdWJsaWMgY2xhc3MgV2lkZ2V0IHt9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUxMjgvZm9vL0lzc3VlMTI4LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUxMjgvZm9vL0lzc3VlMTI4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0MTBlMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTEyOC9mb28vSXNzdWUxMjguamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGZvbzsKKworaW1wb3J0IHN0YXRpYyBmb28uSmF2YVRlc3QuKjsKKy8vIGhlcmUgY291bGQgYmUgdGhlIGNvcnJlY3QgaW1wb3J0IGZvciBiYXIKKworcHVibGljIGNsYXNzIEphdmFUZXN0IHsKKwlwdWJsaWMgdm9pZCB0ZXN0KCkgeworCQliYXIoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMTQ0L0hlbGxvV29ybGQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTE0NC9IZWxsb1dvcmxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0ZDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTE0NC9IZWxsb1dvcmxkLmphdmEKQEAgLTAsMCArMSw4IEBACitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCB7CisKKyAgICBzdGF0aWMgU3RyaW5nIGh3PSJIZWxsbyB3b3JsZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihodyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI0MS9UeXBlV2l0aE1lbWJlclR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI0MS9UeXBlV2l0aE1lbWJlclR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQyMWExCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjQxL1R5cGVXaXRoTWVtYmVyVHlwZS5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBpc3N1ZTI0MTsKKworcHVibGljIGNsYXNzIFR5cGVXaXRoTWVtYmVyVHlwZSB7CisKKwlwdWJsaWMgaW50ZXJmYWNlIE1lbWJlckludGVyZmFjZSB7CisJCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjU3L0EuamF2YS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUyNTcvQS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjVhMWQyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjU3L0EuamF2YS50eHQKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIGNvbS50ZXN0YnVnOworaW1wb3J0IG5ldC50ZXN0YnVnLkI7CitwdWJsaWMgY2xhc3MgQSB7CisJcHJpdmF0ZSBCIG9iajsKKwlwdWJsaWMgdm9pZCBydW4oKQorCXsKKwkJb2JqLnNldFBhcmFtZXRlcihudWxsKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjU3L2lzc3VlMjU3LmphciBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI1Ny9pc3N1ZTI1Ny5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjMWMxYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI1Ny9pc3N1ZTI1Ny5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjc2L2Zvby9BLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUyNzYvZm9vL0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzAyZWYzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjc2L2Zvby9BLmphdmEKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBmb287CisKK2ludGVyZmFjZSBBIHsKKworCWVudW0gRmluZE1lSWZZb3VDYW4geworCQlDT05TVEFOVAorCX0KKwkKKwl2b2lkIG92ZXJyaWRlTWUoRmluZE1lSWZZb3VDYW4gdik7Cit9CisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjc2L2Zvby9CLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUyNzYvZm9vL0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWMzYjNiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjc2L2Zvby9CLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIGZvbzsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQiBpbXBsZW1lbnRzIEEgeworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI3Ni9mb28vQy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMjc2L2Zvby9DLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0ZjVlNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9pc3N1ZTI3Ni9mb28vQy5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgZm9vOworCitwdWJsaWMgY2xhc3MgQyB7CisJcHVibGljIHN0YXRpYyBBIGdldEZvbygpIHsKKwkJcmV0dXJuIG5ldyBCKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBvdmVycmlkZU1lKEZpbmRNZUlmWW91Q2FuIHYpIHsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMzAwL0lzc3VlMzAwLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvaXNzdWUzMDAvSXNzdWUzMDAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTM5NzEyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2lzc3VlMzAwL0lzc3VlMzAwLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIElzc3VlMzAwIHsKKworICAgIGNsYXNzIEEgeworICAgICAgICBpbnQgaTsKKyAgICB9CisKKyAgICBjbGFzcyBCIHsKKyAgICAgICAgQigpIHsKKyAgICAgICAgICAgIG5ldyBBKCkuaSA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTIuMS4wLmphciBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyLWNvcmUtMi4xLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDRlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTIuMS4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlci1jb3JlLTMuMC4wLWFscGhhLjIuamFyIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0zLjAuMC1hbHBoYS4yLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmU1YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXItY29yZS0zLjAuMC1hbHBoYS4yLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0FTVEhlbHBlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0FTVEhlbHBlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3ZmJjZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfQVNUSGVscGVyLnR4dApAQCAtMCwwICsxLDc5IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVEhlbHBlciBdCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgTGluZSA1OCkgbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkJ5dGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZQorICBMaW5lIDYwKSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuU2hvcnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZQorICBMaW5lIDYyKSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuSW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUKKyAgTGluZSA2NCkgbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkxvbmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZQorICBMaW5lIDY2KSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuRmxvYXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZQorICBMaW5lIDY4KSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuRG91YmxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUKKyAgTGluZSA3MCkgbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkJvb2xlYW4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZQorICBMaW5lIDcyKSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuQ2hhcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlCisgIExpbmUgNzQpIG5ldyBWb2lkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGUKKyAgTGluZSA4OSkgU3RyaW5nW10gc3BsaXQgPSBxdWFsaWZpZWROYW1lLnNwbGl0KCJcXC4iKSA9PT4gamF2YS5sYW5nLlN0cmluZ1tdCisgIExpbmUgODkpIHF1YWxpZmllZE5hbWUuc3BsaXQoIlxcLiIpID09PiBqYXZhLmxhbmcuU3RyaW5nW10KKyAgTGluZSA5MCkgTmFtZUV4cHIgcmV0ID0gbmV3IE5hbWVFeHByKHNwbGl0WzBdKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgOTApIG5ldyBOYW1lRXhwcihzcGxpdFswXSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDkxKSBpbnQgaSA9IDEgPT0+IGludAorICBMaW5lIDkxKSAxID09PiBpbnQKKyAgTGluZSA5MSkgaSA8IHNwbGl0Lmxlbmd0aCA9PT4gYm9vbGVhbgorICBMaW5lIDkxKSBpKysgPT0+IGludAorICBMaW5lIDkyKSByZXQgPSBuZXcgUXVhbGlmaWVkTmFtZUV4cHIocmV0LCBzcGxpdFtpXSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDk0KSByZXQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDEwNykgbmV3IFBhcmFtZXRlcih0eXBlLCBuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMTIyKSBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgMTIyKSBuZXcgQXJyYXlMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4oKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDEyMykgdmFyaWFibGVzLmFkZCh2YXJpYWJsZSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjQpIEZpZWxkRGVjbGFyYXRpb24gcmV0ID0gbmV3IEZpZWxkRGVjbGFyYXRpb24obW9kaWZpZXJzLCB0eXBlLCB2YXJpYWJsZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbgorICBMaW5lIDEyNCkgbmV3IEZpZWxkRGVjbGFyYXRpb24obW9kaWZpZXJzLCB0eXBlLCB2YXJpYWJsZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbgorICBMaW5lIDEyNSkgcmV0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbgorICBMaW5lIDE0MCkgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDE0MCkgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAxNDEpIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgMTQxKSBuZXcgVmFyaWFibGVEZWNsYXJhdG9yKGlkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcgorICBMaW5lIDE0MikgY3JlYXRlRmllbGREZWNsYXJhdGlvbihtb2RpZmllcnMsIHR5cGUsIHZhcmlhYmxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24KKyAgTGluZSAxNTUpIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgMTU1KSBuZXcgQXJyYXlMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4oKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDE1NikgdmFycy5hZGQobmV3IFZhcmlhYmxlRGVjbGFyYXRvcihuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQobmFtZSkpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE1NykgbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKHR5cGUsIHZhcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIKKyAgTGluZSAxNzApIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxNzApIG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTcxKSBwYXJhbWV0ZXJzID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNzIpIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxNzMpIG1ldGhvZC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID09PiB2b2lkCisgIExpbmUgMTc1KSBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpID09PiBib29sZWFuCisgIExpbmUgMTg4KSBMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBjYWxsLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTg4KSBjYWxsLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTg5KSBhcmdzID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxOTApIGFyZ3MgPSBuZXcgQXJyYXlMaXN0PEV4cHJlc3Npb24+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDE5MSkgY2FsbC5zZXRBcmdzKGFyZ3MpID09PiB2b2lkCisgIExpbmUgMTkzKSBhcmdzLmFkZChhcmcpID09PiBib29sZWFuCisgIExpbmUgMjA2KSBMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMgPSBjdS5nZXRUeXBlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPgorICBMaW5lIDIwNikgY3UuZ2V0VHlwZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbj4KKyAgTGluZSAyMDcpIHR5cGVzID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMDgpIHR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlRGVjbGFyYXRpb24+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+CisgIExpbmUgMjA5KSBjdS5zZXRUeXBlcyh0eXBlcykgPT0+IHZvaWQKKyAgTGluZSAyMTEpIHR5cGVzLmFkZCh0eXBlKSA9PT4gYm9vbGVhbgorICBMaW5lIDIyNSkgbmV3IFJlZmVyZW5jZVR5cGUobmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKG5hbWUpLCBhcnJheUNvdW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUKKyAgTGluZSAyMzgpIG5ldyBSZWZlcmVuY2VUeXBlKHR5cGUsIGFycmF5Q291bnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZQorICBMaW5lIDI0OSkgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gYmxvY2suZ2V0U3RtdHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSAyNDkpIGJsb2NrLmdldFN0bXRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgMjUwKSBzdG10cyA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjUxKSBzdG10cyA9IG5ldyBBcnJheUxpc3Q8U3RhdGVtZW50PigpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PgorICBMaW5lIDI1MikgYmxvY2suc2V0U3RtdHMoc3RtdHMpID09PiB2b2lkCisgIExpbmUgMjU0KSBzdG10cy5hZGQoc3RtdCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyNjUpIGFkZFN0bXQoYmxvY2ssIG5ldyBFeHByZXNzaW9uU3RtdChleHByKSkgPT0+IHZvaWQKKyAgTGluZSAyNzgpIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzID0gdHlwZS5nZXRNZW1iZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMjc4KSB0eXBlLmdldE1lbWJlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSAyNzkpIG1lbWJlcnMgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDI4MCkgbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8Qm9keURlY2xhcmF0aW9uPigpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDI4MSkgdHlwZS5zZXRNZW1iZXJzKG1lbWJlcnMpID09PiB2b2lkCisgIExpbmUgMjgzKSBtZW1iZXJzLmFkZChkZWNsKSA9PT4gYm9vbGVhbgorICBMaW5lIDI4NykgTGlzdDxOPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tj4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Tj4KKyAgTGluZSAyODcpIG5ldyBBcnJheUxpc3Q8Tj4oKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdDxOPgorICBMaW5lIDI4OCkgTm9kZSBjaGlsZCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgMjg4KSBjb250YWluZXIuZ2V0Q2hpbGRyZW5Ob2RlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+CisgIExpbmUgMjg5KSBjbGF6ei5pc0luc3RhbmNlKGNoaWxkKSA9PT4gYm9vbGVhbgorICBMaW5lIDI5MCkgbm9kZXMuYWRkKGNsYXp6LmNhc3QoY2hpbGQpKSA9PT4gYm9vbGVhbgorICBMaW5lIDI5Mikgbm9kZXMuYWRkQWxsKGdldE5vZGVzQnlUeXBlKGNoaWxkLCBjbGF6eikpID09PiBib29sZWFuCisgIExpbmUgMjk0KSBub2RlcyA9PT4gamF2YS51dGlsLkxpc3Q8Tj4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfSmF2YVBhcnNlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0phdmFQYXJzZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTIzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0phdmFQYXJzZXIudHh0CkBAIC0wLDAgKzEsMTU1IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgNjgpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSA3MCkgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSA3NCkgX2RvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uID09PiBib29sZWFuCisgIExpbmUgNzgpIF9kb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbiA9IGRvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uID09PiBib29sZWFuCisgIExpbmUgODMpIF9kb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VlZGluZ0VtcHR5TGluZXMgPT0+IGJvb2xlYW4KKyAgTGluZSA4OCkgX2RvTm90QXNzaWduQ29tbWVudHNQcmVjZWVkaW5nRW1wdHlMaW5lcyA9IGRvTm90QXNzaWduQ29tbWVudHNQcmVjZWVkaW5nRW1wdHlMaW5lcyA9PT4gYm9vbGVhbgorICBMaW5lIDkzKSBwYXJzZShpbiwgZW5jb2RpbmcsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDExMSkgU3RyaW5nIGNvZGUgPSBTb3VyY2VzSGVscGVyLnN0cmVhbVRvU3RyaW5nKGluLCBlbmNvZGluZykgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAxMTEpIFNvdXJjZXNIZWxwZXIuc3RyZWFtVG9TdHJpbmcoaW4sIGVuY29kaW5nKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDExMikgSW5wdXRTdHJlYW0gaW4xID0gU291cmNlc0hlbHBlci5zdHJpbmdUb1N0cmVhbShjb2RlLCBlbmNvZGluZykgPT0+IGphdmEuaW8uSW5wdXRTdHJlYW0KKyAgTGluZSAxMTIpIFNvdXJjZXNIZWxwZXIuc3RyaW5nVG9TdHJlYW0oY29kZSwgZW5jb2RpbmcpID09PiBqYXZhLmlvLklucHV0U3RyZWFtCisgIExpbmUgMTEzKSBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQVNUUGFyc2VyKGluMSwgZW5jb2RpbmcpLkNvbXBpbGF0aW9uVW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDExMykgbmV3IEFTVFBhcnNlcihpbjEsIGVuY29kaW5nKS5Db21waWxhdGlvblVuaXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQKKyAgTGluZSAxMTQpIGNvbnNpZGVyQ29tbWVudHMgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTUpIGluc2VydENvbW1lbnRzKGN1LCBjb2RlKSA9PT4gdm9pZAorICBMaW5lIDExNykgY3UgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0CisgIExpbmUgMTE5KSBuZXcgUGFyc2VFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbgorICBMaW5lIDEzNSkgcGFyc2UoaW4sIG51bGwsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDE0MCkgcGFyc2UoZmlsZSwgZW5jb2RpbmcsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDE1OCkgZmluYWwgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSA9PT4gamF2YS5pby5GaWxlSW5wdXRTdHJlYW0KKyAgTGluZSAxNTgpIG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkgPT0+IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtCisgIExpbmUgMTYwKSBwYXJzZShpbiwgZW5jb2RpbmcsIGNvbnNpZGVyQ29tbWVudHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDE2MikgaW4uY2xvc2UoKSA9PT4gdm9pZAorICBMaW5lIDE3OSkgcGFyc2UoZmlsZSwgbnVsbCwgdHJ1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0CisgIExpbmUgMTg1KSBTdHJpbmcgY29kZSA9IFNvdXJjZXNIZWxwZXIucmVhZGVyVG9TdHJpbmcocmVhZGVyKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDE4NSkgU291cmNlc0hlbHBlci5yZWFkZXJUb1N0cmluZyhyZWFkZXIpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTg2KSBSZWFkZXIgcmVhZGVyMSA9IFNvdXJjZXNIZWxwZXIuc3RyaW5nVG9SZWFkZXIoY29kZSkgPT0+IGphdmEuaW8uUmVhZGVyCisgIExpbmUgMTg2KSBTb3VyY2VzSGVscGVyLnN0cmluZ1RvUmVhZGVyKGNvZGUpID09PiBqYXZhLmlvLlJlYWRlcgorICBMaW5lIDE4NykgQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3IEFTVFBhcnNlcihyZWFkZXIxKS5Db21waWxhdGlvblVuaXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQKKyAgTGluZSAxODcpIG5ldyBBU1RQYXJzZXIocmVhZGVyMSkuQ29tcGlsYXRpb25Vbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0CisgIExpbmUgMTg4KSBjb25zaWRlckNvbW1lbnRzID09PiBib29sZWFuCisgIExpbmUgMTg5KSBpbnNlcnRDb21tZW50cyhjdSwgY29kZSkgPT0+IHZvaWQKKyAgTGluZSAxOTEpIGN1ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDE5MykgbmV3IFBhcnNlRXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb24KKyAgTGluZSAyMDkpIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoYmxvY2tTdGF0ZW1lbnQpID09PiBqYXZhLmlvLlN0cmluZ1JlYWRlcgorICBMaW5lIDIwOSkgbmV3IFN0cmluZ1JlYWRlcihibG9ja1N0YXRlbWVudCkgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjEwKSBCbG9ja1N0bXQgcmVzdWx0ID0gbmV3IEFTVFBhcnNlcihzcikuQmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDIxMCkgbmV3IEFTVFBhcnNlcihzcikuQmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDIxMSkgc3IuY2xvc2UoKSA9PT4gdm9pZAorICBMaW5lIDIxMikgcmVzdWx0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMjI2KSBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN0YXRlbWVudCkgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjI2KSBuZXcgU3RyaW5nUmVhZGVyKHN0YXRlbWVudCkgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjI3KSBTdGF0ZW1lbnQgc3RtdCA9IG5ldyBBU1RQYXJzZXIoc3IpLlN0YXRlbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMjI3KSBuZXcgQVNUUGFyc2VyKHNyKS5TdGF0ZW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDIyOCkgc3IuY2xvc2UoKSA9PT4gdm9pZAorICBMaW5lIDIyOSkgc3RtdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDI0MykgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihpbXBvcnREZWNsYXJhdGlvbikgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjQzKSBuZXcgU3RyaW5nUmVhZGVyKGltcG9ydERlY2xhcmF0aW9uKSA9PT4gamF2YS5pby5TdHJpbmdSZWFkZXIKKyAgTGluZSAyNDQpIEltcG9ydERlY2xhcmF0aW9uIGlkID0gbmV3IEFTVFBhcnNlcihzcikuSW1wb3J0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDI0NCkgbmV3IEFTVFBhcnNlcihzcikuSW1wb3J0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDI0NSkgc3IuY2xvc2UoKSA9PT4gdm9pZAorICBMaW5lIDI0NikgaWQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24KKyAgTGluZSAyNjApIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoZXhwcmVzc2lvbikgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjYwKSBuZXcgU3RyaW5nUmVhZGVyKGV4cHJlc3Npb24pID09PiBqYXZhLmlvLlN0cmluZ1JlYWRlcgorICBMaW5lIDI2MSkgRXhwcmVzc2lvbiBlID0gbmV3IEFTVFBhcnNlcihzcikuRXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDI2MSkgbmV3IEFTVFBhcnNlcihzcikuRXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDI2Mikgc3IuY2xvc2UoKSA9PT4gdm9pZAorICBMaW5lIDI2MykgZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAyNzcpIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoYW5ub3RhdGlvbikgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjc3KSBuZXcgU3RyaW5nUmVhZGVyKGFubm90YXRpb24pID09PiBqYXZhLmlvLlN0cmluZ1JlYWRlcgorICBMaW5lIDI3OCkgQW5ub3RhdGlvbkV4cHIgYWUgPSBuZXcgQVNUUGFyc2VyKHNyKS5Bbm5vdGF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDI3OCkgbmV3IEFTVFBhcnNlcihzcikuQW5ub3RhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAyNzkpIHNyLmNsb3NlKCkgPT0+IHZvaWQKKyAgTGluZSAyODApIGFlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAyOTQpIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoYm9keSkgPT0+IGphdmEuaW8uU3RyaW5nUmVhZGVyCisgIExpbmUgMjk0KSBuZXcgU3RyaW5nUmVhZGVyKGJvZHkpID09PiBqYXZhLmlvLlN0cmluZ1JlYWRlcgorICBMaW5lIDI5NSkgQm9keURlY2xhcmF0aW9uIGJkID0gbmV3IEFTVFBhcnNlcihzcikuQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIExpbmUgMjk1KSBuZXcgQVNUUGFyc2VyKHNyKS5Bbm5vdGF0aW9uQm9keURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSAyOTYpIHNyLmNsb3NlKCkgPT0+IHZvaWQKKyAgTGluZSAyOTcpIGJkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIExpbmUgMzA1KSBjb21tZW50c0NvbGxlY3Rpb24uc2l6ZSgpID09IDAgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTIpIExpc3Q8Q29tbWVudD4gY29tbWVudHMgPSBjb21tZW50c0NvbGxlY3Rpb24uZ2V0QWxsKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudD4KKyAgTGluZSAzMTIpIGNvbW1lbnRzQ29sbGVjdGlvbi5nZXRBbGwoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDMxMykgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNvbW1lbnRzKSA9PT4gdm9pZAorICBMaW5lIDMxNCkgTGlzdDxOb2RlPiBjaGlsZHJlbiA9IGN1LmdldENoaWxkcmVuTm9kZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDMxNCkgY3UuZ2V0Q2hpbGRyZW5Ob2RlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+CisgIExpbmUgMzE1KSBQb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb24oY2hpbGRyZW4pID09PiB2b2lkCisgIExpbmUgMzE3KSBjdS5nZXRQYWNrYWdlKCkgIT0gbnVsbCAmJiAoY2hpbGRyZW4uc2l6ZSgpID09IDAgfHwgUG9zaXRpb25VdGlscy5hcmVJbk9yZGVyKGNvbW1lbnRzLmdldCgwKSwgY2hpbGRyZW4uZ2V0KDApKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTgpIGN1LnNldENvbW1lbnQoY29tbWVudHMuZ2V0KDApKSA9PT4gdm9pZAorICBMaW5lIDMxOSkgY29tbWVudHMucmVtb3ZlKDApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAzMjIpIGluc2VydENvbW1lbnRzSW5Ob2RlKGN1LCBjb21tZW50cykgPT0+IHZvaWQKKyAgTGluZSAzMjkpIG5vZGUuZ2V0QmVnaW5MaW5lKCkgPT0gbGluZUNvbW1lbnQuZ2V0QmVnaW5MaW5lKCkgJiYgIW5vZGUuaGFzQ29tbWVudCgpID09PiBib29sZWFuCisgIExpbmUgMzMxKSBub2RlLnNldENvbW1lbnQobGluZUNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMzMyKSB0cnVlID09PiBib29sZWFuCisgIExpbmUgMzM2KSBMaXN0PE5vZGU+IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Tm9kZT4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDMzNikgbmV3IExpbmtlZExpc3Q8Tm9kZT4oKSA9PT4gamF2YS51dGlsLkxpbmtlZExpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDMzNykgY2hpbGRyZW4uYWRkQWxsKG5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDMzOCkgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKSA9PT4gdm9pZAorICBMaW5lIDMzOSkgQ29sbGVjdGlvbnMucmV2ZXJzZShjaGlsZHJlbikgPT0+IHZvaWQKKyAgTGluZSAzNDEpIE5vZGUgY2hpbGQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDM0MSkgY2hpbGRyZW4gPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSAzNDMpIGF0dHJpYnV0ZUxpbmVDb21tZW50VG9Ob2RlT3JDaGlsZChjaGlsZCwgbGluZUNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgMzQ1KSB0cnVlID09PiBib29sZWFuCisgIExpbmUgMzQ5KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDM1OCkgY29tbWVudHNUb0F0dHJpYnV0ZS5zaXplKCkgPT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDM2NSkgTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+CisgIExpbmUgMzY1KSBub2RlLmdldENoaWxkcmVuTm9kZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDM2NikgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKSA9PT4gdm9pZAorICBMaW5lIDM2OCkgTm9kZSBjaGlsZCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgMzY4KSBjaGlsZHJlbiA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDM2OSkgTGlzdDxDb21tZW50PiBjb21tZW50c0luc2lkZUNoaWxkID0gbmV3IExpbmtlZExpc3Q8Q29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDM2OSkgbmV3IExpbmtlZExpc3Q8Q29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpbmtlZExpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDM3MCkgQ29tbWVudCBjID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAzNzApIGNvbW1lbnRzVG9BdHRyaWJ1dGUgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudD4KKyAgTGluZSAzNzEpIFBvc2l0aW9uVXRpbHMubm9kZUNvbnRhaW5zKGNoaWxkLCBjLCBfZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24pID09PiBib29sZWFuCisgIExpbmUgMzcyKSBjb21tZW50c0luc2lkZUNoaWxkLmFkZChjKSA9PT4gYm9vbGVhbgorICBMaW5lIDM3NSkgY29tbWVudHNUb0F0dHJpYnV0ZS5yZW1vdmVBbGwoY29tbWVudHNJbnNpZGVDaGlsZCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzNzYpIGluc2VydENvbW1lbnRzSW5Ob2RlKGNoaWxkLCBjb21tZW50c0luc2lkZUNoaWxkKSA9PT4gdm9pZAorICBMaW5lIDM4MSkgTGlzdDxDb21tZW50PiBhdHRyaWJ1dGVkQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgMzgxKSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgMzgyKSBDb21tZW50IGNvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDM4MikgY29tbWVudHNUb0F0dHJpYnV0ZSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDM4NCkgY29tbWVudC5pc0xpbmVDb21tZW50KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzODYpIE5vZGUgY2hpbGQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDM4NikgY2hpbGRyZW4gPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSAzODgpIGNoaWxkLmdldEVuZExpbmUoKSA9PSBjb21tZW50LmdldEJlZ2luTGluZSgpID09PiBib29sZWFuCisgIExpbmUgMzkwKSBhdHRyaWJ1dGVMaW5lQ29tbWVudFRvTm9kZU9yQ2hpbGQoY2hpbGQsIGNvbW1lbnQuYXNMaW5lQ29tbWVudCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDM5MikgYXR0cmlidXRlZENvbW1lbnRzLmFkZChjb21tZW50KSA9PT4gYm9vbGVhbgorICBMaW5lIDQwMCkgQ29tbWVudCBwcmV2aW91c0NvbW1lbnQgPSBudWxsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0MDApIG51bGwgPT0+IG51bGwKKyAgTGluZSA0MDEpIGF0dHJpYnV0ZWRDb21tZW50cyA9IG5ldyBMaW5rZWRMaXN0PENvbW1lbnQ+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudD4KKyAgTGluZSA0MDIpIExpc3Q8Tm9kZT4gY2hpbGRyZW5BbmRDb21tZW50cyA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSA0MDIpIG5ldyBMaW5rZWRMaXN0PE5vZGU+KCkgPT0+IGphdmEudXRpbC5MaW5rZWRMaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSA0MDMpIGNoaWxkcmVuQW5kQ29tbWVudHMuYWRkQWxsKGNoaWxkcmVuKSA9PT4gYm9vbGVhbgorICBMaW5lIDQwNCkgY2hpbGRyZW5BbmRDb21tZW50cy5hZGRBbGwoY29tbWVudHNUb0F0dHJpYnV0ZSkgPT0+IGJvb2xlYW4KKyAgTGluZSA0MDUpIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjaGlsZHJlbkFuZENvbW1lbnRzLCBfZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24pID09PiB2b2lkCisgIExpbmUgNDA3KSBOb2RlIHRoaW5nID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSA0MDcpIGNoaWxkcmVuQW5kQ29tbWVudHMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSA0MDgpIHRoaW5nIGluc3RhbmNlb2YgQ29tbWVudCA9PT4gYm9vbGVhbgorICBMaW5lIDQwOSkgcHJldmlvdXNDb21tZW50ID0gKENvbW1lbnQpIHRoaW5nID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0MTApICFwcmV2aW91c0NvbW1lbnQuaXNPcnBoYW4oKSA9PT4gYm9vbGVhbgorICBMaW5lIDQxMikgcHJldmlvdXNDb21tZW50ID0gbnVsbCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNDE1KSBwcmV2aW91c0NvbW1lbnQgIT0gbnVsbCAmJiAhdGhpbmcuaGFzQ29tbWVudCgpID09PiBib29sZWFuCisgIExpbmUgNDE2KSAhX2RvTm90QXNzaWduQ29tbWVudHNQcmVjZWVkaW5nRW1wdHlMaW5lcyB8fCAhdGhlcmVBcmVMaW5lc0JldHdlZW4ocHJldmlvdXNDb21tZW50LCB0aGluZykgPT0+IGJvb2xlYW4KKyAgTGluZSA0MTcpIHRoaW5nLnNldENvbW1lbnQocHJldmlvdXNDb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDQxOCkgYXR0cmlidXRlZENvbW1lbnRzLmFkZChwcmV2aW91c0NvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgNDE5KSBwcmV2aW91c0NvbW1lbnQgPSBudWxsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0MjUpIGNvbW1lbnRzVG9BdHRyaWJ1dGUucmVtb3ZlQWxsKGF0dHJpYnV0ZWRDb21tZW50cykgPT0+IGJvb2xlYW4KKyAgTGluZSA0MjgpIENvbW1lbnQgYyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNDI4KSBjb21tZW50c1RvQXR0cmlidXRlID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgNDI5KSBjLmlzT3JwaGFuKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0MzApIG5vZGUuYWRkT3JwaGFuQ29tbWVudChjKSA9PT4gdm9pZAorICBMaW5lIDQzNykgIVBvc2l0aW9uVXRpbHMuYXJlSW5PcmRlcihhLCBiKSA9PT4gYm9vbGVhbgorICBMaW5lIDQzOSkgdGhlcmVBcmVMaW5lc0JldHdlZW4oYiwgYSkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NDEpIGludCBlbmRPZkEgPSBhLmdldEVuZExpbmUoKSA9PT4gaW50CisgIExpbmUgNDQxKSBhLmdldEVuZExpbmUoKSA9PT4gaW50CisgIExpbmUgNDQyKSBiLmdldEJlZ2luTGluZSgpID4gKGEuZ2V0RW5kTGluZSgpICsgMSkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NDYpIENvbW1lbnRzUGFyc2VyIGNvbW1lbnRzUGFyc2VyID0gbmV3IENvbW1lbnRzUGFyc2VyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIKKyAgTGluZSA0NDYpIG5ldyBDb21tZW50c1BhcnNlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyCisgIExpbmUgNDQ3KSBDb21tZW50c0NvbGxlY3Rpb24gYWxsQ29tbWVudHMgPSBjb21tZW50c1BhcnNlci5wYXJzZShjb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24KKyAgTGluZSA0NDcpIGNvbW1lbnRzUGFyc2VyLnBhcnNlKGNvZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzQ29sbGVjdGlvbgorICBMaW5lIDQ0OSkgaW5zZXJ0Q29tbWVudHNJbkN1KGN1LCBhbGxDb21tZW50cykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfUG9zaXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qb3NpdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNjUzOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfUG9zaXRpb24udHh0CkBAIC0wLDAgKzEsMTEgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24gXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgMzApIG5ldyBQb3NpdGlvbihOb2RlLkFCU09MVVRFX0JFR0lOX0xJTkUsIC0xKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uCisgIExpbmUgMzEpIG5ldyBQb3NpdGlvbihOb2RlLkFCU09MVVRFX0VORF9MSU5FLCAtMSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbgorICBMaW5lIDM0KSBuZXcgUG9zaXRpb24obm9kZS5nZXRCZWdpbkxpbmUoKSwgbm9kZS5nZXRCZWdpbkNvbHVtbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uCisgIExpbmUgMzgpIG5ldyBQb3NpdGlvbihub2RlLmdldEVuZExpbmUoKSwgbm9kZS5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbgorICBMaW5lIDQyKSB0aGlzLmxpbmUgPSBsaW5lID09PiBpbnQKKyAgTGluZSA0MykgdGhpcy5jb2x1bW4gPSBjb2x1bW4gPT0+IGludAorICBMaW5lIDQ3KSB0aGlzLmxpbmUgPT0+IGludAorICBMaW5lIDUxKSB0aGlzLmNvbHVtbiA9PT4gaW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1Bvc2l0aW9uVXRpbHMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qb3NpdGlvblV0aWxzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWRmODg2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qb3NpdGlvblV0aWxzLnR4dApAQCAtMCwwICsxLDY4IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uVXRpbHMgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgNDYpIHNvcnRCeUJlZ2luUG9zaXRpb24obm9kZXMsIGZhbHNlKSA9PT4gdm9pZAorICBMaW5lIDUwKSBDb2xsZWN0aW9ucy5zb3J0KG5vZGVzLCBuZXcgQ29tcGFyYXRvcjxOb2RlPigpIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZShOb2RlIG8xLCBOb2RlIG8yKSB7CisgICAgICAgIHJldHVybiBQb3NpdGlvblV0aWxzLmNvbXBhcmUobzEsIG8yLCBpZ25vcmluZ0Fubm90YXRpb25zKTsKKyAgICB9Cit9KSA9PT4gdm9pZAorICBMaW5lIDUzKSBQb3NpdGlvblV0aWxzLmNvbXBhcmUobzEsIG8yLCBpZ25vcmluZ0Fubm90YXRpb25zKSA9PT4gaW50CisgIExpbmUgNTkpIGFyZUluT3JkZXIoYSwgYiwgZmFsc2UpID09PiBib29sZWFuCisgIExpbmUgNjMpIGNvbXBhcmUoYSwgYiwgaWdub3JpbmdBbm5vdGF0aW9ucykgPD0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDY3KSBpZ25vcmluZ0Fubm90YXRpb25zID09PiBib29sZWFuCisgIExpbmUgNjgpIGludCBzaWduTGluZSA9IHNpZ251bShiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihiKSkgPT0+IGludAorICBMaW5lIDY4KSBzaWdudW0oYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihhKSAtIGJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oYikpID09PiBpbnQKKyAgTGluZSA2OSkgc2lnbkxpbmUgPT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDcwKSBzaWdudW0oYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGIpKSA9PT4gaW50CisgIExpbmUgNzIpIHNpZ25MaW5lID09PiBpbnQKKyAgTGluZSA3NikgaW50IHNpZ25MaW5lID0gc2lnbnVtKGEuZ2V0QmVnaW5MaW5lKCkgLSBiLmdldEJlZ2luTGluZSgpKSA9PT4gaW50CisgIExpbmUgNzYpIHNpZ251bShhLmdldEJlZ2luTGluZSgpIC0gYi5nZXRCZWdpbkxpbmUoKSkgPT0+IGludAorICBMaW5lIDc3KSBzaWduTGluZSA9PSAwID09PiBib29sZWFuCisgIExpbmUgNzgpIHNpZ251bShhLmdldEJlZ2luQ29sdW1uKCkgLSBiLmdldEJlZ2luQ29sdW1uKCkpID09PiBpbnQKKyAgTGluZSA4MCkgc2lnbkxpbmUgPT0+IGludAorICBMaW5lIDg1KSBub2RlIGluc3RhbmNlb2YgQW5ub3RhYmxlTm9kZSA9PT4gYm9vbGVhbgorICBMaW5lIDg2KSBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PEFubm90YXRpb25FeHByPigpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgODYpIG5ldyBMaW5rZWRMaXN0PEFubm90YXRpb25FeHByPigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgODcpIGFubm90YXRpb25zLmFkZEFsbCgoKEFubm90YWJsZU5vZGUpIG5vZGUpLmdldEFubm90YXRpb25zKCkpID09PiBib29sZWFuCisgIExpbmUgODgpIGFubm90YXRpb25zLnNpemUoKSA9PSAwID09PiBib29sZWFuCisgIExpbmUgODkpIG51bGwgPT0+IG51bGwKKyAgTGluZSA5MSkgc29ydEJ5QmVnaW5Qb3NpdGlvbihhbm5vdGF0aW9ucykgPT0+IHZvaWQKKyAgTGluZSA5MikgYW5ub3RhdGlvbnMuZ2V0KGFubm90YXRpb25zLnNpemUoKSAtIDEpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA5NCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDk5KSBiZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhub2RlKS5nZXRCZWdpbkxpbmUoKSA9PT4gaW50CisgIExpbmUgMTA0KSBiZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhub2RlKS5nZXRCZWdpbkNvbHVtbigpID09PiBpbnQKKyAgTGluZSAxMDgpIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiA9PT4gYm9vbGVhbgorICBMaW5lIDEwOSkgTWV0aG9kRGVjbGFyYXRpb24gY2FzdGVkID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24KKyAgTGluZSAxMDkpIChNZXRob2REZWNsYXJhdGlvbikgbm9kZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uCisgIExpbmUgMTEwKSBjYXN0ZWQuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDExMSkgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24gPT0+IGJvb2xlYW4KKyAgTGluZSAxMTIpIEZpZWxkRGVjbGFyYXRpb24gY2FzdGVkID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uCisgIExpbmUgMTEyKSAoRmllbGREZWNsYXJhdGlvbikgbm9kZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24KKyAgTGluZSAxMTMpIGNhc3RlZC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMTE0KSBub2RlIGluc3RhbmNlb2YgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID09PiBib29sZWFuCisgIExpbmUgMTE1KSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2FzdGVkID0gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgbm9kZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorICBMaW5lIDExNSkgKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgbm9kZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorICBMaW5lIDExNikgY2FzdGVkLmdldE5hbWVFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDExOCkgbm9kZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgMTIzKSAhaWdub3JpbmdBbm5vdGF0aW9ucyB8fCBQb3NpdGlvblV0aWxzLmdldExhc3RBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNCkgY29udGFpbmVyLmNvbnRhaW5zKGNvbnRhaW5lZCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjYpICFjb250YWluZXIuY29udGFpbnMoY29udGFpbmVkKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyNykgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzEpIGNvbnRhaW5lciBpbnN0YW5jZW9mIEFubm90YWJsZU5vZGUgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzIpIGludCBibCA9IGJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oY29udGFpbmVyKSA9PT4gaW50CisgIExpbmUgMTMyKSBiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0+IGludAorICBMaW5lIDEzMykgaW50IGJjID0gYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0+IGludAorICBMaW5lIDEzMykgYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0+IGludAorICBMaW5lIDEzNCkgYmwgPiBjb250YWluZWQuZ2V0QmVnaW5MaW5lKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzQpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTM1KSBibCA9PSBjb250YWluZWQuZ2V0QmVnaW5MaW5lKCkgJiYgYmMgPiBjb250YWluZWQuZ2V0QmVnaW5Db2x1bW4oKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNSkgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzYpIGNvbnRhaW5lci5nZXRFbmRMaW5lKCkgPCBjb250YWluZWQuZ2V0RW5kTGluZSgpID09PiBib29sZWFuCisgIExpbmUgMTM2KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNykgY29udGFpbmVyLmdldEVuZExpbmUoKSA9PSBjb250YWluZWQuZ2V0RW5kTGluZSgpICYmIGNvbnRhaW5lci5nZXRFbmRDb2x1bW4oKSA8IGNvbnRhaW5lZC5nZXRFbmRDb2x1bW4oKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNykgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzgpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDApIHRydWUgPT0+IGJvb2xlYW4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfU291cmNlc0hlbHBlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1NvdXJjZXNIZWxwZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MWZhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1NvdXJjZXNIZWxwZXIudHh0CkBAIC0wLDAgKzEsMjMgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuU291cmNlc0hlbHBlciBdCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgTGluZSAyOSkgZW5jb2RpbmcgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMwKSBzdHJlYW1Ub1N0cmluZyhpbikgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAzMikgamF2YS51dGlsLlNjYW5uZXIgcyA9IG5ldyBqYXZhLnV0aWwuU2Nhbm5lcihpbiwgZW5jb2RpbmcpLnVzZURlbGltaXRlcigiXFxBIikgPT0+IGphdmEudXRpbC5TY2FubmVyCisgIExpbmUgMzIpIG5ldyBqYXZhLnV0aWwuU2Nhbm5lcihpbiwgZW5jb2RpbmcpLnVzZURlbGltaXRlcigiXFxBIikgPT0+IGphdmEudXRpbC5TY2FubmVyCisgIExpbmUgMzMpIHMuaGFzTmV4dCgpID8gcy5uZXh0KCkgOiAiIiA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDM4KSBqYXZhLnV0aWwuU2Nhbm5lciBzID0gbmV3IGphdmEudXRpbC5TY2FubmVyKGluKS51c2VEZWxpbWl0ZXIoIlxcQSIpID09PiBqYXZhLnV0aWwuU2Nhbm5lcgorICBMaW5lIDM4KSBuZXcgamF2YS51dGlsLlNjYW5uZXIoaW4pLnVzZURlbGltaXRlcigiXFxBIikgPT0+IGphdmEudXRpbC5TY2FubmVyCisgIExpbmUgMzkpIHMuaGFzTmV4dCgpID8gcy5uZXh0KCkgOiAiIiA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQzKSBieXRlW10gcmF3RGF0YSA9IGVuY29kaW5nICE9IG51bGwgPyBzLmdldEJ5dGVzKGVuY29kaW5nKSA6IHMuZ2V0Qnl0ZXMoKSA9PT4gYnl0ZVtdCisgIExpbmUgNDMpIGVuY29kaW5nICE9IG51bGwgPyBzLmdldEJ5dGVzKGVuY29kaW5nKSA6IHMuZ2V0Qnl0ZXMoKSA9PT4gYnl0ZVtdCisgIExpbmUgNDQpIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXdEYXRhKSA9PT4gamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQorICBMaW5lIDQ4KSBjaGFyW10gYXJyID0gbmV3IGNoYXJbOCAqIDEwMjRdID09PiBjaGFyW10KKyAgTGluZSA0OCkgbmV3IGNoYXJbOCAqIDEwMjRdID09PiBjaGFyW10KKyAgTGluZSA0OSkgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgorICBMaW5lIDQ5KSBuZXcgU3RyaW5nQnVpbGRlcigpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgorICBMaW5lIDUwKSBpbnQgbnVtQ2hhcnMgPT0+IGludAorICBMaW5lIDUyKSAobnVtQ2hhcnMgPSByZWFkZXIucmVhZChhcnIsIDAsIGFyci5sZW5ndGgpKSA+IDAgPT0+IGJvb2xlYW4KKyAgTGluZSA1MykgYnVmLmFwcGVuZChhcnIsIDAsIG51bUNoYXJzKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKKyAgTGluZSA1NikgYnVmLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA2MCkgbmV3IFN0cmluZ1JlYWRlcihzKSA9PT4gamF2YS5pby5TdHJpbmdSZWFkZXIKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0FjY2Vzc1NwZWNpZmllci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BY2Nlc3NTcGVjaWZpZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDI1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BY2Nlc3NTcGVjaWZpZXIudHh0CkBAIC0wLDAgKzEsMiBAQAorICBMaW5lIDQxKSB0aGlzLmNvZGVSZXByZXNlbmF0aW9uID0gY29kZVJlcHJlc2VudGF0aW9uID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNDUpIHRoaXMuY29kZVJlcHJlc2VuYXRpb24gPT0+IGphdmEubGFuZy5TdHJpbmcKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0NvbXBpbGF0aW9uVW5pdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Db21waWxhdGlvblVuaXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDU2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Db21waWxhdGlvblVuaXQudHh0CkBAIC0wLDAgKzEsMjggQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDYzKSBzZXRQYWNrYWdlKHBha2FnZSkgPT0+IHZvaWQKKyAgTGluZSA2NCkgc2V0SW1wb3J0cyhpbXBvcnRzKSA9PT4gdm9pZAorICBMaW5lIDY1KSBzZXRUeXBlcyh0eXBlcykgPT0+IHZvaWQKKyAgTGluZSA2OSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA2OSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDY5KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA2OSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA3MCkgc2V0UGFja2FnZShwYWthZ2UpID09PiB2b2lkCisgIExpbmUgNzEpIHNldEltcG9ydHMoaW1wb3J0cykgPT0+IHZvaWQKKyAgTGluZSA3Mikgc2V0VHlwZXModHlwZXMpID09PiB2b2lkCisgIExpbmUgNzcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5OCkgdGhpcy5nZXRBbGxDb250YWluZWRDb21tZW50cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgMTA4KSBpbXBvcnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uPgorICBMaW5lIDExOSkgcGFrYWdlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbgorICBMaW5lIDEzMykgdHlwZXMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+CisgIExpbmUgMTQzKSBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkISIpID09PiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorICBMaW5lIDE1NCkgdGhpcy5pbXBvcnRzID0gaW1wb3J0cyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbj4KKyAgTGluZSAxNTUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW1wb3J0cykgPT0+IHZvaWQKKyAgTGluZSAxNjYpIHRoaXMucGFrYWdlID0gcGFrYWdlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbgorICBMaW5lIDE2Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYWthZ2UpID09PiB2b2lkCisgIExpbmUgMTc3KSB0aGlzLnR5cGVzID0gdHlwZXMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+CisgIExpbmUgMTc4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVzKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfRG9jdW1lbnRhYmxlTm9kZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Eb2N1bWVudGFibGVOb2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfRG9jdW1lbnRhYmxlTm9kZS50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0ltcG9ydERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0ltcG9ydERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGViZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfSW1wb3J0RGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMjQgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNTMpIHNldEFzdGVyaXNrKGlzQXN0ZXJpc2spID09PiB2b2lkCisgIExpbmUgNTQpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1NSkgc2V0U3RhdGljKGlzU3RhdGljKSA9PT4gdm9pZAorICBMaW5lIDU5KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU5KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTkpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU5KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDYwKSBzZXRBc3Rlcmlzayhpc0FzdGVyaXNrKSA9PT4gdm9pZAorICBMaW5lIDYxKSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNjIpIHNldFN0YXRpYyhpc1N0YXRpYykgPT0+IHZvaWQKKyAgTGluZSA2Nykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgxKSBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA5MSkgYXN0ZXJpc2sgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDEpIHN0YXRpY18gPT0+IGJvb2xlYW4KKyAgTGluZSAxMTEpIHRoaXMuYXN0ZXJpc2sgPSBhc3RlcmlzayA9PT4gYm9vbGVhbgorICBMaW5lIDEyMSkgdGhpcy5uYW1lID0gbmFtZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMTIyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpID09PiB2b2lkCisgIExpbmUgMTMyKSB0aGlzLnN0YXRpY18gPSBzdGF0aWNfID09PiBib29sZWFuCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9OYW1lZE5vZGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTmFtZWROb2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTmFtZWROb2RlLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTm9kZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Ob2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA3MGRhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTm9kZS50eHQKQEAgLTAsMCArMSw5NSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSBdCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNTIpIG5ldyBMaW5rZWRMaXN0PE5vZGU+KCkgPT0+IGphdmEudXRpbC5MaW5rZWRMaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSA1MykgbmV3IExpbmtlZExpc3Q8Q29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpbmtlZExpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDY2KSB0aGlzLmJlZ2luTGluZSA9IGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNjcpIHRoaXMuYmVnaW5Db2x1bW4gPSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNjgpIHRoaXMuZW5kTGluZSA9IGVuZExpbmUgPT0+IGludAorICBMaW5lIDY5KSB0aGlzLmVuZENvbHVtbiA9IGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgMTA1KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgMTE0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDEyMykgY29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTMyKSBkYXRhID09PiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgMTQxKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDE1MCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgMTYwKSB0aGlzLmJlZ2luQ29sdW1uID0gYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDE3MCkgdGhpcy5iZWdpbkxpbmUgPSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDE3OSkgY29tbWVudCAhPSBudWxsICYmICh0aGlzIGluc3RhbmNlb2YgQ29tbWVudCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxODApIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBIGNvbW1lbnQgY2FuIG5vdCBiZSBjb21tZW50ZWQiKSA9PT4gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgTGluZSAxODIpIHRoaXMuY29tbWVudCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTg0KSB0aGlzLmNvbW1lbnQuc2V0Q29tbWVudGVkTm9kZShudWxsKSA9PT4gdm9pZAorICBMaW5lIDE4NikgdGhpcy5jb21tZW50ID0gY29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTg3KSBjb21tZW50ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxODgpIHRoaXMuY29tbWVudC5zZXRDb21tZW50ZWROb2RlKHRoaXMpID09PiB2b2lkCisgIExpbmUgMTk4KSB0aGlzLmRhdGEgPSBkYXRhID09PiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgMjA4KSB0aGlzLmVuZENvbHVtbiA9IGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgMjE4KSB0aGlzLmVuZExpbmUgPSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSAyMjgpIGZpbmFsIER1bXBWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRHVtcFZpc2l0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yCisgIExpbmUgMjI4KSBuZXcgRHVtcFZpc2l0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yCisgIExpbmUgMjI5KSBhY2NlcHQodmlzaXRvciwgbnVsbCkgPT0+IHZvaWQKKyAgTGluZSAyMzApIHZpc2l0b3IuZ2V0U291cmNlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAyMzQpIGZpbmFsIER1bXBWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRHVtcFZpc2l0b3IoZmFsc2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IKKyAgTGluZSAyMzQpIG5ldyBEdW1wVmlzaXRvcihmYWxzZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvcgorICBMaW5lIDIzNSkgYWNjZXB0KHZpc2l0b3IsIG51bGwpID09PiB2b2lkCisgIExpbmUgMjM2KSB2aXNpdG9yLmdldFNvdXJjZSgpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMjQxKSB0b1N0cmluZygpLmhhc2hDb2RlKCkgPT0+IGludAorICBMaW5lIDI0Nikgb2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBOb2RlKSA9PT4gYm9vbGVhbgorICBMaW5lIDI0NykgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAyNDkpIEVxdWFsc1Zpc2l0b3IuZXF1YWxzKHRoaXMsIChOb2RlKSBvYmopID09PiBib29sZWFuCisgIExpbmUgMjU0KSB0aGlzLmFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAyNTgpIHBhcmVudE5vZGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDI2MikgY2hpbGRyZW5Ob2RlcyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDI2NikgZ2V0QmVnaW5MaW5lKCkgPiBvdGhlci5nZXRCZWdpbkxpbmUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDI2NikgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAyNjcpIGdldEJlZ2luTGluZSgpID09IG90aGVyLmdldEJlZ2luTGluZSgpICYmIGdldEJlZ2luQ29sdW1uKCkgPiBvdGhlci5nZXRCZWdpbkNvbHVtbigpID09PiBib29sZWFuCisgIExpbmUgMjY3KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDI2OCkgZ2V0RW5kTGluZSgpIDwgb3RoZXIuZ2V0RW5kTGluZSgpID09PiBib29sZWFuCisgIExpbmUgMjY4KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDI2OSkgZ2V0RW5kTGluZSgpID09IG90aGVyLmdldEVuZExpbmUoKSAmJiBnZXRFbmRDb2x1bW4oKSA8IG90aGVyLmdldEVuZENvbHVtbigpID09PiBib29sZWFuCisgIExpbmUgMjY5KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDI3MCkgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDI3NCkgb3JwaGFuQ29tbWVudHMuYWRkKGNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgMjc1KSBjb21tZW50LnNldFBhcmVudE5vZGUodGhpcykgPT0+IHZvaWQKKyAgTGluZSAyOTApIG9ycGhhbkNvbW1lbnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgMzAwKSBMaXN0PENvbW1lbnQ+IGNvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8Q29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDMwMCkgbmV3IExpbmtlZExpc3Q8Q29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpbmtlZExpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDMwMSkgY29tbWVudHMuYWRkQWxsKGdldE9ycGhhbkNvbW1lbnRzKCkpID09PiBib29sZWFuCisgIExpbmUgMzAzKSBOb2RlIGNoaWxkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAzMDMpIGdldENoaWxkcmVuTm9kZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPgorICBMaW5lIDMwNCkgY2hpbGQuZ2V0Q29tbWVudCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzMDUpIGNvbW1lbnRzLmFkZChjaGlsZC5nZXRDb21tZW50KCkpID09PiBib29sZWFuCisgIExpbmUgMzA3KSBjb21tZW50cy5hZGRBbGwoY2hpbGQuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTApIGNvbW1lbnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgMzIxKSB0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMyMikgdGhpcy5wYXJlbnROb2RlLmNoaWxkcmVuTm9kZXMucmVtb3ZlKHRoaXMpID09PiBib29sZWFuCisgIExpbmUgMzI0KSB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAzMjYpIHRoaXMucGFyZW50Tm9kZSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzI3KSB0aGlzLnBhcmVudE5vZGUuY2hpbGRyZW5Ob2Rlcy5hZGQodGhpcykgPT0+IGJvb2xlYW4KKyAgTGluZSAzMzIpIGNoaWxkTm9kZXMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMzMykgSXRlcmF0b3I8PyBleHRlbmRzIE5vZGU+IGl0ID0gY2hpbGROb2Rlcy5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSAzMzMpIGNoaWxkTm9kZXMuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+CisgIExpbmUgMzM0KSBpdC5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMzUpIE5vZGUgY3VycmVudCA9IGl0Lm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgMzM1KSBpdC5uZXh0KCkgPT0+ID8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAzMzYpIGN1cnJlbnQuc2V0UGFyZW50Tm9kZSh0aGlzKSA9PT4gdm9pZAorICBMaW5lIDM0MikgY2hpbGROb2RlICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNDMpIGNoaWxkTm9kZS5zZXRQYXJlbnROb2RlKHRoaXMpID09PiB2b2lkCisgIExpbmUgMzQ3KSAtMSA9PT4gaW50CisgIExpbmUgMzQ4KSAtMiA9PT4gaW50CisgIExpbmUgMzUxKSBsaW5lID09IEFCU09MVVRFX0JFR0lOX0xJTkUgPT0+IGJvb2xlYW4KKyAgTGluZSAzNTEpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAzNTIpIGdldEJlZ2luTGluZSgpID4gbGluZSA9PT4gYm9vbGVhbgorICBMaW5lIDM1MykgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDM1NCkgZ2V0QmVnaW5MaW5lKCkgPT0gbGluZSA9PT4gYm9vbGVhbgorICBMaW5lIDM1NSkgZ2V0QmVnaW5Db2x1bW4oKSA+IGNvbHVtbiA9PT4gYm9vbGVhbgorICBMaW5lIDM1NykgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjIpIGxpbmUgPT0gQUJTT0xVVEVfRU5EX0xJTkUgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjIpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjMpIGdldEVuZExpbmUoKSA8IGxpbmUgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjQpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjUpIGdldEVuZExpbmUoKSA9PSBsaW5lID09PiBib29sZWFuCisgIExpbmUgMzY2KSBnZXRFbmRDb2x1bW4oKSA8IGNvbHVtbiA9PT4gYm9vbGVhbgorICBMaW5lIDM2OCkgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAzNzQpIGNvbW1lbnQgIT0gbnVsbCA9PT4gYm9vbGVhbgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfUGFja2FnZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X1BhY2thZ2VEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjY2ZjZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X1BhY2thZ2VEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwyMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNTQpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1OCkgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgNTkpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA2MykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA2MykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDYzKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA2MykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA2NCkgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgNjUpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA3MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg1KSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDk0KSBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAxMDIpIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDEwMykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucykgPT0+IHZvaWQKKyAgTGluZSAxMTMpIHRoaXMubmFtZSA9IG5hbWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDExNCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfVHJlZVZpc2l0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfVHJlZVZpc2l0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjI5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9UcmVlVmlzaXRvci50eHQKQEAgLTAsMCArMSw3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UcmVlVmlzaXRvciBdCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgTGluZSAyNykgcHJvY2Vzcyhub2RlKSA9PT4gdm9pZAorICBMaW5lIDI4KSBOb2RlIGNoaWxkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAyOCkgbm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSAyOSkgdmlzaXREZXB0aEZpcnN0KGNoaWxkKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfVHlwZVBhcmFtZXRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9UeXBlUGFyYW1ldGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTlhZGYwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfVHlwZVBhcmFtZXRlci50eHQKQEAgLTAsMCArMSwzMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGUKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNTUpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1Nikgc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCkgPT0+IHZvaWQKKyAgTGluZSA2MSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA2MSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDYxKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA2MSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA2Mikgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDYzKSBzZXRUeXBlQm91bmQodHlwZUJvdW5kKSA9PT4gdm9pZAorICBMaW5lIDY4KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDY4KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNjgpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDY4KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDY4KSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNjgpIHR5cGVCb3VuZCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDY5KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNzApIHNldFR5cGVCb3VuZCh0eXBlQm91bmQpID09PiB2b2lkCisgIExpbmUgNzEpIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODgpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA5OCkgdHlwZUJvdW5kID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMTA4KSB0aGlzLm5hbWUgPSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTE4KSB0aGlzLnR5cGVCb3VuZCA9IHR5cGVCb3VuZCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDExOSkgc2V0QXNQYXJlbnROb2RlT2YodHlwZUJvdW5kKSA9PT4gdm9pZAorICBMaW5lIDEyMykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxMjcpIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Bbm5vdGFibGVOb2RlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhYmxlTm9kZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhYmxlTm9kZS50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhdGlvbkRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhdGlvbkRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhkOWRkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Bbm5vdGF0aW9uRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMjggQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlCisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlCisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGUKKyAgTGluZSA0MSkgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSA0MSkgbmFtZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ1KSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQ1KSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDQ1KSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNDUpIG1lbWJlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgNDkpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDkpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OSkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDkpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDkpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNDkpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgNDkpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0OSkgbWVtYmVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA1NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY0KSB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSA2OSkgamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzc2NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsNDEgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlCisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlCisgIExpbmUgNTIpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNTMpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1NCkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDU1KSBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKSA9PT4gdm9pZAorICBMaW5lIDU5KSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDYwKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gdm9pZAorICBMaW5lIDYxKSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNjIpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA2Mykgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSkgPT0+IHZvaWQKKyAgTGluZSA2NykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA2NykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDY3KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA2NykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA2NykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2OCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA2OSkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDcwKSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNzEpIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpID09PiB2b2lkCisgIExpbmUgNzYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4NSkgZGVmYXVsdFZhbHVlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDk1KSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDk5KSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTAzKSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDEwNykgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA4KSBzZXRBc1BhcmVudE5vZGVPZihkZWZhdWx0VmFsdWUpID09PiB2b2lkCisgIExpbmUgMTEyKSB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgMTE2KSB0aGlzLm5hbWUgPSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTIwKSB0aGlzLnR5cGUgPSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDEyMSkgc2V0QXNQYXJlbnROb2RlT2YodHlwZSkgPT0+IHZvaWQKKyAgTGluZSAxMjYpIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDEzMSkgamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQmFzZVBhcmFtZXRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0Jhc2VQYXJhbWV0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjhlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0Jhc2VQYXJhbWV0ZXIudHh0CkBAIC0wLDAgKzEsMjYgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQmFzZVBhcmFtZXRlciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQwKSBzZXRJZChpZCkgPT0+IHZvaWQKKyAgTGluZSA0NCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA0NSkgc2V0SWQoaWQpID09PiB2b2lkCisgIExpbmUgNDkpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNTApIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDUxKSBzZXRJZChpZCkgPT0+IHZvaWQKKyAgTGluZSA1NSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1NSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDU1KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1NSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1Nikgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA1Nykgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgNTgpIHNldElkKGlkKSA9PT4gdm9pZAorICBMaW5lIDYyKSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDY2KSBpZCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkCisgIExpbmUgNzYpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgODApIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDgxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDg1KSB0aGlzLmlkID0gaWQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDg2KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmlkKSA9PT4gdm9pZAorICBMaW5lIDkwKSB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVycyA9PT4gaW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0JvZHlEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0JvZHlEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3YjcwMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQm9keURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbiBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YWJsZU5vZGUKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDEpIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDQ1KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ1KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDUpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ1KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ2KSBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgPT0+IHZvaWQKKyAgTGluZSA1MCkgYW5ub3RhdGlvbnMgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDUxKSBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkV4cHI+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1MykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1NykgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNTgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5ub3RhdGlvbnMpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4MjIyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDQ4IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlCisgIExpbmUgNTIpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgNTIpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA1Mykgc2V0SW50ZXJmYWNlKGlzSW50ZXJmYWNlKSA9PT4gdm9pZAorICBMaW5lIDYwKSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDYwKSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDYwKSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNjApIG1lbWJlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgNjEpIHNldEludGVyZmFjZShpc0ludGVyZmFjZSkgPT0+IHZvaWQKKyAgTGluZSA2Mikgc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpID09PiB2b2lkCisgIExpbmUgNjMpIHNldEV4dGVuZHMoZXh0ZW5kc0xpc3QpID09PiB2b2lkCisgIExpbmUgNjQpIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpID09PiB2b2lkCisgIExpbmUgNzIpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNzIpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA3MikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNzIpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNzIpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNzIpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgNzIpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA3MikgbWVtYmVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA3Mykgc2V0SW50ZXJmYWNlKGlzSW50ZXJmYWNlKSA9PT4gdm9pZAorICBMaW5lIDc0KSBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA3NSkgc2V0RXh0ZW5kcyhleHRlbmRzTGlzdCkgPT0+IHZvaWQKKyAgTGluZSA3Nikgc2V0SW1wbGVtZW50cyhpbXBsZW1lbnRzTGlzdCkgPT0+IHZvaWQKKyAgTGluZSA4MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg4KSBleHRlbmRzTGlzdCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDkyKSBpbXBsZW1lbnRzTGlzdCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDk2KSB0eXBlUGFyYW1ldGVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDEwMCkgaW50ZXJmYWNlXyA9PT4gYm9vbGVhbgorICBMaW5lIDEwNCkgdGhpcy5leHRlbmRzTGlzdCA9IGV4dGVuZHNMaXN0ID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMTA1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4dGVuZHNMaXN0KSA9PT4gdm9pZAorICBMaW5lIDEwOSkgdGhpcy5pbXBsZW1lbnRzTGlzdCA9IGltcGxlbWVudHNMaXN0ID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMTEwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcGxlbWVudHNMaXN0KSA9PT4gdm9pZAorICBMaW5lIDExNCkgdGhpcy5pbnRlcmZhY2VfID0gaW50ZXJmYWNlXyA9PT4gYm9vbGVhbgorICBMaW5lIDExOCkgdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMTE5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVQYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDEyNCkgdGhpcy5qYXZhZG9jQ29tbWVudCA9IGphdmFkb2NDb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMTI5KSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQ29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NzU3YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQ29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw4OSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5XaXRoRGVjbGFyYXRpb24KKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZQorICBMaW5lIDYwKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gdm9pZAorICBMaW5lIDYxKSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNjYpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjcpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNjgpIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDY5KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNzApIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA3MSkgc2V0VGhyb3dzKHRocm93c18pID09PiB2b2lkCisgIExpbmUgNzIpIHNldEJsb2NrKGJsb2NrKSA9PT4gdm9pZAorICBMaW5lIDc4KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDc4KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNzgpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDc4KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDc4KSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc5KSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gdm9pZAorICBMaW5lIDgwKSBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA4MSkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDgyKSBzZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID09PiB2b2lkCisgIExpbmUgODMpIHNldFRocm93cyh0aHJvd3NfKSA9PT4gdm9pZAorICBMaW5lIDg0KSBzZXRCbG9jayhibG9jaykgPT0+IHZvaWQKKyAgTGluZSA4OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgOTQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDk4KSBibG9jayA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDEwOCkgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSAxMTIpIG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lLmdldE5hbWUoKSA9PT4gbnVsbAorICBMaW5lIDExNikgbmFtZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMTIwKSBwYXJhbWV0ZXJzID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjEpIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxMjMpIHBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTI3KSB0aHJvd3NfID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjgpIHRocm93c18gPSBuZXcgQXJyYXlMaXN0PE5hbWVFeHByPigpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMTMwKSB0aHJvd3NfID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMTM0KSB0eXBlUGFyYW1ldGVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDEzOCkgdGhpcy5ibG9jayA9IGJsb2NrID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMTM5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJsb2NrKSA9PT4gdm9pZAorICBMaW5lIDE0MykgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDE0NykgdGhpcy5uYW1lID0gbmV3IE5hbWVFeHByKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAxNTEpIHRoaXMubmFtZSA9IG5hbWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDE1NSkgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxNTYpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSAxNjApIHRoaXMudGhyb3dzXyA9IHRocm93c18gPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSAxNjEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudGhyb3dzXykgPT0+IHZvaWQKKyAgTGluZSAxNjUpIHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDE2Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlUGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSAxNzgpIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDE3OCkgbmV3IFN0cmluZ0J1ZmZlcigpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMTc5KSBpbmNsdWRpbmdNb2RpZmllcnMgPT0+IGJvb2xlYW4KKyAgTGluZSAxODApIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIgPSBNb2RpZmllclNldC5nZXRBY2Nlc3NTcGVjaWZpZXIoZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcgorICBMaW5lIDE4MCkgTW9kaWZpZXJTZXQuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXIKKyAgTGluZSAxODEpIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIuZ2V0Q29kZVJlcHJlc2VuYXRpb24oKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAxODIpIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIgPT0gQWNjZXNzU3BlY2lmaWVyLkRFRkFVTFQgPyAiIiA6ICIgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAxODQpIHNiLmFwcGVuZChnZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMTg1KSBzYi5hcHBlbmQoIigiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDE4NikgYm9vbGVhbiBmaXJzdFBhcmFtID0gdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDE4NikgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDE4NykgUGFyYW1ldGVyIHBhcmFtID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMTg3KSBnZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTg5KSBmaXJzdFBhcmFtID09PiBib29sZWFuCisgIExpbmUgMTkwKSBmaXJzdFBhcmFtID0gZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAxOTIpIHNiLmFwcGVuZCgiLCAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDE5NCkgaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSA9PT4gYm9vbGVhbgorICBMaW5lIDE5NSkgc2IuYXBwZW5kKHBhcmFtLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMTk3KSBzYi5hcHBlbmQocGFyYW0uZ2V0VHlwZSgpLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjAwKSBzYi5hcHBlbmQoIikiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDIwMSkgaW5jbHVkaW5nVGhyb3dzID09PiBib29sZWFuCisgIExpbmUgMjAyKSBib29sZWFuIGZpcnN0VGhyb3cgPSB0cnVlID09PiBib29sZWFuCisgIExpbmUgMjAyKSB0cnVlID09PiBib29sZWFuCisgIExpbmUgMjAzKSBOYW1lRXhwciB0aHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDIwMykgZ2V0VGhyb3dzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSAyMDQpIGZpcnN0VGhyb3cgPT0+IGJvb2xlYW4KKyAgTGluZSAyMDUpIGZpcnN0VGhyb3cgPSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDIwNikgc2IuYXBwZW5kKCIgdGhyb3dzICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjA4KSBzYi5hcHBlbmQoIiwgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyMTApIHNiLmFwcGVuZCh0aHIudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyMTMpIHNiLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAyMTgpIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoaW5jbHVkaW5nTW9kaWZpZXJzLCBpbmNsdWRpbmdUaHJvd3MsIHRydWUpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMjIzKSBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKHRydWUsIHRydWUsIHRydWUpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMjI4KSB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAyMzMpIGphdmFkb2NDb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VtcHR5TWVtYmVyRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbXB0eU1lbWJlckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJkMDBiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbXB0eU1lbWJlckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDE4IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5TWVtYmVyRGVjbGFyYXRpb24gXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlCisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlCisgIExpbmUgMzUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAzOSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSAzOSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDM5KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSAzOSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSAzOSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDQ0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTQpIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDU5KSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbXB0eVR5cGVEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VtcHR5VHlwZURlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVkMTJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbXB0eVR5cGVEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwyNSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbiBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlCisgIExpbmUgMzUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAzNSkgMCA9PT4gaW50CisgIExpbmUgMzUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAzNSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDM5KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDM5KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgMzkpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDM5KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDM5KSBudWxsID09PiBudWxsCisgIExpbmUgMzkpIDAgPT0+IGludAorICBMaW5lIDM5KSBudWxsID09PiBudWxsCisgIExpbmUgMzkpIG51bGwgPT0+IG51bGwKKyAgTGluZSA0NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU5KSBudWxsID09PiBudWxsCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1Db25zdGFudERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfRW51bUNvbnN0YW50RGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWYwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1Db25zdGFudERlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDM0IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlCisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlCisgIExpbmUgNDkpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1MykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1NCkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDU1KSBzZXRBcmdzKGFyZ3MpID09PiB2b2lkCisgIExpbmUgNTYpIHNldENsYXNzQm9keShjbGFzc0JvZHkpID09PiB2b2lkCisgIExpbmUgNjApIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNjApIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA2MCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNjApIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNjApIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjEpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA2Mikgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDYzKSBzZXRDbGFzc0JvZHkoY2xhc3NCb2R5KSA9PT4gdm9pZAorICBMaW5lIDY4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzcpIGFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDgxKSBjbGFzc0JvZHkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgODUpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA4OSkgdGhpcy5hcmdzID0gYXJncyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgOTApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYXJncykgPT0+IHZvaWQKKyAgTGluZSA5NCkgdGhpcy5jbGFzc0JvZHkgPSBjbGFzc0JvZHkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgOTUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2xhc3NCb2R5KSA9PT4gdm9pZAorICBMaW5lIDk5KSB0aGlzLm5hbWUgPSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTA0KSB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAxMDkpIGphdmFkb2NDb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1EZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1EZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyNjkxMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfRW51bURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDM4IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbiBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlCisgIExpbmUgNDYpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgNDYpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA1MCkgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1MCkgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSA1MCkgbmFtZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDUwKSBtZW1iZXJzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDUxKSBzZXRJbXBsZW1lbnRzKGltcGxlbWVudHNMaXN0KSA9PT4gdm9pZAorICBMaW5lIDUyKSBzZXRFbnRyaWVzKGVudHJpZXMpID09PiB2b2lkCisgIExpbmUgNTYpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTYpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1NikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTYpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTYpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNTYpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgNTYpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA1NikgbWVtYmVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA1Nykgc2V0SW1wbGVtZW50cyhpbXBsZW1lbnRzTGlzdCkgPT0+IHZvaWQKKyAgTGluZSA1OCkgc2V0RW50cmllcyhlbnRyaWVzKSA9PT4gdm9pZAorICBMaW5lIDYzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzMpIGVudHJpZXMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4KKyAgTGluZSA3NykgaW1wbGVtZW50c0xpc3QgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSA4MSkgdGhpcy5lbnRyaWVzID0gZW50cmllcyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uPgorICBMaW5lIDgyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVudHJpZXMpID09PiB2b2lkCisgIExpbmUgODYpIHRoaXMuaW1wbGVtZW50c0xpc3QgPSBpbXBsZW1lbnRzTGlzdCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDg3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcGxlbWVudHNMaXN0KSA9PT4gdm9pZAorICBMaW5lIDkyKSB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSA5NykgamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfRmllbGREZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0ZpZWxkRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjdmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0ZpZWxkRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsNDEgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbiBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGUKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YWJsZU5vZGUKKyAgTGluZSA0OSkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA1MCkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDUxKSBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gYXV4ID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgNTEpIG5ldyBBcnJheUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPigpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgNTIpIGF1eC5hZGQodmFyaWFibGUpID09PiBib29sZWFuCisgIExpbmUgNTMpIHNldFZhcmlhYmxlcyhhdXgpID09PiB2b2lkCisgIExpbmUgNTcpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNTgpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1OSkgc2V0VmFyaWFibGVzKHZhcmlhYmxlcykgPT0+IHZvaWQKKyAgTGluZSA2MykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2NCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA2NSkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDY2KSBzZXRWYXJpYWJsZXModmFyaWFibGVzKSA9PT4gdm9pZAorICBMaW5lIDcwKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDcwKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNzApIGVuZExpbmUgPT0+IGludAorICBMaW5lIDcwKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDcwKSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDcxKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gdm9pZAorICBMaW5lIDcyKSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNzMpIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpID09PiB2b2lkCisgIExpbmUgNzgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5MykgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSA5NykgdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAxMDEpIHZhcmlhYmxlcyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4KKyAgTGluZSAxMDUpIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSAxMDkpIHRoaXMudHlwZSA9IHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMTEwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpID09PiB2b2lkCisgIExpbmUgMTE0KSB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4KKyAgTGluZSAxMTUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFyaWFibGVzKSA9PT4gdm9pZAorICBMaW5lIDEyMCkgdGhpcy5qYXZhZG9jQ29tbWVudCA9IGphdmFkb2NDb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMTI1KSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Jbml0aWFsaXplckRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzMzIyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwyNyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZQorICBMaW5lIDQzKSBudWxsID09PiBudWxsCisgIExpbmUgNDQpIHNldFN0YXRpYyhpc1N0YXRpYykgPT0+IHZvaWQKKyAgTGluZSA0NSkgc2V0QmxvY2soYmxvY2spID09PiB2b2lkCisgIExpbmUgNDkpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDkpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OSkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDkpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDkpIG51bGwgPT0+IG51bGwKKyAgTGluZSA1MCkgc2V0U3RhdGljKGlzU3RhdGljKSA9PT4gdm9pZAorICBMaW5lIDUxKSBzZXRCbG9jayhibG9jaykgPT0+IHZvaWQKKyAgTGluZSA1Nikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1KSBibG9jayA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDY5KSBpc1N0YXRpYyA9PT4gYm9vbGVhbgorICBMaW5lIDczKSB0aGlzLmJsb2NrID0gYmxvY2sgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSA3NCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ibG9jaykgPT0+IHZvaWQKKyAgTGluZSA3OCkgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljID09PiBib29sZWFuCisgIExpbmUgODMpIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDg4KSBqYXZhZG9jQ29tbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9NZXRob2REZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X01ldGhvZERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDdmYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9NZXRob2REZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxMjAgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24gXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlCisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LldpdGhEZWNsYXJhdGlvbgorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlCisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGFibGVOb2RlCisgIExpbmUgNjApIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgNjYpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNjcpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA2OCkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDcyKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gdm9pZAorICBMaW5lIDczKSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNzQpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA3NSkgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDgxKSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDgyKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gdm9pZAorICBMaW5lIDgzKSBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA4NCkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDg1KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgODYpIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA4Nykgc2V0QXJyYXlDb3VudChhcnJheUNvdW50KSA9PT4gdm9pZAorICBMaW5lIDg4KSBzZXRUaHJvd3ModGhyb3dzXykgPT0+IHZvaWQKKyAgTGluZSA4OSkgc2V0Qm9keShibG9jaykgPT0+IHZvaWQKKyAgTGluZSA5NikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA5NikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDk2KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA5NikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA5NikgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA5Nykgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA5OCkgc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpID09PiB2b2lkCisgIExpbmUgOTkpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSAxMDApIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSAxMDEpIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSAxMDIpIHNldEFycmF5Q291bnQoYXJyYXlDb3VudCkgPT0+IHZvaWQKKyAgTGluZSAxMDMpIHNldFRocm93cyh0aHJvd3NfKSA9PT4gdm9pZAorICBMaW5lIDEwNCkgc2V0Qm9keShibG9jaykgPT0+IHZvaWQKKyAgTGluZSAxMDgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExMikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE2KSBhcnJheUNvdW50ID09PiBpbnQKKyAgTGluZSAxMjEpIGJvZHkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAxMzEpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgMTM1KSBuYW1lLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDEzOSkgbmFtZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMTQzKSBwYXJhbWV0ZXJzID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDQpIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxNDYpIHBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTUwKSB0aHJvd3NfID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTEpIHRocm93c18gPSBuZXcgQXJyYXlMaXN0PE5hbWVFeHByPigpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMTUzKSB0aHJvd3NfID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMTU3KSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDE2MSkgdHlwZVBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAxNjUpIHRoaXMuYXJyYXlDb3VudCA9IGFycmF5Q291bnQgPT0+IGludAorICBMaW5lIDE2OSkgdGhpcy5ib2R5ID0gYm9keSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDE3MCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KSA9PT4gdm9pZAorICBMaW5lIDE3NCkgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDE3OCkgdGhpcy5uYW1lID0gbmV3IE5hbWVFeHByKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAxODIpIHRoaXMubmFtZSA9IG5hbWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDE4NikgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxODcpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSAxOTEpIHRoaXMudGhyb3dzXyA9IHRocm93c18gPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSAxOTIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudGhyb3dzXykgPT0+IHZvaWQKKyAgTGluZSAxOTYpIHRoaXMudHlwZSA9IHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMTk3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpID09PiB2b2lkCisgIExpbmUgMjAxKSB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAyMDIpIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVQYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDIwNykgaXNEZWZhdWx0ID09PiBib29sZWFuCisgIExpbmUgMjExKSB0aGlzLmlzRGVmYXVsdCA9IGlzRGVmYXVsdCA9PT4gYm9vbGVhbgorICBMaW5lIDIxNykgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyh0cnVlLCB0cnVlLCB0cnVlKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDIyMikgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhpbmNsdWRpbmdNb2RpZmllcnMsIGluY2x1ZGluZ1Rocm93cywgdHJ1ZSkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAyMzUpIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDIzNSkgbmV3IFN0cmluZ0J1ZmZlcigpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjM2KSBpbmNsdWRpbmdNb2RpZmllcnMgPT0+IGJvb2xlYW4KKyAgTGluZSAyMzcpIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIgPSBNb2RpZmllclNldC5nZXRBY2Nlc3NTcGVjaWZpZXIoZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcgorICBMaW5lIDIzNykgTW9kaWZpZXJTZXQuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXIKKyAgTGluZSAyMzgpIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIuZ2V0Q29kZVJlcHJlc2VuYXRpb24oKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyMzkpIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIgPT0gQWNjZXNzU3BlY2lmaWVyLkRFRkFVTFQgPyAiIiA6ICIgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyNDApIE1vZGlmaWVyU2V0LmlzU3RhdGljKGdldE1vZGlmaWVycygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDI0MSkgc2IuYXBwZW5kKCJzdGF0aWMgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyNDMpIE1vZGlmaWVyU2V0LmlzQWJzdHJhY3QoZ2V0TW9kaWZpZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMjQ0KSBzYi5hcHBlbmQoImFic3RyYWN0ICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjQ2KSBNb2RpZmllclNldC5pc0ZpbmFsKGdldE1vZGlmaWVycygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDI0Nykgc2IuYXBwZW5kKCJmaW5hbCAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI0OSkgTW9kaWZpZXJTZXQuaXNOYXRpdmUoZ2V0TW9kaWZpZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMjUwKSBzYi5hcHBlbmQoIm5hdGl2ZSAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI1MikgTW9kaWZpZXJTZXQuaXNTeW5jaHJvbml6ZWQoZ2V0TW9kaWZpZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMjUzKSBzYi5hcHBlbmQoInN5bmNocm9uaXplZCAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI1Nykgc2IuYXBwZW5kKGdldFR5cGUoKS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI1OCkgc2IuYXBwZW5kKCIgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyNTkpIHNiLmFwcGVuZChnZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjYwKSBzYi5hcHBlbmQoIigiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI2MSkgYm9vbGVhbiBmaXJzdFBhcmFtID0gdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDI2MSkgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDI2MikgUGFyYW1ldGVyIHBhcmFtID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMjYyKSBnZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMjY0KSBmaXJzdFBhcmFtID09PiBib29sZWFuCisgIExpbmUgMjY1KSBmaXJzdFBhcmFtID0gZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAyNjcpIHNiLmFwcGVuZCgiLCAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI2OSkgaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSA9PT4gYm9vbGVhbgorICBMaW5lIDI3MCkgc2IuYXBwZW5kKHBhcmFtLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjcyKSBzYi5hcHBlbmQocGFyYW0uZ2V0VHlwZSgpLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjczKSBwYXJhbS5pc1ZhckFyZ3MoKSA9PT4gYm9vbGVhbgorICBMaW5lIDI3NCkgc2IuYXBwZW5kKCIuLi4iKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI3OCkgc2IuYXBwZW5kKCIpIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSAyNzkpIGluY2x1ZGluZ1Rocm93cyA9PT4gYm9vbGVhbgorICBMaW5lIDI4MCkgYm9vbGVhbiBmaXJzdFRocm93ID0gdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDI4MCkgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDI4MSkgTmFtZUV4cHIgdGhyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAyODEpIGdldFRocm93cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMjgyKSBmaXJzdFRocm93ID09PiBib29sZWFuCisgIExpbmUgMjgzKSBmaXJzdFRocm93ID0gZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAyODQpIHNiLmFwcGVuZCgiIHRocm93cyAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDI4Nikgc2IuYXBwZW5kKCIsICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjg4KSBzYi5hcHBlbmQodGhyLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMjkxKSBzYi50b1N0cmluZygpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMjk2KSB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAzMDEpIGphdmFkb2NDb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X01vZGlmaWVyU2V0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfTW9kaWZpZXJTZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmMxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X01vZGlmaWVyU2V0LnR4dApAQCAtMCwwICsxLDM2IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1vZGlmaWVyU2V0IF0KKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBMaW5lIDM3KSBNb2RpZmllci5QVUJMSUMgPT0+IGludAorICBMaW5lIDM5KSBNb2RpZmllci5QUklWQVRFID09PiBpbnQKKyAgTGluZSA0MSkgTW9kaWZpZXIuUFJPVEVDVEVEID09PiBpbnQKKyAgTGluZSA0MykgTW9kaWZpZXIuU1RBVElDID09PiBpbnQKKyAgTGluZSA0NSkgTW9kaWZpZXIuRklOQUwgPT0+IGludAorICBMaW5lIDQ3KSBNb2RpZmllci5TWU5DSFJPTklaRUQgPT0+IGludAorICBMaW5lIDQ5KSBNb2RpZmllci5WT0xBVElMRSA9PT4gaW50CisgIExpbmUgNTEpIE1vZGlmaWVyLlRSQU5TSUVOVCA9PT4gaW50CisgIExpbmUgNTMpIE1vZGlmaWVyLk5BVElWRSA9PT4gaW50CisgIExpbmUgNTUpIE1vZGlmaWVyLkFCU1RSQUNUID09PiBpbnQKKyAgTGluZSA1NykgTW9kaWZpZXIuU1RSSUNUID09PiBpbnQKKyAgTGluZSA2MCkgaXNQdWJsaWMobW9kaWZpZXJzKSA9PT4gYm9vbGVhbgorICBMaW5lIDYxKSBBY2Nlc3NTcGVjaWZpZXIuUFVCTElDID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcgorICBMaW5lIDYyKSBpc1Byb3RlY3RlZChtb2RpZmllcnMpID09PiBib29sZWFuCisgIExpbmUgNjMpIEFjY2Vzc1NwZWNpZmllci5QUk9URUNURUQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyCisgIExpbmUgNjQpIGlzUHJpdmF0ZShtb2RpZmllcnMpID09PiBib29sZWFuCisgIExpbmUgNjUpIEFjY2Vzc1NwZWNpZmllci5QUklWQVRFID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcgorICBMaW5lIDY3KSBBY2Nlc3NTcGVjaWZpZXIuREVGQVVMVCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXIKKyAgTGluZSA3MikgbW9kaWZpZXJzIHwgbW9kID09PiBpbnQKKyAgTGluZSA3NikgKG1vZGlmaWVycyAmIG1vZGlmaWVyKSAhPSAwID09PiBib29sZWFuCisgIExpbmUgODApIChtb2RpZmllcnMgJiBBQlNUUkFDVCkgIT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDg0KSAobW9kaWZpZXJzICYgRklOQUwpICE9IDAgPT0+IGJvb2xlYW4KKyAgTGluZSA4OCkgKG1vZGlmaWVycyAmIE5BVElWRSkgIT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDkyKSAobW9kaWZpZXJzICYgUFJJVkFURSkgIT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDk2KSAobW9kaWZpZXJzICYgUFJPVEVDVEVEKSAhPSAwID09PiBib29sZWFuCisgIExpbmUgMTA3KSAhaXNQdWJsaWMobW9kaWZpZXJzKSAmJiAhaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJiAhaXNQcml2YXRlKG1vZGlmaWVycykgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTEpIChtb2RpZmllcnMgJiBQVUJMSUMpICE9IDAgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTUpIChtb2RpZmllcnMgJiBTVEFUSUMpICE9IDAgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTkpIChtb2RpZmllcnMgJiBTVFJJQ1RGUCkgIT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDEyMykgKG1vZGlmaWVycyAmIFNZTkNIUk9OSVpFRCkgIT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNykgKG1vZGlmaWVycyAmIFRSQU5TSUVOVCkgIT0gMCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMSkgKG1vZGlmaWVycyAmIFZPTEFUSUxFKSAhPSAwID09PiBib29sZWFuCisgIExpbmUgMTQxKSBtb2RpZmllcnMgJiB+bW9kID09PiBpbnQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfTXVsdGlUeXBlUGFyYW1ldGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfTXVsdGlUeXBlUGFyYW1ldGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ2OTcxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9NdWx0aVR5cGVQYXJhbWV0ZXIudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJhc2VQYXJhbWV0ZXIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzcpIG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgMzcpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMzcpIGlkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAzOCkgdGhpcy50eXBlcyA9IHR5cGVzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA0MikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0MikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQyKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0MikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0MikgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSA0MikgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0MikgaWQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDQzKSB0aGlzLnR5cGVzID0gdHlwZXMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTcpIHR5cGVzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA2MSkgdGhpcy50eXBlcyA9IHR5cGVzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfUGFyYW1ldGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfUGFyYW1ldGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM3NDhhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9QYXJhbWV0ZXIudHh0CkBAIC0wLDAgKzEsMjcgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJhc2VQYXJhbWV0ZXIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDMpIGlkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSA0NCkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDQ4KSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDQ4KSBpZCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkCisgIExpbmUgNDkpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1MykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1MykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDUzKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1MykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1MykgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSA1MykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1MykgaWQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDU0KSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNTUpIHNldFZhckFyZ3MoaXNWYXJBcmdzKSA9PT4gdm9pZAorICBMaW5lIDYwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjkpIHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNzMpIGlzVmFyQXJncyA9PT4gYm9vbGVhbgorICBMaW5lIDc3KSB0aGlzLnR5cGUgPSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDc4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpID09PiB2b2lkCisgIExpbmUgODIpIHRoaXMuaXNWYXJBcmdzID0gaXNWYXJBcmdzID09PiBib29sZWFuCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X1R5cGVEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X1R5cGVEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhZmRhZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVHlwZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDMxIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbiBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZQorICBMaW5lIDQ1KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNDYpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNTIpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNTMpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1NCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA1NSkgc2V0TWVtYmVycyhtZW1iZXJzKSA9PT4gdm9pZAorICBMaW5lIDYyKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDYyKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNjIpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDYyKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDYyKSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDYzKSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNjQpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNjUpIHNldE1lbWJlcnMobWVtYmVycykgPT0+IHZvaWQKKyAgTGluZSA2OSkgbWVtYmVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA3OSkgbW9kaWZpZXJzID09PiBpbnQKKyAgTGluZSA4MykgbmFtZS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA4NykgdGhpcy5tZW1iZXJzID0gbWVtYmVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA4OCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5tZW1iZXJzKSA9PT4gdm9pZAorICBMaW5lIDkyKSB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVycyA9PT4gaW50CisgIExpbmUgOTYpIHRoaXMubmFtZSA9IG5ldyBOYW1lRXhwcihuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMTAwKSB0aGlzLm5hbWUgPSBuYW1lRXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMTA0KSBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVmFyaWFibGVEZWNsYXJhdG9yLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVmFyaWFibGVEZWNsYXJhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYyNzJhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9WYXJpYWJsZURlY2xhcmF0b3IudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDIpIHNldElkKGlkKSA9PT4gdm9pZAorICBMaW5lIDQ2KSBzZXRJZChpZCkgPT0+IHZvaWQKKyAgTGluZSA0Nykgc2V0SW5pdChpbml0KSA9PT4gdm9pZAorICBMaW5lIDUxKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDUxKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTEpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDUxKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDUyKSBzZXRJZChpZCkgPT0+IHZvaWQKKyAgTGluZSA1Mykgc2V0SW5pdChpbml0KSA9PT4gdm9pZAorICBMaW5lIDU4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjcpIGlkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSA3MSkgaW5pdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NSkgdGhpcy5pZCA9IGlkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSA3Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pZCkgPT0+IHZvaWQKKyAgTGluZSA4MCkgdGhpcy5pbml0ID0gaW5pdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbml0KSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9WYXJpYWJsZURlY2xhcmF0b3JJZC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X1ZhcmlhYmxlRGVjbGFyYXRvcklkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTQxNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9WYXJpYWJsZURlY2xhcmF0b3JJZC50eHQKQEAgLTAsMCArMSwxOSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGUKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDIpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA0NikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ2KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0Nykgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDQ4KSBzZXRBcnJheUNvdW50KGFycmF5Q291bnQpID09PiB2b2lkCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MikgYXJyYXlDb3VudCA9PT4gaW50CisgIExpbmUgNjYpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA3MCkgdGhpcy5hcnJheUNvdW50ID0gYXJyYXlDb3VudCA9PT4gaW50CisgIExpbmUgNzQpIHRoaXMubmFtZSA9IG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfV2l0aERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfV2l0aERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9XaXRoRGVjbGFyYXRpb24udHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19CbG9ja0NvbW1lbnQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQmxvY2tDb21tZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM5ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQmxvY2tDb21tZW50LnR4dApAQCAtMCwwICsxLDE0IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDIpIGNvbnRlbnQgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0NikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ2KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NikgY29udGVudCA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDUxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Nikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19Db21tZW50LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0NvbW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2IwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19Db21tZW50LnR4dApAQCAtMCwwICsxLDI2IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDMpIHRoaXMuY29udGVudCA9IGNvbnRlbnQgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0NykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ3KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OCkgdGhpcy5jb250ZW50ID0gY29udGVudCA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDU3KSBjb250ZW50ID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNjcpIHRoaXMuY29udGVudCA9IGNvbnRlbnQgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA3MikgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSA3NykgaXNMaW5lQ29tbWVudCgpID09PiBib29sZWFuCisgIExpbmUgNzkpIChMaW5lQ29tbWVudCkgdGhpcyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudAorICBMaW5lIDgxKSBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBhIGxpbmUgY29tbWVudCIpID09PiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgTGluZSA4NykgdGhpcy5jb21tZW50ZWROb2RlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSA5MikgY29tbWVudGVkTm9kZSA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTQpIHRoaXMuY29tbWVudGVkTm9kZSA9IGNvbW1lbnRlZE5vZGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDk3KSBjb21tZW50ZWROb2RlID09IHRoaXMgPT0+IGJvb2xlYW4KKyAgTGluZSA5OSkgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpID09PiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgIExpbmUgMTAxKSBjb21tZW50ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCA9PT4gYm9vbGVhbgorICBMaW5lIDEwMykgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpID09PiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgIExpbmUgMTA1KSB0aGlzLmNvbW1lbnRlZE5vZGUgPSBjb21tZW50ZWROb2RlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAxMTApIHRoaXMuY29tbWVudGVkTm9kZSA9PSBudWxsID09PiBib29sZWFuCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19Db21tZW50c0NvbGxlY3Rpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQ29tbWVudHNDb2xsZWN0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzg1YWVlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQ29tbWVudHNDb2xsZWN0aW9uLnR4dApAQCAtMCwwICsxLDM5IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24gXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgMzEpIG5ldyBMaW5rZWRMaXN0PExpbmVDb21tZW50PigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50PgorICBMaW5lIDMyKSBuZXcgTGlua2VkTGlzdDxCbG9ja0NvbW1lbnQ+KCkgPT0+IGphdmEudXRpbC5MaW5rZWRMaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50PgorICBMaW5lIDMzKSBuZXcgTGlua2VkTGlzdDxKYXZhZG9jQ29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpbmtlZExpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudD4KKyAgTGluZSAzNikgbGluZUNvbW1lbnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50PgorICBMaW5lIDQwKSBibG9ja0NvbW1lbnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudD4KKyAgTGluZSA0NCkgamF2YWRvY0NvbW1lbnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50PgorICBMaW5lIDQ4KSB0aGlzLmxpbmVDb21tZW50cy5hZGQobGluZUNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgNTIpIHRoaXMuYmxvY2tDb21tZW50cy5hZGQoYmxvY2tDb21tZW50KSA9PT4gYm9vbGVhbgorICBMaW5lIDU2KSB0aGlzLmphdmFkb2NDb21tZW50cy5hZGQoamF2YWRvY0NvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgNjApIENvbW1lbnQgYyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjApIGdldEFsbCgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgNjMpIGMuZ2V0QmVnaW5MaW5lKCkgPT0gY29tbWVudC5nZXRCZWdpbkxpbmUoKSAmJiBjLmdldEJlZ2luQ29sdW1uKCkgPT0gY29tbWVudC5nZXRCZWdpbkNvbHVtbigpICYmIGMuZ2V0RW5kTGluZSgpID09IGNvbW1lbnQuZ2V0RW5kTGluZSgpICYmIE1hdGguYWJzKGMuZ2V0RW5kQ29sdW1uKCkgLSBjb21tZW50LmdldEVuZENvbHVtbigpKSA8IDIgPT0+IGJvb2xlYW4KKyAgTGluZSA2NykgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDcwKSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDc0KSBMaXN0PENvbW1lbnQ+IGNvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8Q29tbWVudD4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDc0KSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+CisgIExpbmUgNzUpIGNvbW1lbnRzLmFkZEFsbChsaW5lQ29tbWVudHMpID09PiBib29sZWFuCisgIExpbmUgNzYpIGNvbW1lbnRzLmFkZEFsbChibG9ja0NvbW1lbnRzKSA9PT4gYm9vbGVhbgorICBMaW5lIDc3KSBjb21tZW50cy5hZGRBbGwoamF2YWRvY0NvbW1lbnRzKSA9PT4gYm9vbGVhbgorICBMaW5lIDc4KSBjb21tZW50cyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PgorICBMaW5lIDgyKSBsaW5lQ29tbWVudHMuc2l6ZSgpICsgYmxvY2tDb21tZW50cy5zaXplKCkgKyBqYXZhZG9jQ29tbWVudHMuc2l6ZSgpID09PiBpbnQKKyAgTGluZSA4NikgQ29tbWVudHNDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBDb21tZW50c0NvbGxlY3Rpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24KKyAgTGluZSA4NikgbmV3IENvbW1lbnRzQ29sbGVjdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzQ29sbGVjdGlvbgorICBMaW5lIDg3KSBMaW5lQ29tbWVudCBjb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50CisgIExpbmUgODcpIGxpbmVDb21tZW50cyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudD4KKyAgTGluZSA4OCkgIW90aGVyLmNvbnRhaW5zKGNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgODkpIHJlc3VsdC5saW5lQ29tbWVudHMuYWRkKGNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgOTIpIEJsb2NrQ29tbWVudCBjb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudAorICBMaW5lIDkyKSBibG9ja0NvbW1lbnRzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudD4KKyAgTGluZSA5MykgIW90aGVyLmNvbnRhaW5zKGNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgOTQpIHJlc3VsdC5ibG9ja0NvbW1lbnRzLmFkZChjb21tZW50KSA9PT4gYm9vbGVhbgorICBMaW5lIDk3KSBKYXZhZG9jQ29tbWVudCBjb21tZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgOTcpIGphdmFkb2NDb21tZW50cyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudD4KKyAgTGluZSA5OCkgIW90aGVyLmNvbnRhaW5zKGNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgOTkpIHJlc3VsdC5qYXZhZG9jQ29tbWVudHMuYWRkKGNvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgMTAyKSByZXN1bHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNDb2xsZWN0aW9uCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19Db21tZW50c1BhcnNlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19Db21tZW50c1BhcnNlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkZDVlNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0NvbW1lbnRzUGFyc2VyLnR4dApAQCAtMCwwICsxLDEwNCBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgNDEpIDQgPT0+IGludAorICBMaW5lIDQ0KSBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzb3VyY2UuZ2V0Qnl0ZXMoQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpKSkgPT0+IGphdmEuaW8uSW5wdXRTdHJlYW0KKyAgTGluZSA0NCkgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNvdXJjZS5nZXRCeXRlcyhDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpKSA9PT4gamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQorICBMaW5lIDQ1KSBwYXJzZShpbiwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpLm5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNDb2xsZWN0aW9uCisgIExpbmUgNDkpIGJvb2xlYW4gbGFzdFdhc0FTbGFzaFIgPSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDQ5KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDUwKSBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIGNoYXJzZXROYW1lKSkgPT0+IGphdmEuaW8uQnVmZmVyZWRSZWFkZXIKKyAgTGluZSA1MCkgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgY2hhcnNldE5hbWUpKSA9PT4gamF2YS5pby5CdWZmZXJlZFJlYWRlcgorICBMaW5lIDUxKSBDb21tZW50c0NvbGxlY3Rpb24gY29tbWVudHMgPSBuZXcgQ29tbWVudHNDb2xsZWN0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNDb2xsZWN0aW9uCisgIExpbmUgNTEpIG5ldyBDb21tZW50c0NvbGxlY3Rpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24KKyAgTGluZSA1MikgaW50IHIgPT0+IGludAorICBMaW5lIDU0KSBEZXF1ZSBwcmV2VHdvQ2hhcnMgPSBuZXcgTGlua2VkTGlzdDxDaGFyYWN0ZXI+KEFycmF5cy5hc0xpc3QoJ3onLCAneicpKSA9PT4gamF2YS51dGlsLkRlcXVlCisgIExpbmUgNTQpIG5ldyBMaW5rZWRMaXN0PENoYXJhY3Rlcj4oQXJyYXlzLmFzTGlzdCgneicsICd6JykpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxqYXZhLmxhbmcuQ2hhcmFjdGVyPgorICBMaW5lIDU2KSBTdGF0ZSBzdGF0ZSA9IFN0YXRlLkNPREUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIuU3RhdGUKKyAgTGluZSA1NikgU3RhdGUuQ09ERSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c1BhcnNlci5TdGF0ZQorICBMaW5lIDU3KSBMaW5lQ29tbWVudCBjdXJyZW50TGluZUNvbW1lbnQgPSBudWxsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50CisgIExpbmUgNTcpIG51bGwgPT0+IG51bGwKKyAgTGluZSA1OCkgQmxvY2tDb21tZW50IGN1cnJlbnRCbG9ja0NvbW1lbnQgPSBudWxsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudAorICBMaW5lIDU4KSBudWxsID09PiBudWxsCisgIExpbmUgNTkpIFN0cmluZ0J1ZmZlciBjdXJyZW50Q29udGVudCA9IG51bGwgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIKKyAgTGluZSA1OSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDYxKSBpbnQgY3VyckxpbmUgPSAxID09PiBpbnQKKyAgTGluZSA2MSkgMSA9PT4gaW50CisgIExpbmUgNjIpIGludCBjdXJyQ29sID0gMSA9PT4gaW50CisgIExpbmUgNjIpIDEgPT0+IGludAorICBMaW5lIDY0KSAociA9IGJyLnJlYWQoKSkgIT0gLTEgPT0+IGJvb2xlYW4KKyAgTGluZSA2NSkgY2hhciBjID0gKGNoYXIpIHIgPT0+IGNoYXIKKyAgTGluZSA2NSkgKGNoYXIpIHIgPT0+IGNoYXIKKyAgTGluZSA2NikgYyA9PSAnXHInID09PiBib29sZWFuCisgIExpbmUgNjcpIGxhc3RXYXNBU2xhc2hSID0gdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDY4KSBjID09ICdcbicgJiYgbGFzdFdhc0FTbGFzaFIgPT0+IGJvb2xlYW4KKyAgTGluZSA2OSkgbGFzdFdhc0FTbGFzaFIgPSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDcyKSBsYXN0V2FzQVNsYXNoUiA9IGZhbHNlID09PiBib29sZWFuCisgIExpbmUgNzQpIHN0YXRlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyLlN0YXRlCisgIExpbmUgNzUpIENPREUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIuU3RhdGUKKyAgTGluZSA3NikgcHJldlR3b0NoYXJzLnBlZWtMYXN0KCkuZXF1YWxzKCcvJykgJiYgYyA9PSAnLycgPT0+IGJvb2xlYW4KKyAgTGluZSA3NykgY3VycmVudExpbmVDb21tZW50ID0gbmV3IExpbmVDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQKKyAgTGluZSA3OCkgY3VycmVudExpbmVDb21tZW50LnNldEJlZ2luTGluZShjdXJyTGluZSkgPT0+IHZvaWQKKyAgTGluZSA3OSkgY3VycmVudExpbmVDb21tZW50LnNldEJlZ2luQ29sdW1uKGN1cnJDb2wgLSAxKSA9PT4gdm9pZAorICBMaW5lIDgwKSBzdGF0ZSA9IFN0YXRlLklOX0xJTkVfQ09NTUVOVCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c1BhcnNlci5TdGF0ZQorICBMaW5lIDgxKSBjdXJyZW50Q29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDgyKSBwcmV2VHdvQ2hhcnMucGVla0xhc3QoKS5lcXVhbHMoJy8nKSAmJiBjID09ICcqJyA9PT4gYm9vbGVhbgorICBMaW5lIDgzKSBjdXJyZW50QmxvY2tDb21tZW50ID0gbmV3IEJsb2NrQ29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudAorICBMaW5lIDg0KSBjdXJyZW50QmxvY2tDb21tZW50LnNldEJlZ2luTGluZShjdXJyTGluZSkgPT0+IHZvaWQKKyAgTGluZSA4NSkgY3VycmVudEJsb2NrQ29tbWVudC5zZXRCZWdpbkNvbHVtbihjdXJyQ29sIC0gMSkgPT0+IHZvaWQKKyAgTGluZSA4Nikgc3RhdGUgPSBTdGF0ZS5JTl9CTE9DS19DT01NRU5UID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyLlN0YXRlCisgIExpbmUgODcpIGN1cnJlbnRDb250ZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgODgpIGMgPT0gJyInID09PiBib29sZWFuCisgIExpbmUgODkpIHN0YXRlID0gU3RhdGUuSU5fU1RSSU5HID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyLlN0YXRlCisgIExpbmUgOTApIGMgPT0gJ1wnJyA9PT4gYm9vbGVhbgorICBMaW5lIDkxKSBzdGF0ZSA9IFN0YXRlLklOX0NIQVIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIuU3RhdGUKKyAgTGluZSA5NikgSU5fTElORV9DT01NRU5UID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyLlN0YXRlCisgIExpbmUgOTcpIGMgPT0gJ1xuJyB8fCBjID09ICdccicgPT0+IGJvb2xlYW4KKyAgTGluZSA5OCkgY3VycmVudExpbmVDb21tZW50LnNldENvbnRlbnQoY3VycmVudENvbnRlbnQudG9TdHJpbmcoKSkgPT0+IHZvaWQKKyAgTGluZSA5OSkgY3VycmVudExpbmVDb21tZW50LnNldEVuZExpbmUoY3VyckxpbmUpID09PiB2b2lkCisgIExpbmUgMTAwKSBjdXJyZW50TGluZUNvbW1lbnQuc2V0RW5kQ29sdW1uKGN1cnJDb2wpID09PiB2b2lkCisgIExpbmUgMTAxKSBjb21tZW50cy5hZGRDb21tZW50KGN1cnJlbnRMaW5lQ29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMDIpIHN0YXRlID0gU3RhdGUuQ09ERSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c1BhcnNlci5TdGF0ZQorICBMaW5lIDEwNCkgY3VycmVudENvbnRlbnQuYXBwZW5kKGMpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCisgIExpbmUgMTA3KSBJTl9CTE9DS19DT01NRU5UID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyLlN0YXRlCisgIExpbmUgMTA4KSBwcmV2VHdvQ2hhcnMucGVla0xhc3QoKS5lcXVhbHMoJyonKSAmJiBjID09ICcvJyAmJiAhcHJldlR3b0NoYXJzLnBlZWtGaXJzdCgpLmVxdWFscygnLycpID09PiBib29sZWFuCisgIExpbmUgMTExKSBTdHJpbmcgY29udGVudCA9IGN1cnJlbnRDb250ZW50LmRlbGV0ZUNoYXJBdChjdXJyZW50Q29udGVudC50b1N0cmluZygpLmxlbmd0aCgpIC0gMSkudG9TdHJpbmcoKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDExMSkgY3VycmVudENvbnRlbnQuZGVsZXRlQ2hhckF0KGN1cnJlbnRDb250ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgLSAxKS50b1N0cmluZygpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTEzKSBjb250ZW50LnN0YXJ0c1dpdGgoIioiKSA9PT4gYm9vbGVhbgorICBMaW5lIDExNCkgSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQgPSBuZXcgSmF2YWRvY0NvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDExNCkgbmV3IEphdmFkb2NDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAxMTUpIGphdmFkb2NDb21tZW50LnNldENvbnRlbnQoY29udGVudC5zdWJzdHJpbmcoMSkpID09PiB2b2lkCisgIExpbmUgMTE2KSBqYXZhZG9jQ29tbWVudC5zZXRCZWdpbkxpbmUoY3VycmVudEJsb2NrQ29tbWVudC5nZXRCZWdpbkxpbmUoKSkgPT0+IHZvaWQKKyAgTGluZSAxMTcpIGphdmFkb2NDb21tZW50LnNldEJlZ2luQ29sdW1uKGN1cnJlbnRCbG9ja0NvbW1lbnQuZ2V0QmVnaW5Db2x1bW4oKSkgPT0+IHZvaWQKKyAgTGluZSAxMTgpIGphdmFkb2NDb21tZW50LnNldEVuZExpbmUoY3VyckxpbmUpID09PiB2b2lkCisgIExpbmUgMTE5KSBqYXZhZG9jQ29tbWVudC5zZXRFbmRDb2x1bW4oY3VyckNvbCArIDEpID09PiB2b2lkCisgIExpbmUgMTIwKSBjb21tZW50cy5hZGRDb21tZW50KGphdmFkb2NDb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDEyMikgY3VycmVudEJsb2NrQ29tbWVudC5zZXRDb250ZW50KGNvbnRlbnQpID09PiB2b2lkCisgIExpbmUgMTIzKSBjdXJyZW50QmxvY2tDb21tZW50LnNldEVuZExpbmUoY3VyckxpbmUpID09PiB2b2lkCisgIExpbmUgMTI0KSBjdXJyZW50QmxvY2tDb21tZW50LnNldEVuZENvbHVtbihjdXJyQ29sICsgMSkgPT0+IHZvaWQKKyAgTGluZSAxMjUpIGNvbW1lbnRzLmFkZENvbW1lbnQoY3VycmVudEJsb2NrQ29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMjcpIHN0YXRlID0gU3RhdGUuQ09ERSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c1BhcnNlci5TdGF0ZQorICBMaW5lIDEyOSkgY3VycmVudENvbnRlbnQuYXBwZW5kKGMgPT0gJ1xyJyA/ICdcbicgOiBjKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgorICBMaW5lIDEzMikgSU5fU1RSSU5HID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzUGFyc2VyLlN0YXRlCisgIExpbmUgMTMzKSAhcHJldlR3b0NoYXJzLnBlZWtMYXN0KCkuZXF1YWxzKCdcXCcpICYmIGMgPT0gJyInID09PiBib29sZWFuCisgIExpbmUgMTM0KSBzdGF0ZSA9IFN0YXRlLkNPREUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIuU3RhdGUKKyAgTGluZSAxMzcpIElOX0NIQVIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIuU3RhdGUKKyAgTGluZSAxMzgpICFwcmV2VHdvQ2hhcnMucGVla0xhc3QoKS5lcXVhbHMoJ1xcJykgJiYgYyA9PSAnXCcnID09PiBib29sZWFuCisgIExpbmUgMTM5KSBzdGF0ZSA9IFN0YXRlLkNPREUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNQYXJzZXIuU3RhdGUKKyAgTGluZSAxNDMpIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIikgPT0+IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uCisgIExpbmUgMTQ1KSBjID09PiBjaGFyCisgIExpbmUgMTQ2KSAnXG4nID09PiBjaGFyCisgIExpbmUgMTQ3KSAnXHInID09PiBjaGFyCisgIExpbmUgMTQ4KSBjdXJyTGluZSArPSAxID09PiBpbnQKKyAgTGluZSAxNDkpIGN1cnJDb2wgPSAxID09PiBpbnQKKyAgTGluZSAxNTEpICdcdCcgPT0+IGNoYXIKKyAgTGluZSAxNTIpIGN1cnJDb2wgKz0gQ09MVU1OU19QRVJfVEFCID09PiBpbnQKKyAgTGluZSAxNTUpIGN1cnJDb2wgKz0gMSA9PT4gaW50CisgIExpbmUgMTU3KSBwcmV2VHdvQ2hhcnMucmVtb3ZlKCkgPT0+IGphdmEubGFuZy5PYmplY3QKKyAgTGluZSAxNTgpIHByZXZUd29DaGFycy5hZGQoYykgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjEpIHN0YXRlID09IFN0YXRlLklOX0xJTkVfQ09NTUVOVCA9PT4gYm9vbGVhbgorICBMaW5lIDE2MikgY3VycmVudExpbmVDb21tZW50LnNldENvbnRlbnQoY3VycmVudENvbnRlbnQudG9TdHJpbmcoKSkgPT0+IHZvaWQKKyAgTGluZSAxNjMpIGN1cnJlbnRMaW5lQ29tbWVudC5zZXRFbmRMaW5lKGN1cnJMaW5lKSA9PT4gdm9pZAorICBMaW5lIDE2NCkgY3VycmVudExpbmVDb21tZW50LnNldEVuZENvbHVtbihjdXJyQ29sKSA9PT4gdm9pZAorICBMaW5lIDE2NSkgY29tbWVudHMuYWRkQ29tbWVudChjdXJyZW50TGluZUNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMTY4KSBjb21tZW50cyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0phdmFkb2NDb21tZW50LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0phdmFkb2NDb21tZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTU3MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfSmF2YWRvY0NvbW1lbnQudHh0CkBAIC0wLDAgKzEsMTQgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM2KSBjb250ZW50ID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNDApIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDApIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0MCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDApIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDApIGNvbnRlbnQgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTApIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfTGluZUNvbW1lbnQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfTGluZUNvbW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjY2M5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19MaW5lQ29tbWVudC50eHQKQEAgLTAsMCArMSwxNSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDEpIGNvbnRlbnQgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0NSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NSkgY29udGVudCA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDUwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjApIHRydWUgPT0+IGJvb2xlYW4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQW5ub3RhdGlvbkV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Bbm5vdGF0aW9uRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmZjA5YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQW5ub3RhdGlvbkV4cHIudHh0CkBAIC0wLDAgKzEsMTMgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzNSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSAzNSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDM1KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSAzNSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSAzOSkgbmFtZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgNDMpIHRoaXMubmFtZSA9IG5hbWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDQ0KSBzZXRBc1BhcmVudE5vZGVPZihuYW1lKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9BcnJheUFjY2Vzc0V4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9BcnJheUFjY2Vzc0V4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTk5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5QWNjZXNzRXhwci50eHQKQEAgLTAsMCArMSwyMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0MCkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDQxKSBzZXRJbmRleChpbmRleCkgPT0+IHZvaWQKKyAgTGluZSA0NSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0Nikgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDQ3KSBzZXRJbmRleChpbmRleCkgPT0+IHZvaWQKKyAgTGluZSA1Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYxKSBpbmRleCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2NSkgbmFtZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2OSkgdGhpcy5pbmRleCA9IGluZGV4ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDcwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluZGV4KSA9PT4gdm9pZAorICBMaW5lIDc0KSB0aGlzLm5hbWUgPSBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5Q3JlYXRpb25FeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlDcmVhdGlvbkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTc4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5Q3JlYXRpb25FeHByLnR4dApAQCAtMCwwICsxLDQ1IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDkpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1MCkgc2V0QXJyYXlDb3VudChhcnJheUNvdW50KSA9PT4gdm9pZAorICBMaW5lIDUxKSBzZXRJbml0aWFsaXplcihpbml0aWFsaXplcikgPT0+IHZvaWQKKyAgTGluZSA1Mikgc2V0RGltZW5zaW9ucyhudWxsKSA9PT4gdm9pZAorICBMaW5lIDU2KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU2KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTYpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU2KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDU3KSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNTgpIHNldEFycmF5Q291bnQoYXJyYXlDb3VudCkgPT0+IHZvaWQKKyAgTGluZSA1OSkgc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpID09PiB2b2lkCisgIExpbmUgNjApIHNldERpbWVuc2lvbnMobnVsbCkgPT0+IHZvaWQKKyAgTGluZSA2NCkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDY1KSBzZXRBcnJheUNvdW50KGFycmF5Q291bnQpID09PiB2b2lkCisgIExpbmUgNjYpIHNldERpbWVuc2lvbnMoZGltZW5zaW9ucykgPT0+IHZvaWQKKyAgTGluZSA2Nykgc2V0SW5pdGlhbGl6ZXIobnVsbCkgPT0+IHZvaWQKKyAgTGluZSA3MSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA3MSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDcxKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA3MSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA3Mikgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDczKSBzZXRBcnJheUNvdW50KGFycmF5Q291bnQpID09PiB2b2lkCisgIExpbmUgNzQpIHNldERpbWVuc2lvbnMoZGltZW5zaW9ucykgPT0+IHZvaWQKKyAgTGluZSA3NSkgc2V0SW5pdGlhbGl6ZXIobnVsbCkgPT0+IHZvaWQKKyAgTGluZSA4MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg5KSBhcnJheUNvdW50ID09PiBpbnQKKyAgTGluZSA5MykgZGltZW5zaW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgOTcpIGluaXRpYWxpemVyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIKKyAgTGluZSAxMDEpIHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMTA1KSB0aGlzLmFycmF5Q291bnQgPSBhcnJheUNvdW50ID09PiBpbnQKKyAgTGluZSAxMDkpIHRoaXMuZGltZW5zaW9ucyA9IGRpbWVuc2lvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDExMCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5kaW1lbnNpb25zKSA9PT4gdm9pZAorICBMaW5lIDExNCkgdGhpcy5pbml0aWFsaXplciA9IGluaXRpYWxpemVyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIKKyAgTGluZSAxMTUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5pdGlhbGl6ZXIpID09PiB2b2lkCisgIExpbmUgMTE5KSB0aGlzLnR5cGUgPSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDEyMCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gdm9pZAorICBMaW5lIDEyNCkgYXJyYXlzQW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgMTI5KSB0aGlzLmFycmF5c0Fubm90YXRpb25zID0gYXJyYXlzQW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5SW5pdGlhbGl6ZXJFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlJbml0aWFsaXplckV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOThiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5SW5pdGlhbGl6ZXJFeHByLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDApIHNldFZhbHVlcyh2YWx1ZXMpID09PiB2b2lkCisgIExpbmUgNDQpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDQpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDQpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDUpIHNldFZhbHVlcyh2YWx1ZXMpID09PiB2b2lkCisgIExpbmUgNTApIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1OSkgdmFsdWVzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA2MykgdGhpcy52YWx1ZXMgPSB2YWx1ZXMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDY0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhbHVlcykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXNzaWduRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0Fzc2lnbkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjlhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0Fzc2lnbkV4cHIudHh0CkBAIC0wLDAgKzEsMjYgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDU3KSBzZXRUYXJnZXQodGFyZ2V0KSA9PT4gdm9pZAorICBMaW5lIDU4KSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IHZvaWQKKyAgTGluZSA1OSkgc2V0T3BlcmF0b3Iob3ApID09PiB2b2lkCisgIExpbmUgNjMpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNjMpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA2MykgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNjMpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNjQpIHNldFRhcmdldCh0YXJnZXQpID09PiB2b2lkCisgIExpbmUgNjUpIHNldFZhbHVlKHZhbHVlKSA9PT4gdm9pZAorICBMaW5lIDY2KSBzZXRPcGVyYXRvcihvcCkgPT0+IHZvaWQKKyAgTGluZSA3MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgwKSBvcCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuT3BlcmF0b3IKKyAgTGluZSA4NCkgdGFyZ2V0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDg4KSB2YWx1ZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA5MikgdGhpcy5vcCA9IG9wID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDk2KSB0aGlzLnRhcmdldCA9IHRhcmdldCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA5Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50YXJnZXQpID09PiB2b2lkCisgIExpbmUgMTAxKSB0aGlzLnZhbHVlID0gdmFsdWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTAyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhbHVlKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9CaW5hcnlFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQmluYXJ5RXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MTliOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQmluYXJ5RXhwci50eHQKQEAgLTAsMCArMSwyNiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNjQpIHNldExlZnQobGVmdCkgPT0+IHZvaWQKKyAgTGluZSA2NSkgc2V0UmlnaHQocmlnaHQpID09PiB2b2lkCisgIExpbmUgNjYpIHNldE9wZXJhdG9yKG9wKSA9PT4gdm9pZAorICBMaW5lIDcwKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDcwKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNzApIGVuZExpbmUgPT0+IGludAorICBMaW5lIDcwKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDcxKSBzZXRMZWZ0KGxlZnQpID09PiB2b2lkCisgIExpbmUgNzIpIHNldFJpZ2h0KHJpZ2h0KSA9PT4gdm9pZAorICBMaW5lIDczKSBzZXRPcGVyYXRvcihvcCkgPT0+IHZvaWQKKyAgTGluZSA3OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg3KSBsZWZ0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDkxKSBvcCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA5NSkgcmlnaHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgOTkpIHRoaXMubGVmdCA9IGxlZnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTAwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmxlZnQpID09PiB2b2lkCisgIExpbmUgMTA0KSB0aGlzLm9wID0gb3AgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgMTA4KSB0aGlzLnJpZ2h0ID0gcmlnaHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnJpZ2h0KSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Cb29sZWFuTGl0ZXJhbEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Cb29sZWFuTGl0ZXJhbEV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTFmODIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0Jvb2xlYW5MaXRlcmFsRXhwci50eHQKQEAgLTAsMCArMSwxNyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGl0ZXJhbEV4cHIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzgpIHNldFZhbHVlKHZhbHVlKSA9PT4gdm9pZAorICBMaW5lIDQyKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQyKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDIpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQyKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQzKSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IHZvaWQKKyAgTGluZSA0OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU3KSB2YWx1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDYxKSB0aGlzLnZhbHVlID0gdmFsdWUgPT0+IGJvb2xlYW4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ2FzdEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9DYXN0RXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3NTEwYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ2FzdEV4cHIudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0MSkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDQyKSBzZXRFeHByKGV4cHIpID09PiB2b2lkCisgIExpbmUgNDYpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDYpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDYpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDcpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA0OCkgc2V0RXhwcihleHByKSA9PT4gdm9pZAorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjIpIGV4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjYpIHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNzApIHRoaXMuZXhwciA9IGV4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcikgPT0+IHZvaWQKKyAgTGluZSA3NSkgdGhpcy50eXBlID0gdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA3Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9DaGFyTGl0ZXJhbEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9DaGFyTGl0ZXJhbEV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmNhODUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NoYXJMaXRlcmFsRXhwci50eHQKQEAgLTAsMCArMSwxNiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM2KSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQwKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQwKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDApIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQwKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQwKSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NsYXNzRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NsYXNzRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzNjYzNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ2xhc3NFeHByLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM5KSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNDMpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDMpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0MykgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDMpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDQpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA0OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU4KSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDYyKSB0aGlzLnR5cGUgPSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDYzKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NvbmRpdGlvbmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NvbmRpdGlvbmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5MmM2NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ29uZGl0aW9uYWxFeHByLnR4dApAQCAtMCwwICsxLDI3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQyKSBzZXRDb25kaXRpb24oY29uZGl0aW9uKSA9PT4gdm9pZAorICBMaW5lIDQzKSBzZXRUaGVuRXhwcih0aGVuRXhwcikgPT0+IHZvaWQKKyAgTGluZSA0NCkgc2V0RWxzZUV4cHIoZWxzZUV4cHIpID09PiB2b2lkCisgIExpbmUgNDgpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDgpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDgpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDkpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiB2b2lkCisgIExpbmUgNTApIHNldFRoZW5FeHByKHRoZW5FeHByKSA9PT4gdm9pZAorICBMaW5lIDUxKSBzZXRFbHNlRXhwcihlbHNlRXhwcikgPT0+IHZvaWQKKyAgTGluZSA1Nikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1KSBjb25kaXRpb24gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjkpIGVsc2VFeHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDczKSB0aGVuRXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NykgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb24gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKSA9PT4gdm9pZAorICBMaW5lIDgyKSB0aGlzLmVsc2VFeHByID0gZWxzZUV4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxzZUV4cHIpID09PiB2b2lkCisgIExpbmUgODcpIHRoaXMudGhlbkV4cHIgPSB0aGVuRXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4OCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50aGVuRXhwcikgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRG91YmxlTGl0ZXJhbEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Eb3VibGVMaXRlcmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkOWE4NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRG91YmxlTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsMTYgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRG91YmxlTGl0ZXJhbEV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM2KSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQxKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQxKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDEpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQxKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQxKSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0VuY2xvc2VkRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0VuY2xvc2VkRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MDdkOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRW5jbG9zZWRFeHByLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM4KSBzZXRJbm5lcihpbm5lcikgPT0+IHZvaWQKKyAgTGluZSA0MykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0MykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQzKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0MykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NCkgc2V0SW5uZXIoaW5uZXIpID09PiB2b2lkCisgIExpbmUgNDgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NikgaW5uZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjApIHRoaXMuaW5uZXIgPSBpbm5lciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbm5lcikgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRXhwcmVzc2lvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0V4cHJlc3Npb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTIyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0V4cHJlc3Npb24udHh0CkBAIC0wLDAgKzEsOSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzUpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgMzUpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSAzNSkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgMzUpIGVuZENvbHVtbiA9PT4gaW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0ZpZWxkQWNjZXNzRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0ZpZWxkQWNjZXNzRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMTM4YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRmllbGRBY2Nlc3NFeHByLnR4dApAQCAtMCwwICsxLDI3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQ1KSBzZXRTY29wZShzY29wZSkgPT0+IHZvaWQKKyAgTGluZSA0Nikgc2V0RmllbGQoZmllbGQpID09PiB2b2lkCisgIExpbmUgNTEpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTEpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1MSkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTEpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTIpIHNldFNjb3BlKHNjb3BlKSA9PT4gdm9pZAorICBMaW5lIDUzKSBzZXRUeXBlQXJncyh0eXBlQXJncykgPT0+IHZvaWQKKyAgTGluZSA1NCkgc2V0RmllbGQoZmllbGQpID09PiB2b2lkCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDYyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NikgZmllbGQuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNzApIGZpZWxkID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA3NCkgc2NvcGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzgpIHR5cGVBcmdzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA4MikgdGhpcy5maWVsZCA9IG5ldyBOYW1lRXhwcihmaWVsZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDg2KSB0aGlzLmZpZWxkID0gZmllbGQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDkwKSB0aGlzLnNjb3BlID0gc2NvcGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgOTEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2NvcGUpID09PiB2b2lkCisgIExpbmUgOTUpIHRoaXMudHlwZUFyZ3MgPSB0eXBlQXJncyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgOTYpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3MpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0luc3RhbmNlT2ZFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW5zdGFuY2VPZkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODU4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0luc3RhbmNlT2ZFeHByLnR4dApAQCAtMCwwICsxLDIyIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDEpIHNldEV4cHIoZXhwcikgPT0+IHZvaWQKKyAgTGluZSA0Mikgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDQ3KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ3KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDcpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ3KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ4KSBzZXRFeHByKGV4cHIpID09PiB2b2lkCisgIExpbmUgNDkpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYxKSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDY1KSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDY5KSB0aGlzLmV4cHIgPSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDcwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiB2b2lkCisgIExpbmUgNzQpIHRoaXMudHlwZSA9IHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNzUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSkgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW50ZWdlckxpdGVyYWxFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW50ZWdlckxpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFmZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnRlZ2VyTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsMjEgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsRXhwcgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzMikgIjIxNDc0ODM2NDgiID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMzQpICItIiArIFVOU0lHTkVEX01JTl9WQUxVRSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQwKSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ1KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ1KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDUpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ1KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTcpIC8vCit2YWx1ZSAhPSBudWxsICYmIC8vCit2YWx1ZS5sZW5ndGgoKSA9PSAxMCAmJiB2YWx1ZS5lcXVhbHMoVU5TSUdORURfTUlOX1ZBTFVFKSA9PT4gYm9vbGVhbgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0ludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBlODgwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwci50eHQKQEAgLTAsMCArMSwxNyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsRXhwcgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzMykgTUlOX1ZBTFVFID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMzcpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgMzcpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSAzNykgZW5kTGluZSA9PT4gaW50CisgIExpbmUgMzcpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgMzcpIE1JTl9WQUxVRSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0xhbWJkYUV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9MYW1iZGFFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQ0NzZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9MYW1iZGFFeHByLnR4dApAQCAtMCwwICsxLDIzIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA1MikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1MikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDUyKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1MikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1Mykgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDU0KSBzZXRCb2R5KGJvZHkpID09PiB2b2lkCisgIExpbmUgNTUpIHNldFBhcmFtZXRlcnNFbmNsb3NlZChwYXJhbWV0ZXJzRW5jbG9zZWQpID09PiB2b2lkCisgIExpbmUgNTkpIHBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgNjMpIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgNjQpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA2OCkgYm9keSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDcyKSB0aGlzLmJvZHkgPSBib2R5ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgNzMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSkgPT0+IHZvaWQKKyAgTGluZSA3OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg3KSBwYXJhbWV0ZXJzRW5jbG9zZWQgPT0+IGJvb2xlYW4KKyAgTGluZSA5MSkgdGhpcy5wYXJhbWV0ZXJzRW5jbG9zZWQgPSBwYXJhbWV0ZXJzRW5jbG9zZWQgPT0+IGJvb2xlYW4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTGl0ZXJhbEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9MaXRlcmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1N2EyMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsMTAgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGl0ZXJhbEV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzMykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSAzMykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDMzKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSAzMykgZW5kQ29sdW1uID09PiBpbnQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgyYzFhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Mb25nTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsRXhwcgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzMikgIjkyMjMzNzIwMzY4NTQ3NzU4MDgiID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMzQpICItIiArIFVOU0lHTkVEX01JTl9WQUxVRSArICJMIiA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQwKSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ1KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ1KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDUpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ1KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSB2YWx1ZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTcpIC8vCit2YWx1ZSAhPSBudWxsICYmIC8vCit2YWx1ZS5sZW5ndGgoKSA9PSAyMCAmJiAvLwordmFsdWUuc3RhcnRzV2l0aChVTlNJR05FRF9NSU5fVkFMVUUpICYmICh2YWx1ZS5jaGFyQXQoMTkpID09ICdMJyB8fCB2YWx1ZS5jaGFyQXQoMTkpID09ICdsJykgPT0+IGJvb2xlYW4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Mb25nTGl0ZXJhbE1pblZhbHVlRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2Y2Y4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIudHh0CkBAIC0wLDAgKzEsMTcgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGl0ZXJhbEV4cHIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzMpIE1JTl9WQUxVRSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDM3KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDM3KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgMzcpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDM3KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDM3KSBNSU5fVkFMVUUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NYXJrZXJBbm5vdGF0aW9uRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01hcmtlckFubm90YXRpb25FeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FmN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NYXJrZXJBbm5vdGF0aW9uRXhwci50eHQKQEAgLTAsMCArMSwxNSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzNikgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDQxKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQxKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDEpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQxKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQyKSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWVtYmVyVmFsdWVQYWlyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWVtYmVyVmFsdWVQYWlyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmIwMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZW1iZXJWYWx1ZVBhaXIudHh0CkBAIC0wLDAgKzEsMjEgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0Mikgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDQzKSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IHZvaWQKKyAgTGluZSA0OCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0OCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ4KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0OCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OSkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDUwKSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IHZvaWQKKyAgTGluZSA1NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYyKSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNjYpIHZhbHVlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDcwKSB0aGlzLm5hbWUgPSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNzQpIHRoaXMudmFsdWUgPSB2YWx1ZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy52YWx1ZSkgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWV0aG9kQ2FsbEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZXRob2RDYWxsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjYzU3MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWV0aG9kQ2FsbEV4cHIudHh0CkBAIC0wLDAgKzEsMzQgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0Nykgc2V0U2NvcGUoc2NvcGUpID09PiB2b2lkCisgIExpbmUgNDgpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1Mikgc2V0U2NvcGUoc2NvcGUpID09PiB2b2lkCisgIExpbmUgNTMpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA1NCkgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDU5KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU5KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTkpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU5KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDYwKSBzZXRTY29wZShzY29wZSkgPT0+IHZvaWQKKyAgTGluZSA2MSkgc2V0VHlwZUFyZ3ModHlwZUFyZ3MpID09PiB2b2lkCisgIExpbmUgNjIpIHNldE5hbWUobmFtZSkgPT0+IHZvaWQKKyAgTGluZSA2Mykgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDY3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzUpIGFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDc5KSBuYW1lLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDgzKSBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA4Nykgc2NvcGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgOTEpIHR5cGVBcmdzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA5NSkgdGhpcy5hcmdzID0gYXJncyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgOTYpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYXJncykgPT0+IHZvaWQKKyAgTGluZSAxMDApIHRoaXMubmFtZSA9IG5ldyBOYW1lRXhwcihuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMTA0KSB0aGlzLm5hbWUgPSBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAxMDgpIHRoaXMuc2NvcGUgPSBzY29wZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMDkpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2NvcGUpID09PiB2b2lkCisgIExpbmUgMTEzKSB0aGlzLnR5cGVBcmdzID0gdHlwZUFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDExNCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJncykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWV0aG9kUmVmZXJlbmNlRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01ldGhvZFJlZmVyZW5jZUV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWM3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01ldGhvZFJlZmVyZW5jZUV4cHIudHh0CkBAIC0wLDAgKzEsMjMgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDU1KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU1KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTUpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU1KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDU2KSBzZXRJZGVudGlmaWVyKGlkZW50aWZpZXIpID09PiB2b2lkCisgIExpbmUgNTcpIHNldFNjb3BlKHNjb3BlKSA9PT4gdm9pZAorICBMaW5lIDU4KSBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA2NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDczKSBzY29wZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NykgdGhpcy5zY29wZSA9IHNjb3BlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnNjb3BlKSA9PT4gdm9pZAorICBMaW5lIDgyKSB0eXBlUGFyYW1ldGVycyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDg2KSB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSA4Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlUGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSA5MSkgaWRlbnRpZmllciA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDk1KSB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyID09PiBqYXZhLmxhbmcuU3RyaW5nCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX05hbWVFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTmFtZUV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDg2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX05hbWVFeHByLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZQorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzOSkgdGhpcy5uYW1lID0gbmFtZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ0KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDQpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ0KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSB0aGlzLm5hbWUgPSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNDkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NykgbmFtZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDYxKSB0aGlzLm5hbWUgPSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX05vcm1hbEFubm90YXRpb25FeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTm9ybWFsQW5ub3RhdGlvbkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NTVkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX05vcm1hbEFubm90YXRpb25FeHByLnR4dApAQCAtMCwwICsxLDIwIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQwKSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNDEpIHNldFBhaXJzKHBhaXJzKSA9PT4gdm9pZAorICBMaW5lIDQ2KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ2KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDYpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ2KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ3KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNDgpIHNldFBhaXJzKHBhaXJzKSA9PT4gdm9pZAorICBMaW5lIDUyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Nikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjApIHBhaXJzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyPgorICBMaW5lIDY0KSB0aGlzLnBhaXJzID0gcGFpcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXI+CisgIExpbmUgNjUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFpcnMpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX051bGxMaXRlcmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX051bGxMaXRlcmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMDhiZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTnVsbExpdGVyYWxFeHByLnR4dApAQCAtMCwwICsxLDEzIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk51bGxMaXRlcmFsRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MaXRlcmFsRXhwcgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzNikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSAzNikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDM2KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSAzNikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9PYmplY3RDcmVhdGlvbkV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9PYmplY3RDcmVhdGlvbkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjJlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX09iamVjdENyZWF0aW9uRXhwci50eHQKQEAgLTAsMCArMSwzNSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA1MSkgc2V0U2NvcGUoc2NvcGUpID09PiB2b2lkCisgIExpbmUgNTIpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1Mykgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDU5KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU5KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTkpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU5KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDYwKSBzZXRTY29wZShzY29wZSkgPT0+IHZvaWQKKyAgTGluZSA2MSkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDYyKSBzZXRUeXBlQXJncyh0eXBlQXJncykgPT0+IHZvaWQKKyAgTGluZSA2Mykgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDY0KSBzZXRBbm9ueW1vdXNDbGFzc0JvZHkoYW5vbnltb3VzQm9keSkgPT0+IHZvaWQKKyAgTGluZSA2OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc2KSBhbm9ueW1vdXNDbGFzc0JvZHkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgODApIGFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDg0KSBzY29wZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4OCkgdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgOTIpIHR5cGVBcmdzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA5NikgdGhpcy5hbm9ueW1vdXNDbGFzc0JvZHkgPSBhbm9ueW1vdXNDbGFzc0JvZHkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgOTcpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5vbnltb3VzQ2xhc3NCb2R5KSA9PT4gdm9pZAorICBMaW5lIDEwMSkgdGhpcy5hcmdzID0gYXJncyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTAyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFyZ3MpID09PiB2b2lkCisgIExpbmUgMTA2KSB0aGlzLnNjb3BlID0gc2NvcGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnNjb3BlKSA9PT4gdm9pZAorICBMaW5lIDExMSkgdGhpcy50eXBlID0gdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMTEyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpID09PiB2b2lkCisgIExpbmUgMTE2KSB0aGlzLnR5cGVBcmdzID0gdHlwZUFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDExNykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJncykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfUXVhbGlmaWVkTmFtZUV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9RdWFsaWZpZWROYW1lRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNDQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfUXVhbGlmaWVkTmFtZUV4cHIudHh0CkBAIC0wLDAgKzEsMjEgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGUKKyAgTGluZSAzOCkgbmFtZSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDM5KSBzZXRRdWFsaWZpZXIoc2NvcGUpID09PiB2b2lkCisgIExpbmUgNDQpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDQpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDQpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDQpIG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0NSkgc2V0UXVhbGlmaWVyKHNjb3BlKSA9PT4gdm9pZAorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTcpIHF1YWxpZmllciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgNjEpIHRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA2Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5xdWFsaWZpZXIpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTYxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByLnR4dApAQCAtMCwwICsxLDIwIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM4KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgMzkpIHNldE1lbWJlclZhbHVlKG1lbWJlclZhbHVlKSA9PT4gdm9pZAorICBMaW5lIDQ0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ0KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDQpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ0KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSBzZXROYW1lKG5hbWUpID09PiB2b2lkCisgIExpbmUgNDYpIHNldE1lbWJlclZhbHVlKG1lbWJlclZhbHVlKSA9PT4gdm9pZAorICBMaW5lIDUwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTgpIG1lbWJlclZhbHVlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDYyKSB0aGlzLm1lbWJlclZhbHVlID0gbWVtYmVyVmFsdWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMubWVtYmVyVmFsdWUpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1N0cmluZ0xpdGVyYWxFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfU3RyaW5nTGl0ZXJhbEV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjMzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1N0cmluZ0xpdGVyYWxFeHByLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxpdGVyYWxFeHByCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM4KSB0aGlzLnZhbHVlID0gdmFsdWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0MykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0MykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQzKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0MykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NCkgdGhpcy52YWx1ZSA9IHZhbHVlID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNDgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NikgdmFsdWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA2MCkgdGhpcy52YWx1ZSA9IHZhbHVlID09PiBqYXZhLmxhbmcuU3RyaW5nCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1N1cGVyRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1N1cGVyRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZjFkYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfU3VwZXJFeHByLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM4KSBzZXRDbGFzc0V4cHIoY2xhc3NFeHByKSA9PT4gdm9pZAorICBMaW5lIDQzKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQzKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDMpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQzKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ0KSBzZXRDbGFzc0V4cHIoY2xhc3NFeHByKSA9PT4gdm9pZAorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTYpIGNsYXNzRXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MCkgdGhpcy5jbGFzc0V4cHIgPSBjbGFzc0V4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2xhc3NFeHByKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9UaGlzRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1RoaXNFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGUzZjhlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9UaGlzRXhwci50eHQKQEAgLTAsMCArMSwxNyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM4KSBzZXRDbGFzc0V4cHIoY2xhc3NFeHByKSA9PT4gdm9pZAorICBMaW5lIDQzKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQzKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDMpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQzKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ0KSBzZXRDbGFzc0V4cHIoY2xhc3NFeHByKSA9PT4gdm9pZAorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTYpIGNsYXNzRXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MCkgdGhpcy5jbGFzc0V4cHIgPSBjbGFzc0V4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2xhc3NFeHByKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9UeXBlRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1R5cGVFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWFiNDRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9UeXBlRXhwci50eHQKQEAgLTAsMCArMSwxNiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQwKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQwKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDApIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQwKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQxKSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NSkgdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA1OSkgdGhpcy50eXBlID0gdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA2MCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9VbmFyeUV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9VbmFyeUV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDZlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1VuYXJ5RXhwci50eHQKQEAgLTAsMCArMSwyMSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA1MSkgc2V0RXhwcihleHByKSA9PT4gdm9pZAorICBMaW5lIDUyKSBzZXRPcGVyYXRvcihvcCkgPT0+IHZvaWQKKyAgTGluZSA1NykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1NykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDU3KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1NykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1OCkgc2V0RXhwcihleHByKSA9PT4gdm9pZAorICBMaW5lIDU5KSBzZXRPcGVyYXRvcihvcCkgPT0+IHZvaWQKKyAgTGluZSA2Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcxKSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc1KSBvcCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDc5KSB0aGlzLmV4cHIgPSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDgwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiB2b2lkCisgIExpbmUgODQpIHRoaXMub3AgPSBvcCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5PcGVyYXRvcgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UyNzZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci50eHQKQEAgLTAsMCArMSwzMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwciBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQ5KSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNTApIHNldFZhcnModmFycykgPT0+IHZvaWQKKyAgTGluZSA1NCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IHZvaWQKKyAgTGluZSA1NSkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDU2KSBzZXRWYXJzKHZhcnMpID09PiB2b2lkCisgIExpbmUgNjIpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNjIpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA2MikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNjIpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNjMpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiB2b2lkCisgIExpbmUgNjQpIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDY1KSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNjYpIHNldFZhcnModmFycykgPT0+IHZvaWQKKyAgTGluZSA3MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc4KSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDg4KSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDkyKSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDk2KSB2YXJzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDEwMCkgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTAxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDEwNSkgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnMgPT0+IGludAorICBMaW5lIDEwOSkgdGhpcy50eXBlID0gdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAxMTApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSkgPT0+IHZvaWQKKyAgTGluZSAxMTQpIHRoaXMudmFycyA9IHZhcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgMTE1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhcnMpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9pbnRlcm5hbF9VdGlscy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9pbnRlcm5hbF9VdGlscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhYzczYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2ludGVybmFsX1V0aWxzLnR4dApAQCAtMCwwICsxLDUgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmludGVybmFsLlV0aWxzIF0KKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBMaW5lIDM1KSBsaXN0ID09IG51bGwgPyBDb2xsZWN0aW9ucy48VD5lbXB0eUxpc3QoKSA6IGxpc3QgPT0+IGphdmEudXRpbC5MaXN0PFQ+CisgIExpbmUgMzkpIGNvbGxlY3Rpb24gPT0gbnVsbCB8fCBjb2xsZWN0aW9uLmlzRW1wdHkoKSA9PT4gYm9vbGVhbgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Bc3NlcnRTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQXNzZXJ0U3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1ZmM5MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQXNzZXJ0U3RtdC50eHQKQEAgLTAsMCArMSwyMyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0MSkgc2V0Q2hlY2soY2hlY2spID09PiB2b2lkCisgIExpbmUgNDUpIHNldENoZWNrKGNoZWNrKSA9PT4gdm9pZAorICBMaW5lIDQ2KSBzZXRNZXNzYWdlKG1zZykgPT0+IHZvaWQKKyAgTGluZSA1MSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1MSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDUxKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1MSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1Mykgc2V0Q2hlY2soY2hlY2spID09PiB2b2lkCisgIExpbmUgNTQpIHNldE1lc3NhZ2UobXNnKSA9PT4gdm9pZAorICBMaW5lIDU5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjcpIGNoZWNrID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDcxKSBtc2cgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzUpIHRoaXMuY2hlY2sgPSBjaGVjayA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jaGVjaykgPT0+IHZvaWQKKyAgTGluZSA4MCkgdGhpcy5tc2cgPSBtc2cgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMubXNnKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9CbG9ja1N0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9CbG9ja1N0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjNhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0Jsb2NrU3RtdC50eHQKQEAgLTAsMCArMSwxNyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQwKSBzZXRTdG10cyhzdG10cykgPT0+IHZvaWQKKyAgTGluZSA0NSkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NSkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NSkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0Nikgc2V0U3RtdHMoc3RtdHMpID09PiB2b2lkCisgIExpbmUgNTEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MCkgc3RtdHMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgNjQpIHRoaXMuc3RtdHMgPSBzdG10cyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSA2NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zdG10cykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQnJlYWtTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQnJlYWtTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGMwZjFkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9CcmVha1N0bXQudHh0CkBAIC0wLDAgKzEsMTYgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzOCkgdGhpcy5pZCA9IGlkID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNDIpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDIpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0MikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDIpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDMpIHRoaXMuaWQgPSBpZCA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQ3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTUpIGlkID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNTkpIHRoaXMuaWQgPSBpZCA9PT4gamF2YS5sYW5nLlN0cmluZwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9DYXRjaENsYXVzZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0NhdGNoQ2xhdXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZhYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9DYXRjaENsYXVzZS50eHQKQEAgLTAsMCArMSwyMyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZSBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQ3KSBzZXRFeGNlcHQoZXhjZXB0KSA9PT4gdm9pZAorICBMaW5lIDQ4KSBzZXRDYXRjaEJsb2NrKGNhdGNoQmxvY2spID09PiB2b2lkCisgIExpbmUgNTIpIG5ldyBNdWx0aVR5cGVQYXJhbWV0ZXIoZXhjZXB0TW9kaWZpZXIsIGV4Y2VwdEFubm90YXRpb25zLCBleGNlcHRUeXBlcywgZXhjZXB0SWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyCisgIExpbmUgNTIpIGNhdGNoQmxvY2sgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSA1OCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1OCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDU4KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1OCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1OSkgc2V0RXhjZXB0KG5ldyBNdWx0aVR5cGVQYXJhbWV0ZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBleGNlcHRNb2RpZmllciwgZXhjZXB0QW5ub3RhdGlvbnMsIGV4Y2VwdFR5cGVzLCBleGNlcHRJZCkpID09PiB2b2lkCisgIExpbmUgNjApIHNldENhdGNoQmxvY2soY2F0Y2hCbG9jaykgPT0+IHZvaWQKKyAgTGluZSA2NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcyKSBjYXRjaEJsb2NrID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgNzYpIGV4Y2VwdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcgorICBMaW5lIDgwKSB0aGlzLmNhdGNoQmxvY2sgPSBjYXRjaEJsb2NrID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgODEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2F0Y2hCbG9jaykgPT0+IHZvaWQKKyAgTGluZSA4NSkgdGhpcy5leGNlcHQgPSBleGNlcHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NdWx0aVR5cGVQYXJhbWV0ZXIKKyAgTGluZSA4Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leGNlcHQpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0NvbnRpbnVlU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0NvbnRpbnVlU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQ29udGludWVTdG10LnR4dApAQCAtMCwwICsxLDE2IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzgpIHRoaXMuaWQgPSBpZCA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDQzKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQzKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDMpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQzKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ0KSB0aGlzLmlkID0gaWQgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA0OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU2KSBpZCA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDYwKSB0aGlzLmlkID0gaWQgPT0+IGphdmEubGFuZy5TdHJpbmcKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRG9TdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRG9TdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE1NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Eb1N0bXQudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0MSkgc2V0Qm9keShib2R5KSA9PT4gdm9pZAorICBMaW5lIDQyKSBzZXRDb25kaXRpb24oY29uZGl0aW9uKSA9PT4gdm9pZAorICBMaW5lIDQ3KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ3KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDcpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ3KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ4KSBzZXRCb2R5KGJvZHkpID09PiB2b2lkCisgIExpbmUgNDkpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiB2b2lkCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MSkgYm9keSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDY1KSBjb25kaXRpb24gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjkpIHRoaXMuYm9keSA9IGJvZHkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgTGluZSA3MCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KSA9PT4gdm9pZAorICBMaW5lIDc0KSB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jb25kaXRpb24pID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0VtcHR5U3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0VtcHR5U3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0YWE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRW1wdHlTdG10LnR4dApAQCAtMCwwICsxLDEyIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzYpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgMzYpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSAzNikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgMzYpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDApIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDQ0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGEwNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQudHh0CkBAIC0wLDAgKzEsMzAgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0OSkgc2V0VGhpcyhpc1RoaXMpID09PiB2b2lkCisgIExpbmUgNTApIHNldEV4cHIoZXhwcikgPT0+IHZvaWQKKyAgTGluZSA1MSkgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDU4KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU4KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTgpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU4KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDU5KSBzZXRUeXBlQXJncyh0eXBlQXJncykgPT0+IHZvaWQKKyAgTGluZSA2MCkgc2V0VGhpcyhpc1RoaXMpID09PiB2b2lkCisgIExpbmUgNjEpIHNldEV4cHIoZXhwcikgPT0+IHZvaWQKKyAgTGluZSA2Mikgc2V0QXJncyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDY3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzYpIGFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDgwKSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDg0KSB0eXBlQXJncyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgODgpIGlzVGhpcyA9PT4gYm9vbGVhbgorICBMaW5lIDkyKSB0aGlzLmFyZ3MgPSBhcmdzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA5Mykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hcmdzKSA9PT4gdm9pZAorICBMaW5lIDk3KSB0aGlzLmV4cHIgPSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDk4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiB2b2lkCisgIExpbmUgMTAyKSB0aGlzLmlzVGhpcyA9IGlzVGhpcyA9PT4gYm9vbGVhbgorICBMaW5lIDEwNikgdGhpcy50eXBlQXJncyA9IHR5cGVBcmdzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSAxMDcpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3MpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0V4cHJlc3Npb25TdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRXhwcmVzc2lvblN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjU3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0V4cHJlc3Npb25TdG10LnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzOSkgc2V0RXhwcmVzc2lvbihleHByKSA9PT4gdm9pZAorICBMaW5lIDQ0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ0KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDQpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ0KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSBzZXRFeHByZXNzaW9uKGV4cHIpID09PiB2b2lkCisgIExpbmUgNDkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NykgZXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MSkgdGhpcy5leHByID0gZXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Gb3JTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRm9yU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYTdmMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRm9yU3RtdC50eHQKQEAgLTAsMCArMSwzMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0OCkgc2V0Q29tcGFyZShjb21wYXJlKSA9PT4gdm9pZAorICBMaW5lIDQ5KSBzZXRJbml0KGluaXQpID09PiB2b2lkCisgIExpbmUgNTApIHNldFVwZGF0ZSh1cGRhdGUpID09PiB2b2lkCisgIExpbmUgNTEpIHNldEJvZHkoYm9keSkgPT0+IHZvaWQKKyAgTGluZSA1OCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1OCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDU4KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1OCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1OSkgc2V0Q29tcGFyZShjb21wYXJlKSA9PT4gdm9pZAorICBMaW5lIDYwKSBzZXRJbml0KGluaXQpID09PiB2b2lkCisgIExpbmUgNjEpIHNldFVwZGF0ZSh1cGRhdGUpID09PiB2b2lkCisgIExpbmUgNjIpIHNldEJvZHkoYm9keSkgPT0+IHZvaWQKKyAgTGluZSA2Nykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc2KSBib2R5ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgODApIGNvbXBhcmUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODQpIGluaXQgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDg4KSB1cGRhdGUgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDkyKSB0aGlzLmJvZHkgPSBib2R5ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgOTMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSkgPT0+IHZvaWQKKyAgTGluZSA5NykgdGhpcy5jb21wYXJlID0gY29tcGFyZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA5OCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jb21wYXJlKSA9PT4gdm9pZAorICBMaW5lIDEwMikgdGhpcy5pbml0ID0gaW5pdCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTAzKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluaXQpID09PiB2b2lkCisgIExpbmUgMTA3KSB0aGlzLnVwZGF0ZSA9IHVwZGF0ZSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTA4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnVwZGF0ZSkgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRm9yZWFjaFN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Gb3JlYWNoU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNjBmZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRm9yZWFjaFN0bXQudHh0CkBAIC0wLDAgKzEsMjcgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQ1KSBzZXRWYXJpYWJsZSh2YXIpID09PiB2b2lkCisgIExpbmUgNDYpIHNldEl0ZXJhYmxlKGl0ZXJhYmxlKSA9PT4gdm9pZAorICBMaW5lIDQ3KSBzZXRCb2R5KGJvZHkpID09PiB2b2lkCisgIExpbmUgNTQpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTQpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1NCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTQpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTUpIHNldFZhcmlhYmxlKHZhcikgPT0+IHZvaWQKKyAgTGluZSA1Nikgc2V0SXRlcmFibGUoaXRlcmFibGUpID09PiB2b2lkCisgIExpbmUgNTcpIHNldEJvZHkoYm9keSkgPT0+IHZvaWQKKyAgTGluZSA2Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcxKSBib2R5ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgNzUpIGl0ZXJhYmxlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc5KSB2YXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcgorICBMaW5lIDgzKSB0aGlzLmJvZHkgPSBib2R5ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgODQpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSkgPT0+IHZvaWQKKyAgTGluZSA4OCkgdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDg5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLml0ZXJhYmxlKSA9PT4gdm9pZAorICBMaW5lIDkzKSB0aGlzLnZhciA9IHZhciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByCisgIExpbmUgOTQpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFyKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9JZlN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9JZlN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjJiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0lmU3RtdC50eHQKQEAgLTAsMCArMSwyNyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQzKSBzZXRDb25kaXRpb24oY29uZGl0aW9uKSA9PT4gdm9pZAorICBMaW5lIDQ0KSBzZXRUaGVuU3RtdCh0aGVuU3RtdCkgPT0+IHZvaWQKKyAgTGluZSA0NSkgc2V0RWxzZVN0bXQoZWxzZVN0bXQpID09PiB2b2lkCisgIExpbmUgNTApIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTApIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1MCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTApIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTEpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiB2b2lkCisgIExpbmUgNTIpIHNldFRoZW5TdG10KHRoZW5TdG10KSA9PT4gdm9pZAorICBMaW5lIDUzKSBzZXRFbHNlU3RtdChlbHNlU3RtdCkgPT0+IHZvaWQKKyAgTGluZSA1Nykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1KSBjb25kaXRpb24gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjkpIGVsc2VTdG10ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgNzMpIHRoZW5TdG10ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgNzcpIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbmRpdGlvbikgPT0+IHZvaWQKKyAgTGluZSA4MikgdGhpcy5lbHNlU3RtdCA9IGVsc2VTdG10ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgODMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxzZVN0bXQpID09PiB2b2lkCisgIExpbmUgODcpIHRoaXMudGhlblN0bXQgPSB0aGVuU3RtdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDg4KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRoZW5TdG10KSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9MYWJlbGVkU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0xhYmVsZWRTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc2MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9MYWJlbGVkU3RtdC50eHQKQEAgLTAsMCArMSwyMSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDApIHNldExhYmVsKGxhYmVsKSA9PT4gdm9pZAorICBMaW5lIDQxKSBzZXRTdG10KHN0bXQpID09PiB2b2lkCisgIExpbmUgNDYpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDYpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDYpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDcpIHNldExhYmVsKGxhYmVsKSA9PT4gdm9pZAorICBMaW5lIDQ4KSBzZXRTdG10KHN0bXQpID09PiB2b2lkCisgIExpbmUgNTIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MCkgbGFiZWwgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA2NCkgc3RtdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDY4KSB0aGlzLmxhYmVsID0gbGFiZWwgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA3MikgdGhpcy5zdG10ID0gc3RtdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDczKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnN0bXQpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1JldHVyblN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9SZXR1cm5TdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZkM2JlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9SZXR1cm5TdG10LnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDM5KSBzZXRFeHByKGV4cHIpID09PiB2b2lkCisgIExpbmUgNDQpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDQpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDQpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDUpIHNldEV4cHIoZXhwcikgPT0+IHZvaWQKKyAgTGluZSA0OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU3KSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDYxKSB0aGlzLmV4cHIgPSBleHByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDYyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N0YXRlbWVudC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N0YXRlbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0ZGU3MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3RhdGVtZW50LnR4dApAQCAtMCwwICsxLDkgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzUpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgMzUpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSAzNSkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgMzUpIGVuZENvbHVtbiA9PT4gaW50CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N3aXRjaEVudHJ5U3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N3aXRjaEVudHJ5U3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwYjZjYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3dpdGNoRW50cnlTdG10LnR4dApAQCAtMCwwICsxLDIyIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDMpIHNldExhYmVsKGxhYmVsKSA9PT4gdm9pZAorICBMaW5lIDQ0KSBzZXRTdG10cyhzdG10cykgPT0+IHZvaWQKKyAgTGluZSA1MCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA1MCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDUwKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA1MCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA1MSkgc2V0TGFiZWwobGFiZWwpID09PiB2b2lkCisgIExpbmUgNTIpIHNldFN0bXRzKHN0bXRzKSA9PT4gdm9pZAorICBMaW5lIDU3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjYpIGxhYmVsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDcwKSBzdG10cyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSA3NCkgdGhpcy5sYWJlbCA9IGxhYmVsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmxhYmVsKSA9PT4gdm9pZAorICBMaW5lIDc5KSB0aGlzLnN0bXRzID0gc3RtdHMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgODApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc3RtdHMpID09PiB2b2lkCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N3aXRjaFN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Td2l0Y2hTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2Q2Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Td2l0Y2hTdG10LnR4dApAQCAtMCwwICsxLDIyIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQ0KSBzZXRTZWxlY3RvcihzZWxlY3RvcikgPT0+IHZvaWQKKyAgTGluZSA0NSkgc2V0RW50cmllcyhlbnRyaWVzKSA9PT4gdm9pZAorICBMaW5lIDUxKSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDUxKSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTEpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDUxKSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDUyKSBzZXRTZWxlY3RvcihzZWxlY3RvcikgPT0+IHZvaWQKKyAgTGluZSA1Mykgc2V0RW50cmllcyhlbnRyaWVzKSA9PT4gdm9pZAorICBMaW5lIDU4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjcpIGVudHJpZXMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+CisgIExpbmUgNzEpIHNlbGVjdG9yID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc1KSB0aGlzLmVudHJpZXMgPSBlbnRyaWVzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10PgorICBMaW5lIDc2KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVudHJpZXMpID09PiB2b2lkCisgIExpbmUgODApIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zZWxlY3RvcikgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3luY2hyb25pemVkU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N5bmNocm9uaXplZFN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDZkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N5bmNocm9uaXplZFN0bXQudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDEpIHNldEV4cHIoZXhwcikgPT0+IHZvaWQKKyAgTGluZSA0Mikgc2V0QmxvY2soYmxvY2spID09PiB2b2lkCisgIExpbmUgNDgpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDgpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDgpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDkpIHNldEV4cHIoZXhwcikgPT0+IHZvaWQKKyAgTGluZSA1MCkgc2V0QmxvY2soYmxvY2spID09PiB2b2lkCisgIExpbmUgNTUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDYwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NCkgYmxvY2sgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSA2OCkgZXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3MikgdGhpcy5ibG9jayA9IGJsb2NrID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgNzMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYmxvY2spID09PiB2b2lkCisgIExpbmUgNzcpIHRoaXMuZXhwciA9IGV4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcikgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfVGhyb3dTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfVGhyb3dTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Q1N2RjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9UaHJvd1N0bXQudHh0CkBAIC0wLDAgKzEsMTcgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzOSkgc2V0RXhwcihleHByKSA9PT4gdm9pZAorICBMaW5lIDQ0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDQ0KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNDQpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDQ0KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDQ1KSBzZXRFeHByKGV4cHIpID09PiB2b2lkCisgIExpbmUgNDkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NykgZXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MSkgdGhpcy5leHByID0gZXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9UcnlTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfVHJ5U3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2NTJlZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfVHJ5U3RtdC50eHQKQEAgLTAsMCArMSwzMSBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10IF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0OCkgc2V0VHJ5QmxvY2sodHJ5QmxvY2spID09PiB2b2lkCisgIExpbmUgNDkpIHNldENhdGNocyhjYXRjaHMpID09PiB2b2lkCisgIExpbmUgNTApIHNldEZpbmFsbHlCbG9jayhmaW5hbGx5QmxvY2spID09PiB2b2lkCisgIExpbmUgNTYpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTYpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1NikgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTYpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTcpIHNldFJlc291cmNlcyhyZXNvdXJjZXMpID09PiB2b2lkCisgIExpbmUgNTgpIHNldFRyeUJsb2NrKHRyeUJsb2NrKSA9PT4gdm9pZAorICBMaW5lIDU5KSBzZXRDYXRjaHMoY2F0Y2hzKSA9PT4gdm9pZAorICBMaW5lIDYwKSBzZXRGaW5hbGx5QmxvY2soZmluYWxseUJsb2NrKSA9PT4gdm9pZAorICBMaW5lIDY1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzQpIGNhdGNocyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlPgorICBMaW5lIDc4KSBmaW5hbGx5QmxvY2sgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSA4MikgdHJ5QmxvY2sgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSA4NikgcmVzb3VyY2VzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+CisgIExpbmUgOTApIHRoaXMuY2F0Y2hzID0gY2F0Y2hzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U+CisgIExpbmUgOTEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2F0Y2hzKSA9PT4gdm9pZAorICBMaW5lIDk1KSB0aGlzLmZpbmFsbHlCbG9jayA9IGZpbmFsbHlCbG9jayA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDk2KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmZpbmFsbHlCbG9jaykgPT0+IHZvaWQKKyAgTGluZSAxMDApIHRoaXMudHJ5QmxvY2sgPSB0cnlCbG9jayA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDEwMSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50cnlCbG9jaykgPT0+IHZvaWQKKyAgTGluZSAxMDUpIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+CisgIExpbmUgMTA2KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnJlc291cmNlcykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfVHlwZURlY2xhcmF0aW9uU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1R5cGVEZWNsYXJhdGlvblN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDFmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1R5cGVEZWNsYXJhdGlvblN0bXQudHh0CkBAIC0wLDAgKzEsMTcgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdCBdCisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgMzkpIHNldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbCkgPT0+IHZvaWQKKyAgTGluZSA0NCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ0KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NSkgc2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsKSA9PT4gdm9pZAorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTcpIHR5cGVEZWNsID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uCisgIExpbmUgNjEpIHRoaXMudHlwZURlY2wgPSB0eXBlRGVjbCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbgorICBMaW5lIDYyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVEZWNsKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9XaGlsZVN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9XaGlsZVN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDQwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1doaWxlU3RtdC50eHQKQEAgLTAsMCArMSwyMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIHN1cGVyY2xhc3M6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogamF2YS5sYW5nLkNsb25lYWJsZQorICBMaW5lIDQxKSBzZXRDb25kaXRpb24oY29uZGl0aW9uKSA9PT4gdm9pZAorICBMaW5lIDQyKSBzZXRCb2R5KGJvZHkpID09PiB2b2lkCisgIExpbmUgNDcpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNDcpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA0NykgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNDcpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNDgpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiB2b2lkCisgIExpbmUgNDkpIHNldEJvZHkoYm9keSkgPT0+IHZvaWQKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYxKSBib2R5ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgNjUpIGNvbmRpdGlvbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2OSkgdGhpcy5ib2R5ID0gYm9keSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDcwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJvZHkpID09PiB2b2lkCisgIExpbmUgNzQpIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDc1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbmRpdGlvbikgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfQ2xhc3NPckludGVyZmFjZVR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9DbGFzc09ySW50ZXJmYWNlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMmU2NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfQ2xhc3NPckludGVyZmFjZVR5cGUudHh0CkBAIC0wLDAgKzEsMzAgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0NCkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDQ4KSBzZXRTY29wZShzY29wZSkgPT0+IHZvaWQKKyAgTGluZSA0OSkgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDU0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDU0KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNTQpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDU0KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDU1KSBzZXRTY29wZShzY29wZSkgPT0+IHZvaWQKKyAgTGluZSA1Nikgc2V0TmFtZShuYW1lKSA9PT4gdm9pZAorICBMaW5lIDU3KSBzZXRUeXBlQXJncyh0eXBlQXJncykgPT0+IHZvaWQKKyAgTGluZSA2Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcxKSBuYW1lID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgNzUpIHNjb3BlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSA3OSkgdHlwZUFyZ3MgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDgzKSBQcmltaXRpdmVUeXBlLnVuYm94TWFwLmNvbnRhaW5zS2V5KG5hbWUpID09PiBib29sZWFuCisgIExpbmUgODcpICFpc0JveGVkVHlwZSgpID09PiBib29sZWFuCisgIExpbmUgODcpIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihuYW1lICsgIiBpc24ndCBhIGJveGVkIHR5cGUuIikgPT0+IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICBMaW5lIDg4KSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnVuYm94TWFwLmdldChuYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlCisgIExpbmUgOTIpIHRoaXMubmFtZSA9IG5hbWUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA5NikgdGhpcy5zY29wZSA9IHNjb3BlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSA5Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSkgPT0+IHZvaWQKKyAgTGluZSAxMDEpIHRoaXMudHlwZUFyZ3MgPSB0eXBlQXJncyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgMTAyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVBcmdzKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9QcmltaXRpdmVUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUHJpbWl0aXZlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4OWE5OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUHJpbWl0aXZlVHlwZS50eHQKQEAgLTAsMCArMSwyMyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDcpIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShuYW1lT2ZCb3hlZFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSA1MSkgdGhpcy5uYW1lT2ZCb3hlZFR5cGUgPSBuYW1lT2ZCb3hlZFR5cGUgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSA1NSkgbmV3IEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmU+KCkgPT0+IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZT4KKyAgTGluZSA1NykgUHJpbWl0aXZlIHVuYm94ZWRUeXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUKKyAgTGluZSA1NykgUHJpbWl0aXZlLnZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmVbXQorICBMaW5lIDU4KSB1bmJveE1hcC5wdXQodW5ib3hlZFR5cGUubmFtZU9mQm94ZWRUeXBlLCB1bmJveGVkVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZQorICBMaW5lIDY4KSB0aGlzLnR5cGUgPSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUKKyAgTGluZSA3MykgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA3MykgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDczKSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA3MykgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA3NCkgdGhpcy50eXBlID0gdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlCisgIExpbmUgNzgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4NikgdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlCisgIExpbmUgOTApIHR5cGUudG9Cb3hlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgOTQpIHRoaXMudHlwZSA9IHR5cGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9SZWZlcmVuY2VUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUmVmZXJlbmNlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiOTE5NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUmVmZXJlbmNlVHlwZS50eHQKQEAgLTAsMCArMSwzMiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDUpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA0OSkgc2V0VHlwZSh0eXBlKSA9PT4gdm9pZAorICBMaW5lIDUwKSBzZXRBcnJheUNvdW50KGFycmF5Q291bnQpID09PiB2b2lkCisgIExpbmUgNTUpIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTUpIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1NSkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTUpIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTYpIHNldFR5cGUodHlwZSkgPT0+IHZvaWQKKyAgTGluZSA1Nykgc2V0QXJyYXlDb3VudChhcnJheUNvdW50KSA9PT4gdm9pZAorICBMaW5lIDY0KSBiZWdpbkxpbmUgPT0+IGludAorICBMaW5lIDY0KSBiZWdpbkNvbHVtbiA9PT4gaW50CisgIExpbmUgNjQpIGVuZExpbmUgPT0+IGludAorICBMaW5lIDY0KSBlbmRDb2x1bW4gPT0+IGludAorICBMaW5lIDY0KSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDY1KSBzZXRUeXBlKHR5cGUpID09PiB2b2lkCisgIExpbmUgNjYpIHNldEFycmF5Q291bnQoYXJyYXlDb3VudCkgPT0+IHZvaWQKKyAgTGluZSA2NykgdGhpcy5hcnJheXNBbm5vdGF0aW9ucyA9IGFycmF5c0Fubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDcxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzkpIGFycmF5Q291bnQgPT0+IGludAorICBMaW5lIDgzKSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDg3KSB0aGlzLmFycmF5Q291bnQgPSBhcnJheUNvdW50ID09PiBpbnQKKyAgTGluZSA5MSkgdGhpcy50eXBlID0gdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA5Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gdm9pZAorICBMaW5lIDExNikgYXJyYXlzQW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgMTIzKSB0aGlzLmFycmF5c0Fubm90YXRpb25zID0gYXJyYXlzQW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1R5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9UeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcwMDhjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9UeXBlLnR4dApAQCAtMCwwICsxLDE3IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0MCkgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb24gPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0NCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0NCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ0KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0NCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OCkgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSA0OCkgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDQ4KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSA0OCkgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0OSkgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNTMpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNTcpIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Vbmtub3duVHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1Vua25vd25UeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGYxMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Vbmtub3duVHlwZS50eHQKQEAgLTAsMCArMSw4IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVua25vd25UeXBlIF0KKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgc3VwZXJjbGFzczogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBqYXZhLmxhbmcuQ2xvbmVhYmxlCisgIExpbmUgNDEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDQ2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfVm9pZFR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Wb2lkVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5ZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfVm9pZFR5cGUudHh0CkBAIC0wLDAgKzEsMTIgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGUgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSAzNikgYmVnaW5MaW5lID09PiBpbnQKKyAgTGluZSAzNikgYmVnaW5Db2x1bW4gPT0+IGludAorICBMaW5lIDM2KSBlbmRMaW5lID09PiBpbnQKKyAgTGluZSAzNikgZW5kQ29sdW1uID09PiBpbnQKKyAgTGluZSA0MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9XaWxkY2FyZFR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9XaWxkY2FyZFR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjM2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1dpbGRjYXJkVHlwZS50eHQKQEAgLTAsMCArMSwyMyBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUgXQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBzdXBlcmNsYXNzOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGphdmEubGFuZy5DbG9uZWFibGUKKyAgTGluZSA0MCkgc2V0RXh0ZW5kcyhleHQpID09PiB2b2lkCisgIExpbmUgNDQpIHNldEV4dGVuZHMoZXh0KSA9PT4gdm9pZAorICBMaW5lIDQ1KSBzZXRTdXBlcihzdXApID09PiB2b2lkCisgIExpbmUgNTApIGJlZ2luTGluZSA9PT4gaW50CisgIExpbmUgNTApIGJlZ2luQ29sdW1uID09PiBpbnQKKyAgTGluZSA1MCkgZW5kTGluZSA9PT4gaW50CisgIExpbmUgNTApIGVuZENvbHVtbiA9PT4gaW50CisgIExpbmUgNTEpIHNldEV4dGVuZHMoZXh0KSA9PT4gdm9pZAorICBMaW5lIDUyKSBzZXRTdXBlcihzdXApID09PiB2b2lkCisgIExpbmUgNTYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDYwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NCkgZXh0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZQorICBMaW5lIDY4KSBzdXAgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNzIpIHRoaXMuZXh0ID0gZXh0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZQorICBMaW5lIDczKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4dCkgPT0+IHZvaWQKKyAgTGluZSA3NykgdGhpcy5zdXAgPSBzdXAgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNzgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc3VwKSA9PT4gdm9pZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9DbG9uZVZpc2l0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9DbG9uZVZpc2l0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0Nsb25lVmlzaXRvci50eHQKQEAgLTAsMCArMSw4MTkgQEAKKworWyBDbGFzcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yIF0KKyAgc3VwZXJjbGFzczogamF2YS5sYW5nLk9iamVjdAorICBpbnRlcmZhY2U6IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcgorICBMaW5lIDYyKSBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZV8gPSBjbG9uZU5vZGVzKF9uLmdldFBhY2thZ2UoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uCisgIExpbmUgNjIpIGNsb25lTm9kZXMoX24uZ2V0UGFja2FnZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24KKyAgTGluZSA2MykgTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IHZpc2l0KF9uLmdldEltcG9ydHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24+CisgIExpbmUgNjMpIHZpc2l0KF9uLmdldEltcG9ydHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24+CisgIExpbmUgNjQpIExpc3Q8VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IHZpc2l0KF9uLmdldFR5cGVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPgorICBMaW5lIDY0KSB2aXNpdChfbi5nZXRUeXBlcygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbj4KKyAgTGluZSA2NikgbmV3IENvbXBpbGF0aW9uVW5pdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgcGFja2FnZV8sIGltcG9ydHMsIHR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQKKyAgTGluZSA3NCkgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc0KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc1KSBOYW1lRXhwciBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA3NSkgY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA3NikgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA3NikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA3OCkgUGFja2FnZURlY2xhcmF0aW9uIHIgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBhbm5vdGF0aW9ucywgbmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uCisgIExpbmUgNzgpIG5ldyBQYWNrYWdlRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGFubm90YXRpb25zLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24KKyAgTGluZSA4Mikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgODMpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uCisgIExpbmUgODgpIE5hbWVFeHByIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDg4KSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDg5KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDg5KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDkxKSBJbXBvcnREZWNsYXJhdGlvbiByID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBuYW1lLCBfbi5pc1N0YXRpYygpLCBfbi5pc0FzdGVyaXNrKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uCisgIExpbmUgOTEpIG5ldyBJbXBvcnREZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbmFtZSwgX24uaXNTdGF0aWMoKSwgX24uaXNBc3RlcmlzaygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDk1KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA5NikgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDEwMSkgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdHlwZUJvdW5kID0gdmlzaXQoX24uZ2V0VHlwZUJvdW5kKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMTAxKSB2aXNpdChfbi5nZXRUeXBlQm91bmQoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAxMDMpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxMDMpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTA0KSBUeXBlUGFyYW1ldGVyIHIgPSBuZXcgVHlwZVBhcmFtZXRlcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TmFtZSgpLCB0eXBlQm91bmQsIGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMTA0KSBuZXcgVHlwZVBhcmFtZXRlcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TmFtZSgpLCB0eXBlQm91bmQsIGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMTA4KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDEwOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDkpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDExMCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMTE1KSBuZXcgTGluZUNvbW1lbnQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldENvbnRlbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQKKyAgTGluZSAxMjApIG5ldyBCbG9ja0NvbW1lbnQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldENvbnRlbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50CisgIExpbmUgMTI1KSBKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMTI1KSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAxMjYpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxMjYpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTI3KSBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAxMjcpIHZpc2l0KF9uLmdldFR5cGVQYXJhbWV0ZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMTI4KSBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRlbmRzTGlzdCA9IHZpc2l0KF9uLmdldEV4dGVuZHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAxMjgpIHZpc2l0KF9uLmdldEV4dGVuZHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAxMjkpIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0ID0gdmlzaXQoX24uZ2V0SW1wbGVtZW50cygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDEyOSkgdmlzaXQoX24uZ2V0SW1wbGVtZW50cygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDEzMCkgTGlzdDxCb2R5RGVjbGFyYXRpb24+IG1lbWJlcnMgPSB2aXNpdChfbi5nZXRNZW1iZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDEzMCkgdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSAxMzEpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTMxKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDEzMykgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHIgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIF9uLmlzSW50ZXJmYWNlKCksIF9uLmdldE5hbWUoKSwgdHlwZVBhcmFtZXRlcnMsIGV4dGVuZHNMaXN0LCBpbXBsZW1lbnRzTGlzdCwgbWVtYmVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24KKyAgTGluZSAxMzMpIG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgX24uaXNJbnRlcmZhY2UoKSwgX24uZ2V0TmFtZSgpLCB0eXBlUGFyYW1ldGVycywgZXh0ZW5kc0xpc3QsIGltcGxlbWVudHNMaXN0LCBtZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorICBMaW5lIDEzNykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMTM4KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCisgIExpbmUgMTQzKSBKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMTQzKSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAxNDQpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxNDQpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTQ1KSBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdCA9IHZpc2l0KF9uLmdldEltcGxlbWVudHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAxNDUpIHZpc2l0KF9uLmdldEltcGxlbWVudHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAxNDYpIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXMgPSB2aXNpdChfbi5nZXRFbnRyaWVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24+CisgIExpbmUgMTQ2KSB2aXNpdChfbi5nZXRFbnRyaWVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24+CisgIExpbmUgMTQ3KSBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycyA9IHZpc2l0KF9uLmdldE1lbWJlcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMTQ3KSB2aXNpdChfbi5nZXRNZW1iZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDE0OCkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxNDgpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTUwKSBFbnVtRGVjbGFyYXRpb24gciA9IG5ldyBFbnVtRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgX24uZ2V0TmFtZSgpLCBpbXBsZW1lbnRzTGlzdCwgZW50cmllcywgbWVtYmVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24KKyAgTGluZSAxNTApIG5ldyBFbnVtRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgX24uZ2V0TmFtZSgpLCBpbXBsZW1lbnRzTGlzdCwgZW50cmllcywgbWVtYmVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24KKyAgTGluZSAxNTQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDE1NSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbgorICBMaW5lIDE2MCkgSmF2YWRvY0NvbW1lbnQgamF2YURvYyA9IGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDE2MCkgY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMTYxKSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDE2MSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxNjMpIEVtcHR5VHlwZURlY2xhcmF0aW9uIHIgPSBuZXcgRW1wdHlUeXBlRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb24KKyAgTGluZSAxNjMpIG5ldyBFbXB0eVR5cGVEZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbgorICBMaW5lIDE2Nikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMTY3KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb24KKyAgTGluZSAxNzIpIEphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAxNzIpIGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDE3MykgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDE3MykgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxNzQpIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDE3NCkgdmlzaXQoX24uZ2V0QXJncygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTc1KSBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gY2xhc3NCb2R5ID0gdmlzaXQoX24uZ2V0Q2xhc3NCb2R5KCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDE3NSkgdmlzaXQoX24uZ2V0Q2xhc3NCb2R5KCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDE3NikgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxNzYpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTc4KSBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiByID0gbmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBhbm5vdGF0aW9ucywgX24uZ2V0TmFtZSgpLCBhcmdzLCBjbGFzc0JvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24KKyAgTGluZSAxNzgpIG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgYW5ub3RhdGlvbnMsIF9uLmdldE5hbWUoKSwgYXJncywgY2xhc3NCb2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uCisgIExpbmUgMTgyKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxODMpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbgorICBMaW5lIDE4OCkgSmF2YWRvY0NvbW1lbnQgamF2YURvYyA9IGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDE4OCkgY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMTg5KSBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTg5KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDE5MCkgTGlzdDxCb2R5RGVjbGFyYXRpb24+IG1lbWJlcnMgPSB2aXNpdChfbi5nZXRNZW1iZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDE5MCkgdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSAxOTEpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTkxKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDE5MykgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIHIgPSBuZXcgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIF9uLmdldE5hbWUoKSwgbWVtYmVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb24KKyAgTGluZSAxOTMpIG5ldyBBbm5vdGF0aW9uRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgX24uZ2V0TmFtZSgpLCBtZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbgorICBMaW5lIDE5Nykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMTk4KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uCisgIExpbmUgMjAzKSBKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMjAzKSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAyMDQpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAyMDQpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMjA1KSBUeXBlIHR5cGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDIwNSkgY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDIwNikgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUgPSBjbG9uZU5vZGVzKF9uLmdldERlZmF1bHRWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAyMDYpIGNsb25lTm9kZXMoX24uZ2V0RGVmYXVsdFZhbHVlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDIwNykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAyMDcpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMjA5KSBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gciA9IG5ldyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZV8sIF9uLmdldE5hbWUoKSwgZGVmYXVsdFZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbgorICBMaW5lIDIwOSkgbmV3IEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCB0eXBlXywgX24uZ2V0TmFtZSgpLCBkZWZhdWx0VmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uCisgIExpbmUgMjEzKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAyMTQpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24KKyAgTGluZSAyMTkpIEphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAyMTkpIGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDIyMCkgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDIyMCkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAyMjEpIFR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMjIxKSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMjIyKSBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzID0gdmlzaXQoX24uZ2V0VmFyaWFibGVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDIyMikgdmlzaXQoX24uZ2V0VmFyaWFibGVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDIyMykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAyMjMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMjI1KSBGaWVsZERlY2xhcmF0aW9uIHIgPSBuZXcgRmllbGREZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCB0eXBlXywgdmFyaWFibGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24KKyAgTGluZSAyMjUpIG5ldyBGaWVsZERlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCB2YXJpYWJsZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbgorICBMaW5lIDIyOSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMjMwKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbgorICBMaW5lIDIzNSkgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBjbG9uZU5vZGVzKF9uLmdldElkKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAyMzUpIGNsb25lTm9kZXMoX24uZ2V0SWQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDIzNikgRXhwcmVzc2lvbiBpbml0ID0gY2xvbmVOb2Rlcyhfbi5nZXRJbml0KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDIzNikgY2xvbmVOb2Rlcyhfbi5nZXRJbml0KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDIzNykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAyMzcpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMjM5KSBWYXJpYWJsZURlY2xhcmF0b3IgciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGlkLCBpbml0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcgorICBMaW5lIDIzOSkgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgaWQsIGluaXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgMjQzKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAyNDQpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IKKyAgTGluZSAyNDkpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMjQ5KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDI1MSkgVmFyaWFibGVEZWNsYXJhdG9ySWQgciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TmFtZSgpLCBfbi5nZXRBcnJheUNvdW50KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAyNTEpIG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TmFtZSgpLCBfbi5nZXRBcnJheUNvdW50KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAyNTUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDI1NikgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkCisgIExpbmUgMjYxKSBKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMjYxKSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAyNjIpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAyNjIpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMjYzKSBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAyNjMpIHZpc2l0KF9uLmdldFR5cGVQYXJhbWV0ZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMjY0KSBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMjY0KSB2aXNpdChfbi5nZXRQYXJhbWV0ZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDI2NSkgTGlzdDxOYW1lRXhwcj4gdGhyb3dzXyA9IHZpc2l0KF9uLmdldFRocm93cygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByPgorICBMaW5lIDI2NSkgdmlzaXQoX24uZ2V0VGhyb3dzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMjY2KSBCbG9ja1N0bXQgYmxvY2sgPSBjbG9uZU5vZGVzKF9uLmdldEJsb2NrKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMjY2KSBjbG9uZU5vZGVzKF9uLmdldEJsb2NrKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMjY3KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDI2NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAyNjkpIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gciA9IG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLCBfbi5nZXROYW1lKCksIHBhcmFtZXRlcnMsIHRocm93c18sIGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24KKyAgTGluZSAyNjkpIG5ldyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLCBfbi5nZXROYW1lKCksIHBhcmFtZXRlcnMsIHRocm93c18sIGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24KKyAgTGluZSAyNzMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDI3NCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24KKyAgTGluZSAyNzkpIEphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAyNzkpIGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDI4MCkgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDI4MCkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAyODEpIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMgPSB2aXNpdChfbi5nZXRUeXBlUGFyYW1ldGVycygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDI4MSkgdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAyODIpIFR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMjgyKSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMjgzKSBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMjgzKSB2aXNpdChfbi5nZXRQYXJhbWV0ZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDI4NCkgTGlzdDxOYW1lRXhwcj4gdGhyb3dzXyA9IHZpc2l0KF9uLmdldFRocm93cygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByPgorICBMaW5lIDI4NCkgdmlzaXQoX24uZ2V0VGhyb3dzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMjg1KSBCbG9ja1N0bXQgYmxvY2sgPSBjbG9uZU5vZGVzKF9uLmdldEJvZHkoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAyODUpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDI4NikgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAyODYpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMjg4KSBNZXRob2REZWNsYXJhdGlvbiByID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlXywgX24uZ2V0TmFtZSgpLCBwYXJhbWV0ZXJzLCBfbi5nZXRBcnJheUNvdW50KCksIHRocm93c18sIGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uCisgIExpbmUgMjg4KSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIHR5cGVfLCBfbi5nZXROYW1lKCksIHBhcmFtZXRlcnMsIF9uLmdldEFycmF5Q291bnQoKSwgdGhyb3dzXywgYmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24KKyAgTGluZSAyOTIpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDI5MykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uCisgIExpbmUgMjk4KSBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMjk4KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDI5OSkgVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAyOTkpIGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAzMDApIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gY2xvbmVOb2Rlcyhfbi5nZXRJZCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkCisgIExpbmUgMzAwKSBjbG9uZU5vZGVzKF9uLmdldElkKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAzMDEpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMzAxKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDMwMykgUGFyYW1ldGVyIHIgPSBuZXcgUGFyYW1ldGVyKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCBfbi5pc1ZhckFyZ3MoKSwgaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMzAzKSBuZXcgUGFyYW1ldGVyKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCBfbi5pc1ZhckFyZ3MoKSwgaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMzA3KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAzMDgpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSAzMTMpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAzMTMpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMzE0KSBMaXN0PFR5cGU+IHR5cGVzID0gdmlzaXQoX24uZ2V0VHlwZXMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDMxNCkgdmlzaXQoX24uZ2V0VHlwZXMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDMxNSkgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBjbG9uZU5vZGVzKF9uLmdldElkKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSAzMTUpIGNsb25lTm9kZXMoX24uZ2V0SWQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDMxNikgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAzMTYpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMzE4KSBNdWx0aVR5cGVQYXJhbWV0ZXIgciA9IG5ldyBNdWx0aVR5cGVQYXJhbWV0ZXIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZXMsIGlkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcgorICBMaW5lIDMxOCkgbmV3IE11bHRpVHlwZVBhcmFtZXRlcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCB0eXBlcywgaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyCisgIExpbmUgMzIyKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAzMjMpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NdWx0aVR5cGVQYXJhbWV0ZXIKKyAgTGluZSAzMjgpIEphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAzMjgpIGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDMyOSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAzMjkpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMzMxKSBFbXB0eU1lbWJlckRlY2xhcmF0aW9uIHIgPSBuZXcgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uCisgIExpbmUgMzMxKSBuZXcgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uCisgIExpbmUgMzM0KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAzMzUpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uCisgIExpbmUgMzQwKSBKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMzQwKSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAzNDEpIEJsb2NrU3RtdCBibG9jayA9IGNsb25lTm9kZXMoX24uZ2V0QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAzNDEpIGNsb25lTm9kZXMoX24uZ2V0QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAzNDIpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMzQyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDM0NCkgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiByID0gbmV3IEluaXRpYWxpemVyRGVjbGFyYXRpb24oX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmlzU3RhdGljKCksIGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24KKyAgTGluZSAzNDQpIG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5pc1N0YXRpYygpLCBibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uCisgIExpbmUgMzQ4KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAzNDkpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uCisgIExpbmUgMzU0KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDM1NCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAzNTUpIEphdmFkb2NDb21tZW50IHIgPSBuZXcgSmF2YWRvY0NvbW1lbnQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldENvbnRlbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSAzNTUpIG5ldyBKYXZhZG9jQ29tbWVudChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0Q29udGVudCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudAorICBMaW5lIDM1OSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMzYwKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgMzY1KSBDbGFzc09ySW50ZXJmYWNlVHlwZSBzY29wZSA9IGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDM2NSkgY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMzY2KSBMaXN0PFR5cGU+IHR5cGVBcmdzID0gdmlzaXQoX24uZ2V0VHlwZUFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDM2NikgdmlzaXQoX24uZ2V0VHlwZUFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDM2NykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAzNjcpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMzY5KSBDbGFzc09ySW50ZXJmYWNlVHlwZSByID0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBzY29wZSwgX24uZ2V0TmFtZSgpLCB0eXBlQXJncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDM2OSkgbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBzY29wZSwgX24uZ2V0TmFtZSgpLCB0eXBlQXJncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDM3Mykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMzc0KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSAzNzkpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMzc5KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDM4MSkgUHJpbWl0aXZlVHlwZSByID0gbmV3IFByaW1pdGl2ZVR5cGUoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlCisgIExpbmUgMzgxKSBuZXcgUHJpbWl0aXZlVHlwZShfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUKKyAgTGluZSAzODUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDM4NikgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUKKyAgTGluZSAzOTEpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubiA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMzkxKSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDM5MikgVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAzOTIpIGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAzOTMpIExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IGFycmF5c0Fubm90YXRpb25zID0gX24uZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSAzOTMpIF9uLmdldEFycmF5c0Fubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgMzk0KSBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBfYXJyYXlzQW5ub3RhdGlvbnMgPSBudWxsID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDM5NCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDM5NSkgYXJyYXlzQW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM5NikgX2FycmF5c0Fubm90YXRpb25zID0gbmV3IExpbmtlZExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+KCkgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgMzk3KSBMaXN0PEFubm90YXRpb25FeHByPiBhdXggPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAzOTcpIGFycmF5c0Fubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDM5OCkgX2FycmF5c0Fubm90YXRpb25zLmFkZCh2aXNpdChhdXgsIF9hcmcpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQwMikgUmVmZXJlbmNlVHlwZSByID0gbmV3IFJlZmVyZW5jZVR5cGUoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHR5cGVfLCBfbi5nZXRBcnJheUNvdW50KCksIGFubiwgX2FycmF5c0Fubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUKKyAgTGluZSA0MDIpIG5ldyBSZWZlcmVuY2VUeXBlKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlXywgX24uZ2V0QXJyYXlDb3VudCgpLCBhbm4sIF9hcnJheXNBbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNDA1KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQwNSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0MDYpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDQwNykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUKKyAgTGluZSA0MTIpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNDEyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQxNCkgVm9pZFR5cGUgciA9IG5ldyBWb2lkVHlwZShfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZQorICBMaW5lIDQxNCkgbmV3IFZvaWRUeXBlKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlZvaWRUeXBlCisgIExpbmUgNDE1KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA0MTYpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZQorICBMaW5lIDQyMSkgUmVmZXJlbmNlVHlwZSBleHQgPSBjbG9uZU5vZGVzKF9uLmdldEV4dGVuZHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNDIxKSBjbG9uZU5vZGVzKF9uLmdldEV4dGVuZHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNDIyKSBSZWZlcmVuY2VUeXBlIHN1cCA9IGNsb25lTm9kZXMoX24uZ2V0U3VwZXIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNDIyKSBjbG9uZU5vZGVzKF9uLmdldFN1cGVyKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZQorICBMaW5lIDQyMykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0MjMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNDI1KSBXaWxkY2FyZFR5cGUgciA9IG5ldyBXaWxkY2FyZFR5cGUoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGV4dCwgc3VwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZQorICBMaW5lIDQyNSkgbmV3IFdpbGRjYXJkVHlwZShfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgZXh0LCBzdXApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlCisgIExpbmUgNDI5KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA0MzApIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUKKyAgTGluZSA0MzUpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNDM1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQzNykgVW5rbm93blR5cGUgciA9IG5ldyBVbmtub3duVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5rbm93blR5cGUKKyAgTGluZSA0MzcpIG5ldyBVbmtub3duVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5rbm93blR5cGUKKyAgTGluZSA0MzgpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDQzOSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVua25vd25UeXBlCisgIExpbmUgNDQ0KSBFeHByZXNzaW9uIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDQ0KSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDQ1KSBFeHByZXNzaW9uIGluZGV4ID0gY2xvbmVOb2Rlcyhfbi5nZXRJbmRleCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA0NDUpIGNsb25lTm9kZXMoX24uZ2V0SW5kZXgoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDQ2KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQ0NikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0NDgpIEFycmF5QWNjZXNzRXhwciByID0gbmV3IEFycmF5QWNjZXNzRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbmFtZSwgaW5kZXgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByCisgIExpbmUgNDQ4KSBuZXcgQXJyYXlBY2Nlc3NFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBuYW1lLCBpbmRleCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIKKyAgTGluZSA0NTIpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDQ1MykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwcgorICBMaW5lIDQ1OCkgVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA0NTgpIGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA0NTkpIExpc3Q8RXhwcmVzc2lvbj4gZGltZW5zaW9ucyA9IHZpc2l0KF9uLmdldERpbWVuc2lvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDQ1OSkgdmlzaXQoX24uZ2V0RGltZW5zaW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNDYwKSBBcnJheUNyZWF0aW9uRXhwciByID0gbmV3IEFycmF5Q3JlYXRpb25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlXywgZGltZW5zaW9ucywgX24uZ2V0QXJyYXlDb3VudCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByCisgIExpbmUgNDYwKSBuZXcgQXJyYXlDcmVhdGlvbkV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHR5cGVfLCBkaW1lbnNpb25zLCBfbi5nZXRBcnJheUNvdW50KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIKKyAgTGluZSA0NjMpIF9uLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQ2NSkgci5zZXRJbml0aWFsaXplcihjbG9uZU5vZGVzKF9uLmdldEluaXRpYWxpemVyKCksIF9hcmcpKSA9PT4gdm9pZAorICBMaW5lIDQ2NykgTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gYXJyYXlzQW5ub3RhdGlvbnMgPSBfbi5nZXRBcnJheXNBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDQ2NykgX24uZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSA0NjgpIExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IF9hcnJheXNBbm5vdGF0aW9ucyA9IG51bGwgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgNDY4KSBudWxsID09PiBudWxsCisgIExpbmUgNDY5KSBhcnJheXNBbm5vdGF0aW9ucyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDcwKSBfYXJyYXlzQW5ub3RhdGlvbnMgPSBuZXcgTGlua2VkTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4oKSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSA0NzEpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGF1eCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQ3MSkgYXJyYXlzQW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgNDcyKSBfYXJyYXlzQW5ub3RhdGlvbnMuYWRkKHZpc2l0KGF1eCwgX2FyZykpID09PiBib29sZWFuCisgIExpbmUgNDc1KSByLnNldEFycmF5c0Fubm90YXRpb25zKF9hcnJheXNBbm5vdGF0aW9ucykgPT0+IHZvaWQKKyAgTGluZSA0NzYpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNDc2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQ3Nykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNDc4KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIKKyAgTGluZSA0ODMpIExpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzID0gdmlzaXQoX24uZ2V0VmFsdWVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA0ODMpIHZpc2l0KF9uLmdldFZhbHVlcygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNDg0KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQ4NCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA0ODYpIEFycmF5SW5pdGlhbGl6ZXJFeHByIHIgPSBuZXcgQXJyYXlJbml0aWFsaXplckV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHZhbHVlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwcgorICBMaW5lIDQ4NikgbmV3IEFycmF5SW5pdGlhbGl6ZXJFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB2YWx1ZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIKKyAgTGluZSA0OTApIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDQ5MSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByCisgIExpbmUgNDk2KSBFeHByZXNzaW9uIHRhcmdldCA9IGNsb25lTm9kZXMoX24uZ2V0VGFyZ2V0KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDQ5NikgY2xvbmVOb2Rlcyhfbi5nZXRUYXJnZXQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDk3KSBFeHByZXNzaW9uIHZhbHVlID0gY2xvbmVOb2Rlcyhfbi5nZXRWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA0OTcpIGNsb25lTm9kZXMoX24uZ2V0VmFsdWUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDk4KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDQ5OCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA1MDApIEFzc2lnbkV4cHIgciA9IG5ldyBBc3NpZ25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0YXJnZXQsIHZhbHVlLCBfbi5nZXRPcGVyYXRvcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIKKyAgTGluZSA1MDApIG5ldyBBc3NpZ25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0YXJnZXQsIHZhbHVlLCBfbi5nZXRPcGVyYXRvcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIKKyAgTGluZSA1MDMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDUwNCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIKKyAgTGluZSA1MDkpIEV4cHJlc3Npb24gbGVmdCA9IGNsb25lTm9kZXMoX24uZ2V0TGVmdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1MDkpIGNsb25lTm9kZXMoX24uZ2V0TGVmdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1MTApIEV4cHJlc3Npb24gcmlnaHQgPSBjbG9uZU5vZGVzKF9uLmdldFJpZ2h0KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDUxMCkgY2xvbmVOb2Rlcyhfbi5nZXRSaWdodCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1MTEpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNTExKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDUxMykgQmluYXJ5RXhwciByID0gbmV3IEJpbmFyeUV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGxlZnQsIHJpZ2h0LCBfbi5nZXRPcGVyYXRvcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIKKyAgTGluZSA1MTMpIG5ldyBCaW5hcnlFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBsZWZ0LCByaWdodCwgX24uZ2V0T3BlcmF0b3IoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByCisgIExpbmUgNTE3KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA1MTgpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByCisgIExpbmUgNTIzKSBUeXBlIHR5cGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDUyMykgY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDUyNCkgRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDUyNCkgY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDUyNSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA1MjUpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNTI3KSBDYXN0RXhwciByID0gbmV3IENhc3RFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlXywgZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcgorICBMaW5lIDUyNykgbmV3IENhc3RFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlXywgZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcgorICBMaW5lIDUzMSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNTMyKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIKKyAgTGluZSA1MzcpIFR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNTM3KSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNTM4KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDUzOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA1NDApIENsYXNzRXhwciByID0gbmV3IENsYXNzRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgdHlwZV8pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByCisgIExpbmUgNTQwKSBuZXcgQ2xhc3NFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlXykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIKKyAgTGluZSA1NDQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDU0NSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwcgorICBMaW5lIDU1MCkgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBjbG9uZU5vZGVzKF9uLmdldENvbmRpdGlvbigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1NTApIGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDU1MSkgRXhwcmVzc2lvbiB0aGVuRXhwciA9IGNsb25lTm9kZXMoX24uZ2V0VGhlbkV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNTUxKSBjbG9uZU5vZGVzKF9uLmdldFRoZW5FeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDU1MikgRXhwcmVzc2lvbiBlbHNlRXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RWxzZUV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNTUyKSBjbG9uZU5vZGVzKF9uLmdldEVsc2VFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDU1MykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA1NTMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNTU1KSBDb25kaXRpb25hbEV4cHIgciA9IG5ldyBDb25kaXRpb25hbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGNvbmRpdGlvbiwgdGhlbkV4cHIsIGVsc2VFeHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwcgorICBMaW5lIDU1NSkgbmV3IENvbmRpdGlvbmFsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgY29uZGl0aW9uLCB0aGVuRXhwciwgZWxzZUV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByCisgIExpbmUgNTU5KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA1NjApIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIKKyAgTGluZSA1NjUpIEV4cHJlc3Npb24gaW5uZXIgPSBjbG9uZU5vZGVzKF9uLmdldElubmVyKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDU2NSkgY2xvbmVOb2Rlcyhfbi5nZXRJbm5lcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1NjYpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNTY2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDU2OCkgRW5jbG9zZWRFeHByIHIgPSBuZXcgRW5jbG9zZWRFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBpbm5lcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FbmNsb3NlZEV4cHIKKyAgTGluZSA1NjgpIG5ldyBFbmNsb3NlZEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGlubmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwcgorICBMaW5lIDU3Mikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNTczKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByCisgIExpbmUgNTc4KSBFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1NzgpIGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNTc5KSBMaXN0PFR5cGU+IHR5cGVBcmdzID0gdmlzaXQoX24uZ2V0VHlwZUFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDU3OSkgdmlzaXQoX24uZ2V0VHlwZUFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDU4MCkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA1ODApIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNTgyKSBGaWVsZEFjY2Vzc0V4cHIgciA9IG5ldyBGaWVsZEFjY2Vzc0V4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHNjb3BlLCB0eXBlQXJncywgX24uZ2V0RmllbGQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIKKyAgTGluZSA1ODIpIG5ldyBGaWVsZEFjY2Vzc0V4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHNjb3BlLCB0eXBlQXJncywgX24uZ2V0RmllbGQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIKKyAgTGluZSA1ODYpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDU4NykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwcgorICBMaW5lIDU5MikgRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDU5MikgY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDU5MykgVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA1OTMpIGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA1OTQpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNTk0KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDU5NikgSW5zdGFuY2VPZkV4cHIgciA9IG5ldyBJbnN0YW5jZU9mRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgZXhwciwgdHlwZV8pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIKKyAgTGluZSA1OTYpIG5ldyBJbnN0YW5jZU9mRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgZXhwciwgdHlwZV8pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIKKyAgTGluZSA2MDApIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDYwMSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByCisgIExpbmUgNjA2KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDYwNikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA2MDcpIFN0cmluZ0xpdGVyYWxFeHByIHIgPSBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIKKyAgTGluZSA2MDcpIG5ldyBTdHJpbmdMaXRlcmFsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcgorICBMaW5lIDYxMSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNjEyKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIKKyAgTGluZSA2MTcpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjE3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDYxOSkgSW50ZWdlckxpdGVyYWxFeHByIHIgPSBuZXcgSW50ZWdlckxpdGVyYWxFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcgorICBMaW5lIDYxOSkgbmV3IEludGVnZXJMaXRlcmFsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHIKKyAgTGluZSA2MjMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDYyNCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcgorICBMaW5lIDYyOSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA2MjkpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjMxKSBMb25nTGl0ZXJhbEV4cHIgciA9IG5ldyBMb25nTGl0ZXJhbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByCisgIExpbmUgNjMxKSBuZXcgTG9uZ0xpdGVyYWxFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxvbmdMaXRlcmFsRXhwcgorICBMaW5lIDYzNSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNjM2KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByCisgIExpbmUgNjQxKSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDY0MSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA2NDMpIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIHIgPSBuZXcgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIKKyAgTGluZSA2NDMpIG5ldyBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcgorICBMaW5lIDY0NCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNjQ1KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIKKyAgTGluZSA2NTApIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjUwKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDY1MikgTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgciA9IG5ldyBMb25nTGl0ZXJhbE1pblZhbHVlRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbE1pblZhbHVlRXhwcgorICBMaW5lIDY1MikgbmV3IExvbmdMaXRlcmFsTWluVmFsdWVFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxvbmdMaXRlcmFsTWluVmFsdWVFeHByCisgIExpbmUgNjUzKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA2NTQpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbE1pblZhbHVlRXhwcgorICBMaW5lIDY1OSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA2NTkpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjYxKSBDaGFyTGl0ZXJhbEV4cHIgciA9IG5ldyBDaGFyTGl0ZXJhbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2hhckxpdGVyYWxFeHByCisgIExpbmUgNjYxKSBuZXcgQ2hhckxpdGVyYWxFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNoYXJMaXRlcmFsRXhwcgorICBMaW5lIDY2NSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNjY2KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2hhckxpdGVyYWxFeHByCisgIExpbmUgNjcxKSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDY3MSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA2NzMpIERvdWJsZUxpdGVyYWxFeHByIHIgPSBuZXcgRG91YmxlTGl0ZXJhbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRG91YmxlTGl0ZXJhbEV4cHIKKyAgTGluZSA2NzMpIG5ldyBEb3VibGVMaXRlcmFsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcgorICBMaW5lIDY3Nykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNjc4KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRG91YmxlTGl0ZXJhbEV4cHIKKyAgTGluZSA2ODMpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjgzKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDY4NSkgQm9vbGVhbkxpdGVyYWxFeHByIHIgPSBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwcgorICBMaW5lIDY4NSkgbmV3IEJvb2xlYW5MaXRlcmFsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHIKKyAgTGluZSA2ODkpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDY5MCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwcgorICBMaW5lIDY5NSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA2OTUpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNjk3KSBOdWxsTGl0ZXJhbEV4cHIgciA9IG5ldyBOdWxsTGl0ZXJhbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTnVsbExpdGVyYWxFeHByCisgIExpbmUgNjk3KSBuZXcgTnVsbExpdGVyYWxFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk51bGxMaXRlcmFsRXhwcgorICBMaW5lIDY5OCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNjk5KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTnVsbExpdGVyYWxFeHByCisgIExpbmUgNzA0KSBFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3MDQpIGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzA1KSBMaXN0PFR5cGU+IHR5cGVBcmdzID0gdmlzaXQoX24uZ2V0VHlwZUFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDcwNSkgdmlzaXQoX24uZ2V0VHlwZUFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDcwNikgTGlzdDxFeHByZXNzaW9uPiBhcmdzID0gdmlzaXQoX24uZ2V0QXJncygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNzA2KSB2aXNpdChfbi5nZXRBcmdzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA3MDcpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNzA3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDcwOSkgTWV0aG9kQ2FsbEV4cHIgciA9IG5ldyBNZXRob2RDYWxsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgc2NvcGUsIHR5cGVBcmdzLCBfbi5nZXROYW1lKCksIGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIKKyAgTGluZSA3MDkpIG5ldyBNZXRob2RDYWxsRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgc2NvcGUsIHR5cGVBcmdzLCBfbi5nZXROYW1lKCksIGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIKKyAgTGluZSA3MTMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDcxNCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByCisgIExpbmUgNzE5KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDcxOSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA3MjEpIE5hbWVFeHByIHIgPSBuZXcgTmFtZUV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDcyMSkgbmV3IE5hbWVFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA3MjUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDcyNikgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgNzMxKSBFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3MzEpIGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzMyKSBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgNzMyKSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDczMykgTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA3MzMpIHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA3MzQpIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDczNCkgdmlzaXQoX24uZ2V0QXJncygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNzM1KSBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYW5vbnltb3VzQm9keSA9IHZpc2l0KF9uLmdldEFub255bW91c0NsYXNzQm9keSgpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA3MzUpIHZpc2l0KF9uLmdldEFub255bW91c0NsYXNzQm9keSgpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA3MzYpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNzM2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDczOCkgT2JqZWN0Q3JlYXRpb25FeHByIHIgPSBuZXcgT2JqZWN0Q3JlYXRpb25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBzY29wZSwgdHlwZV8sIHR5cGVBcmdzLCBhcmdzLCBhbm9ueW1vdXNCb2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcgorICBMaW5lIDczOCkgbmV3IE9iamVjdENyZWF0aW9uRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgc2NvcGUsIHR5cGVfLCB0eXBlQXJncywgYXJncywgYW5vbnltb3VzQm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIKKyAgTGluZSA3NDIpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDc0MykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcgorICBMaW5lIDc0OCkgTmFtZUV4cHIgc2NvcGUgPSBjbG9uZU5vZGVzKF9uLmdldFF1YWxpZmllcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgNzQ4KSBjbG9uZU5vZGVzKF9uLmdldFF1YWxpZmllcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgNzQ5KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDc0OSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA3NTEpIFF1YWxpZmllZE5hbWVFeHByIHIgPSBuZXcgUXVhbGlmaWVkTmFtZUV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHNjb3BlLCBfbi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIKKyAgTGluZSA3NTEpIG5ldyBRdWFsaWZpZWROYW1lRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgc2NvcGUsIF9uLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5RdWFsaWZpZWROYW1lRXhwcgorICBMaW5lIDc1NSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNzU2KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIKKyAgTGluZSA3NjEpIEV4cHJlc3Npb24gY2xhc3NFeHByID0gY2xvbmVOb2Rlcyhfbi5nZXRDbGFzc0V4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzYxKSBjbG9uZU5vZGVzKF9uLmdldENsYXNzRXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NjIpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNzYyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDc2NCkgVGhpc0V4cHIgciA9IG5ldyBUaGlzRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgY2xhc3NFeHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByCisgIExpbmUgNzY0KSBuZXcgVGhpc0V4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGNsYXNzRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwcgorICBMaW5lIDc2OCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgNzY5KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIKKyAgTGluZSA3NzQpIEV4cHJlc3Npb24gY2xhc3NFeHByID0gY2xvbmVOb2Rlcyhfbi5nZXRDbGFzc0V4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNzc0KSBjbG9uZU5vZGVzKF9uLmdldENsYXNzRXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3NzUpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNzc1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDc3NykgU3VwZXJFeHByIHIgPSBuZXcgU3VwZXJFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBjbGFzc0V4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByCisgIExpbmUgNzc3KSBuZXcgU3VwZXJFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBjbGFzc0V4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByCisgIExpbmUgNzgxKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA3ODIpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdXBlckV4cHIKKyAgTGluZSA3ODcpIEV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3ODcpIGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3ODgpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgNzg4KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDc5MCkgVW5hcnlFeHByIHIgPSBuZXcgVW5hcnlFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBleHByLCBfbi5nZXRPcGVyYXRvcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwcgorICBMaW5lIDc5MCkgbmV3IFVuYXJ5RXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgZXhwciwgX24uZ2V0T3BlcmF0b3IoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIKKyAgTGluZSA3OTQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDc5NSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwcgorICBMaW5lIDgwMCkgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDgwMCkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA4MDEpIFR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgODAxKSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgODAyKSBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFycyA9IHZpc2l0KF9uLmdldFZhcnMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgODAyKSB2aXNpdChfbi5nZXRWYXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDgwMykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA4MDMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgODA1KSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciByID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCB2YXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByCisgIExpbmUgODA1KSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZV8sIHZhcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIKKyAgTGluZSA4MDkpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDgxMCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByCisgIExpbmUgODE1KSBOYW1lRXhwciBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA4MTUpIGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgODE2KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDgxNikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA4MTgpIE1hcmtlckFubm90YXRpb25FeHByIHIgPSBuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA4MTgpIG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcgorICBMaW5lIDgyMikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgODIzKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA4MjgpIE5hbWVFeHByIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDgyOCkgY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA4MjkpIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUgPSBjbG9uZU5vZGVzKF9uLmdldE1lbWJlclZhbHVlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDgyOSkgY2xvbmVOb2Rlcyhfbi5nZXRNZW1iZXJWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4MzApIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgODMwKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDgzMikgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgciA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbmFtZSwgbWVtYmVyVmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA4MzIpIG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbmFtZSwgbWVtYmVyVmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA4MzYpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDgzNykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByCisgIExpbmUgODQyKSBOYW1lRXhwciBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA4NDIpIGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgODQzKSBMaXN0PE1lbWJlclZhbHVlUGFpcj4gcGFpcnMgPSB2aXNpdChfbi5nZXRQYWlycygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcj4KKyAgTGluZSA4NDMpIHZpc2l0KF9uLmdldFBhaXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyPgorICBMaW5lIDg0NCkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA4NDQpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgODQ2KSBOb3JtYWxBbm5vdGF0aW9uRXhwciByID0gbmV3IE5vcm1hbEFubm90YXRpb25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBuYW1lLCBwYWlycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwcgorICBMaW5lIDg0NikgbmV3IE5vcm1hbEFubm90YXRpb25FeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBuYW1lLCBwYWlycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwcgorICBMaW5lIDg1MCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgODUxKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA4NTYpIEV4cHJlc3Npb24gdmFsdWUgPSBjbG9uZU5vZGVzKF9uLmdldFZhbHVlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDg1NikgY2xvbmVOb2Rlcyhfbi5nZXRWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4NTcpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgODU3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDg1OSkgTWVtYmVyVmFsdWVQYWlyIHIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXROYW1lKCksIHZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcgorICBMaW5lIDg1OSkgbmV3IE1lbWJlclZhbHVlUGFpcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TmFtZSgpLCB2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIKKyAgTGluZSA4NjMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDg2NCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcgorICBMaW5lIDg2OSkgTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA4NjkpIHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA4NzApIEV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4NzApIGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4NzEpIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDg3MSkgdmlzaXQoX24uZ2V0QXJncygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgODcyKSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDg3MikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA4NzQpIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCByID0gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgdHlwZUFyZ3MsIF9uLmlzVGhpcygpLCBleHByLCBhcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdAorICBMaW5lIDg3NCkgbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgdHlwZUFyZ3MsIF9uLmlzVGhpcygpLCBleHByLCBhcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdAorICBMaW5lIDg3OCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgODc5KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10CisgIExpbmUgODg0KSBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSBjbG9uZU5vZGVzKF9uLmdldFR5cGVEZWNsYXJhdGlvbigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbgorICBMaW5lIDg4NCkgY2xvbmVOb2Rlcyhfbi5nZXRUeXBlRGVjbGFyYXRpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24KKyAgTGluZSA4ODUpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgODg1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDg4NykgVHlwZURlY2xhcmF0aW9uU3RtdCByID0gbmV3IFR5cGVEZWNsYXJhdGlvblN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHR5cGVEZWNsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQKKyAgTGluZSA4ODcpIG5ldyBUeXBlRGVjbGFyYXRpb25TdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlRGVjbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10CisgIExpbmUgODkxKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA4OTIpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10CisgIExpbmUgODk3KSBFeHByZXNzaW9uIGNoZWNrID0gY2xvbmVOb2Rlcyhfbi5nZXRDaGVjaygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA4OTcpIGNsb25lTm9kZXMoX24uZ2V0Q2hlY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODk4KSBFeHByZXNzaW9uIG1lc3NhZ2UgPSBjbG9uZU5vZGVzKF9uLmdldE1lc3NhZ2UoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODk4KSBjbG9uZU5vZGVzKF9uLmdldE1lc3NhZ2UoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODk5KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDg5OSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA5MDEpIEFzc2VydFN0bXQgciA9IG5ldyBBc3NlcnRTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBjaGVjaywgbWVzc2FnZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10CisgIExpbmUgOTAxKSBuZXcgQXNzZXJ0U3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgY2hlY2ssIG1lc3NhZ2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdAorICBMaW5lIDkwNSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgOTA2KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdAorICBMaW5lIDkxMSkgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gdmlzaXQoX24uZ2V0U3RtdHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgOTExKSB2aXNpdChfbi5nZXRTdG10cygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSA5MTIpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgOTEyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDkxNCkgQmxvY2tTdG10IHIgPSBuZXcgQmxvY2tTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBzdG10cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSA5MTQpIG5ldyBCbG9ja1N0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHN0bXRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDkxOCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgOTE5KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgOTI0KSBTdGF0ZW1lbnQgc3RtdCA9IGNsb25lTm9kZXMoX24uZ2V0U3RtdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDkyNCkgY2xvbmVOb2Rlcyhfbi5nZXRTdG10KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgOTI1KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDkyNSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA5MjcpIExhYmVsZWRTdG10IHIgPSBuZXcgTGFiZWxlZFN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldExhYmVsKCksIHN0bXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQKKyAgTGluZSA5MjcpIG5ldyBMYWJlbGVkU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0TGFiZWwoKSwgc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdAorICBMaW5lIDkzMSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgOTMyKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQKKyAgTGluZSA5MzcpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgOTM3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDkzOSkgRW1wdHlTdG10IHIgPSBuZXcgRW1wdHlTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdAorICBMaW5lIDkzOSkgbmV3IEVtcHR5U3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQKKyAgTGluZSA5NDApIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDk0MSkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdAorICBMaW5lIDk0NikgRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByZXNzaW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDk0NikgY2xvbmVOb2Rlcyhfbi5nZXRFeHByZXNzaW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDk0NykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA5NDcpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgOTQ5KSBFeHByZXNzaW9uU3RtdCByID0gbmV3IEV4cHJlc3Npb25TdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10CisgIExpbmUgOTQ5KSBuZXcgRXhwcmVzc2lvblN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQKKyAgTGluZSA5NTMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDk1NCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10CisgIExpbmUgOTU5KSBFeHByZXNzaW9uIHNlbGVjdG9yID0gY2xvbmVOb2Rlcyhfbi5nZXRTZWxlY3RvcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA5NTkpIGNsb25lTm9kZXMoX24uZ2V0U2VsZWN0b3IoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgOTYwKSBMaXN0PFN3aXRjaEVudHJ5U3RtdD4gZW50cmllcyA9IHZpc2l0KF9uLmdldEVudHJpZXMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+CisgIExpbmUgOTYwKSB2aXNpdChfbi5nZXRFbnRyaWVzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10PgorICBMaW5lIDk2MSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA5NjEpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgOTYzKSBTd2l0Y2hTdG10IHIgPSBuZXcgU3dpdGNoU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgc2VsZWN0b3IsIGVudHJpZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdAorICBMaW5lIDk2MykgbmV3IFN3aXRjaFN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHNlbGVjdG9yLCBlbnRyaWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQKKyAgTGluZSA5NjcpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDk2OCkgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQKKyAgTGluZSA5NzMpIEV4cHJlc3Npb24gbGFiZWwgPSBjbG9uZU5vZGVzKF9uLmdldExhYmVsKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDk3MykgY2xvbmVOb2Rlcyhfbi5nZXRMYWJlbCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA5NzQpIExpc3Q8U3RhdGVtZW50PiBzdG10cyA9IHZpc2l0KF9uLmdldFN0bXRzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PgorICBMaW5lIDk3NCkgdmlzaXQoX24uZ2V0U3RtdHMoKSwgX2FyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgOTc1KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDk3NSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA5NzcpIFN3aXRjaEVudHJ5U3RtdCByID0gbmV3IFN3aXRjaEVudHJ5U3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbGFiZWwsIHN0bXRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdAorICBMaW5lIDk3NykgbmV3IFN3aXRjaEVudHJ5U3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgbGFiZWwsIHN0bXRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdAorICBMaW5lIDk4MSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgOTgyKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10CisgIExpbmUgOTg3KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDk4NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSA5ODkpIEJyZWFrU3RtdCByID0gbmV3IEJyZWFrU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQKKyAgTGluZSA5ODkpIG5ldyBCcmVha1N0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldElkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10CisgIExpbmUgOTkzKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSA5OTQpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQKKyAgTGluZSA5OTkpIEV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA5OTkpIGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMDAwKSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDEwMDApIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTAwMikgUmV0dXJuU3RtdCByID0gbmV3IFJldHVyblN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdAorICBMaW5lIDEwMDIpIG5ldyBSZXR1cm5TdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQKKyAgTGluZSAxMDA2KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMDA3KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdAorICBMaW5lIDEwMTIpIEV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTAxMikgY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTAxMykgU3RhdGVtZW50IHRoZW5TdG10ID0gY2xvbmVOb2Rlcyhfbi5nZXRUaGVuU3RtdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwMTMpIGNsb25lTm9kZXMoX24uZ2V0VGhlblN0bXQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgTGluZSAxMDE0KSBTdGF0ZW1lbnQgZWxzZVN0bXQgPSBjbG9uZU5vZGVzKF9uLmdldEVsc2VTdG10KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTAxNCkgY2xvbmVOb2Rlcyhfbi5nZXRFbHNlU3RtdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwMTUpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTAxNSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDE3KSBJZlN0bXQgciA9IG5ldyBJZlN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGNvbmRpdGlvbiwgdGhlblN0bXQsIGVsc2VTdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdAorICBMaW5lIDEwMTcpIG5ldyBJZlN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGNvbmRpdGlvbiwgdGhlblN0bXQsIGVsc2VTdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdAorICBMaW5lIDEwMjEpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDEwMjIpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQKKyAgTGluZSAxMDI3KSBFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEwMjcpIGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEwMjgpIFN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTAyOCkgY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTAyOSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDI5KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDEwMzEpIFdoaWxlU3RtdCByID0gbmV3IFdoaWxlU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgY29uZGl0aW9uLCBib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdAorICBMaW5lIDEwMzEpIG5ldyBXaGlsZVN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGNvbmRpdGlvbiwgYm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQKKyAgTGluZSAxMDM1KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMDM2KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10CisgIExpbmUgMTA0MSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDQxKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDEwNDMpIENvbnRpbnVlU3RtdCByID0gbmV3IENvbnRpbnVlU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgX24uZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQKKyAgTGluZSAxMDQzKSBuZXcgQ29udGludWVTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdAorICBMaW5lIDEwNDcpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDEwNDgpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQKKyAgTGluZSAxMDUzKSBTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwNTMpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwNTQpIEV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA1NCkgY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA1NSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDU1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDEwNTcpIERvU3RtdCByID0gbmV3IERvU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgYm9keSwgY29uZGl0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdAorICBMaW5lIDEwNTcpIG5ldyBEb1N0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGJvZHksIGNvbmRpdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQKKyAgTGluZSAxMDYxKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMDYyKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10CisgIExpbmUgMTA2NykgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyID0gY2xvbmVOb2Rlcyhfbi5nZXRWYXJpYWJsZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByCisgIExpbmUgMTA2NykgY2xvbmVOb2Rlcyhfbi5nZXRWYXJpYWJsZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByCisgIExpbmUgMTA2OCkgRXhwcmVzc2lvbiBpdGVyYWJsZSA9IGNsb25lTm9kZXMoX24uZ2V0SXRlcmFibGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA2OCkgY2xvbmVOb2Rlcyhfbi5nZXRJdGVyYWJsZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMDY5KSBTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwNjkpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwNzApIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTA3MCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDcyKSBGb3JlYWNoU3RtdCByID0gbmV3IEZvcmVhY2hTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB2YXIsIGl0ZXJhYmxlLCBib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10CisgIExpbmUgMTA3MikgbmV3IEZvcmVhY2hTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB2YXIsIGl0ZXJhYmxlLCBib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10CisgIExpbmUgMTA3Nikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiB2b2lkCisgIExpbmUgMTA3NykgciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10CisgIExpbmUgMTA4MikgTGlzdDxFeHByZXNzaW9uPiBpbml0ID0gdmlzaXQoX24uZ2V0SW5pdCgpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTA4MikgdmlzaXQoX24uZ2V0SW5pdCgpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTA4MykgRXhwcmVzc2lvbiBjb21wYXJlID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21wYXJlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEwODMpIGNsb25lTm9kZXMoX24uZ2V0Q29tcGFyZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMDg0KSBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSA9IHZpc2l0KF9uLmdldFVwZGF0ZSgpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTA4NCkgdmlzaXQoX24uZ2V0VXBkYXRlKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxMDg1KSBTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwODUpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDEwODYpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTA4NikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDg4KSBGb3JTdG10IHIgPSBuZXcgRm9yU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgaW5pdCwgY29tcGFyZSwgdXBkYXRlLCBib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQKKyAgTGluZSAxMDg4KSBuZXcgRm9yU3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgaW5pdCwgY29tcGFyZSwgdXBkYXRlLCBib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQKKyAgTGluZSAxMDkyKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMDkzKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdAorICBMaW5lIDEwOTgpIEV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMDk4KSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTA5OSkgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMDk5KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDExMDEpIFRocm93U3RtdCByID0gbmV3IFRocm93U3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQKKyAgTGluZSAxMTAxKSBuZXcgVGhyb3dTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdAorICBMaW5lIDExMDUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDExMDYpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQKKyAgTGluZSAxMTExKSBFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTExMSkgY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDExMTIpIEJsb2NrU3RtdCBibG9jayA9IGNsb25lTm9kZXMoX24uZ2V0QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAxMTEyKSBjbG9uZU5vZGVzKF9uLmdldEJsb2NrKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMTExMykgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMTEzKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDExMTUpIFN5bmNocm9uaXplZFN0bXQgciA9IG5ldyBTeW5jaHJvbml6ZWRTdG10KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBleHByLCBibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10CisgIExpbmUgMTExNSkgbmV3IFN5bmNocm9uaXplZFN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGV4cHIsIGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQKKyAgTGluZSAxMTE5KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IHZvaWQKKyAgTGluZSAxMTIwKSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdAorICBMaW5lIDExMjUpIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IHJlc291cmNlcyA9IHZpc2l0KF9uLmdldFJlc291cmNlcygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByPgorICBMaW5lIDExMjUpIHZpc2l0KF9uLmdldFJlc291cmNlcygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByPgorICBMaW5lIDExMjYpIEJsb2NrU3RtdCB0cnlCbG9jayA9IGNsb25lTm9kZXMoX24uZ2V0VHJ5QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAxMTI2KSBjbG9uZU5vZGVzKF9uLmdldFRyeUJsb2NrKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMTEyNykgTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzID0gdmlzaXQoX24uZ2V0Q2F0Y2hzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U+CisgIExpbmUgMTEyNykgdmlzaXQoX24uZ2V0Q2F0Y2hzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U+CisgIExpbmUgMTEyOCkgQmxvY2tTdG10IGZpbmFsbHlCbG9jayA9IGNsb25lTm9kZXMoX24uZ2V0RmluYWxseUJsb2NrKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10CisgIExpbmUgMTEyOCkgY2xvbmVOb2Rlcyhfbi5nZXRGaW5hbGx5QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQKKyAgTGluZSAxMTI5KSBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudAorICBMaW5lIDExMjkpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTEzMSkgVHJ5U3RtdCByID0gbmV3IFRyeVN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHJlc291cmNlcywgdHJ5QmxvY2ssIGNhdGNocywgZmluYWxseUJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQKKyAgTGluZSAxMTMxKSBuZXcgVHJ5U3RtdChfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgcmVzb3VyY2VzLCB0cnlCbG9jaywgY2F0Y2hzLCBmaW5hbGx5QmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdAorICBMaW5lIDExMzUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDExMzYpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10CisgIExpbmUgMTE0MSkgTXVsdGlUeXBlUGFyYW1ldGVyIGV4Y2VwdCA9IGNsb25lTm9kZXMoX24uZ2V0RXhjZXB0KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyCisgIExpbmUgMTE0MSkgY2xvbmVOb2Rlcyhfbi5nZXRFeGNlcHQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NdWx0aVR5cGVQYXJhbWV0ZXIKKyAgTGluZSAxMTQyKSBCbG9ja1N0bXQgY2F0Y2hCbG9jayA9IGNsb25lTm9kZXMoX24uZ2V0Q2F0Y2hCbG9jaygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDExNDIpIGNsb25lTm9kZXMoX24uZ2V0Q2F0Y2hCbG9jaygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDExNDMpIENvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50CisgIExpbmUgMTE0MykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQKKyAgTGluZSAxMTQ1KSBDYXRjaENsYXVzZSByID0gbmV3IENhdGNoQ2xhdXNlKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBleGNlcHQuZ2V0TW9kaWZpZXJzKCksIGV4Y2VwdC5nZXRBbm5vdGF0aW9ucygpLCBleGNlcHQuZ2V0VHlwZXMoKSwgZXhjZXB0LmdldElkKCksIGNhdGNoQmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UKKyAgTGluZSAxMTQ1KSBuZXcgQ2F0Y2hDbGF1c2UoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGV4Y2VwdC5nZXRNb2RpZmllcnMoKSwgZXhjZXB0LmdldEFubm90YXRpb25zKCksIGV4Y2VwdC5nZXRUeXBlcygpLCBleGNlcHQuZ2V0SWQoKSwgY2F0Y2hCbG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZQorICBMaW5lIDExNDkpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gdm9pZAorICBMaW5lIDExNTApIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZQorICBMaW5lIDExNTYpIExpc3Q8UGFyYW1ldGVyPiBsYW1iZGFQYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0UGFyYW1ldGVycygpLCBfYXJnKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxMTU2KSB2aXNpdChfbi5nZXRQYXJhbWV0ZXJzKCksIF9hcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDExNTgpIFN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTE1OCkgY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTE2MCkgTGFtYmRhRXhwciByID0gbmV3IExhbWJkYUV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIGxhbWJkYVBhcmFtZXRlcnMsIGJvZHksIF9uLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcgorICBMaW5lIDExNjApIG5ldyBMYW1iZGFFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBsYW1iZGFQYXJhbWV0ZXJzLCBib2R5LCBfbi5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIKKyAgTGluZSAxMTY0KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcgorICBMaW5lIDExNzApIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtcyA9IHZpc2l0KF9uLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZykgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAxMTcwKSB2aXNpdChfbi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMTE3MSkgRXhwcmVzc2lvbiBzY29wZSA9IGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMTcxKSBjbG9uZU5vZGVzKF9uLmdldFNjb3BlKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTE3MykgTWV0aG9kUmVmZXJlbmNlRXhwciByID0gbmV3IE1ldGhvZFJlZmVyZW5jZUV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHNjb3BlLCB0eXBlUGFyYW1zLCBfbi5nZXRJZGVudGlmaWVyKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcgorICBMaW5lIDExNzMpIG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBzY29wZSwgdHlwZVBhcmFtcywgX24uZ2V0SWRlbnRpZmllcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIKKyAgTGluZSAxMTc2KSByID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcgorICBMaW5lIDExODIpIFR5cGUgdCA9IGNsb25lTm9kZXMobi5nZXRUeXBlKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMTE4MikgY2xvbmVOb2RlcyhuLmdldFR5cGUoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAxMTg0KSBUeXBlRXhwciByID0gbmV3IFR5cGVFeHByKG4uZ2V0QmVnaW5MaW5lKCksIG4uZ2V0QmVnaW5Db2x1bW4oKSwgbi5nZXRFbmRMaW5lKCksIG4uZ2V0RW5kQ29sdW1uKCksIHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIKKyAgTGluZSAxMTg0KSBuZXcgVHlwZUV4cHIobi5nZXRCZWdpbkxpbmUoKSwgbi5nZXRCZWdpbkNvbHVtbigpLCBuLmdldEVuZExpbmUoKSwgbi5nZXRFbmRDb2x1bW4oKSwgdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwcgorICBMaW5lIDExODcpIHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwcgorICBMaW5lIDExOTEpIF9ub2RlcyA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE5MikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDExOTMpIExpc3Q8VD4gciA9IG5ldyBBcnJheUxpc3Q8VD4oX25vZGVzLnNpemUoKSkgPT0+IGphdmEudXRpbC5MaXN0PFQ+CisgIExpbmUgMTE5MykgbmV3IEFycmF5TGlzdDxUPihfbm9kZXMuc2l6ZSgpKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdDxUPgorICBMaW5lIDExOTQpIFQgbiA9PT4gVAorICBMaW5lIDExOTQpIF9ub2RlcyA9PT4gamF2YS51dGlsLkxpc3Q8VD4KKyAgTGluZSAxMTk1KSBUIHJOID0gY2xvbmVOb2RlcyhuLCBfYXJnKSA9PT4gVAorICBMaW5lIDExOTUpIGNsb25lTm9kZXMobiwgX2FyZykgPT0+IFQKKyAgTGluZSAxMTk2KSByTiAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE5Nykgci5hZGQock4pID09PiBib29sZWFuCisgIExpbmUgMTE5OSkgciA9PT4gamF2YS51dGlsLkxpc3Q8VD4KKyAgTGluZSAxMjAzKSBfbm9kZSA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIwNCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEyMDUpIE5vZGUgciA9IF9ub2RlLmFjY2VwdCh0aGlzLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgMTIwNSkgX25vZGUuYWNjZXB0KHRoaXMsIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAxMjA2KSByID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjA3KSBudWxsID09PiBudWxsCisgIExpbmUgMTIwOCkgKFQpIHIgPT0+IFQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfRHVtcFZpc2l0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9EdW1wVmlzaXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4NDUyNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfRHVtcFZpc2l0b3IudHh0CkBAIC0wLDAgKzEsMTA3NiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvciBdCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IKKyAgTGluZSA5MykgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDk3KSB0aGlzLnByaW50Q29tbWVudHMgPSBwcmludENvbW1lbnRzID09PiBib29sZWFuCisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIExpbmUgMTAyKSAwID09PiBpbnQKKyAgTGluZSAxMDQpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTA2KSBuZXcgU3RyaW5nQnVpbGRlcigpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgorICBMaW5lIDEwOSkgbGV2ZWwrKyA9PT4gaW50CisgIExpbmUgMTEzKSBsZXZlbC0tID09PiBpbnQKKyAgTGluZSAxMTcpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMTE3KSAwID09PiBpbnQKKyAgTGluZSAxMTcpIGkgPCBsZXZlbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNykgaSsrID09PiBpbnQKKyAgTGluZSAxMTgpIGJ1Zi5hcHBlbmQoIiAgICAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKKyAgTGluZSAxMjMpICFpbmRlbnRlZCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNCkgbWFrZUluZGVudCgpID09PiB2b2lkCisgIExpbmUgMTI1KSBpbmRlbnRlZCA9IHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjcpIGJ1Zi5hcHBlbmQoYXJnKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIKKyAgTGluZSAxMzEpIHByaW50KGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzIpIHByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDEzNikgYnVmLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcgorICBMaW5lIDEzNykgaW5kZW50ZWQgPSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MSkgYnVmLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAxNDUpIGdldFNvdXJjZSgpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTQ5KSBuZXcgU291cmNlUHJpbnRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlcgorICBMaW5lIDE1MikgcHJpbnRlci5nZXRTb3VyY2UoKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDE1NikgTW9kaWZpZXJTZXQuaXNQcml2YXRlKG1vZGlmaWVycykgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTcpIHByaW50ZXIucHJpbnQoInByaXZhdGUgIikgPT0+IHZvaWQKKyAgTGluZSAxNTkpIE1vZGlmaWVyU2V0LmlzUHJvdGVjdGVkKG1vZGlmaWVycykgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjApIHByaW50ZXIucHJpbnQoInByb3RlY3RlZCAiKSA9PT4gdm9pZAorICBMaW5lIDE2MikgTW9kaWZpZXJTZXQuaXNQdWJsaWMobW9kaWZpZXJzKSA9PT4gYm9vbGVhbgorICBMaW5lIDE2MykgcHJpbnRlci5wcmludCgicHVibGljICIpID09PiB2b2lkCisgIExpbmUgMTY1KSBNb2RpZmllclNldC5pc0Fic3RyYWN0KG1vZGlmaWVycykgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjYpIHByaW50ZXIucHJpbnQoImFic3RyYWN0ICIpID09PiB2b2lkCisgIExpbmUgMTY4KSBNb2RpZmllclNldC5pc1N0YXRpYyhtb2RpZmllcnMpID09PiBib29sZWFuCisgIExpbmUgMTY5KSBwcmludGVyLnByaW50KCJzdGF0aWMgIikgPT0+IHZvaWQKKyAgTGluZSAxNzEpIE1vZGlmaWVyU2V0LmlzRmluYWwobW9kaWZpZXJzKSA9PT4gYm9vbGVhbgorICBMaW5lIDE3MikgcHJpbnRlci5wcmludCgiZmluYWwgIikgPT0+IHZvaWQKKyAgTGluZSAxNzQpIE1vZGlmaWVyU2V0LmlzTmF0aXZlKG1vZGlmaWVycykgPT0+IGJvb2xlYW4KKyAgTGluZSAxNzUpIHByaW50ZXIucHJpbnQoIm5hdGl2ZSAiKSA9PT4gdm9pZAorICBMaW5lIDE3NykgTW9kaWZpZXJTZXQuaXNTdHJpY3RmcChtb2RpZmllcnMpID09PiBib29sZWFuCisgIExpbmUgMTc4KSBwcmludGVyLnByaW50KCJzdHJpY3RmcCAiKSA9PT4gdm9pZAorICBMaW5lIDE4MCkgTW9kaWZpZXJTZXQuaXNTeW5jaHJvbml6ZWQobW9kaWZpZXJzKSA9PT4gYm9vbGVhbgorICBMaW5lIDE4MSkgcHJpbnRlci5wcmludCgic3luY2hyb25pemVkICIpID09PiB2b2lkCisgIExpbmUgMTgzKSBNb2RpZmllclNldC5pc1RyYW5zaWVudChtb2RpZmllcnMpID09PiBib29sZWFuCisgIExpbmUgMTg0KSBwcmludGVyLnByaW50KCJ0cmFuc2llbnQgIikgPT0+IHZvaWQKKyAgTGluZSAxODYpIE1vZGlmaWVyU2V0LmlzVm9sYXRpbGUobW9kaWZpZXJzKSA9PT4gYm9vbGVhbgorICBMaW5lIDE4NykgcHJpbnRlci5wcmludCgidm9sYXRpbGUgIikgPT0+IHZvaWQKKyAgTGluZSAxOTIpIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSAxOTIpIG1lbWJlcnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMTkzKSBwcmludGVyLnByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDE5NCkgbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTk1KSBwcmludGVyLnByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDIwMCkgIWlzTnVsbE9yRW1wdHkoYW5ub3RhdGlvbnMpID09PiBib29sZWFuCisgIExpbmUgMjAxKSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAyMDEpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMjAyKSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjAzKSBwcmludGVyLnByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDIwOSkgIWlzTnVsbE9yRW1wdHkoYW5ub3RhdGlvbnMpID09PiBib29sZWFuCisgIExpbmUgMjEwKSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAyMTApIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMjExKSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjEyKSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSAyMTgpICFpc051bGxPckVtcHR5KGFyZ3MpID09PiBib29sZWFuCisgIExpbmUgMjE5KSBwcmludGVyLnByaW50KCI8IikgPT0+IHZvaWQKKyAgTGluZSAyMjApIGZpbmFsIEl0ZXJhdG9yPFR5cGU+IGkgPSBhcmdzLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSAyMjApIGFyZ3MuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDIyMCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMjEpIGZpbmFsIFR5cGUgdCA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDIyMSkgaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMjIyKSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjIzKSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDIyNCkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gdm9pZAorICBMaW5lIDIyNykgcHJpbnRlci5wcmludCgiPiIpID09PiB2b2lkCisgIExpbmUgMjMyKSAhaXNOdWxsT3JFbXB0eShhcmdzKSA9PT4gYm9vbGVhbgorICBMaW5lIDIzMykgcHJpbnRlci5wcmludCgiPCIpID09PiB2b2lkCisgIExpbmUgMjM0KSBmaW5hbCBJdGVyYXRvcjxUeXBlUGFyYW1ldGVyPiBpID0gYXJncy5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDIzNCkgYXJncy5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDIzNCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMzUpIGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSAyMzUpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSAyMzYpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMzcpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMjM4KSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMjQxKSBwcmludGVyLnByaW50KCI+IikgPT0+IHZvaWQKKyAgTGluZSAyNDYpIHByaW50ZXIucHJpbnQoIigiKSA9PT4gdm9pZAorICBMaW5lIDI0NykgIWlzTnVsbE9yRW1wdHkoYXJncykgPT0+IGJvb2xlYW4KKyAgTGluZSAyNDgpIGZpbmFsIEl0ZXJhdG9yPEV4cHJlc3Npb24+IGkgPSBhcmdzLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAyNDgpIGFyZ3MuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDI0OCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyNDkpIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDI0OSkgaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMjUwKSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjUxKSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDI1MikgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gdm9pZAorICBMaW5lIDI1NikgcHJpbnRlci5wcmludCgiKSIpID09PiB2b2lkCisgIExpbmUgMjYwKSBqYXZhZG9jICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNjEpIGphdmFkb2MuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyNjYpIGphdmFjb21tZW50ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNjcpIGphdmFjb21tZW50LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjcyKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjc0KSBuLmdldFBhY2thZ2UoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjc1KSBuLmdldFBhY2thZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDI3OCkgbi5nZXRJbXBvcnRzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDI3OSkgZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gaSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDI3OSkgbi5nZXRJbXBvcnRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24+CisgIExpbmUgMjgwKSBpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjgyKSBwcmludGVyLnByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDI4NSkgbi5nZXRUeXBlcygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyODYpIGZpbmFsIEl0ZXJhdG9yPFR5cGVEZWNsYXJhdGlvbj4gaSA9IG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbj4KKyAgTGluZSAyODYpIG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbj4KKyAgTGluZSAyODYpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMjg3KSBpLm5leHQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDI4OCkgcHJpbnRlci5wcmludExuKCkgPT0+IHZvaWQKKyAgTGluZSAyODkpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMjkwKSBwcmludGVyLnByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDI5NSkgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKSA9PT4gdm9pZAorICBMaW5lIDI5OSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDMwMCkgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMDEpIHByaW50ZXIucHJpbnQoInBhY2thZ2UgIikgPT0+IHZvaWQKKyAgTGluZSAzMDIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzAzKSBwcmludGVyLnByaW50TG4oIjsiKSA9PT4gdm9pZAorICBMaW5lIDMwNCkgcHJpbnRlci5wcmludExuKCkgPT0+IHZvaWQKKyAgTGluZSAzMDYpIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobikgPT0+IHZvaWQKKyAgTGluZSAzMTApIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMTEpIHByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpID09PiB2b2lkCisgIExpbmUgMzEzKSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiB2b2lkCisgIExpbmUgMzE3KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzE4KSBuLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzE5KSBwcmludGVyLnByaW50KCIuIikgPT0+IHZvaWQKKyAgTGluZSAzMjApIHByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpID09PiB2b2lkCisgIExpbmUgMzIyKSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiB2b2lkCisgIExpbmUgMzI2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzI3KSBwcmludGVyLnByaW50KCJpbXBvcnQgIikgPT0+IHZvaWQKKyAgTGluZSAzMjgpIG4uaXNTdGF0aWMoKSA9PT4gYm9vbGVhbgorICBMaW5lIDMyOSkgcHJpbnRlci5wcmludCgic3RhdGljICIpID09PiB2b2lkCisgIExpbmUgMzMxKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDMzMikgbi5pc0FzdGVyaXNrKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMzMpIHByaW50ZXIucHJpbnQoIi4qIikgPT0+IHZvaWQKKyAgTGluZSAzMzUpIHByaW50ZXIucHJpbnRMbigiOyIpID09PiB2b2lkCisgIExpbmUgMzM3KSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiB2b2lkCisgIExpbmUgMzQxKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzQyKSBwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzNDMpIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzQ0KSBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKSA9PT4gdm9pZAorICBMaW5lIDM0Nikgbi5pc0ludGVyZmFjZSgpID09PiBib29sZWFuCisgIExpbmUgMzQ3KSBwcmludGVyLnByaW50KCJpbnRlcmZhY2UgIikgPT0+IHZvaWQKKyAgTGluZSAzNDkpIHByaW50ZXIucHJpbnQoImNsYXNzICIpID09PiB2b2lkCisgIExpbmUgMzUyKSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gdm9pZAorICBMaW5lIDM1NCkgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzNTYpICFpc051bGxPckVtcHR5KG4uZ2V0RXh0ZW5kcygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDM1NykgcHJpbnRlci5wcmludCgiIGV4dGVuZHMgIikgPT0+IHZvaWQKKyAgTGluZSAzNTgpIGZpbmFsIEl0ZXJhdG9yPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpID0gbi5nZXRFeHRlbmRzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAzNTgpIG4uZ2V0RXh0ZW5kcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMzU4KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDM1OSkgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSAzNTkpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSAzNjApIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzNjEpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMzYyKSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMzY3KSAhaXNOdWxsT3JFbXB0eShuLmdldEltcGxlbWVudHMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjgpIHByaW50ZXIucHJpbnQoIiBpbXBsZW1lbnRzICIpID09PiB2b2lkCisgIExpbmUgMzY5KSBmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMzY5KSBuLmdldEltcGxlbWVudHMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDM2OSkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzNzApIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMzcwKSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMzcxKSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzcyKSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDM3MykgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gdm9pZAorICBMaW5lIDM3OCkgcHJpbnRlci5wcmludExuKCIgeyIpID09PiB2b2lkCisgIExpbmUgMzc5KSBwcmludGVyLmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMzgwKSAhaXNOdWxsT3JFbXB0eShuLmdldE1lbWJlcnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzODEpIHByaW50TWVtYmVycyhuLmdldE1lbWJlcnMoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM4NCkgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKSA9PT4gdm9pZAorICBMaW5lIDM4NikgcHJpbnRlci51bmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMzg3KSBwcmludGVyLnByaW50KCJ9IikgPT0+IHZvaWQKKyAgTGluZSAzOTEpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzOTIpIHByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM5MykgcHJpbnRlci5wcmludCgiOyIpID09PiB2b2lkCisgIExpbmUgMzk1KSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiB2b2lkCisgIExpbmUgMzk5KSBwcmludGVyLnByaW50KCIvKioiKSA9PT4gdm9pZAorICBMaW5lIDQwMCkgcHJpbnRlci5wcmludChuLmdldENvbnRlbnQoKSkgPT0+IHZvaWQKKyAgTGluZSA0MDEpIHByaW50ZXIucHJpbnRMbigiKi8iKSA9PT4gdm9pZAorICBMaW5lIDQwNSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQwNykgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MDgpIEFubm90YXRpb25FeHByIGFlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA0MDgpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQwOSkgYWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MTApIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDQxNCkgbi5nZXRTY29wZSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MTUpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQxNikgcHJpbnRlci5wcmludCgiLiIpID09PiB2b2lkCisgIExpbmUgNDE4KSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gdm9pZAorICBMaW5lIDQxOSkgcHJpbnRUeXBlQXJncyhuLmdldFR5cGVBcmdzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MjMpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MjQpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDI1KSBBbm5vdGF0aW9uRXhwciBhbm4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDQyNSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNDI2KSBhbm4uYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MjcpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDQzMCkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IHZvaWQKKyAgTGluZSA0MzEpIG4uZ2V0VHlwZUJvdW5kKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQzMikgcHJpbnRlci5wcmludCgiIGV4dGVuZHMgIikgPT0+IHZvaWQKKyAgTGluZSA0MzMpIGZpbmFsIEl0ZXJhdG9yPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpID0gbi5nZXRUeXBlQm91bmQoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDQzMykgbi5nZXRUeXBlQm91bmQoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDQzMykgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0MzQpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgNDM0KSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgNDM1KSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDM2KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDQzNykgcHJpbnRlci5wcmludCgiICYgIikgPT0+IHZvaWQKKyAgTGluZSA0NDQpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0NDUpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDQ2KSBBbm5vdGF0aW9uRXhwciBhZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNDQ2KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0NDcpIGFlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDQ4KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSA0NTEpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUKKyAgTGluZSA0NTIpIEJvb2xlYW4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZQorICBMaW5lIDQ1MykgcHJpbnRlci5wcmludCgiYm9vbGVhbiIpID09PiB2b2lkCisgIExpbmUgNDU1KSBCeXRlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUKKyAgTGluZSA0NTYpIHByaW50ZXIucHJpbnQoImJ5dGUiKSA9PT4gdm9pZAorICBMaW5lIDQ1OCkgQ2hhciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlCisgIExpbmUgNDU5KSBwcmludGVyLnByaW50KCJjaGFyIikgPT0+IHZvaWQKKyAgTGluZSA0NjEpIERvdWJsZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlCisgIExpbmUgNDYyKSBwcmludGVyLnByaW50KCJkb3VibGUiKSA9PT4gdm9pZAorICBMaW5lIDQ2NCkgRmxvYXQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZQorICBMaW5lIDQ2NSkgcHJpbnRlci5wcmludCgiZmxvYXQiKSA9PT4gdm9pZAorICBMaW5lIDQ2NykgSW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUKKyAgTGluZSA0NjgpIHByaW50ZXIucHJpbnQoImludCIpID09PiB2b2lkCisgIExpbmUgNDcwKSBMb25nID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUKKyAgTGluZSA0NzEpIHByaW50ZXIucHJpbnQoImxvbmciKSA9PT4gdm9pZAorICBMaW5lIDQ3MykgU2hvcnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZQorICBMaW5lIDQ3NCkgcHJpbnRlci5wcmludCgic2hvcnQiKSA9PT4gdm9pZAorICBMaW5lIDQ4MCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ4MSkgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0ODIpIEFubm90YXRpb25FeHByIGFlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA0ODIpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQ4MykgYWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0ODQpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDQ4Nykgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0ODgpIExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IGFycmF5c0Fubm90YXRpb25zID0gbi5nZXRBcnJheXNBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDQ4OCkgbi5nZXRBcnJheXNBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDQ4OSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA0ODkpIDAgPT0+IGludAorICBMaW5lIDQ4OSkgaSA8IG4uZ2V0QXJyYXlDb3VudCgpID09PiBib29sZWFuCisgIExpbmUgNDg5KSBpKysgPT0+IGludAorICBMaW5lIDQ5MCkgYXJyYXlzQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiBpIDwgYXJyYXlzQW5ub3RhdGlvbnMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNDkxKSBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGFycmF5c0Fubm90YXRpb25zLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQ5MSkgYXJyYXlzQW5ub3RhdGlvbnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNDkyKSBhbm5vdGF0aW9ucyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDkzKSBBbm5vdGF0aW9uRXhwciBhZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNDkzKSBhbm5vdGF0aW9ucyA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQ5NCkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgNDk1KSBhZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUwMCkgcHJpbnRlci5wcmludCgiW10iKSA9PT4gdm9pZAorICBMaW5lIDUwNSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUwNikgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MDcpIEFubm90YXRpb25FeHByIGFlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA1MDcpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDUwOCkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgNTA5KSBhZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUxMikgcHJpbnRlci5wcmludCgiPyIpID09PiB2b2lkCisgIExpbmUgNTEzKSBuLmdldEV4dGVuZHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTE0KSBwcmludGVyLnByaW50KCIgZXh0ZW5kcyAiKSA9PT4gdm9pZAorICBMaW5lIDUxNSkgbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1MTcpIG4uZ2V0U3VwZXIoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTE4KSBwcmludGVyLnByaW50KCIgc3VwZXIgIikgPT0+IHZvaWQKKyAgTGluZSA1MTkpIG4uZ2V0U3VwZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUyOCkgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobikgPT0+IHZvaWQKKyAgTGluZSA1MzApIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1MzEpIHByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUzMikgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1MzMpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiB2b2lkCisgIExpbmUgNTM0KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUzNikgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgNTM3KSBmaW5hbCBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0b3I+IGkgPSBuLmdldFZhcmlhYmxlcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDUzNykgbi5nZXRWYXJpYWJsZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4KKyAgTGluZSA1MzcpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgNTM4KSBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyID0gaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IKKyAgTGluZSA1MzgpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgNTM5KSB2YXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NDApIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgNTQxKSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgNTQ1KSBwcmludGVyLnByaW50KCI7IikgPT0+IHZvaWQKKyAgTGluZSA1NDkpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NTApIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU1MSkgbi5nZXRJbml0KCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU1MikgcHJpbnRlci5wcmludCgiID0gIikgPT0+IHZvaWQKKyAgTGluZSA1NTMpIG4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTU4KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTU5KSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gdm9pZAorICBMaW5lIDU2MCkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA1NjApIDAgPT0+IGludAorICBMaW5lIDU2MCkgaSA8IG4uZ2V0QXJyYXlDb3VudCgpID09PiBib29sZWFuCisgIExpbmUgNTYwKSBpKysgPT0+IGludAorICBMaW5lIDU2MSkgcHJpbnRlci5wcmludCgiW10iKSA9PT4gdm9pZAorICBMaW5lIDU2NikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU2NykgcHJpbnRlci5wcmludCgieyIpID09PiB2b2lkCisgIExpbmUgNTY4KSBuLmdldFZhbHVlcygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1NjkpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDU3MCkgZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IG4uZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDU3MCkgbi5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNTcwKSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDU3MSkgZmluYWwgRXhwcmVzc2lvbiBleHByID0gaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNTcxKSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1NzIpIGV4cHIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NzMpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgNTc0KSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgNTc3KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSA1NzkpIHByaW50ZXIucHJpbnQoIn0iKSA9PT4gdm9pZAorICBMaW5lIDU4MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU4NCkgcHJpbnRlci5wcmludCgidm9pZCIpID09PiB2b2lkCisgIExpbmUgNTg4KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTg5KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU5MCkgcHJpbnRlci5wcmludCgiWyIpID09PiB2b2lkCisgIExpbmUgNTkxKSBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1OTIpIHByaW50ZXIucHJpbnQoIl0iKSA9PT4gdm9pZAorICBMaW5lIDU5NikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU5NykgcHJpbnRlci5wcmludCgibmV3ICIpID09PiB2b2lkCisgIExpbmUgNTk4KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU5OSkgTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gYXJyYXlzQW5ub3RhdGlvbnMgPSBuLmdldEFycmF5c0Fubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgNTk5KSBuLmdldEFycmF5c0Fubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgNjAwKSBuLmdldERpbWVuc2lvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjAxKSBpbnQgaiA9IDAgPT0+IGludAorICBMaW5lIDYwMSkgMCA9PT4gaW50CisgIExpbmUgNjAyKSBmaW5hbCBFeHByZXNzaW9uIGRpbSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MDIpIG4uZ2V0RGltZW5zaW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA2MDQpIGFycmF5c0Fubm90YXRpb25zICE9IG51bGwgJiYgaiA8IGFycmF5c0Fubm90YXRpb25zLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDYwNSkgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBhcnJheXNBbm5vdGF0aW9ucy5nZXQoaikgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MDUpIGFycmF5c0Fubm90YXRpb25zLmdldChqKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDYwNikgYW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYwNykgQW5ub3RhdGlvbkV4cHIgYWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDYwNykgYW5ub3RhdGlvbnMgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MDgpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDYwOSkgYWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MTMpIHByaW50ZXIucHJpbnQoIlsiKSA9PT4gdm9pZAorICBMaW5lIDYxNCkgZGltLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjE1KSBwcmludGVyLnByaW50KCJdIikgPT0+IHZvaWQKKyAgTGluZSA2MTYpIGorKyA9PT4gaW50CisgIExpbmUgNjE4KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDYxOCkgMCA9PT4gaW50CisgIExpbmUgNjE4KSBpIDwgbi5nZXRBcnJheUNvdW50KCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MTgpIGkrKyA9PT4gaW50CisgIExpbmUgNjE5KSBhcnJheXNBbm5vdGF0aW9ucyAhPSBudWxsICYmIGkgPCBhcnJheXNBbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MjEpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gYXJyYXlzQW5ub3RhdGlvbnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjIxKSBhcnJheXNBbm5vdGF0aW9ucy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MjIpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2MjMpIEFubm90YXRpb25FeHByIGFlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA2MjMpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjI0KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSA2MjUpIGFlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjMwKSBwcmludGVyLnByaW50KCJbXSIpID09PiB2b2lkCisgIExpbmUgNjM0KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDYzNCkgMCA9PT4gaW50CisgIExpbmUgNjM0KSBpIDwgbi5nZXRBcnJheUNvdW50KCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MzQpIGkrKyA9PT4gaW50CisgIExpbmUgNjM1KSBhcnJheXNBbm5vdGF0aW9ucyAhPSBudWxsICYmIGkgPCBhcnJheXNBbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MzYpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gYXJyYXlzQW5ub3RhdGlvbnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjM2KSBhcnJheXNBbm5vdGF0aW9ucy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MzcpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2MzgpIEFubm90YXRpb25FeHByIGFlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA2MzgpIGFubm90YXRpb25zID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjM5KSBhZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY0MCkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgNjQ0KSBwcmludGVyLnByaW50KCJbXSIpID09PiB2b2lkCisgIExpbmUgNjQ2KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSA2NDcpIG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1MikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1Mykgbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1NCkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgNjU1KSBuLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLk9wZXJhdG9yCisgIExpbmUgNjU2KSBhc3NpZ24gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLk9wZXJhdG9yCisgIExpbmUgNjU3KSBwcmludGVyLnByaW50KCI9IikgPT0+IHZvaWQKKyAgTGluZSA2NTkpIGFuZCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuT3BlcmF0b3IKKyAgTGluZSA2NjApIHByaW50ZXIucHJpbnQoIiY9IikgPT0+IHZvaWQKKyAgTGluZSA2NjIpIG9yID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDY2MykgcHJpbnRlci5wcmludCgifD0iKSA9PT4gdm9pZAorICBMaW5lIDY2NSkgeG9yID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDY2NikgcHJpbnRlci5wcmludCgiXj0iKSA9PT4gdm9pZAorICBMaW5lIDY2OCkgcGx1cyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuT3BlcmF0b3IKKyAgTGluZSA2NjkpIHByaW50ZXIucHJpbnQoIis9IikgPT0+IHZvaWQKKyAgTGluZSA2NzEpIG1pbnVzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDY3MikgcHJpbnRlci5wcmludCgiLT0iKSA9PT4gdm9pZAorICBMaW5lIDY3NCkgcmVtID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDY3NSkgcHJpbnRlci5wcmludCgiJT0iKSA9PT4gdm9pZAorICBMaW5lIDY3Nykgc2xhc2ggPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLk9wZXJhdG9yCisgIExpbmUgNjc4KSBwcmludGVyLnByaW50KCIvPSIpID09PiB2b2lkCisgIExpbmUgNjgwKSBzdGFyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDY4MSkgcHJpbnRlci5wcmludCgiKj0iKSA9PT4gdm9pZAorICBMaW5lIDY4MykgbFNoaWZ0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcgorICBMaW5lIDY4NCkgcHJpbnRlci5wcmludCgiPDw9IikgPT0+IHZvaWQKKyAgTGluZSA2ODYpIHJTaWduZWRTaGlmdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuT3BlcmF0b3IKKyAgTGluZSA2ODcpIHByaW50ZXIucHJpbnQoIj4+PSIpID09PiB2b2lkCisgIExpbmUgNjg5KSByVW5zaWduZWRTaGlmdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuT3BlcmF0b3IKKyAgTGluZSA2OTApIHByaW50ZXIucHJpbnQoIj4+Pj0iKSA9PT4gdm9pZAorICBMaW5lIDY5MykgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgNjk0KSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2OTgpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2OTkpIG4uZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzAwKSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSA3MDEpIG4uZ2V0T3BlcmF0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA3MDIpIG9yID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDcwMykgcHJpbnRlci5wcmludCgifHwiKSA9PT4gdm9pZAorICBMaW5lIDcwNSkgYW5kID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDcwNikgcHJpbnRlci5wcmludCgiJiYiKSA9PT4gdm9pZAorICBMaW5lIDcwOCkgYmluT3IgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgNzA5KSBwcmludGVyLnByaW50KCJ8IikgPT0+IHZvaWQKKyAgTGluZSA3MTEpIGJpbkFuZCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA3MTIpIHByaW50ZXIucHJpbnQoIiYiKSA9PT4gdm9pZAorICBMaW5lIDcxNCkgeG9yID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDcxNSkgcHJpbnRlci5wcmludCgiXiIpID09PiB2b2lkCisgIExpbmUgNzE3KSBlcXVhbHMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgNzE4KSBwcmludGVyLnByaW50KCI9PSIpID09PiB2b2lkCisgIExpbmUgNzIwKSBub3RFcXVhbHMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgNzIxKSBwcmludGVyLnByaW50KCIhPSIpID09PiB2b2lkCisgIExpbmUgNzIzKSBsZXNzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDcyNCkgcHJpbnRlci5wcmludCgiPCIpID09PiB2b2lkCisgIExpbmUgNzI2KSBncmVhdGVyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDcyNykgcHJpbnRlci5wcmludCgiPiIpID09PiB2b2lkCisgIExpbmUgNzI5KSBsZXNzRXF1YWxzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDczMCkgcHJpbnRlci5wcmludCgiPD0iKSA9PT4gdm9pZAorICBMaW5lIDczMikgZ3JlYXRlckVxdWFscyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA3MzMpIHByaW50ZXIucHJpbnQoIj49IikgPT0+IHZvaWQKKyAgTGluZSA3MzUpIGxTaGlmdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA3MzYpIHByaW50ZXIucHJpbnQoIjw8IikgPT0+IHZvaWQKKyAgTGluZSA3MzgpIHJTaWduZWRTaGlmdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA3MzkpIHByaW50ZXIucHJpbnQoIj4+IikgPT0+IHZvaWQKKyAgTGluZSA3NDEpIHJVbnNpZ25lZFNoaWZ0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDc0MikgcHJpbnRlci5wcmludCgiPj4+IikgPT0+IHZvaWQKKyAgTGluZSA3NDQpIHBsdXMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgNzQ1KSBwcmludGVyLnByaW50KCIrIikgPT0+IHZvaWQKKyAgTGluZSA3NDcpIG1pbnVzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDc0OCkgcHJpbnRlci5wcmludCgiLSIpID09PiB2b2lkCisgIExpbmUgNzUwKSB0aW1lcyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA3NTEpIHByaW50ZXIucHJpbnQoIioiKSA9PT4gdm9pZAorICBMaW5lIDc1MykgZGl2aWRlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDc1NCkgcHJpbnRlci5wcmludCgiLyIpID09PiB2b2lkCisgIExpbmUgNzU2KSByZW1haW5kZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgNzU3KSBwcmludGVyLnByaW50KCIlIikgPT0+IHZvaWQKKyAgTGluZSA3NjApIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDc2MSkgbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzY1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzY2KSBwcmludGVyLnByaW50KCIoIikgPT0+IHZvaWQKKyAgTGluZSA3NjcpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzY4KSBwcmludGVyLnByaW50KCIpICIpID09PiB2b2lkCisgIExpbmUgNzY5KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc3MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc3NCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3NzUpIHByaW50ZXIucHJpbnQoIi5jbGFzcyIpID09PiB2b2lkCisgIExpbmUgNzc5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzgwKSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzgxKSBwcmludGVyLnByaW50KCIgPyAiKSA9PT4gdm9pZAorICBMaW5lIDc4Mikgbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzgzKSBwcmludGVyLnByaW50KCIgOiAiKSA9PT4gdm9pZAorICBMaW5lIDc4NCkgbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzg4KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzg5KSBwcmludGVyLnByaW50KCIoIikgPT0+IHZvaWQKKyAgTGluZSA3OTApIG4uZ2V0SW5uZXIoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzkxKSBuLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3OTMpIHByaW50ZXIucHJpbnQoIikiKSA9PT4gdm9pZAorICBMaW5lIDc5NykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc5OCkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzk5KSBwcmludGVyLnByaW50KCIuIikgPT0+IHZvaWQKKyAgTGluZSA4MDApIHByaW50ZXIucHJpbnQobi5nZXRGaWVsZCgpKSA9PT4gdm9pZAorICBMaW5lIDgwNCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgwNSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4MDYpIHByaW50ZXIucHJpbnQoIiBpbnN0YW5jZW9mICIpID09PiB2b2lkCisgIExpbmUgODA3KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgxMSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgxMikgcHJpbnRlci5wcmludCgiJyIpID09PiB2b2lkCisgIExpbmUgODEzKSBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSkgPT0+IHZvaWQKKyAgTGluZSA4MTQpIHByaW50ZXIucHJpbnQoIiciKSA9PT4gdm9pZAorICBMaW5lIDgxOCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgxOSkgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpID09PiB2b2lkCisgIExpbmUgODIzKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODI0KSBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSkgPT0+IHZvaWQKKyAgTGluZSA4MjgpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4MjkpIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKSA9PT4gdm9pZAorICBMaW5lIDgzMykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgzNCkgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpID09PiB2b2lkCisgIExpbmUgODM4KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODM5KSBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSkgPT0+IHZvaWQKKyAgTGluZSA4NDMpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4NDQpIHByaW50ZXIucHJpbnQoIlwiIikgPT0+IHZvaWQKKyAgTGluZSA4NDUpIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKSA9PT4gdm9pZAorICBMaW5lIDg0NikgcHJpbnRlci5wcmludCgiXCIiKSA9PT4gdm9pZAorICBMaW5lIDg1MCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg1MSkgcHJpbnRlci5wcmludChTdHJpbmcudmFsdWVPZihuLmdldFZhbHVlKCkpKSA9PT4gdm9pZAorICBMaW5lIDg1NSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg1NikgcHJpbnRlci5wcmludCgibnVsbCIpID09PiB2b2lkCisgIExpbmUgODYwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODYxKSBuLmdldENsYXNzRXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NjIpIG4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4NjMpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gdm9pZAorICBMaW5lIDg2NSkgcHJpbnRlci5wcmludCgidGhpcyIpID09PiB2b2lkCisgIExpbmUgODY5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODcwKSBuLmdldENsYXNzRXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NzEpIG4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4NzIpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gdm9pZAorICBMaW5lIDg3NCkgcHJpbnRlci5wcmludCgic3VwZXIiKSA9PT4gdm9pZAorICBMaW5lIDg3OCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg3OSkgbi5nZXRTY29wZSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4ODApIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg4MSkgcHJpbnRlci5wcmludCgiLiIpID09PiB2b2lkCisgIExpbmUgODgzKSBwcmludFR5cGVBcmdzKG4uZ2V0VHlwZUFyZ3MoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDg4NCkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IHZvaWQKKyAgTGluZSA4ODUpIHByaW50QXJndW1lbnRzKG4uZ2V0QXJncygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODg5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODkwKSBuLmdldFNjb3BlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDg5MSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODkyKSBwcmludGVyLnByaW50KCIuIikgPT0+IHZvaWQKKyAgTGluZSA4OTUpIHByaW50ZXIucHJpbnQoIm5ldyAiKSA9PT4gdm9pZAorICBMaW5lIDg5NykgcHJpbnRUeXBlQXJncyhuLmdldFR5cGVBcmdzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4OTgpICFpc051bGxPckVtcHR5KG4uZ2V0VHlwZUFyZ3MoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA4OTkpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDkwMikgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5MDQpIHByaW50QXJndW1lbnRzKG4uZ2V0QXJncygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTA2KSBuLmdldEFub255bW91c0NsYXNzQm9keSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5MDcpIHByaW50ZXIucHJpbnRMbigiIHsiKSA9PT4gdm9pZAorICBMaW5lIDkwOCkgcHJpbnRlci5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDkwOSkgcHJpbnRNZW1iZXJzKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5MTApIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDkxMSkgcHJpbnRlci5wcmludCgifSIpID09PiB2b2lkCisgIExpbmUgOTE2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTE3KSBuLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA5MTgpIHBvc2l0aXZlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgOTE5KSBwcmludGVyLnByaW50KCIrIikgPT0+IHZvaWQKKyAgTGluZSA5MjEpIG5lZ2F0aXZlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgOTIyKSBwcmludGVyLnByaW50KCItIikgPT0+IHZvaWQKKyAgTGluZSA5MjQpIGludmVyc2UgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA5MjUpIHByaW50ZXIucHJpbnQoIn4iKSA9PT4gdm9pZAorICBMaW5lIDkyNykgbm90ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgOTI4KSBwcmludGVyLnByaW50KCIhIikgPT0+IHZvaWQKKyAgTGluZSA5MzApIHByZUluY3JlbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDkzMSkgcHJpbnRlci5wcmludCgiKysiKSA9PT4gdm9pZAorICBMaW5lIDkzMykgcHJlRGVjcmVtZW50ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgOTM0KSBwcmludGVyLnByaW50KCItLSIpID09PiB2b2lkCisgIExpbmUgOTM5KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDk0MSkgbi5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yCisgIExpbmUgOTQyKSBwb3NJbmNyZW1lbnQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuT3BlcmF0b3IKKyAgTGluZSA5NDMpIHByaW50ZXIucHJpbnQoIisrIikgPT0+IHZvaWQKKyAgTGluZSA5NDUpIHBvc0RlY3JlbWVudCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5PcGVyYXRvcgorICBMaW5lIDk0NikgcHJpbnRlci5wcmludCgiLS0iKSA9PT4gdm9pZAorICBMaW5lIDk1MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDk1NCkgcHJpbnRKYXZhZG9jKG4uZ2V0SmF2YURvYygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTU1KSBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDk1NikgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSkgPT0+IHZvaWQKKyAgTGluZSA5NTgpIHByaW50VHlwZVBhcmFtZXRlcnMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTU5KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDk2MCkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgOTYyKSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gdm9pZAorICBMaW5lIDk2NCkgcHJpbnRlci5wcmludCgiKCIpID09PiB2b2lkCisgIExpbmUgOTY1KSBuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTY2KSBmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSA5NjYpIG4uZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDk2NikgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSA5NjcpIGZpbmFsIFBhcmFtZXRlciBwID0gaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSA5NjcpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgOTY4KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTY5KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDk3MCkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gdm9pZAorICBMaW5lIDk3NCkgcHJpbnRlci5wcmludCgiKSIpID09PiB2b2lkCisgIExpbmUgOTc2KSAhaXNOdWxsT3JFbXB0eShuLmdldFRocm93cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDk3NykgcHJpbnRlci5wcmludCgiIHRocm93cyAiKSA9PT4gdm9pZAorICBMaW5lIDk3OCkgZmluYWwgSXRlcmF0b3I8TmFtZUV4cHI+IGkgPSBuLmdldFRocm93cygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgOTc4KSBuLmdldFRocm93cygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgOTc4KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDk3OSkgZmluYWwgTmFtZUV4cHIgbmFtZSA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA5NzkpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA5ODApIG5hbWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5ODEpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgOTgyKSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgOTg2KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSA5ODcpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDk5MSkgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobikgPT0+IHZvaWQKKyAgTGluZSA5OTMpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5OTQpIHByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDk5NSkgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA5OTYpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiB2b2lkCisgIExpbmUgOTk3KSBuLmlzRGVmYXVsdCgpID09PiBib29sZWFuCisgIExpbmUgOTk4KSBwcmludGVyLnByaW50KCJkZWZhdWx0ICIpID09PiB2b2lkCisgIExpbmUgMTAwMCkgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDAxKSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwMDIpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDEwMDUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTAwNikgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgMTAwNykgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IHZvaWQKKyAgTGluZSAxMDA5KSBwcmludGVyLnByaW50KCIoIikgPT0+IHZvaWQKKyAgTGluZSAxMDEwKSBuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTAxMSkgZmluYWwgSXRlcmF0b3I8UGFyYW1ldGVyPiBpID0gbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTAxMSkgbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTAxMSkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDEyKSBmaW5hbCBQYXJhbWV0ZXIgcCA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMTAxMikgaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSAxMDEzKSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTAxNCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDE1KSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMTAxOSkgcHJpbnRlci5wcmludCgiKSIpID09PiB2b2lkCisgIExpbmUgMTAyMSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSAxMDIxKSAwID09PiBpbnQKKyAgTGluZSAxMDIxKSBpIDwgbi5nZXRBcnJheUNvdW50KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDIxKSBpKysgPT0+IGludAorICBMaW5lIDEwMjIpIHByaW50ZXIucHJpbnQoIltdIikgPT0+IHZvaWQKKyAgTGluZSAxMDI1KSAhaXNOdWxsT3JFbXB0eShuLmdldFRocm93cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwMjYpIHByaW50ZXIucHJpbnQoIiB0aHJvd3MgIikgPT0+IHZvaWQKKyAgTGluZSAxMDI3KSBmaW5hbCBJdGVyYXRvcjxOYW1lRXhwcj4gaSA9IG4uZ2V0VGhyb3dzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSAxMDI3KSBuLmdldFRocm93cygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMTAyNykgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDI4KSBmaW5hbCBOYW1lRXhwciBuYW1lID0gaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDEwMjgpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAxMDI5KSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTAzMCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDMxKSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMTAzNSkgbi5nZXRCb2R5KCkgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwMzYpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gdm9pZAorICBMaW5lIDEwMzgpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDEwMzkpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA0NCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEwNDUpIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA0NikgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSkgPT0+IHZvaWQKKyAgTGluZSAxMDQ3KSBuLmdldFR5cGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA0OCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDUwKSBuLmlzVmFyQXJncygpID09PiBib29sZWFuCisgIExpbmUgMTA1MSkgcHJpbnRlci5wcmludCgiLi4uIikgPT0+IHZvaWQKKyAgTGluZSAxMDUzKSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSAxMDU0KSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDU4KSBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEwNTkpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiB2b2lkCisgIExpbmUgMTA2MSkgSXRlcmF0b3I8VHlwZT4gdHlwZXMgPSBuLmdldFR5cGVzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDEwNjEpIG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgMTA2MikgdHlwZXMubmV4dCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA2MykgdHlwZXMuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMTA2NCkgcHJpbnRlci5wcmludCgiIHwgIikgPT0+IHZvaWQKKyAgTGluZSAxMDY1KSB0eXBlcy5uZXh0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDY4KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSAxMDY5KSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDczKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA3NCkgbi5pc1RoaXMoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwNzUpIHByaW50VHlwZUFyZ3Mobi5nZXRUeXBlQXJncygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA3NikgcHJpbnRlci5wcmludCgidGhpcyIpID09PiB2b2lkCisgIExpbmUgMTA3OCkgbi5nZXRFeHByKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwNzkpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA4MCkgcHJpbnRlci5wcmludCgiLiIpID09PiB2b2lkCisgIExpbmUgMTA4MikgcHJpbnRUeXBlQXJncyhuLmdldFR5cGVBcmdzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDgzKSBwcmludGVyLnByaW50KCJzdXBlciIpID09PiB2b2lkCisgIExpbmUgMTA4NSkgcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDg2KSBwcmludGVyLnByaW50KCI7IikgPT0+IHZvaWQKKyAgTGluZSAxMDkwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA5MSkgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDkyKSBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKSA9PT4gdm9pZAorICBMaW5lIDEwOTQpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTA5NSkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgMTA5NykgZmluYWwgSXRlcmF0b3I8VmFyaWFibGVEZWNsYXJhdG9yPiBpID0gbi5nZXRWYXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgMTA5Nykgbi5nZXRWYXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgMTA5NykgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDk4KSBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdiA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgMTA5OCkgaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IKKyAgTGluZSAxMDk5KSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTEwMCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTAxKSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMTEwNykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExMDgpIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMTEyKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTExMykgcHJpbnRlci5wcmludCgiYXNzZXJ0ICIpID09PiB2b2lkCisgIExpbmUgMTExNCkgbi5nZXRDaGVjaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTExNSkgbi5nZXRNZXNzYWdlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExMTYpIHByaW50ZXIucHJpbnQoIiA6ICIpID09PiB2b2lkCisgIExpbmUgMTExNykgbi5nZXRNZXNzYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMTE5KSBwcmludGVyLnByaW50KCI7IikgPT0+IHZvaWQKKyAgTGluZSAxMTIzKSBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKSA9PT4gdm9pZAorICBMaW5lIDExMjQpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMTI1KSBwcmludGVyLnByaW50TG4oInsiKSA9PT4gdm9pZAorICBMaW5lIDExMjYpIG4uZ2V0U3RtdHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTEyNykgcHJpbnRlci5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDExMjgpIGZpbmFsIFN0YXRlbWVudCBzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTEyOCkgbi5nZXRTdG10cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PgorICBMaW5lIDExMjkpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMTMwKSBwcmludGVyLnByaW50TG4oKSA9PT4gdm9pZAorICBMaW5lIDExMzIpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDExMzQpIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobikgPT0+IHZvaWQKKyAgTGluZSAxMTM1KSBwcmludGVyLnByaW50KCJ9IikgPT0+IHZvaWQKKyAgTGluZSAxMTQwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE0MSkgcHJpbnRlci5wcmludChuLmdldExhYmVsKCkpID09PiB2b2lkCisgIExpbmUgMTE0MikgcHJpbnRlci5wcmludCgiOiAiKSA9PT4gdm9pZAorICBMaW5lIDExNDMpIG4uZ2V0U3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE0NykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNDgpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gdm9pZAorICBMaW5lIDExNTIpIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pID09PiB2b2lkCisgIExpbmUgMTE1MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNTQpIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE1NSkgcHJpbnRlci5wcmludCgiOyIpID09PiB2b2lkCisgIExpbmUgMTE1OSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNjApIHByaW50ZXIucHJpbnQoInN3aXRjaCgiKSA9PT4gdm9pZAorICBMaW5lIDExNjEpIG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNjIpIHByaW50ZXIucHJpbnRMbigiKSB7IikgPT0+IHZvaWQKKyAgTGluZSAxMTYzKSBuLmdldEVudHJpZXMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE2NCkgcHJpbnRlci5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDExNjUpIGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10CisgIExpbmUgMTE2NSkgbi5nZXRFbnRyaWVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+CisgIExpbmUgMTE2NikgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNjgpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDExNzApIHByaW50ZXIucHJpbnQoIn0iKSA9PT4gdm9pZAorICBMaW5lIDExNzUpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMTc2KSBuLmdldExhYmVsKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNzcpIHByaW50ZXIucHJpbnQoImNhc2UgIikgPT0+IHZvaWQKKyAgTGluZSAxMTc4KSBuLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMTc5KSBwcmludGVyLnByaW50KCI6IikgPT0+IHZvaWQKKyAgTGluZSAxMTgxKSBwcmludGVyLnByaW50KCJkZWZhdWx0OiIpID09PiB2b2lkCisgIExpbmUgMTE4MykgcHJpbnRlci5wcmludExuKCkgPT0+IHZvaWQKKyAgTGluZSAxMTg0KSBwcmludGVyLmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMTE4NSkgbi5nZXRTdG10cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTg2KSBmaW5hbCBTdGF0ZW1lbnQgcyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDExODYpIG4uZ2V0U3RtdHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSAxMTg3KSBzLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE4OCkgcHJpbnRlci5wcmludExuKCkgPT0+IHZvaWQKKyAgTGluZSAxMTkxKSBwcmludGVyLnVuaW5kZW50KCkgPT0+IHZvaWQKKyAgTGluZSAxMTk1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE5NikgcHJpbnRlci5wcmludCgiYnJlYWsiKSA9PT4gdm9pZAorICBMaW5lIDExOTcpIG4uZ2V0SWQoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE5OCkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgMTE5OSkgcHJpbnRlci5wcmludChuLmdldElkKCkpID09PiB2b2lkCisgIExpbmUgMTIwMSkgcHJpbnRlci5wcmludCgiOyIpID09PiB2b2lkCisgIExpbmUgMTIwNSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEyMDYpIHByaW50ZXIucHJpbnQoInJldHVybiIpID09PiB2b2lkCisgIExpbmUgMTIwNykgbi5nZXRFeHByKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyMDgpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDEyMDkpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTIxMSkgcHJpbnRlci5wcmludCgiOyIpID09PiB2b2lkCisgIExpbmUgMTIxNSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEyMTYpIHByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEyMTcpIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTIxOCkgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSkgPT0+IHZvaWQKKyAgTGluZSAxMjIwKSBwcmludGVyLnByaW50KCJlbnVtICIpID09PiB2b2lkCisgIExpbmUgMTIyMSkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IHZvaWQKKyAgTGluZSAxMjIzKSBuLmdldEltcGxlbWVudHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIyNCkgcHJpbnRlci5wcmludCgiIGltcGxlbWVudHMgIikgPT0+IHZvaWQKKyAgTGluZSAxMjI1KSBmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMTIyNSkgbi5nZXRJbXBsZW1lbnRzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAxMjI1KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyMjYpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMTIyNikgaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDEyMjcpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjI4KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyMjkpIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IHZvaWQKKyAgTGluZSAxMjM0KSBwcmludGVyLnByaW50TG4oIiB7IikgPT0+IHZvaWQKKyAgTGluZSAxMjM1KSBwcmludGVyLmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMTIzNikgbi5nZXRFbnRyaWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyMzcpIHByaW50ZXIucHJpbnRMbigpID09PiB2b2lkCisgIExpbmUgMTIzOCkgZmluYWwgSXRlcmF0b3I8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGkgPSBuLmdldEVudHJpZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uPgorICBMaW5lIDEyMzgpIG4uZ2V0RW50cmllcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24+CisgIExpbmUgMTIzOCkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjM5KSBmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlID0gaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbgorICBMaW5lIDEyMzkpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24KKyAgTGluZSAxMjQwKSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI0MSkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjQyKSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMTI0Nikgbi5nZXRNZW1iZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNDcpIHByaW50ZXIucHJpbnRMbigiOyIpID09PiB2b2lkCisgIExpbmUgMTI0OCkgcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI1MCkgbi5nZXRFbnRyaWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNTEpIHByaW50ZXIucHJpbnRMbigpID09PiB2b2lkCisgIExpbmUgMTI1NCkgcHJpbnRlci51bmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMTI1NSkgcHJpbnRlci5wcmludCgifSIpID09PiB2b2lkCisgIExpbmUgMTI1OSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEyNjApIHByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEyNjEpIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI2MikgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IHZvaWQKKyAgTGluZSAxMjY0KSBuLmdldEFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTI2NSkgcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjY4KSBuLmdldENsYXNzQm9keSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjY5KSBwcmludGVyLnByaW50TG4oIiB7IikgPT0+IHZvaWQKKyAgTGluZSAxMjcwKSBwcmludGVyLmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMTI3MSkgcHJpbnRNZW1iZXJzKG4uZ2V0Q2xhc3NCb2R5KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjcyKSBwcmludGVyLnVuaW5kZW50KCkgPT0+IHZvaWQKKyAgTGluZSAxMjczKSBwcmludGVyLnByaW50TG4oIn0iKSA9PT4gdm9pZAorICBMaW5lIDEyNzgpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjc5KSBwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjgwKSBwcmludGVyLnByaW50KCI7IikgPT0+IHZvaWQKKyAgTGluZSAxMjg0KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI4NSkgcHJpbnRKYXZhZG9jKG4uZ2V0SmF2YURvYygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI4Nikgbi5pc1N0YXRpYygpID09PiBib29sZWFuCisgIExpbmUgMTI4NykgcHJpbnRlci5wcmludCgic3RhdGljICIpID09PiB2b2lkCisgIExpbmUgMTI4OSkgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI5MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEyOTQpIHByaW50ZXIucHJpbnQoImlmICgiKSA9PT4gdm9pZAorICBMaW5lIDEyOTUpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjk2KSBmaW5hbCBib29sZWFuIHRoZW5CbG9jayA9IG4uZ2V0VGhlblN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdCA9PT4gYm9vbGVhbgorICBMaW5lIDEyOTYpIG4uZ2V0VGhlblN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdCA9PT4gYm9vbGVhbgorICBMaW5lIDEyOTcpIC8vIGJsb2NrIHN0YXRlbWVudCBzaG91bGQgc3RhcnQgb24gdGhlIHNhbWUgbGluZQordGhlbkJsb2NrID09PiBib29sZWFuCisgIExpbmUgMTI5OCkgcHJpbnRlci5wcmludCgiKSAiKSA9PT4gdm9pZAorICBMaW5lIDEzMDApIHByaW50ZXIucHJpbnRMbigiKSIpID09PiB2b2lkCisgIExpbmUgMTMwMSkgcHJpbnRlci5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDEzMDMpIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzMDQpICF0aGVuQmxvY2sgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzA1KSBwcmludGVyLnVuaW5kZW50KCkgPT0+IHZvaWQKKyAgTGluZSAxMzA2KSBuLmdldEVsc2VTdG10KCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMDcpIHRoZW5CbG9jayA9PT4gYm9vbGVhbgorICBMaW5lIDEzMDgpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gdm9pZAorICBMaW5lIDEzMTApIHByaW50ZXIucHJpbnRMbigpID09PiB2b2lkCisgIExpbmUgMTMxMSkgZmluYWwgYm9vbGVhbiBlbHNlSWYgPSBuLmdldEVsc2VTdG10KCkgaW5zdGFuY2VvZiBJZlN0bXQgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzExKSBuLmdldEVsc2VTdG10KCkgaW5zdGFuY2VvZiBJZlN0bXQgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzEyKSBmaW5hbCBib29sZWFuIGVsc2VCbG9jayA9IG4uZ2V0RWxzZVN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMTIpIG4uZ2V0RWxzZVN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMTMpIC8vIHB1dCBjaGFpbmVkIGlmIGFuZCBzdGFydCBvZiBibG9jayBzdGF0ZW1lbnQgb24gYSBzYW1lIGxldmVsCitlbHNlSWYgfHwgZWxzZUJsb2NrID09PiBib29sZWFuCisgIExpbmUgMTMxNCkgcHJpbnRlci5wcmludCgiZWxzZSAiKSA9PT4gdm9pZAorICBMaW5lIDEzMTYpIHByaW50ZXIucHJpbnRMbigiZWxzZSIpID09PiB2b2lkCisgIExpbmUgMTMxNykgcHJpbnRlci5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDEzMTkpIG4uZ2V0RWxzZVN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzMjApICEoZWxzZUlmIHx8IGVsc2VCbG9jaykgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzIxKSBwcmludGVyLnVuaW5kZW50KCkgPT0+IHZvaWQKKyAgTGluZSAxMzI2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTMyNykgcHJpbnRlci5wcmludCgid2hpbGUgKCIpID09PiB2b2lkCisgIExpbmUgMTMyOCkgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzMjkpIHByaW50ZXIucHJpbnQoIikgIikgPT0+IHZvaWQKKyAgTGluZSAxMzMwKSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzMzQpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzM1KSBwcmludGVyLnByaW50KCJjb250aW51ZSIpID09PiB2b2lkCisgIExpbmUgMTMzNikgbi5nZXRJZCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzM3KSBwcmludGVyLnByaW50KCIgIikgPT0+IHZvaWQKKyAgTGluZSAxMzM4KSBwcmludGVyLnByaW50KG4uZ2V0SWQoKSkgPT0+IHZvaWQKKyAgTGluZSAxMzQwKSBwcmludGVyLnByaW50KCI7IikgPT0+IHZvaWQKKyAgTGluZSAxMzQ0KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTM0NSkgcHJpbnRlci5wcmludCgiZG8gIikgPT0+IHZvaWQKKyAgTGluZSAxMzQ2KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzNDcpIHByaW50ZXIucHJpbnQoIiB3aGlsZSAoIikgPT0+IHZvaWQKKyAgTGluZSAxMzQ4KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTM0OSkgcHJpbnRlci5wcmludCgiKTsiKSA9PT4gdm9pZAorICBMaW5lIDEzNTMpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzU0KSBwcmludGVyLnByaW50KCJmb3IgKCIpID09PiB2b2lkCisgIExpbmUgMTM1NSkgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTM1NikgcHJpbnRlci5wcmludCgiIDogIikgPT0+IHZvaWQKKyAgTGluZSAxMzU3KSBuLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzU4KSBwcmludGVyLnByaW50KCIpICIpID09PiB2b2lkCisgIExpbmUgMTM1OSkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzYzKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTM2NCkgcHJpbnRlci5wcmludCgiZm9yICgiKSA9PT4gdm9pZAorICBMaW5lIDEzNjUpIG4uZ2V0SW5pdCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzY2KSBmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRJbml0KCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDEzNjYpIG4uZ2V0SW5pdCgpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxMzY2KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNjcpIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEzNjcpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEzNjgpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzY5KSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNzApIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IHZvaWQKKyAgTGluZSAxMzc0KSBwcmludGVyLnByaW50KCI7ICIpID09PiB2b2lkCisgIExpbmUgMTM3NSkgbi5nZXRDb21wYXJlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzNzYpIG4uZ2V0Q29tcGFyZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTM3OCkgcHJpbnRlci5wcmludCgiOyAiKSA9PT4gdm9pZAorICBMaW5lIDEzNzkpIG4uZ2V0VXBkYXRlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzODApIGZpbmFsIEl0ZXJhdG9yPEV4cHJlc3Npb24+IGkgPSBuLmdldFVwZGF0ZSgpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxMzgwKSBuLmdldFVwZGF0ZSgpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxMzgwKSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzODEpIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEzODEpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEzODIpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzgzKSBpLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzODQpIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IHZvaWQKKyAgTGluZSAxMzg4KSBwcmludGVyLnByaW50KCIpICIpID09PiB2b2lkCisgIExpbmUgMTM4OSkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzkzKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTM5NCkgcHJpbnRlci5wcmludCgidGhyb3cgIikgPT0+IHZvaWQKKyAgTGluZSAxMzk1KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzOTYpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gdm9pZAorICBMaW5lIDE0MDApIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDAxKSBwcmludGVyLnByaW50KCJzeW5jaHJvbml6ZWQgKCIpID09PiB2b2lkCisgIExpbmUgMTQwMikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDAzKSBwcmludGVyLnByaW50KCIpICIpID09PiB2b2lkCisgIExpbmUgMTQwNCkgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQwOCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0MDkpIHByaW50ZXIucHJpbnQoInRyeSAiKSA9PT4gdm9pZAorICBMaW5lIDE0MTApICFuLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MTEpIHByaW50ZXIucHJpbnQoIigiKSA9PT4gdm9pZAorICBMaW5lIDE0MTIpIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiByZXNvdXJjZXMgPSBuLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+CisgIExpbmUgMTQxMikgbi5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByPgorICBMaW5lIDE0MTMpIGJvb2xlYW4gZmlyc3QgPSB0cnVlID09PiBib29sZWFuCisgIExpbmUgMTQxMykgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MTQpIHJlc291cmNlcy5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDE1KSB2aXNpdChyZXNvdXJjZXMubmV4dCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQxNikgcmVzb3VyY2VzLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MTcpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gdm9pZAorICBMaW5lIDE0MTgpIHByaW50ZXIucHJpbnRMbigpID09PiB2b2lkCisgIExpbmUgMTQxOSkgZmlyc3QgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDIwKSBwcmludGVyLmluZGVudCgpID09PiB2b2lkCisgIExpbmUgMTQyMykgZmlyc3QgPSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MjUpIG4uZ2V0UmVzb3VyY2VzKCkuc2l6ZSgpID4gMSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MjYpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDE0MjgpIHByaW50ZXIucHJpbnQoIikgIikgPT0+IHZvaWQKKyAgTGluZSAxNDMwKSBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDMxKSBuLmdldENhdGNocygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDMyKSBmaW5hbCBDYXRjaENsYXVzZSBjID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UKKyAgTGluZSAxNDMyKSBuLmdldENhdGNocygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U+CisgIExpbmUgMTQzMykgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0MzYpIG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0MzcpIHByaW50ZXIucHJpbnQoIiBmaW5hbGx5ICIpID09PiB2b2lkCisgIExpbmUgMTQzOCkgbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0NDMpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDQ0KSBwcmludGVyLnByaW50KCIgY2F0Y2ggKCIpID09PiB2b2lkCisgIExpbmUgMTQ0NSkgbi5nZXRFeGNlcHQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0NDYpIHByaW50ZXIucHJpbnQoIikgIikgPT0+IHZvaWQKKyAgTGluZSAxNDQ3KSBuLmdldENhdGNoQmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0NTIpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDUzKSBwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDU0KSBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0NTUpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiB2b2lkCisgIExpbmUgMTQ1NykgcHJpbnRlci5wcmludCgiQGludGVyZmFjZSAiKSA9PT4gdm9pZAorICBMaW5lIDE0NTgpIHByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpID09PiB2b2lkCisgIExpbmUgMTQ1OSkgcHJpbnRlci5wcmludExuKCIgeyIpID09PiB2b2lkCisgIExpbmUgMTQ2MCkgcHJpbnRlci5pbmRlbnQoKSA9PT4gdm9pZAorICBMaW5lIDE0NjEpIG4uZ2V0TWVtYmVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDYyKSBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDY0KSBwcmludGVyLnVuaW5kZW50KCkgPT0+IHZvaWQKKyAgTGluZSAxNDY1KSBwcmludGVyLnByaW50KCJ9IikgPT0+IHZvaWQKKyAgTGluZSAxNDY5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ3MCkgcHJpbnRKYXZhZG9jKG4uZ2V0SmF2YURvYygpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ3MSkgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDcyKSBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKSA9PT4gdm9pZAorICBMaW5lIDE0NzQpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ3NSkgcHJpbnRlci5wcmludCgiICIpID09PiB2b2lkCisgIExpbmUgMTQ3NikgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IHZvaWQKKyAgTGluZSAxNDc3KSBwcmludGVyLnByaW50KCIoKSIpID09PiB2b2lkCisgIExpbmUgMTQ3OCkgbi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQ3OSkgcHJpbnRlci5wcmludCgiIGRlZmF1bHQgIikgPT0+IHZvaWQKKyAgTGluZSAxNDgwKSBuLmdldERlZmF1bHRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ4MikgcHJpbnRlci5wcmludCgiOyIpID09PiB2b2lkCisgIExpbmUgMTQ4NikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0ODcpIHByaW50ZXIucHJpbnQoIkAiKSA9PT4gdm9pZAorICBMaW5lIDE0ODgpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ5MikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0OTMpIHByaW50ZXIucHJpbnQoIkAiKSA9PT4gdm9pZAorICBMaW5lIDE0OTQpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ5NSkgcHJpbnRlci5wcmludCgiKCIpID09PiB2b2lkCisgIExpbmUgMTQ5Nikgbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ5NykgcHJpbnRlci5wcmludCgiKSIpID09PiB2b2lkCisgIExpbmUgMTUwMSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1MDIpIHByaW50ZXIucHJpbnQoIkAiKSA9PT4gdm9pZAorICBMaW5lIDE1MDMpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTUwNCkgcHJpbnRlci5wcmludCgiKCIpID09PiB2b2lkCisgIExpbmUgMTUwNSkgbi5nZXRQYWlycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTA2KSBmaW5hbCBJdGVyYXRvcjxNZW1iZXJWYWx1ZVBhaXI+IGkgPSBuLmdldFBhaXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXI+CisgIExpbmUgMTUwNikgbi5nZXRQYWlycygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyPgorICBMaW5lIDE1MDYpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMTUwNykgZmluYWwgTWVtYmVyVmFsdWVQYWlyIG0gPSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcgorICBMaW5lIDE1MDcpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyCisgIExpbmUgMTUwOCkgbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1MDkpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMTUxMCkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gdm9pZAorICBMaW5lIDE1MTQpIHByaW50ZXIucHJpbnQoIikiKSA9PT4gdm9pZAorICBMaW5lIDE1MTgpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNTE5KSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gdm9pZAorICBMaW5lIDE1MjApIHByaW50ZXIucHJpbnQoIiA9ICIpID09PiB2b2lkCisgIExpbmUgMTUyMSkgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTUyNSkgIXRoaXMucHJpbnRDb21tZW50cyA9PT4gYm9vbGVhbgorICBMaW5lIDE1MjgpIHByaW50ZXIucHJpbnQoIi8vIikgPT0+IHZvaWQKKyAgTGluZSAxNTI5KSBTdHJpbmcgdG1wID0gbi5nZXRDb250ZW50KCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAxNTI5KSBuLmdldENvbnRlbnQoKSA9PT4gamF2YS5sYW5nLlN0cmluZworICBMaW5lIDE1MzApIHRtcCA9IHRtcC5yZXBsYWNlKCdccicsICcgJykgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAxNTMxKSB0bXAgPSB0bXAucmVwbGFjZSgnXG4nLCAnICcpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTUzMikgcHJpbnRlci5wcmludExuKHRtcCkgPT0+IHZvaWQKKyAgTGluZSAxNTM2KSAhdGhpcy5wcmludENvbW1lbnRzID09PiBib29sZWFuCisgIExpbmUgMTUzOSkgcHJpbnRlci5wcmludCgiLyoiKSA9PT4gdm9pZAorICBMaW5lIDE1NDApIHByaW50ZXIucHJpbnQobi5nZXRDb250ZW50KCkpID09PiB2b2lkCisgIExpbmUgMTU0MSkgcHJpbnRlci5wcmludExuKCIqLyIpID09PiB2b2lkCisgIExpbmUgMTU0NikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1NDgpIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTU0OCkgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMTU0OSkgYm9vbGVhbiBwcmludFBhciA9IGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTU0OSkgZmFsc2UgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTUwKSBwcmludFBhciA9IG4uaXNQYXJhbWV0ZXJzRW5jbG9zZWQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDE1NTIpIHByaW50UGFyID09PiBib29sZWFuCisgIExpbmUgMTU1MykgcHJpbnRlci5wcmludCgiKCIpID09PiB2b2lkCisgIExpbmUgMTU1NSkgcGFyYW1ldGVycyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTU1NikgSXRlcmF0b3I8UGFyYW1ldGVyPiBpID0gcGFyYW1ldGVycy5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxNTU2KSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDE1NTYpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMTU1NykgUGFyYW1ldGVyIHAgPSBpLm5leHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcgorICBMaW5lIDE1NTcpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgMTU1OCkgcC5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1NTkpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMTU2MCkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gdm9pZAorICBMaW5lIDE1NjQpIHByaW50UGFyID09PiBib29sZWFuCisgIExpbmUgMTU2NSkgcHJpbnRlci5wcmludCgiKSIpID09PiB2b2lkCisgIExpbmUgMTU2OCkgcHJpbnRlci5wcmludCgiIC0+ICIpID09PiB2b2lkCisgIExpbmUgMTU2OSkgU3RhdGVtZW50IGJvZHkgPSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDE1NjkpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTU3MCkgYm9keSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdG10ID09PiBib29sZWFuCisgIExpbmUgMTU3MikgKChFeHByZXNzaW9uU3RtdCkgYm9keSkuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTU3NCkgYm9keS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1ODEpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNTgyKSBFeHByZXNzaW9uIHNjb3BlID0gbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDE1ODIpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxNTgzKSBTdHJpbmcgaWRlbnRpZmllciA9IG4uZ2V0SWRlbnRpZmllcigpID09PiBqYXZhLmxhbmcuU3RyaW5nCisgIExpbmUgMTU4Mykgbi5nZXRJZGVudGlmaWVyKCkgPT0+IGphdmEubGFuZy5TdHJpbmcKKyAgTGluZSAxNTg0KSBzY29wZSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTU4NSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTU4OCkgcHJpbnRlci5wcmludCgiOjoiKSA9PT4gdm9pZAorICBMaW5lIDE1ODkpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTU5MCkgcHJpbnRlci5wcmludCgiPCIpID09PiB2b2lkCisgIExpbmUgMTU5MSkgSXRlcmF0b3I8VHlwZVBhcmFtZXRlcj4gaSA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDE1OTEpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDE1OTEpIGkuaGFzTmV4dCgpID09PiBib29sZWFuCisgIExpbmUgMTU5MykgVHlwZVBhcmFtZXRlciBwID0gaS5uZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcgorICBMaW5lIDE1OTMpIGkubmV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSAxNTk0KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTU5NSkgaS5oYXNOZXh0KCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTk2KSBwcmludGVyLnByaW50KCIsICIpID09PiB2b2lkCisgIExpbmUgMTU5OSkgcHJpbnRlci5wcmludCgiPiIpID09PiB2b2lkCisgIExpbmUgMTYwMSkgaWRlbnRpZmllciAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTYwMikgcHJpbnRlci5wcmludChpZGVudGlmaWVyKSA9PT4gdm9pZAorICBMaW5lIDE2MDkpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNjEwKSBuLmdldFR5cGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTYxMSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNjE2KSBub2RlIGluc3RhbmNlb2YgQ29tbWVudCA9PT4gYm9vbGVhbgorICBMaW5lIDE2MTgpIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDE2MTgpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAxNjE5KSBwYXJlbnQgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE2MjApIExpc3Q8Tm9kZT4gZXZlcnl0aGluZyA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSAxNjIwKSBuZXcgTGlua2VkTGlzdDxOb2RlPigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+CisgIExpbmUgMTYyMSkgZXZlcnl0aGluZy5hZGRBbGwocGFyZW50LmdldENoaWxkcmVuTm9kZXMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjIyKSBzb3J0QnlCZWdpblBvc2l0aW9uKGV2ZXJ5dGhpbmcpID09PiB2b2lkCisgIExpbmUgMTYyMykgaW50IHBvc2l0aW9uT2ZUaGVDaGlsZCA9IC0xID09PiBpbnQKKyAgTGluZSAxNjIzKSAtMSA9PT4gaW50CisgIExpbmUgMTYyNCkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSAxNjI0KSAwID09PiBpbnQKKyAgTGluZSAxNjI0KSBpIDwgZXZlcnl0aGluZy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjI0KSBpKysgPT0+IGludAorICBMaW5lIDE2MjUpIGV2ZXJ5dGhpbmcuZ2V0KGkpID09IG5vZGUgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjI1KSBwb3NpdGlvbk9mVGhlQ2hpbGQgPSBpID09PiBpbnQKKyAgTGluZSAxNjI3KSBwb3NpdGlvbk9mVGhlQ2hpbGQgPT0gLTEgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjI3KSBuZXcgUnVudGltZUV4Y2VwdGlvbigiTXkgaW5kZXggbm90IGZvdW5kISEhICIgKyBub2RlKSA9PT4gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgTGluZSAxNjI4KSBpbnQgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgPSAtMSA9PT4gaW50CisgIExpbmUgMTYyOCkgLTEgPT0+IGludAorICBMaW5lIDE2MjkpIGludCBpID0gcG9zaXRpb25PZlRoZUNoaWxkIC0gMSA9PT4gaW50CisgIExpbmUgMTYyOSkgcG9zaXRpb25PZlRoZUNoaWxkIC0gMSA9PT4gaW50CisgIExpbmUgMTYyOSkgaSA+PSAwICYmIHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID09IC0xID09PiBib29sZWFuCisgIExpbmUgMTYyOSkgaS0tID09PiBpbnQKKyAgTGluZSAxNjMwKSAhKGV2ZXJ5dGhpbmcuZ2V0KGkpIGluc3RhbmNlb2YgQ29tbWVudCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjMwKSBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCA9IGkgPT0+IGludAorICBMaW5lIDE2MzIpIGludCBpID0gcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgKyAxID09PiBpbnQKKyAgTGluZSAxNjMyKSBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCArIDEgPT0+IGludAorICBMaW5lIDE2MzIpIGkgPCBwb3NpdGlvbk9mVGhlQ2hpbGQgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjMyKSBpKysgPT0+IGludAorICBMaW5lIDE2MzMpIE5vZGUgbm9kZVRvUHJpbnQgPSBldmVyeXRoaW5nLmdldChpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgMTYzMykgZXZlcnl0aGluZy5nZXQoaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDE2MzQpICEobm9kZVRvUHJpbnQgaW5zdGFuY2VvZiBDb21tZW50KSA9PT4gYm9vbGVhbgorICBMaW5lIDE2MzQpIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBjb21tZW50LCBpbnN0ZWFkICIgKyBub2RlVG9QcmludC5nZXRDbGFzcygpICsgIi4gUG9zaXRpb24gb2YgcHJldmlvdXMgY2hpbGQ6ICIgKyBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCArICIsIHBvc2l0aW9uIG9mIGNoaWxkICIgKyBwb3NpdGlvbk9mVGhlQ2hpbGQpID09PiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgorICBMaW5lIDE2MzUpIG5vZGVUb1ByaW50LmFjY2VwdCh0aGlzLCBudWxsKSA9PT4gdm9pZAorICBMaW5lIDE2NDEpIExpc3Q8Tm9kZT4gZXZlcnl0aGluZyA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4KKyAgTGluZSAxNjQxKSBuZXcgTGlua2VkTGlzdDxOb2RlPigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+CisgIExpbmUgMTY0MikgZXZlcnl0aGluZy5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkpID09PiBib29sZWFuCisgIExpbmUgMTY0Mykgc29ydEJ5QmVnaW5Qb3NpdGlvbihldmVyeXRoaW5nKSA9PT4gdm9pZAorICBMaW5lIDE2NDQpIGV2ZXJ5dGhpbmcuc2l6ZSgpID09IDAgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjQ2KSBpbnQgY29tbWVudHNBdEVuZCA9IDAgPT0+IGludAorICBMaW5lIDE2NDYpIDAgPT0+IGludAorICBMaW5lIDE2NDcpIGJvb2xlYW4gZmluZGluZ0NvbW1lbnRzID0gdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDE2NDcpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxNjQ4KSBmaW5kaW5nQ29tbWVudHMgJiYgY29tbWVudHNBdEVuZCA8IGV2ZXJ5dGhpbmcuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgMTY0OSkgTm9kZSBsYXN0ID0gZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSAxIC0gY29tbWVudHNBdEVuZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZQorICBMaW5lIDE2NDkpIGV2ZXJ5dGhpbmcuZ2V0KGV2ZXJ5dGhpbmcuc2l6ZSgpIC0gMSAtIGNvbW1lbnRzQXRFbmQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSAxNjUwKSBmaW5kaW5nQ29tbWVudHMgPSAobGFzdCBpbnN0YW5jZW9mIENvbW1lbnQpID09PiBib29sZWFuCisgIExpbmUgMTY1MSkgZmluZGluZ0NvbW1lbnRzID09PiBib29sZWFuCisgIExpbmUgMTY1MSkgY29tbWVudHNBdEVuZCsrID09PiBpbnQKKyAgTGluZSAxNjUzKSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDE2NTMpIDAgPT0+IGludAorICBMaW5lIDE2NTMpIGkgPCBjb21tZW50c0F0RW5kID09PiBib29sZWFuCisgIExpbmUgMTY1MykgaSsrID09PiBpbnQKKyAgTGluZSAxNjU0KSBldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKSAtIGNvbW1lbnRzQXRFbmQgKyBpKS5hY2NlcHQodGhpcywgbnVsbCkgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfRXF1YWxzVmlzaXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0VxdWFsc1Zpc2l0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjE3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0VxdWFsc1Zpc2l0b3IudHh0CkBAIC0wLDAgKzEsNzIwIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3IgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yCisgIExpbmUgODApIG5ldyBFcXVhbHNWaXNpdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yCisgIExpbmUgODMpIFNJTkdMRVRPTi5ub2RlRXF1YWxzKG4xLCBuMikgPT0+IGJvb2xlYW4KKyAgTGluZSA5NSkgIW5vZGVFcXVhbHMobjEuZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpID09PiBib29sZWFuCisgIExpbmUgOTYpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgOTgpICFub2Rlc0VxdWFscyhuMS5nZXRPcnBoYW5Db21tZW50cygpLCBuMi5nZXRPcnBoYW5Db21tZW50cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDk5KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDEwMSkgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDEwNSkgbm9kZXMxID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDYpIG5vZGVzMiA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA3KSB0cnVlID09PiBib29sZWFuCisgIExpbmUgMTA5KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDExMCkgbm9kZXMyID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTEpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTEzKSBub2RlczEuc2l6ZSgpICE9IG5vZGVzMi5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTQpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTE2KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDExNikgMCA9PT4gaW50CisgIExpbmUgMTE2KSBpIDwgbm9kZXMxLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDExNikgaSsrID09PiBpbnQKKyAgTGluZSAxMTcpICFub2RlRXF1YWxzKG5vZGVzMS5nZXQoaSksIG5vZGVzMi5nZXQoaSkpID09PiBib29sZWFuCisgIExpbmUgMTE4KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDEyMSkgdHJ1ZSA9PT4gYm9vbGVhbgorICBMaW5lIDEyNSkgbjEgPT0gbjIgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjYpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjgpIG4xID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjkpIG4yID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzApIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzIpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTMzKSBuMiA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM0KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNikgbjEuZ2V0Q2xhc3MoKSAhPSBuMi5nZXRDbGFzcygpID09PiBib29sZWFuCisgIExpbmUgMTM3KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDEzOSkgIWNvbW1vbk5vZGVFcXVhbGl0eShuMSwgbjIpID09PiBib29sZWFuCisgIExpbmUgMTQwKSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MikgbjEuYWNjZXB0KHRoaXMsIG4yKS5ib29sZWFuVmFsdWUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0NikgbjEgPT0gbjIgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDcpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDkpIG4xID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTApIG4yID09IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTEpIHRydWUgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTMpIGZhbHNlID09PiBib29sZWFuCisgIExpbmUgMTU0KSBuMiA9PSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTU1KSBmYWxzZSA9PT4gYm9vbGVhbgorICBMaW5lIDE1NykgbjEuZXF1YWxzKG4yKSA9PT4gYm9vbGVhbgorICBMaW5lIDE2MSkgZmluYWwgQ29tcGlsYXRpb25Vbml0IG4yID0gKENvbXBpbGF0aW9uVW5pdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDE2MSkgKENvbXBpbGF0aW9uVW5pdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdAorICBMaW5lIDE2MykgIW5vZGVFcXVhbHMobjEuZ2V0UGFja2FnZSgpLCBuMi5nZXRQYWNrYWdlKCkpID09PiBib29sZWFuCisgIExpbmUgMTY0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE2NykgIW5vZGVzRXF1YWxzKG4xLmdldEltcG9ydHMoKSwgbjIuZ2V0SW1wb3J0cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE2OCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNzEpICFub2Rlc0VxdWFscyhuMS5nZXRUeXBlcygpLCBuMi5nZXRUeXBlcygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE3MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNzUpICFub2Rlc0VxdWFscyhuMS5nZXRDb21tZW50cygpLCBuMi5nZXRDb21tZW50cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE3NikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNzkpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxODMpIGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuMiA9IChQYWNrYWdlRGVjbGFyYXRpb24pIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24KKyAgTGluZSAxODMpIChQYWNrYWdlRGVjbGFyYXRpb24pIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24KKyAgTGluZSAxODUpICFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE4NikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxODkpICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE5MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxOTMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxOTcpIGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4yID0gKEltcG9ydERlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24KKyAgTGluZSAxOTcpIChJbXBvcnREZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uCisgIExpbmUgMTk5KSAhbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjAzKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjA3KSBmaW5hbCBUeXBlUGFyYW1ldGVyIG4yID0gKFR5cGVQYXJhbWV0ZXIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMjA3KSAoVHlwZVBhcmFtZXRlcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSAyMDkpICFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgMjEwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDIxMykgIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVCb3VuZCgpLCBuMi5nZXRUeXBlQm91bmQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMTQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjE2KSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMTcpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjE5KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjIzKSBmaW5hbCBMaW5lQ29tbWVudCBuMiA9IChMaW5lQ29tbWVudCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50CisgIExpbmUgMjIzKSAoTGluZUNvbW1lbnQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudAorICBMaW5lIDIyNSkgIW9iakVxdWFscyhuMS5nZXRDb250ZW50KCksIG4yLmdldENvbnRlbnQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMjYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjI5KSAhb2JqRXF1YWxzKG4xLmdldEJlZ2luTGluZSgpLCBuMi5nZXRCZWdpbkxpbmUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAyMzApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjMzKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjM3KSBmaW5hbCBCbG9ja0NvbW1lbnQgbjIgPSAoQmxvY2tDb21tZW50KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50CisgIExpbmUgMjM3KSAoQmxvY2tDb21tZW50KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50CisgIExpbmUgMjM5KSAhb2JqRXF1YWxzKG4xLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDI0MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAyNDMpICFvYmpFcXVhbHMobjEuZ2V0QmVnaW5MaW5lKCksIG4yLmdldEJlZ2luTGluZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDI0NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAyNDcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAyNTEpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuMiA9IChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorICBMaW5lIDI1MSkgKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCisgIExpbmUgMjU1KSBuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSA9PT4gYm9vbGVhbgorICBMaW5lIDI1NikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAyNTkpIG4xLmlzSW50ZXJmYWNlKCkgIT0gbjIuaXNJbnRlcmZhY2UoKSA9PT4gYm9vbGVhbgorICBMaW5lIDI2MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAyNjMpICFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgMjY0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDI2NykgIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBib29sZWFuCisgIExpbmUgMjY4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDI3MSkgIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMjcyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDI3NSkgIW5vZGVzRXF1YWxzKG4xLmdldEV4dGVuZHMoKSwgbjIuZ2V0RXh0ZW5kcygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDI3NikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAyNzkpICFub2Rlc0VxdWFscyhuMS5nZXRJbXBsZW1lbnRzKCksIG4yLmdldEltcGxlbWVudHMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAyODApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMjgzKSAhbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMjg0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDI4NykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDI5MSkgZmluYWwgRW51bURlY2xhcmF0aW9uIG4yID0gKEVudW1EZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uCisgIExpbmUgMjkxKSAoRW51bURlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24KKyAgTGluZSAyOTUpIG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpID09PiBib29sZWFuCisgIExpbmUgMjk2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDI5OSkgIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzAzKSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMDQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzA3KSAhbm9kZXNFcXVhbHMobjEuZ2V0SW1wbGVtZW50cygpLCBuMi5nZXRJbXBsZW1lbnRzKCkpID09PiBib29sZWFuCisgIExpbmUgMzA4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDMxMSkgIW5vZGVzRXF1YWxzKG4xLmdldEVudHJpZXMoKSwgbjIuZ2V0RW50cmllcygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDMxMikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAzMTUpICFub2Rlc0VxdWFscyhuMS5nZXRNZW1iZXJzKCksIG4yLmdldE1lbWJlcnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzE5KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzIzKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzI3KSBmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuMiA9IChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24KKyAgTGluZSAzMjcpIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24KKyAgTGluZSAzMzEpICFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgMzMyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDMzNSkgIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBib29sZWFuCisgIExpbmUgMzM2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDMzOSkgIW5vZGVzRXF1YWxzKG4xLmdldEFyZ3MoKSwgbjIuZ2V0QXJncygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDM0MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAzNDMpICFub2Rlc0VxdWFscyhuMS5nZXRDbGFzc0JvZHkoKSwgbjIuZ2V0Q2xhc3NCb2R5KCkpID09PiBib29sZWFuCisgIExpbmUgMzQ0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM0NykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM1MSkgZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4yID0gKEFubm90YXRpb25EZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uCisgIExpbmUgMzUxKSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb24KKyAgTGluZSAzNTUpIG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpID09PiBib29sZWFuCisgIExpbmUgMzU2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM1OSkgIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzYzKSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzY3KSAhbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMzY4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM3MSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM3NSkgZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4yID0gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uCisgIExpbmUgMzc1KSAoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24KKyAgTGluZSAzNzkpIG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpID09PiBib29sZWFuCisgIExpbmUgMzgwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM4MykgIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzODQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzg3KSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAzODgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMzkxKSAhbm9kZUVxdWFscyhuMS5nZXREZWZhdWx0VmFsdWUoKSwgbjIuZ2V0RGVmYXVsdFZhbHVlKCkpID09PiBib29sZWFuCisgIExpbmUgMzkyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM5NSkgIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpID09PiBib29sZWFuCisgIExpbmUgMzk2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDM5OSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQwMykgZmluYWwgRmllbGREZWNsYXJhdGlvbiBuMiA9IChGaWVsZERlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uCisgIExpbmUgNDAzKSAoRmllbGREZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbgorICBMaW5lIDQwNykgbjEuZ2V0TW9kaWZpZXJzKCkgIT0gbjIuZ2V0TW9kaWZpZXJzKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0MDgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNDExKSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA0MTIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNDE1KSAhbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA0MTYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNDE5KSAhbm9kZXNFcXVhbHMobjEuZ2V0VmFyaWFibGVzKCksIG4yLmdldFZhcmlhYmxlcygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQyMCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0MjMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0MjcpIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuMiA9IChWYXJpYWJsZURlY2xhcmF0b3IpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcgorICBMaW5lIDQyNykgKFZhcmlhYmxlRGVjbGFyYXRvcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgNDI5KSAhbm9kZUVxdWFscyhuMS5nZXRJZCgpLCBuMi5nZXRJZCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQzMCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0MzMpICFub2RlRXF1YWxzKG4xLmdldEluaXQoKSwgbjIuZ2V0SW5pdCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQzNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0MzcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0NDEpIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIG4yID0gKFZhcmlhYmxlRGVjbGFyYXRvcklkKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDQ0MSkgKFZhcmlhYmxlRGVjbGFyYXRvcklkKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZAorICBMaW5lIDQ0MykgbjEuZ2V0QXJyYXlDb3VudCgpICE9IG4yLmdldEFycmF5Q291bnQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDQ0NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0NDcpICFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgNDQ4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQ1MSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQ1NSkgZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuMiA9IChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uCisgIExpbmUgNDU1KSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbgorICBMaW5lIDQ1OSkgbjEuZ2V0TW9kaWZpZXJzKCkgIT0gbjIuZ2V0TW9kaWZpZXJzKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NjApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNDYzKSAhb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQ2NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0NjcpICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQ2OCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0NzEpICFub2RlRXF1YWxzKG4xLmdldEJsb2NrKCksIG4yLmdldEJsb2NrKCkpID09PiBib29sZWFuCisgIExpbmUgNDcyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQ3NSkgIW5vZGVzRXF1YWxzKG4xLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDQ3NikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0NzkpICFub2Rlc0VxdWFscyhuMS5nZXRUaHJvd3MoKSwgbjIuZ2V0VGhyb3dzKCkpID09PiBib29sZWFuCisgIExpbmUgNDgwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQ4MykgIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgNDg0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQ4NykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDQ5MSkgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbjIgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uCisgIExpbmUgNDkxKSAoTWV0aG9kRGVjbGFyYXRpb24pIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uCisgIExpbmUgNDk1KSBuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSA9PT4gYm9vbGVhbgorICBMaW5lIDQ5NikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA0OTkpIG4xLmdldEFycmF5Q291bnQoKSAhPSBuMi5nZXRBcnJheUNvdW50KCkgPT0+IGJvb2xlYW4KKyAgTGluZSA1MDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNTAzKSAhb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUwNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1MDcpICFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUwOCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1MTEpICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUxMikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1MTUpICFub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUxNikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1MTkpICFub2Rlc0VxdWFscyhuMS5nZXRQYXJhbWV0ZXJzKCksIG4yLmdldFBhcmFtZXRlcnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA1MjApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNTIzKSAhbm9kZXNFcXVhbHMobjEuZ2V0VGhyb3dzKCksIG4yLmdldFRocm93cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUyNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1MjcpICFub2Rlc0VxdWFscyhuMS5nZXRUeXBlUGFyYW1ldGVycygpLCBuMi5nZXRUeXBlUGFyYW1ldGVycygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUyOCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1MzApIG4xLmlzRGVmYXVsdCgpICE9IG4yLmlzRGVmYXVsdCgpID09PiBib29sZWFuCisgIExpbmUgNTMxKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDUzMykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDUzNykgZmluYWwgUGFyYW1ldGVyIG4yID0gKFBhcmFtZXRlcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgNTM3KSAoUGFyYW1ldGVyKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSA1MzgpICFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDUzOSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1NDEpIHZpc2l0KChCYXNlUGFyYW1ldGVyKSBuMSwgYXJnKSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1NDUpIE11bHRpVHlwZVBhcmFtZXRlciBuMiA9IChNdWx0aVR5cGVQYXJhbWV0ZXIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcgorICBMaW5lIDU0NSkgKE11bHRpVHlwZVBhcmFtZXRlcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyCisgIExpbmUgNTQ2KSBuMS5nZXRUeXBlcygpLnNpemUoKSAhPSBuMi5nZXRUeXBlcygpLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDU0NykgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1NDkpIEl0ZXJhdG9yPFR5cGU+IG4xdHlwZXMgPSBuMS5nZXRUeXBlcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5JdGVyYXRvcjxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA1NDkpIG4xLmdldFR5cGVzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDU1MCkgSXRlcmF0b3I8VHlwZT4gbjJ0eXBlcyA9IG4yLmdldFR5cGVzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDU1MCkgbjIuZ2V0VHlwZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuSXRlcmF0b3I8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNTUxKSBuMXR5cGVzLmhhc05leHQoKSAmJiBuMnR5cGVzLmhhc05leHQoKSA9PT4gYm9vbGVhbgorICBMaW5lIDU1MikgIW5vZGVFcXVhbHMobjF0eXBlcy5uZXh0KCksIG4ydHlwZXMubmV4dCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDU1MykgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1NTYpIHZpc2l0KChCYXNlUGFyYW1ldGVyKSBuMSwgYXJnKSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1NjApIGZpbmFsIEJhc2VQYXJhbWV0ZXIgbjIgPSAoQmFzZVBhcmFtZXRlcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQmFzZVBhcmFtZXRlcgorICBMaW5lIDU2MCkgKEJhc2VQYXJhbWV0ZXIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJhc2VQYXJhbWV0ZXIKKyAgTGluZSA1NjIpIG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpID09PiBib29sZWFuCisgIExpbmUgNTYzKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDU2NikgIW5vZGVFcXVhbHMobjEuZ2V0SWQoKSwgbjIuZ2V0SWQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA1NjcpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNTcwKSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA1NzEpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNTc0KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNTc4KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNTgyKSBmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4yID0gKEluaXRpYWxpemVyRGVjbGFyYXRpb24pIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24KKyAgTGluZSA1ODIpIChJbml0aWFsaXplckRlY2xhcmF0aW9uKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uCisgIExpbmUgNTg0KSAhbm9kZUVxdWFscyhuMS5nZXRCbG9jaygpLCBuMi5nZXRCbG9jaygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDU4NSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1ODgpICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDU4OSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1OTIpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA1OTYpIGZpbmFsIEphdmFkb2NDb21tZW50IG4yID0gKEphdmFkb2NDb21tZW50KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQKKyAgTGluZSA1OTYpIChKYXZhZG9jQ29tbWVudCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgNTk4KSAhb2JqRXF1YWxzKG4xLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDU5OSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2MDIpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2MDYpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4yID0gKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDYwNikgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDYwOCkgIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MDkpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjEyKSAhbm9kZUVxdWFscyhuMS5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDYxMykgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2MTYpICFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJncygpLCBuMi5nZXRUeXBlQXJncygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDYxNykgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2MTkpICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDYyMCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2MjIpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2MjYpIGZpbmFsIFByaW1pdGl2ZVR5cGUgbjIgPSAoUHJpbWl0aXZlVHlwZSkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZQorICBMaW5lIDYyNikgKFByaW1pdGl2ZVR5cGUpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUKKyAgTGluZSA2MjgpIG4xLmdldFR5cGUoKSAhPSBuMi5nZXRUeXBlKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MjkpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjMxKSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA2MzIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjM0KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjM4KSBmaW5hbCBSZWZlcmVuY2VUeXBlIG4yID0gKFJlZmVyZW5jZVR5cGUpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUKKyAgTGluZSA2MzgpIChSZWZlcmVuY2VUeXBlKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlCisgIExpbmUgNjQwKSBuMS5nZXRBcnJheUNvdW50KCkgIT0gbjIuZ2V0QXJyYXlDb3VudCgpID09PiBib29sZWFuCisgIExpbmUgNjQxKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDY0MykgIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpID09PiBib29sZWFuCisgIExpbmUgNjQ0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDY0NikgIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBib29sZWFuCisgIExpbmUgNjQ3KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDY0OSkgTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gbjFhID0gbjEuZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSA2NDkpIG4xLmdldEFycmF5c0Fubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgNjUwKSBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBuMmEgPSBuMi5nZXRBcnJheXNBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDY1MCkgbjIuZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSA2NTIpIG4xYSAhPSBudWxsICYmIG4yYSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjUzKSBuMWEuc2l6ZSgpICE9IG4yYS5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2NTQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjU3KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDY1NykgMCA9PT4gaW50CisgIExpbmUgNjU4KSBMaXN0PEFubm90YXRpb25FeHByPiBhdXggPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2NTgpIG4xYSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSA2NTkpICFub2Rlc0VxdWFscyhhdXgsIG4yYS5nZXQoaSkpID09PiBib29sZWFuCisgIExpbmUgNjYwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDY2MikgaSsrID09PiBpbnQKKyAgTGluZSA2NjYpIG4xYSAhPSBuMmEgPT0+IGJvb2xlYW4KKyAgTGluZSA2NjcpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjY5KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjczKSBWb2lkVHlwZSBuMiA9IChWb2lkVHlwZSkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGUKKyAgTGluZSA2NzMpIChWb2lkVHlwZSkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVm9pZFR5cGUKKyAgTGluZSA2NzQpICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDY3NSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2NzcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2ODEpIGZpbmFsIFdpbGRjYXJkVHlwZSBuMiA9IChXaWxkY2FyZFR5cGUpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZQorICBMaW5lIDY4MSkgKFdpbGRjYXJkVHlwZSkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlCisgIExpbmUgNjgzKSAhbm9kZUVxdWFscyhuMS5nZXRFeHRlbmRzKCksIG4yLmdldEV4dGVuZHMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA2ODQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNjg3KSAhbm9kZUVxdWFscyhuMS5nZXRTdXBlcigpLCBuMi5nZXRTdXBlcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDY4OCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2OTApICFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDY5MSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2OTMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA2OTcpIGZpbmFsIFdpbGRjYXJkVHlwZSBuMiA9IChXaWxkY2FyZFR5cGUpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZQorICBMaW5lIDY5NykgKFdpbGRjYXJkVHlwZSkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlCisgIExpbmUgNjk5KSAhbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3MDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzAyKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzA2KSBmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbjIgPSAoQXJyYXlBY2Nlc3NFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIKKyAgTGluZSA3MDYpIChBcnJheUFjY2Vzc0V4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwcgorICBMaW5lIDcwOCkgIW5vZGVFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgNzA5KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDcxMikgIW5vZGVFcXVhbHMobjEuZ2V0SW5kZXgoKSwgbjIuZ2V0SW5kZXgoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3MTMpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzE2KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzIwKSBmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuMiA9IChBcnJheUNyZWF0aW9uRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIKKyAgTGluZSA3MjApIChBcnJheUNyZWF0aW9uRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIKKyAgTGluZSA3MjIpIG4xLmdldEFycmF5Q291bnQoKSAhPSBuMi5nZXRBcnJheUNvdW50KCkgPT0+IGJvb2xlYW4KKyAgTGluZSA3MjMpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzI2KSAhbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3MjcpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzMwKSAhbm9kZUVxdWFscyhuMS5nZXRJbml0aWFsaXplcigpLCBuMi5nZXRJbml0aWFsaXplcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDczMSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA3MzQpICFub2Rlc0VxdWFscyhuMS5nZXREaW1lbnNpb25zKCksIG4yLmdldERpbWVuc2lvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3MzUpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzM3KSBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBuMWEgPSBuMS5nZXRBcnJheXNBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDczNykgbjEuZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8amF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPj4KKyAgTGluZSA3MzgpIExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IG4yYSA9IG4yLmdldEFycmF5c0Fubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4+CisgIExpbmUgNzM4KSBuMi5nZXRBcnJheXNBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDc0MCkgbjFhICE9IG51bGwgJiYgbjJhICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3NDEpIG4xYS5zaXplKCkgIT0gbjJhLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDc0MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA3NDUpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNzQ1KSAwID09PiBpbnQKKyAgTGluZSA3NDYpIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGF1eCA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc0NikgbjFhID09PiBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+PgorICBMaW5lIDc0NykgIW5vZGVzRXF1YWxzKGF1eCwgbjJhLmdldChpKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3NDgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzUwKSBpKysgPT0+IGludAorICBMaW5lIDc1NCkgbjFhICE9IG4yYSA9PT4gYm9vbGVhbgorICBMaW5lIDc1NSkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA3NTcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA3NjEpIGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4yID0gKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwcgorICBMaW5lIDc2MSkgKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwcgorICBMaW5lIDc2MykgIW5vZGVzRXF1YWxzKG4xLmdldFZhbHVlcygpLCBuMi5nZXRWYWx1ZXMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3NjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzY3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzcxKSBmaW5hbCBBc3NpZ25FeHByIG4yID0gKEFzc2lnbkV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIKKyAgTGluZSA3NzEpIChBc3NpZ25FeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByCisgIExpbmUgNzczKSBuMS5nZXRPcGVyYXRvcigpICE9IG4yLmdldE9wZXJhdG9yKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA3NzQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzc3KSAhbm9kZUVxdWFscyhuMS5nZXRUYXJnZXQoKSwgbjIuZ2V0VGFyZ2V0KCkpID09PiBib29sZWFuCisgIExpbmUgNzc4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDc4MSkgIW5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3ODIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzg1KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzg5KSBmaW5hbCBCaW5hcnlFeHByIG4yID0gKEJpbmFyeUV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIKKyAgTGluZSA3ODkpIChCaW5hcnlFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByCisgIExpbmUgNzkxKSBuMS5nZXRPcGVyYXRvcigpICE9IG4yLmdldE9wZXJhdG9yKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA3OTIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzk1KSAhbm9kZUVxdWFscyhuMS5nZXRMZWZ0KCksIG4yLmdldExlZnQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA3OTYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgNzk5KSAhbm9kZUVxdWFscyhuMS5nZXRSaWdodCgpLCBuMi5nZXRSaWdodCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDgwMCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4MDMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4MDcpIGZpbmFsIENhc3RFeHByIG4yID0gKENhc3RFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcgorICBMaW5lIDgwNykgKENhc3RFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcgorICBMaW5lIDgwOSkgIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpID09PiBib29sZWFuCisgIExpbmUgODEwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDgxMykgIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpID09PiBib29sZWFuCisgIExpbmUgODE0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDgxNykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDgyMSkgZmluYWwgQ2xhc3NFeHByIG4yID0gKENsYXNzRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByCisgIExpbmUgODIxKSAoQ2xhc3NFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIKKyAgTGluZSA4MjMpICFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDgyNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4MjcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4MzEpIGZpbmFsIENvbmRpdGlvbmFsRXhwciBuMiA9IChDb25kaXRpb25hbEV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwcgorICBMaW5lIDgzMSkgKENvbmRpdGlvbmFsRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByCisgIExpbmUgODMzKSAhbm9kZUVxdWFscyhuMS5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpID09PiBib29sZWFuCisgIExpbmUgODM0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDgzNykgIW5vZGVFcXVhbHMobjEuZ2V0VGhlbkV4cHIoKSwgbjIuZ2V0VGhlbkV4cHIoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA4MzgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgODQxKSAhbm9kZUVxdWFscyhuMS5nZXRFbHNlRXhwcigpLCBuMi5nZXRFbHNlRXhwcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDg0MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4NDUpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4NDkpIGZpbmFsIEVuY2xvc2VkRXhwciBuMiA9IChFbmNsb3NlZEV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwcgorICBMaW5lIDg0OSkgKEVuY2xvc2VkRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByCisgIExpbmUgODUxKSAhbm9kZUVxdWFscyhuMS5nZXRJbm5lcigpLCBuMi5nZXRJbm5lcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDg1MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4NTUpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4NTkpIGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuMiA9IChGaWVsZEFjY2Vzc0V4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwcgorICBMaW5lIDg1OSkgKEZpZWxkQWNjZXNzRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByCisgIExpbmUgODYxKSAhbm9kZUVxdWFscyhuMS5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDg2MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4NjUpICFvYmpFcXVhbHMobjEuZ2V0RmllbGQoKSwgbjIuZ2V0RmllbGQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA4NjYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgODY5KSAhbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUFyZ3MoKSwgbjIuZ2V0VHlwZUFyZ3MoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA4NzApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgODczKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgODc3KSBmaW5hbCBJbnN0YW5jZU9mRXhwciBuMiA9IChJbnN0YW5jZU9mRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIKKyAgTGluZSA4NzcpIChJbnN0YW5jZU9mRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIKKyAgTGluZSA4NzkpICFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDg4MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4ODMpICFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDg4NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4ODcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4OTEpIGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4yID0gKFN0cmluZ0xpdGVyYWxFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcgorICBMaW5lIDg5MSkgKFN0cmluZ0xpdGVyYWxFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcgorICBMaW5lIDg5MykgIW9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDg5NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA4OTcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA5MDEpIGZpbmFsIEludGVnZXJMaXRlcmFsRXhwciBuMiA9IChJbnRlZ2VyTGl0ZXJhbEV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcgorICBMaW5lIDkwMSkgKEludGVnZXJMaXRlcmFsRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByCisgIExpbmUgOTAzKSAhb2JqRXF1YWxzKG4xLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpID09PiBib29sZWFuCisgIExpbmUgOTA0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDkwNykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDkxMSkgZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4yID0gKExvbmdMaXRlcmFsRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByCisgIExpbmUgOTExKSAoTG9uZ0xpdGVyYWxFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHIKKyAgTGluZSA5MTMpICFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA5MTQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTE3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTIxKSBmaW5hbCBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuMiA9IChJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIKKyAgTGluZSA5MjEpIChJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIKKyAgTGluZSA5MjMpICFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA5MjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTI3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTMxKSBmaW5hbCBMb25nTGl0ZXJhbE1pblZhbHVlRXhwciBuMiA9IChMb25nTGl0ZXJhbE1pblZhbHVlRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIKKyAgTGluZSA5MzEpIChMb25nTGl0ZXJhbE1pblZhbHVlRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIKKyAgTGluZSA5MzMpICFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA5MzQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTM3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTQxKSBmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbjIgPSAoQ2hhckxpdGVyYWxFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHIKKyAgTGluZSA5NDEpIChDaGFyTGl0ZXJhbEV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNoYXJMaXRlcmFsRXhwcgorICBMaW5lIDk0MykgIW9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDk0NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA5NDcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA5NTEpIGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4yID0gKERvdWJsZUxpdGVyYWxFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcgorICBMaW5lIDk1MSkgKERvdWJsZUxpdGVyYWxFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcgorICBMaW5lIDk1MykgIW9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDk1NCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA5NTcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSA5NjEpIGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuMiA9IChCb29sZWFuTGl0ZXJhbEV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwcgorICBMaW5lIDk2MSkgKEJvb2xlYW5MaXRlcmFsRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByCisgIExpbmUgOTYzKSBuMS5nZXRWYWx1ZSgpICE9IG4yLmdldFZhbHVlKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA5NjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTY3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTcxKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTc1KSBmaW5hbCBNZXRob2RDYWxsRXhwciBuMiA9IChNZXRob2RDYWxsRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIKKyAgTGluZSA5NzUpIChNZXRob2RDYWxsRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIKKyAgTGluZSA5NzcpICFub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpID09PiBib29sZWFuCisgIExpbmUgOTc4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDk4MSkgIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSA5ODIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgOTg1KSAhbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpID09PiBib29sZWFuCisgIExpbmUgOTg2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDk4OSkgIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmdzKCksIG4yLmdldFR5cGVBcmdzKCkpID09PiBib29sZWFuCisgIExpbmUgOTkwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDk5MykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDk5NykgZmluYWwgTmFtZUV4cHIgbjIgPSAoTmFtZUV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgOTk3KSAoTmFtZUV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgOTk5KSAhb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwMDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTAwMykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwMDcpIGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuMiA9IChPYmplY3RDcmVhdGlvbkV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcgorICBMaW5lIDEwMDcpIChPYmplY3RDcmVhdGlvbkV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcgorICBMaW5lIDEwMDkpICFub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpID09PiBib29sZWFuCisgIExpbmUgMTAxMCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDEzKSAhbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDE0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwMTcpICFub2Rlc0VxdWFscyhuMS5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSwgbjIuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkpID09PiBib29sZWFuCisgIExpbmUgMTAxOCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDIxKSAhbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpID09PiBib29sZWFuCisgIExpbmUgMTAyMikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDI1KSAhbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUFyZ3MoKSwgbjIuZ2V0VHlwZUFyZ3MoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDI2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwMjkpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDMzKSBmaW5hbCBRdWFsaWZpZWROYW1lRXhwciBuMiA9IChRdWFsaWZpZWROYW1lRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIKKyAgTGluZSAxMDMzKSAoUXVhbGlmaWVkTmFtZUV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByCisgIExpbmUgMTAzNSkgIW5vZGVFcXVhbHMobjEuZ2V0UXVhbGlmaWVyKCksIG4yLmdldFF1YWxpZmllcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwMzYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTAzOSkgIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDQwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwNDMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDQ3KSBmaW5hbCBUaGlzRXhwciBuMiA9IChUaGlzRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIKKyAgTGluZSAxMDQ3KSAoVGhpc0V4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByCisgIExpbmUgMTA0OSkgIW5vZGVFcXVhbHMobjEuZ2V0Q2xhc3NFeHByKCksIG4yLmdldENsYXNzRXhwcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwNTApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTA1MykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwNTcpIGZpbmFsIFN1cGVyRXhwciBuMiA9IChTdXBlckV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwcgorICBMaW5lIDEwNTcpIChTdXBlckV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwcgorICBMaW5lIDEwNTkpICFub2RlRXF1YWxzKG4xLmdldENsYXNzRXhwcigpLCBuMi5nZXRDbGFzc0V4cHIoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDYwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwNjMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDY3KSBmaW5hbCBVbmFyeUV4cHIgbjIgPSAoVW5hcnlFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIKKyAgTGluZSAxMDY3KSAoVW5hcnlFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIKKyAgTGluZSAxMDY5KSBuMS5nZXRPcGVyYXRvcigpICE9IG4yLmdldE9wZXJhdG9yKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDcwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwNzMpICFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwNzQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTA3NykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwODEpIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4yID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcgorICBMaW5lIDEwODEpIChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIKKyAgTGluZSAxMDgzKSBuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEwODQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTA4NykgIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBib29sZWFuCisgIExpbmUgMTA4OCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMDkxKSAhbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDkyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwOTUpICFub2Rlc0VxdWFscyhuMS5nZXRWYXJzKCksIG4yLmdldFZhcnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDk2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEwOTkpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMTAzKSBmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuMiA9IChNYXJrZXJBbm5vdGF0aW9uRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAxMTAzKSAoTWFya2VyQW5ub3RhdGlvbkV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1hcmtlckFubm90YXRpb25FeHByCisgIExpbmUgMTEwNSkgIW5vZGVFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgMTEwNikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMTA5KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTExMykgZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbjIgPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByCisgIExpbmUgMTExMykgKFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcgorICBMaW5lIDExMTUpICFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDExMTYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTExOSkgIW5vZGVFcXVhbHMobjEuZ2V0TWVtYmVyVmFsdWUoKSwgbjIuZ2V0TWVtYmVyVmFsdWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTIwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExMjMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMTI3KSBmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuMiA9IChOb3JtYWxBbm5vdGF0aW9uRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAxMTI3KSAoTm9ybWFsQW5ub3RhdGlvbkV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByCisgIExpbmUgMTEyOSkgIW5vZGVFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBib29sZWFuCisgIExpbmUgMTEzMCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMTMzKSAhbm9kZXNFcXVhbHMobjEuZ2V0UGFpcnMoKSwgbjIuZ2V0UGFpcnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTM0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExMzcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMTQxKSBmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbjIgPSAoTWVtYmVyVmFsdWVQYWlyKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIKKyAgTGluZSAxMTQxKSAoTWVtYmVyVmFsdWVQYWlyKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIKKyAgTGluZSAxMTQzKSAhb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDExNDQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTE0NykgIW5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTQ4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExNTEpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMTU1KSBmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbjIgPSAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQKKyAgTGluZSAxMTU1KSAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQKKyAgTGluZSAxMTU3KSAhbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTU4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExNjEpICFub2Rlc0VxdWFscyhuMS5nZXRBcmdzKCksIG4yLmdldEFyZ3MoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTYyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExNjUpICFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJncygpLCBuMi5nZXRUeXBlQXJncygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDExNjYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTE2OSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExNzMpIGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbjIgPSAoVHlwZURlY2xhcmF0aW9uU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdAorICBMaW5lIDExNzMpIChUeXBlRGVjbGFyYXRpb25TdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10CisgIExpbmUgMTE3NSkgIW5vZGVFcXVhbHMobjEuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG4yLmdldFR5cGVEZWNsYXJhdGlvbigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDExNzYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTE3OSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExODMpIGZpbmFsIEFzc2VydFN0bXQgbjIgPSAoQXNzZXJ0U3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdAorICBMaW5lIDExODMpIChBc3NlcnRTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10CisgIExpbmUgMTE4NSkgIW5vZGVFcXVhbHMobjEuZ2V0Q2hlY2soKSwgbjIuZ2V0Q2hlY2soKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTg2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExODkpICFub2RlRXF1YWxzKG4xLmdldE1lc3NhZ2UoKSwgbjIuZ2V0TWVzc2FnZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDExOTApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTE5MykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDExOTcpIGZpbmFsIEJsb2NrU3RtdCBuMiA9IChCbG9ja1N0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDExOTcpIChCbG9ja1N0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDExOTkpICFub2Rlc0VxdWFscyhuMS5nZXRTdG10cygpLCBuMi5nZXRTdG10cygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyMDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTIwMykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyMDcpIGZpbmFsIExhYmVsZWRTdG10IG4yID0gKExhYmVsZWRTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdAorICBMaW5lIDEyMDcpIChMYWJlbGVkU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQKKyAgTGluZSAxMjA5KSAhbm9kZUVxdWFscyhuMS5nZXRTdG10KCksIG4yLmdldFN0bXQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjEwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyMTMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMjE3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTIyMSkgZmluYWwgRXhwcmVzc2lvblN0bXQgbjIgPSAoRXhwcmVzc2lvblN0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10CisgIExpbmUgMTIyMSkgKEV4cHJlc3Npb25TdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdAorICBMaW5lIDEyMjMpICFub2RlRXF1YWxzKG4xLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyMjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTIyNykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyMzEpIGZpbmFsIFN3aXRjaFN0bXQgbjIgPSAoU3dpdGNoU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdAorICBMaW5lIDEyMzEpIChTd2l0Y2hTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10CisgIExpbmUgMTIzMykgIW5vZGVFcXVhbHMobjEuZ2V0U2VsZWN0b3IoKSwgbjIuZ2V0U2VsZWN0b3IoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjM0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyMzcpICFub2Rlc0VxdWFscyhuMS5nZXRFbnRyaWVzKCksIG4yLmdldEVudHJpZXMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjM4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyNDEpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMjQ1KSBmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbjIgPSAoU3dpdGNoRW50cnlTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQKKyAgTGluZSAxMjQ1KSAoU3dpdGNoRW50cnlTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQKKyAgTGluZSAxMjQ3KSAhbm9kZUVxdWFscyhuMS5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyNDgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTI1MSkgIW5vZGVzRXF1YWxzKG4xLmdldFN0bXRzKCksIG4yLmdldFN0bXRzKCkpID09PiBib29sZWFuCisgIExpbmUgMTI1MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMjU1KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTI1OSkgZmluYWwgQnJlYWtTdG10IG4yID0gKEJyZWFrU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10CisgIExpbmUgMTI1OSkgKEJyZWFrU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10CisgIExpbmUgMTI2MSkgIW9iakVxdWFscyhuMS5nZXRJZCgpLCBuMi5nZXRJZCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyNjIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTI2NSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyNjkpIGZpbmFsIFJldHVyblN0bXQgbjIgPSAoUmV0dXJuU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdAorICBMaW5lIDEyNjkpIChSZXR1cm5TdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10CisgIExpbmUgMTI3MSkgIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpID09PiBib29sZWFuCisgIExpbmUgMTI3MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMjc1KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTI3OSkgZmluYWwgSWZTdG10IG4yID0gKElmU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10CisgIExpbmUgMTI3OSkgKElmU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10CisgIExpbmUgMTI4MSkgIW5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEyODIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTI4NSkgIW5vZGVFcXVhbHMobjEuZ2V0VGhlblN0bXQoKSwgbjIuZ2V0VGhlblN0bXQoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjg2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEyODkpICFub2RlRXF1YWxzKG4xLmdldEVsc2VTdG10KCksIG4yLmdldEVsc2VTdG10KCkpID09PiBib29sZWFuCisgIExpbmUgMTI5MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMjkzKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTI5NykgZmluYWwgV2hpbGVTdG10IG4yID0gKFdoaWxlU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10CisgIExpbmUgMTI5NykgKFdoaWxlU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10CisgIExpbmUgMTI5OSkgIW5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzMDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTMwMykgIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpID09PiBib29sZWFuCisgIExpbmUgMTMwNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMzA3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTMxMSkgZmluYWwgQ29udGludWVTdG10IG4yID0gKENvbnRpbnVlU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10CisgIExpbmUgMTMxMSkgKENvbnRpbnVlU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10CisgIExpbmUgMTMxMykgIW9iakVxdWFscyhuMS5nZXRJZCgpLCBuMi5nZXRJZCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzMTQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTMxNykgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEzMjEpIGZpbmFsIERvU3RtdCBuMiA9IChEb1N0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdAorICBMaW5lIDEzMjEpIChEb1N0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdAorICBMaW5lIDEzMjMpICFub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzMjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTMyNykgIW5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzMjgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTMzMSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEzMzUpIGZpbmFsIEZvcmVhY2hTdG10IG4yID0gKEZvcmVhY2hTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdAorICBMaW5lIDEzMzUpIChGb3JlYWNoU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQKKyAgTGluZSAxMzM3KSAhbm9kZUVxdWFscyhuMS5nZXRWYXJpYWJsZSgpLCBuMi5nZXRWYXJpYWJsZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzMzgpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM0MSkgIW5vZGVFcXVhbHMobjEuZ2V0SXRlcmFibGUoKSwgbjIuZ2V0SXRlcmFibGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzQyKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEzNDUpICFub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNDYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM0OSkgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEzNTMpIGZpbmFsIEZvclN0bXQgbjIgPSAoRm9yU3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdAorICBMaW5lIDEzNTMpIChGb3JTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10CisgIExpbmUgMTM1NSkgIW5vZGVzRXF1YWxzKG4xLmdldEluaXQoKSwgbjIuZ2V0SW5pdCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNTYpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM1OSkgIW5vZGVFcXVhbHMobjEuZ2V0Q29tcGFyZSgpLCBuMi5nZXRDb21wYXJlKCkpID09PiBib29sZWFuCisgIExpbmUgMTM2MCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMzYzKSAhbm9kZXNFcXVhbHMobjEuZ2V0VXBkYXRlKCksIG4yLmdldFVwZGF0ZSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNjQpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM2NykgIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpID09PiBib29sZWFuCisgIExpbmUgMTM2OCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMzcxKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM3NSkgZmluYWwgVGhyb3dTdG10IG4yID0gKFRocm93U3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10CisgIExpbmUgMTM3NSkgKFRocm93U3RtdCkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10CisgIExpbmUgMTM3NykgIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpID09PiBib29sZWFuCisgIExpbmUgMTM3OCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMzgxKSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM4NSkgZmluYWwgU3luY2hyb25pemVkU3RtdCBuMiA9IChTeW5jaHJvbml6ZWRTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10CisgIExpbmUgMTM4NSkgKFN5bmNocm9uaXplZFN0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQKKyAgTGluZSAxMzg3KSAhbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzg4KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDEzOTEpICFub2RlRXF1YWxzKG4xLmdldEJsb2NrKCksIG4yLmdldEJsb2NrKCkpID09PiBib29sZWFuCisgIExpbmUgMTM5MikgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxMzk1KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTM5OSkgZmluYWwgVHJ5U3RtdCBuMiA9IChUcnlTdG10KSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10CisgIExpbmUgMTM5OSkgKFRyeVN0bXQpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQKKyAgTGluZSAxNDAxKSAhbm9kZUVxdWFscyhuMS5nZXRUcnlCbG9jaygpLCBuMi5nZXRUcnlCbG9jaygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MDIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTQwNSkgIW5vZGVzRXF1YWxzKG4xLmdldENhdGNocygpLCBuMi5nZXRDYXRjaHMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDA2KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0MDkpICFub2RlRXF1YWxzKG4xLmdldEZpbmFsbHlCbG9jaygpLCBuMi5nZXRGaW5hbGx5QmxvY2soKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDEwKSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0MTMpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNDE3KSBmaW5hbCBDYXRjaENsYXVzZSBuMiA9IChDYXRjaENsYXVzZSkgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UKKyAgTGluZSAxNDE3KSAoQ2F0Y2hDbGF1c2UpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlCisgIExpbmUgMTQxOSkgIW5vZGVFcXVhbHMobjEuZ2V0RXhjZXB0KCksIG4yLmdldEV4Y2VwdCgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0MjApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTQyMykgIW5vZGVFcXVhbHMobjEuZ2V0Q2F0Y2hCbG9jaygpLCBuMi5nZXRDYXRjaEJsb2NrKCkpID09PiBib29sZWFuCisgIExpbmUgMTQyNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNDI3KSBCb29sZWFuLlRSVUUgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTQzMikgTGFtYmRhRXhwciBuMiA9IChMYW1iZGFFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByCisgIExpbmUgMTQzMikgKExhbWJkYUV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIKKyAgTGluZSAxNDMzKSAhbm9kZXNFcXVhbHMobjEuZ2V0UGFyYW1ldGVycygpLCBuMi5nZXRQYXJhbWV0ZXJzKCkpID09PiBib29sZWFuCisgIExpbmUgMTQzNCkgQm9vbGVhbi5GQUxTRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNDM2KSBuMS5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpICE9IG4yLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDM3KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0MzkpICFub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0NDApIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTQ0MikgQm9vbGVhbi5UUlVFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0NDcpIE1ldGhvZFJlZmVyZW5jZUV4cHIgbjIgPSAoTWV0aG9kUmVmZXJlbmNlRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcgorICBMaW5lIDE0NDcpIChNZXRob2RSZWZlcmVuY2VFeHByKSBhcmcgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByCisgIExpbmUgMTQ0OCkgIW5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDQ5KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0NTEpICFub2Rlc0VxdWFscyhuMS5nZXRUeXBlUGFyYW1ldGVycygpLCBuMi5nZXRUeXBlUGFyYW1ldGVycygpKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0NTIpIEJvb2xlYW4uRkFMU0UgPT0+IGphdmEubGFuZy5Cb29sZWFuCisgIExpbmUgMTQ1NCkgIW9iakVxdWFscyhuMS5nZXRJZGVudGlmaWVyKCksIG4yLmdldElkZW50aWZpZXIoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDU1KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0NTcpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KKyAgTGluZSAxNDYyKSBUeXBlRXhwciBuMiA9IChUeXBlRXhwcikgYXJnID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIKKyAgTGluZSAxNDYyKSAoVHlwZUV4cHIpIGFyZyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByCisgIExpbmUgMTQ2MykgIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDY0KSBCb29sZWFuLkZBTFNFID09PiBqYXZhLmxhbmcuQm9vbGVhbgorICBMaW5lIDE0NjYpIEJvb2xlYW4uVFJVRSA9PT4gamF2YS5sYW5nLkJvb2xlYW4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfR2VuZXJpY1Zpc2l0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9HZW5lcmljVmlzaXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfR2VuZXJpY1Zpc2l0b3IudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0dlbmVyaWNWaXNpdG9yQWRhcHRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0dlbmVyaWNWaXNpdG9yQWRhcHRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmOTdmYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnR4dApAQCAtMCwwICsxLDgzNiBAQAorCitbIENsYXNzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yCisgIExpbmUgODApIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MikgUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgyKSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDg0KSByZXN1bHQgPT0+IFIKKyAgTGluZSA4OCkgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4OSkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgODkpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDkxKSBSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA5MSkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDkyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDkzKSByZXN1bHQgPT0+IFIKKyAgTGluZSA5OCkgbi5nZXRNZW1iZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDk5KSBmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIExpbmUgOTkpIG4uZ2V0TWVtYmVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDEwMSkgUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDEpIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEwMikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEwOCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDExMykgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNSkgUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExNSkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTYpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE3KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMjEpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIyKSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAxMjIpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDEyNCkgUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI0KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI1KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNikgcmVzdWx0ID09PiBSCisgIExpbmUgMTMyKSBSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTMyKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzMykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzQpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEzNykgbi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM5KSBSIHJlc3VsdCA9IG4uZ2V0RGVmYXVsdFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMzkpIG4uZ2V0RGVmYXVsdFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDApIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQxKSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNDUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNTEpIFIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNTEpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTUyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE1MykgcmVzdWx0ID09PiBSCisgIExpbmUgMTU3KSBSIHJlc3VsdCA9IG4uZ2V0SW5kZXgoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE1Nykgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTU4KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE1OSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTYyKSBudWxsID09PiBudWxsCisgIExpbmUgMTY4KSBSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTY4KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE2OSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNzApIHJlc3VsdCA9PT4gUgorICBMaW5lIDE3Mykgbi5nZXREaW1lbnNpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE3NCkgZmluYWwgRXhwcmVzc2lvbiBkaW0gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTc0KSBuLmdldERpbWVuc2lvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTc2KSBSIHJlc3VsdCA9IGRpbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE3NikgZGltLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTc3KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE3OCkgcmVzdWx0ID09PiBSCisgIExpbmUgMTg0KSBSIHJlc3VsdCA9IG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE4NCkgbi5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTg1KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE4NikgcmVzdWx0ID09PiBSCisgIExpbmUgMTkwKSBudWxsID09PiBudWxsCisgIExpbmUgMTk1KSBuLmdldFZhbHVlcygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxOTYpIGZpbmFsIEV4cHJlc3Npb24gZXhwciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxOTYpIG4uZ2V0VmFsdWVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDE5OCkgUiByZXN1bHQgPSBleHByLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTk4KSBleHByLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTk5KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDIwMCkgcmVzdWx0ID09PiBSCisgIExpbmUgMjA1KSBudWxsID09PiBudWxsCisgIExpbmUgMjExKSBSIHJlc3VsdCA9IG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDIxMSkgbi5nZXRDaGVjaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjEyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDIxMykgcmVzdWx0ID09PiBSCisgIExpbmUgMjE2KSBuLmdldE1lc3NhZ2UoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjE4KSBSIHJlc3VsdCA9IG4uZ2V0TWVzc2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjE4KSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDIxOSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMjApIHJlc3VsdCA9PT4gUgorICBMaW5lIDIyNCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDIzMCkgUiByZXN1bHQgPSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjMwKSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjMxKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDIzMikgcmVzdWx0ID09PiBSCisgIExpbmUgMjM2KSBSIHJlc3VsdCA9IG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDIzNikgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjM3KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDIzOCkgcmVzdWx0ID09PiBSCisgIExpbmUgMjQxKSBudWxsID09PiBudWxsCisgIExpbmUgMjQ3KSBSIHJlc3VsdCA9IG4uZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjQ3KSBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDI0OCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNDkpIHJlc3VsdCA9PT4gUgorICBMaW5lIDI1MykgUiByZXN1bHQgPSBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAyNTMpIG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDI1NCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNTUpIHJlc3VsdCA9PT4gUgorICBMaW5lIDI1OCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDI2Mykgbi5nZXRTdG10cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNjQpIGZpbmFsIFN0YXRlbWVudCBzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMjY0KSBuLmdldFN0bXRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgMjY2KSBSIHJlc3VsdCA9IHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAyNjYpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAyNjcpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjY4KSByZXN1bHQgPT0+IFIKKyAgTGluZSAyNzMpIG51bGwgPT0+IG51bGwKKyAgTGluZSAyNzkpIG51bGwgPT0+IG51bGwKKyAgTGluZSAyODQpIG51bGwgPT0+IG51bGwKKyAgTGluZSAyOTApIFIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAyOTApIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjkxKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDI5MikgcmVzdWx0ID09PiBSCisgIExpbmUgMjk2KSBSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMjk2KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDI5NykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyOTgpIHJlc3VsdCA9PT4gUgorICBMaW5lIDMwMSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDMwNykgUiByZXN1bHQgPSBuLmdldEV4Y2VwdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMzA3KSBuLmdldEV4Y2VwdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMzA4KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMwOSkgcmVzdWx0ID09PiBSCisgIExpbmUgMzEzKSBSIHJlc3VsdCA9IG4uZ2V0Q2F0Y2hCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMzEzKSBuLmdldENhdGNoQmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDMxNCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTUpIHJlc3VsdCA9PT4gUgorICBMaW5lIDMxOCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDMyNCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDMzMCkgUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDMzMCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAzMzEpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzMyKSByZXN1bHQgPT0+IFIKKyAgTGluZSAzMzUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAzNDApIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNDIpIFIgcmVzdWx0ID0gbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAzNDIpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMzQzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM0NCkgcmVzdWx0ID09PiBSCisgIExpbmUgMzQ4KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM0OSkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgMzQ5KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAzNTEpIFIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDM1MSkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDM1MikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNTMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDM1OCkgbi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNTkpIGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMzU5KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAzNjEpIFIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDM2MSkgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDM2MikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDM2OCkgbi5nZXRFeHRlbmRzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM2OSkgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMzY5KSBuLmdldEV4dGVuZHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDM3MSkgUiByZXN1bHQgPSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMzcxKSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMzcyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM3MykgcmVzdWx0ID09PiBSCisgIExpbmUgMzc5KSBuLmdldEltcGxlbWVudHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzgwKSBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSAzODApIG4uZ2V0SW1wbGVtZW50cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMzgyKSBSIHJlc3VsdCA9IGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAzODIpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAzODMpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzg0KSByZXN1bHQgPT0+IFIKKyAgTGluZSAzODkpIG4uZ2V0TWVtYmVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzOTApIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSAzOTApIG4uZ2V0TWVtYmVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDM5MikgUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAzOTIpIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDM5MykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzOTQpIHJlc3VsdCA9PT4gUgorICBMaW5lIDM5OSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDQwNCkgbi5nZXRTY29wZSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MDYpIFIgcmVzdWx0ID0gbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDA2KSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0MDcpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDA4KSByZXN1bHQgPT0+IFIKKyAgTGluZSA0MTIpIG4uZ2V0VHlwZUFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDEzKSBmaW5hbCBUeXBlIHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNDEzKSBuLmdldFR5cGVBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDQxNSkgUiByZXN1bHQgPSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDE1KSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDE2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQxNykgcmVzdWx0ID09PiBSCisgIExpbmUgNDIyKSBudWxsID09PiBudWxsCisgIExpbmUgNDI3KSBuLmdldFBhY2thZ2UoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDI5KSBSIHJlc3VsdCA9IG4uZ2V0UGFja2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDI5KSBuLmdldFBhY2thZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDQzMCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MzEpIHJlc3VsdCA9PT4gUgorICBMaW5lIDQzNSkgbi5nZXRJbXBvcnRzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQzNikgZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gaSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDQzNikgbi5nZXRJbXBvcnRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24+CisgIExpbmUgNDM4KSBSIHJlc3VsdCA9IGkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0MzgpIGkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0MzkpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDQwKSByZXN1bHQgPT0+IFIKKyAgTGluZSA0NDUpIG4uZ2V0VHlwZXMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDQ2KSBmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uCisgIExpbmUgNDQ2KSBuLmdldFR5cGVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24+CisgIExpbmUgNDQ4KSBSIHJlc3VsdCA9IHR5cGVEZWNsYXJhdGlvbi5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDQ0OCkgdHlwZURlY2xhcmF0aW9uLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDQ5KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQ1MCkgcmVzdWx0ID09PiBSCisgIExpbmUgNDU1KSBudWxsID09PiBudWxsCisgIExpbmUgNDYxKSBSIHJlc3VsdCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0NjEpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0NjIpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDYzKSByZXN1bHQgPT0+IFIKKyAgTGluZSA0NjcpIFIgcmVzdWx0ID0gbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDY3KSBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0NjgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDY5KSByZXN1bHQgPT0+IFIKKyAgTGluZSA0NzMpIFIgcmVzdWx0ID0gbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDczKSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0NzQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDc1KSByZXN1bHQgPT0+IFIKKyAgTGluZSA0NzgpIG51bGwgPT0+IG51bGwKKyAgTGluZSA0ODMpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0ODUpIFIgcmVzdWx0ID0gbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA0ODUpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNDg2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQ4NykgcmVzdWx0ID09PiBSCisgIExpbmUgNDkxKSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQ5MikgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNDkyKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0OTQpIFIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDQ5NCkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDQ5NSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0OTYpIHJlc3VsdCA9PT4gUgorICBMaW5lIDUwMSkgbi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MDIpIGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgNTAyKSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSA1MDQpIFIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUwNCkgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUwNSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MDYpIHJlc3VsdCA9PT4gUgorICBMaW5lIDUxMSkgbi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDUxMikgZmluYWwgUGFyYW1ldGVyIHAgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSA1MTIpIG4uZ2V0UGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDUxNCkgUiByZXN1bHQgPSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTE0KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTE1KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDUxNikgcmVzdWx0ID09PiBSCisgIExpbmUgNTIxKSBuLmdldFRocm93cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MjIpIGZpbmFsIE5hbWVFeHByIG5hbWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDUyMikgbi5nZXRUaHJvd3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByPgorICBMaW5lIDUyNCkgUiByZXN1bHQgPSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTI0KSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTI1KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDUyNikgcmVzdWx0ID09PiBSCisgIExpbmUgNTMyKSBSIHJlc3VsdCA9IG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDUzMikgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTMzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDUzNCkgcmVzdWx0ID09PiBSCisgIExpbmUgNTM3KSBudWxsID09PiBudWxsCisgIExpbmUgNTQyKSBudWxsID09PiBudWxsCisgIExpbmUgNTQ4KSBSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTQ4KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU0OSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1NTApIHJlc3VsdCA9PT4gUgorICBMaW5lIDU1NCkgUiByZXN1bHQgPSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTU0KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTU1KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU1NikgcmVzdWx0ID09PiBSCisgIExpbmUgNTU5KSBudWxsID09PiBudWxsCisgIExpbmUgNTY0KSBudWxsID09PiBudWxsCisgIExpbmUgNTY5KSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTcxKSBSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNTcxKSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU3MikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1NzMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDU3NykgbnVsbCA9PT4gbnVsbAorICBMaW5lIDU4MikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDU4Nykgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU4OSkgUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDU4OSkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA1OTApIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTkxKSByZXN1bHQgPT0+IFIKKyAgTGluZSA1OTUpIG51bGwgPT0+IG51bGwKKyAgTGluZSA2MDEpIFIgcmVzdWx0ID0gbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjAxKSBuLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2MDIpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjAzKSByZXN1bHQgPT0+IFIKKyAgTGluZSA2MDYpIG51bGwgPT0+IG51bGwKKyAgTGluZSA2MTEpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2MTMpIFIgcmVzdWx0ID0gbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2MTMpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjE0KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYxNSkgcmVzdWx0ID09PiBSCisgIExpbmUgNjE5KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYyMCkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNjIwKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MjIpIFIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDYyMikgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDYyMykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2MjQpIHJlc3VsdCA9PT4gUgorICBMaW5lIDYyOSkgbi5nZXRBcmdzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYzMCkgZmluYWwgRXhwcmVzc2lvbiBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDYzMCkgbi5nZXRBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDYzMikgUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjMyKSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjMzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYzNCkgcmVzdWx0ID09PiBSCisgIExpbmUgNjM5KSBuLmdldENsYXNzQm9keSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NDApIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSA2NDApIG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgNjQyKSBSIHJlc3VsdCA9IG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDY0MikgbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjQzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDY0NCkgcmVzdWx0ID09PiBSCisgIExpbmUgNjQ5KSBudWxsID09PiBudWxsCisgIExpbmUgNjU0KSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjU2KSBSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjU2KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDY1NykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NTgpIHJlc3VsdCA9PT4gUgorICBMaW5lIDY2Mikgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NjMpIGZpbmFsIEFubm90YXRpb25FeHByIGEgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDY2Mykgbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjY1KSBSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2NjUpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2NjYpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjY3KSByZXN1bHQgPT0+IFIKKyAgTGluZSA2NzIpIG4uZ2V0SW1wbGVtZW50cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NzMpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDY3Mykgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSA2NzUpIFIgcmVzdWx0ID0gYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDY3NSkgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDY3NikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NzcpIHJlc3VsdCA9PT4gUgorICBMaW5lIDY4Mikgbi5nZXRFbnRyaWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDY4MykgZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uCisgIExpbmUgNjgzKSBuLmdldEVudHJpZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uPgorICBMaW5lIDY4NSkgUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjg1KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjg2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDY4NykgcmVzdWx0ID09PiBSCisgIExpbmUgNjkyKSBuLmdldE1lbWJlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjkzKSBmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIExpbmUgNjkzKSBuLmdldE1lbWJlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA2OTUpIFIgcmVzdWx0ID0gbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNjk1KSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA2OTYpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjk3KSByZXN1bHQgPT0+IFIKKyAgTGluZSA3MDIpIG51bGwgPT0+IG51bGwKKyAgTGluZSA3MDcpICFuLmlzVGhpcygpID09PiBib29sZWFuCisgIExpbmUgNzA4KSBuLmdldEV4cHIoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzEwKSBSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzEwKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDcxMSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3MTIpIHJlc3VsdCA9PT4gUgorICBMaW5lIDcxNykgbi5nZXRUeXBlQXJncygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3MTgpIGZpbmFsIFR5cGUgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA3MTgpIG4uZ2V0VHlwZUFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNzIwKSBSIHJlc3VsdCA9IHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3MjApIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3MjEpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzIyKSByZXN1bHQgPT0+IFIKKyAgTGluZSA3MjcpIG4uZ2V0QXJncygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3MjgpIGZpbmFsIEV4cHJlc3Npb24gZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3MjgpIG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA3MzApIFIgcmVzdWx0ID0gZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDczMCkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDczMSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3MzIpIHJlc3VsdCA9PT4gUgorICBMaW5lIDczNykgbnVsbCA9PT4gbnVsbAorICBMaW5lIDc0MykgUiByZXN1bHQgPSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDc0Mykgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3NDQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzQ1KSByZXN1bHQgPT0+IFIKKyAgTGluZSA3NDgpIG51bGwgPT0+IG51bGwKKyAgTGluZSA3NTQpIFIgcmVzdWx0ID0gbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzU0KSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3NTUpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzU2KSByZXN1bHQgPT0+IFIKKyAgTGluZSA3NTkpIG51bGwgPT0+IG51bGwKKyAgTGluZSA3NjQpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3NjYpIFIgcmVzdWx0ID0gbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3NjYpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzY3KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc2OCkgcmVzdWx0ID09PiBSCisgIExpbmUgNzcyKSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc3MykgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNzczKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA3NzUpIFIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDc3NSkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDc3NikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3NzcpIHJlc3VsdCA9PT4gUgorICBMaW5lIDc4MykgUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDc4Mykgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA3ODQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzg1KSByZXN1bHQgPT0+IFIKKyAgTGluZSA3ODgpIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2YXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IKKyAgTGluZSA3ODgpIG4uZ2V0VmFyaWFibGVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgNzkwKSBSIHJlc3VsdCA9IHZhci5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDc5MCkgdmFyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgNzkxKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc5MikgcmVzdWx0ID09PiBSCisgIExpbmUgNzk2KSBudWxsID09PiBudWxsCisgIExpbmUgODAyKSBSIHJlc3VsdCA9IG4uZ2V0VmFyaWFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgwMikgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODAzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDgwNCkgcmVzdWx0ID09PiBSCisgIExpbmUgODA4KSBSIHJlc3VsdCA9IG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgwOCkgbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODA5KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDgxMCkgcmVzdWx0ID09PiBSCisgIExpbmUgODE0KSBSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODE0KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgxNSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MTYpIHJlc3VsdCA9PT4gUgorICBMaW5lIDgxOSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDgyNCkgbi5nZXRJbml0KCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDgyNSkgZmluYWwgRXhwcmVzc2lvbiBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDgyNSkgbi5nZXRJbml0KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDgyNykgUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODI3KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODI4KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDgyOSkgcmVzdWx0ID09PiBSCisgIExpbmUgODM0KSBuLmdldENvbXBhcmUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODM2KSBSIHJlc3VsdCA9IG4uZ2V0Q29tcGFyZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODM2KSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDgzNykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MzgpIHJlc3VsdCA9PT4gUgorICBMaW5lIDg0Mikgbi5nZXRVcGRhdGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODQzKSBmaW5hbCBFeHByZXNzaW9uIGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgODQzKSBuLmdldFVwZGF0ZSgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA4NDUpIFIgcmVzdWx0ID0gZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDg0NSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDg0NikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NDcpIHJlc3VsdCA9PT4gUgorICBMaW5lIDg1MykgUiByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDg1Mykgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA4NTQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODU1KSByZXN1bHQgPT0+IFIKKyAgTGluZSA4NTgpIG51bGwgPT0+IG51bGwKKyAgTGluZSA4NjQpIFIgcmVzdWx0ID0gbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDg2NCkgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDg2NSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NjYpIHJlc3VsdCA9PT4gUgorICBMaW5lIDg3MCkgUiByZXN1bHQgPSBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA4NzApIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDg3MSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NzIpIHJlc3VsdCA9PT4gUgorICBMaW5lIDg3NSkgbi5nZXRFbHNlU3RtdCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NzcpIFIgcmVzdWx0ID0gbi5nZXRFbHNlU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODc3KSBuLmdldEVsc2VTdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA4NzgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODc5KSByZXN1bHQgPT0+IFIKKyAgTGluZSA4ODMpIG51bGwgPT0+IG51bGwKKyAgTGluZSA4ODkpIFIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA4ODkpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgODkwKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDg5MSkgcmVzdWx0ID09PiBSCisgIExpbmUgODk0KSBudWxsID09PiBudWxsCisgIExpbmUgODk5KSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTAxKSBSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgOTAxKSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDkwMikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5MDMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDkwOCkgUiByZXN1bHQgPSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA5MDgpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDkwOSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5MTApIHJlc3VsdCA9PT4gUgorICBMaW5lIDkxMykgbnVsbCA9PT4gbnVsbAorICBMaW5lIDkxOSkgUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDkxOSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA5MjApIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTIxKSByZXN1bHQgPT0+IFIKKyAgTGluZSA5MjUpIFIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA5MjUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgOTI2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDkyNykgcmVzdWx0ID09PiBSCisgIExpbmUgOTMwKSBudWxsID09PiBudWxsCisgIExpbmUgOTM1KSBudWxsID09PiBudWxsCisgIExpbmUgOTQwKSBudWxsID09PiBudWxsCisgIExpbmUgOTQ1KSBudWxsID09PiBudWxsCisgIExpbmUgOTUxKSBSIHJlc3VsdCA9IG4uZ2V0U3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgOTUxKSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDk1MikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5NTMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDk1NikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDk2MSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDk2NikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDk3MikgUiByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDk3Mikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA5NzMpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTc0KSByZXN1bHQgPT0+IFIKKyAgTGluZSA5NzcpIG51bGwgPT0+IG51bGwKKyAgTGluZSA5ODMpIFIgcmVzdWx0ID0gbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgOTgzKSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSA5ODQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTg1KSByZXN1bHQgPT0+IFIKKyAgTGluZSA5ODgpIG51bGwgPT0+IG51bGwKKyAgTGluZSA5OTMpIG4uZ2V0U2NvcGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTk1KSBSIHJlc3VsdCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDk5NSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgOTk2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDk5NykgcmVzdWx0ID09PiBSCisgIExpbmUgMTAwMSkgbi5nZXRUeXBlQXJncygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDAyKSBmaW5hbCBUeXBlIHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMTAwMikgbi5nZXRUeXBlQXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSAxMDA0KSBSIHJlc3VsdCA9IHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDA0KSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTAwNSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDA2KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMDExKSBuLmdldEFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTAxMikgZmluYWwgRXhwcmVzc2lvbiBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEwMTIpIG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxMDE0KSBSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDE0KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTAxNSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDE2KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMDIxKSBudWxsID09PiBudWxsCisgIExpbmUgMTAyNikgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwMjgpIFIgcmVzdWx0ID0gbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDI4KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEwMjkpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTAzMCkgcmVzdWx0ID09PiBSCisgIExpbmUgMTAzNCkgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDM1KSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAxMDM1KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxMDM3KSBSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDM3KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTAzOCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDM5KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMDQ0KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwNDUpIGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMTA0NSkgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMTA0NykgUiByZXN1bHQgPSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTA0NykgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEwNDgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA0OSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTA1NSkgUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEwNTUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTA1NikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDU3KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMDYwKSBuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA2MSkgZmluYWwgUGFyYW1ldGVyIHAgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSAxMDYxKSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSAxMDYzKSBSIHJlc3VsdCA9IHAuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDYzKSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTA2NCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDY1KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMDcwKSBuLmdldFRocm93cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMDcxKSBmaW5hbCBOYW1lRXhwciBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSAxMDcxKSBuLmdldFRocm93cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI+CisgIExpbmUgMTA3MykgUiByZXN1bHQgPSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTA3MykgbmFtZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEwNzQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA3NSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTA4MCkgbi5nZXRCb2R5KCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwODIpIFIgcmVzdWx0ID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMDgyKSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEwODMpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA4NCkgcmVzdWx0ID09PiBSCisgIExpbmUgMTA4OCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEwOTMpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMDk5KSBSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTA5OSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTAwKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExMDEpIHJlc3VsdCA9PT4gUgorICBMaW5lIDExMDQpIG4uZ2V0UGFpcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTEwNSkgZmluYWwgTWVtYmVyVmFsdWVQYWlyIG0gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIKKyAgTGluZSAxMTA1KSBuLmdldFBhaXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXI+CisgIExpbmUgMTEwNykgUiByZXN1bHQgPSBtLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTEwNykgbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExMDgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTEwOSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTExNCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDExMTkpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMTI0KSBuLmdldFNjb3BlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExMjYpIFIgcmVzdWx0ID0gbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTEyNikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTEyNykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMTI4KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMTMyKSBuLmdldFR5cGVBcmdzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExMzMpIGZpbmFsIFR5cGUgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSAxMTMzKSBuLmdldFR5cGVBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDExMzUpIFIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExMzUpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTM2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExMzcpIHJlc3VsdCA9PT4gUgorICBMaW5lIDExNDMpIFIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTQzKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExNDQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE0NSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTE0OCkgbi5nZXRBcmdzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNDkpIGZpbmFsIEV4cHJlc3Npb24gZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAxMTQ5KSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMTE1MSkgUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTE1MSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExNTIpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE1MykgcmVzdWx0ID09PiBSCisgIExpbmUgMTE1OCkgbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE1OSkgZmluYWwgQm9keURlY2xhcmF0aW9uIG1lbWJlciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBMaW5lIDExNTkpIG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMTE2MSkgUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTYxKSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTYyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNjMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDExNjgpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMTczKSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNzQpIGZpbmFsIEFubm90YXRpb25FeHByIGEgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDExNzQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDExNzYpIFIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExNzYpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTc3KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExNzgpIHJlc3VsdCA9PT4gUgorICBMaW5lIDExODQpIFIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMTg0KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExODUpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE4NikgcmVzdWx0ID09PiBSCisgIExpbmUgMTE4OSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDExOTQpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE5NSkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgMTE5NSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTE5NykgUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTE5NykgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDExOTgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTE5OSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTIwNSkgUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyMDUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTIwNikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjA3KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMjExKSBSIHJlc3VsdCA9IG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyMTEpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyMTIpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIxMykgcmVzdWx0ID09PiBSCisgIExpbmUgMTIxNikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEyMjEpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIyMikgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgMTIyMikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMTIyNCkgUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTIyNCkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyMjUpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIyNikgcmVzdWx0ID09PiBSCisgIExpbmUgMTIzMikgZmluYWwgVHlwZSB0eXBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDEyMzIpIG4uZ2V0VHlwZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgMTIzMykgUiByZXN1bHQgPSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTIzMykgdHlwZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyMzQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTIzNSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTI0MCkgUiByZXN1bHQgPSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMjQwKSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMjQxKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNDIpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEyNDUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMjUwKSBudWxsID09PiBudWxsCisgIExpbmUgMTI1NikgUiByZXN1bHQgPSBuLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI1Nikgbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyNTcpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTI1OCkgcmVzdWx0ID09PiBSCisgIExpbmUgMTI2MSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEyNjcpIFIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMjY3KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEyNjgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTI2OSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTI3MikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEyNzcpIG4uZ2V0RXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjc5KSBSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI3OSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMjgwKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyODEpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEyODUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMjkxKSBSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI5MSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMjkyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyOTMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEyOTcpIFIgcmVzdWx0ID0gbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI5Nykgbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTI5OCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjk5KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMzAyKSBudWxsID09PiBudWxsCisgIExpbmUgMTMwNykgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEzMTIpIG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMTQpIFIgcmVzdWx0ID0gbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzMTQpIG4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMzE1KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMTYpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEzMjApIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMzI1KSBuLmdldExhYmVsKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMjcpIFIgcmVzdWx0ID0gbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTMyNykgbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTMyOCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzI5KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMzMzKSBuLmdldFN0bXRzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMzQpIGZpbmFsIFN0YXRlbWVudCBzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgMTMzNCkgbi5nZXRTdG10cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PgorICBMaW5lIDEzMzYpIFIgcmVzdWx0ID0gcy5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzMzYpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMzM3KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzMzgpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEzNDMpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxMzQ5KSBSIHJlc3VsdCA9IG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzNDkpIG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzNTApIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM1MSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTM1NCkgbi5nZXRFbnRyaWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzNTUpIGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBlID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10CisgIExpbmUgMTM1NSkgbi5nZXRFbnRyaWVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+CisgIExpbmUgMTM1NykgUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTM1NykgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzNTgpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM1OSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTM2NCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDEzNzEpIG4uZ2V0RXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzcyKSBSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTM3Mikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxMzczKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzNzQpIHJlc3VsdCA9PT4gUgorICBMaW5lIDEzNzkpIFIgcmVzdWx0ID0gbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTM3OSkgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTM4MCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzgxKSByZXN1bHQgPT0+IFIKKyAgTGluZSAxMzg0KSBudWxsID09PiBudWxsCisgIExpbmUgMTM4OSkgbi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM5MSkgUiByZXN1bHQgPSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTM5MSkgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDEzOTIpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM5MykgcmVzdWx0ID09PiBSCisgIExpbmUgMTM5NykgbnVsbCA9PT4gbnVsbAorICBMaW5lIDE0MDMpIFIgcmVzdWx0ID0gbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDAzKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE0MDQpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQwNSkgcmVzdWx0ID09PiBSCisgIExpbmUgMTQwOCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDE0MTMpIG4uZ2V0UmVzb3VyY2VzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0MTQpIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHYgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcgorICBMaW5lIDE0MTQpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4KKyAgTGluZSAxNDE2KSBSIHJlc3VsdCA9IHYuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDE2KSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTQxNykgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDE4KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNDI0KSBSIHJlc3VsdCA9IG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE0MjQpIG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE0MjUpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQyNikgcmVzdWx0ID09PiBSCisgIExpbmUgMTQyOSkgbi5nZXRDYXRjaHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQzMCkgZmluYWwgQ2F0Y2hDbGF1c2UgYyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlCisgIExpbmUgMTQzMCkgbi5nZXRDYXRjaHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlPgorICBMaW5lIDE0MzIpIFIgcmVzdWx0ID0gYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE0MzIpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDMzKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0MzQpIHJlc3VsdCA9PT4gUgorICBMaW5lIDE0MzkpIG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0NDEpIFIgcmVzdWx0ID0gbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE0NDEpIG4uZ2V0RmluYWxseUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDQyKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0NDMpIHJlc3VsdCA9PT4gUgorICBMaW5lIDE0NDcpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNDUzKSBSIHJlc3VsdCA9IG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDUzKSBuLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTQ1NCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDU1KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNDU4KSBudWxsID09PiBudWxsCisgIExpbmUgMTQ2Mykgbi5nZXRUeXBlQm91bmQoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQ2NCkgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMTQ2NCkgbi5nZXRUeXBlQm91bmQoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDE0NjYpIFIgcmVzdWx0ID0gYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE0NjYpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDY3KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0NjgpIHJlc3VsdCA9PT4gUgorICBMaW5lIDE0NzMpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNDc5KSBSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTQ3OSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDgwKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE0ODEpIHJlc3VsdCA9PT4gUgorICBMaW5lIDE0ODQpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNDg5KSBudWxsID09PiBudWxsCisgIExpbmUgMTQ5NCkgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDk1KSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAxNDk1KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxNDk3KSBSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNDk3KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTQ5OCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDk5KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNTA1KSBSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTUwNSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNTA2KSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE1MDcpIHJlc3VsdCA9PT4gUgorICBMaW5lIDE1MTApIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgMTUxMCkgbi5nZXRWYXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgMTUxMikgUiByZXN1bHQgPSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTUxMikgdi5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE1MTMpIHJlc3VsdCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTUxNCkgcmVzdWx0ID09PiBSCisgIExpbmUgMTUxOCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDE1MjQpIFIgcmVzdWx0ID0gbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTUyNCkgbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTUyNSkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTI2KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNTI5KSBuLmdldEluaXQoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTUzMSkgUiByZXN1bHQgPSBuLmdldEluaXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE1MzEpIG4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTUzMikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTMzKSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNTM3KSBudWxsID09PiBudWxsCisgIExpbmUgMTU0MikgbnVsbCA9PT4gbnVsbAorICBMaW5lIDE1NDcpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNTUzKSBSIHJlc3VsdCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNTUzKSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTU1NCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTU1KSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNTU5KSBSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTU1OSkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IFIKKyAgTGluZSAxNTYwKSByZXN1bHQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE1NjEpIHJlc3VsdCA9PT4gUgorICBMaW5lIDE1NjQpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNTY5KSBuLmdldEV4dGVuZHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTU3MSkgUiByZXN1bHQgPSBuLmdldEV4dGVuZHMoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gUgorICBMaW5lIDE1NzEpIG4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTU3MikgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTczKSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNTc3KSBuLmdldFN1cGVyKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE1NzkpIFIgcmVzdWx0ID0gbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTU3OSkgbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBSCisgIExpbmUgMTU4MCkgcmVzdWx0ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTgxKSByZXN1bHQgPT0+IFIKKyAgTGluZSAxNTg1KSBudWxsID09PiBudWxsCisgIExpbmUgMTU5MCkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDE1OTUpIG51bGwgPT0+IG51bGwKKyAgTGluZSAxNjAwKSBudWxsID09PiBudWxsCisgIExpbmUgMTYwNSkgbnVsbCA9PT4gbnVsbAorICBMaW5lIDE2MTApIG51bGwgPT0+IG51bGwKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfTW9kaWZpZXJWaXNpdG9yQWRhcHRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX01vZGlmaWVyVmlzaXRvckFkYXB0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMmM2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX01vZGlmaWVyVmlzaXRvckFkYXB0ZXIudHh0CkBAIC0wLDAgKzEsNjYyIEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIgXQorICBzdXBlcmNsYXNzOiBqYXZhLmxhbmcuT2JqZWN0CisgIGludGVyZmFjZTogY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yCisgIExpbmUgMTI0KSBpbnQgaSA9IGxpc3Quc2l6ZSgpIC0gMSA9PT4gaW50CisgIExpbmUgMTI0KSBsaXN0LnNpemUoKSAtIDEgPT0+IGludAorICBMaW5lIDEyNCkgaSA+PSAwID09PiBib29sZWFuCisgIExpbmUgMTI0KSBpLS0gPT0+IGludAorICBMaW5lIDEyNSkgbGlzdC5nZXQoaSkgPT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEyNikgbGlzdC5yZW1vdmUoaSkgPT0+ID8KKyAgTGluZSAxMzIpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxMzMpIG4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDEzNSkgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxMzUpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDEzNikgYW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEzNykgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSAxMzcpIDAgPT0+IGludAorICBMaW5lIDEzNykgaSA8IGFubm90YXRpb25zLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDEzNykgaSsrID09PiBpbnQKKyAgTGluZSAxMzgpIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDE0MCkgcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgMTQyKSBmaW5hbCBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycyA9IG4uZ2V0TWVtYmVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDE0Mikgbi5nZXRNZW1iZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMTQzKSBtZW1iZXJzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNDQpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMTQ0KSAwID09PiBpbnQKKyAgTGluZSAxNDQpIGkgPCBtZW1iZXJzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDE0NCkgaSsrID09PiBpbnQKKyAgTGluZSAxNDUpIG1lbWJlcnMuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIG1lbWJlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBMaW5lIDE0NykgcmVtb3ZlTnVsbHMobWVtYmVycykgPT0+IHZvaWQKKyAgTGluZSAxNDkpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb24KKyAgTGluZSAxNTMpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxNTQpIG4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDE1NikgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAxNTYpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDE1NykgYW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE1OCkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSAxNTgpIDAgPT0+IGludAorICBMaW5lIDE1OCkgaSA8IGFubm90YXRpb25zLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDE1OCkgaSsrID09PiBpbnQKKyAgTGluZSAxNTkpIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDE2MSkgcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgMTYzKSBuLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDE2NCkgbi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTY1KSBuLnNldERlZmF1bHRWYWx1ZSgoRXhwcmVzc2lvbikgbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAxNjcpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24KKyAgTGluZSAxNzEpIG4uc2V0TmFtZSgoRXhwcmVzc2lvbikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMTcyKSBuLnNldEluZGV4KChFeHByZXNzaW9uKSBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMTczKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByCisgIExpbmUgMTc3KSBuLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDE3OCkgbi5nZXREaW1lbnNpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE3OSkgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBkaW1lbnNpb25zID0gbi5nZXREaW1lbnNpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDE3OSkgbi5nZXREaW1lbnNpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDE4MCkgZGltZW5zaW9ucyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTgxKSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDE4MSkgMCA9PT4gaW50CisgIExpbmUgMTgxKSBpIDwgZGltZW5zaW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAxODEpIGkrKyA9PT4gaW50CisgIExpbmUgMTgyKSBkaW1lbnNpb25zLnNldChpLCAoRXhwcmVzc2lvbikgZGltZW5zaW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDE4NCkgcmVtb3ZlTnVsbHMoZGltZW5zaW9ucykgPT0+IHZvaWQKKyAgTGluZSAxODcpIG4uc2V0SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBuLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMTg5KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIKKyAgTGluZSAxOTMpIG4uZ2V0VmFsdWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDE5NCkgZmluYWwgTGlzdDxFeHByZXNzaW9uPiB2YWx1ZXMgPSBuLmdldFZhbHVlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxOTQpIG4uZ2V0VmFsdWVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDE5NSkgdmFsdWVzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAxOTYpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMTk2KSAwID09PiBpbnQKKyAgTGluZSAxOTYpIGkgPCB2YWx1ZXMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgMTk2KSBpKysgPT0+IGludAorICBMaW5lIDE5NykgdmFsdWVzLnNldChpLCAoRXhwcmVzc2lvbikgdmFsdWVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTk5KSByZW1vdmVOdWxscyh2YWx1ZXMpID09PiB2b2lkCisgIExpbmUgMjAyKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIKKyAgTGluZSAyMDYpIG4uc2V0Q2hlY2soKEV4cHJlc3Npb24pIG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAyMDcpIG4uZ2V0TWVzc2FnZSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMDgpIG4uc2V0TWVzc2FnZSgoRXhwcmVzc2lvbikgbi5nZXRNZXNzYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjEwKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdAorICBMaW5lIDIxNCkgbi5zZXRUYXJnZXQoKEV4cHJlc3Npb24pIG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjE1KSBuLnNldFZhbHVlKChFeHByZXNzaW9uKSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjE2KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwcgorICBMaW5lIDIyMCkgbi5zZXRMZWZ0KChFeHByZXNzaW9uKSBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAyMjEpIG4uc2V0UmlnaHQoKEV4cHJlc3Npb24pIG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAyMjIpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByCisgIExpbmUgMjI2KSBmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMgPSBuLmdldFN0bXRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgMjI2KSBuLmdldFN0bXRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgMjI3KSBzdG10cyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjI4KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDIyOCkgMCA9PT4gaW50CisgIExpbmUgMjI4KSBpIDwgc3RtdHMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgMjI4KSBpKysgPT0+IGludAorICBMaW5lIDIyOSkgc3RtdHMuc2V0KGksIChTdGF0ZW1lbnQpIHN0bXRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQKKyAgTGluZSAyMzEpIHJlbW92ZU51bGxzKHN0bXRzKSA9PT4gdm9pZAorICBMaW5lIDIzMykgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdAorICBMaW5lIDIzNykgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwcgorICBMaW5lIDI0MSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJyZWFrU3RtdAorICBMaW5lIDI0NSkgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAyNDYpIG4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjQ3KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIKKyAgTGluZSAyNTEpIG4uc2V0RXhjZXB0KChNdWx0aVR5cGVQYXJhbWV0ZXIpIG4uZ2V0RXhjZXB0KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjUyKSBuLnNldENhdGNoQmxvY2soKEJsb2NrU3RtdCkgbi5nZXRDYXRjaEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjUzKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UKKyAgTGluZSAyNTgpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHIKKyAgTGluZSAyNjIpIG4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMjYzKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByCisgIExpbmUgMjY3KSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjY4KSBuLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAyNzApIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMjcwKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAyNzEpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNzIpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMjcyKSAwID09PiBpbnQKKyAgTGluZSAyNzIpIGkgPCBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyNzIpIGkrKyA9PT4gaW50CisgIExpbmUgMjczKSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAyNzUpIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDI3NykgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDI3Nykgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMjc4KSB0eXBlUGFyYW1ldGVycyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjc5KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDI3OSkgMCA9PT4gaW50CisgIExpbmUgMjc5KSBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgMjc5KSBpKysgPT0+IGludAorICBMaW5lIDI4MCkgdHlwZVBhcmFtZXRlcnMuc2V0KGksIChUeXBlUGFyYW1ldGVyKSB0eXBlUGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSAyODIpIHJlbW92ZU51bGxzKHR5cGVQYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDI4NCkgZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5keiA9IG4uZ2V0RXh0ZW5kcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMjg0KSBuLmdldEV4dGVuZHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDI4NSkgZXh0ZW5keiAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjg2KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDI4NikgMCA9PT4gaW50CisgIExpbmUgMjg2KSBpIDwgZXh0ZW5kei5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyODYpIGkrKyA9PT4gaW50CisgIExpbmUgMjg3KSBleHRlbmR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGV4dGVuZHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMjg5KSByZW1vdmVOdWxscyhleHRlbmR6KSA9PT4gdm9pZAorICBMaW5lIDI5MSkgZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50eiA9IG4uZ2V0SW1wbGVtZW50cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgMjkxKSBuLmdldEltcGxlbWVudHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDI5MikgaW1wbGVtZW50eiAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjkzKSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDI5MykgMCA9PT4gaW50CisgIExpbmUgMjkzKSBpIDwgaW1wbGVtZW50ei5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAyOTMpIGkrKyA9PT4gaW50CisgIExpbmUgMjk0KSBpbXBsZW1lbnR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGltcGxlbWVudHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMjk2KSByZW1vdmVOdWxscyhpbXBsZW1lbnR6KSA9PT4gdm9pZAorICBMaW5lIDI5OCkgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IG1lbWJlcnMgPSBuLmdldE1lbWJlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSAyOTgpIG4uZ2V0TWVtYmVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDI5OSkgbWVtYmVycyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzAwKSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDMwMCkgMCA9PT4gaW50CisgIExpbmUgMzAwKSBpIDwgbWVtYmVycy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMDApIGkrKyA9PT4gaW50CisgIExpbmUgMzAxKSBtZW1iZXJzLnNldChpLCAoQm9keURlY2xhcmF0aW9uKSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSAzMDMpIHJlbW92ZU51bGxzKG1lbWJlcnMpID09PiB2b2lkCisgIExpbmUgMzA1KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCisgIExpbmUgMzA5KSBuLmdldFNjb3BlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMxMCkgbi5zZXRTY29wZSgoQ2xhc3NPckludGVyZmFjZVR5cGUpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAzMTIpIGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3MgPSBuLmdldFR5cGVBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDMxMikgbi5nZXRUeXBlQXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSAzMTMpIHR5cGVBcmdzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTQpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMzE0KSAwID09PiBpbnQKKyAgTGluZSAzMTQpIGkgPCB0eXBlQXJncy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzMTQpIGkrKyA9PT4gaW50CisgIExpbmUgMzE1KSB0eXBlQXJncy5zZXQoaSwgKFR5cGUpIHR5cGVBcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMzE3KSByZW1vdmVOdWxscyh0eXBlQXJncykgPT0+IHZvaWQKKyAgTGluZSAzMTkpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDMyMykgbi5nZXRQYWNrYWdlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMyNCkgbi5zZXRQYWNrYWdlKChQYWNrYWdlRGVjbGFyYXRpb24pIG4uZ2V0UGFja2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDMyNikgZmluYWwgTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IG4uZ2V0SW1wb3J0cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uPgorICBMaW5lIDMyNikgbi5nZXRJbXBvcnRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24+CisgIExpbmUgMzI3KSBpbXBvcnRzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzMjgpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMzI4KSAwID09PiBpbnQKKyAgTGluZSAzMjgpIGkgPCBpbXBvcnRzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDMyOCkgaSsrID09PiBpbnQKKyAgTGluZSAzMjkpIGltcG9ydHMuc2V0KGksIChJbXBvcnREZWNsYXJhdGlvbikgaW1wb3J0cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uCisgIExpbmUgMzMxKSByZW1vdmVOdWxscyhpbXBvcnRzKSA9PT4gdm9pZAorICBMaW5lIDMzMykgZmluYWwgTGlzdDxUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gbi5nZXRUeXBlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPgorICBMaW5lIDMzMykgbi5nZXRUeXBlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPgorICBMaW5lIDMzNCkgdHlwZXMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDMzNSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSAzMzUpIDAgPT0+IGludAorICBMaW5lIDMzNSkgaSA8IHR5cGVzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDMzNSkgaSsrID09PiBpbnQKKyAgTGluZSAzMzYpIHR5cGVzLnNldChpLCAoVHlwZURlY2xhcmF0aW9uKSB0eXBlcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uCisgIExpbmUgMzM4KSByZW1vdmVOdWxscyh0eXBlcykgPT0+IHZvaWQKKyAgTGluZSAzNDApIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0CisgIExpbmUgMzQ0KSBuLnNldENvbmRpdGlvbigoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAzNDUpIG4uc2V0VGhlbkV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAzNDYpIG4uc2V0RWxzZUV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RWxzZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAzNDcpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIKKyAgTGluZSAzNTEpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNTIpIG4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDM1NCkgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAzNTQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDM1NSkgYW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM1NikgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSAzNTYpIDAgPT0+IGludAorICBMaW5lIDM1NikgaSA8IGFubm90YXRpb25zLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDM1NikgaSsrID09PiBpbnQKKyAgTGluZSAzNTcpIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDM1OSkgcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgMzYxKSBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMzYxKSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAzNjIpIHR5cGVQYXJhbWV0ZXJzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjMpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMzYzKSAwID09PiBpbnQKKyAgTGluZSAzNjMpIGkgPCB0eXBlUGFyYW1ldGVycy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzNjMpIGkrKyA9PT4gaW50CisgIExpbmUgMzY0KSB0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcgorICBMaW5lIDM2NikgcmVtb3ZlTnVsbHModHlwZVBhcmFtZXRlcnMpID09PiB2b2lkCisgIExpbmUgMzY4KSBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG4uZ2V0UGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDM2OCkgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMzY5KSBwYXJhbWV0ZXJzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNzApIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgMzcwKSAwID09PiBpbnQKKyAgTGluZSAzNzApIGkgPCBwYXJhbWV0ZXJzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDM3MCkgaSsrID09PiBpbnQKKyAgTGluZSAzNzEpIHBhcmFtZXRlcnMuc2V0KGksIChQYXJhbWV0ZXIpIHBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcgorICBMaW5lIDM3MykgcmVtb3ZlTnVsbHMocGFyYW1ldGVycykgPT0+IHZvaWQKKyAgTGluZSAzNzUpIGZpbmFsIExpc3Q8TmFtZUV4cHI+IHRocm93eiA9IG4uZ2V0VGhyb3dzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSAzNzUpIG4uZ2V0VGhyb3dzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSAzNzYpIHRocm93eiAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzc3KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDM3NykgMCA9PT4gaW50CisgIExpbmUgMzc3KSBpIDwgdGhyb3d6LnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDM3NykgaSsrID09PiBpbnQKKyAgTGluZSAzNzgpIHRocm93ei5zZXQoaSwgKE5hbWVFeHByKSB0aHJvd3ouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgMzgwKSByZW1vdmVOdWxscyh0aHJvd3opID09PiB2b2lkCisgIExpbmUgMzgyKSBuLnNldEJsb2NrKChCbG9ja1N0bXQpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAzODMpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uCisgIExpbmUgMzg3KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10CisgIExpbmUgMzkxKSBuLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgMzkyKSBuLnNldENvbmRpdGlvbigoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSAzOTMpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQKKyAgTGluZSAzOTcpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcgorICBMaW5lIDQwMSkgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQwMikgbi5zZXRKYXZhRG9jKChKYXZhZG9jQ29tbWVudCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNDA0KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlNZW1iZXJEZWNsYXJhdGlvbgorICBMaW5lIDQwOCkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdAorICBMaW5lIDQxMikgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQxMykgbi5zZXRKYXZhRG9jKChKYXZhZG9jQ29tbWVudCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNDE1KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb24KKyAgTGluZSA0MTkpIG4uc2V0SW5uZXIoKEV4cHJlc3Npb24pIG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA0MjApIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FbmNsb3NlZEV4cHIKKyAgTGluZSA0MjQpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MjUpIG4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDQyNykgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0MjcpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDQyOCkgYW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQyOSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA0MjkpIDAgPT0+IGludAorICBMaW5lIDQyOSkgaSA8IGFubm90YXRpb25zLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDQyOSkgaSsrID09PiBpbnQKKyAgTGluZSA0MzApIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDQzMikgcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgNDM0KSBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNDM0KSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNDM1KSBhcmdzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MzYpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNDM2KSAwID09PiBpbnQKKyAgTGluZSA0MzYpIGkgPCBhcmdzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDQzNikgaSsrID09PiBpbnQKKyAgTGluZSA0MzcpIGFyZ3Muc2V0KGksIChFeHByZXNzaW9uKSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDM5KSByZW1vdmVOdWxscyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDQ0MSkgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGNsYXNzQm9keSA9IG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgNDQxKSBuLmdldENsYXNzQm9keSgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDQ0MikgY2xhc3NCb2R5ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0NDMpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNDQzKSAwID09PiBpbnQKKyAgTGluZSA0NDMpIGkgPCBjbGFzc0JvZHkuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNDQzKSBpKysgPT0+IGludAorICBMaW5lIDQ0NCkgY2xhc3NCb2R5LnNldChpLCAoQm9keURlY2xhcmF0aW9uKSBjbGFzc0JvZHkuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBMaW5lIDQ0NikgcmVtb3ZlTnVsbHMoY2xhc3NCb2R5KSA9PT4gdm9pZAorICBMaW5lIDQ0OCkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uCisgIExpbmUgNDUyKSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDUzKSBuLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA0NTUpIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNDU1KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0NTYpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0NTcpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNDU3KSAwID09PiBpbnQKKyAgTGluZSA0NTcpIGkgPCBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NTcpIGkrKyA9PT4gaW50CisgIExpbmUgNDU4KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA0NjApIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDQ2MikgZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50eiA9IG4uZ2V0SW1wbGVtZW50cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+CisgIExpbmUgNDYyKSBuLmdldEltcGxlbWVudHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDQ2MykgaW1wbGVtZW50eiAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDY0KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDQ2NCkgMCA9PT4gaW50CisgIExpbmUgNDY0KSBpIDwgaW1wbGVtZW50ei5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NjQpIGkrKyA9PT4gaW50CisgIExpbmUgNDY1KSBpbXBsZW1lbnR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGltcGxlbWVudHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgNDY3KSByZW1vdmVOdWxscyhpbXBsZW1lbnR6KSA9PT4gdm9pZAorICBMaW5lIDQ2OSkgZmluYWwgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcyA9IG4uZ2V0RW50cmllcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24+CisgIExpbmUgNDY5KSBuLmdldEVudHJpZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uPgorICBMaW5lIDQ3MCkgZW50cmllcyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDcxKSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDQ3MSkgMCA9PT4gaW50CisgIExpbmUgNDcxKSBpIDwgZW50cmllcy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NzEpIGkrKyA9PT4gaW50CisgIExpbmUgNDcyKSBlbnRyaWVzLnNldChpLCAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIGVudHJpZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uCisgIExpbmUgNDc0KSByZW1vdmVOdWxscyhlbnRyaWVzKSA9PT4gdm9pZAorICBMaW5lIDQ3NikgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IG1lbWJlcnMgPSBuLmdldE1lbWJlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA0NzYpIG4uZ2V0TWVtYmVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDQ3NykgbWVtYmVycyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDc4KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDQ3OCkgMCA9PT4gaW50CisgIExpbmUgNDc4KSBpIDwgbWVtYmVycy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0NzgpIGkrKyA9PT4gaW50CisgIExpbmUgNDc5KSBtZW1iZXJzLnNldChpLCAoQm9keURlY2xhcmF0aW9uKSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSA0ODEpIHJlbW92ZU51bGxzKG1lbWJlcnMpID09PiB2b2lkCisgIExpbmUgNDgzKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uCisgIExpbmUgNDg3KSAhbi5pc1RoaXMoKSA9PT4gYm9vbGVhbgorICBMaW5lIDQ4OCkgbi5nZXRFeHByKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQ4OSkgbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA0OTIpIGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3MgPSBuLmdldFR5cGVBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDQ5Mikgbi5nZXRUeXBlQXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA0OTMpIHR5cGVBcmdzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0OTQpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNDk0KSAwID09PiBpbnQKKyAgTGluZSA0OTQpIGkgPCB0eXBlQXJncy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA0OTQpIGkrKyA9PT4gaW50CisgIExpbmUgNDk1KSB0eXBlQXJncy5zZXQoaSwgKFR5cGUpIHR5cGVBcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNDk3KSByZW1vdmVOdWxscyh0eXBlQXJncykgPT0+IHZvaWQKKyAgTGluZSA0OTkpIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA0OTkpIG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA1MDApIGFyZ3MgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDUwMSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA1MDEpIDAgPT0+IGludAorICBMaW5lIDUwMSkgaSA8IGFyZ3Muc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNTAxKSBpKysgPT0+IGludAorICBMaW5lIDUwMikgYXJncy5zZXQoaSwgKEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1MDQpIHJlbW92ZU51bGxzKGFyZ3MpID09PiB2b2lkCisgIExpbmUgNTA2KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10CisgIExpbmUgNTEwKSBuLnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDUxMSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10CisgIExpbmUgNTE1KSBuLnNldFNjb3BlKChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTE2KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByCisgIExpbmUgNTIwKSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTIxKSBuLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA1MjMpIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNTIzKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1MjQpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MjUpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNTI1KSAwID09PiBpbnQKKyAgTGluZSA1MjUpIGkgPCBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA1MjUpIGkrKyA9PT4gaW50CisgIExpbmUgNTI2KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA1MjgpIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDUzMCkgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA1MzEpIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMgPSBuLmdldFZhcmlhYmxlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDUzMSkgbi5nZXRWYXJpYWJsZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4KKyAgTGluZSA1MzIpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNTMyKSAwID09PiBpbnQKKyAgTGluZSA1MzIpIGkgPCB2YXJpYWJsZXMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNTMyKSBpKysgPT0+IGludAorICBMaW5lIDUzMykgdmFyaWFibGVzLnNldChpLCAoVmFyaWFibGVEZWNsYXJhdG9yKSB2YXJpYWJsZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcgorICBMaW5lIDUzNSkgcmVtb3ZlTnVsbHModmFyaWFibGVzKSA9PT4gdm9pZAorICBMaW5lIDUzNikgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24KKyAgTGluZSA1NDApIG4uc2V0VmFyaWFibGUoKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSBuLmdldFZhcmlhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTQxKSBuLnNldEl0ZXJhYmxlKChFeHByZXNzaW9uKSBuLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTQyKSBuLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTQzKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQKKyAgTGluZSA1NDcpIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gaW5pdCA9IG4uZ2V0SW5pdCgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA1NDcpIG4uZ2V0SW5pdCgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA1NDgpIGluaXQgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU0OSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA1NDkpIDAgPT0+IGludAorICBMaW5lIDU0OSkgaSA8IGluaXQuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNTQ5KSBpKysgPT0+IGludAorICBMaW5lIDU1MCkgaW5pdC5zZXQoaSwgKEV4cHJlc3Npb24pIGluaXQuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA1NTIpIHJlbW92ZU51bGxzKGluaXQpID09PiB2b2lkCisgIExpbmUgNTU0KSBuLmdldENvbXBhcmUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTU1KSBuLnNldENvbXBhcmUoKEV4cHJlc3Npb24pIG4uZ2V0Q29tcGFyZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDU1NykgZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUgPSBuLmdldFVwZGF0ZSgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA1NTcpIG4uZ2V0VXBkYXRlKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDU1OCkgdXBkYXRlICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1NTkpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNTU5KSAwID09PiBpbnQKKyAgTGluZSA1NTkpIGkgPCB1cGRhdGUuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNTU5KSBpKysgPT0+IGludAorICBMaW5lIDU2MCkgdXBkYXRlLnNldChpLCAoRXhwcmVzc2lvbikgdXBkYXRlLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNTYyKSByZW1vdmVOdWxscyh1cGRhdGUpID09PiB2b2lkCisgIExpbmUgNTY0KSBuLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTY1KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdAorICBMaW5lIDU2OSkgbi5zZXRDb25kaXRpb24oKEV4cHJlc3Npb24pIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTcwKSBuLnNldFRoZW5TdG10KChTdGF0ZW1lbnQpIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA1NzEpIG4uZ2V0RWxzZVN0bXQoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTcyKSBuLnNldEVsc2VTdG10KChTdGF0ZW1lbnQpIG4uZ2V0RWxzZVN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA1NzQpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQKKyAgTGluZSA1NzgpIG4uc2V0TmFtZSgoTmFtZUV4cHIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDU3OSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDU4Mykgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU4NCkgbi5zZXRKYXZhRG9jKChKYXZhZG9jQ29tbWVudCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNTg2KSBuLnNldEJsb2NrKChCbG9ja1N0bXQpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA1ODcpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uCisgIExpbmUgNTkxKSBuLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDU5Mikgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA1OTMpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwcgorICBMaW5lIDU5NykgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcgorICBMaW5lIDYwMSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByCisgIExpbmUgNjA1KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50CisgIExpbmUgNjA5KSBuLnNldFN0bXQoKFN0YXRlbWVudCkgbi5nZXRTdG10KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNjEwKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQKKyAgTGluZSA2MTQpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHIKKyAgTGluZSA2MTgpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbE1pblZhbHVlRXhwcgorICBMaW5lIDYyMikgbi5zZXROYW1lKChOYW1lRXhwcikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNjIzKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA2MjcpIG4uc2V0VmFsdWUoKEV4cHJlc3Npb24pIG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA2MjgpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIKKyAgTGluZSA2MzIpIG4uZ2V0U2NvcGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjMzKSBuLnNldFNjb3BlKChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNjM1KSBmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzID0gbi5nZXRUeXBlQXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA2MzUpIG4uZ2V0VHlwZUFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNjM2KSB0eXBlQXJncyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjM3KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDYzNykgMCA9PT4gaW50CisgIExpbmUgNjM3KSBpIDwgdHlwZUFyZ3Muc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNjM3KSBpKysgPT0+IGludAorICBMaW5lIDYzOCkgdHlwZUFyZ3Muc2V0KGksIChUeXBlKSB0eXBlQXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDY0MCkgcmVtb3ZlTnVsbHModHlwZUFyZ3MpID09PiB2b2lkCisgIExpbmUgNjQyKSBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNjQyKSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNjQzKSBhcmdzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NDQpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNjQ0KSAwID09PiBpbnQKKyAgTGluZSA2NDQpIGkgPCBhcmdzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDY0NCkgaSsrID09PiBpbnQKKyAgTGluZSA2NDUpIGFyZ3Muc2V0KGksIChFeHByZXNzaW9uKSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNjQ3KSByZW1vdmVOdWxscyhhcmdzKSA9PT4gdm9pZAorICBMaW5lIDY0OSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByCisgIExpbmUgNjUzKSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjU0KSBuLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA2NTYpIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNjU2KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2NTcpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NTgpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNjU4KSAwID09PiBpbnQKKyAgTGluZSA2NTgpIGkgPCBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2NTgpIGkrKyA9PT4gaW50CisgIExpbmUgNjU5KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA2NjEpIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDY2MykgZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyPgorICBMaW5lIDY2Mykgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgNjY0KSB0eXBlUGFyYW1ldGVycyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjY1KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDY2NSkgMCA9PT4gaW50CisgIExpbmUgNjY1KSBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNjY1KSBpKysgPT0+IGludAorICBMaW5lIDY2NikgdHlwZVBhcmFtZXRlcnMuc2V0KGksIChUeXBlUGFyYW1ldGVyKSB0eXBlUGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSA2NjgpIHJlbW92ZU51bGxzKHR5cGVQYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDY3MCkgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA2NzEpIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgNjcxKSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4KKyAgTGluZSA2NzIpIHBhcmFtZXRlcnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDY3MykgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA2NzMpIDAgPT0+IGludAorICBMaW5lIDY3MykgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNjczKSBpKysgPT0+IGludAorICBMaW5lIDY3NCkgcGFyYW1ldGVycy5zZXQoaSwgKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgNjc2KSByZW1vdmVOdWxscyhwYXJhbWV0ZXJzKSA9PT4gdm9pZAorICBMaW5lIDY3OCkgZmluYWwgTGlzdDxOYW1lRXhwcj4gdGhyb3d6ID0gbi5nZXRUaHJvd3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByPgorICBMaW5lIDY3OCkgbi5nZXRUaHJvd3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByPgorICBMaW5lIDY3OSkgdGhyb3d6ICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2ODApIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNjgwKSAwID09PiBpbnQKKyAgTGluZSA2ODApIGkgPCB0aHJvd3ouc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNjgwKSBpKysgPT0+IGludAorICBMaW5lIDY4MSkgdGhyb3d6LnNldChpLCAoTmFtZUV4cHIpIHRocm93ei5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA2ODMpIHJlbW92ZU51bGxzKHRocm93eikgPT0+IHZvaWQKKyAgTGluZSA2ODUpIG4uZ2V0Qm9keSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2ODYpIG4uc2V0Qm9keSgoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA2ODgpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbgorICBMaW5lIDY5MikgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByCisgIExpbmUgNjk2KSBuLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA2OTcpIGZpbmFsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycyA9IG4uZ2V0UGFpcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcj4KKyAgTGluZSA2OTcpIG4uZ2V0UGFpcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcj4KKyAgTGluZSA2OTgpIHBhaXJzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2OTkpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgNjk5KSAwID09PiBpbnQKKyAgTGluZSA2OTkpIGkgPCBwYWlycy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA2OTkpIGkrKyA9PT4gaW50CisgIExpbmUgNzAwKSBwYWlycy5zZXQoaSwgKE1lbWJlclZhbHVlUGFpcikgcGFpcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcgorICBMaW5lIDcwMikgcmVtb3ZlTnVsbHMocGFpcnMpID09PiB2b2lkCisgIExpbmUgNzA0KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA3MDgpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OdWxsTGl0ZXJhbEV4cHIKKyAgTGluZSA3MTIpIG4uZ2V0U2NvcGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzEzKSBuLnNldFNjb3BlKChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNzE1KSBmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzID0gbi5nZXRUeXBlQXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA3MTUpIG4uZ2V0VHlwZUFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNzE2KSB0eXBlQXJncyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzE3KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDcxNykgMCA9PT4gaW50CisgIExpbmUgNzE3KSBpIDwgdHlwZUFyZ3Muc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNzE3KSBpKysgPT0+IGludAorICBMaW5lIDcxOCkgdHlwZUFyZ3Muc2V0KGksIChUeXBlKSB0eXBlQXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDcyMCkgcmVtb3ZlTnVsbHModHlwZUFyZ3MpID09PiB2b2lkCisgIExpbmUgNzIyKSBuLnNldFR5cGUoKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA3MjMpIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA3MjMpIG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA3MjQpIGFyZ3MgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDcyNSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA3MjUpIDAgPT0+IGludAorICBMaW5lIDcyNSkgaSA8IGFyZ3Muc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNzI1KSBpKysgPT0+IGludAorICBMaW5lIDcyNikgYXJncy5zZXQoaSwgKEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA3MjgpIHJlbW92ZU51bGxzKGFyZ3MpID09PiB2b2lkCisgIExpbmUgNzMwKSBmaW5hbCBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYW5vbnltb3VzQ2xhc3NCb2R5ID0gbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA3MzApIG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgNzMxKSBhbm9ueW1vdXNDbGFzc0JvZHkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDczMikgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA3MzIpIDAgPT0+IGludAorICBMaW5lIDczMikgaSA8IGFub255bW91c0NsYXNzQm9keS5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA3MzIpIGkrKyA9PT4gaW50CisgIExpbmUgNzMzKSBhbm9ueW1vdXNDbGFzc0JvZHkuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIGFub255bW91c0NsYXNzQm9keS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uCisgIExpbmUgNzM1KSByZW1vdmVOdWxscyhhbm9ueW1vdXNDbGFzc0JvZHkpID09PiB2b2lkCisgIExpbmUgNzM3KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByCisgIExpbmUgNzQxKSBmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc0MSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgNzQyKSBhbm5vdGF0aW9ucyAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzQzKSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDc0MykgMCA9PT4gaW50CisgIExpbmUgNzQzKSBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgNzQzKSBpKysgPT0+IGludAorICBMaW5lIDc0NCkgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNzQ2KSByZW1vdmVOdWxscyhhbm5vdGF0aW9ucykgPT0+IHZvaWQKKyAgTGluZSA3NDgpIG4uc2V0TmFtZSgoTmFtZUV4cHIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDc0OSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24KKyAgTGluZSA3NTMpIHZpc2l0KChCYXNlUGFyYW1ldGVyKSBuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUKKyAgTGluZSA3NTQpIG4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNzU1KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyCisgIExpbmUgNzU5KSB2aXNpdCgoQmFzZVBhcmFtZXRlcikgbiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlCisgIExpbmUgNzYwKSBMaXN0PFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8VHlwZT4oKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNzYwKSBuZXcgTGlua2VkTGlzdDxUeXBlPigpID09PiBqYXZhLnV0aWwuTGlua2VkTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSA3NjEpIFR5cGUgdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA3NjEpIG4uZ2V0VHlwZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNzYyKSB0eXBlcy5hZGQoKFR5cGUpIHR5cGUuYWNjZXB0KHRoaXMsIGFyZykpID09PiBib29sZWFuCisgIExpbmUgNzY0KSBuLnNldFR5cGVzKHR5cGVzKSA9PT4gdm9pZAorICBMaW5lIDc2NSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcgorICBMaW5lIDc2OSkgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA3NjkpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDc3MCkgYW5ub3RhdGlvbnMgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc3MSkgaW50IGkgPSAwID09PiBpbnQKKyAgTGluZSA3NzEpIDAgPT0+IGludAorICBMaW5lIDc3MSkgaSA8IGFubm90YXRpb25zLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDc3MSkgaSsrID09PiBpbnQKKyAgTGluZSA3NzIpIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDc3NCkgcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpID09PiB2b2lkCisgIExpbmUgNzc3KSBuLnNldElkKChWYXJpYWJsZURlY2xhcmF0b3JJZCkgbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDc3OCkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJhc2VQYXJhbWV0ZXIKKyAgTGluZSA3ODIpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlCisgIExpbmUgNzg2KSBuLnNldFF1YWxpZmllcigoTmFtZUV4cHIpIG4uZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNzg3KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIKKyAgTGluZSA3OTEpIG4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgNzkyKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZQorICBMaW5lIDc5Nikgbi5nZXRFeHByKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc5Nykgbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA3OTkpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10CisgIExpbmUgODAzKSBuLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA4MDQpIG4uc2V0TWVtYmVyVmFsdWUoKEV4cHJlc3Npb24pIG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA4MDUpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcgorICBMaW5lIDgwOSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByCisgIExpbmUgODEzKSBuLmdldENsYXNzRXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MTQpIG4uc2V0Q2xhc3NFeHByKChFeHByZXNzaW9uKSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDgxNikgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwcgorICBMaW5lIDgyMCkgbi5nZXRMYWJlbCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MjEpIG4uc2V0TGFiZWwoKEV4cHJlc3Npb24pIG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA4MjMpIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdG10cyA9IG4uZ2V0U3RtdHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSA4MjMpIG4uZ2V0U3RtdHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4KKyAgTGluZSA4MjQpIHN0bXRzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MjUpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgODI1KSAwID09PiBpbnQKKyAgTGluZSA4MjUpIGkgPCBzdG10cy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA4MjUpIGkrKyA9PT4gaW50CisgIExpbmUgODI2KSBzdG10cy5zZXQoaSwgKFN0YXRlbWVudCkgc3RtdHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDgyOCkgcmVtb3ZlTnVsbHMoc3RtdHMpID09PiB2b2lkCisgIExpbmUgODMwKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10CisgIExpbmUgODM0KSBuLnNldFNlbGVjdG9yKChFeHByZXNzaW9uKSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgODM1KSBmaW5hbCBMaXN0PFN3aXRjaEVudHJ5U3RtdD4gZW50cmllcyA9IG4uZ2V0RW50cmllcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10PgorICBMaW5lIDgzNSkgbi5nZXRFbnRyaWVzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+CisgIExpbmUgODM2KSBlbnRyaWVzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MzcpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgODM3KSAwID09PiBpbnQKKyAgTGluZSA4MzcpIGkgPCBlbnRyaWVzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDgzNykgaSsrID09PiBpbnQKKyAgTGluZSA4MzgpIGVudHJpZXMuc2V0KGksIChTd2l0Y2hFbnRyeVN0bXQpIGVudHJpZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdAorICBMaW5lIDg0MCkgcmVtb3ZlTnVsbHMoZW50cmllcykgPT0+IHZvaWQKKyAgTGluZSA4NDIpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10CisgIExpbmUgODQ3KSBuLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDg0OCkgbi5zZXRCbG9jaygoQmxvY2tTdG10KSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgODQ5KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdAorICBMaW5lIDg1Mykgbi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODU0KSBuLnNldENsYXNzRXhwcigoRXhwcmVzc2lvbikgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA4NTYpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwcgorICBMaW5lIDg2MCkgbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA4NjEpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQKKyAgTGluZSA4NjUpIG4uc2V0VHJ5QmxvY2soKEJsb2NrU3RtdCkgbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDg2NikgZmluYWwgTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzID0gbi5nZXRDYXRjaHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlPgorICBMaW5lIDg2Nikgbi5nZXRDYXRjaHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlPgorICBMaW5lIDg2NykgY2F0Y2hzICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NjgpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgODY4KSAwID09PiBpbnQKKyAgTGluZSA4NjgpIGkgPCBjYXRjaHMuc2l6ZSgpID09PiBib29sZWFuCisgIExpbmUgODY4KSBpKysgPT0+IGludAorICBMaW5lIDg2OSkgY2F0Y2hzLnNldChpLCAoQ2F0Y2hDbGF1c2UpIGNhdGNocy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UKKyAgTGluZSA4NzEpIHJlbW92ZU51bGxzKGNhdGNocykgPT0+IHZvaWQKKyAgTGluZSA4NzMpIG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDg3NCkgbi5zZXRGaW5hbGx5QmxvY2soKEJsb2NrU3RtdCkgbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA4NzYpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10CisgIExpbmUgODgwKSBuLnNldFR5cGVEZWNsYXJhdGlvbigoVHlwZURlY2xhcmF0aW9uKSBuLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDg4MSkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQKKyAgTGluZSA4ODUpIGZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCA9IG4uZ2V0VHlwZUJvdW5kKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSA4ODUpIG4uZ2V0VHlwZUJvdW5kKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSA4ODYpIHR5cGVCb3VuZCAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODg3KSBpbnQgaSA9IDAgPT0+IGludAorICBMaW5lIDg4NykgMCA9PT4gaW50CisgIExpbmUgODg3KSBpIDwgdHlwZUJvdW5kLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDg4NykgaSsrID09PiBpbnQKKyAgTGluZSA4ODgpIHR5cGVCb3VuZC5zZXQoaSwgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0eXBlQm91bmQuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgODkwKSByZW1vdmVOdWxscyh0eXBlQm91bmQpID09PiB2b2lkCisgIExpbmUgODkyKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXIKKyAgTGluZSA4OTYpIG4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgODk3KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByCisgIExpbmUgOTAxKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5rbm93blR5cGUKKyAgTGluZSA5MDUpIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgOTA1KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA5MDYpIGFubm90YXRpb25zICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5MDcpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgOTA3KSAwID09PiBpbnQKKyAgTGluZSA5MDcpIGkgPCBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGJvb2xlYW4KKyAgTGluZSA5MDcpIGkrKyA9PT4gaW50CisgIExpbmUgOTA4KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA5MTApIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gdm9pZAorICBMaW5lIDkxMikgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA5MTMpIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJzID0gbi5nZXRWYXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgOTEzKSBuLmdldFZhcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4KKyAgTGluZSA5MTQpIGludCBpID0gMCA9PT4gaW50CisgIExpbmUgOTE0KSAwID09PiBpbnQKKyAgTGluZSA5MTQpIGkgPCB2YXJzLnNpemUoKSA9PT4gYm9vbGVhbgorICBMaW5lIDkxNCkgaSsrID09PiBpbnQKKyAgTGluZSA5MTUpIHZhcnMuc2V0KGksIChWYXJpYWJsZURlY2xhcmF0b3IpIHZhcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcgorICBMaW5lIDkxNykgcmVtb3ZlTnVsbHModmFycykgPT0+IHZvaWQKKyAgTGluZSA5MTgpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcgorICBMaW5lIDkyMikgbi5zZXRJZCgoVmFyaWFibGVEZWNsYXJhdG9ySWQpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA5MjMpIG4uZ2V0SW5pdCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5MjQpIG4uc2V0SW5pdCgoRXhwcmVzc2lvbikgbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgOTI2KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgOTMwKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQKKyAgTGluZSA5MzQpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZQorICBMaW5lIDkzOCkgbi5zZXRDb25kaXRpb24oKEV4cHJlc3Npb24pIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgOTM5KSBuLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiB2b2lkCisgIExpbmUgOTQwKSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10CisgIExpbmUgOTQ0KSBuLmdldEV4dGVuZHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgOTQ1KSBuLnNldEV4dGVuZHMoKFJlZmVyZW5jZVR5cGUpIG4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gdm9pZAorICBMaW5lIDk0Nykgbi5nZXRTdXBlcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5NDgpIG4uc2V0U3VwZXIoKFJlZmVyZW5jZVR5cGUpIG4uZ2V0U3VwZXIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IHZvaWQKKyAgTGluZSA5NTApIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUKKyAgTGluZSA5NTQpIG4gPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByCisgIExpbmUgOTU4KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcgorICBMaW5lIDk2MikgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByCisgIExpbmUgOTY2KSBuID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudAorICBMaW5lIDk3MCkgbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9Wb2lkVmlzaXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX1ZvaWRWaXNpdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9Wb2lkVmlzaXRvci50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfVm9pZFZpc2l0b3JBZGFwdGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfVm9pZFZpc2l0b3JBZGFwdGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2QyN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9Wb2lkVmlzaXRvckFkYXB0ZXIudHh0CkBAIC0wLDAgKzEsNDI1IEBACisKK1sgQ2xhc3MgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlciBdCisgIHN1cGVyY2xhc3M6IGphdmEubGFuZy5PYmplY3QKKyAgaW50ZXJmYWNlOiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IKKyAgTGluZSA4MikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgODMpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4Nikgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NykgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgODcpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDg4KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTEpIG4uZ2V0TWVtYmVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA5MikgZmluYWwgQm9keURlY2xhcmF0aW9uIG1lbWJlciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBMaW5lIDkyKSBuLmdldE1lbWJlcnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA5MykgbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgOTkpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEwMCkgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDEwMSkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDMpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTA0KSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAxMDQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDEwNSkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEwOCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMDkpIG4uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDExMCkgbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTE2KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDExNykgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTIxKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMjIpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTIzKSAhaXNOdWxsT3JFbXB0eShuLmdldERpbWVuc2lvbnMoKSkgPT0+IGJvb2xlYW4KKyAgTGluZSAxMjQpIGZpbmFsIEV4cHJlc3Npb24gZGltID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbgorICBMaW5lIDEyNCkgbi5nZXREaW1lbnNpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPgorICBMaW5lIDEyNSkgZGltLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTI4KSBuLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxMzMpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDEzNCkgbi5nZXRWYWx1ZXMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTM1KSBmaW5hbCBFeHByZXNzaW9uIGV4cHIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMTM1KSBuLmdldFZhbHVlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSAxMzYpIGV4cHIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNDIpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE0Mykgbi5nZXRDaGVjaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTQ0KSBuLmdldE1lc3NhZ2UoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTQ1KSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1MCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTUxKSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTUyKSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNTYpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE1Nykgbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNTgpIG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE2MikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTY2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxNjcpIG4uZ2V0U3RtdHMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMTY4KSBmaW5hbCBTdGF0ZW1lbnQgcyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudAorICBMaW5lIDE2OCkgbi5nZXRTdG10cygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PgorICBMaW5lIDE2OSkgcy5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE3NSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTc5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxODMpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDE4NCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxODUpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTg5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxOTApIG4uZ2V0RXhjZXB0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxOTEpIG4uZ2V0Q2F0Y2hCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMTk1KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAxOTkpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDIwMCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMDQpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDIwNSkgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDIwNikgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMDgpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjA5KSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAyMDkpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDIxMCkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDIxMykgbi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMTQpIGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgMjE0KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSAyMTUpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMTgpIG4uZ2V0RXh0ZW5kcygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMTkpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDIxOSkgbi5nZXRFeHRlbmRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAyMjApIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMjQpIG4uZ2V0SW1wbGVtZW50cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMjUpIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZQorICBMaW5lIDIyNSkgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSAyMjYpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMjkpIG4uZ2V0TWVtYmVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyMzApIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSAyMzApIG4uZ2V0TWVtYmVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPgorICBMaW5lIDIzMSkgbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjM3KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyMzgpIG4uZ2V0U2NvcGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjM5KSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyNDEpIG4uZ2V0VHlwZUFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjQyKSBmaW5hbCBUeXBlIHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgMjQyKSBuLmdldFR5cGVBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDI0MykgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDI0OSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjUwKSBuLmdldFBhY2thZ2UoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjUxKSBuLmdldFBhY2thZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDI1Mykgbi5nZXRJbXBvcnRzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDI1NCkgZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gaSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbgorICBMaW5lIDI1NCkgbi5nZXRJbXBvcnRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24+CisgIExpbmUgMjU1KSBpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjU4KSBuLmdldFR5cGVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDI1OSkgZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbgorICBMaW5lIDI1OSkgbi5nZXRUeXBlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPgorICBMaW5lIDI2MCkgdHlwZURlY2xhcmF0aW9uLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjY2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyNjcpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyNjgpIG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDI2OSkgbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjczKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyNzQpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyNzUpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjc3KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDI3OCkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgMjc4KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSAyNzkpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAyODIpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjgzKSBmaW5hbCBUeXBlUGFyYW1ldGVyIHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcgorICBMaW5lIDI4Mykgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgMjg0KSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjg3KSBuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMjg4KSBmaW5hbCBQYXJhbWV0ZXIgcCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcgorICBMaW5lIDI4OCkgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgMjg5KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMjkyKSBuLmdldFRocm93cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAyOTMpIGZpbmFsIE5hbWVFeHByIG5hbWUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcgorICBMaW5lIDI5Mykgbi5nZXRUaHJvd3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByPgorICBMaW5lIDI5NCkgbmFtZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDI5Nykgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzAxKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMDUpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDMwNikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMDcpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMTEpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDMxNSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzE2KSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzE3KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDMyMikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzI2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMjcpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzMjgpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzMzKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzMzQpIG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDMzOCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzM5KSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzQwKSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM0Mikgbi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNDMpIGZpbmFsIEFubm90YXRpb25FeHByIGEgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcgorICBMaW5lIDM0Mykgbi5nZXRBbm5vdGF0aW9ucygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+CisgIExpbmUgMzQ0KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzQ3KSBuLmdldEFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzQ4KSBmaW5hbCBFeHByZXNzaW9uIGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgMzQ4KSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgMzQ5KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzUyKSBuLmdldENsYXNzQm9keSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzNTMpIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24KKyAgTGluZSAzNTMpIG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMzU0KSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzNjApIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM2MSkgbi5nZXRKYXZhRG9jKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM2Mikgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzNjQpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgMzY1KSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSAzNjUpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDM2NikgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM2OSkgbi5nZXRJbXBsZW1lbnRzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM3MCkgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlCisgIExpbmUgMzcwKSBuLmdldEltcGxlbWVudHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPgorICBMaW5lIDM3MSkgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM3NCkgbi5nZXRFbnRyaWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM3NSkgZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uCisgIExpbmUgMzc1KSBuLmdldEVudHJpZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uPgorICBMaW5lIDM3NikgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM3OSkgbi5nZXRNZW1iZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM4MCkgZmluYWwgQm9keURlY2xhcmF0aW9uIG1lbWJlciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBMaW5lIDM4MCkgbi5nZXRNZW1iZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24+CisgIExpbmUgMzgxKSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzODcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDM4OCkgIW4uaXNUaGlzKCkgPT0+IGJvb2xlYW4KKyAgTGluZSAzODkpIG4uZ2V0RXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzOTApIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgMzkzKSBuLmdldFR5cGVBcmdzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDM5NCkgZmluYWwgVHlwZSB0ID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZQorICBMaW5lIDM5NCkgbi5nZXRUeXBlQXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZT4KKyAgTGluZSAzOTUpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSAzOTgpIG4uZ2V0QXJncygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSAzOTkpIGZpbmFsIEV4cHJlc3Npb24gZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSAzOTkpIG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA0MDApIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MDYpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQwNykgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MTEpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQxMikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDE2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MTcpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0MTgpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDIwKSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDQyMSkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNDIxKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA0MjIpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MjUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDI2KSBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yCisgIExpbmUgNDI2KSBuLmdldFZhcmlhYmxlcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPgorICBMaW5lIDQyNykgdmFyLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDMyKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0MzMpIG4uZ2V0VmFyaWFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQzNCkgbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDM1KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQzOSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDQwKSBuLmdldEluaXQoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDQxKSBmaW5hbCBFeHByZXNzaW9uIGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDQxKSBuLmdldEluaXQoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNDQyKSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDQ1KSBuLmdldENvbXBhcmUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDQ2KSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ0OCkgbi5nZXRVcGRhdGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDQ5KSBmaW5hbCBFeHByZXNzaW9uIGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNDQ5KSBuLmdldFVwZGF0ZSgpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA0NTApIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0NTMpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDU3KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0NTgpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0NTkpIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ2MCkgbi5nZXRFbHNlU3RtdCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA0NjEpIG4uZ2V0RWxzZVN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ2NikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDY3KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ3MSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDcyKSBuLmdldEphdmFEb2MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNDczKSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ3NSkgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDc5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0ODApIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDgxKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ4NSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDg5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA0OTMpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDQ5NykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNDk4KSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUwMikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTA2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1MTApIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUxNCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTE1KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUxOSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTIwKSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1MjQpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUyNSkgbi5nZXRTY29wZSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MjYpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDUyOCkgbi5nZXRUeXBlQXJncygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1MjkpIGZpbmFsIFR5cGUgdCA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA1MjkpIG4uZ2V0VHlwZUFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNTMwKSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTMzKSBuLmdldEFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTM0KSBmaW5hbCBFeHByZXNzaW9uIGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uCisgIExpbmUgNTM0KSBuLmdldEFyZ3MoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+CisgIExpbmUgNTM1KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTQxKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NDIpIG4uZ2V0SmF2YURvYygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1NDMpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTQ1KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU0NikgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNTQ2KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA1NDcpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NTApIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTUxKSBmaW5hbCBUeXBlUGFyYW1ldGVyIHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcgorICBMaW5lIDU1MSkgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI+CisgIExpbmUgNTUyKSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTU1KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU1Nikgbi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDU1NykgZmluYWwgUGFyYW1ldGVyIHAgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIKKyAgTGluZSA1NTcpIG4uZ2V0UGFyYW1ldGVycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPgorICBMaW5lIDU1OCkgcC5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU2MSkgbi5nZXRUaHJvd3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTYyKSBmaW5hbCBOYW1lRXhwciBuYW1lID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIKKyAgTGluZSA1NjIpIG4uZ2V0VGhyb3dzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcj4KKyAgTGluZSA1NjMpIG5hbWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NjYpIG4uZ2V0Qm9keSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA1NjcpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTcyKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NzYpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU3Nykgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1NzgpIG4uZ2V0UGFpcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTc5KSBmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcgorICBMaW5lIDU3OSkgbi5nZXRQYWlycygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyPgorICBMaW5lIDU4MCkgbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU4NikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNTkwKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1OTEpIG4uZ2V0U2NvcGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTkyKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA1OTQpIG4uZ2V0VHlwZUFyZ3MoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNTk1KSBmaW5hbCBUeXBlIHQgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlCisgIExpbmUgNTk1KSBuLmdldFR5cGVBcmdzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPgorICBMaW5lIDU5NikgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDU5OSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MDApIG4uZ2V0QXJncygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2MDEpIGZpbmFsIEV4cHJlc3Npb24gZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24KKyAgTGluZSA2MDEpIG4uZ2V0QXJncygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4KKyAgTGluZSA2MDIpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MDUpIG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYwNikgZmluYWwgQm9keURlY2xhcmF0aW9uIG1lbWJlciA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbgorICBMaW5lIDYwNikgbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbj4KKyAgTGluZSA2MDcpIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYxMykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjE0KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYxNSkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNjE1KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MTYpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MTkpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjIzKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MjQpIG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNjI1KSBmaW5hbCBBbm5vdGF0aW9uRXhwciBhID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIKKyAgTGluZSA2MjUpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPgorICBMaW5lIDYyNikgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYyOSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2MzApIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDYzNCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjM1KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDYzNikgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNjM2KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA2MzcpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NDApIGZpbmFsIFR5cGUgdHlwZSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUKKyAgTGluZSA2NDApIG4uZ2V0VHlwZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU+CisgIExpbmUgNjQxKSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjQzKSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NDcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY1MSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjUyKSBuLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjU2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NTcpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjYxKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NjIpIG4uZ2V0RXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2NjMpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjY4KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NjkpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjcwKSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2NzQpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY3OCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjc5KSBuLmdldENsYXNzRXhwcigpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2ODApIG4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2ODUpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY4Nikgbi5nZXRMYWJlbCgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2ODcpIG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY4OSkgbi5nZXRTdG10cygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA2OTApIGZpbmFsIFN0YXRlbWVudCBzID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50CisgIExpbmUgNjkwKSBuLmdldFN0bXRzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+CisgIExpbmUgNjkxKSBzLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNjk3KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA2OTgpIG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDY5OSkgbi5nZXRFbnRyaWVzKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDcwMCkgZmluYWwgU3dpdGNoRW50cnlTdG10IGUgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQKKyAgTGluZSA3MDApIG4uZ2V0RW50cmllcygpID09PiBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10PgorICBMaW5lIDcwMSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcwNykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzA4KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcwOSkgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzEzKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3MTQpIG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDcxNSkgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcyMCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzIxKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDcyNSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzI2KSBuLmdldFJlc291cmNlcygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3MjcpIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHYgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcgorICBMaW5lIDcyNykgbi5nZXRSZXNvdXJjZXMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByPgorICBMaW5lIDcyOCkgdi5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDczMSkgbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzMyKSBuLmdldENhdGNocygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA3MzMpIGZpbmFsIENhdGNoQ2xhdXNlIGMgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZQorICBMaW5lIDczMykgbi5nZXRDYXRjaHMoKSA9PT4gamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlPgorICBMaW5lIDczNCkgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDczNykgbi5nZXRGaW5hbGx5QmxvY2soKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzM4KSBuLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzQzKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3NDQpIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3NDgpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc0OSkgbi5nZXRUeXBlQm91bmQoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgNzUwKSBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUKKyAgTGluZSA3NTApIG4uZ2V0VHlwZUJvdW5kKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4KKyAgTGluZSA3NTEpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3NTcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc1OCkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3NjIpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc2NikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzY3KSBuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc2OCkgZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByCisgIExpbmUgNzY4KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4KKyAgTGluZSA3NjkpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3NzIpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzczKSBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdiA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcgorICBMaW5lIDc3Mykgbi5nZXRWYXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+CisgIExpbmUgNzc0KSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzc5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3ODApIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc4MSkgbi5nZXRJbml0KCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDc4Mikgbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3ODcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gdm9pZAorICBMaW5lIDc5MSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiB2b2lkCisgIExpbmUgNzk1KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3OTYpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA3OTcpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODAxKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4MDIpIG4uZ2V0RXh0ZW5kcygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MDMpIG4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODA1KSBuLmdldFN1cGVyKCkgIT0gbnVsbCA9PT4gYm9vbGVhbgorICBMaW5lIDgwNikgbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODEyKSBuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODEzKSBmaW5hbCBQYXJhbWV0ZXIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcgorICBMaW5lIDgxMykgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+CisgIExpbmUgODE0KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODE3KSBuLmdldEJvZHkoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODE4KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gdm9pZAorICBMaW5lIDgyNCkgbi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MjUpIGZpbmFsIFR5cGVQYXJhbWV0ZXIgYSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyCisgIExpbmUgODI1KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcj4KKyAgTGluZSA4MjYpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4MjkpIG4uZ2V0U2NvcGUoKSAhPSBudWxsID09PiBib29sZWFuCisgIExpbmUgODMwKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKKyAgTGluZSA4MzYpIG4uZ2V0VHlwZSgpICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4MzcpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiB2b2lkCisgIExpbmUgODQyKSBuICE9IG51bGwgPT0+IGJvb2xlYW4KKyAgTGluZSA4NDMpIG4uYWNjZXB0KHRoaXMsIGFyZykgPT0+IHZvaWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfQ29tbWVudHNJbnNlcnRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0NvbW1lbnRzSW5zZXJ0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2YyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0NvbW1lbnRzSW5zZXJ0ZXIudHh0CkBAIC0wLDAgKzEsNDkgQEAKKyAgTGluZSA1MikgY29tbWVudHMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuVHJlZVNldC5pc0VtcHR5KCkKKyAgTGluZSA2MykgY3UuZ2V0Q2hpbGRyZW5Ob2RlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpCisgIExpbmUgNjQpIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjaGlsZHJlbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb24oamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjYpIGNvbW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgNjYpIGNvbW1lbnRzLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5UcmVlU2V0Lml0ZXJhdG9yKCkKKyAgTGluZSA2NykgY3UuZ2V0UGFja2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCkKKyAgTGluZSA2OCkgY2hpbGRyZW4uaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA2OCkgUG9zaXRpb25VdGlscy5hcmVJbk9yZGVyKGZpcnN0Q29tbWVudCwgY2hpbGRyZW4uZ2V0KDApKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuYXJlSW5PcmRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2OSkgY2hpbGRyZW4uZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDcwKSBjdS5zZXRDb21tZW50KGZpcnN0Q29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA3MSkgY29tbWVudHMucmVtb3ZlKGZpcnN0Q29tbWVudCkgPT0+IGphdmEudXRpbC5UcmVlU2V0LnJlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgwKSBjb21tZW50c1RvQXR0cmlidXRlLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLlRyZWVTZXQuaXNFbXB0eSgpCisgIExpbmUgODQpIGluc2VydENvbW1lbnRzKChDb21waWxhdGlvblVuaXQpIG5vZGUsIGNvbW1lbnRzVG9BdHRyaWJ1dGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuQ29tbWVudHNJbnNlcnRlci5pbnNlcnRDb21tZW50cyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCwgamF2YS51dGlsLlRyZWVTZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50PikKKyAgTGluZSA5NSkgbm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkKKyAgTGluZSA5NikgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDEpIFBvc2l0aW9uVXRpbHMubm9kZUNvbnRhaW5zKGNoaWxkLCBjLCBjb25maWd1cmF0aW9uLmRvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMubm9kZUNvbnRhaW5zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBib29sZWFuKQorICBMaW5lIDEwMykgY29tbWVudHNJbnNpZGVDaGlsZC5hZGQoYykgPT0+IGphdmEudXRpbC5UcmVlU2V0LmFkZChFKQorICBMaW5lIDEwNikgY29tbWVudHNUb0F0dHJpYnV0ZS5yZW1vdmVBbGwoY29tbWVudHNJbnNpZGVDaGlsZCkgPT0+IGphdmEudXRpbC5BYnN0cmFjdFNldC5yZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+KQorICBMaW5lIDEwNykgaW5zZXJ0Q29tbWVudHMoY2hpbGQsIGNvbW1lbnRzSW5zaWRlQ2hpbGQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuQ29tbWVudHNJbnNlcnRlci5pbnNlcnRDb21tZW50cyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEudXRpbC5UcmVlU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudD4pCisgIExpbmUgMTE0KSBjb21tZW50LmlzTGluZUNvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LmlzTGluZUNvbW1lbnQoKQorICBMaW5lIDExNikgY2hpbGQuZ2V0RW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRFbmQoKQorICBMaW5lIDExNikgY29tbWVudC5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDExNykgYXR0cmlidXRlTGluZUNvbW1lbnRUb05vZGVPckNoaWxkKGNoaWxkLCBjb21tZW50LmFzTGluZUNvbW1lbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Db21tZW50c0luc2VydGVyLmF0dHJpYnV0ZUxpbmVDb21tZW50VG9Ob2RlT3JDaGlsZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQpCisgIExpbmUgMTE4KSBjb21tZW50LmFzTGluZUNvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LmFzTGluZUNvbW1lbnQoKQorICBMaW5lIDExOSkgYXR0cmlidXRlZENvbW1lbnRzLmFkZChjb21tZW50KSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTMwKSBjaGlsZHJlbkFuZENvbW1lbnRzLmFkZEFsbChjaGlsZHJlbikgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMTMxKSBjaGlsZHJlbkFuZENvbW1lbnRzLmFkZEFsbChjb21tZW50c1RvQXR0cmlidXRlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxMzIpIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjaGlsZHJlbkFuZENvbW1lbnRzLCBjb25maWd1cmF0aW9uLmRvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihqYXZhLnV0aWwuTGlzdDxUPiwgYm9vbGVhbikKKyAgTGluZSAxMzgpIHByZXZpb3VzQ29tbWVudC5pc09ycGhhbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuaXNPcnBoYW4oKQorICBMaW5lIDE0MikgdGhpbmcuaGFzQ29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzQ29tbWVudCgpCisgIExpbmUgMTQ0KSB0aGVyZUFyZUxpbmVzQmV0d2VlbihwcmV2aW91c0NvbW1lbnQsIHRoaW5nKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkNvbW1lbnRzSW5zZXJ0ZXIudGhlcmVBcmVMaW5lc0JldHdlZW4oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTQ1KSB0aGluZy5zZXRDb21tZW50KHByZXZpb3VzQ29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxNDYpIGF0dHJpYnV0ZWRDb21tZW50cy5hZGQocHJldmlvdXNDb21tZW50KSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTUzKSBjb21tZW50c1RvQXR0cmlidXRlLnJlbW92ZUFsbChhdHRyaWJ1dGVkQ29tbWVudHMpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RTZXQucmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PikKKyAgTGluZSAxNTcpIGMuaXNPcnBoYW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LmlzT3JwaGFuKCkKKyAgTGluZSAxNTgpIG5vZGUuYWRkT3JwaGFuQ29tbWVudChjKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFkZE9ycGhhbkNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDE2Nikgbm9kZS5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDE2NikgbGluZUNvbW1lbnQuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSAxNjcpIG5vZGUuaGFzQ29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzQ29tbWVudCgpCisgIExpbmUgMTY5KSBub2RlLnNldENvbW1lbnQobGluZUNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTc2KSBjaGlsZHJlbi5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIEU+KQorICBMaW5lIDE3Nikgbm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkKKyAgTGluZSAxNzcpIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjaGlsZHJlbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb24oamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTc4KSBDb2xsZWN0aW9ucy5yZXZlcnNlKGNoaWxkcmVuKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnJldmVyc2UoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+KQorICBMaW5lIDE4MSkgYXR0cmlidXRlTGluZUNvbW1lbnRUb05vZGVPckNoaWxkKGNoaWxkLCBsaW5lQ29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Db21tZW50c0luc2VydGVyLmF0dHJpYnV0ZUxpbmVDb21tZW50VG9Ob2RlT3JDaGlsZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQpCisgIExpbmUgMTkxKSBQb3NpdGlvblV0aWxzLmFyZUluT3JkZXIoYSwgYikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmFyZUluT3JkZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTkyKSB0aGVyZUFyZUxpbmVzQmV0d2VlbihiLCBhKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkNvbW1lbnRzSW5zZXJ0ZXIudGhlcmVBcmVMaW5lc0JldHdlZW4oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTk0KSBhLmdldEVuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0RW5kKCkKKyAgTGluZSAxOTUpIGIuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfSmF2YVBhcnNlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0phdmFQYXJzZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZGE2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX0phdmFQYXJzZXIudHh0CkBAIC0wLDAgKzEsNDkgQEAKKyAgTGluZSA3MykgYXN0UGFyc2VyLlJlSW5pdChwcm92aWRlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5BU1RQYXJzZXIuUmVJbml0KGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcikKKyAgTGluZSA5MCkgZ2V0UGFyc2VyRm9yUHJvdmlkZXIocHJvdmlkZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5nZXRQYXJzZXJGb3JQcm92aWRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgOTEpIHN0YXJ0LnBhcnNlKHBhcnNlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LnBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5BU1RQYXJzZXIpCisgIExpbmUgOTIpIGFzdFBhcnNlci5nZXRDb21tZW50c0NvbGxlY3Rpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVFBhcnNlci5nZXRDb21tZW50c0NvbGxlY3Rpb24oKQorICBMaW5lIDkzKSBjb21tZW50c0luc2VydGVyLmluc2VydENvbW1lbnRzKHJlc3VsdE5vZGUsIGNvbW1lbnRzLmNvcHkoKS5nZXRDb21tZW50cygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkNvbW1lbnRzSW5zZXJ0ZXIuaW5zZXJ0Q29tbWVudHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBqYXZhLnV0aWwuVHJlZVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ+KQorICBMaW5lIDkzKSBjb21tZW50cy5jb3B5KCkuZ2V0Q29tbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24uZ2V0Q29tbWVudHMoKQorICBMaW5lIDkzKSBjb21tZW50cy5jb3B5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudHNDb2xsZWN0aW9uLmNvcHkoKQorICBMaW5lIDk1KSBPcHRpb25hbC5vZihyZXN1bHROb2RlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgOTUpIE9wdGlvbmFsLm9mKGFzdFBhcnNlci5nZXRUb2tlbnMoKSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDk1KSBhc3RQYXJzZXIuZ2V0VG9rZW5zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5BU1RQYXJzZXIuZ2V0VG9rZW5zKCkKKyAgTGluZSA5NSkgT3B0aW9uYWwub2YoYXN0UGFyc2VyLmdldENvbW1lbnRzQ29sbGVjdGlvbigpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgOTUpIGFzdFBhcnNlci5nZXRDb21tZW50c0NvbGxlY3Rpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVFBhcnNlci5nZXRDb21tZW50c0NvbGxlY3Rpb24oKQorICBMaW5lIDEwMikgcHJvdmlkZXIuY2xvc2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVyLmNsb3NlKCkKKyAgTGluZSAxMTkpIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihpbiwgZW5jb2RpbmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMTE5KSBwcm92aWRlcihpbiwgZW5jb2RpbmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCkKKyAgTGluZSAxMzIpIHBhcnNlKGluLCBVVEY4KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQorICBMaW5lIDE0Nikgc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGZpbGUsIGVuY29kaW5nKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnNpbXBsaWZpZWRQYXJzZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydDxUPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVyKQorICBMaW5lIDE0NikgcHJvdmlkZXIoZmlsZSwgZW5jb2RpbmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEuaW8uRmlsZSwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQorICBMaW5lIDE2MCkgc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGZpbGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMTYwKSBwcm92aWRlcihmaWxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmlvLkZpbGUpCisgIExpbmUgMTc0KSBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocGF0aCwgZW5jb2RpbmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMTc0KSBwcm92aWRlcihwYXRoLCBlbmNvZGluZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXIoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQpCisgIExpbmUgMTg4KSBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocGF0aCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5zaW1wbGlmaWVkUGFyc2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQ8VD4sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcikKKyAgTGluZSAxODgpIHByb3ZpZGVyKHBhdGgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEubmlvLmZpbGUuUGF0aCkKKyAgTGluZSAyMDApIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihyZWFkZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMjAwKSBwcm92aWRlcihyZWFkZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEuaW8uUmVhZGVyKQorICBMaW5lIDIxMikgc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGNvZGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMjEyKSBwcm92aWRlcihjb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIyNCkgc2ltcGxpZmllZFBhcnNlKEJMT0NLLCBwcm92aWRlcihibG9ja1N0YXRlbWVudCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5zaW1wbGlmaWVkUGFyc2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQ8VD4sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcikKKyAgTGluZSAyMjQpIHByb3ZpZGVyKGJsb2NrU3RhdGVtZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIzNikgc2ltcGxpZmllZFBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoc3RhdGVtZW50KSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnNpbXBsaWZpZWRQYXJzZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydDxUPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVyKQorICBMaW5lIDIzNikgcHJvdmlkZXIoc3RhdGVtZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI0MCkgbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKSkucGFyc2UoY29udGV4dCwgcHJvdmlkZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydDxOPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVyKQorICBMaW5lIDI0MSkgcmVzdWx0LmlzU3VjY2Vzc2Z1bCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQuaXNTdWNjZXNzZnVsKCkKKyAgTGluZSAyNDIpIHJlc3VsdC5nZXRSZXN1bHQoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMjQyKSByZXN1bHQuZ2V0UmVzdWx0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdC5nZXRSZXN1bHQoKQorICBMaW5lIDI0NCkgcmVzdWx0LmdldFByb2JsZW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdC5nZXRQcm9ibGVtcygpCisgIExpbmUgMjU2KSBzaW1wbGlmaWVkUGFyc2UoSU1QT1JUX0RFQ0xBUkFUSU9OLCBwcm92aWRlcihpbXBvcnREZWNsYXJhdGlvbikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5zaW1wbGlmaWVkUGFyc2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQ8VD4sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcikKKyAgTGluZSAyNTYpIHByb3ZpZGVyKGltcG9ydERlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI2OCkgc2ltcGxpZmllZFBhcnNlKEVYUFJFU1NJT04sIHByb3ZpZGVyKGV4cHJlc3Npb24pKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMjY4KSBwcm92aWRlcihleHByZXNzaW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI4MCkgc2ltcGxpZmllZFBhcnNlKEFOTk9UQVRJT04sIHByb3ZpZGVyKGFubm90YXRpb24pKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMjgwKSBwcm92aWRlcihhbm5vdGF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI5Mikgc2ltcGxpZmllZFBhcnNlKEFOTk9UQVRJT05fQk9EWSwgcHJvdmlkZXIoYm9keSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5zaW1wbGlmaWVkUGFyc2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQ8VD4sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcikKKyAgTGluZSAyOTIpIHByb3ZpZGVyKGJvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzA0KSBzaW1wbGlmaWVkUGFyc2UoQ0xBU1NfQk9EWSwgcHJvdmlkZXIoYm9keSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5zaW1wbGlmaWVkUGFyc2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQ8VD4sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcikKKyAgTGluZSAzMDQpIHByb3ZpZGVyKGJvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzE2KSBzaW1wbGlmaWVkUGFyc2UoSU5URVJGQUNFX0JPRFksIHByb3ZpZGVyKGJvZHkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuc2ltcGxpZmllZFBhcnNlKGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0PFQ+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIpCisgIExpbmUgMzE2KSBwcm92aWRlcihib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9QYXJzZVByb2JsZW1FeGNlcHRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9QYXJzZVByb2JsZW1FeGNlcHRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjU2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1BhcnNlUHJvYmxlbUV4Y2VwdGlvbi50eHQKQEAgLTAsMCArMSwxMCBAQAorICBMaW5lIDIxKSBjcmVhdGVNZXNzYWdlKGFzc2VydE5vdE51bGwocHJvYmxlbXMpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUHJvYmxlbUV4Y2VwdGlvbi5jcmVhdGVNZXNzYWdlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm9ibGVtPikKKyAgTGluZSAyMSkgYXNzZXJ0Tm90TnVsbChwcm9ibGVtcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCisgIExpbmUgMjYpIHNpbmdsZXRvbkxpc3QobmV3IFByb2JsZW0odGhyb3dhYmxlLmdldE1lc3NhZ2UoKSwgT3B0aW9uYWwuZW1wdHkoKSwgT3B0aW9uYWwub2YodGhyb3dhYmxlKSkpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChUKQorICBMaW5lIDI2KSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpID09PiBqYXZhLmxhbmcuVGhyb3dhYmxlLmdldE1lc3NhZ2UoKQorICBMaW5lIDI2KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDI2KSBPcHRpb25hbC5vZih0aHJvd2FibGUpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAzMikgbWVzc2FnZS5hcHBlbmQocHJvYmxlbS50b1N0cmluZygpKS5hcHBlbmQoRU9MKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzIpIG1lc3NhZ2UuYXBwZW5kKHByb2JsZW0udG9TdHJpbmcoKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyKSBwcm9ibGVtLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm9ibGVtLnRvU3RyaW5nKCkKKyAgTGluZSAzNCkgbWVzc2FnZS50b1N0cmluZygpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci50b1N0cmluZygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1BhcnNlUmVzdWx0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfUGFyc2VSZXN1bHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNmFkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1BhcnNlUmVzdWx0LnR4dApAQCAtMCwwICsxLDE5IEBACisgIExpbmUgMjkpIGFzc2VydE5vdE51bGwoY29tbWVudHNDb2xsZWN0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGwoVCkKKyAgTGluZSAzMCkgYXNzZXJ0Tm90TnVsbChyZXN1bHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDMxKSBhc3NlcnROb3ROdWxsKHByb2JsZW1zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGwoVCkKKyAgTGluZSAzMikgYXNzZXJ0Tm90TnVsbCh0b2tlbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDM5KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDM5KSBzaW5nbGV0b25MaXN0KG5ldyBQcm9ibGVtKHRocm93YWJsZS5nZXRNZXNzYWdlKCksIE9wdGlvbmFsLmVtcHR5KCksIE9wdGlvbmFsLm9mKHRocm93YWJsZSkpKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoVCkKKyAgTGluZSAzOSkgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSA9PT4gamF2YS5sYW5nLlRocm93YWJsZS5nZXRNZXNzYWdlKCkKKyAgTGluZSAzOSkgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSAzOSkgT3B0aW9uYWwub2YodGhyb3dhYmxlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMzkpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgMzkpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgNDYpIHByb2JsZW1zLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgNDYpIHJlc3VsdC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgNzkpIGlzU3VjY2Vzc2Z1bCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQuaXNTdWNjZXNzZnVsKCkKKyAgTGluZSA4MikgbmV3IFN0cmluZ0J1aWxkZXIoIlBhcnNpbmcgZmFpbGVkOiIpLmFwcGVuZChFT0wpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4NCkgbWVzc2FnZS5hcHBlbmQocHJvYmxlbS50b1N0cmluZygpKS5hcHBlbmQoRU9MKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODQpIG1lc3NhZ2UuYXBwZW5kKHByb2JsZW0udG9TdHJpbmcoKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDg0KSBwcm9ibGVtLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm9ibGVtLnRvU3RyaW5nKCkKKyAgTGluZSA4NikgbWVzc2FnZS50b1N0cmluZygpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci50b1N0cmluZygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1BhcnNlU3RhcnQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9QYXJzZVN0YXJ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY4MDBkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9QYXJzZVN0YXJ0LnR4dApAQCAtMCwwICsxLDIgQEAKKyAgTGluZSAyOCkgcC5DbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGZhbHNlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVFBhcnNlci5DbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGJvb2xlYW4pCisgIExpbmUgMjkpIHAuQ2xhc3NPckludGVyZmFjZUJvZHlEZWNsYXJhdGlvbih0cnVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVFBhcnNlci5DbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGJvb2xlYW4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1BhcnNlckNvbmZpZ3VyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9QYXJzZXJDb25maWd1cmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9QYXJzZXJDb25maWd1cmF0aW9uLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qb3NpdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1Bvc2l0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdlNzllCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qb3NpdGlvbi50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgNzgpIHZhbGlkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi52YWxpZCgpCisgIExpbmUgODIpIHZhbGlkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi52YWxpZCgpCisgIExpbmUgODkpIGFzc2VydE5vdE51bGwocG9zaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDEwMSkgYXNzZXJ0Tm90TnVsbChwb3NpdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCisgIExpbmUgMTEzKSBhc3NlcnROb3ROdWxsKG8pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDExNCkgaXNCZWZvcmUobykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi5pc0JlZm9yZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgMTE3KSBpc0FmdGVyKG8pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24uaXNBZnRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgMTI2KSBnZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxMjYpIG8uZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1Byb2JsZW0udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qcm9ibGVtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QyNGVlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9Qcm9ibGVtLnR4dApAQCAtMCwwICsxLDcgQEAKKyAgTGluZSAxNikgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGwoVCkKKyAgTGluZSAxNykgYXNzZXJ0Tm90TnVsbChyYW5nZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCisgIExpbmUgMTgpIGFzc2VydE5vdE51bGwoY2F1c2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDI0KSByYW5nZS5pZlByZXNlbnQociAtPiBzdHIuYXBwZW5kKCIgIikuYXBwZW5kKHIpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlmUHJlc2VudChqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI8PyBzdXBlciBUPikKKyAgTGluZSAyNCkgc3RyLmFwcGVuZCgiICIpLmFwcGVuZChyKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQpIHN0ci5hcHBlbmQoIiAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjUpIHN0ci50b1N0cmluZygpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci50b1N0cmluZygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1Byb3ZpZGVycy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1Byb3ZpZGVycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3NmQzMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfUHJvdmlkZXJzLnR4dApAQCAtMCwwICsxLDE4IEBACisgIExpbmUgMTYpIENoYXJzZXQuZm9yTmFtZSgidXRmLTgiKSA9PT4gamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmZvck5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMikgYXNzZXJ0Tm90TnVsbChyZWFkZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDI2KSBhc3NlcnROb3ROdWxsKGlucHV0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGwoVCkKKyAgTGluZSAyNykgYXNzZXJ0Tm90TnVsbChlbmNvZGluZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCisgIExpbmUgMjkpIGVuY29kaW5nLm5hbWUoKSA9PT4gamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0Lm5hbWUoKQorICBMaW5lIDM4KSBwcm92aWRlcihpbnB1dCwgVVRGOCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXIoamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQorICBMaW5lIDQyKSBwcm92aWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGFzc2VydE5vdE51bGwoZmlsZSkpLCBhc3NlcnROb3ROdWxsKGVuY29kaW5nKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXIoamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQorICBMaW5lIDQyKSBhc3NlcnROb3ROdWxsKGZpbGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDQyKSBhc3NlcnROb3ROdWxsKGVuY29kaW5nKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGwoVCkKKyAgTGluZSA0NikgcHJvdmlkZXIoYXNzZXJ0Tm90TnVsbChmaWxlKSwgVVRGOCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXIoamF2YS5pby5GaWxlLCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQpCisgIExpbmUgNDYpIGFzc2VydE5vdE51bGwoZmlsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCisgIExpbmUgNTApIHByb3ZpZGVyKEZpbGVzLm5ld0lucHV0U3RyZWFtKGFzc2VydE5vdE51bGwocGF0aCkpLCBhc3NlcnROb3ROdWxsKGVuY29kaW5nKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXIoamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQorICBMaW5lIDUwKSBGaWxlcy5uZXdJbnB1dFN0cmVhbShhc3NlcnROb3ROdWxsKHBhdGgpKSA9PT4gamF2YS5uaW8uZmlsZS5GaWxlcy5uZXdJbnB1dFN0cmVhbShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuT3Blbk9wdGlvbi4uLikKKyAgTGluZSA1MCkgYXNzZXJ0Tm90TnVsbChwYXRoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGwoVCkKKyAgTGluZSA1MCkgYXNzZXJ0Tm90TnVsbChlbmNvZGluZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCisgIExpbmUgNTQpIHByb3ZpZGVyKGFzc2VydE5vdE51bGwocGF0aCksIFVURjgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0KQorICBMaW5lIDU0KSBhc3NlcnROb3ROdWxsKHBhdGgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbChUKQorICBMaW5lIDU4KSBhc3NlcnROb3ROdWxsKHNvdXJjZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsKFQpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1JhbmdlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfUmFuZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTU0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX1JhbmdlLnR4dApAQCAtMCwwICsxLDIzIEBACisgIExpbmUgOSkgcmFuZ2UoUG9zaXRpb24uVU5LTk9XTiwgUG9zaXRpb24uVU5LTk9XTikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZS5yYW5nZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikKKyAgTGluZSAzMCkgcG9zKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24ucG9zKGludCwgaW50KQorICBMaW5lIDMwKSBwb3MoZW5kTGluZSwgZW5kQ29sdW1uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLnBvcyhpbnQsIGludCkKKyAgTGluZSAzNCkgcmFuZ2UoYmVnaW4ud2l0aENvbHVtbihjb2x1bW4pLCBlbmQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UucmFuZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgMzQpIGJlZ2luLndpdGhDb2x1bW4oY29sdW1uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLndpdGhDb2x1bW4oaW50KQorICBMaW5lIDM4KSByYW5nZShiZWdpbi53aXRoTGluZShsaW5lKSwgZW5kKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLnJhbmdlKGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKQorICBMaW5lIDM4KSBiZWdpbi53aXRoTGluZShsaW5lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLndpdGhMaW5lKGludCkKKyAgTGluZSA0MikgcmFuZ2UoYmVnaW4sIGVuZC53aXRoQ29sdW1uKGNvbHVtbikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UucmFuZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgNDIpIGVuZC53aXRoQ29sdW1uKGNvbHVtbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi53aXRoQ29sdW1uKGludCkKKyAgTGluZSA0NikgcmFuZ2UoYmVnaW4sIGVuZC53aXRoTGluZShsaW5lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZS5yYW5nZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikKKyAgTGluZSA0NikgZW5kLndpdGhMaW5lKGxpbmUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24ud2l0aExpbmUoaW50KQorICBMaW5lIDUwKSByYW5nZShiZWdpbiwgdGhpcy5lbmQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UucmFuZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgNTQpIHJhbmdlKHRoaXMuYmVnaW4sIGVuZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZS5yYW5nZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikKKyAgTGluZSA1OCkgYmVnaW4uaXNCZWZvcmUob3RoZXIuYmVnaW4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24uaXNCZWZvcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKQorICBMaW5lIDU4KSBlbmQuaXNBZnRlcihvdGhlci5lbmQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24uaXNBZnRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgNjIpIGVuZC5pc0JlZm9yZShwb3NpdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi5pc0JlZm9yZShjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgNjYpIGJlZ2luLmlzQWZ0ZXIocG9zaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24uaXNBZnRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgNzIpIGdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDcyKSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDc2KSBiZWdpbi5lcXVhbHMocmFuZ2UuYmVnaW4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24uZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzYpIGVuZC5lcXVhbHMocmFuZ2UuZW5kKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgyKSBiZWdpbi5oYXNoQ29kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24uaGFzaENvZGUoKQorICBMaW5lIDgyKSBlbmQuaGFzaENvZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLmhhc2hDb2RlKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0FjY2Vzc1NwZWNpZmllci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BY2Nlc3NTcGVjaWZpZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BY2Nlc3NTcGVjaWZpZXIudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BcnJheUJyYWNrZXRQYWlyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0FycmF5QnJhY2tldFBhaXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWFjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BcnJheUJyYWNrZXRQYWlyLnR4dApAQCAtMCwwICsxLDUgQEAKKyAgTGluZSAyMykgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuc2V0QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPikKKyAgTGluZSAyNykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyLCBBKQorICBMaW5lIDMxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIsIEEpCisgIExpbmUgMzUpIGVuc3VyZU5vdE51bGwoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA0MCkgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9BcnJheUNyZWF0aW9uTGV2ZWwudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfQXJyYXlDcmVhdGlvbkxldmVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDk2ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfQXJyYXlDcmVhdGlvbkxldmVsLnR4dApAQCAtMCwwICsxLDcgQEAKKyAgTGluZSAyNSkgc2V0RGltZW5zaW9uKGRpbWVuc2lvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsLnNldERpbWVuc2lvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSAyNikgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDMwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbCwgQSkKKyAgTGluZSAzNCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwsIEEpCisgIExpbmUgMzkpIHNldEFzUGFyZW50Tm9kZU9mKGRpbWVuc2lvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDcpIGVuc3VyZU5vdE51bGwoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA1Mikgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Db21waWxhdGlvblVuaXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfQ29tcGlsYXRpb25Vbml0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjc0MTIxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfQ29tcGlsYXRpb25Vbml0LnR4dApAQCAtMCwwICsxLDEwMyBAQAorICBMaW5lIDc5KSBzZXRQYWNrYWdlKHBha2FnZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LnNldFBhY2thZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24pCisgIExpbmUgODApIHNldEltcG9ydHMoaW1wb3J0cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LnNldEltcG9ydHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbj4pCisgIExpbmUgODEpIHNldFR5cGVzKHR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuc2V0VHlwZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/Pj4pCisgIExpbmUgODcpIHNldFBhY2thZ2UocGFrYWdlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuc2V0UGFja2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbikKKyAgTGluZSA4OCkgc2V0SW1wb3J0cyhpbXBvcnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuc2V0SW1wb3J0cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uPikKKyAgTGluZSA4OSkgc2V0VHlwZXModHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5zZXRUeXBlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+PikKKyAgTGluZSA5NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQsIEEpCisgIExpbmUgOTkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LCBBKQorICBMaW5lIDExNSkgdGhpcy5nZXRBbGxDb250YWluZWRDb21tZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKQorICBMaW5lIDEyNSkgZW5zdXJlTm90TnVsbChpbXBvcnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTUxKSBlbnN1cmVOb3ROdWxsKHR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTc0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcG9ydHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTg3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnBha2FnZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTk5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDIxMCkgc2V0UGFja2FnZShuZXcgUGFja2FnZURlY2xhcmF0aW9uKG5hbWUobmFtZSkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuc2V0UGFja2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbikKKyAgTGluZSAyMTApIG5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5uYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjIyKSBhZGRJbXBvcnQobmFtZSwgZmFsc2UsIGZhbHNlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuYWRkSW1wb3J0KGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pCisgIExpbmUgMjMzKSBDbGFzc1V0aWxzLmlzUHJpbWl0aXZlT3JXcmFwcGVyKGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNsYXNzVXRpbHMuaXNQcmltaXRpdmVPcldyYXBwZXIoamF2YS5sYW5nLkNsYXNzPD8+KQorICBMaW5lIDIzMykgY2xhenouZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN0YXJ0c1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMzMpIGNsYXp6LmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldE5hbWUoKQorICBMaW5lIDIzNSkgY2xhenouaXNBcnJheSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNBcnJheSgpCisgIExpbmUgMjM1KSBDbGFzc1V0aWxzLmlzUHJpbWl0aXZlT3JXcmFwcGVyKGNsYXp6LmdldENvbXBvbmVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5DbGFzc1V0aWxzLmlzUHJpbWl0aXZlT3JXcmFwcGVyKGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSAyMzUpIGNsYXp6LmdldENvbXBvbmVudFR5cGUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDIzNikgY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjM2KSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgMjM2KSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSAyMzcpIGFkZEltcG9ydChjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuYWRkSW1wb3J0KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjM3KSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgMjM3KSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSAyMzgpIGFkZEltcG9ydChjbGF6ei5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5hZGRJbXBvcnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMzgpIGNsYXp6LmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldE5hbWUoKQorICBMaW5lIDI1MSkgZ2V0SW1wb3J0cygpLnN0cmVhbSgpLmFueU1hdGNoKGkgLT4gaS5nZXROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjUxKSBnZXRJbXBvcnRzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjUxKSBnZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDI1MSkgaS5nZXROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjUxKSBpLmdldE5hbWUoKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDI1MSkgaS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMjU0KSBuYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIubmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1NikgZ2V0SW1wb3J0cygpLmFkZChpbXBvcnREZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI1NikgZ2V0SW1wb3J0cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRJbXBvcnRzKCkKKyAgTGluZSAyNTcpIGltcG9ydERlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyNjkpIGFkZENsYXNzKG5hbWUsIE1vZGlmaWVyLlBVQkxJQykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmFkZENsYXNzKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pCisgIExpbmUgMjgxKSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDI4MSkgQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMjgyKSBDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSAyODIpIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSA9PT4gamF2YS51dGlsLkVudW1TZXQubm9uZU9mKGphdmEubGFuZy5DbGFzczxFPikKKyAgTGluZSAyODQpIGdldFR5cGVzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI4NCkgZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDI4NSkgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyOTYpIGFkZEludGVyZmFjZShuYW1lLCBNb2RpZmllci5QVUJMSUMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5hZGRJbnRlcmZhY2UoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4uLikKKyAgTGluZSAzMDgpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMzA4KSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAzMDkpIENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPEM+KQorICBMaW5lIDMwOSkgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDMxMSkgZ2V0VHlwZXMoKS5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMzExKSBnZXRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpCisgIExpbmUgMzEyKSBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSh0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDMyMykgYWRkRW51bShuYW1lLCBNb2RpZmllci5QVUJMSUMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5hZGRFbnVtKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pCisgIExpbmUgMzM0KSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDMzNCkgQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMzM1KSBDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSAzMzUpIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSA9PT4gamF2YS51dGlsLkVudW1TZXQubm9uZU9mKGphdmEubGFuZy5DbGFzczxFPikKKyAgTGluZSAzMzYpIGdldFR5cGVzKCkuYWRkKGVudW1EZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDMzNikgZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDMzNykgZW51bURlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzNDgpIGFkZEFubm90YXRpb25EZWNsYXJhdGlvbihuYW1lLCBNb2RpZmllci5QVUJMSUMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5hZGRBbm5vdGF0aW9uRGVjbGFyYXRpb24oamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4uLikKKyAgTGluZSAzNTkpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMzU5KSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAzNjApIENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPEM+KQorICBMaW5lIDM2MCkgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDM2MSkgZ2V0VHlwZXMoKS5hZGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMzYxKSBnZXRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpCisgIExpbmUgMzYyKSBhbm5vdGF0aW9uRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSh0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDM3MykgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSAmJiB0eXBlIGluc3RhbmNlb2YgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uICYmICEoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZSkuaXNJbnRlcmZhY2UoKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub3JFbHNlKFQpCisgIExpbmUgMzczKSBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpICYmIHR5cGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgISgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlKS5pc0ludGVyZmFjZSgpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSAzNzMpIGdldFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKHR5cGUgLT4gdHlwZS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiAhKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGUpLmlzSW50ZXJmYWNlKCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDM3MykgZ2V0VHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAzNzMpIGdldFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFR5cGVzKCkKKyAgTGluZSAzNzMpIHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM3MykgdHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMzc0KSAoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZSkuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMzg1KSBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhpbnRlcmZhY2VOYW1lKSAmJiB0eXBlIGluc3RhbmNlb2YgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uICYmICgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlKS5pc0ludGVyZmFjZSgpKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vckVsc2UoVCkKKyAgTGluZSAzODUpIGdldFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKHR5cGUgLT4gdHlwZS5nZXROYW1lKCkuZXF1YWxzKGludGVyZmFjZU5hbWUpICYmIHR5cGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGUpLmlzSW50ZXJmYWNlKCkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDM4NSkgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoaW50ZXJmYWNlTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiAoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZSkuaXNJbnRlcmZhY2UoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMzg1KSBnZXRUeXBlcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDM4NSkgZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDM4NSkgdHlwZS5nZXROYW1lKCkuZXF1YWxzKGludGVyZmFjZU5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM4NSkgdHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMzg2KSAoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZSkuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMzk3KSBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhlbnVtTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub3JFbHNlKFQpCisgIExpbmUgMzk3KSBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhlbnVtTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgMzk3KSBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhlbnVtTmFtZSkgJiYgdHlwZSBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMzk3KSBnZXRUeXBlcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDM5NykgZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDM5NykgdHlwZS5nZXROYW1lKCkuZXF1YWxzKGVudW1OYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzOTcpIHR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDQwOSkgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpICYmIHR5cGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRGVjbGFyYXRpb24pLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDQwOSkgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpICYmIHR5cGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRGVjbGFyYXRpb24pLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDQwOSkgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpICYmIHR5cGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDQwOSkgZ2V0VHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA0MDkpIGdldFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFR5cGVzKCkKKyAgTGluZSA0MDkpIHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDA5KSB0eXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0V4YW1wbGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfRXhhbXBsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMmIyMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0V4YW1wbGUudHh0CkBAIC0wLDAgKzEsMiBAQAorICBMaW5lIDI2KSBjb2RlLmdldEJ5dGVzKCJVVEYtOCIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmdldEJ5dGVzKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjcpIEphdmFQYXJzZXIucGFyc2Uoc3RyZWFtKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0ltcG9ydERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X0ltcG9ydERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjNkZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfSW1wb3J0RGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsOSBAQAorICBMaW5lIDc4KSBzZXRBc3Rlcmlzayhpc0FzdGVyaXNrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5zZXRBc3Rlcmlzayhib29sZWFuKQorICBMaW5lIDc5KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDgwKSBzZXRTdGF0aWMoaXNTdGF0aWMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLnNldFN0YXRpYyhib29sZWFuKQorICBMaW5lIDg2KSBzZXRBc3Rlcmlzayhpc0FzdGVyaXNrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5zZXRBc3Rlcmlzayhib29sZWFuKQorICBMaW5lIDg3KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDg4KSBzZXRTdGF0aWMoaXNTdGF0aWMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLnNldFN0YXRpYyhib29sZWFuKQorICBMaW5lIDEwMSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxMDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24sIEEpCisgIExpbmUgMTY5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTW9kaWZpZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTW9kaWZpZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmVkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Nb2RpZmllci50eHQKQEAgLTAsMCArMSw0IEBACisgIExpbmUgMzIpIEVudW1TZXQub2YodGhpcykgPT0+IGphdmEudXRpbC5FbnVtU2V0Lm9mKEUpCisgIExpbmUgMzYpIG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QVUJMSUMpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzgpIG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QUk9URUNURUQpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDApIG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QUklWQVRFKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTW9kaWZpZXJfSjkudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfTW9kaWZpZXJfSjkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2I1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Nb2RpZmllcl9KOS50eHQKQEAgLTAsMCArMSw0IEBACisgIExpbmUgMzIpIEVudW1TZXQub2YodGhpcykgPT0+IGphdmEudXRpbC5TZXQub2YoRS4uLikKKyAgTGluZSAzNikgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzOCkgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBST1RFQ1RFRCkgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MCkgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBSSVZBVEUpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Ob2RlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X05vZGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTQ1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9Ob2RlLnR4dApAQCAtMCwwICsxLDQ2IEBACisgIExpbmUgNDYpIGEuZ2V0QmVnaW4oKS5jb21wYXJlVG8oYi5nZXRCZWdpbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLmNvbXBhcmVUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgNDYpIGEuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSA0NikgYi5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDEyMSkgcmFuZ2Uud2l0aEJlZ2luKGJlZ2luKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLndpdGhCZWdpbihjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24pCisgIExpbmUgMTI5KSByYW5nZS53aXRoRW5kKGVuZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZS53aXRoRW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbikKKyAgTGluZSAxNTgpIHRoaXMuY29tbWVudC5zZXRDb21tZW50ZWROb2RlKG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuc2V0Q29tbWVudGVkTm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTYyKSB0aGlzLmNvbW1lbnQuc2V0Q29tbWVudGVkTm9kZSh0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LnNldENvbW1lbnRlZE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE3NSkgc2V0Q29tbWVudChuZXcgTGluZUNvbW1lbnQoY29tbWVudCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTg0KSBzZXRDb21tZW50KG5ldyBCbG9ja0NvbW1lbnQoY29tbWVudCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTk1KSBhY2NlcHQodmlzaXRvciwgbnVsbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE5NikgdmlzaXRvci5nZXRTb3VyY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLmdldFNvdXJjZSgpCisgIExpbmUgMjAxKSBhY2NlcHQodmlzaXRvciwgbnVsbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIwMikgdmlzaXRvci5nZXRTb3VyY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLmdldFNvdXJjZSgpCisgIExpbmUgMjA3KSB0b1N0cmluZygpLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcuaGFzaENvZGUoKQorICBMaW5lIDIwNykgdG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAyMTUpIEVxdWFsc1Zpc2l0b3IuZXF1YWxzKHRoaXMsIChOb2RlKSBvYmopID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5lcXVhbHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMjIwKSB0aGlzLmFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAyMzEpIGNsYXNzVHlwZS5pc0Fzc2lnbmFibGVGcm9tKHBhcmVudC5nZXRDbGFzcygpKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzQXNzaWduYWJsZUZyb20oamF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PikKKyAgTGluZSAyMzEpIHBhcmVudC5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyNDMpIHJhbmdlLmNvbnRhaW5zKG90aGVyLnJhbmdlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLmNvbnRhaW5zKGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZSkKKyAgTGluZSAyNDcpIG9ycGhhbkNvbW1lbnRzLmFkZChjb21tZW50KSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMjQ4KSBjb21tZW50LnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyNzYpIGNvbW1lbnRzLmFkZEFsbChnZXRPcnBoYW5Db21tZW50cygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAyNzYpIGdldE9ycGhhbkNvbW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRPcnBoYW5Db21tZW50cygpCisgIExpbmUgMjc4KSBnZXRDaGlsZHJlbk5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkKKyAgTGluZSAyNzkpIGNoaWxkLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI4MCkgY29tbWVudHMuYWRkKGNoaWxkLmdldENvbW1lbnQoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI4MCkgY2hpbGQuZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMjgyKSBjb21tZW50cy5hZGRBbGwoY2hpbGQuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMjgyKSBjaGlsZC5nZXRBbGxDb250YWluZWRDb21tZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKQorICBMaW5lIDI5NykgdGhpcy5wYXJlbnROb2RlLmNoaWxkcmVuTm9kZXMucmVtb3ZlKHRoaXMpID09PiBqYXZhLnV0aWwuTGlzdC5yZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMDIpIHRoaXMucGFyZW50Tm9kZS5jaGlsZHJlbk5vZGVzLmFkZCh0aGlzKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMzA5KSBjdXJyZW50LnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzMTYpIGNoaWxkTm9kZS5zZXRQYXJlbnROb2RlKHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzI0KSByYW5nZS5pc0FmdGVyKHBvc2l0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLmlzQWZ0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKQorICBMaW5lIDMyOCkgcmFuZ2UuaXNCZWZvcmUocG9zaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UuaXNCZWZvcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uKQorICBMaW5lIDMzNikgZ2V0UGFyZW50Tm9kZU9mVHlwZShDb21waWxhdGlvblVuaXQuY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZU9mVHlwZShqYXZhLmxhbmcuQ2xhc3M8VD4pCisgIExpbmUgMzM4KSBwYXJlbnROb2RlLmFkZEltcG9ydChjbGF6eikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmFkZEltcG9ydChqYXZhLmxhbmcuQ2xhc3M8Pz4pCisgIExpbmUgMzQ5KSBnZXRDaGlsZHJlbk5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkKKyAgTGluZSAzNTApIGNsYXp6LmlzSW5zdGFuY2UoY2hpbGQpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNJbnN0YW5jZShqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM1MSkgbm9kZXMuYWRkKGNsYXp6LmNhc3QoY2hpbGQpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMzUxKSBjbGF6ei5jYXN0KGNoaWxkKSA9PT4gamF2YS5sYW5nLkNsYXNzLmNhc3QoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNTMpIG5vZGVzLmFkZEFsbChjaGlsZC5nZXROb2Rlc0J5VHlwZShjbGF6eikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIEU+KQorICBMaW5lIDM1MykgY2hpbGQuZ2V0Tm9kZXNCeVR5cGUoY2xhenopID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Tm9kZXNCeVR5cGUoamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDM3MykgdXNlckRhdGEuZ2V0KGtleSkgPT0+IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzk0KSB1c2VyRGF0YS5wdXQoa2V5LCBvYmplY3QpID09PiBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwLnB1dChLLCBWKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfUGFja2FnZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X1BhY2thZ2VEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3MmRjNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X1BhY2thZ2VEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxMSBAQAorICBMaW5lIDU3KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA2MSkgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDYyKSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA2Nykgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDY4KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA3Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24sIEEpCisgIExpbmUgNzgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLCBBKQorICBMaW5lIDg4KSBVdGlscy5lbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTA1KSBuYW1lLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgMTE0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDEyNikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X1VzZXJEYXRhS2V5LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X1VzZXJEYXRhS2V5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Y2ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfVXNlckRhdGFLZXkudHh0CkBAIC0wLDAgKzEsNSBAQAorICBMaW5lIDI4KSBnZXRDbGFzcygpLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDI4KSBnZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzNykgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpID09PiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM3KSBnZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzNykgb2JqLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Bbm5vdGF0aW9uRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Bbm5vdGF0aW9uRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDY1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0Fubm90YXRpb25EZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb24sIEEpCisgIExpbmUgNjMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb24sIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNDYzZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDE5IEBACisgIExpbmUgNDcpIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSA9PT4gamF2YS51dGlsLkVudW1TZXQubm9uZU9mKGphdmEubGFuZy5DbGFzczxFPikKKyAgTGluZSA1OSkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDYwKSBzZXRUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgNjEpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYyKSBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5zZXREZWZhdWx0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNjgpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA2OSkgc2V0VHlwZSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDcwKSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3MSkgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uc2V0RGVmYXVsdFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDc3KSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNzgpIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA3OSkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODApIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLnNldERlZmF1bHRWYWx1ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA4NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSA5MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxMjApIHNldEFzUGFyZW50Tm9kZU9mKGRlZmF1bHRWYWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTM5KSBzZXRBc1BhcmVudE5vZGVPZih0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNDUpIGdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE0NikgZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0JvZHlEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0JvZHlEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2MDU3NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQm9keURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSA0Mykgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pCisgIExpbmUgNDgpIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDUzKSBVdGlscy5lbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjYpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjOGY1YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDE3IEBACisgIExpbmUgNjApIHNldEludGVyZmFjZShpc0ludGVyZmFjZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uc2V0SW50ZXJmYWNlKGJvb2xlYW4pCisgIExpbmUgNzEpIHNldEludGVyZmFjZShpc0ludGVyZmFjZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uc2V0SW50ZXJmYWNlKGJvb2xlYW4pCisgIExpbmUgNzIpIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5zZXRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4pCisgIExpbmUgNzMpIHNldEV4dGVuZHMoZXh0ZW5kc0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnNldEV4dGVuZHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPikKKyAgTGluZSA3NCkgc2V0SW1wbGVtZW50cyhpbXBsZW1lbnRzTGlzdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uc2V0SW1wbGVtZW50cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+KQorICBMaW5lIDg1KSBzZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnNldEludGVyZmFjZShib29sZWFuKQorICBMaW5lIDg2KSBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uc2V0VHlwZVBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+KQorICBMaW5lIDg3KSBzZXRFeHRlbmRzKGV4dGVuZHNMaXN0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5zZXRFeHRlbmRzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZT4pCisgIExpbmUgODgpIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnNldEltcGxlbWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPikKKyAgTGluZSA5Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSA5OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxMDIpIGVuc3VyZU5vdE51bGwoZXh0ZW5kc0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDgpIGVuc3VyZU5vdE51bGwoaW1wbGVtZW50c0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMTMpIGVuc3VyZU5vdE51bGwodHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMzApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXh0ZW5kc0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTQyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcGxlbWVudHNMaXN0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDE1OCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfQ29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0NvbnN0cnVjdG9yRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGY4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0NvbnN0cnVjdG9yRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsNTMgQEAKKyAgTGluZSA1MSkgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDY3KSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDY4KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzYpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNzcpIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VHlwZVBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+KQorICBMaW5lIDc4KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzkpIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4pCisgIExpbmUgODApIHNldFRocm93cyh0aHJvd3NfKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0VGhyb3dzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlPikKKyAgTGluZSA4MSkgc2V0Qm9keShibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA4OCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA4OSkgc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4pCisgIExpbmUgOTApIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5MSkgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0UGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPikKKyAgTGluZSA5Mikgc2V0VGhyb3dzKHRocm93c18pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRUaHJvd3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+KQorICBMaW5lIDkzKSBzZXRCb2R5KGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDk4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxMDMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBBKQorICBMaW5lIDExOSkgbmFtZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMjgpIGVuc3VyZU5vdE51bGwocGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDEzNCkgZW5zdXJlTm90TnVsbCh0aHJvd3NfKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTM5KSBlbnN1cmVOb3ROdWxsKHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTUxKSBzZXROYW1lRXhwcihuZXcgTmFtZUV4cHIobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXROYW1lRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpCisgIExpbmUgMTU3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE2NCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDE3MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50aHJvd3NfKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDE3Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAxOTIpIE1vZGlmaWVyLmdldEFjY2Vzc1NwZWNpZmllcihnZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuZ2V0QWNjZXNzU3BlY2lmaWVyKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDE5MikgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMTkzKSBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyLmdldENvZGVSZXByZXNlbmF0aW9uKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxOTMpIGFjY2Vzc1NwZWNpZmllci5nZXRDb2RlUmVwcmVzZW5hdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllci5nZXRDb2RlUmVwcmVzZW5hdGlvbigpCisgIExpbmUgMTk0KSBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyID09IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUID8gIiIgOiAiICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxOTYpIHNiLmFwcGVuZChnZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxOTYpIGdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTk3KSBzYi5hcHBlbmQoIigiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTk5KSBnZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDIwMykgc2IuYXBwZW5kKCIsICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMDYpIHNiLmFwcGVuZChwYXJhbS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjA2KSBwYXJhbS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKQorICBMaW5lIDIwOCkgc2IuYXBwZW5kKHBhcmFtLmdldEVsZW1lbnRUeXBlKCkudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIwOCkgcGFyYW0uZ2V0RWxlbWVudFR5cGUoKS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKQorICBMaW5lIDIwOCkgcGFyYW0uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMjExKSBzYi5hcHBlbmQoIikiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjE0KSBnZXRUaHJvd3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSAyMTcpIHNiLmFwcGVuZCgiIHRocm93cyAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjE5KSBzYi5hcHBlbmQoIiwgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIyMSkgc2IuYXBwZW5kKHRoci50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjIxKSB0aHIudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkKKyAgTGluZSAyMjQpIHNiLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkKKyAgTGluZSAyMjkpIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoaW5jbHVkaW5nTW9kaWZpZXJzLCBpbmNsdWRpbmdUaHJvd3MsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pCisgIExpbmUgMjM0KSBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKHRydWUsIHRydWUsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pCisgIExpbmUgMjM5KSBnZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyNDApIGdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI1Mykgc2V0QXNQYXJlbnROb2RlT2YoYm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VtcHR5TWVtYmVyRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbXB0eU1lbWJlckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFkOWZiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbXB0eU1lbWJlckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSA0Nikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5TWVtYmVyRGVjbGFyYXRpb24sIEEpCisgIExpbmUgNTEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uLCBBKQorICBMaW5lIDU2KSBnZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1NykgZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VtcHR5VHlwZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfRW1wdHlUeXBlRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTgxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VtcHR5VHlwZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSAzNykgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDQxKSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykgPT0+IGphdmEudXRpbC5FbnVtU2V0Lm5vbmVPZihqYXZhLmxhbmcuQ2xhc3M8RT4pCisgIExpbmUgNDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSA1MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5VHlwZURlY2xhcmF0aW9uLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1Db25zdGFudERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU3NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxOCBAQAorICBMaW5lIDU5KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY1KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY2KSBzZXRBcmdzKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0QXJncyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4pCisgIExpbmUgNjcpIHNldENsYXNzQm9keShjbGFzc0JvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0Q2xhc3NCb2R5KGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb248Pz4+KQorICBMaW5lIDczKSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc0KSBzZXRBcmdzKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0QXJncyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4pCisgIExpbmUgNzUpIHNldENsYXNzQm9keShjbGFzc0JvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0Q2xhc3NCb2R5KGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb248Pz4+KQorICBMaW5lIDgwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24sIEEpCisgIExpbmUgODUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbiwgQSkKKyAgTGluZSA4OSkgZW5zdXJlTm90TnVsbChhcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgOTQpIGVuc3VyZU5vdE51bGwoY2xhc3NCb2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTA1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTExKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNsYXNzQm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAxMjMpIGdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEyNCkgZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTMwKSBnZXRBcmdzKCkuYWRkKG5hbWUodmFsdWVFeHByKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDEzMCkgZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QXJncygpCisgIExpbmUgMTMwKSBuYW1lKHZhbHVlRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5uYW1lKGphdmEubGFuZy5TdHJpbmcpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1EZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0VudW1EZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2YWZjMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfRW51bURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDEzIEBACisgIExpbmUgNTgpIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLnNldEltcGxlbWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPikKKyAgTGluZSA1OSkgc2V0RW50cmllcyhlbnRyaWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5zZXRFbnRyaWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4pCisgIExpbmUgNjYpIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLnNldEltcGxlbWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPikKKyAgTGluZSA2Nykgc2V0RW50cmllcyhlbnRyaWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5zZXRFbnRyaWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4pCisgIExpbmUgNzIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24sIEEpCisgIExpbmUgNzgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24sIEEpCisgIExpbmUgODIpIGVuc3VyZU5vdE51bGwoZW50cmllcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDg4KSBlbnN1cmVOb3ROdWxsKGltcGxlbWVudHNMaXN0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgOTQpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZW50cmllcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAxMDEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW1wbGVtZW50c0xpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTA5KSBnZXRFbnRyaWVzKCkuYWRkKGVudW1Db25zdGFudCkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDEwOSkgZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEVudHJpZXMoKQorICBMaW5lIDExMCkgZW51bUNvbnN0YW50LnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfRmllbGREZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0ZpZWxkRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNGY2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X0ZpZWxkRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsNjggQEAKKyAgTGluZSA1OCkgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDcwKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDcxKSBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLnNldEVsZW1lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDczKSBhdXguYWRkKHZhcmlhYmxlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNzQpIHNldFZhcmlhYmxlcyhhdXgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRWYXJpYWJsZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4pCisgIExpbmUgNzgpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNzkpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgODApIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRWYXJpYWJsZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4pCisgIExpbmUgODYpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgODcpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgODgpIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRWYXJpYWJsZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4pCisgIExpbmUgODkpIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyPikKKyAgTGluZSA5NSkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA5Nikgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA5Nykgc2V0VmFyaWFibGVzKHZhcmlhYmxlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLnNldFZhcmlhYmxlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPikKKyAgTGluZSA5OCkgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI+KQorICBMaW5lIDExNSkgdmFyaWFibGVzLmFkZCh2YXJpYWJsZSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDEzMykgY3JlYXRlKG1vZGlmaWVycywgdHlwZSwgdmFyaWFibGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5jcmVhdGUoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4sIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yKQorICBMaW5lIDEzOCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24sIEEpCisgIExpbmUgMTQzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxNTkpIGVuc3VyZU5vdE51bGwodmFyaWFibGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTcyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhcmlhYmxlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAxNzgpIGdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE3OSkgZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTkzKSBnZXRWYXJpYWJsZXMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE5MykgZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMTk1KSBnZXRQYXJlbnROb2RlT2ZUeXBlKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlT2ZUeXBlKGphdmEubGFuZy5DbGFzczxUPikKKyAgTGluZSAxOTYpIGdldFBhcmVudE5vZGVPZlR5cGUoRW51bURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGVPZlR5cGUoamF2YS5sYW5nLkNsYXNzPFQ+KQorICBMaW5lIDE5NykgcGFyZW50Q2xhc3MuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMjAxKSBnZXRWYXJpYWJsZXMoKS5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMjAxKSBnZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAyMDIpIHZhcmlhYmxlLmdldElkKCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQuZ2V0TmFtZSgpCisgIExpbmUgMjAyKSB2YXJpYWJsZS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldElkKCkKKyAgTGluZSAyMDMpIGZpZWxkTmFtZS50b1VwcGVyQ2FzZSgpLnN1YnN0cmluZygwLCAxKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgMjAzKSBmaWVsZE5hbWUudG9VcHBlckNhc2UoKSA9PT4gamF2YS5sYW5nLlN0cmluZy50b1VwcGVyQ2FzZSgpCisgIExpbmUgMjAzKSBmaWVsZE5hbWUuc3Vic3RyaW5nKDEsIGZpZWxkTmFtZS5sZW5ndGgoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCwgaW50KQorICBMaW5lIDIwMykgZmllbGROYW1lLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMjA2KSBwYXJlbnRDbGFzcy5hZGRNZXRob2QoImdldCIgKyBmaWVsZE5hbWVVcHBlciwgUFVCTElDKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmFkZE1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLi4uKQorICBMaW5lIDIwOCkgcGFyZW50RW51bS5hZGRNZXRob2QoImdldCIgKyBmaWVsZE5hbWVVcHBlciwgUFVCTElDKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmFkZE1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLi4uKQorICBMaW5lIDIwOSkgZ2V0dGVyLnNldFR5cGUodmFyaWFibGUuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMjA5KSB2YXJpYWJsZS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpCisgIExpbmUgMjExKSBnZXR0ZXIuc2V0Qm9keShibG9ja1N0bXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDIxMikgYmxvY2tTdG10LmFkZFN0YXRlbWVudChuZXcgUmV0dXJuU3RtdChuYW1lKGZpZWxkTmFtZSkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzLmFkZFN0YXRlbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDIxMikgbmFtZShmaWVsZE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIubmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIyNSkgZ2V0VmFyaWFibGVzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAyMjUpIGdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDIyNykgZ2V0UGFyZW50Tm9kZU9mVHlwZShDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZU9mVHlwZShqYXZhLmxhbmcuQ2xhc3M8VD4pCisgIExpbmUgMjI4KSBnZXRQYXJlbnROb2RlT2ZUeXBlKEVudW1EZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlT2ZUeXBlKGphdmEubGFuZy5DbGFzczxUPikKKyAgTGluZSAyMjkpIHBhcmVudENsYXNzLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uaXNJbnRlcmZhY2UoKQorICBMaW5lIDIzMykgZ2V0VmFyaWFibGVzKCkuZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDIzMykgZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMjM0KSB2YXJpYWJsZS5nZXRJZCgpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmdldE5hbWUoKQorICBMaW5lIDIzNCkgdmFyaWFibGUuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJZCgpCisgIExpbmUgMjM1KSBmaWVsZE5hbWUudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMCwgMSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCwgaW50KQorICBMaW5lIDIzNSkgZmllbGROYW1lLnRvVXBwZXJDYXNlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcudG9VcHBlckNhc2UoKQorICBMaW5lIDIzNSkgZmllbGROYW1lLnN1YnN0cmluZygxLCBmaWVsZE5hbWUubGVuZ3RoKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQsIGludCkKKyAgTGluZSAyMzUpIGZpZWxkTmFtZS5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDIzOSkgcGFyZW50Q2xhc3MuYWRkTWV0aG9kKCJzZXQiICsgZmllbGROYW1lVXBwZXIsIFBVQkxJQykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5hZGRNZXRob2QoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4uLikKKyAgTGluZSAyNDEpIHBhcmVudEVudW0uYWRkTWV0aG9kKCJzZXQiICsgZmllbGROYW1lVXBwZXIsIFBVQkxJQykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5hZGRNZXRob2QoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4uLikKKyAgTGluZSAyNDIpIHNldHRlci5zZXRUeXBlKFZPSURfVFlQRSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDI0Mykgc2V0dGVyLmdldFBhcmFtZXRlcnMoKS5hZGQobmV3IFBhcmFtZXRlcih2YXJpYWJsZS5nZXRUeXBlKCksIG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChmaWVsZE5hbWUpKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI0Mykgc2V0dGVyLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDI0MykgdmFyaWFibGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldFR5cGUoKQorICBMaW5lIDI0NSkgc2V0dGVyLnNldEJvZHkoYmxvY2tTdG10MikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgMjQ2KSBibG9ja1N0bXQyLmFkZFN0YXRlbWVudChuZXcgQXNzaWduRXhwcihuZXcgTmFtZUV4cHIoInRoaXMuIiArIGZpZWxkTmFtZSksIG5ldyBOYW1lRXhwcihmaWVsZE5hbWUpLCBPcGVyYXRvci5hc3NpZ24pKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzLmFkZFN0YXRlbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSAyNTkpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI2NykgZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAyNzQpIHNldEFzUGFyZW50Tm9kZU9mKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9Jbml0aWFsaXplckRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmM2I4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgNDYpIHNldFN0YXRpYyhpc1N0YXRpYykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLnNldFN0YXRpYyhib29sZWFuKQorICBMaW5lIDQ3KSBzZXRCbG9jayhibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLnNldEJsb2NrKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgNTIpIHNldFN0YXRpYyhpc1N0YXRpYykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLnNldFN0YXRpYyhib29sZWFuKQorICBMaW5lIDUzKSBzZXRCbG9jayhibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLnNldEJsb2NrKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLCBBKQorICBMaW5lIDYzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiwgQSkKKyAgTGluZSA3Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgODcpIGdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDg4KSBnZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfTWV0aG9kRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9NZXRob2REZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2ZGRjOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfTWV0aG9kRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsOTggQEAKKyAgTGluZSA2NykgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDkxKSBzZXRNb2RpZmllcnMobW9kaWZpZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA5Mikgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgOTMpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTgpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDk5KSBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAxMDApIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTAxKSBzZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0UGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyPikKKyAgTGluZSAxMTUpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDExNikgc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0VHlwZVBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXI+KQorICBMaW5lIDExNykgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMTE4KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExOSkgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldFBhcmFtZXRlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcj4pCisgIExpbmUgMTIwKSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI+KQorICBMaW5lIDEyMSkgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyPikKKyAgTGluZSAxMjIpIHNldFRocm93cyh0aHJvd3NfKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldFRocm93cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZT4pCisgIExpbmUgMTIzKSBzZXRCb2R5KGJvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDEzOCkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMTM5KSBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4pCisgIExpbmUgMTQwKSBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAxNDEpIHNldE5hbWVFeHByKG5hbWVFeHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWVFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSAxNDIpIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+KQorICBMaW5lIDE0Mykgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyPikKKyAgTGluZSAxNDQpIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcj4pCisgIExpbmUgMTQ1KSBzZXRUaHJvd3ModGhyb3dzXykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRUaHJvd3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+KQorICBMaW5lIDE0Nikgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSAxNTEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxNTYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbiwgQSkKKyAgTGluZSAxNzcpIG5hbWUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTg2KSBlbnN1cmVOb3ROdWxsKHBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxOTIpIGVuc3VyZU5vdE51bGwodGhyb3dzXykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE5OCkgd3JhcEluQXJyYXlUeXBlcyhnZXRFbGVtZW50VHlwZSgpLCBnZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSwgZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUud3JhcEluQXJyYXlUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyPi4uLikKKyAgTGluZSAxOTgpIGdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTk5KSBnZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpCisgIExpbmUgMjAwKSBnZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKQorICBMaW5lIDIwOSkgZW5zdXJlTm90TnVsbCh0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDIxNikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyMjgpIHNldE5hbWVFeHByKG5ldyBOYW1lRXhwcihuYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXROYW1lRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpCisgIExpbmUgMjM0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI0MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDI0OCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50aHJvd3NfKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDI1NCkgdW53cmFwQXJyYXlUeXBlcyh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS51bndyYXBBcnJheVR5cGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDI1NSkgc2V0RWxlbWVudFR5cGUodHlwZUxpc3RQYWlyLmEpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMjU2KSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUodHlwZUxpc3RQYWlyLmIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcj4pCisgIExpbmUgMjU3KSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdChudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcj4pCisgIExpbmUgMjY0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyNzApIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDI4NSkgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyh0cnVlLCB0cnVlLCB0cnVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiwgYm9vbGVhbiwgYm9vbGVhbikKKyAgTGluZSAyOTApIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoaW5jbHVkaW5nTW9kaWZpZXJzLCBpbmNsdWRpbmdUaHJvd3MsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuLCBib29sZWFuKQorICBMaW5lIDMwNykgTW9kaWZpZXIuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5nZXRBY2Nlc3NTcGVjaWZpZXIoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMzA3KSBnZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMzA4KSBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyLmdldENvZGVSZXByZXNlbmF0aW9uKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMDgpIGFjY2Vzc1NwZWNpZmllci5nZXRDb2RlUmVwcmVzZW5hdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllci5nZXRDb2RlUmVwcmVzZW5hdGlvbigpCisgIExpbmUgMzA5KSBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyID09IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUID8gIiIgOiAiICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMTApIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlNUQVRJQykgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMTApIGdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzMTEpIHNiLmFwcGVuZCgic3RhdGljICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMTMpIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLkFCU1RSQUNUKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMxMykgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDMxNCkgc2IuYXBwZW5kKCJhYnN0cmFjdCAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzE2KSBnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5GSU5BTCkgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMTYpIGdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzMTcpIHNiLmFwcGVuZCgiZmluYWwgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMxOSkgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuTkFUSVZFKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMxOSkgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDMyMCkgc2IuYXBwZW5kKCJuYXRpdmUgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyMikgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuU1lOQ0hST05JWkVEKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMyMikgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDMyMykgc2IuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyNykgc2IuYXBwZW5kKGdldEVsZW1lbnRUeXBlKCkudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyNykgZ2V0RWxlbWVudFR5cGUoKS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKQorICBMaW5lIDMyNykgZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSAzMjgpIHNiLmFwcGVuZCgiICIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMjkpIHNiLmFwcGVuZChnZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMjkpIGdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDMzMCkgc2IuYXBwZW5kKCIoIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMzMikgZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgMzM2KSBzYi5hcHBlbmQoIiwgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMzOSkgc2IuYXBwZW5kKHBhcmFtLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMzkpIHBhcmFtLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpCisgIExpbmUgMzQxKSBzYi5hcHBlbmQocGFyYW0uZ2V0RWxlbWVudFR5cGUoKS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzQxKSBwYXJhbS5nZXRFbGVtZW50VHlwZSgpLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpCisgIExpbmUgMzQxKSBwYXJhbS5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSAzNDIpIHBhcmFtLmlzVmFyQXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmlzVmFyQXJncygpCisgIExpbmUgMzQzKSBzYi5hcHBlbmQoIi4uLiIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzNDcpIHNiLmFwcGVuZCgiKSIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzNTApIGdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSAzNTMpIHNiLmFwcGVuZCgiIHRocm93cyAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzU1KSBzYi5hcHBlbmQoIiwgIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM1Nykgc2IuYXBwZW5kKHRoci50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzU3KSB0aHIudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkKKyAgTGluZSAzNjApIHNiLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkKKyAgTGluZSAzNjUpIGdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM2NikgZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzc1KSBlbnN1cmVOb3ROdWxsKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMzgyKSBzZXRBc1BhcmVudE5vZGVPZihhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAzOTApIGVuc3VyZU5vdE51bGwoYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAzOTYpIHNldEFzUGFyZW50Tm9kZU9mKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9QYXJhbWV0ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9QYXJhbWV0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTc5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X1BhcmFtZXRlci50eHQKQEAgLTAsMCArMSwzMiBAQAorICBMaW5lIDU2KSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykgPT0+IGphdmEudXRpbC5FbnVtU2V0Lm5vbmVPZihqYXZhLmxhbmcuQ2xhc3M8RT4pCisgIExpbmUgNjgpIHNldElkKGlkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRJZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQpCisgIExpbmUgNjkpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA4Nikgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDg3KSBzZXRJZChpZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuc2V0SWQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkKQorICBMaW5lIDg4KSBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgOTkpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSAxMDApIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDEwMSkgc2V0SWQoaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLnNldElkKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZCkKKyAgTGluZSAxMDIpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAxMDMpIHNldFZhckFyZ3MoaXNWYXJBcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRWYXJBcmdzKGJvb2xlYW4pCisgIExpbmUgMTA0KSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyPikKKyAgTGluZSAxMDkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIsIEEpCisgIExpbmUgMTE0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLCBBKQorICBMaW5lIDExOSkgd3JhcEluQXJyYXlUeXBlcyhlbGVtZW50VHlwZSwgZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIGdldElkKCkuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLndyYXBJbkFycmF5VHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcj4uLi4pCisgIExpbmUgMTIwKSBnZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDEyMSkgZ2V0SWQoKS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCgpCisgIExpbmUgMTIxKSBnZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldElkKCkKKyAgTGluZSAxMzApIEFycmF5VHlwZS51bndyYXBBcnJheVR5cGVzKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLnVud3JhcEFycmF5VHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMTMxKSBzZXRFbGVtZW50VHlwZSh1bndyYXBwZWQuYSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMTMyKSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUodW53cmFwcGVkLmIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI+KQorICBMaW5lIDEzMykgZ2V0SWQoKS5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQobnVsbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyPikKKyAgTGluZSAxMzMpIGdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0SWQoKQorICBMaW5lIDE0NikgZW5zdXJlTm90TnVsbChhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE1NikgZ2V0SWQoKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXROYW1lKCkKKyAgTGluZSAxNTYpIGdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0SWQoKQorICBMaW5lIDE2MykgaWQuc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxODgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTk0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmlkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyMTIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDIxNykgZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDIyNCkgc2V0QXNQYXJlbnROb2RlT2YoYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X1R5cGVEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ib2R5X1R5cGVEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxYjA0OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVHlwZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDIxIEBACisgIExpbmUgNDkpIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSA9PT4gamF2YS51dGlsLkVudW1TZXQubm9uZU9mKGphdmEubGFuZy5DbGFzczxFPikKKyAgTGluZSA1Nykgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTgpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA2NSkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjYpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA2Nykgc2V0TWVtYmVycyhtZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5zZXRNZW1iZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb248Pz4+KQorICBMaW5lIDc0KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3NSkgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDc2KSBzZXRNZW1iZXJzKG1lbWJlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLnNldE1lbWJlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjw/Pj4pCisgIExpbmUgODcpIGdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSA4OCkgaXNOdWxsT3JFbXB0eShtZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmlzTnVsbE9yRW1wdHkoamF2YS51dGlsLkNvbGxlY3Rpb248RT4pCisgIExpbmUgOTApIHNldE1lbWJlcnMobWVtYmVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uc2V0TWVtYmVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPD8+PikKKyAgTGluZSA5MikgbWVtYmVycy5hZGQoZGVjbCkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDkzKSBkZWNsLnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA5OSkgZW5zdXJlTm90TnVsbChtZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTE2KSBuYW1lLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDEyMykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5tZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDEzNykgc2V0TmFtZUV4cHIobmV3IE5hbWVFeHByKG5hbWUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5zZXROYW1lRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpCisgIExpbmUgMTQ0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE1NCkgZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTU1KSBnZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVmFyaWFibGVEZWNsYXJhdG9yLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVmFyaWFibGVEZWNsYXJhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDBiMWRkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9WYXJpYWJsZURlY2xhcmF0b3IudHh0CkBAIC0wLDAgKzEsMjUgQEAKKyAgTGluZSA1NSkgc2V0SWQoaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLnNldElkKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZCkKKyAgTGluZSA1OSkgc2V0SWQobmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKHZhcmlhYmxlTmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLnNldElkKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZCkKKyAgTGluZSA3MSkgc2V0SWQoaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLnNldElkKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZCkKKyAgTGluZSA3Mikgc2V0SW5pdChpbml0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5zZXRJbml0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDc2KSBzZXRJZChuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQodmFyaWFibGVOYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3Iuc2V0SWQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkKQorICBMaW5lIDc3KSBzZXRJbml0KGluaXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLnNldEluaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgODIpIHNldElkKGlkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5zZXRJZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQpCisgIExpbmUgODMpIHNldEluaXQoaW5pdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3Iuc2V0SW5pdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA4OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvciwgQSkKKyAgTGluZSA5Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvciwgQSkKKyAgTGluZSAxMDYpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExMikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbml0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5pdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTI4KSBnZXRQYXJlbnROb2RlT2ZUeXBlKE5vZGVXaXRoRWxlbWVudFR5cGUuY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZU9mVHlwZShqYXZhLmxhbmcuQ2xhc3M8VD4pCisgIExpbmUgMTMwKSB3cmFwSW5BcnJheVR5cGVzKGVsZW1lbnRUeXBlLmdldEVsZW1lbnRUeXBlKCksIGVsZW1lbnRUeXBlLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLCBnZXRJZCgpLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS53cmFwSW5BcnJheVR5cGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI+Li4uKQorICBMaW5lIDEzMCkgZWxlbWVudFR5cGUuZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZS5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTMxKSBlbGVtZW50VHlwZS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDEzMikgZ2V0SWQoKS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCgpCisgIExpbmUgMTMyKSBnZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldElkKCkKKyAgTGluZSAxMzcpIEFycmF5VHlwZS51bndyYXBBcnJheVR5cGVzKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLnVud3JhcEFycmF5VHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMTM4KSBnZXRQYXJlbnROb2RlT2ZUeXBlKE5vZGVXaXRoRWxlbWVudFR5cGUuY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZU9mVHlwZShqYXZhLmxhbmcuQ2xhc3M8VD4pCisgIExpbmUgMTQyKSBub2RlV2l0aEVsZW1lbnRUeXBlLnNldEVsZW1lbnRUeXBlKHVud3JhcHBlZC5hKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZS5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTw/PikKKyAgTGluZSAxNDMpIG5vZGVXaXRoRWxlbWVudFR5cGUuc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEVsZW1lbnRUeXBlLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI+KQorICBMaW5lIDE0NCkgZ2V0SWQoKS5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQodW53cmFwcGVkLmIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQuc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcj4pCisgIExpbmUgMTQ0KSBnZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldElkKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVmFyaWFibGVEZWNsYXJhdG9ySWQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfYm9keV9WYXJpYWJsZURlY2xhcmF0b3JJZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4YWM2NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2JvZHlfVmFyaWFibGVEZWNsYXJhdG9ySWQudHh0CkBAIC0wLDAgKzEsNyBAQAorICBMaW5lIDQ4KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQuc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUzKSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQuc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU0KSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoYXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLnNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZChqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI+KQorICBMaW5lIDU5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQsIEEpCisgIExpbmUgNjQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZCwgQSkKKyAgTGluZSA3OSkgZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVySWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA4NSkgc2V0QXNQYXJlbnROb2RlT2YoYXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQmxvY2tDb21tZW50LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0Jsb2NrQ29tbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhZjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0Jsb2NrQ29tbWVudC50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNTIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50LCBBKQorICBMaW5lIDU3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudCwgQSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0NvbW1lbnQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQ29tbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0YTdkZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0NvbW1lbnQudHh0CkBAIC0wLDAgKzEgQEAKKyAgTGluZSA3OCkgaXNMaW5lQ29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuaXNMaW5lQ29tbWVudCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19Db21tZW50c0NvbGxlY3Rpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQ29tbWVudHNDb2xsZWN0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNjYzJmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfQ29tbWVudHNDb2xsZWN0aW9uLnR4dApAQCAtMCwwICsxLDM0IEBACisgIExpbmUgNDEpIGNvbW1lbnRzLmFkZEFsbChjb21tZW50c1RvQ29weSkgPT0+IGphdmEudXRpbC5UcmVlU2V0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgNDUpIGNvbW1lbnRzLnN0cmVhbSgpLmZpbHRlcihjb21tZW50IC0+IGNvbW1lbnQgaW5zdGFuY2VvZiBMaW5lQ29tbWVudCkubWFwKGNvbW1lbnQgLT4gKExpbmVDb21tZW50KSBjb21tZW50KS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IG5ldyBUcmVlU2V0PD4oTk9ERV9CWV9CRUdJTl9QT1NJVElPTikpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDQ1KSBjb21tZW50cy5zdHJlYW0oKS5maWx0ZXIoY29tbWVudCAtPiBjb21tZW50IGluc3RhbmNlb2YgTGluZUNvbW1lbnQpLm1hcChjb21tZW50IC0+IChMaW5lQ29tbWVudCkgY29tbWVudCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgNDUpIGNvbW1lbnRzLnN0cmVhbSgpLmZpbHRlcihjb21tZW50IC0+IGNvbW1lbnQgaW5zdGFuY2VvZiBMaW5lQ29tbWVudCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgNDUpIGNvbW1lbnRzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDQ4KSBDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBuZXcgVHJlZVNldDw+KE5PREVfQllfQkVHSU5fUE9TSVRJT04pKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvQ29sbGVjdGlvbihqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI8Qz4pCisgIExpbmUgNTIpIGNvbW1lbnRzLnN0cmVhbSgpLmZpbHRlcihjb21tZW50IC0+IGNvbW1lbnQgaW5zdGFuY2VvZiBCbG9ja0NvbW1lbnQpLm1hcChjb21tZW50IC0+IChCbG9ja0NvbW1lbnQpIGNvbW1lbnQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNTIpIGNvbW1lbnRzLnN0cmVhbSgpLmZpbHRlcihjb21tZW50IC0+IGNvbW1lbnQgaW5zdGFuY2VvZiBCbG9ja0NvbW1lbnQpLm1hcChjb21tZW50IC0+IChCbG9ja0NvbW1lbnQpIGNvbW1lbnQpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDUyKSBjb21tZW50cy5zdHJlYW0oKS5maWx0ZXIoY29tbWVudCAtPiBjb21tZW50IGluc3RhbmNlb2YgQmxvY2tDb21tZW50KSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA1MikgY29tbWVudHMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNTUpIENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IG5ldyBUcmVlU2V0PD4oTk9ERV9CWV9CRUdJTl9QT1NJVElPTikpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSA1OSkgY29tbWVudHMuc3RyZWFtKCkuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50KS5tYXAoY29tbWVudCAtPiAoSmF2YWRvY0NvbW1lbnQpIGNvbW1lbnQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNTkpIGNvbW1lbnRzLnN0cmVhbSgpLmZpbHRlcihjb21tZW50IC0+IGNvbW1lbnQgaW5zdGFuY2VvZiBKYXZhZG9jQ29tbWVudCkubWFwKGNvbW1lbnQgLT4gKEphdmFkb2NDb21tZW50KSBjb21tZW50KSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSA1OSkgY29tbWVudHMuc3RyZWFtKCkuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50KSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA1OSkgY29tbWVudHMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNjIpIENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IG5ldyBUcmVlU2V0PD4oTk9ERV9CWV9CRUdJTl9QT1NJVElPTikpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSA2NikgY29tbWVudHMuYWRkKGNvbW1lbnQpID09PiBqYXZhLnV0aWwuVHJlZVNldC5hZGQoRSkKKyAgTGluZSA3MCkgZ2V0Q29tbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb24uZ2V0Q29tbWVudHMoKQorICBMaW5lIDczKSBjLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgNzMpIGNvbW1lbnQuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSA3NCkgYy5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDc0KSBjb21tZW50LmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgNzUpIGMuZ2V0RW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRFbmQoKQorICBMaW5lIDc1KSBjb21tZW50LmdldEVuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0RW5kKCkKKyAgTGluZSA3NikgTWF0aC5hYnMoYy5nZXRFbmQoKS5jb2x1bW4gLSBjb21tZW50LmdldEVuZCgpLmNvbHVtbikgPT0+IGphdmEubGFuZy5NYXRoLmFicyhpbnQpCisgIExpbmUgNzYpIGMuZ2V0RW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRFbmQoKQorICBMaW5lIDc2KSBjb21tZW50LmdldEVuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0RW5kKCkKKyAgTGluZSA4OCkgY29tbWVudHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuVHJlZVNldC5zaXplKCkKKyAgTGluZSA5MykgcmVzdWx0LmNvbW1lbnRzLmFkZEFsbChjb21tZW50cy5zdHJlYW0oKS5maWx0ZXIoY29tbWVudCAtPiAhb3RoZXIuY29udGFpbnMoY29tbWVudCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpID09PiBqYXZhLnV0aWwuVHJlZVNldC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIEU+KQorICBMaW5lIDk0KSBjb21tZW50cy5zdHJlYW0oKS5maWx0ZXIoY29tbWVudCAtPiAhb3RoZXIuY29udGFpbnMoY29tbWVudCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA5NCkgY29tbWVudHMuc3RyZWFtKCkuZmlsdGVyKGNvbW1lbnQgLT4gIW90aGVyLmNvbnRhaW5zKGNvbW1lbnQpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA5NCkgY29tbWVudHMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgOTUpIG90aGVyLmNvbnRhaW5zKGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzQ29sbGVjdGlvbi5jb250YWlucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgOTYpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfSmF2YWRvY0NvbW1lbnQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfY29tbWVudHNfSmF2YWRvY0NvbW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODRmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19KYXZhZG9jQ29tbWVudC50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQsIEEpCisgIExpbmUgNTEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQsIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19MaW5lQ29tbWVudC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9jb21tZW50c19MaW5lQ29tbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmOGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2NvbW1lbnRzX0xpbmVDb21tZW50LnR4dApAQCAtMCwwICsxLDIgQEAKKyAgTGluZSA1MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudCwgQSkKKyAgTGluZSA1Nikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudCwgQSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQW5ub3RhdGlvbkV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Bbm5vdGF0aW9uRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMjg5OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQW5ub3RhdGlvbkV4cHIudHh0CkBAIC0wLDAgKzEgQEAKKyAgTGluZSA0NSkgc2V0QXNQYXJlbnROb2RlT2YobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5QWNjZXNzRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0FycmF5QWNjZXNzRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0MjUzYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlBY2Nlc3NFeHByLnR4dApAQCAtMCwwICsxLDggQEAKKyAgTGluZSA0MSkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwci5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQyKSBzZXRJbmRleChpbmRleCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuc2V0SW5kZXgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNDcpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuc2V0TmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0OCkgc2V0SW5kZXgoaW5kZXgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLnNldEluZGV4KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLCBBKQorICBMaW5lIDU4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLCBBKQorICBMaW5lIDcxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluZGV4KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlDcmVhdGlvbkV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9BcnJheUNyZWF0aW9uRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhOWZkMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlDcmVhdGlvbkV4cHIudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyAgTGluZSA1MCkgc2V0TGV2ZWxzKGxldmVscykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5zZXRMZXZlbHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWw+KQorICBMaW5lIDUxKSBzZXRUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA1Mikgc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuc2V0SW5pdGlhbGl6ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByKQorICBMaW5lIDU3KSBzZXRMZXZlbHMobGV2ZWxzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLnNldExldmVscyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbD4pCisgIExpbmUgNTgpIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDU5KSBzZXRJbml0aWFsaXplcihpbml0aWFsaXplcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5zZXRJbml0aWFsaXplcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIpCisgIExpbmUgNjMpIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDY0KSBzZXRJbml0aWFsaXplcihudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLnNldEluaXRpYWxpemVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwcikKKyAgTGluZSA2OSkgc2V0VHlwZSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgNzApIHNldEluaXRpYWxpemVyKG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuc2V0SW5pdGlhbGl6ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByKQorICBMaW5lIDc1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIsIEEpCisgIExpbmUgODApIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwciwgQSkKKyAgTGluZSA5NCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbml0aWFsaXplcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTAxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwNikgZW5zdXJlTm90TnVsbChsZXZlbHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMTIpIHNldEFzUGFyZW50Tm9kZU9mKGxldmVscykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlJbml0aWFsaXplckV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9BcnJheUluaXRpYWxpemVyRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5MDk5MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXJyYXlJbml0aWFsaXplckV4cHIudHh0CkBAIC0wLDAgKzEsNiBAQAorICBMaW5lIDQzKSBzZXRWYWx1ZXModmFsdWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLnNldFZhbHVlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4pCisgIExpbmUgNDgpIHNldFZhbHVlcyh2YWx1ZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuc2V0VmFsdWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPikKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLCBBKQorICBMaW5lIDU4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIsIEEpCisgIExpbmUgNjIpIGVuc3VyZU5vdE51bGwodmFsdWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFsdWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Bc3NpZ25FeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXNzaWduRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2Mzc4NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQXNzaWduRXhwci50eHQKQEAgLTAsMCArMSwxMCBAQAorICBMaW5lIDU4KSBzZXRUYXJnZXQodGFyZ2V0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuc2V0VGFyZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDU5KSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLnNldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDYwKSBzZXRPcGVyYXRvcihvcCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLnNldE9wZXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLk9wZXJhdG9yKQorICBMaW5lIDY1KSBzZXRUYXJnZXQodGFyZ2V0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuc2V0VGFyZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDY2KSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLnNldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDY3KSBzZXRPcGVyYXRvcihvcCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLnNldE9wZXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLk9wZXJhdG9yKQorICBMaW5lIDcyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwciwgQSkKKyAgTGluZSA3Nykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIsIEEpCisgIExpbmUgOTkpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudGFyZ2V0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMDUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9CaW5hcnlFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQmluYXJ5RXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZmNlOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQmluYXJ5RXhwci50eHQKQEAgLTAsMCArMSwxMCBAQAorICBMaW5lIDY1KSBzZXRMZWZ0KGxlZnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5zZXRMZWZ0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDY2KSBzZXRSaWdodChyaWdodCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLnNldFJpZ2h0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDY3KSBzZXRPcGVyYXRvcihvcCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLnNldE9wZXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yKQorICBMaW5lIDcyKSBzZXRMZWZ0KGxlZnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5zZXRMZWZ0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDczKSBzZXRSaWdodChyaWdodCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLnNldFJpZ2h0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDc0KSBzZXRPcGVyYXRvcihvcCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLnNldE9wZXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLk9wZXJhdG9yKQorICBMaW5lIDc5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwciwgQSkKKyAgTGluZSA4NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIsIEEpCisgIExpbmUgMTAxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmxlZnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExMikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5yaWdodCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0Jvb2xlYW5MaXRlcmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0Jvb2xlYW5MaXRlcmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5NWJhNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQm9vbGVhbkxpdGVyYWxFeHByLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSAzOSkgc2V0VmFsdWUodmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByLnNldFZhbHVlKGJvb2xlYW4pCisgIExpbmUgNDQpIHNldFZhbHVlKHZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwci5zZXRWYWx1ZShib29sZWFuKQorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByLCBBKQorICBMaW5lIDU0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9DYXN0RXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0Nhc3RFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM2YzI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9DYXN0RXhwci50eHQKQEAgLTAsMCArMSw4IEBACisgIExpbmUgNDMpIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDQ0KSBzZXRFeHByKGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuc2V0RXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0OSkgc2V0VHlwZSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgNTApIHNldEV4cHIoZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwci5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDU1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIsIEEpCisgIExpbmUgNjApIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwciwgQSkKKyAgTGluZSA3NCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ2hhckxpdGVyYWxFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ2hhckxpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk2Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9DaGFyTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsMyBAQAorICBMaW5lIDQ5KSBVdGlscy5lc2NhcGVFbmRPZkxpbmVzKHN0cmluZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lc2NhcGVFbmRPZkxpbmVzKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHIsIEEpCisgIExpbmUgNTkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHIsIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NsYXNzRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NsYXNzRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0MmRkYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ2xhc3NFeHByLnR4dApAQCAtMCwwICsxLDUgQEAKKyAgTGluZSA0Nikgc2V0VHlwZSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDUxKSBzZXRUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgNTYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIsIEEpCisgIExpbmUgNjEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIsIEEpCisgIExpbmUgNzIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NvbmRpdGlvbmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0NvbmRpdGlvbmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZmU5YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfQ29uZGl0aW9uYWxFeHByLnR4dApAQCAtMCwwICsxLDExIEBACisgIExpbmUgNDMpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0NCkgc2V0VGhlbkV4cHIodGhlbkV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLnNldFRoZW5FeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ1KSBzZXRFbHNlRXhwcihlbHNlRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuc2V0RWxzZUV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTApIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1MSkgc2V0VGhlbkV4cHIodGhlbkV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLnNldFRoZW5FeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDUyKSBzZXRFbHNlRXhwcihlbHNlRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuc2V0RWxzZUV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIsIEEpCisgIExpbmUgNjIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIsIEEpCisgIExpbmUgNzkpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5lbHNlRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgOTEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudGhlbkV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Eb3VibGVMaXRlcmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0RvdWJsZUxpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZiYzUyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Eb3VibGVMaXRlcmFsRXhwci50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwciwgQSkKKyAgTGluZSA0OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkRvdWJsZUxpdGVyYWxFeHByLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9FbmNsb3NlZEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9FbmNsb3NlZEV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTM3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0VuY2xvc2VkRXhwci50eHQKQEAgLTAsMCArMSw1IEBACisgIExpbmUgMzkpIHNldElubmVyKGlubmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwci5zZXRJbm5lcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0NCkgc2V0SW5uZXIoaW5uZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLnNldElubmVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLCBBKQorICBMaW5lIDUyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLCBBKQorICBMaW5lIDYxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmlubmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRXhwcmVzc2lvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0V4cHJlc3Npb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0V4cHJlc3Npb24udHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0ZpZWxkQWNjZXNzRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0ZpZWxkQWNjZXNzRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwYTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfRmllbGRBY2Nlc3NFeHByLnR4dApAQCAtMCwwICsxLDEyIEBACisgIExpbmUgNDcpIHNldFNjb3BlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0OCkgc2V0RmllbGQoZmllbGQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLnNldEZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTMpIHNldFNjb3BlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1NCkgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5zZXRUeXBlQXJndW1lbnRzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+PikKKyAgTGluZSA1NSkgc2V0RmllbGQoZmllbGQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLnNldEZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIsIEEpCisgIExpbmUgNjMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIsIEEpCisgIExpbmUgNjcpIGZpZWxkLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDc5KSBzZXRGaWVsZEV4cHIobmV3IE5hbWVFeHByKGZpZWxkKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuc2V0RmllbGRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA4NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5maWVsZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgOTEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwNCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnN0YW5jZU9mRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0luc3RhbmNlT2ZFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE4YzI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnN0YW5jZU9mRXhwci50eHQKQEAgLTAsMCArMSw4IEBACisgIExpbmUgNDMpIHNldEV4cHIoZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwci5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ0KSBzZXRUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA0OSkgc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTApIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDU0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIsIEEpCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwciwgQSkKKyAgTGluZSA3Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3OSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW50ZWdlckxpdGVyYWxFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW50ZWdlckxpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdiMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnRlZ2VyTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsNCBAQAorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByLCBBKQorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByLCBBKQorICBMaW5lIDU4KSB2YWx1ZS5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDU5KSB2YWx1ZS5lcXVhbHMoVU5TSUdORURfTUlOX1ZBTFVFKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzMzQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIudHh0CkBAIC0wLDAgKzEsMiBAQAorICBMaW5lIDQyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIsIEEpCisgIExpbmUgNDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciwgQSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTGFtYmRhRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0xhbWJkYUV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTc3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0xhbWJkYUV4cHIudHh0CkBAIC0wLDAgKzEsOCBAQAorICBMaW5lIDU0KSBzZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5zZXRQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI+KQorICBMaW5lIDU1KSBzZXRCb2R5KGJvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNTYpIHNldFBhcmFtZXRlcnNFbmNsb3NlZChwYXJhbWV0ZXJzRW5jbG9zZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5zZXRQYXJhbWV0ZXJzRW5jbG9zZWQoYm9vbGVhbikKKyAgTGluZSA2MCkgZW5zdXJlTm90TnVsbChwYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjYpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSA3Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIsIEEpCisgIExpbmUgODcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9MaXRlcmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0xpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9MaXRlcmFsRXhwci50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFjMThlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Mb25nTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsNyBAQAorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByLCBBKQorICBMaW5lIDUzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByLCBBKQorICBMaW5lIDU4KSB2YWx1ZS5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDU5KSAvLwordmFsdWUuc3RhcnRzV2l0aChVTlNJR05FRF9NSU5fVkFMVUUpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN0YXJ0c1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MCkgdmFsdWUuY2hhckF0KDE5KSA9PT4gamF2YS5sYW5nLlN0cmluZy5jaGFyQXQoaW50KQorICBMaW5lIDYwKSB2YWx1ZS5jaGFyQXQoMTkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmNoYXJBdChpbnQpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0xvbmdMaXRlcmFsTWluVmFsdWVFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzQzODMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX0xvbmdMaXRlcmFsTWluVmFsdWVFeHByLnR4dApAQCAtMCwwICsxLDIgQEAKKyAgTGluZSA0Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxvbmdMaXRlcmFsTWluVmFsdWVFeHByLCBBKQorICBMaW5lIDQ2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIsIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01hcmtlckFubm90YXRpb25FeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWFya2VyQW5ub3RhdGlvbkV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDQ4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01hcmtlckFubm90YXRpb25FeHByLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSAzNykgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDQyKSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuc2V0TmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpCisgIExpbmUgNDYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwciwgQSkKKyAgTGluZSA1MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1hcmtlckFubm90YXRpb25FeHByLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZW1iZXJWYWx1ZVBhaXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZW1iZXJWYWx1ZVBhaXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmMyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01lbWJlclZhbHVlUGFpci50eHQKQEAgLTAsMCArMSw3IEBACisgIExpbmUgNDMpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQ0KSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuc2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNDkpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUwKSBzZXRWYWx1ZSh2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuc2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIsIEEpCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIsIEEpCisgIExpbmUgNzgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZXRob2RDYWxsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX01ldGhvZENhbGxFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY0NWNlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZXRob2RDYWxsRXhwci50eHQKQEAgLTAsMCArMSwyMiBAQAorICBMaW5lIDUxKSBzZXRTY29wZShzY29wZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1Mikgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1Nikgc2V0U2NvcGUoc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuc2V0U2NvcGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTcpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTgpIHNldEFyZ3MoYXJncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5zZXRBcmdzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPikKKyAgTGluZSA2Mykgc2V0U2NvcGUoc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuc2V0U2NvcGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNjQpIHNldFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5zZXRUeXBlQXJndW1lbnRzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+PikKKyAgTGluZSA2NSkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2Nikgc2V0QXJncyhhcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLnNldEFyZ3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+KQorICBMaW5lIDc2KSBnZXRBcmdzKCkuYWRkKGFyZykgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDc2KSBnZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmdzKCkKKyAgTGluZSA3NykgYXJnLnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4MikgYWRkQXJndW1lbnQobmV3IE5hbWVFeHByKGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuYWRkQXJndW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgODcpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwciwgQSkKKyAgTGluZSA5Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLCBBKQorICBMaW5lIDk2KSBlbnN1cmVOb3ROdWxsKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDEpIG5hbWUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTE0KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTE4KSBzZXROYW1lRXhwcihuZXcgTmFtZUV4cHIobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuc2V0TmFtZUV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDEyNCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMzApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE0Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9NZXRob2RSZWZlcmVuY2VFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWV0aG9kUmVmZXJlbmNlRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5MTM1OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTWV0aG9kUmVmZXJlbmNlRXhwci50eHQKQEAgLTAsMCArMSw3IEBACisgIExpbmUgNTgpIHNldElkZW50aWZpZXIoaWRlbnRpZmllcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLnNldElkZW50aWZpZXIoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1OSkgc2V0U2NvcGUoc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA2MCkgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuc2V0VHlwZUFyZ3VtZW50cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTw/Pj4pCisgIExpbmUgNjYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLCBBKQorICBMaW5lIDcxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwciwgQSkKKyAgTGluZSA4MCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgOTIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3VtZW50cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTmFtZUV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9OYW1lRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YWVhMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTmFtZUV4cHIudHh0CkBAIC0wLDAgKzEsMyBAQAorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIsIEEpCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwciwgQSkKKyAgTGluZSA3NykgcXVhbGlmaWVkTmFtZS5zcGxpdCgiXFwuIikgPT0+IGphdmEubGFuZy5TdHJpbmcuc3BsaXQoamF2YS5sYW5nLlN0cmluZykKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTm9ybWFsQW5ub3RhdGlvbkV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9Ob3JtYWxBbm5vdGF0aW9uRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3YzM4OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTm9ybWFsQW5ub3RhdGlvbkV4cHIudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyAgTGluZSA0OCkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDQ5KSBzZXRQYWlycyhwYWlycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwci5zZXRQYWlycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyPikKKyAgTGluZSA1NCkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDU1KSBzZXRQYWlycyhwYWlycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwci5zZXRQYWlycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyPikKKyAgTGluZSA2MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLCBBKQorICBMaW5lIDY1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIsIEEpCisgIExpbmUgNjkpIGVuc3VyZU5vdE51bGwocGFpcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA3NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYWlycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSA4NSkgYWRkUGFpcihrZXksIG5hbWUodmFsdWUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLmFkZFBhaXIoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDg1KSBuYW1lKHZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLm5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5NSkgZ2V0UGFpcnMoKS5hZGQobWVtYmVyVmFsdWVQYWlyKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgOTUpIGdldFBhaXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwci5nZXRQYWlycygpCisgIExpbmUgOTYpIG1lbWJlclZhbHVlUGFpci5zZXRQYXJlbnROb2RlKHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX051bGxMaXRlcmFsRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX051bGxMaXRlcmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzYTE0YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfTnVsbExpdGVyYWxFeHByLnR4dApAQCAtMCwwICsxLDIgQEAKKyAgTGluZSA0MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk51bGxMaXRlcmFsRXhwciwgQSkKKyAgTGluZSA0NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk51bGxMaXRlcmFsRXhwciwgQSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfT2JqZWN0Q3JlYXRpb25FeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfT2JqZWN0Q3JlYXRpb25FeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTNkZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9PYmplY3RDcmVhdGlvbkV4cHIudHh0CkBAIC0wLDAgKzEsMTggQEAKKyAgTGluZSA3Mykgc2V0U2NvcGUoc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLnNldFNjb3BlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDc0KSBzZXRUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4pCisgIExpbmUgNzUpIHNldEFyZ3MoYXJncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuc2V0QXJncyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4pCisgIExpbmUgODIpIHNldFNjb3BlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA4Mykgc2V0VHlwZSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+KQorICBMaW5lIDg0KSBzZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLnNldFR5cGVBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4+KQorICBMaW5lIDg1KSBzZXRBcmdzKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLnNldEFyZ3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+KQorICBMaW5lIDg2KSBzZXRBbm9ueW1vdXNDbGFzc0JvZHkoYW5vbnltb3VzQm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuc2V0QW5vbnltb3VzQ2xhc3NCb2R5KGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb248Pz4+KQorICBMaW5lIDkxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLCBBKQorICBMaW5lIDk2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLCBBKQorICBMaW5lIDEwOSkgYW5vbnltb3VzQ2xhc3NCb2R5LmFkZChib2R5KSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTEwKSBib2R5LnNldFBhcmVudE5vZGUodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMTQpIGVuc3VyZU5vdE51bGwoYXJncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDEyOSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm9ueW1vdXNDbGFzc0JvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTM1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTQxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNTApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTYyKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVBcmd1bWVudHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1F1YWxpZmllZE5hbWVFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfUXVhbGlmaWVkTmFtZUV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjZjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1F1YWxpZmllZE5hbWVFeHByLnR4dApAQCAtMCwwICsxLDUgQEAKKyAgTGluZSA0MCkgc2V0UXVhbGlmaWVyKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByLnNldFF1YWxpZmllcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpCisgIExpbmUgNDUpIHNldFF1YWxpZmllcihzY29wZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5RdWFsaWZpZWROYW1lRXhwci5zZXRRdWFsaWZpZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIsIEEpCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5RdWFsaWZpZWROYW1lRXhwciwgQSkKKyAgTGluZSA2Mikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5xdWFsaWZpZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZmYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci50eHQKQEAgLTAsMCArMSw3IEBACisgIExpbmUgMzkpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA0MCkgc2V0TWVtYmVyVmFsdWUobWVtYmVyVmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuc2V0TWVtYmVyVmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNDUpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA0Nikgc2V0TWVtYmVyVmFsdWUobWVtYmVyVmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuc2V0TWVtYmVyVmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTApIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciwgQSkKKyAgTGluZSA1NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByLCBBKQorICBMaW5lIDYzKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm1lbWJlclZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfU3RyaW5nTGl0ZXJhbEV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9TdHJpbmdMaXRlcmFsRXhwci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4MTZhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfU3RyaW5nTGl0ZXJhbEV4cHIudHh0CkBAIC0wLDAgKzEsNSBAQAorICBMaW5lIDQyKSB2YWx1ZS5jb250YWlucygiXG4iKSA9PT4gamF2YS5sYW5nLlN0cmluZy5jb250YWlucyhqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQorICBMaW5lIDQyKSB2YWx1ZS5jb250YWlucygiXHIiKSA9PT4gamF2YS5sYW5nLlN0cmluZy5jb250YWlucyhqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQorICBMaW5lIDUyKSBVdGlscy5lc2NhcGVFbmRPZkxpbmVzKHN0cmluZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lc2NhcGVFbmRPZkxpbmVzKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwciwgQSkKKyAgTGluZSA2NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9TdXBlckV4cHIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9TdXBlckV4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTZkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1N1cGVyRXhwci50eHQKQEAgLTAsMCArMSw1IEBACisgIExpbmUgMzkpIHNldENsYXNzRXhwcihjbGFzc0V4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLnNldENsYXNzRXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0NCkgc2V0Q2xhc3NFeHByKGNsYXNzRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdXBlckV4cHIuc2V0Q2xhc3NFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLCBBKQorICBMaW5lIDUyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLCBBKQorICBMaW5lIDYxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNsYXNzRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1RoaXNFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfVGhpc0V4cHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTEzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1RoaXNFeHByLnR4dApAQCAtMCwwICsxLDUgQEAKKyAgTGluZSAzOSkgc2V0Q2xhc3NFeHByKGNsYXNzRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5zZXRDbGFzc0V4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNDQpIHNldENsYXNzRXhwcihjbGFzc0V4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuc2V0Q2xhc3NFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIsIEEpCisgIExpbmUgNTIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwciwgQSkKKyAgTGluZSA2MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jbGFzc0V4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9UeXBlRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1R5cGVFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVhY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9UeXBlRXhwci50eHQKQEAgLTAsMCArMSw0IEBACisgIExpbmUgNDMpIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+KQorICBMaW5lIDQ4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIsIEEpCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwciwgQSkKKyAgTGluZSA2NCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfVW5hcnlFeHByLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X2V4cHJfVW5hcnlFeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQyOTdjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9VbmFyeUV4cHIudHh0CkBAIC0wLDAgKzEsNyBAQAorICBMaW5lIDUyKSBzZXRFeHByKGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTMpIHNldE9wZXJhdG9yKG9wKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5zZXRPcGVyYXRvcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yKQorICBMaW5lIDU4KSBzZXRFeHByKGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTkpIHNldE9wZXJhdG9yKG9wKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5zZXRPcGVyYXRvcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLk9wZXJhdG9yKQorICBMaW5lIDYzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLCBBKQorICBMaW5lIDY3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLCBBKQorICBMaW5lIDgwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9leHByX1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdmNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfZXhwcl9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci50eHQKQEAgLTAsMCArMSw0MiBAQAorICBMaW5lIDUzKSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykgPT0+IGphdmEudXRpbC5FbnVtU2V0Lm5vbmVPZihqYXZhLmxhbmcuQ2xhc3M8RT4pCisgIExpbmUgNjcpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldEVsZW1lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDY4KSBzZXRWYXJpYWJsZXMoc2luZ2xldG9uTGlzdChuZXcgVmFyaWFibGVEZWNsYXJhdG9yKHZhcmlhYmxlTmFtZSkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldFZhcmlhYmxlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPikKKyAgTGluZSA2OCkgc2luZ2xldG9uTGlzdChuZXcgVmFyaWFibGVEZWNsYXJhdG9yKHZhcmlhYmxlTmFtZSkpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChUKQorICBMaW5lIDcyKSBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA3Mykgc2V0VmFyaWFibGVzKHNpbmdsZXRvbkxpc3QodmFyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRWYXJpYWJsZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4pCisgIExpbmUgNzMpIHNpbmdsZXRvbkxpc3QodmFyKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoVCkKKyAgTGluZSA3Nykgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgNzgpIHNldFZhcmlhYmxlcyhzaW5nbGV0b25MaXN0KG5ldyBWYXJpYWJsZURlY2xhcmF0b3IodmFyaWFibGVOYW1lKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuc2V0VmFyaWFibGVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I+KQorICBMaW5lIDc4KSBzaW5nbGV0b25MaXN0KG5ldyBWYXJpYWJsZURlY2xhcmF0b3IodmFyaWFibGVOYW1lKSkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFQpCisgIExpbmUgNzkpIHNldE1vZGlmaWVycyhBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNzkpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNzkpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDgwKSBDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSA4MCkgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDg0KSBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA4NSkgc2V0VmFyaWFibGVzKHNpbmdsZXRvbkxpc3QodmFyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRWYXJpYWJsZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4pCisgIExpbmUgODUpIHNpbmdsZXRvbkxpc3QodmFyKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoVCkKKyAgTGluZSA4Nikgc2V0TW9kaWZpZXJzKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSA4NikgQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA4NikgQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgODcpIENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPEM+KQorICBMaW5lIDg3KSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykgPT0+IGphdmEudXRpbC5FbnVtU2V0Lm5vbmVPZihqYXZhLmxhbmcuQ2xhc3M8RT4pCisgIExpbmUgOTEpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldEVsZW1lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDkyKSBzZXRWYXJpYWJsZXModmFyaWFibGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldFZhcmlhYmxlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPikKKyAgTGluZSA5Nykgc2V0TW9kaWZpZXJzKG1vZGlmaWVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgOTgpIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldEVsZW1lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDk5KSBzZXRWYXJpYWJsZXModmFyaWFibGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldFZhcmlhYmxlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yPikKKyAgTGluZSAxMDgpIHNldE1vZGlmaWVycyhtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDEwOSkgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuc2V0QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPikKKyAgTGluZSAxMTApIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLnNldEVsZW1lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDExMSkgc2V0VmFyaWFibGVzKHZhcmlhYmxlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRWYXJpYWJsZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcj4pCisgIExpbmUgMTEyKSBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcj4pCisgIExpbmUgMTI2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIsIEEpCisgIExpbmUgMTMxKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIsIEEpCisgIExpbmUgMTM2KSBlbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTU4KSBlbnN1cmVOb3ROdWxsKHZhcmlhYmxlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE2NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAxNzgpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE4NSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy52YXJpYWJsZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTkwKSBlbnN1cmVOb3ROdWxsKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTk3KSBzZXRBc1BhcmVudE5vZGVPZihhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEFubm90YXRpb25zLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEFubm90YXRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTk4OTkxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoQW5ub3RhdGlvbnMudHh0CkBAIC0wLDAgKzEsNDAgQEAKKyAgTGluZSA1NSkgbmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLm5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1NikgZ2V0QW5ub3RhdGlvbnMoKS5hZGQobm9ybWFsQW5ub3RhdGlvbkV4cHIpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1NikgZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNTcpIG5vcm1hbEFubm90YXRpb25FeHByLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNjgpICgoTm9kZSkgdGhpcykudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoY2xhenopID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoamF2YS5sYW5nLkNsYXNzPD8+KQorICBMaW5lIDY5KSBhZGRBbm5vdGF0aW9uKGNsYXp6LmdldFNpbXBsZU5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuYWRkQW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5KSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSA4MSkgbmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLm5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4MikgZ2V0QW5ub3RhdGlvbnMoKS5hZGQobWFya2VyQW5ub3RhdGlvbkV4cHIpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA4MikgZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgODMpIG1hcmtlckFubm90YXRpb25FeHByLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgOTQpICgoTm9kZSkgdGhpcykudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoY2xhenopID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoamF2YS5sYW5nLkNsYXNzPD8+KQorICBMaW5lIDk1KSBhZGRNYXJrZXJBbm5vdGF0aW9uKGNsYXp6LmdldFNpbXBsZU5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuYWRkTWFya2VyQW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDk1KSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSAxMDgpIG5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5uYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTA4KSBuYW1lKHZhbHVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLm5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDkpIGdldEFubm90YXRpb25zKCkuYWRkKHNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTA5KSBnZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxMTApIHNpbmdsZU1lbWJlckFubm90YXRpb25FeHByLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTIzKSAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSAxMjQpIGFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oY2xhenouZ2V0U2ltcGxlTmFtZSgpLCB2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuYWRkU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyNCkgY2xhenouZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgIExpbmUgMTM0KSBnZXRBbm5vdGF0aW9ucygpLnN0cmVhbSgpLmFueU1hdGNoKGEgLT4gYS5nZXROYW1lKCkuZ2V0TmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTM0KSBnZXRBbm5vdGF0aW9ucygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEzNCkgZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTM0KSBhLmdldE5hbWUoKS5nZXROYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMzQpIGEuZ2V0TmFtZSgpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDEzNCkgYS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxNDQpIGlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuaXNBbm5vdGF0aW9uUHJlc2VudChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0NCkgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldFNpbXBsZU5hbWUoKQorICBMaW5lIDE1NCkgZ2V0QW5ub3RhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoYSAtPiBhLmdldE5hbWUoKS5nZXROYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub3JFbHNlKFQpCisgIExpbmUgMTU0KSBnZXRBbm5vdGF0aW9ucygpLnN0cmVhbSgpLmZpbHRlcihhIC0+IGEuZ2V0TmFtZSgpLmdldE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSAxNTQpIGdldEFubm90YXRpb25zKCkuc3RyZWFtKCkuZmlsdGVyKGEgLT4gYS5nZXROYW1lKCkuZ2V0TmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDE1NCkgZ2V0QW5ub3RhdGlvbnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxNTQpIGdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE1NCkgYS5nZXROYW1lKCkuZ2V0TmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTU0KSBhLmdldE5hbWUoKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAxNTQpIGEuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTY1KSBnZXRBbm5vdGF0aW9uQnlOYW1lKGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zLmdldEFubm90YXRpb25CeU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNjUpIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEJsb2NrU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhCbG9ja1N0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDY1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhCbG9ja1N0bXQudHh0CkBAIC0wLDAgKzEsMiBAQAorICBMaW5lIDEzKSBzZXRCb2R5KGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDE0KSBibG9jay5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoQm9keS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhCb2R5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJkMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoQm9keS50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgMTQpIGIuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNSkgc2V0Qm9keShiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCb2R5LnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoRGVjbGFyYXRpb24udHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhFbGVtZW50VHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhFbGVtZW50VHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3YmViNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEVsZW1lbnRUeXBlLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSA2NSkgKChOb2RlKSB0aGlzKS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdCh0eXBlQ2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoamF2YS5sYW5nLkNsYXNzPD8+KQorICBMaW5lIDY2KSBzZXRFbGVtZW50VHlwZShuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUodHlwZUNsYXNzLmdldFNpbXBsZU5hbWUoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEVsZW1lbnRUeXBlLnNldEVsZW1lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+KQorICBMaW5lIDY2KSB0eXBlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgIExpbmUgNzEpIHNldEVsZW1lbnRUeXBlKGNsYXNzT3JJbnRlcmZhY2VUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZS5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTw/PikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEV4dGVuZHMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoRXh0ZW5kcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyYWFlMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEV4dGVuZHMudHh0CkBAIC0wLDAgKzEsNiBAQAorICBMaW5lIDIwKSAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSAyMSkgYWRkRXh0ZW5kcyhjbGF6ei5nZXRTaW1wbGVOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEV4dGVuZHMuYWRkRXh0ZW5kcyhqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIxKSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSAzMykgZ2V0RXh0ZW5kcygpLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDMzKSBnZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRXh0ZW5kcy5nZXRFeHRlbmRzKCkKKyAgTGluZSAzNCkgY2xhc3NPckludGVyZmFjZVR5cGUuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEltcGxlbWVudHMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoSW1wbGVtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2OTkxYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEltcGxlbWVudHMudHh0CkBAIC0wLDAgKzEsNiBAQAorICBMaW5lIDIyKSBnZXRJbXBsZW1lbnRzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VUeXBlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMjIpIGdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJbXBsZW1lbnRzLmdldEltcGxlbWVudHMoKQorICBMaW5lIDIzKSBjbGFzc09ySW50ZXJmYWNlVHlwZS5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDM0KSAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSAzNSkgYWRkSW1wbGVtZW50cyhjbGF6ei5nZXRTaW1wbGVOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEltcGxlbWVudHMuYWRkSW1wbGVtZW50cyhqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM1KSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEphdmFEb2MudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoSmF2YURvYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxMTRkOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aEphdmFEb2MudHh0CkBAIC0wLDAgKzEgQEAKKyAgTGluZSA0NSkgKChOb2RlKSB0aGlzKS5zZXRDb21tZW50KG5ldyBKYXZhZG9jQ29tbWVudChjb21tZW50KSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aE1lbWJlcnMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoTWVtYmVycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2YmVkMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aE1lbWJlcnMudHh0CkBAIC0wLDAgKzEsMTE2IEBACisgIExpbmUgNDkpICgoTm9kZSkgdGhpcykudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQodHlwZUNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSA1MCkgYWRkRmllbGQodHlwZUNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbmFtZSwgbW9kaWZpZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmFkZEZpZWxkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pCisgIExpbmUgNTApIHR5cGVDbGFzcy5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSA2MikgYWRkRmllbGQobmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKHR5cGUpLCBuYW1lLCBtb2RpZmllcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuYWRkRmllbGQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4sIGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pCisgIExpbmUgNzUpIGZpZWxkRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3NykgZmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKS5hZGQodmFyaWFibGUpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA3NykgZmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkKKyAgTGluZSA3OCkgdmFyaWFibGUuc2V0UGFyZW50Tm9kZShmaWVsZERlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDc5KSBmaWVsZERlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdCh0b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNzkpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KHRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDc5KSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSA4MCkgdG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPEM+KQorICBMaW5lIDgwKSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykgPT0+IGphdmEudXRpbC5FbnVtU2V0Lm5vbmVPZihqYXZhLmxhbmcuQ2xhc3M8RT4pCisgIExpbmUgODEpIHZhcmlhYmxlLnNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3Iuc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA4MikgZ2V0TWVtYmVycygpLmFkZChmaWVsZERlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgODIpIGdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmdldE1lbWJlcnMoKQorICBMaW5lIDk0KSBhZGRGaWVsZCh0eXBlQ2xhc3MsIG5hbWUsIE1vZGlmaWVyLlBSSVZBVEUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuYWRkRmllbGQoamF2YS5sYW5nLkNsYXNzPD8+LCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLi4uKQorICBMaW5lIDEwNikgYWRkRmllbGQodHlwZSwgbmFtZSwgTW9kaWZpZXIuUFJJVkFURSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5hZGRGaWVsZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLi4uKQorICBMaW5lIDExNykgYWRkRmllbGQodHlwZUNsYXNzLCBuYW1lLCBNb2RpZmllci5QVUJMSUMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuYWRkRmllbGQoamF2YS5sYW5nLkNsYXNzPD8+LCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyLi4uKQorICBMaW5lIDEyOSkgYWRkRmllbGQodHlwZSwgbmFtZSwgTW9kaWZpZXIuUFVCTElDKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmFkZEZpZWxkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pCisgIExpbmUgMTQwKSBhZGRGaWVsZCh0eXBlQ2xhc3MsIG5hbWUsIE1vZGlmaWVyLlBST1RFQ1RFRCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5hZGRGaWVsZChqYXZhLmxhbmcuQ2xhc3M8Pz4sIGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXIuLi4pCisgIExpbmUgMTUyKSBhZGRGaWVsZCh0eXBlLCBuYW1lLCBNb2RpZmllci5QUk9URUNURUQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuYWRkRmllbGQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci4uLikKKyAgTGluZSAxNjQpIG1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWUobWV0aG9kTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTY1KSBtZXRob2REZWNsYXJhdGlvbi5zZXRUeXBlKFZPSURfVFlQRSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDE2NikgbWV0aG9kRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KHRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMTY2KSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdCh0b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAxNjYpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDE2NykgdG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPEM+KQorICBMaW5lIDE2NykgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDE2OCkgZ2V0TWVtYmVycygpLmFkZChtZXRob2REZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE2OCkgZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuZ2V0TWVtYmVycygpCisgIExpbmUgMTY5KSBtZXRob2REZWNsYXJhdGlvbi5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE4MSkgY29uc3RydWN0b3JEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpLmNvbGxlY3QodG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDE4MSkgQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpLmNvbGxlY3QodG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTgxKSBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAxODIpIHRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSAxODIpIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSA9PT4gamF2YS51dGlsLkVudW1TZXQubm9uZU9mKGphdmEubGFuZy5DbGFzczxFPikKKyAgTGluZSAxODMpIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TmFtZSgoKFR5cGVEZWNsYXJhdGlvbjw/PikgdGhpcykuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE4MykgKChUeXBlRGVjbGFyYXRpb248Pz4pIHRoaXMpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxODQpIGdldE1lbWJlcnMoKS5hZGQoY29uc3RydWN0b3JEZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE4NCkgZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuZ2V0TWVtYmVycygpCisgIExpbmUgMTg1KSBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTkyKSBnZXRNZW1iZXJzKCkuYWRkKGluaXRpYWxpemVyRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxOTIpIGdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmdldE1lbWJlcnMoKQorICBMaW5lIDE5MykgaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDIwMCkgZ2V0TWVtYmVycygpLmFkZChpbml0aWFsaXplckRlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMjAwKSBnZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5nZXRNZW1iZXJzKCkKKyAgTGluZSAyMDEpIGluaXRpYWxpemVyRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyMTIpIGdldE1lbWJlcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5jb2xsZWN0KHRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDIxMikgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiAmJiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5tYXAobSAtPiAoTWV0aG9kRGVjbGFyYXRpb24pIG0pID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDIxMikgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiAmJiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAyMTIpIGdldE1lbWJlcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyMTIpIGdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNZW1iZXJzLmdldE1lbWJlcnMoKQorICBMaW5lIDIxMykgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMTMpICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDIxNCkgdG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDIyMykgdW5tb2RpZmlhYmxlTGlzdChnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKS5tYXAobSAtPiAoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmNvbGxlY3QodG9MaXN0KCkpKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIFQ+KQorICBMaW5lIDIyMykgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5jb2xsZWN0KHRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDIyMykgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAyMjMpIGdldE1lbWJlcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDIyMykgZ2V0TWVtYmVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDIyMykgZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuZ2V0TWVtYmVycygpCisgIExpbmUgMjI2KSB0b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjM3KSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uICYmICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKS5jb2xsZWN0KHRvU2V0KCkpLmVxdWFscyhTdHJlYW0ub2YocGFyYW1UeXBlcykuY29sbGVjdCh0b1NldCgpKSkpLm1hcChtIC0+IChNZXRob2REZWNsYXJhdGlvbikgbSkuY29sbGVjdCh0b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAyMzcpIGdldE1lbWJlcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcChwIC0+IHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpLmNvbGxlY3QodG9TZXQoKSkuZXF1YWxzKFN0cmVhbS5vZihwYXJhbVR5cGVzKS5jb2xsZWN0KHRvU2V0KCkpKSkubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAyMzcpIGdldE1lbWJlcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcChwIC0+IHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpLmNvbGxlY3QodG9TZXQoKSkuZXF1YWxzKFN0cmVhbS5vZihwYXJhbVR5cGVzKS5jb2xsZWN0KHRvU2V0KCkpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjM3KSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjM3KSBnZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5nZXRNZW1iZXJzKCkKKyAgTGluZSAyMzkpICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKS5jb2xsZWN0KHRvU2V0KCkpLmVxdWFscyhTdHJlYW0ub2YocGFyYW1UeXBlcykuY29sbGVjdCh0b1NldCgpKSkgPT0+IGphdmEudXRpbC5TZXQuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjM5KSAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKSkuY29sbGVjdCh0b1NldCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDIzOSkgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcChwIC0+IHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDIzOSkgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDIzOSkgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgMjM5KSBwLmdldFR5cGUoKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDIzOSkgcC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0VHlwZSgpCisgIExpbmUgMjQwKSB0b1NldCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9TZXQoKQorICBMaW5lIDI0MCkgU3RyZWFtLm9mKHBhcmFtVHlwZXMpLmNvbGxlY3QodG9TZXQoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAyNDApIFN0cmVhbS5vZihwYXJhbVR5cGVzKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ub2YoVC4uLikKKyAgTGluZSAyNDApIHRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMjQxKSB0b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjUyKSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uICYmICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKS5jb2xsZWN0KHRvU2V0KCkpLmVxdWFscyhTdHJlYW0ub2YocGFyYW1UeXBlcykubWFwKENsYXNzOjpnZXRTaW1wbGVOYW1lKS5jb2xsZWN0KHRvU2V0KCkpKSkubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5jb2xsZWN0KHRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDI1MikgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiAmJiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKSkuY29sbGVjdCh0b1NldCgpKS5lcXVhbHMoU3RyZWFtLm9mKHBhcmFtVHlwZXMpLm1hcChDbGFzczo6Z2V0U2ltcGxlTmFtZSkuY29sbGVjdCh0b1NldCgpKSkpLm1hcChtIC0+IChNZXRob2REZWNsYXJhdGlvbikgbSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMjUyKSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uICYmICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKS5jb2xsZWN0KHRvU2V0KCkpLmVxdWFscyhTdHJlYW0ub2YocGFyYW1UeXBlcykubWFwKENsYXNzOjpnZXRTaW1wbGVOYW1lKS5jb2xsZWN0KHRvU2V0KCkpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjUyKSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjUyKSBnZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5nZXRNZW1iZXJzKCkKKyAgTGluZSAyNTQpICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKS5jb2xsZWN0KHRvU2V0KCkpLmVxdWFscyhTdHJlYW0ub2YocGFyYW1UeXBlcykubWFwKENsYXNzOjpnZXRTaW1wbGVOYW1lKS5jb2xsZWN0KHRvU2V0KCkpKSA9PT4gamF2YS51dGlsLlNldC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNTQpICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKS5jb2xsZWN0KHRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjU0KSAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMjU0KSAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjU0KSAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAyNTQpIHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgMjU0KSBwLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRUeXBlKCkKKyAgTGluZSAyNTUpIHRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMjU2KSBTdHJlYW0ub2YocGFyYW1UeXBlcykubWFwKENsYXNzOjpnZXRTaW1wbGVOYW1lKS5jb2xsZWN0KHRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjU2KSBTdHJlYW0ub2YocGFyYW1UeXBlcykubWFwKENsYXNzOjpnZXRTaW1wbGVOYW1lKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAyNTYpIFN0cmVhbS5vZihwYXJhbVR5cGVzKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ub2YoVC4uLikKKyAgTGluZSAyNTYpIHRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMjU3KSB0b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjY3KSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24gJiYgKChGaWVsZERlY2xhcmF0aW9uKSBtKS5nZXRWYXJpYWJsZXMoKS5zdHJlYW0oKS5hbnlNYXRjaCh2YXIgLT4gdmFyLmdldElkKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkpLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDI2NykgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uICYmICgoRmllbGREZWNsYXJhdGlvbikgbSkuZ2V0VmFyaWFibGVzKCkuc3RyZWFtKCkuYW55TWF0Y2godmFyIC0+IHZhci5nZXRJZCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSAyNjcpIGdldE1lbWJlcnMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbiAmJiAoKEZpZWxkRGVjbGFyYXRpb24pIG0pLmdldFZhcmlhYmxlcygpLnN0cmVhbSgpLmFueU1hdGNoKHZhciAtPiB2YXIuZ2V0SWQoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjY3KSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjY3KSBnZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVycy5nZXRNZW1iZXJzKCkKKyAgTGluZSAyNjgpICgoRmllbGREZWNsYXJhdGlvbikgbSkuZ2V0VmFyaWFibGVzKCkuc3RyZWFtKCkuYW55TWF0Y2godmFyIC0+IHZhci5nZXRJZCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjY4KSAoKEZpZWxkRGVjbGFyYXRpb24pIG0pLmdldFZhcmlhYmxlcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDI2OCkgKChGaWVsZERlY2xhcmF0aW9uKSBtKS5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAyNjkpIHZhci5nZXRJZCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjY5KSB2YXIuZ2V0SWQoKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXROYW1lKCkKKyAgTGluZSAyNjkpIHZhci5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldElkKCkKKyAgTGluZSAyNzkpIHVubW9kaWZpYWJsZUxpc3QoZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKS5tYXAobSAtPiAoRmllbGREZWNsYXJhdGlvbikgbSkuY29sbGVjdCh0b0xpc3QoKSkpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgVD4pCisgIExpbmUgMjc5KSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pLm1hcChtIC0+IChGaWVsZERlY2xhcmF0aW9uKSBtKS5jb2xsZWN0KHRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDI3OSkgZ2V0TWVtYmVycygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKS5tYXAobSAtPiAoRmllbGREZWNsYXJhdGlvbikgbSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMjc5KSBnZXRNZW1iZXJzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDI3OSkgZ2V0TWVtYmVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDI3OSkgZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuZ2V0TWVtYmVycygpCisgIExpbmUgMjgyKSB0b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhNb2RpZmllcnMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoTW9kaWZpZXJzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTk5YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoTW9kaWZpZXJzLnR4dApAQCAtMCwwICsxLDI4IEBACisgIExpbmUgMjUpIGdldE1vZGlmaWVycygpLmFkZEFsbChBcnJheXMuc3RyZWFtKG1vZGlmaWVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSkgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAyNSkgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmdldE1vZGlmaWVycygpCisgIExpbmUgMjUpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjUpIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDI2KSBDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uKGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjxDPikKKyAgTGluZSAyNikgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpID09PiBqYXZhLnV0aWwuRW51bVNldC5ub25lT2YoamF2YS5sYW5nLkNsYXNzPEU+KQorICBMaW5lIDMxKSBnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5TVEFUSUMpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzEpIGdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5nZXRNb2RpZmllcnMoKQorICBMaW5lIDM1KSBnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5BQlNUUkFDVCkgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNSkgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmdldE1vZGlmaWVycygpCisgIExpbmUgMzkpIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLkZJTkFMKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM5KSBnZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA0MykgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuTkFUSVZFKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQzKSBnZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA0NykgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuUFJJVkFURSkgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NykgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmdldE1vZGlmaWVycygpCisgIExpbmUgNTEpIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBST1RFQ1RFRCkgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MSkgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmdldE1vZGlmaWVycygpCisgIExpbmUgNTUpIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykgPT0+IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1NSkgZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTW9kaWZpZXJzLmdldE1vZGlmaWVycygpCisgIExpbmUgNTkpIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlNUUklDVEZQKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU5KSBnZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA2MykgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuU1lOQ0hST05JWkVEKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYzKSBnZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA2NykgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuVFJBTlNJRU5UKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY3KSBnZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhNb2RpZmllcnMuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA3MSkgZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuVk9MQVRJTEUpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzEpIGdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVycy5nZXRNb2RpZmllcnMoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoTmFtZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhOYW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoTmFtZS50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFBhcmFtZXRlcnMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoUGFyYW1ldGVycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyNTZmZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFBhcmFtZXRlcnMudHh0CkBAIC0wLDAgKzEsNDAgQEAKKyAgTGluZSAxNykgYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIodHlwZSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKG5hbWUpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5hZGRQYXJhbWV0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcikKKyAgTGluZSAyMSkgKChOb2RlKSB0aGlzKS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChwYXJhbUNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSAyMikgYWRkUGFyYW1ldGVyKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShwYXJhbUNsYXNzLmdldFNpbXBsZU5hbWUoKSksIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkUGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIyKSBwYXJhbUNsYXNzLmdldFNpbXBsZU5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldFNpbXBsZU5hbWUoKQorICBMaW5lIDMyKSBhZGRQYXJhbWV0ZXIobmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKGNsYXNzTmFtZSksIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkUGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM3KSBnZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtZXRlcikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDM3KSBnZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAzOCkgcGFyYW1ldGVyLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDMpIGFkZEFuZEdldFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKHR5cGUsIG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChuYW1lKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuYWRkQW5kR2V0UGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpCisgIExpbmUgNDcpICgoTm9kZSkgdGhpcykudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQocGFyYW1DbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChqYXZhLmxhbmcuQ2xhc3M8Pz4pCisgIExpbmUgNDgpIGFkZEFuZEdldFBhcmFtZXRlcihuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUocGFyYW1DbGFzcy5nZXRTaW1wbGVOYW1lKCkpLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZEFuZEdldFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0OCkgcGFyYW1DbGFzcy5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSA1OSkgYWRkQW5kR2V0UGFyYW1ldGVyKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShjbGFzc05hbWUpLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmFkZEFuZEdldFBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MykgZ2V0UGFyYW1ldGVycygpLmFkZChwYXJhbWV0ZXIpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA2MykgZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNjQpIHBhcmFtZXRlci5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDc1KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vckVsc2UoVCkKKyAgTGluZSA3NSkgZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgNzUpIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDc1KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNzUpIGdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDc2KSBwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzYpIHAuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDg2KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHModHlwZSkpLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDg2KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHModHlwZSkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDg2KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHModHlwZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDg2KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgODYpIGdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhQYXJhbWV0ZXJzLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDg3KSBwLmdldFR5cGUoKS50b1N0cmluZygpLmVxdWFscyh0eXBlKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4NykgcC5nZXRUeXBlKCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSA4NykgcC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0VHlwZSgpCisgIExpbmUgOTcpIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5maWx0ZXIocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpLmVxdWFscyh0eXBlLmdldFNpbXBsZU5hbWUoKSkpLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDk3KSBnZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuZmlsdGVyKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHModHlwZS5nZXRTaW1wbGVOYW1lKCkpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSA5NykgZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKHR5cGUuZ2V0U2ltcGxlTmFtZSgpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgOTcpIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA5NykgZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVycygpCisgIExpbmUgOTgpIHAuZ2V0VHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKHR5cGUuZ2V0U2ltcGxlTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5OCkgcC5nZXRUeXBlKCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSA5OCkgcC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0VHlwZSgpCisgIExpbmUgOTgpIHR5cGUuZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhTdGF0ZW1lbnRzLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFN0YXRlbWVudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YmRjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhTdGF0ZW1lbnRzLnR4dApAQCAtMCwwICsxLDExIEBACisgIExpbmUgMTgpIGdldFN0bXRzKCkuYWRkKHN0YXRlbWVudCkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE4KSBnZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuZ2V0U3RtdHMoKQorICBMaW5lIDE5KSBzdGF0ZW1lbnQuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyNSkgZ2V0U3RtdHMoKS5hZGQoaW5kZXgsIHN0YXRlbWVudCkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChpbnQsIEUpCisgIExpbmUgMjUpIGdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50cy5nZXRTdG10cygpCisgIExpbmUgMjYpIHN0YXRlbWVudC5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDMyKSBleHByLnNldFBhcmVudE5vZGUoc3RhdGVtZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDMzKSBhZGRTdGF0ZW1lbnQoc3RhdGVtZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzLmFkZFN0YXRlbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDM3KSBhZGRTdGF0ZW1lbnQobmV3IE5hbWVFeHByKHN0YXRlbWVudCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuYWRkU3RhdGVtZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQyKSBleHByLnNldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0MykgYWRkU3RhdGVtZW50KGluZGV4LCBzdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzLmFkZFN0YXRlbWVudChpbnQsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhUaHJvd2FibGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoVGhyb3dhYmxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmYyN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoVGhyb3dhYmxlLnR4dApAQCAtMCwwICsxLDEzIEBACisgIExpbmUgMjIpIGdldFRocm93cygpLmFkZCh0aHJvd1R5cGUpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyMikgZ2V0VGhyb3dzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVGhyb3dhYmxlLmdldFRocm93cygpCisgIExpbmUgMjMpIHRocm93VHlwZS5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDM0KSAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSAzNSkgYWRkVGhyb3dzKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShjbGF6ei5nZXRTaW1wbGVOYW1lKCkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuYWRkVGhyb3dzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlKQorICBMaW5lIDM1KSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSA0NSkgaXNUaHJvd3MoY2xhenouZ2V0U2ltcGxlTmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUaHJvd2FibGUuaXNUaHJvd3MoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0NSkgY2xhenouZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgIExpbmUgNTUpIGdldFRocm93cygpLnN0cmVhbSgpLmFueU1hdGNoKHQgLT4gdC50b1N0cmluZygpLmVxdWFscyh0aHJvd2FibGVOYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmFueU1hdGNoKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA1NSkgZ2V0VGhyb3dzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNTUpIGdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFRocm93YWJsZS5nZXRUaHJvd3MoKQorICBMaW5lIDU1KSB0LnRvU3RyaW5nKCkuZXF1YWxzKHRocm93YWJsZU5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU1KSB0LnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDYwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhUeXBlLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSA2MCkgKChOb2RlKSB0aGlzKS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdCh0eXBlQ2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoamF2YS5sYW5nLkNsYXNzPD8+KQorICBMaW5lIDYxKSBzZXRUeXBlKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSh0eXBlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZS5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+KQorICBMaW5lIDYxKSB0eXBlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgIExpbmUgNjYpIHNldFR5cGUoY2xhc3NPckludGVyZmFjZVR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGUuc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTw/PikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFR5cGVBcmd1bWVudHMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfbm9kZVR5cGVzX05vZGVXaXRoVHlwZUFyZ3VtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyZDk0YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFR5cGVBcmd1bWVudHMudHh0CkBAIC0wLDAgKzEsNyBAQAorICBMaW5lIDU0KSBnZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50cy5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA1NykgZ2V0VHlwZUFyZ3VtZW50cygpLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgNTcpIGdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDY1KSBzZXRUeXBlQXJndW1lbnRzKGVtcHR5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzLnNldFR5cGVBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4+KQorICBMaW5lIDczKSBzZXRUeXBlQXJndW1lbnRzKChMaXN0PFR5cGU8Pz4+KSBudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzLnNldFR5cGVBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4+KQorICBMaW5lIDc4KSBzZXRUeXBlQXJndW1lbnRzKGFycmF5VG9MaXN0KHR5cGVBcmd1bWVudHMpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzLnNldFR5cGVBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4+KQorICBMaW5lIDc4KSBhcnJheVRvTGlzdCh0eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFycmF5VG9MaXN0KFRbXSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X25vZGVUeXBlc19Ob2RlV2l0aFZhcmlhYmxlcy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhWYXJpYWJsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9ub2RlVHlwZXNfTm9kZVdpdGhWYXJpYWJsZXMudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0Fzc2VydFN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Bc3NlcnRTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTE5YzI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Bc3NlcnRTdG10LnR4dApAQCAtMCwwICsxLDkgQEAKKyAgTGluZSA0Mikgc2V0Q2hlY2soY2hlY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5zZXRDaGVjayhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0Nikgc2V0Q2hlY2soY2hlY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5zZXRDaGVjayhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0Nykgc2V0TWVzc2FnZShtc2cpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5zZXRNZXNzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDUzKSBzZXRDaGVjayhjaGVjaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10LnNldENoZWNrKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDU0KSBzZXRNZXNzYWdlKG1zZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10LnNldE1lc3NhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10LCBBKQorICBMaW5lIDYzKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdCwgQSkKKyAgTGluZSA3Nikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jaGVjaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgODIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMubXNnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQmxvY2tTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQmxvY2tTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM3NzM3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9CbG9ja1N0bXQudHh0CkBAIC0wLDAgKzEsNiBAQAorICBMaW5lIDQ0KSBzZXRTdG10cyhzdG10cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuc2V0U3RtdHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudD4pCisgIExpbmUgNDkpIHNldFN0bXRzKHN0bXRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5zZXRTdG10cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PikKKyAgTGluZSA1NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCwgQSkKKyAgTGluZSA1OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCwgQSkKKyAgTGluZSA2NCkgZW5zdXJlTm90TnVsbChzdG10cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDcxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnN0bXRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9CcmVha1N0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9CcmVha1N0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjk4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0JyZWFrU3RtdC50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQsIEEpCisgIExpbmUgNTIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQsIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0NhdGNoQ2xhdXNlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfQ2F0Y2hDbGF1c2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYzEyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0NhdGNoQ2xhdXNlLnR4dApAQCAtMCwwICsxLDkgQEAKKyAgTGluZSA1Mikgc2V0UGFyYW0ocGFyYW0pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2Uuc2V0UGFyYW0oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcikKKyAgTGluZSA1Mykgc2V0Qm9keShjYXRjaEJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA2Mykgc2V0UGFyYW0obmV3IFBhcmFtZXRlcihyYW5nZSwgZXhjZXB0TW9kaWZpZXIsIGV4Y2VwdEFubm90YXRpb25zLCBleGNlcHRUeXBlLCBudWxsLCBmYWxzZSwgZXhjZXB0SWQpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLnNldFBhcmFtKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpCisgIExpbmUgNjQpIHNldEJvZHkoY2F0Y2hCbG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgNjgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZSwgQSkKKyAgTGluZSA3Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLCBBKQorICBMaW5lIDk5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNhdGNoQmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwNSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYXJhbSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTE3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNhdGNoQmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Db250aW51ZVN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Db250aW51ZVN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDcxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0NvbnRpbnVlU3RtdC50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQsIEEpCisgIExpbmUgNTIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQsIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0RvU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0RvU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlYWRhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRG9TdG10LnR4dApAQCAtMCwwICsxLDggQEAKKyAgTGluZSA0Mykgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdC5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNDQpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0OSkgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdC5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNTApIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdCwgQSkKKyAgTGluZSA1OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdCwgQSkKKyAgTGluZSA3Mykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3OSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9FbXB0eVN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9FbXB0eVN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTU3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0VtcHR5U3RtdC50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQsIEEpCisgIExpbmUgNDUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQsIEEpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OGM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LnR4dApAQCAtMCwwICsxLDEzIEBACisgIExpbmUgNTMpIHNldFRoaXMoaXNUaGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5zZXRUaGlzKGJvb2xlYW4pCisgIExpbmUgNTQpIHNldEV4cHIoZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuc2V0RXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1NSkgc2V0QXJncyhhcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5zZXRBcmdzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPikKKyAgTGluZSA2Mikgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5zZXRUeXBlQXJndW1lbnRzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+PikKKyAgTGluZSA2Mykgc2V0VGhpcyhpc1RoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LnNldFRoaXMoYm9vbGVhbikKKyAgTGluZSA2NCkgc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDY1KSBzZXRBcmdzKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LnNldEFyZ3MoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+KQorICBMaW5lIDcwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LCBBKQorICBMaW5lIDc1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LCBBKQorICBMaW5lIDc5KSBlbnN1cmVOb3ROdWxsKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA5Mykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDk5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExNikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9FeHByZXNzaW9uU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0V4cHJlc3Npb25TdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI0MTUyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9FeHByZXNzaW9uU3RtdC50eHQKQEAgLTAsMCArMSw1IEBACisgIExpbmUgNDApIHNldEV4cHJlc3Npb24oZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdC5zZXRFeHByZXNzaW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ2KSBzZXRFeHByZXNzaW9uKGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQuc2V0RXhwcmVzc2lvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LCBBKQorICBMaW5lIDU0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQsIEEpCisgIExpbmUgNjMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0ZvclN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Gb3JTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI3OGUwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Gb3JTdG10LnR4dApAQCAtMCwwICsxLDE2IEBACisgIExpbmUgNTIpIHNldENvbXBhcmUoY29tcGFyZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LnNldENvbXBhcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTMpIHNldEluaXQoaW5pdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LnNldEluaXQoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+KQorICBMaW5lIDU0KSBzZXRVcGRhdGUodXBkYXRlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuc2V0VXBkYXRlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPikKKyAgTGluZSA1NSkgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDYyKSBzZXRDb21wYXJlKGNvbXBhcmUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5zZXRDb21wYXJlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDYzKSBzZXRJbml0KGluaXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5zZXRJbml0KGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPikKKyAgTGluZSA2NCkgc2V0VXBkYXRlKHVwZGF0ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LnNldFVwZGF0ZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4pCisgIExpbmUgNjUpIHNldEJvZHkoYm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKKyAgTGluZSA3MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQsIEEpCisgIExpbmUgNzUpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LCBBKQorICBMaW5lIDg4KSBlbnN1cmVOb3ROdWxsKGluaXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA5MykgZW5zdXJlTm90TnVsbCh1cGRhdGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDApIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTA2KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbXBhcmUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExMikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbml0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDExOCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy51cGRhdGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0ZvcmVhY2hTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfRm9yZWFjaFN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGU4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0ZvcmVhY2hTdG10LnR4dApAQCAtMCwwICsxLDE0IEBACisgIExpbmUgNDgpIHNldFZhcmlhYmxlKHZhcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5zZXRWYXJpYWJsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpCisgIExpbmUgNDkpIHNldEl0ZXJhYmxlKGl0ZXJhYmxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LnNldEl0ZXJhYmxlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDUwKSBzZXRCb2R5KGJvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDU3KSBzZXRWYXJpYWJsZSh2YXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuc2V0VmFyaWFibGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByKQorICBMaW5lIDU4KSBzZXRJdGVyYWJsZShpdGVyYWJsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5zZXRJdGVyYWJsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1OSkgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKKyAgTGluZSA3MCkgc2V0VmFyaWFibGUodmFyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LnNldFZhcmlhYmxlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcikKKyAgTGluZSA3MSkgc2V0SXRlcmFibGUobmV3IE5hbWVFeHByKGl0ZXJhYmxlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5zZXRJdGVyYWJsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA3Mikgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKKyAgTGluZSA3Nykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LCBBKQorICBMaW5lIDgyKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQsIEEpCisgIExpbmUgMTAxKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwNykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pdGVyYWJsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTEzKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0lmU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0lmU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5NjcyYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfSWZTdG10LnR4dApAQCAtMCwwICsxLDExIEBACisgIExpbmUgNDQpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0NSkgc2V0VGhlblN0bXQodGhlblN0bXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LnNldFRoZW5TdG10KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNDYpIHNldEVsc2VTdG10KGVsc2VTdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5zZXRFbHNlU3RtdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDUyKSBzZXRDb25kaXRpb24oY29uZGl0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5zZXRDb25kaXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTMpIHNldFRoZW5TdG10KHRoZW5TdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5zZXRUaGVuU3RtdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDU0KSBzZXRFbHNlU3RtdChlbHNlU3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuc2V0RWxzZVN0bXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKKyAgTGluZSA1OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdCwgQSkKKyAgTGluZSA2Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdCwgQSkKKyAgTGluZSA3OSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDg1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVsc2VTdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA5MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50aGVuU3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0xhYmVsZWRTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfTGFiZWxlZFN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjNlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X0xhYmVsZWRTdG10LnR4dApAQCAtMCwwICsxLDcgQEAKKyAgTGluZSA0MSkgc2V0TGFiZWwobGFiZWwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQuc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0Mikgc2V0U3RtdChzdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10LnNldFN0bXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKKyAgTGluZSA0Nykgc2V0TGFiZWwobGFiZWwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQuc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0OCkgc2V0U3RtdChzdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10LnNldFN0bXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudCkKKyAgTGluZSA1Mikgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10LCBBKQorICBMaW5lIDU2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQsIEEpCisgIExpbmUgNzQpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1JldHVyblN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9SZXR1cm5TdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY5Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9SZXR1cm5TdG10LnR4dApAQCAtMCwwICsxLDYgQEAKKyAgTGluZSA0MSkgc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQuc2V0RXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0Nikgc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQuc2V0RXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1NSkgc2V0RXhwcihuZXcgTmFtZUV4cHIoZXhwcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDYwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdCwgQSkKKyAgTGluZSA2NCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQsIEEpCisgIExpbmUgNzMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N0YXRlbWVudC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N0YXRlbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3RhdGVtZW50LnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Td2l0Y2hFbnRyeVN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9Td2l0Y2hFbnRyeVN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2QzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N3aXRjaEVudHJ5U3RtdC50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgNDcpIHNldExhYmVsKGxhYmVsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5zZXRMYWJlbChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0OCkgc2V0U3RtdHMoc3RtdHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LnNldFN0bXRzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ+KQorICBMaW5lIDU0KSBzZXRMYWJlbChsYWJlbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuc2V0TGFiZWwoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTUpIHNldFN0bXRzKHN0bXRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5zZXRTdG10cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50PikKKyAgTGluZSA2MCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdCwgQSkKKyAgTGluZSA2NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdCwgQSkKKyAgTGluZSA3NCkgZW5zdXJlTm90TnVsbChzdG10cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDgwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmxhYmVsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4Nykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zdG10cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3dpdGNoU3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N3aXRjaFN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDMzODkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1N3aXRjaFN0bXQudHh0CkBAIC0wLDAgKzEsOSBAQAorICBMaW5lIDQ3KSBzZXRTZWxlY3RvcihzZWxlY3RvcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LnNldFNlbGVjdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ4KSBzZXRFbnRyaWVzKGVudHJpZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5zZXRFbnRyaWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+KQorICBMaW5lIDU0KSBzZXRTZWxlY3RvcihzZWxlY3RvcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LnNldFNlbGVjdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDU1KSBzZXRFbnRyaWVzKGVudHJpZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5zZXRFbnRyaWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ+KQorICBMaW5lIDYwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdCwgQSkKKyAgTGluZSA2NSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQsIEEpCisgIExpbmUgNjkpIGVuc3VyZU5vdE51bGwoZW50cmllcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDc5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVudHJpZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgODUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2VsZWN0b3IpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9TeW5jaHJvbml6ZWRTdG10LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3luY2hyb25pemVkU3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3M2EzMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfU3luY2hyb25pemVkU3RtdC50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgNDMpIHNldEV4cHIoZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNDQpIHNldEJsb2NrKGJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQuc2V0QmxvY2soY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA1MCkgc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQuc2V0RXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1MSkgc2V0QmxvY2soYmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5zZXRCbG9jayhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDU2KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdCwgQSkKKyAgTGluZSA2MSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQsIEEpCisgIExpbmUgODQpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDkwKSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwMikgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ibG9jaykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1Rocm93U3RtdC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1Rocm93U3RtdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2NTczNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3N0bXRfVGhyb3dTdG10LnR4dApAQCAtMCwwICsxLDUgQEAKKyAgTGluZSA0MCkgc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ1KSBzZXRFeHByKGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10LnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNDkpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQsIEEpCisgIExpbmUgNTMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQsIEEpCisgIExpbmUgNjIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1RyeVN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9UcnlTdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgyNTIyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9UcnlTdG10LnR4dApAQCAtMCwwICsxLDE1IEBACisgIExpbmUgNTEpIHNldFRyeUJsb2NrKHRyeUJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuc2V0VHJ5QmxvY2soY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA1Mikgc2V0Q2F0Y2hzKGNhdGNocykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LnNldENhdGNocyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U+KQorICBMaW5lIDUzKSBzZXRGaW5hbGx5QmxvY2soZmluYWxseUJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuc2V0RmluYWxseUJsb2NrKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgNTkpIHNldFJlc291cmNlcyhyZXNvdXJjZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5zZXRSZXNvdXJjZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByPikKKyAgTGluZSA2MCkgc2V0VHJ5QmxvY2sodHJ5QmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5zZXRUcnlCbG9jayhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDYxKSBzZXRDYXRjaHMoY2F0Y2hzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuc2V0Q2F0Y2hzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZT4pCisgIExpbmUgNjIpIHNldEZpbmFsbHlCbG9jayhmaW5hbGx5QmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5zZXRGaW5hbGx5QmxvY2soY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA2Nykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQsIEEpCisgIExpbmUgNzIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LCBBKQorICBMaW5lIDc2KSBlbnN1cmVOb3ROdWxsKGNhdGNocykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDg5KSBlbnN1cmVOb3ROdWxsKHJlc291cmNlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDk1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNhdGNocykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlPikKKyAgTGluZSAxMDEpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZmluYWxseUJsb2NrKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMDcpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHJ5QmxvY2spID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExMykgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5yZXNvdXJjZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1R5cGVEZWNsYXJhdGlvblN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9UeXBlRGVjbGFyYXRpb25TdG10LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFkYmNhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9UeXBlRGVjbGFyYXRpb25TdG10LnR4dApAQCAtMCwwICsxLDUgQEAKKyAgTGluZSA0MCkgc2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQuc2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pCisgIExpbmUgNDUpIHNldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10LnNldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDQ5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdCwgQSkKKyAgTGluZSA1Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQsIEEpCisgIExpbmUgNjIpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZURlY2wpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9XaGlsZVN0bXQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3Rfc3RtdF9XaGlsZVN0bXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjBjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF9zdG10X1doaWxlU3RtdC50eHQKQEAgLTAsMCArMSw4IEBACisgIExpbmUgNDMpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10LnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0NCkgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNDkpIHNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10LnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1MCkgc2V0Qm9keShib2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNTQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQsIEEpCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQsIEEpCisgIExpbmUgNzMpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzkpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfQXJyYXlUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfQXJyYXlUeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ1ZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9BcnJheVR5cGUudHh0CkBAIC0wLDAgKzEsMTQgQEAKKyAgTGluZSAyMykgc2V0Q29tcG9uZW50VHlwZShjb21wb25lbnRUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5zZXRDb21wb25lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDI0KSBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pCisgIExpbmUgMjkpIHNldENvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUuc2V0Q29tcG9uZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAzMCkgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDM0KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLCBBKQorICBMaW5lIDM4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLCBBKQorICBMaW5lIDQ3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbXBvbmVudFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDYwKSBhcnJheUJyYWNrZXRQYWlyTGlzdC5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDYxKSBhcnJheUJyYWNrZXRQYWlyTGlzdC5nZXQoaikuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA2MSkgYXJyYXlCcmFja2V0UGFpckxpc3QuZ2V0KGopID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDc3KSBhcnJheUJyYWNrZXRQYWlycy5hZGQobmV3IEFycmF5QnJhY2tldFBhaXIoUmFuZ2UuVU5LTk9XTiwgYXJyYXlUeXBlLmdldEFubm90YXRpb25zKCkpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNzcpIGFycmF5VHlwZS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNzgpIGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgODQpIEFycmF5cy5hc0xpc3QoYW5ub3RhdGlvbnMpID09PiBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChULi4uKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9DbGFzc09ySW50ZXJmYWNlVHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX0NsYXNzT3JJbnRlcmZhY2VUeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmVlMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9DbGFzc09ySW50ZXJmYWNlVHlwZS50eHQKQEAgLTAsMCArMSwxMyBAQAorICBMaW5lIDUzKSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU3KSBzZXRTY29wZShzY29wZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUpCisgIExpbmUgNTgpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjMpIHNldFNjb3BlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLnNldFNjb3BlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSkKKyAgTGluZSA2NCkgc2V0TmFtZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NSkgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLnNldFR5cGVBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU8Pz4+KQorICBMaW5lIDY5KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUsIEEpCisgIExpbmUgNzMpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSwgQSkKKyAgTGluZSA4NikgUHJpbWl0aXZlVHlwZS51bmJveE1hcC5jb250YWluc0tleShuYW1lKSA9PT4gamF2YS51dGlsLkhhc2hNYXAuY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MCkgaXNCb3hlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmlzQm94ZWRUeXBlKCkKKyAgTGluZSA5MykgUHJpbWl0aXZlVHlwZS51bmJveE1hcC5nZXQobmFtZSkgPT0+IGphdmEudXRpbC5IYXNoTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwNCkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRBc1BhcmVudE5vZGVPZihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTE2KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVBcmd1bWVudHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX0ludGVyc2VjdGlvblR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9JbnRlcnNlY3Rpb25UeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU2MmFhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9JbnRlcnNlY3Rpb25UeXBlLnR4dApAQCAtMCwwICsxLDYgQEAKKyAgTGluZSAyOCkgc2V0RWxlbWVudHMoZWxlbWVudHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuSW50ZXJzZWN0aW9uVHlwZS5zZXRFbGVtZW50cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZT4pCisgIExpbmUgMzMpIHNldEVsZW1lbnRzKGVsZW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuc2V0RWxlbWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU+KQorICBMaW5lIDM4KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuSW50ZXJzZWN0aW9uVHlwZSwgQSkKKyAgTGluZSA0Mykgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUsIEEpCisgIExpbmUgNTMpIGVsZW1lbnQuc2V0UGFyZW50Tm9kZShudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDU3KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVsZW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9QcmltaXRpdmVUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUHJpbWl0aXZlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1MjdjMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUHJpbWl0aXZlVHlwZS50eHQKQEAgLTAsMCArMSw2IEBACisgIExpbmUgNzcpIFByaW1pdGl2ZS52YWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLnZhbHVlcygpCisgIExpbmUgNzgpIHVuYm94TWFwLnB1dCh1bmJveGVkVHlwZS5uYW1lT2ZCb3hlZFR5cGUsIHVuYm94ZWRUeXBlKSA9PT4gamF2YS51dGlsLkhhc2hNYXAucHV0KEssIFYpCisgIExpbmUgOTMpIHNldFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLnNldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlKQorICBMaW5lIDk3KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZSwgQSkKKyAgTGluZSAxMDEpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLCBBKQorICBMaW5lIDEwOSkgdHlwZS50b0JveGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUudG9Cb3hlZFR5cGUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9SZWZlcmVuY2VUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUmVmZXJlbmNlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfUmVmZXJlbmNlVHlwZS50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3R5cGVfVHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1R5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZmZlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1R5cGUudHh0CkBAIC0wLDAgKzEsMyBAQAorICBMaW5lIDUzKSBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pCisgIExpbmUgNTcpIGVuc3VyZU5vdE51bGwoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbChqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA2Mikgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1R5cGVQYXJhbWV0ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9UeXBlUGFyYW1ldGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJkZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9UeXBlUGFyYW1ldGVyLnR4dApAQCAtMCwwICsxLDEyIEBACisgIExpbmUgNTkpIHNldE5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLnNldE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MCkgc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLnNldFR5cGVCb3VuZChqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+KQorICBMaW5lIDY1KSBzZXROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5zZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjYpIHNldFR5cGVCb3VuZCh0eXBlQm91bmQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5zZXRUeXBlQm91bmQoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlPikKKyAgTGluZSA3MSkgc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLnNldFR5cGVCb3VuZChqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU+KQorICBMaW5lIDcyKSBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pCisgIExpbmUgNzYpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLCBBKQorICBMaW5lIDgwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlciwgQSkKKyAgTGluZSAxMDApIGVuc3VyZU5vdE51bGwodHlwZUJvdW5kKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTI0KSBzZXRBc1BhcmVudE5vZGVPZih0eXBlQm91bmQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTI5KSBlbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGwoamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTM1KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9VbmlvblR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9VbmlvblR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTY2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1VuaW9uVHlwZS50eHQKQEAgLTAsMCArMSw2IEBACisgIExpbmUgMjApIHNldEVsZW1lbnRzKGVsZW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5zZXRFbGVtZW50cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZT4pCisgIExpbmUgMjUpIHNldEVsZW1lbnRzKGVsZW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5zZXRFbGVtZW50cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZT4pCisgIExpbmUgMzUpIGVsZW1lbnQuc2V0UGFyZW50Tm9kZShudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDM5KSBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVsZW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU+KQorICBMaW5lIDQ1KSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlLCBBKQorICBMaW5lIDUwKSB2LnZpc2l0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Vbmtub3duVHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1Vua25vd25UeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTJmNGRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Vbmtub3duVHlwZS50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Vbmtub3duVHlwZSwgQSkKKyAgTGluZSA0OSkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVua25vd25UeXBlLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Wb2lkVHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1ZvaWRUeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThmYzUzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9Wb2lkVHlwZS50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDQpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZSwgQSkKKyAgTGluZSA0OCkgdi52aXNpdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3IudmlzaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlZvaWRUeXBlLCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9XaWxkY2FyZFR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdHlwZV9XaWxkY2FyZFR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWUzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF90eXBlX1dpbGRjYXJkVHlwZS50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgNDIpIHNldEV4dGVuZHMoZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5zZXRFeHRlbmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlKQorICBMaW5lIDQ2KSBzZXRFeHRlbmRzKGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuc2V0RXh0ZW5kcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZSkKKyAgTGluZSA0Nykgc2V0U3VwZXIoc3VwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5zZXRTdXBlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUmVmZXJlbmNlVHlwZSkKKyAgTGluZSA1Mykgc2V0RXh0ZW5kcyhleHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLnNldEV4dGVuZHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUpCisgIExpbmUgNTQpIHNldFN1cGVyKHN1cCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuc2V0U3VwZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUpCisgIExpbmUgNTgpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUsIEEpCisgIExpbmUgNjIpIHYudmlzaXQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yLnZpc2l0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUsIEEpCisgIExpbmUgNzUpIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldEFzUGFyZW50Tm9kZU9mKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4MSkgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zdXApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0QXNQYXJlbnROb2RlT2YoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9DbG9uZVZpc2l0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9DbG9uZVZpc2l0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGY1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0Nsb25lVmlzaXRvci50eHQKQEAgLTAsMCArMSw2OTAgQEAKKyAgTGluZSAxMTQpIGNsb25lTm9kZXMoX24uZ2V0UGFja2FnZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE0KSBfbi5nZXRQYWNrYWdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKQorICBMaW5lIDExNSkgdmlzaXQoX24uZ2V0SW1wb3J0cygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTUpIF9uLmdldEltcG9ydHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0SW1wb3J0cygpCisgIExpbmUgMTE2KSB2aXNpdChfbi5nZXRUeXBlcygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTYpIF9uLmdldFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFR5cGVzKCkKKyAgTGluZSAxMTkpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTI2KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjYpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxMjcpIGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTI3KSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDEyOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjgpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEzMSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMzQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDE0MCkgY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNDApIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxNDEpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTQxKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxNDQpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTQ1KSBfbi5pc1N0YXRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkKKyAgTGluZSAxNDUpIF9uLmlzQXN0ZXJpc2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5pc0FzdGVyaXNrKCkKKyAgTGluZSAxNDcpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDE1MykgdmlzaXQoX24uZ2V0VHlwZUJvdW5kKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE1MykgX24uZ2V0VHlwZUJvdW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldFR5cGVCb3VuZCgpCisgIExpbmUgMTU1KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNTUpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxNTYpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTU3KSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDE1OSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNTkpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE2MCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTY2KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDE2NikgX24uZ2V0Q29udGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuZ2V0Q29udGVudCgpCisgIExpbmUgMTcxKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDE3MSkgX24uZ2V0Q29udGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuZ2V0Q29udGVudCgpCisgIExpbmUgMTc2KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNzYpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE3NykgdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTc3KSBfbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxNzgpIHZpc2l0KF9uLmdldEV4dGVuZHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTc4KSBfbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0RXh0ZW5kcygpCisgIExpbmUgMTc5KSB2aXNpdChfbi5nZXRJbXBsZW1lbnRzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE3OSkgX24uZ2V0SW1wbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudHMoKQorICBMaW5lIDE4MCkgdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxODApIF9uLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAxODEpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTgxKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxODQpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTg1KSBfbi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDE4NSkgX24uaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMTg1KSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTg3KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxOTMpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE5MykgX24uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTk0KSB2aXNpdChfbi5nZXRJbXBsZW1lbnRzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE5NCkgX24uZ2V0SW1wbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEltcGxlbWVudHMoKQorICBMaW5lIDE5NSkgdmlzaXQoX24uZ2V0RW50cmllcygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxOTUpIF9uLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRFbnRyaWVzKCkKKyAgTGluZSAxOTYpIHZpc2l0KF9uLmdldE1lbWJlcnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTk2KSBfbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMTk3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE5NykgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMjAwKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDIwMSkgX24uZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAyMDEpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMDMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDIwOSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMDkpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDIxMikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAyMTQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDIyMCkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjIwKSBfbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAyMjEpIHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjIxKSBfbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRBcmdzKCkKKyAgTGluZSAyMjIpIHZpc2l0KF9uLmdldENsYXNzQm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMjIpIF9uLmdldENsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0Q2xhc3NCb2R5KCkKKyAgTGluZSAyMjMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjIzKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyMjYpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMjI3KSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMjkpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDIzNSkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjM1KSBfbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAyMzYpIHZpc2l0KF9uLmdldE1lbWJlcnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjM2KSBfbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMjM3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDIzNykgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMjQwKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDI0MSkgX24uZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAyNDEpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNDMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDI0OSkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQ5KSBfbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAyNTApIGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjUwKSBfbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMjUxKSBjbG9uZU5vZGVzKF9uLmdldERlZmF1bHRWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjUxKSBfbi5nZXREZWZhdWx0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5nZXREZWZhdWx0VmFsdWUoKQorICBMaW5lIDI1MikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNTIpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI1NSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAyNTYpIF9uLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMjU2KSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMjU4KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAyNjQpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI2NCkgX24uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMjY1KSBjbG9uZU5vZGVzKF9uLmdldEVsZW1lbnRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNjUpIF9uLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSAyNjYpIHZpc2l0KF9uLmdldFZhcmlhYmxlcygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNjYpIF9uLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDI2NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNjcpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI2OCkgdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI2OCkgX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpCisgIExpbmUgMjcxKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDI3MikgX24uZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMjc5KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAyODUpIGNsb25lTm9kZXMoX24uZ2V0SWQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI4NSkgX24uZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJZCgpCisgIExpbmUgMjg2KSBjbG9uZU5vZGVzKF9uLmdldEluaXQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI4NikgX24uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDI4NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyODcpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI5MCkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAyOTMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDI5OSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyOTkpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDMwMCkgdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMwMCkgX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKQorICBMaW5lIDMwMykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAzMDQpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmdldE5hbWUoKQorICBMaW5lIDMwNykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMzEzKSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMTMpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDMxNCkgdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzE0KSBfbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMzE1KSB2aXNpdChfbi5nZXRQYXJhbWV0ZXJzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMxNSkgX24uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAzMTYpIHZpc2l0KF9uLmdldFRocm93cygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMTYpIF9uLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDMxNykgY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMTcpIF9uLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0Qm9keSgpCisgIExpbmUgMzE4KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMxOCkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzIxKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDMyMikgX24uZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMzIyKSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDMyNCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMzMwKSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMzApIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDMzMSkgdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzMxKSBfbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDMzMikgY2xvbmVOb2Rlcyhfbi5nZXRFbGVtZW50VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzMyKSBfbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDMzMykgY2xvbmVOb2Rlcyhfbi5nZXROYW1lRXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzMzKSBfbi5nZXROYW1lRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKQorICBMaW5lIDMzNCkgdmlzaXQoX24uZ2V0UGFyYW1ldGVycygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMzQpIF9uLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDMzNSkgdmlzaXQoX24uZ2V0VGhyb3dzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMzNSkgX24uZ2V0VGhyb3dzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDMzNikgY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMzYpIF9uLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDMzNykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMzcpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDMzOCkgdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMzOCkgX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDMzOSkgdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzM5KSBfbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKQorICBMaW5lIDM0MikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAzNDMpIF9uLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzNTQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDM2MCkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzYwKSBfbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAzNjEpIGNsb25lTm9kZXMoX24uZ2V0RWxlbWVudFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM2MSkgX24uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMzYyKSBjbG9uZU5vZGVzKF9uLmdldElkKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNjIpIF9uLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0SWQoKQorICBMaW5lIDM2MykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNjMpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM2NCkgdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM2NCkgX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSAzNjcpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMzY4KSBfbi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDM3MikgX24uaXNWYXJBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuaXNWYXJBcmdzKCkKKyAgTGluZSAzNzUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDM4MSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzODEpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM4NCkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAzODYpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDM5MikgY2xvbmVOb2Rlcyhfbi5nZXRCbG9jaygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzkyKSBfbi5nZXRCbG9jaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5nZXRCbG9jaygpCisgIExpbmUgMzkzKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM5MykgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzk2KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDM5NykgX24uaXNTdGF0aWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24uaXNTdGF0aWMoKQorICBMaW5lIDM5OSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNDA1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQwNSkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNDA3KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDQwOCkgX24uZ2V0Q29udGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuZ2V0Q29udGVudCgpCisgIExpbmUgNDEwKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA0MTYpIGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQxNikgX24uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSA0MTcpIHZpc2l0KF9uLmdldFR5cGVBcmd1bWVudHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDE3KSBfbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA0MTgpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDE4KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0MjEpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNDIzKSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkKKyAgTGluZSA0MjQpIF9uLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDQyNikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNDMyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQzMikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNDMzKSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MzMpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0MzYpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNDM3KSBfbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLmdldFR5cGUoKQorICBMaW5lIDQzOSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNDQwKSByLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuc2V0QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPikKKyAgTGluZSA0NDYpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ0NikgX24uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQ0NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21wb25lbnRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NDcpIF9uLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA0NDkpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNDUwKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ1MCkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNDUxKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA0NTcpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ1NykgX24uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQ1OCkgY2xvbmVOb2Rlcyhfbi5nZXREaW1lbnNpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ1OCkgX24uZ2V0RGltZW5zaW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsLmdldERpbWVuc2lvbigpCisgIExpbmUgNDYwKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDQ2MikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NjIpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQ2Mykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNDY5KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NjkpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0NzApIHZpc2l0KF9uLmdldEVsZW1lbnRzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ3MCkgX24uZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKQorICBMaW5lIDQ3MikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA0NzMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDczKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NzQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDQ3NSkgci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pCisgIExpbmUgNDgxKSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0ODEpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0ODIpIHZpc2l0KF9uLmdldEVsZW1lbnRzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ4MikgX24uZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5nZXRFbGVtZW50cygpCisgIExpbmUgNDg0KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDQ4NikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0ODYpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQ4Nykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNDg4KSByLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuc2V0QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPikKKyAgTGluZSA0OTQpIHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ5NCkgX24uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQ5NSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0OTUpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQ5NykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA0OTgpIHIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5zZXRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+KQorICBMaW5lIDQ5OSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNTA1KSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MDUpIF9uLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA1MDYpIGNsb25lTm9kZXMoX24uZ2V0RXh0ZW5kcygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTA2KSBfbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kcygpCisgIExpbmUgNTA3KSBjbG9uZU5vZGVzKF9uLmdldFN1cGVyKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MDcpIF9uLmdldFN1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0U3VwZXIoKQorICBMaW5lIDUwOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MDgpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDUxMSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA1MTQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDUxNSkgci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLnNldEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4pCisgIExpbmUgNTIxKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUyMSkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTI0KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA1MzApIGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTMwKSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgNTMxKSBjbG9uZU5vZGVzKF9uLmdldEluZGV4KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MzEpIF9uLmdldEluZGV4KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0SW5kZXgoKQorICBMaW5lIDUzMikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MzIpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDUzNSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA1MzgpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDU0NCkgY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1NDQpIF9uLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDU0NSkgdmlzaXQoX24uZ2V0TGV2ZWxzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU0NSkgX24uZ2V0TGV2ZWxzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRMZXZlbHMoKQorICBMaW5lIDU0NikgY2xvbmVOb2Rlcyhfbi5nZXRJbml0aWFsaXplcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTQ2KSBfbi5nZXRJbml0aWFsaXplcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuZ2V0SW5pdGlhbGl6ZXIoKQorICBMaW5lIDU0OCkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA1NTApIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTUwKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1NTEpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDU1NykgdmlzaXQoX24uZ2V0VmFsdWVzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU1NykgX24uZ2V0VmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwci5nZXRWYWx1ZXMoKQorICBMaW5lIDU1OCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1NTgpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU2MSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA1NjQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDU3MCkgY2xvbmVOb2Rlcyhfbi5nZXRUYXJnZXQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU3MCkgX24uZ2V0VGFyZ2V0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFRhcmdldCgpCisgIExpbmUgNTcxKSBjbG9uZU5vZGVzKF9uLmdldFZhbHVlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1NzEpIF9uLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFZhbHVlKCkKKyAgTGluZSA1NzIpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTcyKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1NzUpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNTc2KSBfbi5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgNTc3KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA1ODMpIGNsb25lTm9kZXMoX24uZ2V0TGVmdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTgzKSBfbi5nZXRMZWZ0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldExlZnQoKQorICBMaW5lIDU4NCkgY2xvbmVOb2Rlcyhfbi5nZXRSaWdodCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTg0KSBfbi5nZXRSaWdodCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRSaWdodCgpCisgIExpbmUgNTg1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU4NSkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTg4KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDU4OSkgX24uZ2V0T3BlcmF0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0T3BlcmF0b3IoKQorICBMaW5lIDU5MSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNTk3KSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU5NykgX24uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0VHlwZSgpCisgIExpbmUgNTk4KSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU5OCkgX24uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0RXhwcigpCisgIExpbmUgNTk5KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU5OSkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNjAyKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDYwNSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNjExKSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYxMSkgX24uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByLmdldFR5cGUoKQorICBMaW5lIDYxMikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MTIpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDYxNSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA2MTgpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDYyNCkgY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYyNCkgX24uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSA2MjUpIGNsb25lTm9kZXMoX24uZ2V0VGhlbkV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYyNSkgX24uZ2V0VGhlbkV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRUaGVuRXhwcigpCisgIExpbmUgNjI2KSBjbG9uZU5vZGVzKF9uLmdldEVsc2VFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MjYpIF9uLmdldEVsc2VFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0RWxzZUV4cHIoKQorICBMaW5lIDYyNykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MjcpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDYzMCkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA2MzMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDYzOSkgY2xvbmVOb2Rlcyhfbi5nZXRJbm5lcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNjM5KSBfbi5nZXRJbm5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLmdldElubmVyKCkKKyAgTGluZSA2NDApIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNjQwKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA2NDMpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNjQ2KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA2NTIpIGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY1MikgX24uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgNjUzKSB2aXNpdChfbi5nZXRUeXBlQXJndW1lbnRzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY1MykgX24uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDY1NCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2NTQpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDY1NykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA2NjApIF9uLmdldEZpZWxkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0RmllbGQoKQorICBMaW5lIDY2Mikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNjY4KSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY2OCkgX24uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuZ2V0RXhwcigpCisgIExpbmUgNjY5KSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY2OSkgX24uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgNjcwKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY3MCkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNjczKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDY3Nikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNjgyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY4MikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNjg0KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDY4NSkgX24uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA2ODcpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDY5MykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2OTMpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDY5NikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA2OTcpIF9uLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgNjk5KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA3MDUpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzA1KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3MDgpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNzA5KSBfbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDcxMSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNzE3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDcxNykgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzE5KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDcyMCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNzI2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDcyNikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzI4KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDcyOSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNzM1KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDczNSkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzM4KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDczOSkgX24uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA3NDEpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDc0NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3NDcpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDc1MCkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA3NTEpIF9uLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgNzUzKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA3NTkpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzU5KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3NjIpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNzYzKSBfbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA3NjUpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDc3MSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3NzEpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDc3MykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA3NzQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDc4MCkgY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzgwKSBfbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDc4MSkgdmlzaXQoX24uZ2V0VHlwZUFyZ3VtZW50cygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3ODEpIF9uLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDc4MikgdmlzaXQoX24uZ2V0QXJncygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3ODIpIF9uLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3MoKQorICBMaW5lIDc4MykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3ODMpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDc4NikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA3ODkpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWUoKQorICBMaW5lIDc5Mikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgNzk4KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc5OCkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgODAxKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDgwMikgX24uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgODA0KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA4MTApIGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgxMCkgX24uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRTY29wZSgpCisgIExpbmUgODExKSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgxMSkgX24uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDgxMikgdmlzaXQoX24uZ2V0VHlwZUFyZ3VtZW50cygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MTIpIF9uLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA4MTMpIHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODEzKSBfbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJncygpCisgIExpbmUgODE0KSB2aXNpdChfbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODE0KSBfbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKQorICBMaW5lIDgxNSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MTUpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDgxOCkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA4MjEpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDgyNykgY2xvbmVOb2Rlcyhfbi5nZXRRdWFsaWZpZXIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgyNykgX24uZ2V0UXVhbGlmaWVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5RdWFsaWZpZWROYW1lRXhwci5nZXRRdWFsaWZpZXIoKQorICBMaW5lIDgyOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MjgpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDgzMSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA4MzIpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDgzNCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgODQwKSBjbG9uZU5vZGVzKF9uLmdldENsYXNzRXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODQwKSBfbi5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgODQxKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg0MSkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgODQ0KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDg0Nykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgODUzKSBjbG9uZU5vZGVzKF9uLmdldENsYXNzRXhwcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODUzKSBfbi5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDg1NCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4NTQpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDg1NykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA4NjApIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDg2NikgY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4NjYpIF9uLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5nZXRFeHByKCkKKyAgTGluZSA4NjcpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODY3KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA4NzApIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgODcxKSBfbi5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSA4NzMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDg3OSkgdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODc5KSBfbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDg4MCkgY2xvbmVOb2Rlcyhfbi5nZXRFbGVtZW50VHlwZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODgwKSBfbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDg4MSkgdmlzaXQoX24uZ2V0VmFyaWFibGVzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg4MSkgX24uZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDg4MikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4ODIpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDg4MykgdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg4MykgX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDg4NikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA4ODcpIF9uLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA4OTMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDg5OSkgY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4OTkpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDkwMCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MDApIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDkwMykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA5MDYpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDkxMikgY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MTIpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDkxMykgY2xvbmVOb2Rlcyhfbi5nZXRNZW1iZXJWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTEzKSBfbi5nZXRNZW1iZXJWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuZ2V0TWVtYmVyVmFsdWUoKQorICBMaW5lIDkxNCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MTQpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDkxNykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA5MjApIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDkyNikgY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MjYpIF9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDkyNykgdmlzaXQoX24uZ2V0UGFpcnMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTI3KSBfbi5nZXRQYWlycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIuZ2V0UGFpcnMoKQorICBMaW5lIDkyOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MjgpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDkzMSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSA5MzQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDk0MCkgY2xvbmVOb2Rlcyhfbi5nZXRWYWx1ZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTQwKSBfbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkKKyAgTGluZSA5NDEpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTQxKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA5NDQpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgOTQ1KSBfbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpCisgIExpbmUgOTQ3KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA5NTMpIHZpc2l0KF9uLmdldFR5cGVBcmd1bWVudHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTUzKSBfbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgOTU0KSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk1NCkgX24uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEV4cHIoKQorICBMaW5lIDk1NSkgdmlzaXQoX24uZ2V0QXJncygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5NTUpIF9uLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmdzKCkKKyAgTGluZSA5NTYpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTU2KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA5NTkpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgOTYxKSBfbi5pc1RoaXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5pc1RoaXMoKQorICBMaW5lIDk2NSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgOTcxKSBjbG9uZU5vZGVzKF9uLmdldFR5cGVEZWNsYXJhdGlvbigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTcxKSBfbi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSA5NzIpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTcyKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA5NzUpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgOTc4KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSA5ODQpIGNsb25lTm9kZXMoX24uZ2V0Q2hlY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk4NCkgX24uZ2V0Q2hlY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0Q2hlY2soKQorICBMaW5lIDk4NSkgY2xvbmVOb2Rlcyhfbi5nZXRNZXNzYWdlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5ODUpIF9uLmdldE1lc3NhZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0TWVzc2FnZSgpCisgIExpbmUgOTg2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk4NikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgOTg5KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDk5Mikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgOTk4KSB2aXNpdChfbi5nZXRTdG10cygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5OTgpIF9uLmdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuZ2V0U3RtdHMoKQorICBMaW5lIDk5OSkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5OTkpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwMDIpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTAwNSkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTAxMSkgY2xvbmVOb2Rlcyhfbi5nZXRTdG10KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDExKSBfbi5nZXRTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5nZXRTdG10KCkKKyAgTGluZSAxMDEyKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwMTIpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwMTUpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTAxNikgX24uZ2V0TGFiZWwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10LmdldExhYmVsKCkKKyAgTGluZSAxMDE4KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMDI0KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwMjQpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwMjYpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTAyNykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTAzMykgY2xvbmVOb2Rlcyhfbi5nZXRFeHByZXNzaW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDMzKSBfbi5nZXRFeHByZXNzaW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCkKKyAgTGluZSAxMDM0KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwMzQpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwMzcpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTA0MCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTA0NikgY2xvbmVOb2Rlcyhfbi5nZXRTZWxlY3RvcigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA0NikgX24uZ2V0U2VsZWN0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0U2VsZWN0b3IoKQorICBMaW5lIDEwNDcpIHZpc2l0KF9uLmdldEVudHJpZXMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA0NykgX24uZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5nZXRFbnRyaWVzKCkKKyAgTGluZSAxMDQ4KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwNDgpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwNTEpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTA1NCkgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTA2MCkgY2xvbmVOb2Rlcyhfbi5nZXRMYWJlbCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA2MCkgX24uZ2V0TGFiZWwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRMYWJlbCgpCisgIExpbmUgMTA2MSkgdmlzaXQoX24uZ2V0U3RtdHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA2MSkgX24uZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRTdG10cygpCisgIExpbmUgMTA2MikgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDYyKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMDY1KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDEwNjgpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDEwNzQpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA3NCkgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTA3NykgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMDc4KSBfbi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10LmdldElkKCkKKyAgTGluZSAxMDgwKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMDg2KSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwODYpIF9uLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQuZ2V0RXhwcigpCisgIExpbmUgMTA4NykgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDg3KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMDkwKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDEwOTMpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDEwOTkpIGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDk5KSBfbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRDb25kaXRpb24oKQorICBMaW5lIDExMDApIGNsb25lTm9kZXMoX24uZ2V0VGhlblN0bXQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMDApIF9uLmdldFRoZW5TdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0VGhlblN0bXQoKQorICBMaW5lIDExMDEpIGNsb25lTm9kZXMoX24uZ2V0RWxzZVN0bXQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMDEpIF9uLmdldEVsc2VTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0RWxzZVN0bXQoKQorICBMaW5lIDExMDIpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTEwMikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTEwNSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMTA4KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMTE0KSBjbG9uZU5vZGVzKF9uLmdldENvbmRpdGlvbigpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTExNCkgX24uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAxMTE1KSBjbG9uZU5vZGVzKF9uLmdldEJvZHkoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMTUpIF9uLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMTE2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMTYpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDExMTkpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTEyMikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTEyOCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTI4KSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMTMxKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDExMzIpIF9uLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQuZ2V0SWQoKQorICBMaW5lIDExMzQpIHIuc2V0Q29tbWVudChjb21tZW50KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnNldENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50KQorICBMaW5lIDExNDApIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE0MCkgX24uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LmdldEJvZHkoKQorICBMaW5lIDExNDEpIGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTQxKSBfbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdC5nZXRDb25kaXRpb24oKQorICBMaW5lIDExNDIpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE0MikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTE0NSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMTQ4KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMTU0KSBjbG9uZU5vZGVzKF9uLmdldFZhcmlhYmxlKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTU0KSBfbi5nZXRWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuZ2V0VmFyaWFibGUoKQorICBMaW5lIDExNTUpIGNsb25lTm9kZXMoX24uZ2V0SXRlcmFibGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExNTUpIF9uLmdldEl0ZXJhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRJdGVyYWJsZSgpCisgIExpbmUgMTE1NikgY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTU2KSBfbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMTU3KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExNTcpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDExNjApIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTE2Mykgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTE2OSkgdmlzaXQoX24uZ2V0SW5pdCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTY5KSBfbi5nZXRJbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEluaXQoKQorICBMaW5lIDExNzApIGNsb25lTm9kZXMoX24uZ2V0Q29tcGFyZSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE3MCkgX24uZ2V0Q29tcGFyZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRDb21wYXJlKCkKKyAgTGluZSAxMTcxKSB2aXNpdChfbi5nZXRVcGRhdGUoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE3MSkgX24uZ2V0VXBkYXRlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldFVwZGF0ZSgpCisgIExpbmUgMTE3MikgY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTcyKSBfbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEJvZHkoKQorICBMaW5lIDExNzMpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE3MykgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTE3NikgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMTc5KSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMTg1KSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExODUpIF9uLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdC5nZXRFeHByKCkKKyAgTGluZSAxMTg2KSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExODYpIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDExODkpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTE5Mikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTE5OCkgY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTk4KSBfbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LmdldEV4cHIoKQorICBMaW5lIDExOTkpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE5OSkgX24uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMjAwKSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMDApIF9uLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEyMDMpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTIwNikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTIxMikgdmlzaXQoX24uZ2V0UmVzb3VyY2VzKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLnZpc2l0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMTIpIF9uLmdldFJlc291cmNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRSZXNvdXJjZXMoKQorICBMaW5lIDEyMTMpIGNsb25lTm9kZXMoX24uZ2V0VHJ5QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMTMpIF9uLmdldFRyeUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFRyeUJsb2NrKCkKKyAgTGluZSAxMjE0KSB2aXNpdChfbi5nZXRDYXRjaHMoKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IudmlzaXQoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTIxNCkgX24uZ2V0Q2F0Y2hzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldENhdGNocygpCisgIExpbmUgMTIxNSkgY2xvbmVOb2Rlcyhfbi5nZXRGaW5hbGx5QmxvY2soKSwgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMTUpIF9uLmdldEZpbmFsbHlCbG9jaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRGaW5hbGx5QmxvY2soKQorICBMaW5lIDEyMTYpIGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTIxNikgX24uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTIxOSkgX24uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMjIyKSByLnNldENvbW1lbnQoY29tbWVudCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMjI4KSBjbG9uZU5vZGVzKF9uLmdldFBhcmFtKCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjI4KSBfbi5nZXRQYXJhbSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UuZ2V0UGFyYW0oKQorICBMaW5lIDEyMjkpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTIyOSkgX24uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UuZ2V0Qm9keSgpCisgIExpbmUgMTIzMCkgY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjMwKSBfbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMjMzKSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDEyMzQpIHBhcmFtLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldE1vZGlmaWVycygpCisgIExpbmUgMTIzNCkgcGFyYW0uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTIzNCkgcGFyYW0uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTIzNCkgcGFyYW0uZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRJZCgpCisgIExpbmUgMTIzNikgci5zZXRDb21tZW50KGNvbW1lbnQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuc2V0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQpCisgIExpbmUgMTI0MykgdmlzaXQoX24uZ2V0UGFyYW1ldGVycygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjQzKSBfbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDEyNDUpIGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTI0NSkgX24uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSAxMjQ3KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDEyNDgpIF9uLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkKKyAgTGluZSAxMjU0KSBjbG9uZU5vZGVzKF9uLmdldFNjb3BlKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3IuY2xvbmVOb2RlcyhULCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyNTQpIF9uLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxMjU2KSBfbi5nZXRSYW5nZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UmFuZ2UoKQorICBMaW5lIDEyNTcpIF9uLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTI1NykgX24uZ2V0SWRlbnRpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRJZGVudGlmaWVyKCkKKyAgTGluZSAxMjYzKSBjbG9uZU5vZGVzKG4uZ2V0VHlwZSgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuQ2xvbmVWaXNpdG9yLmNsb25lTm9kZXMoVCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjYzKSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByLmdldFR5cGUoKQorICBMaW5lIDEyNjUpIG4uZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMjcwKSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci52aXNpdChqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjcwKSBfbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDEyNzIpIF9uLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgMTI3OCkgX25vZGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTI4MCkgY2xvbmVOb2RlcyhuLCBfYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkNsb25lVmlzaXRvci5jbG9uZU5vZGVzKFQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTI4Mikgci5hZGQock4pID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxMjkxKSBfbm9kZS5hY2NlcHQodGhpcywgX2FyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9EdW1wVmlzaXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0R1bXBWaXNpdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTAxNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9EdW1wVmlzaXRvci50eHQKQEAgLTAsMCArMSwxMDY2IEBACisgIExpbmUgODYpIGJ1Zi5hcHBlbmQoaW5kZW50YXRpb24pID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5MikgbWFrZUluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5tYWtlSW5kZW50KCkKKyAgTGluZSA5NSkgYnVmLmFwcGVuZChhcmcpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5OSkgcHJpbnQoYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDApIHByaW50TG4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbigpCisgIExpbmUgMTA0KSBidWYuYXBwZW5kKEVPTCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwOSkgYnVmLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkKKyAgTGluZSAxMTQpIGdldFNvdXJjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5nZXRTb3VyY2UoKQorICBMaW5lIDExOCkgY3JlYXRlU291cmNlUHJpbnRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuY3JlYXRlU291cmNlUHJpbnRlcigpCisgIExpbmUgMTI1KSBwcmludGVyLmdldFNvdXJjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5nZXRTb3VyY2UoKQorICBMaW5lIDEyOSkgbW9kaWZpZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5zaXplKCkKKyAgTGluZSAxMzApIHByaW50ZXIucHJpbnQobW9kaWZpZXJzLnN0cmVhbSgpLm1hcChNb2RpZmllcjo6Z2V0TGliKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiICIpKSArICIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTMwKSBtb2RpZmllcnMuc3RyZWFtKCkubWFwKE1vZGlmaWVyOjpnZXRMaWIpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIgIikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTMwKSBtb2RpZmllcnMuc3RyZWFtKCkubWFwKE1vZGlmaWVyOjpnZXRMaWIpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDEzMCkgbW9kaWZpZXJzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEzMCkgQ29sbGVjdG9ycy5qb2luaW5nKCIgIikgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5qb2luaW5nKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpCisgIExpbmUgMTM1KSBwcmludGVyLnByaW50TG4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbigpCisgIExpbmUgMTM2KSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEzNykgcHJpbnRlci5wcmludExuKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oKQorICBMaW5lIDE0MikgaXNOdWxsT3JFbXB0eShhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDE0NCkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQ1KSBwcmludGVyLnByaW50TG4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbigpCisgIExpbmUgMTUxKSBpc051bGxPckVtcHR5KGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmlzTnVsbE9yRW1wdHkoamF2YS51dGlsLkNvbGxlY3Rpb248RT4pCisgIExpbmUgMTUzKSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTU2KSBhbm5vdGF0aW9uLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxNTcpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNjMpIG5vZGVXaXRoVHlwZUFyZ3VtZW50cy5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50cy5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxNjQpIGlzTnVsbE9yRW1wdHkodHlwZUFyZ3VtZW50cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDE2NSkgcHJpbnRlci5wcmludCgiPCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE2NikgdHlwZUFyZ3VtZW50cy5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgMTY2KSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDE2NykgaS5uZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5uZXh0KCkKKyAgTGluZSAxNjgpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE2OSkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxNzApIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTczKSBwcmludGVyLnByaW50KCI+IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTc4KSBpc051bGxPckVtcHR5KGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuaXNOdWxsT3JFbXB0eShqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPikKKyAgTGluZSAxNzkpIHByaW50ZXIucHJpbnQoIjwiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxODApIGFyZ3MuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDE4MCkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxODEpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMTgyKSB0LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE4MykgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxODQpIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTg3KSBwcmludGVyLnByaW50KCI+IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTkyKSBwcmludGVyLnByaW50KCIoIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTkzKSBpc051bGxPckVtcHR5KGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuaXNOdWxsT3JFbXB0eShqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPikKKyAgTGluZSAxOTQpIGFyZ3MuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDE5NCkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxOTUpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMTk2KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxOTcpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTk4KSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIwMikgcHJpbnRlci5wcmludCgiKSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIwNykgamF2YWNvbW1lbnQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIxMykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDIxMykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyMTUpIG4uZ2V0UGFja2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCkKKyAgTGluZSAyMTYpIG4uZ2V0UGFja2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIxNikgbi5nZXRQYWNrYWdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKQorICBMaW5lIDIxOSkgaXNOdWxsT3JFbXB0eShuLmdldEltcG9ydHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDIxOSkgbi5nZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDIyMCkgbi5nZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDIyMSkgaS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIyMykgcHJpbnRlci5wcmludExuKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oKQorICBMaW5lIDIyNikgaXNOdWxsT3JFbXB0eShuLmdldFR5cGVzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuaXNOdWxsT3JFbXB0eShqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPikKKyAgTGluZSAyMjYpIG4uZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDIyNykgbi5nZXRUeXBlcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5MaXN0Lml0ZXJhdG9yKCkKKyAgTGluZSAyMjcpIG4uZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDIyNykgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAyMjgpIGkubmV4dCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyMjgpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMjI5KSBwcmludGVyLnByaW50TG4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbigpCisgIExpbmUgMjMwKSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDIzMSkgcHJpbnRlci5wcmludExuKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oKQorICBMaW5lIDIzNikgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI0MSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI0MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyNDIpIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgYm9vbGVhbiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNDIpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDI0MykgcHJpbnRlci5wcmludCgicGFja2FnZSAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNDQpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyNDQpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNDUpIHByaW50ZXIucHJpbnRMbigiOyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjQ2KSBwcmludGVyLnByaW50TG4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbigpCisgIExpbmUgMjQ4KSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMjUzKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjUzKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI1NCkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjU0KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDI1NikgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI2MSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI2MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyNjIpIG4uZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDI2Mikgbi5nZXRRdWFsaWZpZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByLmdldFF1YWxpZmllcigpCisgIExpbmUgMjYzKSBwcmludGVyLnByaW50KCIuIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjY0KSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNjQpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMjY2KSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMjcxKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjcxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI3Mikgbi5pc0VtcHR5SW1wb3J0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5pc0VtcHR5SW1wb3J0RGVjbGFyYXRpb24oKQorICBMaW5lIDI3MykgcHJpbnRlci5wcmludCgiaW1wb3J0ICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI3NCkgbi5pc1N0YXRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkKKyAgTGluZSAyNzUpIHByaW50ZXIucHJpbnQoInN0YXRpYyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNzcpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyNzcpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDI3OCkgbi5pc0FzdGVyaXNrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uaXNBc3RlcmlzaygpCisgIExpbmUgMjc5KSBwcmludGVyLnByaW50KCIuKiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI4MikgcHJpbnRlci5wcmludExuKCI7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyODQpIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyODkpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyODkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMjkwKSBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TWVtYmVyQW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyOTApIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMjkxKSBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDI5MSkgbi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDI5Mykgbi5pc0ludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkKKyAgTGluZSAyOTQpIHByaW50ZXIucHJpbnQoImludGVyZmFjZSAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyOTYpIHByaW50ZXIucHJpbnQoImNsYXNzICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI5OSkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjk5KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAzMDEpIHByaW50VHlwZVBhcmFtZXRlcnMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzAxKSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDMwMykgaXNOdWxsT3JFbXB0eShuLmdldEV4dGVuZHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDMwMykgbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0RXh0ZW5kcygpCisgIExpbmUgMzA0KSBwcmludGVyLnByaW50KCIgZXh0ZW5kcyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMDUpIG4uZ2V0RXh0ZW5kcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5MaXN0Lml0ZXJhdG9yKCkKKyAgTGluZSAzMDUpIG4uZ2V0RXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZHMoKQorICBMaW5lIDMwNSkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAzMDYpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMzA3KSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzMDgpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMzA5KSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMxNCkgaXNOdWxsT3JFbXB0eShuLmdldEltcGxlbWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDMxNCkgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgMzE1KSBwcmludGVyLnByaW50KCIgaW1wbGVtZW50cyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMTYpIG4uZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5MaXN0Lml0ZXJhdG9yKCkKKyAgTGluZSAzMTYpIG4uZ2V0SW1wbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudHMoKQorICBMaW5lIDMxNikgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAzMTcpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMzE4KSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzMTkpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMzIwKSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyNSkgcHJpbnRlci5wcmludExuKCIgeyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzI2KSBwcmludGVyLmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5pbmRlbnQoKQorICBMaW5lIDMyNykgaXNOdWxsT3JFbXB0eShuLmdldE1lbWJlcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDMyNykgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzI4KSBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE1lbWJlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjw/Pj4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzI4KSBuLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAzMzEpIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzMzMpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIudW5pbmRlbnQoKQorICBMaW5lIDMzNCkgcHJpbnRlci5wcmludCgifSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMzOSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMzOSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAzNDApIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzNDIpIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzNDcpIHByaW50ZXIucHJpbnQoIi8qKiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM0OCkgcHJpbnRlci5wcmludChuLmdldENvbnRlbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzQ4KSBuLmdldENvbnRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LmdldENvbnRlbnQoKQorICBMaW5lIDM0OSkgcHJpbnRlci5wcmludExuKCIqLyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzU0KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzU0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM1Nikgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKQorICBMaW5lIDM1Nykgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzNTcpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAzNTgpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzNjApIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDM2MSkgYWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDM2MikgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM2NSkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzY1KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDM2Nykgbi5pc1VzaW5nRGlhbW9uZE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50cy5pc1VzaW5nRGlhbW9uZE9wZXJhdG9yKCkKKyAgTGluZSAzNjgpIHByaW50ZXIucHJpbnQoIjw+IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzcwKSBwcmludFR5cGVBcmdzKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludFR5cGVBcmdzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czw/PiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNzYpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNzYpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzc3KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAzNzgpIGFubi5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzc5KSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzgxKSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzODEpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSAzODIpIGlzTnVsbE9yRW1wdHkobi5nZXRUeXBlQm91bmQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDM4Mikgbi5nZXRUeXBlQm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0VHlwZUJvdW5kKCkKKyAgTGluZSAzODMpIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM4NCkgbi5nZXRUeXBlQm91bmQoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgMzg0KSBuLmdldFR5cGVCb3VuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXRUeXBlQm91bmQoKQorICBMaW5lIDM4NCkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAzODUpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMzg2KSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzODcpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMzg4KSBwcmludGVyLnByaW50KCIgJiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzOTYpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzOTYpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzk3KSBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgdHJ1ZSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgYm9vbGVhbiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzOTcpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDM5OCkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLmdldFR5cGUoKQorICBMaW5lIDQwMCkgcHJpbnRlci5wcmludCgiYm9vbGVhbiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQwMykgcHJpbnRlci5wcmludCgiYnl0ZSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQwNikgcHJpbnRlci5wcmludCgiY2hhciIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQwOSkgcHJpbnRlci5wcmludCgiZG91YmxlIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDEyKSBwcmludGVyLnByaW50KCJmbG9hdCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQxNSkgcHJpbnRlci5wcmludCgiaW50IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDE4KSBwcmludGVyLnByaW50KCJsb25nIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDIxKSBwcmludGVyLnByaW50KCJzaG9ydCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQzMikgYXJyYXlUeXBlQnVmZmVyLmFkZChhcnJheVR5cGUpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA0MzMpIGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgNDM2KSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0MzgpIHByaW50QW5ub3RhdGlvbnMoYXJyYXlUeXBlLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4sIGJvb2xlYW4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDM4KSBhcnJheVR5cGUuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQzOSkgcHJpbnRlci5wcmludCgiW10iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0NDUpIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBib29sZWFuLCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ0NSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNDQ2KSBwcmludGVyLnByaW50KCJbIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDQ3KSBuLmdldERpbWVuc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5nZXREaW1lbnNpb24oKQorICBMaW5lIDQ0OCkgbi5nZXREaW1lbnNpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDQ4KSBuLmdldERpbWVuc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5nZXREaW1lbnNpb24oKQorICBMaW5lIDQ1MCkgcHJpbnRlci5wcmludCgiXSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQ1NSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ1NSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NTYpIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgYm9vbGVhbiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NTYpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQ1OCkgbi5nZXRFbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuSW50ZXJzZWN0aW9uVHlwZS5nZXRFbGVtZW50cygpCisgIExpbmUgNDU5KSBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0NjMpIHByaW50ZXIucHJpbnQoIiAmICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQ2OSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ2OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NzApIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBib29sZWFuLCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ3MCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNDcyKSBuLmdldEVsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5VbmlvblR5cGUuZ2V0RWxlbWVudHMoKQorICBMaW5lIDQ3NikgcHJpbnRlci5wcmludCgiIHwgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDc4KSBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0ODUpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0ODUpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNDg2KSBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4sIGJvb2xlYW4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDg2KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0ODcpIHByaW50ZXIucHJpbnQoIj8iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0ODgpIG4uZ2V0RXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLmdldEV4dGVuZHMoKQorICBMaW5lIDQ4OSkgcHJpbnRlci5wcmludCgiIGV4dGVuZHMgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDkwKSBuLmdldEV4dGVuZHMoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDkwKSBuLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRFeHRlbmRzKCkKKyAgTGluZSA0OTIpIG4uZ2V0U3VwZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRTdXBlcigpCisgIExpbmUgNDkzKSBwcmludGVyLnByaW50KCIgc3VwZXIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDk0KSBuLmdldFN1cGVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQ5NCkgbi5nZXRTdXBlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLmdldFN1cGVyKCkKKyAgTGluZSA1MDUpIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDUwNykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUwNykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1MDgpIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUwOCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA1MDkpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNTA5KSBuLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDUxMCkgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA1MTApIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDUxMSkgbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSA1MTIpIHBhaXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDUxNSkgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUxNikgbi5nZXRWYXJpYWJsZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgNTE2KSBuLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDUxNikgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSA1MTcpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgNTE4KSB2YXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA1MTkpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgNTIwKSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUyNCkgcHJpbnRlci5wcmludCgiOyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUyOSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUyOSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1MzApIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTMwKSBuLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0SWQoKQorICBMaW5lIDUzMSkgbi5nZXRJbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0SW5pdCgpCisgIExpbmUgNTMyKSBwcmludGVyLnByaW50KCIgPSAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1MzMpIG4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA1MzMpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDUzOSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUzOSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1NDApIHByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU0MCkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXROYW1lKCkKKyAgTGluZSA1NDEpIG4uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKQorICBMaW5lIDU0MikgcGFpci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTQ4KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTQ4KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU0OSkgcHJpbnRlci5wcmludCgieyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU1MCkgaXNOdWxsT3JFbXB0eShuLmdldFZhbHVlcygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmlzTnVsbE9yRW1wdHkoamF2YS51dGlsLkNvbGxlY3Rpb248RT4pCisgIExpbmUgNTUwKSBuLmdldFZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuZ2V0VmFsdWVzKCkKKyAgTGluZSA1NTEpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1NTIpIG4uZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDU1Mikgbi5nZXRWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLmdldFZhbHVlcygpCisgIExpbmUgNTUyKSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDU1MykgaS5uZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5uZXh0KCkKKyAgTGluZSA1NTQpIGV4cHIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU1NSkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSA1NTYpIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTU5KSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTYxKSBwcmludGVyLnByaW50KCJ9IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTY2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTY2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU2NykgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBib29sZWFuLCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU2Nykgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNTY4KSBwcmludGVyLnByaW50KCJ2b2lkIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTczKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTczKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU3NCkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU3NCkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgNTc1KSBwcmludGVyLnByaW50KCJbIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTc2KSBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU3Nikgbi5nZXRJbmRleCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLmdldEluZGV4KCkKKyAgTGluZSA1NzcpIHByaW50ZXIucHJpbnQoIl0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1ODIpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1ODIpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTgzKSBwcmludGVyLnByaW50KCJuZXcgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTg0KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTg0KSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDU4NSkgbi5nZXRMZXZlbHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldExldmVscygpCisgIExpbmUgNTg2KSBsZXZlbC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA1ODgpIG4uZ2V0SW5pdGlhbGl6ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldEluaXRpYWxpemVyKCkKKyAgTGluZSA1ODkpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1OTApIG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTkwKSBuLmdldEluaXRpYWxpemVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRJbml0aWFsaXplcigpCisgIExpbmUgNTk2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTk2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU5Nykgbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTk3KSBuLmdldFRhcmdldCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRUYXJnZXQoKQorICBMaW5lIDU5OCkgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU5OSkgbi5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgNjAxKSBwcmludGVyLnByaW50KCI9IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjA0KSBwcmludGVyLnByaW50KCImPSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYwNykgcHJpbnRlci5wcmludCgifD0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MTApIHByaW50ZXIucHJpbnQoIl49IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjEzKSBwcmludGVyLnByaW50KCIrPSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYxNikgcHJpbnRlci5wcmludCgiLT0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MTkpIHByaW50ZXIucHJpbnQoIiU9IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjIyKSBwcmludGVyLnByaW50KCIvPSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYyNSkgcHJpbnRlci5wcmludCgiKj0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MjgpIHByaW50ZXIucHJpbnQoIjw8PSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYzMSkgcHJpbnRlci5wcmludCgiPj49IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjM0KSBwcmludGVyLnByaW50KCI+Pj49IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjM3KSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjM4KSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDYzOCkgbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgNjQzKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNjQzKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDY0NCkgbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDY0NCkgbi5nZXRMZWZ0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldExlZnQoKQorICBMaW5lIDY0NSkgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY0Nikgbi5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgNjQ4KSBwcmludGVyLnByaW50KCJ8fCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY1MSkgcHJpbnRlci5wcmludCgiJiYiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NTQpIHByaW50ZXIucHJpbnQoInwiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NTcpIHByaW50ZXIucHJpbnQoIiYiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NjApIHByaW50ZXIucHJpbnQoIl4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NjMpIHByaW50ZXIucHJpbnQoIj09IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjY2KSBwcmludGVyLnByaW50KCIhPSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY2OSkgcHJpbnRlci5wcmludCgiPCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY3MikgcHJpbnRlci5wcmludCgiPiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY3NSkgcHJpbnRlci5wcmludCgiPD0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NzgpIHByaW50ZXIucHJpbnQoIj49IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjgxKSBwcmludGVyLnByaW50KCI8PCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY4NCkgcHJpbnRlci5wcmludCgiPj4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2ODcpIHByaW50ZXIucHJpbnQoIj4+PiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5MCkgcHJpbnRlci5wcmludCgiKyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5MykgcHJpbnRlci5wcmludCgiLSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5NikgcHJpbnRlci5wcmludCgiKiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5OSkgcHJpbnRlci5wcmludCgiLyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcwMikgcHJpbnRlci5wcmludCgiJSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcwNSkgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcwNikgbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3MDYpIG4uZ2V0UmlnaHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0UmlnaHQoKQorICBMaW5lIDcxMSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDcxMSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3MTIpIHByaW50ZXIucHJpbnQoIigiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3MTMpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3MTMpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0VHlwZSgpCisgIExpbmUgNzE0KSBwcmludGVyLnByaW50KCIpICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcxNSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDcxNSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwci5nZXRFeHByKCkKKyAgTGluZSA3MjApIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3MjApIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzIxKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNzIxKSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwci5nZXRUeXBlKCkKKyAgTGluZSA3MjIpIHByaW50ZXIucHJpbnQoIi5jbGFzcyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcyNykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDcyNykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3MjgpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDcyOCkgbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRDb25kaXRpb24oKQorICBMaW5lIDcyOSkgcHJpbnRlci5wcmludCgiID8gIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzMwKSBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDczMCkgbi5nZXRUaGVuRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldFRoZW5FeHByKCkKKyAgTGluZSA3MzEpIHByaW50ZXIucHJpbnQoIiA6ICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDczMikgbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3MzIpIG4uZ2V0RWxzZUV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRFbHNlRXhwcigpCisgIExpbmUgNzM3KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzM3KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDczOCkgcHJpbnRlci5wcmludCgiKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDczOSkgbi5nZXRJbm5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLmdldElubmVyKCkKKyAgTGluZSA3NDApIG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNzQwKSBuLmdldElubmVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FbmNsb3NlZEV4cHIuZ2V0SW5uZXIoKQorICBMaW5lIDc0MikgcHJpbnRlci5wcmludCgiKSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc0NykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc0Nykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3NDgpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNzQ4KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDc0OSkgcHJpbnRlci5wcmludCgiLiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc1MCkgcHJpbnRlci5wcmludChuLmdldEZpZWxkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc1MCkgbi5nZXRGaWVsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldEZpZWxkKCkKKyAgTGluZSA3NTUpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3NTUpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzU2KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNzU2KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLmdldEV4cHIoKQorICBMaW5lIDc1NykgcHJpbnRlci5wcmludCgiIGluc3RhbmNlb2YgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzU4KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNzU4KSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLmdldFR5cGUoKQorICBMaW5lIDc2MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc2Mykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3NjQpIHByaW50ZXIucHJpbnQoIiciKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3NjUpIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3NjUpIG4uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA3NjYpIHByaW50ZXIucHJpbnQoIiciKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3NzEpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3NzEpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzcyKSBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzcyKSBuLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgNzc3KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzc3KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDc3OCkgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc3OCkgbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDc4MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc4Mykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3ODQpIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3ODQpIG4uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA3ODkpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3ODkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzkwKSBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzkwKSBuLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgNzk1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzk1KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDc5NikgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc5Nikgbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDgwMSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgwMSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA4MDIpIHByaW50ZXIucHJpbnQoIlwiIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODAzKSBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODAzKSBuLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgODA0KSBwcmludGVyLnByaW50KCJcIiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDgwOSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgwOSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA4MTApIHByaW50ZXIucHJpbnQoU3RyaW5nLnZhbHVlT2Yobi5nZXRWYWx1ZSgpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODEwKSBTdHJpbmcudmFsdWVPZihuLmdldFZhbHVlKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoYm9vbGVhbikKKyAgTGluZSA4MTApIG4uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgODE1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODE1KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDgxNikgcHJpbnRlci5wcmludCgibnVsbCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDgyMSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgyMSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA4MjIpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDgyMykgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgODIzKSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSA4MjQpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4MjYpIHByaW50ZXIucHJpbnQoInRoaXMiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4MzEpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MzEpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgODMyKSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgODMzKSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA4MzMpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdXBlckV4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSA4MzQpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4MzYpIHByaW50ZXIucHJpbnQoInN1cGVyIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODQxKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODQxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDg0Mikgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDg0Mykgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA4NDMpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSA4NDQpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4NDYpIHByaW50VHlwZUFyZ3MobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50VHlwZUFyZ3MoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzPD8+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg0NykgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODQ3KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWUoKQorICBMaW5lIDg0OCkgcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEFyZ3VtZW50cyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODQ4KSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3MoKQorICBMaW5lIDg1MykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg1Mykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA4NTQpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRTY29wZSgpCisgIExpbmUgODU1KSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDg1NSkgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFNjb3BlKCkKKyAgTGluZSA4NTYpIHByaW50ZXIucHJpbnQoIi4iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4NTkpIHByaW50ZXIucHJpbnQoIm5ldyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4NjEpIHByaW50VHlwZUFyZ3MobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50VHlwZUFyZ3MoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzPD8+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg2MikgaXNOdWxsT3JFbXB0eShuLmdldFR5cGVBcmd1bWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDg2Mikgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgODYzKSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODY2KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgODY2KSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlKCkKKyAgTGluZSA4NjgpIHByaW50QXJndW1lbnRzKG4uZ2V0QXJncygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg2OCkgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJncygpCisgIExpbmUgODcwKSBuLmdldEFub255bW91c0NsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFub255bW91c0NsYXNzQm9keSgpCisgIExpbmUgODcxKSBwcmludGVyLnByaW50TG4oIiB7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA4NzIpIHByaW50ZXIuaW5kZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLmluZGVudCgpCisgIExpbmUgODczKSBwcmludE1lbWJlcnMobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TWVtYmVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uPD8+PiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4NzMpIG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkKKyAgTGluZSA4NzQpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIudW5pbmRlbnQoKQorICBMaW5lIDg3NSkgcHJpbnRlci5wcmludCgifSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDg4MSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg4MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA4ODIpIG4uZ2V0T3BlcmF0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgODg0KSBwcmludGVyLnByaW50KCIrIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODg3KSBwcmludGVyLnByaW50KCItIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODkwKSBwcmludGVyLnByaW50KCJ+IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODkzKSBwcmludGVyLnByaW50KCIhIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODk2KSBwcmludGVyLnByaW50KCIrKyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDg5OSkgcHJpbnRlci5wcmludCgiLS0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5MDQpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA5MDQpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldEV4cHIoKQorICBMaW5lIDkwNikgbi5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSA5MDgpIHByaW50ZXIucHJpbnQoIisrIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTExKSBwcmludGVyLnByaW50KCItLSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDkxOSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDkxOSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA5MjApIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDkyMCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA5MjEpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgOTIxKSBuLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDkyMykgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludFR5cGVQYXJhbWV0ZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MjMpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDkyNCkgbi5nZXRUeXBlUGFyYW1ldGVycygpLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgOTI0KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA5MjUpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5MjcpIHByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDkyNykgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDkyOSkgcHJpbnRlci5wcmludCgiKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDkzMCkgbi5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA5MzApIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA5MzEpIG4uZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5MaXN0Lml0ZXJhdG9yKCkKKyAgTGluZSA5MzEpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA5MzEpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgOTMyKSBpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDkzMykgcC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDkzNCkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSA5MzUpIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTM5KSBwcmludGVyLnByaW50KCIpIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTQxKSBpc051bGxPckVtcHR5KG4uZ2V0VGhyb3dzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuaXNOdWxsT3JFbXB0eShqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPikKKyAgTGluZSA5NDEpIG4uZ2V0VGhyb3dzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFRocm93cygpCisgIExpbmUgOTQyKSBwcmludGVyLnByaW50KCIgdGhyb3dzICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDk0Mykgbi5nZXRUaHJvd3MoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgOTQzKSBuLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDk0MykgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSA5NDQpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgOTQ1KSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA5NDYpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgOTQ3KSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDk1MSkgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDk1Mikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA5NTIpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRCb2R5KCkKKyAgTGluZSA5NTcpIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDk1OSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk1OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA5NjApIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk2MCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA5NjEpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgOTYxKSBuLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA5NjIpIG4uaXNEZWZhdWx0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5pc0RlZmF1bHQoKQorICBMaW5lIDk2MykgcHJpbnRlci5wcmludCgiZGVmYXVsdCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5NjUpIHByaW50VHlwZVBhcmFtZXRlcnMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRUeXBlUGFyYW1ldGVycyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcj4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTY1KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgOTY2KSBpc051bGxPckVtcHR5KG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDk2Nikgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDk2NykgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDk3MCkgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA5NzApIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSA5NzEpIG4uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDk3MikgcGFpci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgOTc0KSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTc1KSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5NzUpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgOTc3KSBwcmludGVyLnByaW50KCIoIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTc4KSBpc051bGxPckVtcHR5KG4uZ2V0UGFyYW1ldGVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmlzTnVsbE9yRW1wdHkoamF2YS51dGlsLkNvbGxlY3Rpb248RT4pCisgIExpbmUgOTc4KSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDk3OSkgbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDk3OSkgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA5NzkpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgOTgwKSBpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDk4MSkgcC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDk4MikgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSA5ODMpIHByaW50ZXIucHJpbnQoIiwgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTg3KSBwcmludGVyLnByaW50KCIpIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTg5KSBuLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCgpCisgIExpbmUgOTkwKSBwYWlyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA5OTMpIGlzTnVsbE9yRW1wdHkobi5nZXRUaHJvd3MoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5pc051bGxPckVtcHR5KGphdmEudXRpbC5Db2xsZWN0aW9uPEU+KQorICBMaW5lIDk5Mykgbi5nZXRUaHJvd3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93cygpCisgIExpbmUgOTk0KSBwcmludGVyLnByaW50KCIgdGhyb3dzICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDk5NSkgbi5nZXRUaHJvd3MoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgOTk1KSBuLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA5OTUpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgOTk2KSBpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDk5NykgbmFtZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgOTk4KSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDk5OSkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDAzKSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDEwMDQpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDA2KSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTAwNykgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMDA3KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDEwMTMpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDEzKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwMTQpIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50QW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgYm9vbGVhbiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDE0KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDEwMTUpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMTAxNSkgbi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDEwMTYpIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTAxNykgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMDE3KSBuLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDEwMTkpIG4uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSAxMDIwKSBwYWlyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMDIyKSBuLmlzVmFyQXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmlzVmFyQXJncygpCisgIExpbmUgMTAyMykgcHJpbnRlci5wcmludCgiLi4uIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTAyNSkgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwMjYpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTAyNikgbi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldElkKCkKKyAgTGluZSAxMDMxKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTAzMSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMDMyKSBuLmlzVGhpcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmlzVGhpcygpCisgIExpbmUgMTAzMykgcHJpbnRUeXBlQXJncyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRUeXBlQXJncyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVBcmd1bWVudHM8Pz4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTAzNCkgcHJpbnRlci5wcmludCgidGhpcyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwMzYpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEV4cHIoKQorICBMaW5lIDEwMzcpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMDM3KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRFeHByKCkKKyAgTGluZSAxMDM4KSBwcmludGVyLnByaW50KCIuIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTA0MCkgcHJpbnRUeXBlQXJncyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRUeXBlQXJncyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVBcmd1bWVudHM8Pz4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA0MSkgcHJpbnRlci5wcmludCgic3VwZXIiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDQzKSBwcmludEFyZ3VtZW50cyhuLmdldEFyZ3MoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50QXJndW1lbnRzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDQzKSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmdzKCkKKyAgTGluZSAxMDQ0KSBwcmludGVyLnByaW50KCI7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTA0OSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwNDkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTA1MCkgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBib29sZWFuLCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwNTApIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxMDUxKSBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TW9kaWZpZXJzKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDEwNTEpIG4uZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDEwNTMpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTA1Mykgbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDEwNTQpIG4uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDEwNTUpIHBhaXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEwNTcpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDU5KSBuLmdldFZhcmlhYmxlcygpLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5MaXN0Lml0ZXJhdG9yKCkKKyAgTGluZSAxMDU5KSBuLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAxMDU5KSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDEwNjApIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMTA2MSkgdi5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEwNjIpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTA2MykgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDcwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA3MCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMDcxKSBuLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMDcxKSBuLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdC5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDEwNzYpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDc2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEwNzcpIHByaW50ZXIucHJpbnQoImFzc2VydCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDc4KSBuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEwNzgpIG4uZ2V0Q2hlY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0Q2hlY2soKQorICBMaW5lIDEwNzkpIG4uZ2V0TWVzc2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRNZXNzYWdlKCkKKyAgTGluZSAxMDgwKSBwcmludGVyLnByaW50KCIgOiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDgxKSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTA4MSkgbi5nZXRNZXNzYWdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10LmdldE1lc3NhZ2UoKQorICBMaW5lIDEwODMpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDg4KSBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMDg5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA4OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMDkwKSBwcmludGVyLnByaW50TG4oInsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwOTEpIG4uZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5nZXRTdG10cygpCisgIExpbmUgMTA5MikgcHJpbnRlci5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIuaW5kZW50KCkKKyAgTGluZSAxMDkzKSBuLmdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuZ2V0U3RtdHMoKQorICBMaW5lIDEwOTQpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEwOTUpIHByaW50ZXIucHJpbnRMbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKCkKKyAgTGluZSAxMDk3KSBwcmludGVyLnVuaW5kZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnVuaW5kZW50KCkKKyAgTGluZSAxMDk5KSBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTEwMCkgcHJpbnRlci5wcmludCgifSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExMDYpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTA2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDExMDcpIHByaW50ZXIucHJpbnQobi5nZXRMYWJlbCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTA3KSBuLmdldExhYmVsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5nZXRMYWJlbCgpCisgIExpbmUgMTEwOCkgcHJpbnRlci5wcmludCgiOiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTA5KSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTEwOSkgbi5nZXRTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5nZXRTdG10KCkKKyAgTGluZSAxMTE0KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTExNCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMTE1KSBwcmludGVyLnByaW50KCI7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTEyMCkgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTEyMSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMjEpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTEyMikgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDExMjIpIG4uZ2V0RXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQuZ2V0RXhwcmVzc2lvbigpCisgIExpbmUgMTEyMykgcHJpbnRlci5wcmludCgiOyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExMjgpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTI4KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDExMjkpIHByaW50ZXIucHJpbnQoInN3aXRjaCgiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTMwKSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDExMzApIG4uZ2V0U2VsZWN0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0U2VsZWN0b3IoKQorICBMaW5lIDExMzEpIHByaW50ZXIucHJpbnRMbigiKSB7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTMyKSBuLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0RW50cmllcygpCisgIExpbmUgMTEzMykgcHJpbnRlci5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIuaW5kZW50KCkKKyAgTGluZSAxMTM0KSBuLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0RW50cmllcygpCisgIExpbmUgMTEzNSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDExMzcpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIudW5pbmRlbnQoKQorICBMaW5lIDExMzkpIHByaW50ZXIucHJpbnQoIn0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTQ1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE0NSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMTQ2KSBuLmdldExhYmVsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuZ2V0TGFiZWwoKQorICBMaW5lIDExNDcpIHByaW50ZXIucHJpbnQoImNhc2UgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTE0OCkgbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMTQ4KSBuLmdldExhYmVsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuZ2V0TGFiZWwoKQorICBMaW5lIDExNDkpIHByaW50ZXIucHJpbnQoIjoiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTUxKSBwcmludGVyLnByaW50KCJkZWZhdWx0OiIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExNTMpIHByaW50ZXIucHJpbnRMbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKCkKKyAgTGluZSAxMTU0KSBwcmludGVyLmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5pbmRlbnQoKQorICBMaW5lIDExNTUpIG4uZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRTdG10cygpCisgIExpbmUgMTE1Nikgbi5nZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldFN0bXRzKCkKKyAgTGluZSAxMTU3KSBzLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMTU4KSBwcmludGVyLnByaW50TG4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbigpCisgIExpbmUgMTE2MSkgcHJpbnRlci51bmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci51bmluZGVudCgpCisgIExpbmUgMTE2NikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExNjYpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTE2NykgcHJpbnRlci5wcmludCgiYnJlYWsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTY4KSBuLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQuZ2V0SWQoKQorICBMaW5lIDExNjkpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTcwKSBwcmludGVyLnByaW50KG4uZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTE3MCkgbi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10LmdldElkKCkKKyAgTGluZSAxMTcyKSBwcmludGVyLnByaW50KCI7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTE3NykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExNzcpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTE3OCkgcHJpbnRlci5wcmludCgicmV0dXJuIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTE3OSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10LmdldEV4cHIoKQorICBMaW5lIDExODApIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTgxKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTE4MSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10LmdldEV4cHIoKQorICBMaW5lIDExODMpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTg4KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE4OCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMTg5KSBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TWVtYmVyQW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTg5KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDExOTApIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMTE5MCkgbi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDExOTIpIHByaW50ZXIucHJpbnQoImVudW0gIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTE5MykgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTE5Mykgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTE5NSkgbi5nZXRJbXBsZW1lbnRzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxMTk1KSBuLmdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRzKCkKKyAgTGluZSAxMTk2KSBwcmludGVyLnByaW50KCIgaW1wbGVtZW50cyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTk3KSBuLmdldEltcGxlbWVudHMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgMTE5Nykgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgMTE5NykgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxMTk4KSBpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDExOTkpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEyMDApIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTIwMSkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjA2KSBwcmludGVyLnByaW50TG4oIiB7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjA3KSBwcmludGVyLmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5pbmRlbnQoKQorICBMaW5lIDEyMDgpIG4uZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEVudHJpZXMoKQorICBMaW5lIDEyMDkpIHByaW50ZXIucHJpbnRMbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKCkKKyAgTGluZSAxMjEwKSBuLmdldEVudHJpZXMoKS5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuTGlzdC5pdGVyYXRvcigpCisgIExpbmUgMTIxMCkgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0RW50cmllcygpCisgIExpbmUgMTIxMCkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxMjExKSBpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDEyMTIpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEyMTMpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTIxNCkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjE4KSBuLmdldE1lbWJlcnMoKS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDEyMTgpIG4uZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDEyMTkpIHByaW50ZXIucHJpbnRMbigiOyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTIyMCkgcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNZW1iZXJzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb248Pz4+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMjApIG4uZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDEyMjIpIG4uZ2V0RW50cmllcygpLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgMTIyMikgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0RW50cmllcygpCisgIExpbmUgMTIyMykgcHJpbnRlci5wcmludExuKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oKQorICBMaW5lIDEyMjYpIHByaW50ZXIudW5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIudW5pbmRlbnQoKQorICBMaW5lIDEyMjcpIHByaW50ZXIucHJpbnQoIn0iKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjMyKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTIzMikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMjMzKSBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TWVtYmVyQW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjMzKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDEyMzQpIHByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyMzQpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTIzNikgbi5nZXRBcmdzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxMjM2KSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldEFyZ3MoKQorICBMaW5lIDEyMzcpIHByaW50QXJndW1lbnRzKG4uZ2V0QXJncygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRBcmd1bWVudHMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMzcpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QXJncygpCisgIExpbmUgMTI0MCkgbi5nZXRDbGFzc0JvZHkoKS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDEyNDApIG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRDbGFzc0JvZHkoKQorICBMaW5lIDEyNDEpIHByaW50ZXIucHJpbnRMbigiIHsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyNDIpIHByaW50ZXIuaW5kZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLmluZGVudCgpCisgIExpbmUgMTI0MykgcHJpbnRNZW1iZXJzKG4uZ2V0Q2xhc3NCb2R5KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE1lbWJlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjw/Pj4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTI0Mykgbi5nZXRDbGFzc0JvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldENsYXNzQm9keSgpCisgIExpbmUgMTI0NCkgcHJpbnRlci51bmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci51bmluZGVudCgpCisgIExpbmUgMTI0NSkgcHJpbnRlci5wcmludExuKCJ9IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjUxKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTI1MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMjUyKSBwcmludGVyLnByaW50KCI7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTI1NykgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyNTcpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTI1OCkgbi5pc1N0YXRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5pc1N0YXRpYygpCisgIExpbmUgMTI1OSkgcHJpbnRlci5wcmludCgic3RhdGljICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyNjEpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEyNjEpIG4uZ2V0QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24uZ2V0QmxvY2soKQorICBMaW5lIDEyNjYpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjY2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEyNjcpIHByaW50ZXIucHJpbnQoImlmICgiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjY4KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMjY4KSBuLmdldENvbmRpdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldENvbmRpdGlvbigpCisgIExpbmUgMTI2OSkgbi5nZXRUaGVuU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldFRoZW5TdG10KCkKKyAgTGluZSAxMjcxKSBwcmludGVyLnByaW50KCIpICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyNzMpIHByaW50ZXIucHJpbnRMbigiKSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTI3NCkgcHJpbnRlci5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIuaW5kZW50KCkKKyAgTGluZSAxMjc2KSBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEyNzYpIG4uZ2V0VGhlblN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRUaGVuU3RtdCgpCisgIExpbmUgMTI3OCkgcHJpbnRlci51bmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci51bmluZGVudCgpCisgIExpbmUgMTI3OSkgbi5nZXRFbHNlU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldEVsc2VTdG10KCkKKyAgTGluZSAxMjgxKSBwcmludGVyLnByaW50KCIgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTI4MykgcHJpbnRlci5wcmludExuKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oKQorICBMaW5lIDEyODQpIG4uZ2V0RWxzZVN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRFbHNlU3RtdCgpCisgIExpbmUgMTI4NSkgbi5nZXRFbHNlU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldEVsc2VTdG10KCkKKyAgTGluZSAxMjg3KSBwcmludGVyLnByaW50KCJlbHNlICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyODkpIHByaW50ZXIucHJpbnRMbigiZWxzZSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTI5MCkgcHJpbnRlci5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIuaW5kZW50KCkKKyAgTGluZSAxMjkyKSBuLmdldEVsc2VTdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEyOTIpIG4uZ2V0RWxzZVN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRFbHNlU3RtdCgpCisgIExpbmUgMTI5NCkgcHJpbnRlci51bmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci51bmluZGVudCgpCisgIExpbmUgMTMwMCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEzMDApIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTMwMSkgcHJpbnRlci5wcmludCgid2hpbGUgKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMDIpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEzMDIpIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAxMzAzKSBwcmludGVyLnByaW50KCIpICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMDQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMzA0KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMzA5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTMwOSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMzEwKSBwcmludGVyLnByaW50KCJjb250aW51ZSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMTEpIG4uZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdC5nZXRJZCgpCisgIExpbmUgMTMxMikgcHJpbnRlci5wcmludCgiICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMTMpIHByaW50ZXIucHJpbnQobi5nZXRJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzEzKSBuLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQuZ2V0SWQoKQorICBMaW5lIDEzMTUpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzIwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTMyMCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMzIxKSBwcmludGVyLnByaW50KCJkbyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzIyKSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTMyMikgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTMyMykgcHJpbnRlci5wcmludCgiIHdoaWxlICgiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzI0KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMzI0KSBuLmdldENvbmRpdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LmdldENvbmRpdGlvbigpCisgIExpbmUgMTMyNSkgcHJpbnRlci5wcmludCgiKTsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzMwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTMzMCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMzMxKSBwcmludGVyLnByaW50KCJmb3IgKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMzIpIG4uZ2V0VmFyaWFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTMzMikgbi5nZXRWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuZ2V0VmFyaWFibGUoKQorICBMaW5lIDEzMzMpIHByaW50ZXIucHJpbnQoIiA6ICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMzQpIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTMzNCkgbi5nZXRJdGVyYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuZ2V0SXRlcmFibGUoKQorICBMaW5lIDEzMzUpIHByaW50ZXIucHJpbnQoIikgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTMzNikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEzMzYpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTM0MSkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEzNDEpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTM0MikgcHJpbnRlci5wcmludCgiZm9yICgiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzQzKSBuLmdldEluaXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0SW5pdCgpCisgIExpbmUgMTM0NCkgbi5nZXRJbml0KCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDEzNDQpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRJbml0KCkKKyAgTGluZSAxMzQ0KSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDEzNDUpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMTM0NikgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTM0NykgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxMzQ4KSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzNTIpIHByaW50ZXIucHJpbnQoIjsgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTM1Mykgbi5nZXRDb21wYXJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldENvbXBhcmUoKQorICBMaW5lIDEzNTQpIG4uZ2V0Q29tcGFyZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMzU0KSBuLmdldENvbXBhcmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Q29tcGFyZSgpCisgIExpbmUgMTM1NikgcHJpbnRlci5wcmludCgiOyAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzU3KSBuLmdldFVwZGF0ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRVcGRhdGUoKQorICBMaW5lIDEzNTgpIG4uZ2V0VXBkYXRlKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDEzNTgpIG4uZ2V0VXBkYXRlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldFVwZGF0ZSgpCisgIExpbmUgMTM1OCkgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxMzU5KSBpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDEzNjApIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEzNjEpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTM2MikgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzY2KSBwcmludGVyLnByaW50KCIpICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzNjcpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMzY3KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTM3MikgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEzNzIpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTM3MykgcHJpbnRlci5wcmludCgidGhyb3cgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTM3NCkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEzNzQpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10LmdldEV4cHIoKQorICBMaW5lIDEzNzUpIHByaW50ZXIucHJpbnQoIjsiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzgwKSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTM4MCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMzgxKSBwcmludGVyLnByaW50KCJzeW5jaHJvbml6ZWQgKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzODIpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMzgyKSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQuZ2V0RXhwcigpCisgIExpbmUgMTM4MykgcHJpbnRlci5wcmludCgiKSAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzg0KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEzODQpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMzg5KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTM4OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMzkwKSBwcmludGVyLnByaW50KCJ0cnkgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTM5MSkgbi5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDEzOTEpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgMTM5MikgcHJpbnRlci5wcmludCgiKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzOTMpIG4uZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDEzOTMpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgMTM5NSkgcmVzb3VyY2VzLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDEzOTYpIHZpc2l0KHJlc291cmNlcy5uZXh0KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci52aXNpdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTM5NikgcmVzb3VyY2VzLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDEzOTcpIHJlc291cmNlcy5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxMzk4KSBwcmludGVyLnByaW50KCI7IikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTM5OSkgcHJpbnRlci5wcmludExuKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oKQorICBMaW5lIDE0MDEpIHByaW50ZXIuaW5kZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLmluZGVudCgpCisgIExpbmUgMTQwNikgbi5nZXRSZXNvdXJjZXMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE0MDYpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgMTQwNykgcHJpbnRlci51bmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci51bmluZGVudCgpCisgIExpbmUgMTQwOSkgcHJpbnRlci5wcmludCgiKSAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDExKSBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxNDExKSBuLmdldFRyeUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFRyeUJsb2NrKCkKKyAgTGluZSAxNDEyKSBuLmdldENhdGNocygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRDYXRjaHMoKQorICBMaW5lIDE0MTMpIG4uZ2V0Q2F0Y2hzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldENhdGNocygpCisgIExpbmUgMTQxNCkgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQxNykgbi5nZXRGaW5hbGx5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkKKyAgTGluZSAxNDE4KSBwcmludGVyLnByaW50KCIgZmluYWxseSAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDE5KSBuLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQxOSkgbi5nZXRGaW5hbGx5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkKKyAgTGluZSAxNDI1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTQyNSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxNDI2KSBwcmludGVyLnByaW50KCIgY2F0Y2ggKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0MjcpIG4uZ2V0UGFyYW0oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0MjcpIG4uZ2V0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldFBhcmFtKCkKKyAgTGluZSAxNDI4KSBwcmludGVyLnByaW50KCIpICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0MjkpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQyOSkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5nZXRCb2R5KCkKKyAgTGluZSAxNDM1KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTQzNSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxNDM2KSBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50TWVtYmVyQW5ub3RhdGlvbnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByPiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNDM2KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE0MzcpIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNb2RpZmllcnMoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMTQzNykgbi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDE0MzkpIHByaW50ZXIucHJpbnQoIkBpbnRlcmZhY2UgIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ0MCkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ0MCkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTQ0MSkgcHJpbnRlci5wcmludExuKCIgeyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludExuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ0MikgcHJpbnRlci5pbmRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIuaW5kZW50KCkKKyAgTGluZSAxNDQzKSBuLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAxNDQ0KSBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE1lbWJlcnMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjw/Pj4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTQ0NCkgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMTQ0NikgcHJpbnRlci51bmluZGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci51bmluZGVudCgpCisgIExpbmUgMTQ0NykgcHJpbnRlci5wcmludCgifSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0NTIpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNDUyKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE0NTMpIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI+LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE0NTMpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTQ1NCkgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludE1vZGlmaWVycyhqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSAxNDU0KSBuLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMTQ1Nikgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0NTYpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDE0NTcpIHByaW50ZXIucHJpbnQoIiAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDU4KSBwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDU4KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxNDU5KSBwcmludGVyLnByaW50KCIoKSIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0NjApIG4uZ2V0RGVmYXVsdFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkKKyAgTGluZSAxNDYxKSBwcmludGVyLnByaW50KCIgZGVmYXVsdCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDYyKSBuLmdldERlZmF1bHRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxNDYyKSBuLmdldERlZmF1bHRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldERlZmF1bHRWYWx1ZSgpCisgIExpbmUgMTQ2NCkgcHJpbnRlci5wcmludCgiOyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0NjkpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNDY5KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE0NzApIHByaW50ZXIucHJpbnQoIkAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDcxKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQ3MSkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxNDc2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTQ3Nikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxNDc3KSBwcmludGVyLnByaW50KCJAIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ3OCkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0NzgpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTQ3OSkgcHJpbnRlci5wcmludCgiKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0ODApIG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQ4MCkgbi5nZXRNZW1iZXJWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuZ2V0TWVtYmVyVmFsdWUoKQorICBMaW5lIDE0ODEpIHByaW50ZXIucHJpbnQoIikiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDg2KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTQ4Nikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxNDg3KSBwcmludGVyLnByaW50KCJAIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ4OCkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0ODgpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTQ4OSkgcHJpbnRlci5wcmludCgiKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0OTApIG4uZ2V0UGFpcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLmdldFBhaXJzKCkKKyAgTGluZSAxNDkxKSBuLmdldFBhaXJzKCkuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDE0OTEpIG4uZ2V0UGFpcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLmdldFBhaXJzKCkKKyAgTGluZSAxNDkxKSBpLmhhc05leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLmhhc05leHQoKQorICBMaW5lIDE0OTIpIGkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMTQ5MykgbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0OTQpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTQ5NSkgcHJpbnRlci5wcmludCgiLCAiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDk5KSBwcmludGVyLnByaW50KCIpIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUwNCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE1MDQpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTUwNSkgcHJpbnRlci5wcmludChuLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUwNSkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpCisgIExpbmUgMTUwNikgcHJpbnRlci5wcmludCgiID0gIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUwNykgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxNTA3KSBuLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKQorICBMaW5lIDE1MTUpIHByaW50ZXIucHJpbnQoIi8vIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUxNikgbi5nZXRDb250ZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudC5nZXRDb250ZW50KCkKKyAgTGluZSAxNTE3KSB0bXAucmVwbGFjZSgnXHInLCAnICcpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSAxNTE4KSB0bXAucmVwbGFjZSgnXG4nLCAnICcpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSAxNTE5KSBwcmludGVyLnByaW50TG4odG1wKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnRMbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1MjcpIHByaW50ZXIucHJpbnQoIi8qIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUyOCkgcHJpbnRlci5wcmludChuLmdldENvbnRlbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUyOCkgbi5nZXRDb250ZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudC5nZXRDb250ZW50KCkKKyAgTGluZSAxNTI5KSBwcmludGVyLnByaW50TG4oIiovIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50TG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNTM0KSBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IucHJpbnRKYXZhQ29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTUzNCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxNTM2KSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpCisgIExpbmUgMTUzNykgbi5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpCisgIExpbmUgMTU0MCkgcHJpbnRlci5wcmludCgiKCIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1NDMpIHBhcmFtZXRlcnMuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLkxpc3QuaXRlcmF0b3IoKQorICBMaW5lIDE1NDMpIGkuaGFzTmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IuaGFzTmV4dCgpCisgIExpbmUgMTU0NCkgaS5uZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5uZXh0KCkKKyAgTGluZSAxNTQ1KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTU0NikgaS5oYXNOZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5oYXNOZXh0KCkKKyAgTGluZSAxNTQ3KSBwcmludGVyLnByaW50KCIsICIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1NTIpIHByaW50ZXIucHJpbnQoIikiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNTU1KSBwcmludGVyLnByaW50KCIgLT4gIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTU1Nikgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldEJvZHkoKQorICBMaW5lIDE1NTkpICgoRXhwcmVzc2lvblN0bXQpIGJvZHkpLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTU1OSkgKChFeHByZXNzaW9uU3RtdCkgYm9keSkuZ2V0RXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQuZ2V0RXhwcmVzc2lvbigpCisgIExpbmUgMTU2MSkgYm9keS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTU2OCkgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLnByaW50SmF2YUNvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE1NjgpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTU2OSkgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTU3MCkgbi5nZXRJZGVudGlmaWVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldElkZW50aWZpZXIoKQorICBMaW5lIDE1NzIpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTU3Mikgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTU3NSkgcHJpbnRlci5wcmludCgiOjoiKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkR1bXBWaXNpdG9yLlNvdXJjZVByaW50ZXIucHJpbnQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNTc2KSBwcmludFR5cGVBcmdzKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludFR5cGVBcmdzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czw/PiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNTc4KSBwcmludGVyLnByaW50KGlkZW50aWZpZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRHVtcFZpc2l0b3IuU291cmNlUHJpbnRlci5wcmludChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1ODUpIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEphdmFDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNTg1KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE1ODYpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTU4Nykgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE1ODcpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTU5MykgcHJpbnRBbm5vdGF0aW9ucyhhcnJheUJyYWNrZXRQYWlyLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5wcmludEFubm90YXRpb25zKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcj4sIGJvb2xlYW4sIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTU5MykgYXJyYXlCcmFja2V0UGFpci5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE1OTQpIHByaW50ZXIucHJpbnQoIltdIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5EdW1wVmlzaXRvci5Tb3VyY2VQcmludGVyLnByaW50KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTYwMCkgbm9kZS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkKKyAgTGluZSAxNjAzKSBldmVyeXRoaW5nLmFkZEFsbChwYXJlbnQuZ2V0Q2hpbGRyZW5Ob2RlcygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxNjAzKSBwYXJlbnQuZ2V0Q2hpbGRyZW5Ob2RlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpCisgIExpbmUgMTYwNCkgc29ydEJ5QmVnaW5Qb3NpdGlvbihldmVyeXRoaW5nKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxNjA2KSBldmVyeXRoaW5nLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTYwNykgZXZlcnl0aGluZy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTYxMikgZXZlcnl0aGluZy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTYxNSkgZXZlcnl0aGluZy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTYxNykgbm9kZVRvUHJpbnQuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTYxOCkgbm9kZVRvUHJpbnQuYWNjZXB0KHRoaXMsIG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxNjI1KSBldmVyeXRoaW5nLmFkZEFsbChub2RlLmdldENoaWxkcmVuTm9kZXMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMTYyNSkgbm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkKKyAgTGluZSAxNjI2KSBzb3J0QnlCZWdpblBvc2l0aW9uKGV2ZXJ5dGhpbmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE2MjcpIGV2ZXJ5dGhpbmcuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxNjMzKSBldmVyeXRoaW5nLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTYzNCkgZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSAxIC0gY29tbWVudHNBdEVuZCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTYzNCkgZXZlcnl0aGluZy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE2NDEpIGV2ZXJ5dGhpbmcuZ2V0KGV2ZXJ5dGhpbmcuc2l6ZSgpIC0gY29tbWVudHNBdEVuZCArIGkpLmFjY2VwdCh0aGlzLCBudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTY0MSkgZXZlcnl0aGluZy5nZXQoZXZlcnl0aGluZy5zaXplKCkgLSBjb21tZW50c0F0RW5kICsgaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTY0MSkgZXZlcnl0aGluZy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9FcXVhbHNWaXNpdG9yLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfRXF1YWxzVmlzaXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZGZjZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfRXF1YWxzVmlzaXRvci50eHQKQEAgLTAsMCArMSw2MTkgQEAKKyAgTGluZSAxMTEpIFNJTkdMRVRPTi5ub2RlRXF1YWxzKG4xLCBuMikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMjMpIG5vZGVFcXVhbHMobjEuZ2V0Q29tbWVudCgpLCBuMi5nZXRDb21tZW50KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTIzKSBuMS5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMjMpIG4yLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDEyNikgbm9kZXNFcXVhbHMobjEuZ2V0T3JwaGFuQ29tbWVudHMoKSwgbjIuZ2V0T3JwaGFuQ29tbWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMjYpIG4xLmdldE9ycGhhbkNvbW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRPcnBoYW5Db21tZW50cygpCisgIExpbmUgMTI2KSBuMi5nZXRPcnBoYW5Db21tZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0T3JwaGFuQ29tbWVudHMoKQorICBMaW5lIDEzNSkgbm9kZXMxLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTM1KSBub2RlczIuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxMzgpIG5vZGVzMS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDEzOSkgbm9kZUVxdWFscyhub2RlczEuZ2V0KGkpLCBub2RlczIuZ2V0KGkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzOSkgbm9kZXMxLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMzkpIG5vZGVzMi5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTUzKSBuMS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNTMpIG4yLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE1NikgY29tbW9uTm9kZUVxdWFsaXR5KG4xLCBuMikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLmNvbW1vbk5vZGVFcXVhbGl0eShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNTkpIG4xLmFjY2VwdCh0aGlzLCBuMikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE2OSkgbjEuZXF1YWxzKG4yKSA9PT4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNzUpIG5vZGVFcXVhbHMobjEuZ2V0UGFja2FnZSgpLCBuMi5nZXRQYWNrYWdlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTc1KSBuMS5nZXRQYWNrYWdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKQorICBMaW5lIDE3NSkgbjIuZ2V0UGFja2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCkKKyAgTGluZSAxNzkpIG5vZGVzRXF1YWxzKG4xLmdldEltcG9ydHMoKSwgbjIuZ2V0SW1wb3J0cygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE3OSkgbjEuZ2V0SW1wb3J0cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRJbXBvcnRzKCkKKyAgTGluZSAxNzkpIG4yLmdldEltcG9ydHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0SW1wb3J0cygpCisgIExpbmUgMTgzKSBub2Rlc0VxdWFscyhuMS5nZXRUeXBlcygpLCBuMi5nZXRUeXBlcygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE4MykgbjEuZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDE4MykgbjIuZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDE4Nykgbm9kZXNFcXVhbHMobjEuZ2V0Q29tbWVudHMoKSwgbjIuZ2V0Q29tbWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxODcpIG4xLmdldENvbW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldENvbW1lbnRzKCkKKyAgTGluZSAxODcpIG4yLmdldENvbW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldENvbW1lbnRzKCkKKyAgTGluZSAxOTcpIG5vZGVFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTk3KSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDE5NykgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMDEpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMjAxKSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMjAxKSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMjExKSBub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDIxMSkgbjEuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDIxMSkgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDIyMSkgb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjIxKSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDIyMSkgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSAyMjUpIG5vZGVzRXF1YWxzKG4xLmdldFR5cGVCb3VuZCgpLCBuMi5nZXRUeXBlQm91bmQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAyMjUpIG4xLmdldFR5cGVCb3VuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXRUeXBlQm91bmQoKQorICBMaW5lIDIyNSkgbjIuZ2V0VHlwZUJvdW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldFR5cGVCb3VuZCgpCisgIExpbmUgMjI4KSBub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDIyOCkgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDIyOCkgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDIzNykgb2JqRXF1YWxzKG4xLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjM3KSBuMS5nZXRDb250ZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudC5nZXRDb250ZW50KCkKKyAgTGluZSAyMzcpIG4yLmdldENvbnRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LmdldENvbnRlbnQoKQorICBMaW5lIDI0MSkgb2JqRXF1YWxzKG4xLmdldEJlZ2luKCkubGluZSwgbjIuZ2V0QmVnaW4oKS5saW5lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQxKSBuMS5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDI0MSkgbjIuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSAyNTEpIG9iakVxdWFscyhuMS5nZXRDb250ZW50KCksIG4yLmdldENvbnRlbnQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI1MSkgbjEuZ2V0Q29udGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuZ2V0Q29udGVudCgpCisgIExpbmUgMjUxKSBuMi5nZXRDb250ZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudC5nZXRDb250ZW50KCkKKyAgTGluZSAyNTUpIG9iakVxdWFscyhuMS5nZXRCZWdpbigpLmxpbmUsIG4yLmdldEJlZ2luKCkubGluZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI1NSkgbjEuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSAyNTUpIG4yLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgMjY3KSBuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RTZXQuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjY3KSBuMS5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDI2NykgbjIuZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAyNzEpIG4xLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uaXNJbnRlcmZhY2UoKQorICBMaW5lIDI3MSkgbjIuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMjc1KSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNzUpIG4xLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNzUpIG4yLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNzkpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMjc5KSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAyNzkpIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDI4Mykgbm9kZXNFcXVhbHMobjEuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAyODMpIG4xLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDI4MykgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMjg3KSBub2Rlc0VxdWFscyhuMS5nZXRFeHRlbmRzKCksIG4yLmdldEV4dGVuZHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAyODcpIG4xLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRFeHRlbmRzKCkKKyAgTGluZSAyODcpIG4yLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRFeHRlbmRzKCkKKyAgTGluZSAyOTEpIG5vZGVzRXF1YWxzKG4xLmdldEltcGxlbWVudHMoKSwgbjIuZ2V0SW1wbGVtZW50cygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDI5MSkgbjEuZ2V0SW1wbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudHMoKQorICBMaW5lIDI5MSkgbjIuZ2V0SW1wbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudHMoKQorICBMaW5lIDI5NSkgbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMjk1KSBuMS5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMjk1KSBuMi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzA3KSBuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RTZXQuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzA3KSBuMS5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDMwNykgbjIuZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzMTEpIG9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMxMSkgbjEuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDMxMSkgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDMxNSkgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAzMTUpIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDMxNSkgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMzE5KSBub2Rlc0VxdWFscyhuMS5nZXRJbXBsZW1lbnRzKCksIG4yLmdldEltcGxlbWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAzMTkpIG4xLmdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRzKCkKKyAgTGluZSAzMTkpIG4yLmdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRzKCkKKyAgTGluZSAzMjMpIG5vZGVzRXF1YWxzKG4xLmdldEVudHJpZXMoKSwgbjIuZ2V0RW50cmllcygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDMyMykgbjEuZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEVudHJpZXMoKQorICBMaW5lIDMyMykgbjIuZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEVudHJpZXMoKQorICBMaW5lIDMyNykgbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMzI3KSBuMS5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzI3KSBuMi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzQzKSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNDMpIG4xLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDM0MykgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMzQ3KSBub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDM0NykgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMzQ3KSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAzNTEpIG5vZGVzRXF1YWxzKG4xLmdldEFyZ3MoKSwgbjIuZ2V0QXJncygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDM1MSkgbjEuZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QXJncygpCisgIExpbmUgMzUxKSBuMi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRBcmdzKCkKKyAgTGluZSAzNTUpIG5vZGVzRXF1YWxzKG4xLmdldENsYXNzQm9keSgpLCBuMi5nZXRDbGFzc0JvZHkoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAzNTUpIG4xLmdldENsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0Q2xhc3NCb2R5KCkKKyAgTGluZSAzNTUpIG4yLmdldENsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0Q2xhc3NCb2R5KCkKKyAgTGluZSAzNjcpIG4xLmdldE1vZGlmaWVycygpLmVxdWFscyhuMi5nZXRNb2RpZmllcnMoKSkgPT0+IGphdmEudXRpbC5BYnN0cmFjdFNldC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNjcpIG4xLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMzY3KSBuMi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDM3MSkgb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzcxKSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMzcxKSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMzc1KSBub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDM3NSkgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMzc1KSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAzNzkpIG5vZGVzRXF1YWxzKG4xLmdldE1lbWJlcnMoKSwgbjIuZ2V0TWVtYmVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDM3OSkgbjEuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDM3OSkgbjIuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDM5MSkgbjEuZ2V0TW9kaWZpZXJzKCkuZXF1YWxzKG4yLmdldE1vZGlmaWVycygpKSA9PT4gamF2YS51dGlsLkFic3RyYWN0U2V0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM5MSkgbjEuZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzOTEpIG4yLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMzk1KSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzOTUpIG4xLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAzOTUpIG4yLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAzOTkpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMzk5KSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAzOTkpIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQwMykgbm9kZUVxdWFscyhuMS5nZXREZWZhdWx0VmFsdWUoKSwgbjIuZ2V0RGVmYXVsdFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNDAzKSBuMS5nZXREZWZhdWx0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5nZXREZWZhdWx0VmFsdWUoKQorICBMaW5lIDQwMykgbjIuZ2V0RGVmYXVsdFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkKKyAgTGluZSA0MDcpIG5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNDA3KSBuMS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgNDA3KSBuMi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgNDE5KSBuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RTZXQuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDE5KSBuMS5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA0MTkpIG4yLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDQyMykgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA0MjMpIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQyMykgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNDI3KSBub2RlRXF1YWxzKG4xLmdldEVsZW1lbnRUeXBlKCksIG4yLmdldEVsZW1lbnRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNDI3KSBuMS5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNDI3KSBuMi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNDMxKSBub2Rlc0VxdWFscyhuMS5nZXRWYXJpYWJsZXMoKSwgbjIuZ2V0VmFyaWFibGVzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNDMxKSBuMS5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkKKyAgTGluZSA0MzEpIG4yLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDQzNSkgbm9kZXNFcXVhbHMobjEuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIG4yLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDQzNSkgbjEuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpCisgIExpbmUgNDM1KSBuMi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSA0NDUpIG5vZGVFcXVhbHMobjEuZ2V0SWQoKSwgbjIuZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA0NDUpIG4xLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0SWQoKQorICBMaW5lIDQ0NSkgbjIuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJZCgpCisgIExpbmUgNDQ5KSBub2RlRXF1YWxzKG4xLmdldEluaXQoKSwgbjIuZ2V0SW5pdCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDQ0OSkgbjEuZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDQ0OSkgbjIuZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDQ1OSkgbm9kZXNFcXVhbHMobjEuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCksIG4yLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDQ1OSkgbjEuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKQorICBMaW5lIDQ1OSkgbjIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKQorICBMaW5lIDQ2Mykgb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDYzKSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5nZXROYW1lKCkKKyAgTGluZSA0NjMpIG4yLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmdldE5hbWUoKQorICBMaW5lIDQ3NSkgbjEuZ2V0TW9kaWZpZXJzKCkuZXF1YWxzKG4yLmdldE1vZGlmaWVycygpKSA9PT4gamF2YS51dGlsLkFic3RyYWN0U2V0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ3NSkgbjEuZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgNDc1KSBuMi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA0NzkpIG9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ3OSkgbjEuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA0NzkpIG4yLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNDgzKSBub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDQ4MykgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNDgzKSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0ODcpIG5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNDg3KSBuMS5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDQ4NykgbjIuZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRCb2R5KCkKKyAgTGluZSA0OTEpIG5vZGVzRXF1YWxzKG4xLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDQ5MSkgbjEuZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA0OTEpIG4yLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNDk1KSBub2Rlc0VxdWFscyhuMS5nZXRUaHJvd3MoKSwgbjIuZ2V0VGhyb3dzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNDk1KSBuMS5nZXRUaHJvd3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA0OTUpIG4yLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDQ5OSkgbm9kZXNFcXVhbHMobjEuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA0OTkpIG4xLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA0OTkpIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA1MTEpIG4xLmdldE1vZGlmaWVycygpLmVxdWFscyhuMi5nZXRNb2RpZmllcnMoKSkgPT0+IGphdmEudXRpbC5BYnN0cmFjdFNldC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MTEpIG4xLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA1MTEpIG4yLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA1MTUpIG5vZGVzRXF1YWxzKG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLCBuMi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA1MTUpIG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSA1MTUpIG4yLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSA1MTkpIG5vZGVzRXF1YWxzKG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCksIG4yLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNTE5KSBuMS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKQorICBMaW5lIDUxOSkgbjIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCkKKyAgTGluZSA1MjMpIG9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUyMykgbjEuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNTIzKSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1MjcpIG5vZGVFcXVhbHMobjEuZ2V0RWxlbWVudFR5cGUoKSwgbjIuZ2V0RWxlbWVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA1MjcpIG4xLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNTI3KSBuMi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDUzMSkgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA1MzEpIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDUzMSkgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNTM1KSBub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDUzNSkgbjEuZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpCisgIExpbmUgNTM1KSBuMi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCkKKyAgTGluZSA1MzkpIG5vZGVzRXF1YWxzKG4xLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDUzOSkgbjEuZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNTM5KSBuMi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA1NDMpIG5vZGVzRXF1YWxzKG4xLmdldFRocm93cygpLCBuMi5nZXRUaHJvd3MoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA1NDMpIG4xLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA1NDMpIG4yLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA1NDcpIG5vZGVzRXF1YWxzKG4xLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNTQ3KSBuMS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDU0NykgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA1NTApIG4xLmlzRGVmYXVsdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uaXNEZWZhdWx0KCkKKyAgTGluZSA1NTApIG4yLmlzRGVmYXVsdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uaXNEZWZhdWx0KCkKKyAgTGluZSA1NTgpIG5vZGVFcXVhbHMobjEuZ2V0RWxlbWVudFR5cGUoKSwgbjIuZ2V0RWxlbWVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA1NTgpIG4xLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDU1OCkgbjIuZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNTYyKSBub2Rlc0VxdWFscyhuMS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSwgbjIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNTYyKSBuMS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKQorICBMaW5lIDU2MikgbjIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSA1NjYpIG4xLmdldE1vZGlmaWVycygpLmVxdWFscyhuMi5nZXRNb2RpZmllcnMoKSkgPT0+IGphdmEudXRpbC5BYnN0cmFjdFNldC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1NjYpIG4xLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldE1vZGlmaWVycygpCisgIExpbmUgNTY2KSBuMi5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDU3MCkgbm9kZUVxdWFscyhuMS5nZXRJZCgpLCBuMi5nZXRJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDU3MCkgbjEuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRJZCgpCisgIExpbmUgNTcwKSBuMi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldElkKCkKKyAgTGluZSA1NzQpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNTc0KSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA1NzQpIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDU4OCkgbm9kZUVxdWFscyhuMS5nZXRCbG9jaygpLCBuMi5nZXRCbG9jaygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDU4OCkgbjEuZ2V0QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24uZ2V0QmxvY2soKQorICBMaW5lIDU4OCkgbjIuZ2V0QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24uZ2V0QmxvY2soKQorICBMaW5lIDU5Mikgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA1OTIpIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDU5MikgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjAyKSBvYmpFcXVhbHMobjEuZ2V0Q29udGVudCgpLCBuMi5nZXRDb250ZW50KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MDIpIG4xLmdldENvbnRlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LmdldENvbnRlbnQoKQorICBMaW5lIDYwMikgbjIuZ2V0Q29udGVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQuZ2V0Q29udGVudCgpCisgIExpbmUgNjEyKSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MTIpIG4xLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDYxMikgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgNjE2KSBub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNjE2KSBuMS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKQorICBMaW5lIDYxNikgbjIuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSA2MjApIG5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDYyMCkgbjEuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgNjIwKSBuMi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA2MjQpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjI0KSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjI0KSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjM0KSBuMS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLmdldFR5cGUoKQorICBMaW5lIDYzNCkgbjIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5nZXRUeXBlKCkKKyAgTGluZSA2MzcpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjM3KSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjM3KSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjQ3KSBub2RlRXF1YWxzKG4xLmdldENvbXBvbmVudFR5cGUoKSwgbjIuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDY0NykgbjEuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDY0NykgbjIuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDY1MCkgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA2NTApIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA2NTApIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA2NjApIG5vZGVFcXVhbHMobjEuZ2V0RGltZW5zaW9uKCksIG4yLmdldERpbWVuc2lvbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDY2MCkgbjEuZ2V0RGltZW5zaW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsLmdldERpbWVuc2lvbigpCisgIExpbmUgNjYwKSBuMi5nZXREaW1lbnNpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0RGltZW5zaW9uKCkKKyAgTGluZSA2NjMpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNjYzKSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjYzKSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNjcyKSBub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDY3MikgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDY3MikgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDY3NikgbjEuZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKQorICBMaW5lIDY3NykgbjIuZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKQorICBMaW5lIDY4MCkgbjFFbGVtZW50cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDY4MCkgbjJFbGVtZW50cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDY4NikgYXV4LmFjY2VwdCh0aGlzLCBuMkVsZW1lbnRzLmdldChpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDY4NikgbjJFbGVtZW50cy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNzAxKSBub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDcwMSkgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDcwMSkgbjIuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDcwNSkgbjEuZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5nZXRFbGVtZW50cygpCisgIExpbmUgNzA2KSBuMi5nZXRFbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlLmdldEVsZW1lbnRzKCkKKyAgTGluZSA3MDkpIG4xRWxlbWVudHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA3MDkpIG4yRWxlbWVudHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA3MTUpIGF1eC5hY2NlcHQodGhpcywgbjJFbGVtZW50cy5nZXQoaSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3MTUpIG4yRWxlbWVudHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDczMCkgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA3MzApIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3MzApIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3MzkpIG5vZGVFcXVhbHMobjEuZ2V0RXh0ZW5kcygpLCBuMi5nZXRFeHRlbmRzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNzM5KSBuMS5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kcygpCisgIExpbmUgNzM5KSBuMi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kcygpCisgIExpbmUgNzQzKSBub2RlRXF1YWxzKG4xLmdldFN1cGVyKCksIG4yLmdldFN1cGVyKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNzQzKSBuMS5nZXRTdXBlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLmdldFN1cGVyKCkKKyAgTGluZSA3NDMpIG4yLmdldFN1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0U3VwZXIoKQorICBMaW5lIDc0Nikgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA3NDYpIG4xLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3NDYpIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3NTkpIG5vZGVFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNzU5KSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgNzU5KSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgNzYzKSBub2RlRXF1YWxzKG4xLmdldEluZGV4KCksIG4yLmdldEluZGV4KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNzYzKSBuMS5nZXRJbmRleCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLmdldEluZGV4KCkKKyAgTGluZSA3NjMpIG4yLmdldEluZGV4KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0SW5kZXgoKQorICBMaW5lIDc3Mykgbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA3NzMpIG4xLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDc3MykgbjIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgNzc3KSBub2Rlc0VxdWFscyhuMS5nZXRMZXZlbHMoKSwgbjIuZ2V0TGV2ZWxzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgNzc3KSBuMS5nZXRMZXZlbHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldExldmVscygpCisgIExpbmUgNzc3KSBuMi5nZXRMZXZlbHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldExldmVscygpCisgIExpbmUgNzgxKSBub2RlRXF1YWxzKG4xLmdldEluaXRpYWxpemVyKCksIG4yLmdldEluaXRpYWxpemVyKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgNzgxKSBuMS5nZXRJbml0aWFsaXplcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuZ2V0SW5pdGlhbGl6ZXIoKQorICBMaW5lIDc4MSkgbjIuZ2V0SW5pdGlhbGl6ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldEluaXRpYWxpemVyKCkKKyAgTGluZSA3OTEpIG5vZGVzRXF1YWxzKG4xLmdldFZhbHVlcygpLCBuMi5nZXRWYWx1ZXMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSA3OTEpIG4xLmdldFZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuZ2V0VmFsdWVzKCkKKyAgTGluZSA3OTEpIG4yLmdldFZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuZ2V0VmFsdWVzKCkKKyAgTGluZSA4MDEpIG4xLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSA4MDEpIG4yLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSA4MDUpIG5vZGVFcXVhbHMobjEuZ2V0VGFyZ2V0KCksIG4yLmdldFRhcmdldCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDgwNSkgbjEuZ2V0VGFyZ2V0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFRhcmdldCgpCisgIExpbmUgODA1KSBuMi5nZXRUYXJnZXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuZ2V0VGFyZ2V0KCkKKyAgTGluZSA4MDkpIG5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA4MDkpIG4xLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFZhbHVlKCkKKyAgTGluZSA4MDkpIG4yLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFZhbHVlKCkKKyAgTGluZSA4MTkpIG4xLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSA4MTkpIG4yLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSA4MjMpIG5vZGVFcXVhbHMobjEuZ2V0TGVmdCgpLCBuMi5nZXRMZWZ0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgODIzKSBuMS5nZXRMZWZ0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldExlZnQoKQorICBMaW5lIDgyMykgbjIuZ2V0TGVmdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRMZWZ0KCkKKyAgTGluZSA4MjcpIG5vZGVFcXVhbHMobjEuZ2V0UmlnaHQoKSwgbjIuZ2V0UmlnaHQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA4MjcpIG4xLmdldFJpZ2h0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldFJpZ2h0KCkKKyAgTGluZSA4MjcpIG4yLmdldFJpZ2h0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldFJpZ2h0KCkKKyAgTGluZSA4MzcpIG5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgODM3KSBuMS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwci5nZXRUeXBlKCkKKyAgTGluZSA4MzcpIG4yLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLmdldFR5cGUoKQorICBMaW5lIDg0MSkgbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA4NDEpIG4xLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLmdldEV4cHIoKQorICBMaW5lIDg0MSkgbjIuZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0RXhwcigpCisgIExpbmUgODUxKSBub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDg1MSkgbjEuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByLmdldFR5cGUoKQorICBMaW5lIDg1MSkgbjIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByLmdldFR5cGUoKQorICBMaW5lIDg2MSkgbm9kZUVxdWFscyhuMS5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgODYxKSBuMS5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRDb25kaXRpb24oKQorICBMaW5lIDg2MSkgbjIuZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSA4NjUpIG5vZGVFcXVhbHMobjEuZ2V0VGhlbkV4cHIoKSwgbjIuZ2V0VGhlbkV4cHIoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA4NjUpIG4xLmdldFRoZW5FeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0VGhlbkV4cHIoKQorICBMaW5lIDg2NSkgbjIuZ2V0VGhlbkV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRUaGVuRXhwcigpCisgIExpbmUgODY5KSBub2RlRXF1YWxzKG4xLmdldEVsc2VFeHByKCksIG4yLmdldEVsc2VFeHByKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgODY5KSBuMS5nZXRFbHNlRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldEVsc2VFeHByKCkKKyAgTGluZSA4NjkpIG4yLmdldEVsc2VFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0RWxzZUV4cHIoKQorICBMaW5lIDg3OSkgbm9kZUVxdWFscyhuMS5nZXRJbm5lcigpLCBuMi5nZXRJbm5lcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDg3OSkgbjEuZ2V0SW5uZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwci5nZXRJbm5lcigpCisgIExpbmUgODc5KSBuMi5nZXRJbm5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLmdldElubmVyKCkKKyAgTGluZSA4ODkpIG5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA4ODkpIG4xLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDg4OSkgbjIuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgODkzKSBvYmpFcXVhbHMobjEuZ2V0RmllbGQoKSwgbjIuZ2V0RmllbGQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg5MykgbjEuZ2V0RmllbGQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRGaWVsZCgpCisgIExpbmUgODkzKSBuMi5nZXRGaWVsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldEZpZWxkKCkKKyAgTGluZSA4OTcpIG5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDg5NykgbjEuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDg5NykgbjIuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDkwNykgbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSA5MDcpIG4xLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLmdldEV4cHIoKQorICBMaW5lIDkwNykgbjIuZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuZ2V0RXhwcigpCisgIExpbmUgOTExKSBub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDkxMSkgbjEuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgOTExKSBuMi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwci5nZXRUeXBlKCkKKyAgTGluZSA5MjEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTIxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDkyMSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5MzEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTMxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDkzMSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5NDEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTQxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDk0MSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5NTEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTUxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDk1MSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5NjEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTYxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDk2MSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5NzEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTcxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDk3MSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5ODEpIG9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTgxKSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDk4MSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN0cmluZ0xpdGVyYWxFeHByLmdldFZhbHVlKCkKKyAgTGluZSA5OTEpIG4xLmdldFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDk5MSkgbjIuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJvb2xlYW5MaXRlcmFsRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgMTAwNSkgbm9kZUVxdWFscyhuMS5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEwMDUpIG4xLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTAwNSkgbjIuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxMDA5KSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDA5KSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMDA5KSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMDEzKSBub2Rlc0VxdWFscyhuMS5nZXRBcmdzKCksIG4yLmdldEFyZ3MoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDEzKSBuMS5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmdzKCkKKyAgTGluZSAxMDEzKSBuMi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmdzKCkKKyAgTGluZSAxMDE3KSBub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDE3KSBuMS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMDE3KSBuMi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMDI3KSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDI3KSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMDI3KSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMDM3KSBub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTAzNykgbjEuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTAzNykgbjIuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTA0MSkgbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMDQxKSBuMS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTA0MSkgbjIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDEwNDUpIG5vZGVzRXF1YWxzKG4xLmdldEFub255bW91c0NsYXNzQm9keSgpLCBuMi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDQ1KSBuMS5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKQorICBMaW5lIDEwNDUpIG4yLmdldEFub255bW91c0NsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFub255bW91c0NsYXNzQm9keSgpCisgIExpbmUgMTA0OSkgbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTA0OSkgbjEuZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFyZ3MoKQorICBMaW5lIDEwNDkpIG4yLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRBcmdzKCkKKyAgTGluZSAxMDUzKSBub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMDUzKSBuMS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTA1MykgbjIuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDEwNjMpIG5vZGVFcXVhbHMobjEuZ2V0UXVhbGlmaWVyKCksIG4yLmdldFF1YWxpZmllcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEwNjMpIG4xLmdldFF1YWxpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIuZ2V0UXVhbGlmaWVyKCkKKyAgTGluZSAxMDYzKSBuMi5nZXRRdWFsaWZpZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByLmdldFF1YWxpZmllcigpCisgIExpbmUgMTA2Nykgb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iub2JqRXF1YWxzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA2NykgbjEuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTA2NykgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTA3Nykgbm9kZUVxdWFscyhuMS5nZXRDbGFzc0V4cHIoKSwgbjIuZ2V0Q2xhc3NFeHByKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTA3NykgbjEuZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDEwNzcpIG4yLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAxMDg3KSBub2RlRXF1YWxzKG4xLmdldENsYXNzRXhwcigpLCBuMi5nZXRDbGFzc0V4cHIoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMDg3KSBuMS5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDEwODcpIG4yLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgMTA5NykgbjEuZ2V0T3BlcmF0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgMTA5NykgbjIuZ2V0T3BlcmF0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgMTEwMSkgbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMTAxKSBuMS5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuZ2V0RXhwcigpCisgIExpbmUgMTEwMSkgbjIuZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldEV4cHIoKQorICBMaW5lIDExMTEpIG4xLmdldE1vZGlmaWVycygpLmVxdWFscyhuMi5nZXRNb2RpZmllcnMoKSkgPT0+IGphdmEudXRpbC5BYnN0cmFjdFNldC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTExKSBuMS5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldE1vZGlmaWVycygpCisgIExpbmUgMTExMSkgbjIuZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDExMTUpIG5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTExNSkgbjEuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxMTE1KSBuMi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDExMTkpIG5vZGVFcXVhbHMobjEuZ2V0RWxlbWVudFR5cGUoKSwgbjIuZ2V0RWxlbWVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMTE5KSBuMS5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDExMTkpIG4yLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTEyMykgbm9kZXNFcXVhbHMobjEuZ2V0VmFyaWFibGVzKCksIG4yLmdldFZhcmlhYmxlcygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDExMjMpIG4xLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAxMTIzKSBuMi5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldFZhcmlhYmxlcygpCisgIExpbmUgMTEyNykgbm9kZXNFcXVhbHMobjEuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIG4yLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDExMjcpIG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkKKyAgTGluZSAxMTI3KSBuMi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpCisgIExpbmUgMTEzNykgbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMTM3KSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMTM3KSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMTQ3KSBub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDExNDcpIG4xLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDExNDcpIG4yLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDExNTEpIG5vZGVFcXVhbHMobjEuZ2V0TWVtYmVyVmFsdWUoKSwgbjIuZ2V0TWVtYmVyVmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMTUxKSBuMS5nZXRNZW1iZXJWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuZ2V0TWVtYmVyVmFsdWUoKQorICBMaW5lIDExNTEpIG4yLmdldE1lbWJlclZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci5nZXRNZW1iZXJWYWx1ZSgpCisgIExpbmUgMTE2MSkgbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMTYxKSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMTYxKSBuMi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMTY1KSBub2Rlc0VxdWFscyhuMS5nZXRQYWlycygpLCBuMi5nZXRQYWlycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDExNjUpIG4xLmdldFBhaXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwci5nZXRQYWlycygpCisgIExpbmUgMTE2NSkgbjIuZ2V0UGFpcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLmdldFBhaXJzKCkKKyAgTGluZSAxMTc1KSBvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTc1KSBuMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpCisgIExpbmUgMTE3NSkgbjIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKQorICBMaW5lIDExNzkpIG5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMTc5KSBuMS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkKKyAgTGluZSAxMTc5KSBuMi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkKKyAgTGluZSAxMTg5KSBub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDExODkpIG4xLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRFeHByKCkKKyAgTGluZSAxMTg5KSBuMi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0RXhwcigpCisgIExpbmUgMTE5Mykgbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTE5MykgbjEuZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEFyZ3MoKQorICBMaW5lIDExOTMpIG4yLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmdzKCkKKyAgTGluZSAxMTk3KSBub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMTk3KSBuMS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTE5NykgbjIuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDEyMDcpIG5vZGVFcXVhbHMobjEuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG4yLmdldFR5cGVEZWNsYXJhdGlvbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEyMDcpIG4xLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdC5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDEyMDcpIG4yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdC5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDEyMTcpIG5vZGVFcXVhbHMobjEuZ2V0Q2hlY2soKSwgbjIuZ2V0Q2hlY2soKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMjE3KSBuMS5nZXRDaGVjaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRDaGVjaygpCisgIExpbmUgMTIxNykgbjIuZ2V0Q2hlY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0Q2hlY2soKQorICBMaW5lIDEyMjEpIG5vZGVFcXVhbHMobjEuZ2V0TWVzc2FnZSgpLCBuMi5nZXRNZXNzYWdlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTIyMSkgbjEuZ2V0TWVzc2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRNZXNzYWdlKCkKKyAgTGluZSAxMjIxKSBuMi5nZXRNZXNzYWdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10LmdldE1lc3NhZ2UoKQorICBMaW5lIDEyMzEpIG5vZGVzRXF1YWxzKG4xLmdldFN0bXRzKCksIG4yLmdldFN0bXRzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTIzMSkgbjEuZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5nZXRTdG10cygpCisgIExpbmUgMTIzMSkgbjIuZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5nZXRTdG10cygpCisgIExpbmUgMTI0MSkgbm9kZUVxdWFscyhuMS5nZXRTdG10KCksIG4yLmdldFN0bXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMjQxKSBuMS5nZXRTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5nZXRTdG10KCkKKyAgTGluZSAxMjQxKSBuMi5nZXRTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5nZXRTdG10KCkKKyAgTGluZSAxMjU1KSBub2RlRXF1YWxzKG4xLmdldEV4cHJlc3Npb24oKSwgbjIuZ2V0RXhwcmVzc2lvbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEyNTUpIG4xLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKQorICBMaW5lIDEyNTUpIG4yLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKQorICBMaW5lIDEyNjUpIG5vZGVFcXVhbHMobjEuZ2V0U2VsZWN0b3IoKSwgbjIuZ2V0U2VsZWN0b3IoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMjY1KSBuMS5nZXRTZWxlY3RvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5nZXRTZWxlY3RvcigpCisgIExpbmUgMTI2NSkgbjIuZ2V0U2VsZWN0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0U2VsZWN0b3IoKQorICBMaW5lIDEyNjkpIG5vZGVzRXF1YWxzKG4xLmdldEVudHJpZXMoKSwgbjIuZ2V0RW50cmllcygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDEyNjkpIG4xLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0RW50cmllcygpCisgIExpbmUgMTI2OSkgbjIuZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5nZXRFbnRyaWVzKCkKKyAgTGluZSAxMjc5KSBub2RlRXF1YWxzKG4xLmdldExhYmVsKCksIG4yLmdldExhYmVsKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTI3OSkgbjEuZ2V0TGFiZWwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRMYWJlbCgpCisgIExpbmUgMTI3OSkgbjIuZ2V0TGFiZWwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRMYWJlbCgpCisgIExpbmUgMTI4Mykgbm9kZXNFcXVhbHMobjEuZ2V0U3RtdHMoKSwgbjIuZ2V0U3RtdHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxMjgzKSBuMS5nZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldFN0bXRzKCkKKyAgTGluZSAxMjgzKSBuMi5nZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldFN0bXRzKCkKKyAgTGluZSAxMjkzKSBvYmpFcXVhbHMobjEuZ2V0SWQoKSwgbjIuZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm9iakVxdWFscyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyOTMpIG4xLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQuZ2V0SWQoKQorICBMaW5lIDEyOTMpIG4yLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQuZ2V0SWQoKQorICBMaW5lIDEzMDMpIG5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTMwMykgbjEuZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5nZXRFeHByKCkKKyAgTGluZSAxMzAzKSBuMi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10LmdldEV4cHIoKQorICBMaW5lIDEzMTMpIG5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzMTMpIG4xLmdldENvbmRpdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldENvbmRpdGlvbigpCisgIExpbmUgMTMxMykgbjIuZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAxMzE3KSBub2RlRXF1YWxzKG4xLmdldFRoZW5TdG10KCksIG4yLmdldFRoZW5TdG10KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTMxNykgbjEuZ2V0VGhlblN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRUaGVuU3RtdCgpCisgIExpbmUgMTMxNykgbjIuZ2V0VGhlblN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRUaGVuU3RtdCgpCisgIExpbmUgMTMyMSkgbm9kZUVxdWFscyhuMS5nZXRFbHNlU3RtdCgpLCBuMi5nZXRFbHNlU3RtdCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzMjEpIG4xLmdldEVsc2VTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0RWxzZVN0bXQoKQorICBMaW5lIDEzMjEpIG4yLmdldEVsc2VTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0RWxzZVN0bXQoKQorICBMaW5lIDEzMzEpIG5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzMzEpIG4xLmdldENvbmRpdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10LmdldENvbmRpdGlvbigpCisgIExpbmUgMTMzMSkgbjIuZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAxMzM1KSBub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzMzUpIG4xLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMzM1KSBuMi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTM0NSkgb2JqRXF1YWxzKG4xLmdldElkKCksIG4yLmdldElkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMzQ1KSBuMS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10LmdldElkKCkKKyAgTGluZSAxMzQ1KSBuMi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10LmdldElkKCkKKyAgTGluZSAxMzU1KSBub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzNTUpIG4xLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMzU1KSBuMi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTM1OSkgbm9kZUVxdWFscyhuMS5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTM1OSkgbjEuZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAxMzU5KSBuMi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdC5nZXRDb25kaXRpb24oKQorICBMaW5lIDEzNjkpIG5vZGVFcXVhbHMobjEuZ2V0VmFyaWFibGUoKSwgbjIuZ2V0VmFyaWFibGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMzY5KSBuMS5nZXRWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuZ2V0VmFyaWFibGUoKQorICBMaW5lIDEzNjkpIG4yLmdldFZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRWYXJpYWJsZSgpCisgIExpbmUgMTM3Mykgbm9kZUVxdWFscyhuMS5nZXRJdGVyYWJsZSgpLCBuMi5nZXRJdGVyYWJsZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzNzMpIG4xLmdldEl0ZXJhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRJdGVyYWJsZSgpCisgIExpbmUgMTM3MykgbjIuZ2V0SXRlcmFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldEl0ZXJhYmxlKCkKKyAgTGluZSAxMzc3KSBub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzNzcpIG4xLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldEJvZHkoKQorICBMaW5lIDEzNzcpIG4yLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldEJvZHkoKQorICBMaW5lIDEzODcpIG5vZGVzRXF1YWxzKG4xLmdldEluaXQoKSwgbjIuZ2V0SW5pdCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDEzODcpIG4xLmdldEluaXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0SW5pdCgpCisgIExpbmUgMTM4NykgbjIuZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRJbml0KCkKKyAgTGluZSAxMzkxKSBub2RlRXF1YWxzKG4xLmdldENvbXBhcmUoKSwgbjIuZ2V0Q29tcGFyZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDEzOTEpIG4xLmdldENvbXBhcmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Q29tcGFyZSgpCisgIExpbmUgMTM5MSkgbjIuZ2V0Q29tcGFyZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRDb21wYXJlKCkKKyAgTGluZSAxMzk1KSBub2Rlc0VxdWFscyhuMS5nZXRVcGRhdGUoKSwgbjIuZ2V0VXBkYXRlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTM5NSkgbjEuZ2V0VXBkYXRlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldFVwZGF0ZSgpCisgIExpbmUgMTM5NSkgbjIuZ2V0VXBkYXRlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldFVwZGF0ZSgpCisgIExpbmUgMTM5OSkgbm9kZUVxdWFscyhuMS5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxMzk5KSBuMS5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEJvZHkoKQorICBMaW5lIDEzOTkpIG4yLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTQwOSkgbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxNDA5KSBuMS5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQuZ2V0RXhwcigpCisgIExpbmUgMTQwOSkgbjIuZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10LmdldEV4cHIoKQorICBMaW5lIDE0MTkpIG5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTQxOSkgbjEuZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5nZXRFeHByKCkKKyAgTGluZSAxNDE5KSBuMi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LmdldEV4cHIoKQorICBMaW5lIDE0MjMpIG5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTQyMykgbjEuZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxNDIzKSBuMi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LmdldEJvZHkoKQorICBMaW5lIDE0MzMpIG5vZGVFcXVhbHMobjEuZ2V0VHJ5QmxvY2soKSwgbjIuZ2V0VHJ5QmxvY2soKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxNDMzKSBuMS5nZXRUcnlCbG9jaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRUcnlCbG9jaygpCisgIExpbmUgMTQzMykgbjIuZ2V0VHJ5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0VHJ5QmxvY2soKQorICBMaW5lIDE0MzcpIG5vZGVzRXF1YWxzKG4xLmdldENhdGNocygpLCBuMi5nZXRDYXRjaHMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxNDM3KSBuMS5nZXRDYXRjaHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0Q2F0Y2hzKCkKKyAgTGluZSAxNDM3KSBuMi5nZXRDYXRjaHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0Q2F0Y2hzKCkKKyAgTGluZSAxNDQxKSBub2Rlc0VxdWFscyhuMS5nZXRSZXNvdXJjZXMoKSwgbjIuZ2V0UmVzb3VyY2VzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2Rlc0VxdWFscyhqYXZhLnV0aWwuTGlzdDxUPiwgamF2YS51dGlsLkxpc3Q8VD4pCisgIExpbmUgMTQ0MSkgbjEuZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgMTQ0MSkgbjIuZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgMTQ0NSkgbm9kZUVxdWFscyhuMS5nZXRGaW5hbGx5QmxvY2soKSwgbjIuZ2V0RmluYWxseUJsb2NrKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTQ0NSkgbjEuZ2V0RmluYWxseUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldEZpbmFsbHlCbG9jaygpCisgIExpbmUgMTQ0NSkgbjIuZ2V0RmluYWxseUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldEZpbmFsbHlCbG9jaygpCisgIExpbmUgMTQ1NSkgbm9kZUVxdWFscyhuMS5nZXRQYXJhbSgpLCBuMi5nZXRQYXJhbSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDE0NTUpIG4xLmdldFBhcmFtKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5nZXRQYXJhbSgpCisgIExpbmUgMTQ1NSkgbjIuZ2V0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldFBhcmFtKCkKKyAgTGluZSAxNDU5KSBub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDE0NTkpIG4xLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldEJvZHkoKQorICBMaW5lIDE0NTkpIG4yLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldEJvZHkoKQorICBMaW5lIDE0NjkpIG5vZGVzRXF1YWxzKG4xLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE0NjkpIG4xLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpCisgIExpbmUgMTQ2OSkgbjIuZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAxNDcyKSBuMS5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpCisgIExpbmUgMTQ3MikgbjIuaXNQYXJhbWV0ZXJzRW5jbG9zZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuaXNQYXJhbWV0ZXJzRW5jbG9zZWQoKQorICBMaW5lIDE0NzUpIG5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5ub2RlRXF1YWxzKFQsIFQpCisgIExpbmUgMTQ3NSkgbjEuZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSAxNDc1KSBuMi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldEJvZHkoKQorICBMaW5lIDE0ODQpIG5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVFcXVhbHMoVCwgVCkKKyAgTGluZSAxNDg0KSBuMS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTQ4NCkgbjIuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDE0ODcpIG5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZXNFcXVhbHMoamF2YS51dGlsLkxpc3Q8VD4sIGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDE0ODcpIG4xLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTQ4NykgbjIuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxNDkwKSBvYmpFcXVhbHMobjEuZ2V0SWRlbnRpZmllcigpLCBuMi5nZXRJZGVudGlmaWVyKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuRXF1YWxzVmlzaXRvci5vYmpFcXVhbHMoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNDkwKSBuMS5nZXRJZGVudGlmaWVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldElkZW50aWZpZXIoKQorICBMaW5lIDE0OTApIG4yLmdldElkZW50aWZpZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0SWRlbnRpZmllcigpCisgIExpbmUgMTQ5OSkgbm9kZUVxdWFscyhuLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkVxdWFsc1Zpc2l0b3Iubm9kZUVxdWFscyhULCBUKQorICBMaW5lIDE0OTkpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTQ5OSkgbjIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTUwOCkgbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5FcXVhbHNWaXNpdG9yLm5vZGVzRXF1YWxzKGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuTGlzdDxUPikKKyAgTGluZSAxNTA4KSBuMS5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE1MDgpIG4yLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpci5nZXRBbm5vdGF0aW9ucygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0dlbmVyaWNWaXNpdG9yLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfR2VuZXJpY1Zpc2l0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0dlbmVyaWNWaXNpdG9yLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9HZW5lcmljVmlzaXRvckFkYXB0ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9HZW5lcmljVmlzaXRvckFkYXB0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWU4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX0dlbmVyaWNWaXNpdG9yQWRhcHRlci50eHQKQEAgLTAsMCArMSw0NTEgQEAKKyAgTGluZSA0MykgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA0NCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0NSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0NykgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTQpIG4uZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDU1KSBuLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSA1NykgbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2OSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA3MCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3MSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3MykgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODEpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4MSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgODYpIG4uZ2V0RGVmYXVsdFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkKKyAgTGluZSA4OCkgbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODgpIG4uZ2V0RGVmYXVsdFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkKKyAgTGluZSA5OSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMDEpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDEpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLmdldE5hbWUoKQorICBMaW5lIDEwNykgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDcpIG4uZ2V0SW5kZXgoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwci5nZXRJbmRleCgpCisgIExpbmUgMTE3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDExOSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExOSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRUeXBlKCkKKyAgTGluZSAxMjQpIG4uZ2V0TGV2ZWxzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRMZXZlbHMoKQorICBMaW5lIDEyNSkgbGV2ZWwuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTMwKSBuLmdldEluaXRpYWxpemVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRJbml0aWFsaXplcigpCisgIExpbmUgMTMxKSBuLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEzMSkgbi5nZXRJbml0aWFsaXplcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuZ2V0SW5pdGlhbGl6ZXIoKQorICBMaW5lIDE0MSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNDIpIG4uZ2V0VmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwci5nZXRWYWx1ZXMoKQorICBMaW5lIDE0Mykgbi5nZXRWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLmdldFZhbHVlcygpCisgIExpbmUgMTQ1KSBleHByLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNTcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTU5KSBuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1OSkgbi5nZXRDaGVjaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRDaGVjaygpCisgIExpbmUgMTY0KSBuLmdldE1lc3NhZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0TWVzc2FnZSgpCisgIExpbmUgMTY2KSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTY2KSBuLmdldE1lc3NhZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0TWVzc2FnZSgpCisgIExpbmUgMTc3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE3OSkgbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTc5KSBuLmdldFRhcmdldCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRUYXJnZXQoKQorICBMaW5lIDE4NSkgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxODUpIG4uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDE5NSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxOTcpIG4uZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxOTcpIG4uZ2V0TGVmdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRMZWZ0KCkKKyAgTGluZSAyMDMpIG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMjAzKSBuLmdldFJpZ2h0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldFJpZ2h0KCkKKyAgTGluZSAyMTMpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMjE0KSBuLmdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuZ2V0U3RtdHMoKQorICBMaW5lIDIxNSkgbi5nZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmdldFN0bXRzKCkKKyAgTGluZSAyMTcpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDIzMCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAyMzYpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMjQyKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDI0NCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDI0NCkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwci5nZXRUeXBlKCkKKyAgTGluZSAyNTApIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAyNTApIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0RXhwcigpCisgIExpbmUgMjYwKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDI2Mikgbi5nZXRQYXJhbSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMjYyKSBuLmdldFBhcmFtKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5nZXRQYXJhbSgpCisgIExpbmUgMjY4KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDI2OCkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5nZXRCb2R5KCkKKyAgTGluZSAyNzkpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMjg1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDI4Nykgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDI4Nykgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIuZ2V0VHlwZSgpCisgIExpbmUgMjk3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDI5OCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAyOTkpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMzAxKSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMDgpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMzA5KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDMxMSkgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMTgpIG4uZ2V0RXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZHMoKQorICBMaW5lIDMxOSkgbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0RXh0ZW5kcygpCisgIExpbmUgMzIxKSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMjkpIG4uZ2V0SW1wbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudHMoKQorICBMaW5lIDMzMCkgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgMzMyKSBjLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMzkpIG4uZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDM0MCkgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzQyKSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDM1NCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAzNTUpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDM1NikgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzYxKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMzYzKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDM2Mykgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKQorICBMaW5lIDM2OSkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAzNzApIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMzcxKSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzODIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMzgzKSBuLmdldFBhY2thZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpCisgIExpbmUgMzg1KSBuLmdldFBhY2thZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzODUpIG4uZ2V0UGFja2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCkKKyAgTGluZSAzOTEpIG4uZ2V0SW1wb3J0cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRJbXBvcnRzKCkKKyAgTGluZSAzOTIpIG4uZ2V0SW1wb3J0cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRJbXBvcnRzKCkKKyAgTGluZSAzOTQpIGkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA0MDEpIG4uZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDQwMikgbi5nZXRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpCisgIExpbmUgNDA0KSB0eXBlRGVjbGFyYXRpb24uYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDQxNikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA0MTgpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDQxOCkgbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRDb25kaXRpb24oKQorICBMaW5lIDQyNCkgbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA0MjQpIG4uZ2V0VGhlbkV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRUaGVuRXhwcigpCisgIExpbmUgNDMwKSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDQzMCkgbi5nZXRFbHNlRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldEVsc2VFeHByKCkKKyAgTGluZSA0NDApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNDQxKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDQ0Mikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA0NDQpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDQ1MSkgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgNDUyKSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA0NTQpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDYxKSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNDYyKSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNDY0KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDcxKSBuLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDQ3Mikgbi5nZXRUaHJvd3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA0NzQpIG5hbWUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDQ4Mikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA0ODIpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRCb2R5KCkKKyAgTGluZSA0OTIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNDk4KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDUwMCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDUwMCkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Qm9keSgpCisgIExpbmUgNTA2KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1MDYpIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSA1MTYpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNTIyKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDUyOCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA1MzQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNTQwKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDU0Mikgbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1NDIpIG4uZ2V0SW5uZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwci5nZXRJbm5lcigpCisgIExpbmUgNTUyKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDU1Mykgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA1NTQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNTU2KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1NjMpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QXJncygpCisgIExpbmUgNTY0KSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldEFyZ3MoKQorICBMaW5lIDU2NikgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTczKSBuLmdldENsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0Q2xhc3NCb2R5KCkKKyAgTGluZSA1NzQpIG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRDbGFzc0JvZHkoKQorICBMaW5lIDU3NikgbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1ODgpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNTg5KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDU5MCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA1OTIpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDU5OSkgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgNjAwKSBuLmdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRzKCkKKyAgTGluZSA2MDIpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDYwOSkgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0RW50cmllcygpCisgIExpbmUgNjEwKSBuLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRFbnRyaWVzKCkKKyAgTGluZSA2MTIpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDYxOSkgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgNjIwKSBuLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSA2MjIpIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjM0KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDYzNSkgbi5pc1RoaXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5pc1RoaXMoKQorICBMaW5lIDYzNSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0RXhwcigpCisgIExpbmUgNjM3KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjM3KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRFeHByKCkKKyAgTGluZSA2NDMpIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDY0NCkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgNjQ1KSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2NTEpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEFyZ3MoKQorICBMaW5lIDY1Mikgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0QXJncygpCisgIExpbmUgNjU0KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2NjYpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjY4KSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjY4KSBuLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKQorICBMaW5lIDY3OCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA2ODApIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjgwKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDY4Nikgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgNjg3KSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA2ODgpIHR5cGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDcwMCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA3MDEpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNzAyKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDcwNCkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzEyKSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDcxMikgbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNzE3KSBuLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDcxOSkgdmFyLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzMwKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDczMikgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3MzIpIG4uZ2V0VmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldFZhcmlhYmxlKCkKKyAgTGluZSA3MzgpIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzM4KSBuLmdldEl0ZXJhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRJdGVyYWJsZSgpCisgIExpbmUgNzQ0KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzQ0KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldEJvZHkoKQorICBMaW5lIDc1NCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA3NTUpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRJbml0KCkKKyAgTGluZSA3NTYpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRJbml0KCkKKyAgTGluZSA3NTgpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDc2NSkgbi5nZXRDb21wYXJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldENvbXBhcmUoKQorICBMaW5lIDc2Nykgbi5nZXRDb21wYXJlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDc2Nykgbi5nZXRDb21wYXJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldENvbXBhcmUoKQorICBMaW5lIDc3Mykgbi5nZXRVcGRhdGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0VXBkYXRlKCkKKyAgTGluZSA3NzQpIG4uZ2V0VXBkYXRlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldFVwZGF0ZSgpCisgIExpbmUgNzc2KSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3ODQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3ODQpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRCb2R5KCkKKyAgTGluZSA3OTQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNzk2KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3OTYpIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSA4MDIpIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODAyKSBuLmdldFRoZW5TdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0VGhlblN0bXQoKQorICBMaW5lIDgwNykgbi5nZXRFbHNlU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldEVsc2VTdG10KCkKKyAgTGluZSA4MDkpIG4uZ2V0RWxzZVN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODA5KSBuLmdldEVsc2VTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0RWxzZVN0bXQoKQorICBMaW5lIDgyMCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4MjIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4MjIpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDgzMikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4MzQpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDgzNCkgbi5nZXRCbG9jaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5nZXRCbG9jaygpCisgIExpbmUgODQ0KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDg0Nikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDg0Nikgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwci5nZXRFeHByKCkKKyAgTGluZSA4NTIpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4NTIpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgODYyKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDg2OCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4NzkpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgODgxKSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODgxKSBuLmdldFN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10LmdldFN0bXQoKQorICBMaW5lIDg5MSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4OTcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgOTAzKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDkwNSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkwNSkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSA5MTUpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgOTE3KSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkxNykgbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkKKyAgTGluZSA5MjcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgOTI4KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgOTMwKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkzMCkgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDkzNikgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA5MzcpIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgOTM4KSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA5NDQpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0QXJncygpCisgIExpbmUgOTQ1KSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3MoKQorICBMaW5lIDk0NykgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgOTU5KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDk2MCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA5NjEpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgOTYzKSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA5NzApIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA5NzEpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA5NzMpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgOTgxKSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDk4MSkgbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDk4Nikgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA5ODcpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgOTg5KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgOTk2KSBuLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA5OTcpIG4uZ2V0VGhyb3dzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDk5OSkgbmFtZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTAwNikgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCkKKyAgTGluZSAxMDA4KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEwMDgpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpCisgIExpbmUgMTAxOSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMDI1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEwMjcpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDI3KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDEwMzIpIG4uZ2V0UGFpcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLmdldFBhaXJzKCkKKyAgTGluZSAxMDMzKSBuLmdldFBhaXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwci5nZXRQYWlycygpCisgIExpbmUgMTAzNSkgbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEwNDcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTA1MykgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMDU0KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDEwNTYpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTA1Nikgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFNjb3BlKCkKKyAgTGluZSAxMDYyKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMDYzKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMDY0KSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDcxKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTA3MSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTA3Nikgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJncygpCisgIExpbmUgMTA3Nykgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJncygpCisgIExpbmUgMTA3OSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTA4Nikgbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKQorICBMaW5lIDEwODcpIG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkKKyAgTGluZSAxMDg5KSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExMDEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTEwMikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTEwMykgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTEwNSkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTExMykgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExMTMpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxMTIzKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDExMjQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTEyNSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxMTI3KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMTM1KSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExMzUpIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTE0MSkgbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMTQxKSBuLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0SWQoKQorICBMaW5lIDExNTEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTE1Mikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTE1MykgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTE2MykgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMTY1KSBuLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMTY1KSBuLmdldFF1YWxpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIuZ2V0UXVhbGlmaWVyKCkKKyAgTGluZSAxMTc1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDExNzYpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDExNzcpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExODMpIG4uZ2V0Q29tcG9uZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMTgzKSBuLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSAxMTkzKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDExOTQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDExOTUpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEyMDEpIG4uZ2V0RGltZW5zaW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsLmdldERpbWVuc2lvbigpCisgIExpbmUgMTIwMikgbi5nZXREaW1lbnNpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTIwMikgbi5nZXREaW1lbnNpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0RGltZW5zaW9uKCkKKyAgTGluZSAxMjEzKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEyMTQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDEyMTUpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEyMjEpIG4uZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKQorICBMaW5lIDEyMjIpIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEyMzMpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTIzNCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZS5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTIzNSkgYS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTI0MSkgbi5nZXRFbGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlLmdldEVsZW1lbnRzKCkKKyAgTGluZSAxMjQyKSBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMjUzKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEyNTQpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5nZXRFeHByKCkKKyAgTGluZSAxMjU2KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTI1Nikgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10LmdldEV4cHIoKQorICBMaW5lIDEyNjcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTI2OSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEyNjkpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTI3NSkgbi5nZXRNZW1iZXJWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMjc1KSBuLmdldE1lbWJlclZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci5nZXRNZW1iZXJWYWx1ZSgpCisgIExpbmUgMTI4NSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMjkxKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEyOTIpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdXBlckV4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAxMjk0KSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMjk0KSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgMTMwNSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMzA2KSBuLmdldExhYmVsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuZ2V0TGFiZWwoKQorICBMaW5lIDEzMDgpIG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTMwOCkgbi5nZXRMYWJlbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldExhYmVsKCkKKyAgTGluZSAxMzE0KSBuLmdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuZ2V0U3RtdHMoKQorICBMaW5lIDEzMTUpIG4uZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRTdG10cygpCisgIExpbmUgMTMxNykgcy5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTMyOSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMzMxKSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEzMzEpIG4uZ2V0U2VsZWN0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0U2VsZWN0b3IoKQorICBMaW5lIDEzMzYpIG4uZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5nZXRFbnRyaWVzKCkKKyAgTGluZSAxMzM3KSBuLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0RW50cmllcygpCisgIExpbmUgMTMzOSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEzNTIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTM1NCkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LmdldEV4cHIoKQorICBMaW5lIDEzNTUpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMzU1KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQuZ2V0RXhwcigpCisgIExpbmUgMTM2Mikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMzYyKSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTM3MikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMzczKSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAxMzc1KSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMzc1KSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAxMzg2KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEzODgpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMzg4KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdC5nZXRFeHByKCkKKyAgTGluZSAxMzk4KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEzOTkpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgMTQwMCkgbi5nZXRSZXNvdXJjZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0UmVzb3VyY2VzKCkKKyAgTGluZSAxNDAyKSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNDEwKSBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNDEwKSBuLmdldFRyeUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFRyeUJsb2NrKCkKKyAgTGluZSAxNDE1KSBuLmdldENhdGNocygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRDYXRjaHMoKQorICBMaW5lIDE0MTYpIG4uZ2V0Q2F0Y2hzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldENhdGNocygpCisgIExpbmUgMTQxOCkgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTQyNSkgbi5nZXRGaW5hbGx5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkKKyAgTGluZSAxNDI3KSBuLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTQyNykgbi5nZXRGaW5hbGx5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkKKyAgTGluZSAxNDM4KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE0NDApIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE0NDApIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10LmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTQ1MCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNDUxKSBuLmdldFR5cGVCb3VuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXRUeXBlQm91bmQoKQorICBMaW5lIDE0NTIpIG4uZ2V0VHlwZUJvdW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldFR5cGVCb3VuZCgpCisgIExpbmUgMTQ1NCkgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTQ2NikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNDY4KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTQ2OCkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuZ2V0RXhwcigpCisgIExpbmUgMTQ3OCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNDg0KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE0ODUpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxNDg2KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNDkyKSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE0OTIpIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSAxNDk3KSBuLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAxNDk5KSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTUxMCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNTEyKSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1MTIpIG4uZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJZCgpCisgIExpbmUgMTUxNykgbi5nZXRJbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0SW5pdCgpCisgIExpbmUgMTUxOSkgbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1MTkpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDE1MzApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTUzNikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNTM3KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxNTM4KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNTQ4KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE1NTApIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1NTApIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAxNTU2KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTU1Nikgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Qm9keSgpCisgIExpbmUgMTU2NikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNTY3KSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxNTY4KSBhLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNTczKSBuLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRFeHRlbmRzKCkKKyAgTGluZSAxNTc1KSBuLmdldEV4dGVuZHMoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTU3NSkgbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kcygpCisgIExpbmUgMTU4MSkgbi5nZXRTdXBlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLmdldFN1cGVyKCkKKyAgTGluZSAxNTgzKSBuLmdldFN1cGVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1ODMpIG4uZ2V0U3VwZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRTdXBlcigpCisgIExpbmUgMTU5NCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNTk1KSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpCisgIExpbmUgMTU5Nikgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDE1OTcpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNjAzKSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0Qm9keSgpCisgIExpbmUgMTYwNCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE2MDQpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSAxNjE0KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE2MTYpIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxNjE3KSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTYxOCkgdHlwZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTYyNSkgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTYyNikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNjI2KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxNjM2KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE2MzcpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTYzOCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE2MzgpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTY0OCkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE2NTApIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE2NzApIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTY3MSkgbi5nZXRDb21tZW50KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE2NzEpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTY3Mykgbi5zZXRDb21tZW50KHJlc3VsdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfTW9kaWZpZXJWaXNpdG9yQWRhcHRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX01vZGlmaWVyVmlzaXRvckFkYXB0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZmYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX01vZGlmaWVyVmlzaXRvckFkYXB0ZXIudHh0CkBAIC0wLDAgKzEsNjg1IEBACisgIExpbmUgMTIwKSBsaXN0LnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTIxKSBsaXN0LmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMjIpIGxpc3QucmVtb3ZlKGkpID09PiBqYXZhLnV0aWwuTGlzdC5yZW1vdmUoaW50KQorICBMaW5lIDEyOCkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgMTI5KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMzApIG4uZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDEzMikgbWVtYmVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDEzMykgbWVtYmVycy5zZXQoaSwgKEJvZHlEZWNsYXJhdGlvbjw/PikgbWVtYmVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDEzMykgbWVtYmVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEzMykgbWVtYmVycy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTM1KSByZW1vdmVOdWxscyhtZW1iZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgMTQxKSBuLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnMuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE0MykgYW5ub3RhdGlvbnMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxNDQpIGFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMTQ0KSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE0NCkgYW5ub3RhdGlvbnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDE0NikgcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSAxNTEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE1Mikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxNTQpIGFubm90YXRpb25zLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTU1KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDE1NSkgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNTUpIGFubm90YXRpb25zLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxNTcpIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgMTU5KSBuLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDE1OSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1OSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMTYwKSBuLmdldERlZmF1bHRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldERlZmF1bHRWYWx1ZSgpCisgIExpbmUgMTYxKSBuLnNldERlZmF1bHRWYWx1ZSgoRXhwcmVzc2lvbikgbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uc2V0RGVmYXVsdFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDE2MSkgbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTYxKSBuLmdldERlZmF1bHRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldERlZmF1bHRWYWx1ZSgpCisgIExpbmUgMTY3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxNjgpIG4uc2V0TmFtZSgoRXhwcmVzc2lvbikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMTY4KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTY4KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwci5nZXROYW1lKCkKKyAgTGluZSAxNjkpIG4uc2V0SW5kZXgoKEV4cHJlc3Npb24pIG4uZ2V0SW5kZXgoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuc2V0SW5kZXgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMTY5KSBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE2OSkgbi5nZXRJbmRleCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLmdldEluZGV4KCkKKyAgTGluZSAxNzQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE3NSkgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDE3NSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE3NSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRUeXBlKCkKKyAgTGluZSAxNzcpIG4uZ2V0TGV2ZWxzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRMZXZlbHMoKQorICBMaW5lIDE3OCkgdmFsdWVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTc5KSB2YWx1ZXMuc2V0KGksIChBcnJheUNyZWF0aW9uTGV2ZWwpIHZhbHVlcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDE3OSkgdmFsdWVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxNzkpIHZhbHVlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTgxKSByZW1vdmVOdWxscyh2YWx1ZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSAxODMpIG4uZ2V0SW5pdGlhbGl6ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldEluaXRpYWxpemVyKCkKKyAgTGluZSAxODQpIG4uc2V0SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBuLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuc2V0SW5pdGlhbGl6ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByKQorICBMaW5lIDE4NCkgbi5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxODQpIG4uZ2V0SW5pdGlhbGl6ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldEluaXRpYWxpemVyKCkKKyAgTGluZSAxOTApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDE5MSkgbi5nZXRWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLmdldFZhbHVlcygpCisgIExpbmUgMTkyKSBuLmdldFZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuZ2V0VmFsdWVzKCkKKyAgTGluZSAxOTQpIHZhbHVlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE5NSkgdmFsdWVzLnNldChpLCAoRXhwcmVzc2lvbikgdmFsdWVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMTk1KSB2YWx1ZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxOTUpIHZhbHVlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTk3KSByZW1vdmVOdWxscyh2YWx1ZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSAyMDQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDIwNSkgbi5zZXRDaGVjaygoRXhwcmVzc2lvbikgbi5nZXRDaGVjaygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuc2V0Q2hlY2soY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMjA1KSBuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDIwNSkgbi5nZXRDaGVjaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRDaGVjaygpCisgIExpbmUgMjA2KSBuLmdldE1lc3NhZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0TWVzc2FnZSgpCisgIExpbmUgMjA3KSBuLnNldE1lc3NhZ2UoKEV4cHJlc3Npb24pIG4uZ2V0TWVzc2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuc2V0TWVzc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSAyMDcpIG4uZ2V0TWVzc2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAyMDcpIG4uZ2V0TWVzc2FnZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRNZXNzYWdlKCkKKyAgTGluZSAyMTMpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDIxNCkgbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMjE0KSBuLmdldFRhcmdldCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRUYXJnZXQoKQorICBMaW5lIDIxOCkgbi5zZXRUYXJnZXQodGFyZ2V0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuc2V0VGFyZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDIyMCkgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAyMjApIG4uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFzc2lnbkV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDIyNCkgbi5zZXRWYWx1ZSh2YWx1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLnNldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDIzMCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMjMxKSBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMjMxKSBuLmdldExlZnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0TGVmdCgpCisgIExpbmUgMjMyKSBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDIzMikgbi5nZXRSaWdodCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRSaWdodCgpCisgIExpbmUgMjM5KSBuLnNldExlZnQobGVmdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLnNldExlZnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMjQwKSBuLnNldFJpZ2h0KHJpZ2h0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuc2V0UmlnaHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMjQ1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAyNDYpIG4uZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5nZXRTdG10cygpCisgIExpbmUgMjQ4KSBzdG10cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDI0OSkgc3RtdHMuc2V0KGksIChTdGF0ZW1lbnQpIHN0bXRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMjQ5KSBzdG10cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDI0OSkgc3RtdHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDI1MSkgcmVtb3ZlTnVsbHMoc3RtdHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSAyNTcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDI2MikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMjY3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAyNjgpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAyNjgpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMjY5KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMjY5KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLmdldEV4cHIoKQorICBMaW5lIDI3Nikgbi5zZXRUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAyNzcpIG4uc2V0RXhwcihleHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMjgyKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAyODMpIG4uc2V0UGFyYW0oKFBhcmFtZXRlcikgbi5nZXRQYXJhbSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLnNldFBhcmFtKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpCisgIExpbmUgMjgzKSBuLmdldFBhcmFtKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAyODMpIG4uZ2V0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldFBhcmFtKCkKKyAgTGluZSAyODQpIG4uc2V0Qm9keSgoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgMjg0KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDI4NCkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5nZXRCb2R5KCkKKyAgTGluZSAyOTApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDI5NSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMjk2KSBuLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDI5Nikgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDI5Nikgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIuZ2V0VHlwZSgpCisgIExpbmUgMzAxKSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSAzMDIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDMwMykgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAzMDUpIHR5cGVQYXJhbWV0ZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzA2KSB0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMzA2KSB0eXBlUGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzA2KSB0eXBlUGFyYW1ldGVycy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMzA4KSByZW1vdmVOdWxscyh0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDMxMCkgbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0RXh0ZW5kcygpCisgIExpbmUgMzEyKSBleHRlbmR6LnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzEzKSBleHRlbmR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGV4dGVuZHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAzMTMpIGV4dGVuZHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMTMpIGV4dGVuZHouZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDMxNSkgcmVtb3ZlTnVsbHMoZXh0ZW5keikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDMxNykgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgMzE5KSBpbXBsZW1lbnR6LnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzIwKSBpbXBsZW1lbnR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGltcGxlbWVudHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAzMjApIGltcGxlbWVudHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMjApIGltcGxlbWVudHouZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDMyMikgcmVtb3ZlTnVsbHMoaW1wbGVtZW50eikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDMyNCkgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzI2KSBtZW1iZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzI3KSBtZW1iZXJzLnNldChpLCAoQm9keURlY2xhcmF0aW9uPD8+KSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMzI3KSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzI3KSBtZW1iZXJzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzMjkpIHJlbW92ZU51bGxzKG1lbWJlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSAzMzUpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDMzNikgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgMzM3KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMzM4KSBuLnNldFNjb3BlKChDbGFzc09ySW50ZXJmYWNlVHlwZSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLnNldFNjb3BlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSkKKyAgTGluZSAzMzgpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzM4KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMzQwKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDM0MikgdHlwZUFyZ3VtZW50cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDM0MykgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGU8Pz4pIHR5cGVBcmd1bWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAzNDMpIHR5cGVBcmd1bWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzNDMpIHR5cGVBcmd1bWVudHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDM0NSkgcmVtb3ZlTnVsbHModHlwZUFyZ3VtZW50cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDM1MSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMzUyKSBuLmdldFBhY2thZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpCisgIExpbmUgMzUzKSBuLnNldFBhY2thZ2UoKFBhY2thZ2VEZWNsYXJhdGlvbikgbi5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5zZXRQYWNrYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uKQorICBMaW5lIDM1Mykgbi5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzUzKSBuLmdldFBhY2thZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpCisgIExpbmUgMzU1KSBuLmdldEltcG9ydHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0SW1wb3J0cygpCisgIExpbmUgMzU3KSBpbXBvcnRzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzU4KSBpbXBvcnRzLnNldChpLCAoSW1wb3J0RGVjbGFyYXRpb24pIGltcG9ydHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAzNTgpIGltcG9ydHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzU4KSBpbXBvcnRzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzNjApIHJlbW92ZU51bGxzKGltcG9ydHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSAzNjIpIG4uZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDM2NCkgdHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzNjUpIHR5cGVzLnNldChpLCAoVHlwZURlY2xhcmF0aW9uPD8+KSB0eXBlcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDM2NSkgdHlwZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzNjUpIHR5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzNjcpIHJlbW92ZU51bGxzKHR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgMzczKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAzNzQpIG4uc2V0Q29uZGl0aW9uKChFeHByZXNzaW9uKSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5zZXRDb25kaXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMzc0KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzNzQpIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAzNzUpIG4uc2V0VGhlbkV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuc2V0VGhlbkV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMzc1KSBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDM3NSkgbi5nZXRUaGVuRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldFRoZW5FeHByKCkKKyAgTGluZSAzNzYpIG4uc2V0RWxzZUV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RWxzZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuc2V0RWxzZUV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMzc2KSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDM3Nikgbi5nZXRFbHNlRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldEVsc2VFeHByKCkKKyAgTGluZSAzODEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDM4Mikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAzODQpIGFubm90YXRpb25zLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzg1KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDM4NSkgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzODUpIGFubm90YXRpb25zLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzODcpIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgMzg5KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAzOTEpIHR5cGVQYXJhbWV0ZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzkyKSB0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMzkyKSB0eXBlUGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzkyKSB0eXBlUGFyYW1ldGVycy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMzk0KSByZW1vdmVOdWxscyh0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDM5Nikgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDM5OCkgcGFyYW1ldGVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDM5OSkgcGFyYW1ldGVycy5zZXQoaSwgKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDM5OSkgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzOTkpIHBhcmFtZXRlcnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDQwMSkgcmVtb3ZlTnVsbHMocGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDQwMykgbi5nZXRUaHJvd3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA0MDUpIHRocm93ei5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDQwNikgdGhyb3d6LnNldChpLCAoUmVmZXJlbmNlVHlwZSkgdGhyb3d6LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgNDA2KSB0aHJvd3ouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA0MDYpIHRocm93ei5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNDA4KSByZW1vdmVOdWxscyh0aHJvd3opID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA0MTApIG4uc2V0Qm9keSgoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA0MTApIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDEwKSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0Qm9keSgpCisgIExpbmUgNDE1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA0MjApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDQyMSkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDQyMSkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Qm9keSgpCisgIExpbmUgNDI1KSBuLnNldEJvZHkoYm9keSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDQyNykgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDI3KSBuLmdldENvbmRpdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LmdldENvbmRpdGlvbigpCisgIExpbmUgNDMxKSBuLnNldENvbmRpdGlvbihjb25kaXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10LnNldENvbmRpdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA0MzcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDQ0MikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNDQ3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA0NTIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDQ1NykgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNDU4KSBuLnNldElubmVyKChFeHByZXNzaW9uKSBuLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLnNldElubmVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDQ1OCkgbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA0NTgpIG4uZ2V0SW5uZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwci5nZXRJbm5lcigpCisgIExpbmUgNDYzKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA0NjQpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNDY2KSBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDQ2NykgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA0NjcpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDY3KSBhbm5vdGF0aW9ucy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNDY5KSByZW1vdmVOdWxscyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDQ3MSkgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRBcmdzKCkKKyAgTGluZSA0NzMpIGFyZ3Muc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0NzQpIGFyZ3Muc2V0KGksIChFeHByZXNzaW9uKSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgNDc0KSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDc0KSBhcmdzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA0NzYpIHJlbW92ZU51bGxzKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA0NzgpIG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRDbGFzc0JvZHkoKQorICBMaW5lIDQ4MCkgY2xhc3NCb2R5LnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNDgxKSBjbGFzc0JvZHkuc2V0KGksIChCb2R5RGVjbGFyYXRpb248Pz4pIGNsYXNzQm9keS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDQ4MSkgY2xhc3NCb2R5LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDgxKSBjbGFzc0JvZHkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDQ4MykgcmVtb3ZlTnVsbHMoY2xhc3NCb2R5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNDg5KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA0OTApIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgNDkyKSBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDQ5MykgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA0OTMpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNDkzKSBhbm5vdGF0aW9ucy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNDk1KSByZW1vdmVOdWxscyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDQ5Nykgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgNDk5KSBpbXBsZW1lbnR6LnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNTAwKSBpbXBsZW1lbnR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGltcGxlbWVudHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA1MDApIGltcGxlbWVudHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1MDApIGltcGxlbWVudHouZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDUwMikgcmVtb3ZlTnVsbHMoaW1wbGVtZW50eikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDUwNCkgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0RW50cmllcygpCisgIExpbmUgNTA2KSBlbnRyaWVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNTA3KSBlbnRyaWVzLnNldChpLCAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIGVudHJpZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA1MDcpIGVudHJpZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1MDcpIGVudHJpZXMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDUwOSkgcmVtb3ZlTnVsbHMoZW50cmllcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDUxMSkgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgNTEzKSBtZW1iZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNTE0KSBtZW1iZXJzLnNldChpLCAoQm9keURlY2xhcmF0aW9uPD8+KSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgNTE0KSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTE0KSBtZW1iZXJzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA1MTYpIHJlbW92ZU51bGxzKG1lbWJlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA1MjIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDUyMykgbi5pc1RoaXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5pc1RoaXMoKQorICBMaW5lIDUyMykgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0RXhwcigpCisgIExpbmUgNTI0KSBuLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDUyNCkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDUyNCkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0RXhwcigpCisgIExpbmUgNTI2KSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA1MjgpIHR5cGVBcmd1bWVudHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA1MjkpIHR5cGVBcmd1bWVudHMuc2V0KGksIChUeXBlPD8+KSB0eXBlQXJndW1lbnRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgNTI5KSB0eXBlQXJndW1lbnRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTI5KSB0eXBlQXJndW1lbnRzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA1MzEpIHJlbW92ZU51bGxzKHR5cGVBcmd1bWVudHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA1MzMpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEFyZ3MoKQorICBMaW5lIDUzNSkgYXJncy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDUzNikgYXJncy5zZXQoaSwgKEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA1MzYpIGFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1MzYpIGFyZ3MuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDUzOCkgcmVtb3ZlTnVsbHMoYXJncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDU0NCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNTQ1KSBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTQ1KSBuLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKQorICBMaW5lIDU0OSkgbi5zZXRFeHByZXNzaW9uKGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQuc2V0RXhwcmVzc2lvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1NTQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDU1NSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1NTUpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgNTU5KSBuLnNldFNjb3BlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1NjQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDU2NSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA1NjcpIGFubm90YXRpb25zLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNTY4KSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDU2OCkgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1NjgpIGFubm90YXRpb25zLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA1NzApIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNTcyKSBuLnNldEVsZW1lbnRUeXBlKChUeXBlKSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA1NzIpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTcyKSBuLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSA1NzMpIG4uZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgNTc0KSB2YXJpYWJsZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA1NzUpIHZhcmlhYmxlcy5zZXQoaSwgKFZhcmlhYmxlRGVjbGFyYXRvcikgdmFyaWFibGVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgNTc1KSB2YXJpYWJsZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTc1KSB2YXJpYWJsZXMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDU3NykgcmVtb3ZlTnVsbHModmFyaWFibGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNTgyKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA1ODMpIG4uc2V0VmFyaWFibGUoKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSBuLmdldFZhcmlhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuc2V0VmFyaWFibGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByKQorICBMaW5lIDU4Mykgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1ODMpIG4uZ2V0VmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldFZhcmlhYmxlKCkKKyAgTGluZSA1ODQpIG4uc2V0SXRlcmFibGUoKEV4cHJlc3Npb24pIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5zZXRJdGVyYWJsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA1ODQpIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTg0KSBuLmdldEl0ZXJhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRJdGVyYWJsZSgpCisgIExpbmUgNTg1KSBuLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDU4NSkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDU4NSkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRCb2R5KCkKKyAgTGluZSA1OTApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDU5MSkgbi5nZXRJbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEluaXQoKQorICBMaW5lIDU5MykgaW5pdC5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDU5NCkgaW5pdC5zZXQoaSwgKEV4cHJlc3Npb24pIGluaXQuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA1OTQpIGluaXQuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA1OTQpIGluaXQuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDU5NikgcmVtb3ZlTnVsbHMoaW5pdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDU5OCkgbi5nZXRDb21wYXJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldENvbXBhcmUoKQorICBMaW5lIDU5OSkgbi5zZXRDb21wYXJlKChFeHByZXNzaW9uKSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LnNldENvbXBhcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNTk5KSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNTk5KSBuLmdldENvbXBhcmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Q29tcGFyZSgpCisgIExpbmUgNjAxKSBuLmdldFVwZGF0ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRVcGRhdGUoKQorICBMaW5lIDYwMykgdXBkYXRlLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNjA0KSB1cGRhdGUuc2V0KGksIChFeHByZXNzaW9uKSB1cGRhdGUuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA2MDQpIHVwZGF0ZS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDYwNCkgdXBkYXRlLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA2MDYpIHJlbW92ZU51bGxzKHVwZGF0ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDYwOCkgbi5zZXRCb2R5KChTdGF0ZW1lbnQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDYwOCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDYwOCkgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEJvZHkoKQorICBMaW5lIDYxMykgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjE1KSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2MTUpIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSA2MTkpIG4uc2V0Q29uZGl0aW9uKGNvbmRpdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQuc2V0Q29uZGl0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDYyMCkgbi5nZXRUaGVuU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2MjApIG4uZ2V0VGhlblN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRUaGVuU3RtdCgpCisgIExpbmUgNjI3KSBuLnNldFRoZW5TdG10KHRoZW5TdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5zZXRUaGVuU3RtdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDYyOCkgbi5nZXRFbHNlU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldEVsc2VTdG10KCkKKyAgTGluZSA2MjkpIG4uc2V0RWxzZVN0bXQoKFN0YXRlbWVudCkgbi5nZXRFbHNlU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5zZXRFbHNlU3RtdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDYyOSkgbi5nZXRFbHNlU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2MjkpIG4uZ2V0RWxzZVN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRFbHNlU3RtdCgpCisgIExpbmUgNjM1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA2MzYpIG4uc2V0TmFtZSgoTmFtZUV4cHIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA2MzYpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2MzYpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDY0MSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjQyKSBuLnNldEJsb2NrKChCbG9ja1N0bXQpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLnNldEJsb2NrKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQpCisgIExpbmUgNjQyKSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2NDIpIG4uZ2V0QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb24uZ2V0QmxvY2soKQorICBMaW5lIDY0NykgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjQ4KSBuLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLnNldEV4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNjQ4KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjQ4KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLmdldEV4cHIoKQorICBMaW5lIDY0OSkgbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDY0OSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDY0OSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwci5nZXRUeXBlKCkKKyAgTGluZSA2NTQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDY1OSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjY4KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA2NjkpIG4uc2V0U3RtdCgoU3RhdGVtZW50KSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5zZXRTdG10KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNjY5KSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjY5KSBuLmdldFN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10LmdldFN0bXQoKQorICBMaW5lIDY3NCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjc5KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA2ODQpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDY4NSkgbi5zZXROYW1lKChOYW1lRXhwcikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuc2V0TmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIpCisgIExpbmUgNjg1KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjg1KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDY5MCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNjkxKSBuLnNldFZhbHVlKChFeHByZXNzaW9uKSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLnNldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDY5MSkgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA2OTEpIG4uZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpCisgIExpbmUgNjk2KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA2OTcpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSA2OTgpIG4uc2V0U2NvcGUoKEV4cHJlc3Npb24pIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA2OTgpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNjk4KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgNzAwKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDcwMikgdHlwZUFyZ3VtZW50cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDcwMykgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGU8Pz4pIHR5cGVBcmd1bWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA3MDMpIHR5cGVBcmd1bWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3MDMpIHR5cGVBcmd1bWVudHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDcwNSkgcmVtb3ZlTnVsbHModHlwZUFyZ3VtZW50cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDcwNykgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmdzKCkKKyAgTGluZSA3MDkpIGFyZ3Muc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA3MTApIGFyZ3Muc2V0KGksIChFeHByZXNzaW9uKSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgNzEwKSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzEwKSBhcmdzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA3MTIpIHJlbW92ZU51bGxzKGFyZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA3MTgpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDcxOSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkKKyAgTGluZSA3MjEpIGFubm90YXRpb25zLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNzIyKSBhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDcyMikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3MjIpIGFubm90YXRpb25zLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA3MjQpIHJlbW92ZU51bGxzKGFubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNzI2KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgNzI4KSB0eXBlUGFyYW1ldGVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDcyOSkgdHlwZVBhcmFtZXRlcnMuc2V0KGksIChUeXBlUGFyYW1ldGVyKSB0eXBlUGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDcyOSkgdHlwZVBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDcyOSkgdHlwZVBhcmFtZXRlcnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDczMSkgcmVtb3ZlTnVsbHModHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA3MzMpIG4uc2V0RWxlbWVudFR5cGUoKFR5cGUpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSA3MzMpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzMzKSBuLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNzM0KSBuLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDczNikgcGFyYW1ldGVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDczNykgcGFyYW1ldGVycy5zZXQoaSwgKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDczNykgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3MzcpIHBhcmFtZXRlcnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDczOSkgcmVtb3ZlTnVsbHMocGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDc0MSkgbi5nZXRUaHJvd3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93cygpCisgIExpbmUgNzQzKSB0aHJvd3ouc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA3NDQpIHRocm93ei5zZXQoaSwgKFJlZmVyZW5jZVR5cGUpIHRocm93ei5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDc0NCkgdGhyb3d6LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzQ0KSB0aHJvd3ouZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDc0NikgcmVtb3ZlTnVsbHModGhyb3d6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNzQ4KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDc0OSkgbi5zZXRCb2R5KChCbG9ja1N0bXQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLnNldEJvZHkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA3NDkpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzQ5KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDc1NSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNzYwKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA3NjEpIG4uc2V0TmFtZSgoTmFtZUV4cHIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLnNldE5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDc2MSkgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDc2MSkgbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSA3NjIpIG4uZ2V0UGFpcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByLmdldFBhaXJzKCkKKyAgTGluZSA3NjQpIHBhaXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNzY1KSBwYWlycy5zZXQoaSwgKE1lbWJlclZhbHVlUGFpcikgcGFpcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA3NjUpIHBhaXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDc2NSkgcGFpcnMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDc2NykgcmVtb3ZlTnVsbHMocGFpcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA3NzMpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDc3OCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgNzc5KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDc4MCkgbi5zZXRTY29wZSgoRXhwcmVzc2lvbikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSA3ODApIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgNzgwKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDc4Mikgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgNzg0KSB0eXBlQXJndW1lbnRzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNzg1KSB0eXBlQXJndW1lbnRzLnNldChpLCAoVHlwZTw/PikgdHlwZUFyZ3VtZW50cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDc4NSkgdHlwZUFyZ3VtZW50cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDc4NSkgdHlwZUFyZ3VtZW50cy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNzg3KSByZW1vdmVOdWxscyh0eXBlQXJndW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNzg5KSBuLnNldFR5cGUoKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuc2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTw/PikKKyAgTGluZSA3ODkpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA3ODkpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDc5MCkgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJncygpCisgIExpbmUgNzkyKSBhcmdzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNzkzKSBhcmdzLnNldChpLCAoRXhwcmVzc2lvbikgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDc5MykgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDc5MykgYXJncy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNzk1KSByZW1vdmVOdWxscyhhcmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgNzk3KSBuLmdldEFub255bW91c0NsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFub255bW91c0NsYXNzQm9keSgpCisgIExpbmUgNzk5KSBhbm9ueW1vdXNDbGFzc0JvZHkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA4MDApIGFub255bW91c0NsYXNzQm9keS5zZXQoaSwgKEJvZHlEZWNsYXJhdGlvbjw/PikgYW5vbnltb3VzQ2xhc3NCb2R5LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgODAwKSBhbm9ueW1vdXNDbGFzc0JvZHkuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4MDApIGFub255bW91c0NsYXNzQm9keS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgODAyKSByZW1vdmVOdWxscyhhbm9ueW1vdXNDbGFzc0JvZHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA4MDgpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDgwOSkgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgODExKSBhbm5vdGF0aW9ucy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDgxMikgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA4MTIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODEyKSBhbm5vdGF0aW9ucy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgODE0KSByZW1vdmVOdWxscyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDgxNikgbi5zZXROYW1lKChOYW1lRXhwcikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA4MTYpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4MTYpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA4MjEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDgyMikgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgODIzKSBuLnNldElkKChWYXJpYWJsZURlY2xhcmF0b3JJZCkgbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5zZXRJZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQpCisgIExpbmUgODIzKSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDgyMykgbi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldElkKCkKKyAgTGluZSA4MjQpIG4uc2V0RWxlbWVudFR5cGUoKFR5cGUpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuc2V0RWxlbWVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgODI0KSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDgyNCkgbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSA4MjkpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDgzMCkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgODM1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4MzYpIG4uc2V0UXVhbGlmaWVyKChOYW1lRXhwcikgbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5RdWFsaWZpZWROYW1lRXhwci5zZXRRdWFsaWZpZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByKQorICBMaW5lIDgzNikgbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODM2KSBuLmdldFF1YWxpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHIuZ2V0UXVhbGlmaWVyKCkKKyAgTGluZSA4NDIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDg0MykgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgODQ0KSBuLnNldENvbXBvbmVudFR5cGUoKFR5cGUpIG4uZ2V0Q29tcG9uZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5zZXRDb21wb25lbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDg0NCkgbi5nZXRDb21wb25lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDg0NCkgbi5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgODUwKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4NTEpIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDg1Mikgbi5nZXREaW1lbnNpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0RGltZW5zaW9uKCkKKyAgTGluZSA4NTMpIG4uc2V0RGltZW5zaW9uKChFeHByZXNzaW9uKSBuLmdldERpbWVuc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuc2V0RGltZW5zaW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDg1Mykgbi5nZXREaW1lbnNpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODUzKSBuLmdldERpbWVuc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbC5nZXREaW1lbnNpb24oKQorICBMaW5lIDg2MCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgODYxKSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSA4NjIpIG4uZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKQorICBMaW5lIDg2NCkgZWxlbWVudHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA4NjUpIGVsZW1lbnRzLnNldChpLCAoUmVmZXJlbmNlVHlwZSkgZWxlbWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA4NjUpIGVsZW1lbnRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgODY1KSBlbGVtZW50cy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgODY3KSByZW1vdmVOdWxscyhlbGVtZW50cykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDg3NCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgODc1KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSA4NzYpIG4uZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5nZXRFbGVtZW50cygpCisgIExpbmUgODc4KSBlbGVtZW50cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDg3OSkgZWxlbWVudHMuc2V0KGksIChSZWZlcmVuY2VUeXBlKSBlbGVtZW50cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDg3OSkgZWxlbWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4NzkpIGVsZW1lbnRzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA4ODEpIHJlbW92ZU51bGxzKGVsZW1lbnRzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgODg3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA4ODgpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5nZXRFeHByKCkKKyAgTGluZSA4ODkpIG4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDg4OSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDg4OSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10LmdldEV4cHIoKQorICBMaW5lIDg5NSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgODk2KSBuLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5zZXROYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSA4OTYpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4OTYpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgODk3KSBuLnNldE1lbWJlclZhbHVlKChFeHByZXNzaW9uKSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuc2V0TWVtYmVyVmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgODk3KSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDg5Nykgbi5nZXRNZW1iZXJWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuZ2V0TWVtYmVyVmFsdWUoKQorICBMaW5lIDkwMikgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgOTA3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA5MDgpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdXBlckV4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSA5MDkpIG4uc2V0Q2xhc3NFeHByKChFeHByZXNzaW9uKSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwci5zZXRDbGFzc0V4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgOTA5KSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA5MDkpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdXBlckV4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSA5MTUpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDkxNikgbi5nZXRMYWJlbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldExhYmVsKCkKKyAgTGluZSA5MTcpIG4uc2V0TGFiZWwoKEV4cHJlc3Npb24pIG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuc2V0TGFiZWwoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgOTE3KSBuLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkxNykgbi5nZXRMYWJlbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldExhYmVsKCkKKyAgTGluZSA5MTkpIG4uZ2V0U3RtdHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRTdG10cygpCisgIExpbmUgOTIxKSBzdG10cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDkyMikgc3RtdHMuc2V0KGksIChTdGF0ZW1lbnQpIHN0bXRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgOTIyKSBzdG10cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkyMikgc3RtdHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDkyNCkgcmVtb3ZlTnVsbHMoc3RtdHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5yZW1vdmVOdWxscyhqYXZhLnV0aWwuTGlzdDw/PikKKyAgTGluZSA5MzApIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDkzMSkgbi5zZXRTZWxlY3RvcigoRXhwcmVzc2lvbikgbi5nZXRTZWxlY3RvcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuc2V0U2VsZWN0b3IoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgOTMxKSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkzMSkgbi5nZXRTZWxlY3RvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdC5nZXRTZWxlY3RvcigpCisgIExpbmUgOTMyKSBuLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0RW50cmllcygpCisgIExpbmUgOTM0KSBlbnRyaWVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgOTM1KSBlbnRyaWVzLnNldChpLCAoU3dpdGNoRW50cnlTdG10KSBlbnRyaWVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgOTM1KSBlbnRyaWVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDkzNSkgZW50cmllcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgOTM3KSByZW1vdmVOdWxscyhlbnRyaWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgOTQ0KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA5NDUpIG4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDk0NSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDk0NSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LmdldEV4cHIoKQorICBMaW5lIDk0Nikgbi5zZXRCb2R5KChCbG9ja1N0bXQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDk0Nikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA5NDYpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5nZXRCb2R5KCkKKyAgTGluZSA5NTEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDk1Mikgbi5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgOTUzKSBuLnNldENsYXNzRXhwcigoRXhwcmVzc2lvbikgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5zZXRDbGFzc0V4cHIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgOTUzKSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA5NTMpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDk1OSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgOTYwKSBuLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdC5zZXRFeHByKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uKQorICBMaW5lIDk2MCkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDk2MCkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQuZ2V0RXhwcigpCisgIExpbmUgOTY1KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA5NjYpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgOTY3KSB0eXBlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDk2OCkgbi5nZXRSZXNvdXJjZXMoKS5zZXQoaSwgKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSBuLmdldFJlc291cmNlcygpLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgOTY4KSBuLmdldFJlc291cmNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRSZXNvdXJjZXMoKQorICBMaW5lIDk2OSkgbi5nZXRSZXNvdXJjZXMoKS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDk2OSkgbi5nZXRSZXNvdXJjZXMoKS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgOTY5KSBuLmdldFJlc291cmNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRSZXNvdXJjZXMoKQorICBMaW5lIDk3MSkgbi5zZXRUcnlCbG9jaygoQmxvY2tTdG10KSBuLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5zZXRUcnlCbG9jayhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10KQorICBMaW5lIDk3MSkgbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgOTcxKSBuLmdldFRyeUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFRyeUJsb2NrKCkKKyAgTGluZSA5NzIpIG4uZ2V0Q2F0Y2hzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldENhdGNocygpCisgIExpbmUgOTc0KSBjYXRjaHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA5NzUpIGNhdGNocy5zZXQoaSwgKENhdGNoQ2xhdXNlKSBjYXRjaHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA5NzUpIGNhdGNocy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDk3NSkgY2F0Y2hzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA5NzcpIHJlbW92ZU51bGxzKGNhdGNocykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDk3OSkgbi5nZXRGaW5hbGx5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkKKyAgTGluZSA5ODApIG4uc2V0RmluYWxseUJsb2NrKChCbG9ja1N0bXQpIG4uZ2V0RmluYWxseUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5zZXRGaW5hbGx5QmxvY2soY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdCkKKyAgTGluZSA5ODApIG4uZ2V0RmluYWxseUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA5ODApIG4uZ2V0RmluYWxseUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldEZpbmFsbHlCbG9jaygpCisgIExpbmUgOTg2KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSA5ODcpIG4uc2V0VHlwZURlY2xhcmF0aW9uKChUeXBlRGVjbGFyYXRpb248Pz4pIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdC5zZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSA5ODcpIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDk4Nykgbi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSA5OTIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDk5Mykgbi5nZXRUeXBlQm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0VHlwZUJvdW5kKCkKKyAgTGluZSA5OTUpIHR5cGVCb3VuZC5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDk5NikgdHlwZUJvdW5kLnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHR5cGVCb3VuZC5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDk5NikgdHlwZUJvdW5kLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgOTk2KSB0eXBlQm91bmQuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDk5OCkgcmVtb3ZlTnVsbHModHlwZUJvdW5kKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIucmVtb3ZlTnVsbHMoamF2YS51dGlsLkxpc3Q8Pz4pCisgIExpbmUgMTAwNCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTAwNSkgbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuc2V0RXhwcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSAxMDA1KSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTAwNSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuZ2V0RXhwcigpCisgIExpbmUgMTAxMCkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTAxNSkgdmlzaXRDb21tZW50KG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIEEpCisgIExpbmUgMTAxNikgbi5nZXRBbm5vdGF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDEwMTgpIGFubm90YXRpb25zLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTAxOSkgYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAxMDE5KSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEwMTkpIGFubm90YXRpb25zLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMDIxKSByZW1vdmVOdWxscyhhbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDEwMjQpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTAyNCkgbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDEwMjgpIG4uc2V0RWxlbWVudFR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5zZXRFbGVtZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAxMDMwKSBuLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAxMDMxKSB2YXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTAzMykgdmFycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDMzKSB2YXJzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMDM1KSB2YXJzLnJlbW92ZShpKSA9PT4gamF2YS51dGlsLkxpc3QucmVtb3ZlKGludCkKKyAgTGluZSAxMDM3KSB2YXJzLnNldChpKyssIGRlY2wpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDEwNDApIHZhcnMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxMDQ4KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMDUwKSBuLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEwNTApIG4uZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJZCgpCisgIExpbmUgMTA1NCkgbi5zZXRJZChpZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3Iuc2V0SWQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkKQorICBMaW5lIDEwNTUpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDEwNTYpIG4uc2V0SW5pdCgoRXhwcmVzc2lvbikgbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLnNldEluaXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMTA1Nikgbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEwNTYpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDEwNjIpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEwNjcpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEwNjgpIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDEwNzMpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEwNzQpIG4uc2V0Q29uZGl0aW9uKChFeHByZXNzaW9uKSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5zZXRDb25kaXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgMTA3NCkgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTA3NCkgbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5nZXRDb25kaXRpb24oKQorICBMaW5lIDEwNzUpIG4uc2V0Qm9keSgoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuc2V0Qm9keShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDEwNzUpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDc1KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5nZXRCb2R5KCkKKyAgTGluZSAxMDgwKSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMDgxKSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSAxMDgyKSBuLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRFeHRlbmRzKCkKKyAgTGluZSAxMDgzKSBuLnNldEV4dGVuZHMoKFJlZmVyZW5jZVR5cGUpIG4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5zZXRFeHRlbmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlKQorICBMaW5lIDEwODMpIG4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDgzKSBuLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRFeHRlbmRzKCkKKyAgTGluZSAxMDg1KSBuLmdldFN1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0U3VwZXIoKQorICBMaW5lIDEwODYpIG4uc2V0U3VwZXIoKFJlZmVyZW5jZVR5cGUpIG4uZ2V0U3VwZXIoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuc2V0U3VwZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGUpCisgIExpbmUgMTA4Nikgbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDg2KSBuLmdldFN1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0U3VwZXIoKQorICBMaW5lIDEwOTMpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDEwOTQpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAxMDk1KSBwYXJhbWV0ZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTA5NikgcGFyYW1ldGVycy5zZXQoaSwgKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDEwOTYpIHBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTA5NikgcGFyYW1ldGVycy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTA5OCkgcmVtb3ZlTnVsbHMocGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3JBZGFwdGVyLnJlbW92ZU51bGxzKGphdmEudXRpbC5MaXN0PD8+KQorICBMaW5lIDEwOTkpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSAxMTAwKSBuLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5zZXRCb2R5KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgMTEwMCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExMDApIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSAxMTA3KSB2aXNpdENvbW1lbnQobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgQSkKKyAgTGluZSAxMTA4KSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTEwOSkgdHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxMTEwKSBuLmdldFR5cGVBcmd1bWVudHMoKS5zZXQoaSwgKFR5cGU8Pz4pIG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMTExMCkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDExMTEpIG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTExMSkgbi5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDExMTEpIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMTEzKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxMTE0KSBuLnNldFNjb3BlKChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5zZXRTY29wZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbikKKyAgTGluZSAxMTE0KSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDExMTQpIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDExMjEpIHZpc2l0Q29tbWVudChuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBBKQorICBMaW5lIDExMjIpIG4uZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTEyMykgbi5zZXRUeXBlKChUeXBlPD8+KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwci5zZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlPD8+KQorICBMaW5lIDExMjMpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMTIzKSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByLmdldFR5cGUoKQorICBMaW5lIDExMzApIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk1vZGlmaWVyVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDExNDUpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTE0Nikgbi5zZXRDb21tZW50KChDb21tZW50KSBuLmdldENvbW1lbnQoKS5hY2NlcHQodGhpcywgYXJnKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5zZXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCkKKyAgTGluZSAxMTQ2KSBuLmdldENvbW1lbnQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTE0Nikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfVHJlZVZpc2l0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9UcmVlVmlzaXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2N2U1ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfVHJlZVZpc2l0b3IudHh0CkBAIC0wLDAgKzEsMyBAQAorICBMaW5lIDM3KSBwcm9jZXNzKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVHJlZVZpc2l0b3IucHJvY2Vzcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzgpIG5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q2hpbGRyZW5Ob2RlcygpCisgIExpbmUgMzkpIHZpc2l0RGVwdGhGaXJzdChjaGlsZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5UcmVlVmlzaXRvci52aXNpdERlcHRoRmlyc3QoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9Wb2lkVmlzaXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX2FzdF92aXNpdG9yX1ZvaWRWaXNpdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9Wb2lkVmlzaXRvci50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfVm9pZFZpc2l0b3JBZGFwdGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfYXN0X3Zpc2l0b3JfVm9pZFZpc2l0b3JBZGFwdGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQxMTMxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl9hc3RfdmlzaXRvcl9Wb2lkVmlzaXRvckFkYXB0ZXIudHh0CkBAIC0wLDAgKzEsNTExIEBACisgIExpbmUgOTMpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDkzKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDk0KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDk1KSBuLmdldE5hbWVFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDk1KSBuLmdldE5hbWVFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKQorICBMaW5lIDk2KSBuLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSA5Nykgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgOTgpIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTA0KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxMDQpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTA1KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDEwNikgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDEwNikgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMTA3KSBuLmdldERlZmF1bHRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uLmdldERlZmF1bHRWYWx1ZSgpCisgIExpbmUgMTA4KSBuLmdldERlZmF1bHRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMDgpIG4uZ2V0RGVmYXVsdFZhbHVlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkKKyAgTGluZSAxMTMpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDExMykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAxMTQpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMTQpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlBY2Nlc3NFeHByLmdldE5hbWUoKQorICBMaW5lIDExNSkgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMTUpIG4uZ2V0SW5kZXgoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwci5nZXRJbmRleCgpCisgIExpbmUgMTE5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxMTkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTIwKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTIwKSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDEyMSkgbi5nZXRMZXZlbHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldExldmVscygpCisgIExpbmUgMTIyKSBsZXZlbC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxMjQpIG4uZ2V0SW5pdGlhbGl6ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByLmdldEluaXRpYWxpemVyKCkKKyAgTGluZSAxMjUpIG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTI1KSBuLmdldEluaXRpYWxpemVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRJbml0aWFsaXplcigpCisgIExpbmUgMTMwKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxMzApIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTMxKSBuLmdldFZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHIuZ2V0VmFsdWVzKCkKKyAgTGluZSAxMzIpIG4uZ2V0VmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwci5nZXRWYWx1ZXMoKQorICBMaW5lIDEzMykgZXhwci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTM5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxMzkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTQwKSBuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0MCkgbi5nZXRDaGVjaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdC5nZXRDaGVjaygpCisgIExpbmUgMTQxKSBuLmdldE1lc3NhZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0TWVzc2FnZSgpCisgIExpbmUgMTQyKSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTQyKSBuLmdldE1lc3NhZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQuZ2V0TWVzc2FnZSgpCisgIExpbmUgMTQ3KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxNDcpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTQ4KSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxNDgpIG4uZ2V0VGFyZ2V0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFRhcmdldCgpCisgIExpbmUgMTQ5KSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE0OSkgbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgMTUzKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxNTMpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTU0KSBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTU0KSBuLmdldExlZnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0TGVmdCgpCisgIExpbmUgMTU1KSBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE1NSkgbi5nZXRSaWdodCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRSaWdodCgpCisgIExpbmUgMTYyKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxNjIpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTYzKSBuLmdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuZ2V0U3RtdHMoKQorICBMaW5lIDE2NCkgbi5nZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmdldFN0bXRzKCkKKyAgTGluZSAxNjUpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE3MSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMTcxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE3NSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMTc1KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE3OSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMTc5KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE4MCkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE4MCkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwci5nZXRUeXBlKCkKKyAgTGluZSAxODEpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxODEpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0RXhwcigpCisgIExpbmUgMTg1KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAxODUpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMTg2KSBuLmdldFBhcmFtKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAxODYpIG4uZ2V0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldFBhcmFtKCkKKyAgTGluZSAxODcpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMTg3KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlLmdldEJvZHkoKQorICBMaW5lIDE5MSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMTkxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE5NSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMTk1KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDE5Nikgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDE5Nikgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIuZ2V0VHlwZSgpCisgIExpbmUgMjAwKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAyMDApIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMjAxKSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDIwMikgbi5nZXROYW1lRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyMDIpIG4uZ2V0TmFtZUV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lRXhwcigpCisgIExpbmUgMjAzKSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDIwNCkgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyMDYpIG4uZ2V0RXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZHMoKQorICBMaW5lIDIwNykgYy5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMjA5KSBuLmdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRzKCkKKyAgTGluZSAyMTApIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIxMikgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMjEzKSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIxOCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMjE4KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDIxOSkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSAyMjApIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAyMjEpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMjIxKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMjIzKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDIyNCkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAyMjUpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDIzMSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMjMxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDIzMikgbi5nZXRQYWNrYWdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKQorICBMaW5lIDIzMykgbi5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMjMzKSBuLmdldFBhY2thZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpCisgIExpbmUgMjM1KSBuLmdldEltcG9ydHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0SW1wb3J0cygpCisgIExpbmUgMjM2KSBuLmdldEltcG9ydHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0SW1wb3J0cygpCisgIExpbmUgMjM3KSBpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMjQwKSBuLmdldFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFR5cGVzKCkKKyAgTGluZSAyNDEpIG4uZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDI0MikgdHlwZURlY2xhcmF0aW9uLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyNDgpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDI0OCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyNDkpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDI0OSkgbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRDb25kaXRpb24oKQorICBMaW5lIDI1MCkgbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyNTApIG4uZ2V0VGhlbkV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwci5nZXRUaGVuRXhwcigpCisgIExpbmUgMjUxKSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDI1MSkgbi5nZXRFbHNlRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldEVsc2VFeHByKCkKKyAgTGluZSAyNTUpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDI1NSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyNTYpIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgMjU3KSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyNTgpIG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDI1OSkgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyNjIpIG4uZ2V0TmFtZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMjYyKSBuLmdldE5hbWVFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE5hbWVFeHByKCkKKyAgTGluZSAyNjMpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAyNjQpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAyNjUpIHAuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyNjgpIG4uZ2V0VGhyb3dzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFRocm93cygpCisgIExpbmUgMjY5KSBuLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDI3MCkgbmFtZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMjczKSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDI3Mykgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDI3NykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMjc3KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI4MSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMjgxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDI4Mikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDI4Mikgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Qm9keSgpCisgIExpbmUgMjgzKSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAyODMpIG4uZ2V0Q29uZGl0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQuZ2V0Q29uZGl0aW9uKCkKKyAgTGluZSAyODcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDI4Nykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyOTEpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDI5MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyOTUpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDI5NSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAyOTkpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDI5OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAzMDApIG4uZ2V0TmFtZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzAwKSBuLmdldE5hbWVFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKQorICBMaW5lIDMwNCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMzA0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDMwNSkgbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzMDUpIG4uZ2V0SW5uZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwci5nZXRJbm5lcigpCisgIExpbmUgMzA5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAzMDkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzEwKSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDMxMSkgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRBcmdzKCkKKyAgTGluZSAzMTIpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QXJncygpCisgIExpbmUgMzEzKSBlLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzMTYpIG4uZ2V0Q2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRDbGFzc0JvZHkoKQorICBMaW5lIDMxNykgbi5nZXRDbGFzc0JvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldENsYXNzQm9keSgpCisgIExpbmUgMzE4KSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDMyNCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMzI0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDMyNSkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSAzMjYpIG4uZ2V0TmFtZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzI2KSBuLmdldE5hbWVFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKQorICBMaW5lIDMyNykgbi5nZXRJbXBsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50cygpCisgIExpbmUgMzI4KSBuLmdldEltcGxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRzKCkKKyAgTGluZSAzMjkpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDMzMikgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0RW50cmllcygpCisgIExpbmUgMzMzKSBuLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRFbnRyaWVzKCkKKyAgTGluZSAzMzQpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDMzNykgbi5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzM4KSBuLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAzMzkpIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzQ1KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAzNDUpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzQ2KSBuLmlzVGhpcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmlzVGhpcygpCisgIExpbmUgMzQ2KSBuLmdldEV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRFeHByKCkKKyAgTGluZSAzNDcpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzNDcpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEV4cHIoKQorICBMaW5lIDM0OSkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMzUwKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAzNTEpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDM1NCkgbi5nZXRBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0QXJncygpCisgIExpbmUgMzU1KSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmdzKCkKKyAgTGluZSAzNTYpIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDM2MikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMzYyKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM2Mykgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDM2Mykgbi5nZXRFeHByZXNzaW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCkKKyAgTGluZSAzNjcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDM2Nykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSAzNjgpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzY4KSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDM2OSkgbi5nZXRGaWVsZEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzY5KSBuLmdldEZpZWxkRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldEZpZWxkRXhwcigpCisgIExpbmUgMzczKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSAzNzMpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgMzc0KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDM3NSkgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzNzUpIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDM3Nikgbi5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAzNzcpIHZhci5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDM4MikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMzgyKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM4Mykgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSAzODMpIG4uZ2V0VmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldFZhcmlhYmxlKCkKKyAgTGluZSAzODQpIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzg0KSBuLmdldEl0ZXJhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRJdGVyYWJsZSgpCisgIExpbmUgMzg1KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzg1KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldEJvZHkoKQorICBMaW5lIDM4OSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgMzg5KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDM5MCkgbi5nZXRJbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEluaXQoKQorICBMaW5lIDM5MSkgbi5nZXRJbml0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEluaXQoKQorICBMaW5lIDM5MikgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzk1KSBuLmdldENvbXBhcmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Q29tcGFyZSgpCisgIExpbmUgMzk2KSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgMzk2KSBuLmdldENvbXBhcmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0Q29tcGFyZSgpCisgIExpbmUgMzk4KSBuLmdldFVwZGF0ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRVcGRhdGUoKQorICBMaW5lIDM5OSkgbi5nZXRVcGRhdGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQuZ2V0VXBkYXRlKCkKKyAgTGluZSA0MDApIGUuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQwMykgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQwMykgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10LmdldEJvZHkoKQorICBMaW5lIDQwNykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNDA3KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQwOCkgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDA4KSBuLmdldENvbmRpdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldENvbmRpdGlvbigpCisgIExpbmUgNDA5KSBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQwOSkgbi5nZXRUaGVuU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldFRoZW5TdG10KCkKKyAgTGluZSA0MTApIG4uZ2V0RWxzZVN0bXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdC5nZXRFbHNlU3RtdCgpCisgIExpbmUgNDExKSBuLmdldEVsc2VTdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQxMSkgbi5nZXRFbHNlU3RtdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10LmdldEVsc2VTdG10KCkKKyAgTGluZSA0MTYpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDQxNikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0MTcpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0MTcpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDQyMSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNDIxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQyMikgbi5nZXRCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDIyKSBuLmdldEJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uLmdldEJsb2NrKCkKKyAgTGluZSA0MjYpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDQyNikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0MjcpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0MjcpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW5zdGFuY2VPZkV4cHIuZ2V0RXhwcigpCisgIExpbmUgNDI4KSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDI4KSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByLmdldFR5cGUoKQorICBMaW5lIDQzMikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNDMyKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQzNikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNDM2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQ0MykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNDQzKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDQ0NCkgbi5nZXRTdG10KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQ0NCkgbi5nZXRTdG10KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdC5nZXRTdG10KCkKKyAgTGluZSA0NTEpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDQ1MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NTUpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDQ1NSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NTkpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDQ1OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NjApIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0NjApIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgNDY0KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA0NjQpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNDY1KSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQ2NSkgbi5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkKKyAgTGluZSA0NjkpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDQ2OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA0NzApIG4uZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSA0NzEpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDcxKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgNDczKSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDQ3NCkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA0NzUpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQ3OCkgbi5nZXROYW1lRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0NzgpIG4uZ2V0TmFtZUV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWVFeHByKCkKKyAgTGluZSA0NzkpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0QXJncygpCisgIExpbmUgNDgwKSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3MoKQorICBMaW5lIDQ4MSkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDg3KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA0ODcpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNDg4KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDQ4OSkgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDQ5MCkgbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDQ5MSkgdC5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA0OTQpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNDk0KSBuLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgNDk1KSBuLmdldE5hbWVFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDQ5NSkgbi5nZXROYW1lRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZUV4cHIoKQorICBMaW5lIDQ5Nikgbi5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA0OTcpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNDk4KSBwLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTAxKSBuLmdldFRocm93cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3dzKCkKKyAgTGluZSA1MDIpIG4uZ2V0VGhyb3dzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5nZXRUaHJvd3MoKQorICBMaW5lIDUwMykgbmFtZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTA2KSBuLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKQorICBMaW5lIDUwNykgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA1MDcpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpCisgIExpbmUgNTEyKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA1MTIpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTE2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA1MTYpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTE3KSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTE3KSBuLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDUxOCkgbi5nZXRQYWlycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIuZ2V0UGFpcnMoKQorICBMaW5lIDUxOSkgbi5nZXRQYWlycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHIuZ2V0UGFpcnMoKQorICBMaW5lIDUyMCkgbS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDUyNikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNTI2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDUzMCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNTMwKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDUzMSkgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFNjb3BlKCkKKyAgTGluZSA1MzIpIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTMyKSBuLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDUzNCkgbi5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgNTM1KSBuLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA1MzYpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDUzOSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDUzOSkgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgNTQwKSBuLmdldEFyZ3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRBcmdzKCkKKyAgTGluZSA1NDEpIG4uZ2V0QXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFyZ3MoKQorICBMaW5lIDU0MikgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTQ1KSBuLmdldEFub255bW91c0NsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFub255bW91c0NsYXNzQm9keSgpCisgIExpbmUgNTQ2KSBuLmdldEFub255bW91c0NsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFub255bW91c0NsYXNzQm9keSgpCisgIExpbmUgNTQ3KSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU1MykgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNTUzKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU1NCkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSA1NTUpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA1NTUpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1NTkpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDU1OSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1NjApIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgNTYxKSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU2MSkgbi5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSA1NjIpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNTYyKSBuLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0SWQoKQorICBMaW5lIDU2NikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNTY2KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDU2NykgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSA1NzEpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDU3MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1NzIpIG4uZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU3Mikgbi5nZXRRdWFsaWZpZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByLmdldFF1YWxpZmllcigpCisgIExpbmUgNTc3KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA1NzcpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTc4KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDU3OSkgbi5nZXRDb21wb25lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU3OSkgbi5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgNTg0KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA1ODQpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNTg1KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDU4Nikgbi5nZXREaW1lbnNpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0RGltZW5zaW9uKCkKKyAgTGluZSA1ODcpIG4uZ2V0RGltZW5zaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDU4Nykgbi5nZXREaW1lbnNpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUNyZWF0aW9uTGV2ZWwuZ2V0RGltZW5zaW9uKCkKKyAgTGluZSA1OTIpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDU5Mikgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA1OTMpIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgNTk0KSBuLmdldEVsZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5JbnRlcnNlY3Rpb25UeXBlLmdldEVsZW1lbnRzKCkKKyAgTGluZSA1OTUpIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDYwMCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNjAwKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDYwMSkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSA2MDIpIG4uZ2V0RWxlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZS5nZXRFbGVtZW50cygpCisgIExpbmUgNjAzKSBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2MDgpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDYwOCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA2MDkpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5nZXRFeHByKCkKKyAgTGluZSA2MTApIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2MTApIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5nZXRFeHByKCkKKyAgTGluZSA2MTUpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDYxNSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA2MTYpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2MTYpIG4uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgNjE3KSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDYxNykgbi5nZXRNZW1iZXJWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuZ2V0TWVtYmVyVmFsdWUoKQorICBMaW5lIDYyMSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNjIxKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDYyNSkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNjI1KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDYyNikgbi5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDYyNykgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNjI3KSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgNjMyKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA2MzIpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNjMzKSBuLmdldExhYmVsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuZ2V0TGFiZWwoKQorICBMaW5lIDYzNCkgbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2MzQpIG4uZ2V0TGFiZWwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5nZXRMYWJlbCgpCisgIExpbmUgNjM2KSBuLmdldFN0bXRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQuZ2V0U3RtdHMoKQorICBMaW5lIDYzNykgbi5nZXRTdG10cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldFN0bXRzKCkKKyAgTGluZSA2MzgpIHMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDY0NCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNjQ0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDY0NSkgbi5nZXRTZWxlY3RvcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2NDUpIG4uZ2V0U2VsZWN0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQuZ2V0U2VsZWN0b3IoKQorICBMaW5lIDY0Nikgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LmdldEVudHJpZXMoKQorICBMaW5lIDY0Nykgbi5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LmdldEVudHJpZXMoKQorICBMaW5lIDY0OCkgZS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDY1NCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNjU0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDY1NSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDY1NSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10LmdldEV4cHIoKQorICBMaW5lIDY1Nikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2NTYpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdC5nZXRCb2R5KCkKKyAgTGluZSA2NjApIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDY2MCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA2NjEpIG4uZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDY2Mikgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNjYyKSBuLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSA2NjcpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDY2Nykgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA2NjgpIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2NjgpIG4uZ2V0RXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10LmdldEV4cHIoKQorICBMaW5lIDY3MikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNjcyKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDY3Mykgbi5nZXRSZXNvdXJjZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0UmVzb3VyY2VzKCkKKyAgTGluZSA2NzQpIG4uZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgNjc1KSB2LmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2NzgpIG4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDY3OCkgbi5nZXRUcnlCbG9jaygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRUcnlCbG9jaygpCisgIExpbmUgNjc5KSBuLmdldENhdGNocygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRDYXRjaHMoKQorICBMaW5lIDY4MCkgbi5nZXRDYXRjaHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0Q2F0Y2hzKCkKKyAgTGluZSA2ODEpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDY4NCkgbi5nZXRGaW5hbGx5QmxvY2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQuZ2V0RmluYWxseUJsb2NrKCkKKyAgTGluZSA2ODUpIG4uZ2V0RmluYWxseUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2ODUpIG4uZ2V0RmluYWxseUJsb2NrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldEZpbmFsbHlCbG9jaygpCisgIExpbmUgNjkwKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA2OTApIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNjkxKSBuLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA2OTEpIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10LmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgNjk1KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA2OTUpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNjk2KSBuLmdldFR5cGVCb3VuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXRUeXBlQm91bmQoKQorICBMaW5lIDY5Nykgbi5nZXRUeXBlQm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0VHlwZUJvdW5kKCkKKyAgTGluZSA2OTgpIGMuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDcwNCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNzA0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDcwNSkgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDcwNSkgbi5nZXRFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuZ2V0RXhwcigpCisgIExpbmUgNzA5KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA3MDkpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzEzKSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA3MTMpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzE0KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDcxNSkgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3MTUpIG4uZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldEVsZW1lbnRUeXBlKCkKKyAgTGluZSA3MTYpIG4uZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDcxNykgdi5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDcyMikgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNzIyKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDcyMykgbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3MjMpIG4uZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJZCgpCisgIExpbmUgNzI0KSBuLmdldEluaXQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRJbml0KCkKKyAgTGluZSA3MjUpIG4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3MjUpIG4uZ2V0SW5pdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXQoKQorICBMaW5lIDczMCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNzMwKSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDczNCkgdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0Q29tbWVudChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQsIEEpCisgIExpbmUgNzM0KSBuLmdldENvbW1lbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENvbW1lbnQoKQorICBMaW5lIDczNSkgdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyLnZpc2l0QW5ub3RhdGlvbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczw/PiwgQSkKKyAgTGluZSA3NDApIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDc0MCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3NDEpIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDc0MSkgbi5nZXRDb25kaXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdC5nZXRDb25kaXRpb24oKQorICBMaW5lIDc0Mikgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDc0Mikgbi5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQuZ2V0Qm9keSgpCisgIExpbmUgNzQ2KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA3NDYpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzQ3KSB2aXNpdEFubm90YXRpb25zKG4sIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zPD8+LCBBKQorICBMaW5lIDc0OCkgbi5nZXRFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kcygpCisgIExpbmUgNzQ5KSBuLmdldEV4dGVuZHMoKS5hY2NlcHQodGhpcywgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I8QT4sIEEpCisgIExpbmUgNzQ5KSBuLmdldEV4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRFeHRlbmRzKCkKKyAgTGluZSA3NTEpIG4uZ2V0U3VwZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRTdXBlcigpCisgIExpbmUgNzUyKSBuLmdldFN1cGVyKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDc1Mikgbi5nZXRTdXBlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuV2lsZGNhcmRUeXBlLmdldFN1cGVyKCkKKyAgTGluZSA3NTgpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDc1OCkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3NTkpIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA3NjApIG4uZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA3NjEpIGEuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3NjQpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSA3NjUpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA3NjUpIG4uZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSA3NzEpIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdENvbW1lbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50LCBBKQorICBMaW5lIDc3MSkgbi5nZXRDb21tZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDb21tZW50KCkKKyAgTGluZSA3NzIpIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA3NzMpIG4uZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA3NzQpIHQuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDc3Nykgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgNzc4KSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDc3OCkgbi5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgNzg0KSB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvckFkYXB0ZXIudmlzaXRDb21tZW50KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudCwgQSkKKyAgTGluZSA3ODQpIG4uZ2V0Q29tbWVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q29tbWVudCgpCisgIExpbmUgNzg1KSBuLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByLmdldFR5cGUoKQorICBMaW5lIDc4Nikgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yPEE+LCBBKQorICBMaW5lIDc4Nikgbi5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwci5nZXRUeXBlKCkKKyAgTGluZSA3OTIpIHZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlci52aXNpdEFubm90YXRpb25zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4sIEEpCisgIExpbmUgNzk3KSBuLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKKyAgTGluZSA4MDIpIG4uZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgODAzKSBhbm5vdGF0aW9uLmFjY2VwdCh0aGlzLCBhcmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjxBPiwgQSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfdXRpbHNfQ2xhc3NVdGlscy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3V0aWxzX0NsYXNzVXRpbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDA3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3V0aWxzX0NsYXNzVXRpbHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyAgTGluZSAxMikgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoQm9vbGVhbi5UWVBFLCBCb29sZWFuLmNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxMykgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoQnl0ZS5UWVBFLCBCeXRlLmNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxNCkgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoQ2hhcmFjdGVyLlRZUEUsIENoYXJhY3Rlci5jbGFzcykgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMTUpIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KFNob3J0LlRZUEUsIFNob3J0LmNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxNikgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoSW50ZWdlci5UWVBFLCBJbnRlZ2VyLmNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxNykgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoTG9uZy5UWVBFLCBMb25nLmNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxOCkgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoRG91YmxlLlRZUEUsIERvdWJsZS5jbGFzcykgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMTkpIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEZsb2F0LlRZUEUsIEZsb2F0LmNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAyMCkgcHJpbWl0aXZlV3JhcHBlck1hcC5wdXQoVm9pZC5UWVBFLCBWb2lkLlRZUEUpID09PiBqYXZhLnV0aWwuTWFwLnB1dChLLCBWKQorICBMaW5lIDI4KSBwcmltaXRpdmVXcmFwcGVyTWFwLmtleVNldCgpID09PiBqYXZhLnV0aWwuTWFwLmtleVNldCgpCisgIExpbmUgMjkpIHByaW1pdGl2ZVdyYXBwZXJNYXAuZ2V0KHByaW1pdGl2ZUNsYXNzKSA9PT4gamF2YS51dGlsLk1hcC5nZXQoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMCkgcHJpbWl0aXZlQ2xhc3MuZXF1YWxzKHdyYXBwZXJDbGFzcykgPT0+IGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzEpIHdyYXBwZXJQcmltaXRpdmVNYXAucHV0KHdyYXBwZXJDbGFzcywgcHJpbWl0aXZlQ2xhc3MpID09PiBqYXZhLnV0aWwuTWFwLnB1dChLLCBWKQorICBMaW5lIDUxKSB0eXBlLmlzUHJpbWl0aXZlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc1ByaW1pdGl2ZSgpCisgIExpbmUgNTEpIGlzUHJpbWl0aXZlV3JhcHBlcih0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNsYXNzVXRpbHMuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5DbGFzczw/PikKKyAgTGluZSA2Nykgd3JhcHBlclByaW1pdGl2ZU1hcC5jb250YWluc0tleSh0eXBlKSA9PT4gamF2YS51dGlsLk1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFwYXJzZXJfbWV0aG9kY2FsbHNfZXhwZWN0ZWRfb3V0cHV0L2NvbV9naXRodWJfamF2YXBhcnNlcl91dGlsc19QYWlyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfdXRpbHNfUGFpci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfdXRpbHNfUGFpci50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfdXRpbHNfUG9zaXRpb25VdGlscy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3V0aWxzX1Bvc2l0aW9uVXRpbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDkzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3V0aWxzX1Bvc2l0aW9uVXRpbHMudHh0CkBAIC0wLDAgKzEsNDMgQEAKKyAgTGluZSA0Nikgc29ydEJ5QmVnaW5Qb3NpdGlvbihub2RlcywgZmFsc2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGphdmEudXRpbC5MaXN0PFQ+LCBib29sZWFuKQorICBMaW5lIDUwKSBDb2xsZWN0aW9ucy5zb3J0KG5vZGVzLCAobzEsIG8yKSAtPiBQb3NpdGlvblV0aWxzLmNvbXBhcmUobzEsIG8yLCBpZ25vcmluZ0Fubm90YXRpb25zKSkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5zb3J0KGphdmEudXRpbC5MaXN0PFQ+LCBqYXZhLnV0aWwuQ29tcGFyYXRvcjw/IHN1cGVyIFQ+KQorICBMaW5lIDUwKSBQb3NpdGlvblV0aWxzLmNvbXBhcmUobzEsIG8yLCBpZ25vcmluZ0Fubm90YXRpb25zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuY29tcGFyZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgYm9vbGVhbikKKyAgTGluZSA1NCkgYXJlSW5PcmRlcihhLCBiLCBmYWxzZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmFyZUluT3JkZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGJvb2xlYW4pCisgIExpbmUgNTgpIGNvbXBhcmUoYSwgYiwgaWdub3JpbmdBbm5vdGF0aW9ucykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmNvbXBhcmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGJvb2xlYW4pCisgIExpbmUgNjMpIHNpZ251bShiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihiKSkgPT0+IGphdmEubGFuZy5JbnRlZ2VyLnNpZ251bShpbnQpCisgIExpbmUgNjMpIGJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oYSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDYzKSBiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5iZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2NSkgc2lnbnVtKGJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihhKSAtIGJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihiKSkgPT0+IGphdmEubGFuZy5JbnRlZ2VyLnNpZ251bShpbnQpCisgIExpbmUgNjUpIGJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihhKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2NSkgYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5iZWdpbkNvbHVtbldpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDcxKSBzaWdudW0oYS5nZXRCZWdpbigpLmxpbmUgLSBiLmdldEJlZ2luKCkubGluZSkgPT0+IGphdmEubGFuZy5JbnRlZ2VyLnNpZ251bShpbnQpCisgIExpbmUgNzEpIGEuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSA3MSkgYi5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDczKSBzaWdudW0oYS5nZXRCZWdpbigpLmNvbHVtbiAtIGIuZ2V0QmVnaW4oKS5jb2x1bW4pID09PiBqYXZhLmxhbmcuSW50ZWdlci5zaWdudW0oaW50KQorICBMaW5lIDczKSBhLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgNzMpIGIuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSA4MikgYW5ub3RhdGlvbnMuYWRkQWxsKCgoTm9kZVdpdGhBbm5vdGF0aW9uczw/Pikgbm9kZSkuZ2V0QW5ub3RhdGlvbnMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgODIpICgoTm9kZVdpdGhBbm5vdGF0aW9uczw/Pikgbm9kZSkuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9ucy5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgODMpIGFubm90YXRpb25zLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgODYpIHNvcnRCeUJlZ2luUG9zaXRpb24oYW5ub3RhdGlvbnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGphdmEudXRpbC5MaXN0PFQ+KQorICBMaW5lIDg3KSBhbm5vdGF0aW9ucy5nZXQoYW5ub3RhdGlvbnMuc2l6ZSgpIC0gMSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgODcpIGFubm90YXRpb25zLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgOTQpIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKG5vZGUpLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgOTQpIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5iZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgOTkpIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKG5vZGUpLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgOTkpIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5iZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTA1KSBjYXN0ZWQuZ2V0RWxlbWVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZS5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgMTA4KSBjYXN0ZWQuZ2V0TmFtZUV4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lRXhwcigpCisgIExpbmUgMTE1KSBQb3NpdGlvblV0aWxzLmdldExhc3RBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmdldExhc3RBbm5vdGF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMTYpIGNvbnRhaW5lci5jb250YWlucyhjb250YWluZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuY29udGFpbnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExOCkgY29udGFpbmVyLmNvbnRhaW5zKGNvbnRhaW5lZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5jb250YWlucyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTI0KSBiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEyNSkgYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Qb3NpdGlvblV0aWxzLmJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTI2KSBjb250YWluZWQuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEJlZ2luKCkKKyAgTGluZSAxMjcpIGNvbnRhaW5lZC5nZXRCZWdpbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0QmVnaW4oKQorICBMaW5lIDEyNykgY29udGFpbmVkLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRCZWdpbigpCisgIExpbmUgMTI4KSBjb250YWluZXIuZ2V0RW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRFbmQoKQorICBMaW5lIDEyOCkgY29udGFpbmVkLmdldEVuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0RW5kKCkKKyAgTGluZSAxMzApIGNvbnRhaW5lci5nZXRFbmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEVuZCgpCisgIExpbmUgMTMwKSBjb250YWluZWQuZ2V0RW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRFbmQoKQorICBMaW5lIDEzMCkgY29udGFpbmVyLmdldEVuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0RW5kKCkKKyAgTGluZSAxMzApIGNvbnRhaW5lZC5nZXRFbmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldEVuZCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3V0aWxzX1V0aWxzLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhcGFyc2VyX21ldGhvZGNhbGxzX2V4cGVjdGVkX291dHB1dC9jb21fZ2l0aHViX2phdmFwYXJzZXJfdXRpbHNfVXRpbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDg3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXBhcnNlcl9tZXRob2RjYWxsc19leHBlY3RlZF9vdXRwdXQvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3V0aWxzX1V0aWxzLnR4dApAQCAtMCwwICsxLDE0IEBACisgIExpbmUgMzcpIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSA9PT4gamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQzKSBjb2xsZWN0aW9uLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uaXNFbXB0eSgpCisgIExpbmUgNTgpIHN0cmluZy50b0NoYXJBcnJheSgpID09PiBqYXZhLmxhbmcuU3RyaW5nLnRvQ2hhckFycmF5KCkKKyAgTGluZSA2MSkgZXNjYXBlZFN0cmluZy5hcHBlbmQoIlxcbiIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NCkgZXNjYXBlZFN0cmluZy5hcHBlbmQoIlxcciIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NykgZXNjYXBlZFN0cmluZy5hcHBlbmQoYykgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChjaGFyKQorICBMaW5lIDcwKSBlc2NhcGVkU3RyaW5nLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkKKyAgTGluZSA3OCkgcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSA9PT4gamF2YS5pby5SZWFkZXIucmVhZChjaGFyW10sIGludCwgaW50KQorICBMaW5lIDc5KSByZXN1bHQuYXBwZW5kKGJ1ZmZlciwgMCwgbnVtQ2hhcnMpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoY2hhcltdLCBpbnQsIGludCkKKyAgTGluZSA4MikgcmVzdWx0LnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkKKyAgTGluZSA5MCkgcHJvdmlkZXIucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXIucmVhZChjaGFyW10sIGludCwgaW50KQorICBMaW5lIDkxKSByZXN1bHQuYXBwZW5kKGJ1ZmZlciwgMCwgbnVtQ2hhcnMpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoY2hhcltdLCBpbnQsIGludCkKKyAgTGluZSA5NCkgcmVzdWx0LnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkKKyAgTGluZSAxMDMpIENvbGxlY3Rpb25zLmFkZEFsbChsaXN0LCBhcnJheSkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBzdXBlciBUPiwgVC4uLikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9SRUFETUUubWQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OWY5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsOCBAQAorRm9yIHRoZSB0ZXN0cyByZWdhcmRpbmcgcmVzb2x2aW5nIHN5bWJvbHMgaW4gSmFyIGZpbGVzLCB3ZSBuZWVkIHNvbWUgamFyIGZpbGVzLiBTb21lIG90aGVyIHRlc3RzIHdpdGhpbiBKYXZhU3ltYm9sU29sdmVyIHVzZSBlc3RhYmxpc2hlZCBleHRlcm5hbCBqYXJzIGZvciB0aGF0IHB1cnBvc2UuIEdpdmVuIHRoZSB2ZXJ5IHNwZWNpZmljIGNhc2VzIHdlIG5lZWQgaGVyZSwgdGhhdCB3b3VsZCBzZXZlcmx5IGNvbXBsaWNhdGUgd3JpdGluZyBhbmQgbWFpbnRhaW5pbmcgdGVzdHMuIFRoZXJlZm9yZSwgSSd2ZSBkZWNpZGVkIHRvIHdyaXRlIGN1c3RvbSBqYXJzIGZvciB0aGUgY2FzZXMgd2UgbmVlZC4KKworYG1haW5famFyYCBjb250YWlucyBtb3N0IG9mIHRoZSBuZWNlc3NhcnkgY2xhc3NlcywgYGluY2x1ZGVkX2phcmAgYW5kIGBleGNsdWRlZF9qYXJgIGJvdGggY29udGFpbiBhbiBpbnRlcmZhY2UgYW5kIGEgc3VwZXJjbGFzcy4gSW5jbHVkZWRfamFyIGlzIGluY2x1ZGVkIGluIHRoZSBjb21iaW5lZCB0eXBlIHNvbHZlciwgd2hpbGUgZXhjbHVkZWRfamFyIGlzIG5vdC4KKworUnVubmluZyB0aGUgYnVpbGRUZXN0SmFyTWFpbkphciBncmFkbGUgdGFzayBzaG91bGQgcmVidWlsZCBhbGwgbmVjZXNzYXJ5IGZpbGVzLgorV2hlbiB5b3UgbmVlZCB0byByZWJ1aWxkIHRoZSBqYXIsIGl0IGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgeW91IGFjdHVhbGx5IHVwZGF0ZSB0aGUgamFyIGluIGdpdC4gSmFyLWZpbGVzIGFyZSBpbiB0aGUgZ2l0LWlnbm9yZSwgc28geW91J2xsIGhhdmUgdG8gZm9yY2UtYWRkIHRoZW0gdXNpbmcgYGdpdCAtZiBtYWluX2phci5qYXJgLgorCisoYHJlc3VsdGAgd2FzIGNob3NlbiBhcyBhIG5hbWUgaW5zdGVhZCBvZiBgdGFyZ2V0YCBvciBgb3V0YCwgYmVjYXVzZSB0aG9zZSBzZWVtIHRvIGJlIGlnbm9yZWQuKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvZXhjbHVkZWRfamFyLmphciBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvZXhjbHVkZWRfamFyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjUwNThlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2V4Y2x1ZGVkX2phci9leGNsdWRlZF9qYXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvcmVzdWx0L2RvTm90RGVsZXRlLm1kIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2V4Y2x1ZGVkX2phci9yZXN1bHQvZG9Ob3REZWxldGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvcmVzdWx0L2RvTm90RGVsZXRlLm1kCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvZXhjbHVkZWRfamFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvSW50ZXJmYWNlRXhjbHVkZWRKYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL2V4Y2x1ZGVkX2phci9JbnRlcmZhY2VFeGNsdWRlZEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDgyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvZXhjbHVkZWRfamFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvSW50ZXJmYWNlRXhjbHVkZWRKYXIuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMuZXhjbHVkZWRfamFyOworCitwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZUV4Y2x1ZGVkSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUkZBQ0VfRklFTEQgPSAiVGhpc0lzQVN0cmluZyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2V4Y2x1ZGVkX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvZXhjbHVkZWRfamFyL1N1cGVyQ2xhc3NFeGNsdWRlZEphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2V4Y2x1ZGVkX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvZXhjbHVkZWRfamFyL1N1cGVyQ2xhc3NFeGNsdWRlZEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjQ1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvZXhjbHVkZWRfamFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9leGNsdWRlZF9qYXIvU3VwZXJDbGFzc0V4Y2x1ZGVkSmFyLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLmV4Y2x1ZGVkX2phcjsKKworcHVibGljIGNsYXNzIFN1cGVyQ2xhc3NFeGNsdWRlZEphciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfRklFTEQgPSAiVGhpc0lzQVN0cmluZyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9pbmNsdWRlZF9qYXIuamFyIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9pbmNsdWRlZF9qYXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDY5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvaW5jbHVkZWRfamFyL2luY2x1ZGVkX2phci5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9yZXN1bHQvZG9Ob3REZWxldGUubWQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvaW5jbHVkZWRfamFyL3Jlc3VsdC9kb05vdERlbGV0ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9yZXN1bHQvZG9Ob3REZWxldGUubWQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9pbmNsdWRlZF9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9JbnRlcmZhY2VJbmNsdWRlZEphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvaW5jbHVkZWRfamFyL0ludGVyZmFjZUluY2x1ZGVkSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmYmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9pbmNsdWRlZF9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9JbnRlcmZhY2VJbmNsdWRlZEphci5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5pbmNsdWRlZF9qYXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlSW5jbHVkZWRKYXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSRkFDRV9GSUVMRCA9ICJUaGlzSXNBU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvaW5jbHVkZWRfamFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9pbmNsdWRlZF9qYXIvU3VwZXJDbGFzc0luY2x1ZGVkSmFyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvaW5jbHVkZWRfamFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9pbmNsdWRlZF9qYXIvU3VwZXJDbGFzc0luY2x1ZGVkSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiZTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9pbmNsdWRlZF9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL2luY2x1ZGVkX2phci9TdXBlckNsYXNzSW5jbHVkZWRKYXIuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMuaW5jbHVkZWRfamFyOworCitwdWJsaWMgY2xhc3MgU3VwZXJDbGFzc0luY2x1ZGVkSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9GSUVMRCA9ICJUaGlzSXNBU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvbWFpbl9qYXIuamFyIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL21haW5famFyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWVjNTJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL21haW5famFyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvcmVzdWx0L2RvTm90RGVsZXRlLm1kIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3Jlc3VsdC9kb05vdERlbGV0ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3Jlc3VsdC9kb05vdERlbGV0ZS5tZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9Db25jcmV0ZUNsYXNzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0NvbmNyZXRlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODYxNjgzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9Db25jcmV0ZUNsYXNzLmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitwdWJsaWMgY2xhc3MgQ29uY3JldGVDbGFzcyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1NUUklORyA9ICJUaGlzSXNBU3RyaW5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfU1RSSU5HID0gIlRoaXNJc0FTZWNvbmRTdHJpbmciOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvQ29uY3JldGVFbnVtLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0NvbmNyZXRlRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzI0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0NvbmNyZXRlRW51bS5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXI7CisKK3B1YmxpYyBlbnVtIENvbmNyZXRlRW51bSB7CisgICAgRU5VTV9WQUxfT05FLAorICAgIEVOVU1fVkFMX1RXTzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TVFJJTkcgPSAiVGhpc0lzQVN0cmluZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EX1NUUklORyA9ICJUaGlzSXNBU2Vjb25kU3RyaW5nIjsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvRW51bUludGVyZmFjZVVzZXJFeGNsdWRlZEphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9FbnVtSW50ZXJmYWNlVXNlckV4Y2x1ZGVkSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0MDNhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvRW51bUludGVyZmFjZVVzZXJFeGNsdWRlZEphci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLmV4Y2x1ZGVkX2phci5JbnRlcmZhY2VFeGNsdWRlZEphcjsKKworcHVibGljIGVudW0gRW51bUludGVyZmFjZVVzZXJFeGNsdWRlZEphciBpbXBsZW1lbnRzIEludGVyZmFjZUV4Y2x1ZGVkSmFyIHsKKyAgICBPV05fRU5VTV9WQUwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0VudW1JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvRW51bUludGVyZmFjZVVzZXJJbmNsdWRlZEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGU1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0VudW1JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5pbmNsdWRlZF9qYXIuSW50ZXJmYWNlSW5jbHVkZWRKYXI7CisKK3B1YmxpYyBlbnVtIEVudW1JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIgaW1wbGVtZW50cyBJbnRlcmZhY2VJbmNsdWRlZEphciB7CisgICAgT1dOX0VOVU1fVkFMCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9FbnVtSW50ZXJmYWNlVXNlck93bkphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9FbnVtSW50ZXJmYWNlVXNlck93bkphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmY3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0VudW1JbnRlcmZhY2VVc2VyT3duSmFyLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitwdWJsaWMgZW51bSBFbnVtSW50ZXJmYWNlVXNlck93bkphciBpbXBsZW1lbnRzIEludGVyZmFjZU93bkphciB7CisgICAgT1dOX0VOVU1fVkFMCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9JbnRlcmZhY2VPd25KYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvSW50ZXJmYWNlT3duSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwOWYyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvSW50ZXJmYWNlT3duSmFyLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZU93bkphciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJGQUNFX0ZJRUxEID0gIlRoaXNJc0FTdHJpbmciOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvSW50ZXJmYWNlVXNlckV4Y2x1ZGVkSmFyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0ludGVyZmFjZVVzZXJFeGNsdWRlZEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDgzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0ludGVyZmFjZVVzZXJFeGNsdWRlZEphci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLmV4Y2x1ZGVkX2phci5JbnRlcmZhY2VFeGNsdWRlZEphcjsKKworcHVibGljIGNsYXNzIEludGVyZmFjZVVzZXJFeGNsdWRlZEphciBpbXBsZW1lbnRzIEludGVyZmFjZUV4Y2x1ZGVkSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05fRklFTEQgPSAiVGhpc0lzQVN0cmluZyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9JbnRlcmZhY2VVc2VySW5jbHVkZWRKYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvSW50ZXJmYWNlVXNlckluY2x1ZGVkSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViYTI3MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvSW50ZXJmYWNlVXNlckluY2x1ZGVkSmFyLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMuaW5jbHVkZWRfamFyLkludGVyZmFjZUluY2x1ZGVkSmFyOworCitwdWJsaWMgY2xhc3MgSW50ZXJmYWNlVXNlckluY2x1ZGVkSmFyIGltcGxlbWVudHMgSW50ZXJmYWNlSW5jbHVkZWRKYXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTl9GSUVMRCA9ICJUaGlzSXNBU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0ludGVyZmFjZVVzZXJPd25KYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvSW50ZXJmYWNlVXNlck93bkphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjY5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL0ludGVyZmFjZVVzZXJPd25KYXIuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXI7CisKK3B1YmxpYyBjbGFzcyBJbnRlcmZhY2VVc2VyT3duSmFyIGltcGxlbWVudHMgSW50ZXJmYWNlT3duSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05fRklFTEQgPSAiVGhpc0lzQVN0cmluZyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdGFuZGFsb25lSW50ZXJmYWNlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N0YW5kYWxvbmVJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWUxZjAwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdGFuZGFsb25lSW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitwdWJsaWMgaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnRlcmZhY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19TVFJJTkcgPSAiVGhpc0lzQVN0cmluZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EX1NUUklORyA9ICJUaGlzSXNBU2Vjb25kU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkNsYXNzRXhjbHVkZWRKYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvU3ViQ2xhc3NFeGNsdWRlZEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDk1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkNsYXNzRXhjbHVkZWRKYXIuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5leGNsdWRlZF9qYXIuU3VwZXJDbGFzc0V4Y2x1ZGVkSmFyOworCitwdWJsaWMgY2xhc3MgU3ViQ2xhc3NFeGNsdWRlZEphciBleHRlbmRzIFN1cGVyQ2xhc3NFeGNsdWRlZEphciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dOX0ZJRUxEID0gIlRoaXNJc0FTdHJpbmciOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvU3ViQ2xhc3NJbmNsdWRlZEphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdWJDbGFzc0luY2x1ZGVkSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhNGQxMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvU3ViQ2xhc3NJbmNsdWRlZEphci5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLmluY2x1ZGVkX2phci5TdXBlckNsYXNzSW5jbHVkZWRKYXI7CisKK3B1YmxpYyBjbGFzcyBTdWJDbGFzc0luY2x1ZGVkSmFyIGV4dGVuZHMgU3VwZXJDbGFzc0luY2x1ZGVkSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05fRklFTEQgPSAiVGhpc0lzQVN0cmluZyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdWJDbGFzc093bkphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdWJDbGFzc093bkphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWZhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkNsYXNzT3duSmFyLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitwdWJsaWMgY2xhc3MgU3ViQ2xhc3NPd25KYXIgZXh0ZW5kcyBTdXBlckNsYXNzT3duSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05fRklFTEQgPSAiVGhpc0lzQVN0cmluZyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdWJJbnRlcmZhY2VFeGNsdWRlZEphci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL3NyYy9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9TdWJJbnRlcmZhY2VFeGNsdWRlZEphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjFlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkludGVyZmFjZUV4Y2x1ZGVkSmFyLmphdmEKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhc3ltYm9sc29sdmVyLmphdmFzc2lzdF9zeW1ib2xzLm1haW5famFyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMuZXhjbHVkZWRfamFyLkludGVyZmFjZUV4Y2x1ZGVkSmFyOworCitwdWJsaWMgaW50ZXJmYWNlIFN1YkludGVyZmFjZUV4Y2x1ZGVkSmFyIGV4dGVuZHMgSW50ZXJmYWNlRXhjbHVkZWRKYXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTl9GSUVMRCA9ICJUaGlzSXNBU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkludGVyZmFjZUluY2x1ZGVkSmFyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkludGVyZmFjZUluY2x1ZGVkSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ZTUzNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvU3ViSW50ZXJmYWNlSW5jbHVkZWRKYXIuamF2YQpAQCAtMCwwICsxLDcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5pbmNsdWRlZF9qYXIuSW50ZXJmYWNlSW5jbHVkZWRKYXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgU3ViSW50ZXJmYWNlSW5jbHVkZWRKYXIgZXh0ZW5kcyBJbnRlcmZhY2VJbmNsdWRlZEphciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dOX0ZJRUxEID0gIlRoaXNJc0FTdHJpbmciOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvU3ViSW50ZXJmYWNlT3duSmFyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkludGVyZmFjZU93bkphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWU5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1YkludGVyZmFjZU93bkphci5qYXZhCkBAIC0wLDAgKzEsNSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YXN5bWJvbHNvbHZlci5qYXZhc3Npc3Rfc3ltYm9scy5tYWluX2phcjsKKworcHVibGljIGludGVyZmFjZSBTdWJJbnRlcmZhY2VPd25KYXIgZXh0ZW5kcyBJbnRlcmZhY2VPd25KYXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTl9GSUVMRCA9ICJUaGlzSXNBU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1cGVyQ2xhc3NPd25KYXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3Npc3Rfc3ltYm9scy9tYWluX2phci9zcmMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFzeW1ib2xzb2x2ZXIvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvU3VwZXJDbGFzc093bkphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTY2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXNzaXN0X3N5bWJvbHMvbWFpbl9qYXIvc3JjL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhc3ltYm9sc29sdmVyL2phdmFzc2lzdF9zeW1ib2xzL21haW5famFyL1N1cGVyQ2xhc3NPd25KYXIuamF2YQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFzeW1ib2xzb2x2ZXIuamF2YXNzaXN0X3N5bWJvbHMubWFpbl9qYXI7CisKK3B1YmxpYyBjbGFzcyBTdXBlckNsYXNzT3duSmFyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9GSUVMRCA9ICJUaGlzSXNBU3RyaW5nIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzN2Q2MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX1NvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnR4dApAQCAtMCwwICsxLDc3IEBACisgIExpbmUgMTAwKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24obm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pCisgIExpbmUgMTAwKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTAxKSB0eXBlRGVjbGFyYXRpb24uaXNDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaXNDbGFzcygpCisgIExpbmUgMTAyKSBvdXQucHJpbnRsbigiXG5bIENsYXNzICIgKyB0eXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpICsgIiBdIikgPT0+IGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwMikgdHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDEwMykgdHlwZURlY2xhcmF0aW9uLmFzQ2xhc3MoKS5nZXRBbGxTdXBlckNsYXNzZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ2xhc3NEZWNsYXJhdGlvbi5nZXRBbGxTdXBlckNsYXNzZXMoKQorICBMaW5lIDEwMykgdHlwZURlY2xhcmF0aW9uLmFzQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmFzQ2xhc3MoKQorICBMaW5lIDEwNCkgb3V0LnByaW50bG4oIiAgc3VwZXJjbGFzczogIiArIHNjLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwNCkgc2MuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMDYpIHR5cGVEZWNsYXJhdGlvbi5hc0NsYXNzKCkuZ2V0QWxsSW50ZXJmYWNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5DbGFzc0RlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXMoKQorICBMaW5lIDEwNikgdHlwZURlY2xhcmF0aW9uLmFzQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmFzQ2xhc3MoKQorICBMaW5lIDEwNykgb3V0LnByaW50bG4oIiAgaW50ZXJmYWNlOiAiICsgc2MuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5pby5QcmludFN0cmVhbS5wcmludGxuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTA3KSBzYy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDExNCkgc29sdmVUeXBlRGVjbCgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zb2x2ZVR5cGVEZWNsKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pCisgIExpbmUgMTE2KSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExNikgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMTcpIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTE4KSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEyMCkgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjApIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTIyKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEyMikgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEyMykgb3V0LnByaW50bG4oIiAgTGluZSAiICsgbm9kZS5nZXRSYW5nZSgpLmdldCgpLmJlZ2luLmxpbmUgKyAiKSAiICsgbm9kZSArICIgPT0+ICIgKyByZWYuZGVzY3JpYmUoKSkgPT0+IGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyMykgbm9kZS5nZXRSYW5nZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxMjMpIG5vZGUuZ2V0UmFuZ2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFJhbmdlKCkKKyAgTGluZSAxMjMpIHJlZi5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTI3KSBlcnIucHJpbnRsbih1cGUuZ2V0TWVzc2FnZSgpKSA9PT4gamF2YS5pby5QcmludFN0cmVhbS5wcmludGxuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTI3KSB1cGUuZ2V0TWVzc2FnZSgpID09PiBqYXZhLmxhbmcuVGhyb3dhYmxlLmdldE1lc3NhZ2UoKQorICBMaW5lIDEzMSkgZXJyLnByaW50bG4ocmUuZ2V0TWVzc2FnZSgpKSA9PT4gamF2YS5pby5QcmludFN0cmVhbS5wcmludGxuKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTMxKSByZS5nZXRNZXNzYWdlKCkgPT0+IGphdmEubGFuZy5UaHJvd2FibGUuZ2V0TWVzc2FnZSgpCisgIExpbmUgMTQwKSBvdXQucHJpbnRsbigiICBMaW5lICIgKyBub2RlLmdldEJlZ2luKCkuZ2V0KCkubGluZSArICIpICIgKyBub2RlICsgIiA9PT4gIiArIHRvU3RyaW5nKChNZXRob2RDYWxsRXhwcikgbm9kZSkpID09PiBqYXZhLmlvLlByaW50U3RyZWFtLnByaW50bG4oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDApIG5vZGUuZ2V0QmVnaW4oKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTQwKSBub2RlLmdldEJlZ2luKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUmFuZ2UuZ2V0QmVnaW4oKQorICBMaW5lIDE0MCkgdG9TdHJpbmcoKE1ldGhvZENhbGxFeHByKSBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci50b1N0cmluZyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIpCisgIExpbmUgMTQyKSBub2RlLmdldENoaWxkTm9kZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENoaWxkTm9kZXMoKQorICBMaW5lIDE0Mykgc29sdmVNZXRob2RDYWxscyhjaGlsZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuU291cmNlRmlsZUluZm9FeHRyYWN0b3Iuc29sdmVNZXRob2RDYWxscyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTQ5KSB0b1N0cmluZyhKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZShub2RlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuU291cmNlRmlsZUluZm9FeHRyYWN0b3IudG9TdHJpbmcoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4pCisgIExpbmUgMTQ5KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5zb2x2ZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIpCisgIExpbmUgMTQ5KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTUyKSBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIHJlc29sdmluZyBjYWxsIGF0IEwiICsgbm9kZS5nZXRCZWdpbigpLmdldCgpLmxpbmUgKyAiOiAiICsgbm9kZSkgPT0+IGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1Mikgbm9kZS5nZXRCZWdpbigpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxNTIpIG5vZGUuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhSYW5nZS5nZXRCZWdpbigpCisgIExpbmUgMTUzKSBlLnByaW50U3RhY2tUcmFjZSgpID09PiBqYXZhLmxhbmcuVGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpCisgIExpbmUgMTYwKSBtZXRob2REZWNsYXJhdGlvblN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxNjEpIG1ldGhvZERlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkKKyAgTGluZSAxNjEpIG1ldGhvZERlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTY5KSBjb2xsZWN0QWxsTm9kZXMobm9kZSwgbm9kZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLlNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmNvbGxlY3RBbGxOb2Rlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTcwKSBub2Rlcy5zb3J0KChuMSwgbjIpIC0+IG4xLmdldEJlZ2luKCkuZ2V0KCkuY29tcGFyZVRvKG4yLmdldEJlZ2luKCkuZ2V0KCkpKSA9PT4gamF2YS51dGlsLkxpc3Quc29ydChqYXZhLnV0aWwuQ29tcGFyYXRvcjw/IHN1cGVyIEU+KQorICBMaW5lIDE3MCkgbjEuZ2V0QmVnaW4oKS5nZXQoKS5jb21wYXJlVG8objIuZ2V0QmVnaW4oKS5nZXQoKSkgPT0+IEVSUk9SCisgIExpbmUgMTcwKSBuMS5nZXRCZWdpbigpLmdldCgpID09PiBFUlJPUgorICBMaW5lIDE3MCkgbjEuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhSYW5nZS5nZXRCZWdpbigpCisgIExpbmUgMTcwKSBuMi5nZXRCZWdpbigpLmdldCgpID09PiBFUlJPUgorICBMaW5lIDE3MCkgbjIuZ2V0QmVnaW4oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhSYW5nZS5nZXRCZWdpbigpCisgIExpbmUgMTc1KSBub2Rlcy5hZGQobm9kZSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE3Nikgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZm9yRWFjaChjIC0+IGNvbGxlY3RBbGxOb2RlcyhjLCBub2RlcykpID09PiBqYXZhLmxhbmcuSXRlcmFibGUuZm9yRWFjaChqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI8PyBzdXBlciBUPikKKyAgTGluZSAxNzYpIG5vZGUuZ2V0Q2hpbGROb2RlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q2hpbGROb2RlcygpCisgIExpbmUgMTc2KSBjb2xsZWN0QWxsTm9kZXMoYywgbm9kZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLlNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmNvbGxlY3RBbGxOb2Rlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZT4pCisgIExpbmUgMTgwKSBmaWxlLmlzRGlyZWN0b3J5KCkgPT0+IGphdmEuaW8uRmlsZS5pc0RpcmVjdG9yeSgpCisgIExpbmUgMTgxKSBmaWxlLmxpc3RGaWxlcygpID09PiBqYXZhLmlvLkZpbGUubGlzdEZpbGVzKCkKKyAgTGluZSAxODIpIHNvbHZlKGYpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLlNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnNvbHZlKGphdmEuaW8uRmlsZSkKKyAgTGluZSAxODUpIGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVuZHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTg1KSBmaWxlLmdldE5hbWUoKSA9PT4gamF2YS5pby5GaWxlLmdldE5hbWUoKQorICBMaW5lIDE4Nykgb3V0LnByaW50bG4oIi0gcGFyc2luZyAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkgPT0+IGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE4NykgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSA9PT4gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCisgIExpbmUgMTg5KSBKYXZhUGFyc2VyLnBhcnNlKGZpbGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZShqYXZhLmlvLkZpbGUpCisgIExpbmUgMTkwKSBjb2xsZWN0QWxsTm9kZXMoY3UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLlNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLmNvbGxlY3RBbGxOb2Rlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTkxKSBub2Rlcy5mb3JFYWNoKG4gLT4gc29sdmUobikpID09PiBqYXZhLmxhbmcuSXRlcmFibGUuZm9yRWFjaChqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI8PyBzdXBlciBUPikKKyAgTGluZSAxOTEpIHNvbHZlKG4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLlNvdXJjZUZpbGVJbmZvRXh0cmFjdG9yLnNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxOTcpIGZpbGUuaXNEaXJlY3RvcnkoKSA9PT4gamF2YS5pby5GaWxlLmlzRGlyZWN0b3J5KCkKKyAgTGluZSAxOTgpIGZpbGUubGlzdEZpbGVzKCkgPT0+IGphdmEuaW8uRmlsZS5saXN0RmlsZXMoKQorICBMaW5lIDE5OSkgc29sdmVNZXRob2RDYWxscyhmKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zb2x2ZU1ldGhvZENhbGxzKGphdmEuaW8uRmlsZSkKKyAgTGluZSAyMDIpIGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVuZHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjAyKSBmaWxlLmdldE5hbWUoKSA9PT4gamF2YS5pby5GaWxlLmdldE5hbWUoKQorICBMaW5lIDIwNCkgb3V0LnByaW50bG4oIi0gcGFyc2luZyAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkgPT0+IGphdmEuaW8uUHJpbnRTdHJlYW0ucHJpbnRsbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIwNCkgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSA9PT4gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCisgIExpbmUgMjA2KSBKYXZhUGFyc2VyLnBhcnNlKGZpbGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZShqYXZhLmlvLkZpbGUpCisgIExpbmUgMjA3KSBzb2x2ZU1ldGhvZENhbGxzKGN1KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5Tb3VyY2VGaWxlSW5mb0V4dHJhY3Rvci5zb2x2ZU1ldGhvZENhbGxzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2NvcmVfcmVzb2x1dGlvbl9Db250ZXh0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2NvcmVfcmVzb2x1dGlvbl9Db250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRlNDVkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfY29yZV9yZXNvbHV0aW9uX0NvbnRleHQudHh0CkBAIC0wLDAgKzEsMTYgQEAKKyAgTGluZSA0MikgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSA0NikgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA0OCkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSA1MCkgcGFyZW50LnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTkpIHNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDYwKSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgNjEpIFZhbHVlLmZyb20ocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlLmZyb20oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbikKKyAgTGluZSA2MSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgNjIpIE9wdGlvbmFsLm9mKHZhbHVlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNjQpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgODkpIHNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5MCkgbWV0aG9kU29sdmVkLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDkxKSBtZXRob2RTb2x2ZWQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA5MikgQ29udGV4dEhlbHBlci5yZXNvbHZlVHlwZVZhcmlhYmxlcyh0aGlzLCBtZXRob2REZWNsYXJhdGlvbiwgYXJndW1lbnRzVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0SGVscGVyLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgOTMpIE9wdGlvbmFsLm9mKG1ldGhvZFVzYWdlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgOTUpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9jb3JlX3Jlc29sdXRpb25fQ29udGV4dEhlbHBlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9jb3JlX3Jlc29sdXRpb25fQ29udGV4dEhlbHBlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2Y2NmNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2NvcmVfcmVzb2x1dGlvbl9Db250ZXh0SGVscGVyLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSA0MCkgKChKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5yZXNvbHZlVHlwZVZhcmlhYmxlcyhjb250ZXh0LCBwYXJhbWV0ZXJUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24ucmVzb2x2ZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDQyKSAoKEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKSBtZXRob2REZWNsYXJhdGlvbikucmVzb2x2ZVR5cGVWYXJpYWJsZXMoY29udGV4dCwgcGFyYW1ldGVyVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA0NCkgKChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLlZhbHVlc01ldGhvZCkgbWV0aG9kRGVjbGFyYXRpb24pLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbnRleHQsIHBhcmFtZXRlclR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24uVmFsdWVzTWV0aG9kLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA0NikgKChSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24pIG1ldGhvZERlY2xhcmF0aW9uKS5yZXNvbHZlVHlwZVZhcmlhYmxlcyhjb250ZXh0LCBwYXJhbWV0ZXJUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9kZWNsYXJhdGlvbnNfY29tbW9uX01ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfZGVjbGFyYXRpb25zX2NvbW1vbl9NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNjZmZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfZGVjbGFyYXRpb25zX2NvbW1vbl9NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnR4dApAQCAtMCwwICsxLDM0IEBACisgIExpbmUgNDcpIHJlcGxhY2VUeXBlUGFyYW1zKG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKSwgdHlwZVNvbHZlciwgY29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuZGVjbGFyYXRpb25zLmNvbW1vbi5NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnJlcGxhY2VUeXBlUGFyYW1zKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA0NykgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkKKyAgTGluZSA0OSkgbWV0aG9kRGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA1MCkgcmVwbGFjZVR5cGVQYXJhbXMobWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpLCB0eXBlU29sdmVyLCBjb250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5kZWNsYXJhdGlvbnMuY29tbW9uLk1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDUwKSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbShpKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgNTApIG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtKGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaW50KQorICBMaW5lIDUxKSBwYXJhbXMuYWRkKHJlcGxhY2VkKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNTgpIG1ldGhvZERlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgNTgpIG1ldGhvZERlY2xhcmF0aW9uLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5oYXNWYXJpYWRpY1BhcmFtZXRlcigpCisgIExpbmUgNTkpIG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtKGkpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSA1OSkgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW0oaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgNjApIHBhcmFtZXRlclR5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA2MSkgaW5mZXJlbmNlQ29udGV4dC5hZGRQYWlyKGZvcm1hbFBhcmFtVHlwZSwgYWN0dWFsUGFyYW1UeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDY0KSBpbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoaW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUocmV0dXJuVHlwZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA2NCkgaW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUocmV0dXJuVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNzApIHR5cGUuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDcxKSB0eXBlLmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDcyKSB0eXBlUGFyYW1ldGVyLmRlY2xhcmVkT25UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uVHlwZSgpCisgIExpbmUgNzMpIHR5cGVQYXJhbUJ5TmFtZSh0eXBlUGFyYW1ldGVyLmdldE5hbWUoKSwgdHlwZVNvbHZlciwgY29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuZGVjbGFyYXRpb25zLmNvbW1vbi5NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnR5cGVQYXJhbUJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA3MykgdHlwZVBhcmFtZXRlci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA3NCkgdHlwZVBhcmFtLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA3NSkgdHlwZVBhcmFtLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA4MCkgdHlwZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA4MSkgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiByZXBsYWNlVHlwZVBhcmFtcyh0cCwgdHlwZVNvbHZlciwgY29udGV4dCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZVRyYW5zZm9ybWVyKQorICBMaW5lIDgxKSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDgxKSByZXBsYWNlVHlwZVBhcmFtcyh0cCwgdHlwZVNvbHZlciwgY29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuZGVjbGFyYXRpb25zLmNvbW1vbi5NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnJlcGxhY2VUeXBlUGFyYW1zKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA4OCkgbWV0aG9kRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5maWx0ZXIodHAgLT4gdHAuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkubWFwKHRwIC0+IHRvVHlwZSh0cCkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDg4KSBtZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLmZpbHRlcih0cCAtPiB0cC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5tYXAodHAgLT4gdG9UeXBlKHRwKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgODgpIG1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuZmlsdGVyKHRwIC0+IHRwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDg4KSBtZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDg4KSBtZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDg4KSB0cC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg4KSB0cC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA4OCkgdG9UeXBlKHRwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5kZWNsYXJhdGlvbnMuY29tbW9uLk1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWMudG9UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJfTmF2aWdhdG9yLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJfTmF2aWdhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTBmNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcl9OYXZpZ2F0b3IudHh0CkBAIC0wLDAgKzEsMTA0IEBACisgIExpbmUgNDQpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDQ0KSBub2RlLmdldFBhcmVudE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKQorICBMaW5lIDQ5KSBjdS5nZXRUeXBlcygpLmlzRW1wdHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA0OSkgY3UuZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDUwKSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDUzKSBnZXRPdXRlclR5cGVOYW1lKHF1YWxpZmllZE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldE91dGVyVHlwZU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1NCkgY3UuZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoKHQpIC0+IHQuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKHR5cGVOYW1lKSkuZmluZEZpcnN0KCkgPT0+IEVSUk9SCisgIExpbmUgNTQpIGN1LmdldFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKCh0KSAtPiB0LmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyh0eXBlTmFtZSkpID09PiBFUlJPUgorICBMaW5lIDU0KSBjdS5nZXRUeXBlcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDU0KSBjdS5nZXRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpCisgIExpbmUgNTQpIHQuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKHR5cGVOYW1lKSA9PT4gRVJST1IKKyAgTGluZSA1NCkgdC5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gRVJST1IKKyAgTGluZSA1NCkgdC5nZXROYW1lKCkgPT0+IEVSUk9SCisgIExpbmUgNTYpIGdldElubmVyVHlwZU5hbWUocXVhbGlmaWVkTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0SW5uZXJUeXBlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU3KSB0eXBlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA1NykgaW5uZXJUeXBlTmFtZS5pc0VtcHR5KCkgPT0+IGphdmEubGFuZy5TdHJpbmcuaXNFbXB0eSgpCisgIExpbmUgNTgpIGZpbmRUeXBlKHR5cGUuZ2V0KCksIGlubmVyVHlwZU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4sIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTgpIHR5cGUuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDY0KSBnZXRPdXRlclR5cGVOYW1lKHF1YWxpZmllZE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldE91dGVyVHlwZU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NikgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSA2NykgdGQuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDY4KSAoKFR5cGVEZWNsYXJhdGlvbjw/PikgbikuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKHR5cGVOYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2OCkgKChUeXBlRGVjbGFyYXRpb248Pz4pIG4pLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDY4KSAoKFR5cGVEZWNsYXJhdGlvbjw/PikgbikuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDY5KSBPcHRpb25hbC5vZigoVHlwZURlY2xhcmF0aW9uPD8+KSBuKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNzMpIGdldElubmVyVHlwZU5hbWUocXVhbGlmaWVkTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0SW5uZXJUeXBlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDc0KSB0eXBlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA3NCkgaW5uZXJUeXBlTmFtZS5pc0VtcHR5KCkgPT0+IGphdmEubGFuZy5TdHJpbmcuaXNFbXB0eSgpCisgIExpbmUgNzUpIGZpbmRUeXBlKHR5cGUuZ2V0KCksIGlubmVyVHlwZU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4sIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzUpIHR5cGUuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDgxKSBkZW1hbmRDbGFzc09ySW50ZXJmYWNlKGN1LCBxdWFsaWZpZWROYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5kZW1hbmRDbGFzc09ySW50ZXJmYWNlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDgyKSBjZC5pc0ludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkKKyAgTGluZSA4OSkgZmluZFR5cGUoY3UsIHF1YWxpZmllZE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDkwKSByZXMuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDkzKSByZXMuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDk2KSByZXMuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDEwMSkgY2QuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDEwNCkgbWQuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwNCkgbWQuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTA0KSBtZC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDExOSkgY2QuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDEyMikgZmQuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMTIzKSB2ZC5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTIzKSB2ZC5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxMjMpIHZkLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkKKyAgTGluZSAxMzUpIG5hbWVFeHByLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDEzNSkgbmFtZUV4cHIuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEzNSkgbmFtZUV4cHIuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTM1KSBuYW1lRXhwci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMzkpIG5vZGUuZ2V0Q2hpbGROb2RlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q2hpbGROb2RlcygpCisgIExpbmUgMTQwKSBmaW5kTmFtZUV4cHJlc3Npb24oY2hpbGQsIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmROYW1lRXhwcmVzc2lvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUxKSBuYW1lRXhwci5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE1MSkgbmFtZUV4cHIuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTUxKSBuYW1lRXhwci5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE1NSkgbm9kZS5nZXRDaGlsZE5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZE5vZGVzKCkKKyAgTGluZSAxNTYpIGZpbmRTaW1wbGVOYW1lKGNoaWxkLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5maW5kU2ltcGxlTmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTY3KSBtZXRob2RDYWxsRXhwci5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobWV0aG9kTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTY3KSBtZXRob2RDYWxsRXhwci5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNjcpIG1ldGhvZENhbGxFeHByLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWUoKQorICBMaW5lIDE3MSkgbm9kZS5nZXRDaGlsZE5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZE5vZGVzKCkKKyAgTGluZSAxNzIpIGZpbmRNZXRob2RDYWxsKGNoaWxkLCBtZXRob2ROYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5maW5kTWV0aG9kQ2FsbChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTgzKSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE4MykgdmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE4MykgdmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkKKyAgTGluZSAxODcpIG5vZGUuZ2V0Q2hpbGROb2RlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Q2hpbGROb2RlcygpCisgIExpbmUgMTg4KSBkZW1hbmRWYXJpYWJsZURlY2xhcmF0aW9uKGNoaWxkLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5kZW1hbmRWYXJpYWJsZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxOTcpIGZpbmRUeXBlKGNvbXBpbGF0aW9uVW5pdCwgcXVhbGlmaWVkTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZmluZFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTk4KSByZXMuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDIwMSkgcmVzLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAyMDIpIHJlcy5nZXQoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDIwMikgcmVzLmdldCgpLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDIwMikgcmVzLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAyMDQpIHJlcy5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMjA5KSBmaW5kU3dpdGNoSGVscGVyKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRTd2l0Y2hIZWxwZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDIxOCkgZmluZE5vZGVPZkdpdmVuQ2xhc3NIZWxwZXIobm9kZSwgY2xhenopID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmROb2RlT2ZHaXZlbkNsYXNzSGVscGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDIyOCkgZmluZEFsbE5vZGVzT2ZHaXZlbkNsYXNzSGVscGVyKG5vZGUsIGNsYXp6LCByZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRBbGxOb2Rlc09mR2l2ZW5DbGFzc0hlbHBlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEubGFuZy5DbGFzczxOPiwgamF2YS51dGlsLkxpc3Q8Tj4pCisgIExpbmUgMjMzKSBmaW5kTm9kZU9mR2l2ZW5DbGFzcyhtZXRob2QsIFJldHVyblN0bXQuY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmROb2RlT2ZHaXZlbkNsYXNzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDIzNykgbm9kZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDIzNykgbm9kZS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkKKyAgTGluZSAyMzgpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgMjM5KSBjbGF6ei5pc0luc3RhbmNlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzSW5zdGFuY2UoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMzkpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAyMzkpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZSgpCisgIExpbmUgMjQwKSBPcHRpb25hbC5vZihjbGF6ei5jYXN0KG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpKSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDI0MCkgY2xhenouY2FzdChub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSkgPT0+IGphdmEubGFuZy5DbGFzcy5jYXN0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQwKSBub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMjQwKSBub2RlLmdldFBhcmVudE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKQorICBMaW5lIDI0MikgZmluZEFuY2VzdG9yKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLCBjbGF6eikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZmluZEFuY2VzdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDI0Mikgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDI0Mikgbm9kZS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkKKyAgTGluZSAyNTEpIHF1YWxpZmllZE5hbWUuc3BsaXQoIlxcLiIsIDIpID09PiBqYXZhLmxhbmcuU3RyaW5nLnNwbGl0KGphdmEubGFuZy5TdHJpbmcsIGludCkKKyAgTGluZSAyNTUpIHF1YWxpZmllZE5hbWUuY29udGFpbnMoIi4iKSA9PT4gamF2YS5sYW5nLlN0cmluZy5jb250YWlucyhqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQorICBMaW5lIDI1NikgcXVhbGlmaWVkTmFtZS5zcGxpdCgiXFwuIiwgMikgPT0+IGphdmEubGFuZy5TdHJpbmcuc3BsaXQoamF2YS5sYW5nLlN0cmluZywgaW50KQorICBMaW5lIDI2NSkgbm9kZS5nZXRDaGlsZE5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZE5vZGVzKCkKKyAgTGluZSAyNjYpIGZpbmRTd2l0Y2hIZWxwZXIoY2hpbGQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRTd2l0Y2hIZWxwZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI3NSkgY2xhenouaXNJbnN0YW5jZShub2RlKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzSW5zdGFuY2UoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNzYpIGNsYXp6LmNhc3Qobm9kZSkgPT0+IGphdmEubGFuZy5DbGFzcy5jYXN0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjc4KSBub2RlLmdldENoaWxkTm9kZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENoaWxkTm9kZXMoKQorICBMaW5lIDI3OSkgZmluZE5vZGVPZkdpdmVuQ2xhc3NIZWxwZXIoY2hpbGQsIGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5maW5kTm9kZU9mR2l2ZW5DbGFzc0hlbHBlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGphdmEubGFuZy5DbGFzczxOPikKKyAgTGluZSAyODgpIGNsYXp6LmlzSW5zdGFuY2Uobm9kZSkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0luc3RhbmNlKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjg5KSBjb2xsZWN0b3IuYWRkKGNsYXp6LmNhc3Qobm9kZSkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyODkpIGNsYXp6LmNhc3Qobm9kZSkgPT0+IGphdmEubGFuZy5DbGFzcy5jYXN0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjkxKSBub2RlLmdldENoaWxkTm9kZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENoaWxkTm9kZXMoKQorICBMaW5lIDI5MikgZmluZEFsbE5vZGVzT2ZHaXZlbkNsYXNzSGVscGVyKGNoaWxkLCBjbGF6eiwgY29sbGVjdG9yKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5maW5kQWxsTm9kZXNPZkdpdmVuQ2xhc3NIZWxwZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBqYXZhLmxhbmcuQ2xhc3M8Tj4sIGphdmEudXRpbC5MaXN0PE4+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX0RlZmF1bHRWaXNpdG9yQWRhcHRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfRGVmYXVsdFZpc2l0b3JBZGFwdGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVhNjAwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX0RlZmF1bHRWaXNpdG9yQWRhcHRlci50eHQKQEAgLTAsMCArMSwxODAgQEAKKyAgTGluZSAxOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDIzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzMykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDMzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDM4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQ4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDUzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNTMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNTgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA1OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA2Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDYzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDY4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNjgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNzMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA3Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA3OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDc4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDgzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgODMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgODgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA4OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA5Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDkzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDk4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgOTgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTAzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTAzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDEwOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEwOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxMTMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMTMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTE4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTE4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDEyMykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEyMykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxMjgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMjgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTMzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTMzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDEzOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEzOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNDMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNDMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTQ4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTQ4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE1Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE1Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNTgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNTgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTYzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTYzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE2OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE2OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNzMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNzMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTc4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTc4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE4Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE4Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxODgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxODgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTkzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTkzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE5OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE5OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyMDMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyMDMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjA4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjA4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDIxMykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDIxMykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyMTgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyMTgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjIzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjIzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDIyOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDIyOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyMzMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyMzMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjM4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjM4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDI0Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDI0Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyNDgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyNDgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjUzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjUzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDI1OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDI1OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyNjMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyNjMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjY4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjY4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDI3Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDI3Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyNzgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyNzgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjgzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjgzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDI4OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDI4OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyOTMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyOTMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMjk4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjk4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDMwMykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDMwMykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzMDgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMDgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzEzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzEzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDMxOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDMxOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzMjMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMjMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzI4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzI4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDMzMykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDMzMykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzMzgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMzgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzQzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzQzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDM0OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM0OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzNTMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzNTMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzU4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzU4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDM2Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM2Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzNjgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzNjgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzczKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzczKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDM3OCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM3OCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzODMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzODMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzg4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzg4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDM5Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM5Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzOTgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzOTgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDAzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDAzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQwOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQwOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0MTMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0MTMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDE4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDE4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQyMykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQyMykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0MjgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0MjgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDMzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDMzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQzOCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQzOCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0NDMpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0NDMpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDQ4KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDQ4KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQ1Mykgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQ1Mykgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0NTgpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0NTgpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDYzKSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDYzKSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX0phdmFQYXJzZXJGYWNhZGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX0phdmFQYXJzZXJGYWNhZGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOWNlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfSmF2YVBhcnNlckZhY2FkZS50eHQKQEAgLTAsMCArMSwyNTMgQEAKKyAgTGluZSA1OCkgTG9nZ2VyLmdldExvZ2dlcihKYXZhUGFyc2VyRmFjYWRlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1OCkgSmF2YVBhcnNlckZhY2FkZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA2MSkgbG9nZ2VyLnNldExldmVsKExldmVsLklORk8pID09PiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIuc2V0TGV2ZWwoamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisgIExpbmUgNjMpIGNvbnNvbGVIYW5kbGVyLnNldExldmVsKExldmVsLklORk8pID09PiBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLnNldExldmVsKGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorICBMaW5lIDY0KSBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlSGFuZGxlcikgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5hZGRIYW5kbGVyKGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpCisgIExpbmUgNzUpIHR5cGVTb2x2ZXIuZ2V0Um9vdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5nZXRSb290KCkKKyAgTGluZSA4OSkgaW5zdGFuY2VzLmNvbXB1dGVJZkFic2VudCh0eXBlU29sdmVyLCBKYXZhUGFyc2VyRmFjYWRlOjpuZXcpID09PiBqYXZhLnV0aWwuTWFwLmNvbXB1dGVJZkFic2VudChLLCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBLLCA/IGV4dGVuZHMgVj4pCisgIExpbmUgOTYpIGluc3RhbmNlcy5jbGVhcigpID09PiBqYXZhLnV0aWwuTWFwLmNsZWFyKCkKKyAgTGluZSAxMDApIHR5cGUuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDEwMSkgY29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKHR5cGUuZGVzY3JpYmUoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVHZW5lcmljVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMDEpIHR5cGUuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDEwMikgc29sdmVkLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMDMpIHNvbHZlZC5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTA3KSB0eXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMTA4KSB0eXBlLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzRXh0ZW5kcygpCisgIExpbmUgMTA4KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTA4KSB0eXBlLmFzV2lsZGNhcmQoKS5pc1N1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc1N1cGVyKCkKKyAgTGluZSAxMDgpIHR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMDkpIHR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMTApIHNvbHZlR2VuZXJpY1R5cGVzKHdpbGRjYXJkVXNhZ2UuZ2V0Qm91bmRlZFR5cGUoKSwgY29udGV4dCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVHZW5lcmljVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDExMCkgd2lsZGNhcmRVc2FnZS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDExMSkgd2lsZGNhcmRVc2FnZS5pc0V4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzRXh0ZW5kcygpCisgIExpbmUgMTEyKSBXaWxkY2FyZC5leHRlbmRzQm91bmQoYm91bmRSZXNvbHZlZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5leHRlbmRzQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTE0KSBXaWxkY2FyZC5zdXBlckJvdW5kKGJvdW5kUmVzb2x2ZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuc3VwZXJCb3VuZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMjYpIHN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbChuYW1lRXhwci5nZXROYW1lKCkuZ2V0SWQoKSwgbmFtZUV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjYpIG5hbWVFeHByLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDEyNikgbmFtZUV4cHIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTMwKSBzeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2wobmFtZUV4cHIuZ2V0SWQoKSwgbmFtZUV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMzApIG5hbWVFeHByLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTM1KSBzb2x2ZSgoTmFtZUV4cHIpIGV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcikKKyAgTGluZSAxMzcpIGV4cHIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMzcpIGV4cHIuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTQyKSBzb2x2ZShtZXRob2RDYWxsRXhwciwgdHJ1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLCBib29sZWFuKQorICBMaW5lIDE0Nikgc29sdmUob2JqZWN0Q3JlYXRpb25FeHByLCB0cnVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLCBib29sZWFuKQorICBMaW5lIDE1MCkgc29sdmUoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LCB0cnVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LCBib29sZWFuKQorICBMaW5lIDE1Nykgc29sdmVBcmd1bWVudHMoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LCBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuZ2V0QXJndW1lbnRzKCksIHNvbHZlTGFtYmRhcywgYXJndW1lbnRUeXBlcywgcGxhY2Vob2xkZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZUFyZ3VtZW50cyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24+LCBib29sZWFuLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkxhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyPikKKyAgTGluZSAxNTcpIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5nZXRBcmd1bWVudHMoKQorICBMaW5lIDE1OSkgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmdldEFuY2VzdG9yT2ZUeXBlKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlLmdldEFuY2VzdG9yT2ZUeXBlKGphdmEubGFuZy5DbGFzczxOPikKKyAgTGluZSAxNjApIG9wdEFuY2VzdG9yLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxNjEpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQorICBMaW5lIDE2Mykgb3B0QW5jZXN0b3IuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDE2NSkgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmlzVGhpcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmlzVGhpcygpCisgIExpbmUgMTY2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KGNsYXNzTm9kZS5nZXRFeHRlbmRlZFR5cGVzKDApLCBjbGFzc05vZGUpID09PiBVTlNPTFZFRAorICBMaW5lIDE2NikgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE2NikgY2xhc3NOb2RlLmdldEV4dGVuZGVkVHlwZXMoMCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoRXh0ZW5kcy5nZXRFeHRlbmRlZFR5cGVzKGludCkKKyAgTGluZSAxNjcpIGNsYXNzRGVjbC5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxNjgpIGNsYXNzRGVjbC5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxNjgpIGNsYXNzRGVjbC5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxNzEpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY2xhc3NOb2RlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUoY2xhc3NOb2RlLmdldE5hbWVBc1N0cmluZygpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTcxKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNsYXNzTm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNzEpIGNsYXNzTm9kZS5nZXROYW1lQXNTdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lLmdldE5hbWVBc1N0cmluZygpCisgIExpbmUgMTcyKSBzci5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxNzMpIHNyLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTc3KSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSAxNzkpIENvbnN0cnVjdG9yUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZSgoKENsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsKS5nZXRDb25zdHJ1Y3RvcnMoKSwgYXJndW1lbnRUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTc5KSAoKENsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsKS5nZXRDb25zdHJ1Y3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ2xhc3NEZWNsYXJhdGlvbi5nZXRDb25zdHJ1Y3RvcnMoKQorICBMaW5lIDE4MSkgcGxhY2Vob2xkZXIuc2V0TWV0aG9kKHJlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkxhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyLnNldE1ldGhvZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24+KQorICBMaW5lIDE4OCkgbm9kZS5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTg4KSBub2RlLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAxOTApIG5vZGUuZ2V0Q2xhc3NFeHByKCkuZ2V0KCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAxOTApIG5vZGUuZ2V0Q2xhc3NFeHByKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDE5MCkgbm9kZS5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgMTkyKSB0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGNsYXNzTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTkzKSBjbGF6ei5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxOTQpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoY2xhenouZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAxOTQpIGNsYXp6LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTk3KSBub2RlLmdldEFuY2VzdG9yT2ZUeXBlKENvbXBpbGF0aW9uVW5pdC5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlLmdldEFuY2VzdG9yT2ZUeXBlKGphdmEubGFuZy5DbGFzczxOPikKKyAgTGluZSAxOTgpIGN1LmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxOTkpIGN1LmdldCgpLmdldENsYXNzQnlOYW1lKGNsYXNzTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldENsYXNzQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTk5KSBjdS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMjAwKSBjbGFzc0J5TmFtZS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMjAxKSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGdldFR5cGVEZWNsYXJhdGlvbihjbGFzc0J5TmFtZS5nZXQoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAyMDEpIGdldFR5cGVEZWNsYXJhdGlvbihjbGFzc0J5TmFtZS5nZXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pCisgIExpbmUgMjAxKSBjbGFzc0J5TmFtZS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMjA1KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGdldFR5cGVEZWNsYXJhdGlvbihmaW5kQ29udGFpbmluZ1R5cGVEZWNsKG5vZGUpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDIwNSkgZ2V0VHlwZURlY2xhcmF0aW9uKGZpbmRDb250YWluaW5nVHlwZURlY2wobm9kZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDIwNSkgZmluZENvbnRhaW5pbmdUeXBlRGVjbChub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5maW5kQ29udGFpbmluZ1R5cGVEZWNsKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyMTUpIHNvbHZlQXJndW1lbnRzKG9iamVjdENyZWF0aW9uRXhwciwgb2JqZWN0Q3JlYXRpb25FeHByLmdldEFyZ3VtZW50cygpLCBzb2x2ZUxhbWJkYXMsIGFyZ3VtZW50VHlwZXMsIHBsYWNlaG9sZGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVBcmd1bWVudHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uPiwgYm9vbGVhbiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5MYW1iZGFBcmd1bWVudFR5cGVQbGFjZWhvbGRlcj4pCisgIExpbmUgMjE1KSBvYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QXJndW1lbnRzKCkKKyAgTGluZSAyMTcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQob2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKSwgb2JqZWN0Q3JlYXRpb25FeHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMjE3KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjE3KSBvYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDIxOCkgY2xhc3NEZWNsLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDIxOSkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKENvbnN0cnVjdG9yRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMjIxKSBDb25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoKChDbGFzc0RlY2xhcmF0aW9uKSBjbGFzc0RlY2wuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkpLmdldENvbnN0cnVjdG9ycygpLCBhcmd1bWVudFR5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkNvbnN0cnVjdG9yUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyMjEpICgoQ2xhc3NEZWNsYXJhdGlvbikgY2xhc3NEZWNsLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpKS5nZXRDb25zdHJ1Y3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ2xhc3NEZWNsYXJhdGlvbi5nZXRDb25zdHJ1Y3RvcnMoKQorICBMaW5lIDIyMSkgY2xhc3NEZWNsLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDIyMSkgY2xhc3NEZWNsLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDIyMykgcGxhY2Vob2xkZXIuc2V0TWV0aG9kKHJlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkxhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyLnNldE1ldGhvZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24+KQorICBMaW5lIDIzMykgYXJndW1lbnRUeXBlcy5hZGQocGxhY2Vob2xkZXIpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyMzQpIHBsYWNlaG9sZGVycy5hZGQocGxhY2Vob2xkZXIpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyMzcpIGFyZ3VtZW50VHlwZXMuYWRkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUocGFyYW1ldGVyVmFsdWUsIHNvbHZlTGFtYmRhcykpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyMzcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUocGFyYW1ldGVyVmFsdWUsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGJvb2xlYW4pCisgIExpbmUgMjM3KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjQxKSBTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gY2FsY3VsYXRlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG9mIGEgbWV0aG9kIGNhbGwuIE1ldGhvZCBjYWxsOiAlcywgUGFyYW1ldGVyOiAlcyIsIG5vZGUsIHBhcmFtZXRlclZhbHVlKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAyNTYpIHNvbHZlQXJndW1lbnRzKG1ldGhvZENhbGxFeHByLCBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKSwgc29sdmVMYW1iZGFzLCBhcmd1bWVudFR5cGVzLCBwbGFjZWhvbGRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlQXJndW1lbnRzKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbj4sIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXI+KQorICBMaW5lIDI1NikgbWV0aG9kQ2FsbEV4cHIuZ2V0QXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKQorICBMaW5lIDI1OCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChtZXRob2RDYWxsRXhwciwgdHlwZVNvbHZlcikuc29sdmVNZXRob2QobWV0aG9kQ2FsbEV4cHIuZ2V0TmFtZSgpLmdldElkKCksIGFyZ3VtZW50VHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDI1OCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChtZXRob2RDYWxsRXhwciwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyNTgpIG1ldGhvZENhbGxFeHByLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDI1OCkgbWV0aG9kQ2FsbEV4cHIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMjYwKSBwbGFjZWhvbGRlci5zZXRNZXRob2QocmVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIuc2V0TWV0aG9kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbj4pCisgIExpbmUgMjY2KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGFubm90YXRpb25FeHByLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDI2NykgY29udGV4dC5zb2x2ZVR5cGUoYW5ub3RhdGlvbkV4cHIuZ2V0TmFtZUFzU3RyaW5nKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyNjcpIGFubm90YXRpb25FeHByLmdldE5hbWVBc1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuZ2V0TmFtZUFzU3RyaW5nKCkKKyAgTGluZSAyNjgpIHR5cGVEZWNsYXJhdGlvblN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDI2OSkgdHlwZURlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDI3MCkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChhbm5vdGF0aW9uRGVjbGFyYXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAyNzIpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChBbm5vdGF0aW9uRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMjc3KSBnZXRUeXBlKG5vZGUsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBib29sZWFuKQorICBMaW5lIDI4MikgY2FjaGVXaXRoTGFtYmRhc1NvbHZlZC5jb250YWluc0tleShub2RlKSA9PT4gamF2YS51dGlsLk1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI4MykgZ2V0VHlwZUNvbmNyZXRlKG5vZGUsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZUNvbmNyZXRlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgYm9vbGVhbikKKyAgTGluZSAyODUpIGNhY2hlV2l0aExhbWJkYXNTb2x2ZWQucHV0KG5vZGUsIHJlcykgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMjkwKSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50cygpCisgIExpbmUgMjkxKSBjYWNoZVdpdGhMYW1iZGFzU29sdmVkLmNvbnRhaW5zS2V5KGFyZykgPT0+IGphdmEudXRpbC5NYXAuY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyOTIpIGdldFR5cGUoYXJnLCB0cnVlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgYm9vbGVhbikKKyAgTGluZSAyOTgpIGNhY2hlV2l0aExhbWJkYXNTb2x2ZWQucmVtb3ZlKG5vZGUpID09PiBqYXZhLnV0aWwuTWFwLnJlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI5OSkgY2FjaGVXaXRoTGFtYmRhc1NvbHZlZC5wdXQobm9kZSwgZ2V0VHlwZShub2RlLCB0cnVlKSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMjk5KSBnZXRUeXBlKG5vZGUsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBib29sZWFuKQorICBMaW5lIDMwMSkgbG9nZ2VyLmZpbmVyKCJnZXRUeXBlIG9uICIgKyBub2RlICsgIiAtPiAiICsgcmVzKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVyKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzAzKSBjYWNoZVdpdGhMYW1iZGFzU29sdmVkLmdldChub2RlKSA9PT4gamF2YS51dGlsLk1hcC5nZXQoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzMDUpIGZpbmQoY2FjaGVXaXRoTGFtYmRhc1NvbHZlZCwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZmluZChqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzA2KSByZXMuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDMwNykgcmVzLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzMDkpIGZpbmQoY2FjaGVXaXRob3V0TGFtYmRhc1NvbHZlZCwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZmluZChqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzEwKSByZXMuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDMxMSkgZ2V0VHlwZUNvbmNyZXRlKG5vZGUsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZUNvbmNyZXRlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgYm9vbGVhbikKKyAgTGluZSAzMTIpIGNhY2hlV2l0aG91dExhbWJkYXNTb2x2ZWQucHV0KG5vZGUsIHJlc1R5cGUpID09PiBqYXZhLnV0aWwuTWFwLnB1dChLLCBWKQorICBMaW5lIDMxMykgbG9nZ2VyLmZpbmVyKCJnZXRUeXBlIG9uICIgKyBub2RlICsgIiAobm8gc29sdmVMYW1iZGFzKSAtPiAiICsgcmVzKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVyKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzE2KSByZXMuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDMyMSkgbWFwLmNvbnRhaW5zS2V5KG5vZGUpID09PiBqYXZhLnV0aWwuTWFwLmNvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzIyKSBPcHRpb25hbC5vZihtYXAuZ2V0KG5vZGUpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMzIyKSBtYXAuZ2V0KG5vZGUpID09PiBqYXZhLnV0aWwuTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDMyNSkgZmluZChtYXAsIChMYW1iZGFFeHByKSBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5maW5kKGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByKQorICBMaW5lIDMyNykgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSAzMzgpIG1hcC5rZXlTZXQoKSA9PT4gamF2YS51dGlsLk1hcC5rZXlTZXQoKQorICBMaW5lIDM0MSkga2V5TGFtYmRhRXhwci50b1N0cmluZygpLmVxdWFscyhsYW1iZGFFeHByLnRvU3RyaW5nKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM0MSkga2V5TGFtYmRhRXhwci50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDM0MSkgbGFtYmRhRXhwci50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDM0MSkgZ2V0UGFyZW50Tm9kZShrZXlMYW1iZGFFeHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzNDEpIGdldFBhcmVudE5vZGUobGFtYmRhRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzQyKSBPcHRpb25hbC5vZihtYXAuZ2V0KGtleUxhbWJkYUV4cHIpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMzQyKSBtYXAuZ2V0KGtleUxhbWJkYUV4cHIpID09PiBqYXZhLnV0aWwuTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM0NikgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSAzNTApIG1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDM1MykgbWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwci5nZXRTY29wZSgpCisgIExpbmUgMzU0KSB0eXBlRXhwci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwci5nZXRUeXBlKCkKKyAgTGluZSAzNTUpIHR5cGVFeHByLmdldFR5cGUoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM1NSkgdHlwZUV4cHIuZ2V0VHlwZSgpLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDM1NSkgdHlwZUV4cHIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMzU3KSB0eXBlRXhwci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UeXBlRXhwci5nZXRUeXBlKCkKKyAgTGluZSAzNTgpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY2xhc3NPckludGVyZmFjZVR5cGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDM1OCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjbGFzc09ySW50ZXJmYWNlVHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzNTgpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDM1OCkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMzU5KSB0eXBlRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMzYyKSAoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKS5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKGl0IC0+IGl0LmdldE5hbWUoKS5lcXVhbHMobWV0aG9kUmVmZXJlbmNlRXhwci5nZXRJZGVudGlmaWVyKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMzYyKSAoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKS5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKGl0IC0+IGl0LmdldE5hbWUoKS5lcXVhbHMobWV0aG9kUmVmZXJlbmNlRXhwci5nZXRJZGVudGlmaWVyKCkpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAzNjIpICgoUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpLmdldEFsbE1ldGhvZHMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAzNjIpICgoUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb25TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpLmdldEFsbE1ldGhvZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbE1ldGhvZHMoKQorICBMaW5lIDM2MikgdHlwZURlY2xhcmF0aW9uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMzYyKSBpdC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZFJlZmVyZW5jZUV4cHIuZ2V0SWRlbnRpZmllcigpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNjIpIGl0LmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldE5hbWUoKQorICBMaW5lIDM2MikgbWV0aG9kUmVmZXJlbmNlRXhwci5nZXRJZGVudGlmaWVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByLmdldElkZW50aWZpZXIoKQorICBMaW5lIDM2MikgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMzYzKSBtZXRob2RVc2FnZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzNjcpIG1ldGhvZFVzYWdlcy5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMzc0KSBnZXRUeXBlQ29uY3JldGUobGVmdCwgc29sdmVMYW1iZGFzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlQ29uY3JldGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBib29sZWFuKQorICBMaW5lIDM3NSkgZ2V0VHlwZUNvbmNyZXRlKHJpZ2h0LCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVDb25jcmV0ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGJvb2xlYW4pCisgIExpbmUgMzc2KSByaWdodFR5cGUuaXNBc3NpZ25hYmxlQnkobGVmdFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzOTEpIG5vZGUuYWNjZXB0KHR5cGVFeHRyYWN0b3IsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzOTkpIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDAyKSBmaW5kQ29udGFpbmluZ1R5cGVEZWNsKGdldFBhcmVudE5vZGUobm9kZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmZpbmRDb250YWluaW5nVHlwZURlY2woY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQwMikgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0MDcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnRUb1VzYWdlKHZhci5nZXRUeXBlKCksIHZhcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0MDcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0MDcpIHZhci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpCisgIExpbmUgNDE1KSBjb252ZXJ0VG9Vc2FnZSh0eXBlLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbnRleHQsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA0MTUpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29udGV4dCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0MTkpIGNvbnZlcnRUb1VzYWdlKHR5cGUsIHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDI0KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA0MjQpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDQyNSkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgNDI1KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKQorICBMaW5lIDQyNikgcU5hbWUoY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKS5nZXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUucU5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKQorICBMaW5lIDQyNikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNDI2KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKQorICBMaW5lIDQzNSkgcU5hbWUoY2xhc3NPckludGVyZmFjZVR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnFOYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSkKKyAgTGluZSA0MzYpIGNvbnRleHQuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0MzcpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA0NDApIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDQ0MSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICBMaW5lIDQ0MikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NDIpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDQ0MykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLnN0cmVhbSgpLm1hcCgocHQpIC0+IGNvbnZlcnRUb1VzYWdlKHB0LCBjb250ZXh0KSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gRVJST1IKKyAgTGluZSA0NDMpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5zdHJlYW0oKS5tYXAoKHB0KSAtPiBjb252ZXJ0VG9Vc2FnZShwdCwgY29udGV4dCkpID09PiBFUlJPUgorICBMaW5lIDQ0MykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDQ0MykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA0NDMpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDQ0MykgY29udmVydFRvVXNhZ2UocHQsIGNvbnRleHQpID09PiBFUlJPUgorICBMaW5lIDQ0MykgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgNDQ1KSB0eXBlRGVjbGFyYXRpb24uaXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDQ1MCkgamF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgNDU2KSBQcmltaXRpdmVUeXBlLmJ5TmFtZSgoKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlKSB0eXBlKS5nZXRUeXBlKCkubmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlByaW1pdGl2ZVR5cGUuYnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDU2KSAoKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlKSB0eXBlKS5nZXRUeXBlKCkubmFtZSgpID09PiBqYXZhLmxhbmcuRW51bS5uYW1lKCkKKyAgTGluZSA0NTYpICgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUpIHR5cGUpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgNDU5KSB3aWxkY2FyZFR5cGUuZ2V0RXh0ZW5kZWRUeXBlcygpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NTkpIHdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kZWRUeXBlcygpCisgIExpbmUgNDU5KSB3aWxkY2FyZFR5cGUuZ2V0U3VwZXJUeXBlcygpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NTkpIHdpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0U3VwZXJUeXBlcygpCisgIExpbmUgNDYwKSBXaWxkY2FyZC5leHRlbmRzQm91bmQoY29udmVydFRvVXNhZ2Uod2lsZGNhcmRUeXBlLmdldEV4dGVuZGVkVHlwZXMoKS5nZXQoKSwgY29udGV4dCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQ2MCkgY29udmVydFRvVXNhZ2Uod2lsZGNhcmRUeXBlLmdldEV4dGVuZGVkVHlwZXMoKS5nZXQoKSwgY29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNDYwKSB3aWxkY2FyZFR5cGUuZ2V0RXh0ZW5kZWRUeXBlcygpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA0NjApIHdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kZWRUeXBlcygpCisgIExpbmUgNDYxKSB3aWxkY2FyZFR5cGUuZ2V0RXh0ZW5kZWRUeXBlcygpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NjEpIHdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0RXh0ZW5kZWRUeXBlcygpCisgIExpbmUgNDYxKSB3aWxkY2FyZFR5cGUuZ2V0U3VwZXJUeXBlcygpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NjEpIHdpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5XaWxkY2FyZFR5cGUuZ2V0U3VwZXJUeXBlcygpCisgIExpbmUgNDYyKSBXaWxkY2FyZC5zdXBlckJvdW5kKGNvbnZlcnRUb1VzYWdlKHdpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkuZ2V0KCksIGNvbnRleHQpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLnN1cGVyQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNDYyKSBjb252ZXJ0VG9Vc2FnZSh3aWxkY2FyZFR5cGUuZ2V0U3VwZXJUeXBlcygpLmdldCgpLCBjb250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA0NjIpIHdpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDQ2Mikgd2lsZGNhcmRUeXBlLmdldFN1cGVyVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkKKyAgTGluZSA0NjMpIHdpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGVzKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDQ2Mykgd2lsZGNhcmRUeXBlLmdldEV4dGVuZGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRFeHRlbmRlZFR5cGVzKCkKKyAgTGluZSA0NjMpIHdpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDQ2Mykgd2lsZGNhcmRUeXBlLmdldFN1cGVyVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLldpbGRjYXJkVHlwZS5nZXRTdXBlclR5cGVzKCkKKyAgTGluZSA0NjYpIHdpbGRjYXJkVHlwZS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDQ3MikgY29udmVydFRvVXNhZ2UoanBBcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCBjb250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA0NzIpIGpwQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA0NzQpIHR5cGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0NzQpIHR5cGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNDgwKSBjb252ZXJ0KHR5cGUsIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNDgwKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDg0KSBjb252ZXJ0VG9Vc2FnZSh0eXBlLCBjb250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA0ODkpIGNhbGwuZ2V0QXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKQorICBMaW5lIDQ5MCkgY2FsbC5nZXRBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50cygpCisgIExpbmUgNDkzKSBwYXJhbXMuYWRkKGdldFR5cGUocGFyYW0sIGZhbHNlKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDQ5MykgZ2V0VHlwZShwYXJhbSwgZmFsc2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBib29sZWFuKQorICBMaW5lIDQ5NSkgU3RyaW5nLmZvcm1hdCgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIHR5cGUgb2YgcGFyYW1ldGVyICVzIG9mIG1ldGhvZCBjYWxsICVzIiwgcGFyYW0sIGNhbGwpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDUwMCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjYWxsLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDUwMSkgY29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbC5nZXROYW1lKCkuZ2V0SWQoKSwgcGFyYW1zLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1MDEpIGNhbGwuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNTAxKSBjYWxsLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWUoKQorICBMaW5lIDUwMikgbWV0aG9kVXNhZ2UuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDUwMykgY2FsbC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXROYW1lKCkKKyAgTGluZSA1MDQpIGNhbGwuZ2V0UmFuZ2UoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNTA0KSBjYWxsLmdldFJhbmdlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRSYW5nZSgpCisgIExpbmUgNTA2KSBtZXRob2RVc2FnZS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNTEwKSBKYXZhUGFyc2VyRmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDUxOSkgZ2V0VHlwZURlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKQorICBMaW5lIDUyNCkgZ2V0VHlwZU9mVGhpc0luKGdldFBhcmVudE5vZGUobm9kZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVPZlRoaXNJbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNTI0KSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDUyOSkgSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9KYXZhUGFyc2VyRmFjdG9yeS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfSmF2YVBhcnNlckZhY3RvcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDI0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfSmF2YVBhcnNlckZhY3RvcnkudHh0CkBAIC0wLDAgKzEsMjYgQEAKKyAgTGluZSA3OSkgKChPYmplY3RDcmVhdGlvbkV4cHIpIG5vZGUpLmdldEFub255bW91c0NsYXNzQm9keSgpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA3OSkgKChPYmplY3RDcmVhdGlvbkV4cHIpIG5vZGUpLmdldEFub255bW91c0NsYXNzQm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldEFub255bW91c0NsYXNzQm9keSgpCisgIExpbmUgODQpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA4NCkgbm9kZS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkKKyAgTGluZSA4NCkgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDg0KSBub2RlLmdldFBhcmVudE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKQorICBMaW5lIDg0KSBub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDg0KSBub2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkKKyAgTGluZSA4NCkgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDg0KSBub2RlLmdldFBhcmVudE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKQorICBMaW5lIDg1KSBnZXRDb250ZXh0KG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLmdldFBhcmVudE5vZGUoKS5nZXQoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4NSkgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkuZ2V0UGFyZW50Tm9kZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA4NSkgbm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkuZ2V0UGFyZW50Tm9kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0UGFyZW50Tm9kZSgpCisgIExpbmUgODUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA4NSkgbm9kZS5nZXRQYXJlbnROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRQYXJlbnROb2RlKCkKKyAgTGluZSA4OCkgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4OSkgKChPYmplY3RDcmVhdGlvbkV4cHIpIHBhcmVudE5vZGUpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlKCkKKyAgTGluZSA5MCkgZ2V0Q29udGV4dChnZXRQYXJlbnROb2RlKHBhcmVudE5vZGUpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDkwKSBnZXRQYXJlbnROb2RlKHBhcmVudE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDkyKSBnZXRDb250ZXh0KHBhcmVudE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTAzKSBleHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdC5nZXRFeHByZXNzaW9uKCkKKyAgTGluZSAxMDQpIGV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKQorICBMaW5lIDExMikgZm9yZWFjaFN0bXQuZ2V0VmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10LmdldFZhcmlhYmxlKCkKKyAgTGluZSAxMjApICgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBub2RlKS5pc0ludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkKKyAgTGluZSAxMzIpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMzIpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfTGFtYmRhQXJndW1lbnRUeXBlUGxhY2Vob2xkZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX0xhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX0xhbWJkYUFyZ3VtZW50VHlwZVBsYWNlaG9sZGVyLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX1R5cGVFeHRyYWN0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX1R5cGVFeHRyYWN0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTFhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfVHlwZUV4dHJhY3Rvci50eHQKQEAgLTAsMCArMSwyNzkgQEAKKyAgTGluZSA0MSkgTG9nZ2VyLmdldExvZ2dlcihUeXBlRXh0cmFjdG9yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA0MSkgVHlwZUV4dHJhY3Rvci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0NCkgbG9nZ2VyLnNldExldmVsKExldmVsLklORk8pID09PiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIuc2V0TGV2ZWwoamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisgIExpbmUgNDYpIGNvbnNvbGVIYW5kbGVyLnNldExldmVsKExldmVsLklORk8pID09PiBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyLnNldExldmVsKGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorICBMaW5lIDQ3KSBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlSGFuZGxlcikgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5hZGRIYW5kbGVyKGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIpCisgIExpbmUgNjApIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNjIpIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yKQorICBMaW5lIDYzKSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY1KSBmYWNhZGUuY29udmVydFRvVXNhZ2VWYXJpYWJsZVR5cGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2VWYXJpYWJsZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcikKKyAgTGluZSA2NykgZ2V0UGFyZW50Tm9kZShub2RlKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDY3KSBnZXRQYXJlbnROb2RlKG5vZGUpLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDY3KSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDczKSBub2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRUeXBlKCkKKyAgTGluZSA3NikgZmFjYWRlLmNvbnZlcnRUb1VzYWdlKG5vZGUuZ2V0VHlwZSgpLCBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDc2KSBub2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRUeXBlKCkKKyAgTGluZSA4Mikgbm9kZS5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSA4Mikgbm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgODMpIGFycmF5VXNhZ2VUeXBlLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgODQpICgoQXJyYXlUeXBlKSBhcnJheVVzYWdlVHlwZSkuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDkxKSBmYWNhZGUuY29udmVydFRvVXNhZ2Uobm9kZS5nZXRFbGVtZW50VHlwZSgpLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA5MSkgbm9kZS5nZXRFbGVtZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuZ2V0RWxlbWVudFR5cGUoKQorICBMaW5lIDkxKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgOTIpIG5vZGUuZ2V0TGV2ZWxzKCkuc2l6ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnNpemUoKQorICBMaW5lIDkyKSBub2RlLmdldExldmVscygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHIuZ2V0TGV2ZWxzKCkKKyAgTGluZSAxMDApIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMDApIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTA1KSBub2RlLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTA1KSBub2RlLmdldFRhcmdldCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5nZXRUYXJnZXQoKQorICBMaW5lIDExMCkgbm9kZS5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRPcGVyYXRvcigpCisgIExpbmUgMTE1KSBmYWNhZGUuZ2V0QmluYXJ5VHlwZUNvbmNyZXRlKG5vZGUuZ2V0TGVmdCgpLCBub2RlLmdldFJpZ2h0KCksIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0QmluYXJ5VHlwZUNvbmNyZXRlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBib29sZWFuKQorICBMaW5lIDExNSkgbm9kZS5nZXRMZWZ0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldExlZnQoKQorICBMaW5lIDExNSkgbm9kZS5nZXRSaWdodCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwci5nZXRSaWdodCgpCisgIExpbmUgMTMyKSBub2RlLmdldExlZnQoKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDEzMikgbm9kZS5nZXRMZWZ0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldExlZnQoKQorICBMaW5lIDEzNCkgbm9kZS5nZXRPcGVyYXRvcigpLm5hbWUoKSA9PT4gamF2YS5sYW5nLkVudW0ubmFtZSgpCisgIExpbmUgMTM0KSBub2RlLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSAxNDApIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldFR5cGUoKSwgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgMTQwKSBub2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByLmdldFR5cGUoKQorICBMaW5lIDE0MCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE0Nikgbm9kZS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTQ3KSBmYWNhZGUuY29udmVydFRvVXNhZ2UoYXN0VHlwZSwgbm9kZS5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTQ3KSBub2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwci5nZXRUeXBlKCkKKyAgTGluZSAxNDgpIEltbXV0YWJsZUxpc3Qub2YoanNzVHlwZSkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZihFKQorICBMaW5lIDE1Mykgbm9kZS5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTUzKSBub2RlLmdldFRoZW5FeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Db25kaXRpb25hbEV4cHIuZ2V0VGhlbkV4cHIoKQorICBMaW5lIDE1OCkgbm9kZS5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTU4KSBub2RlLmdldElubmVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FbmNsb3NlZEV4cHIuZ2V0SW5uZXIoKQorICBMaW5lIDE2OCkgcGFyZW50VHlwZS5oYXNGaWVsZChub2RlLmdldE5hbWUoKS5nZXRJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmhhc0ZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTY4KSBub2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE2OCkgbm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTY5KSBwYXJlbnRUeXBlLmdldEZpZWxkKG5vZGUuZ2V0TmFtZSgpLmdldElkKCkpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSAxNjkpIHBhcmVudFR5cGUuZ2V0RmllbGQobm9kZS5nZXROYW1lKCkuZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE2OSkgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNjkpIG5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldE5hbWUoKQorICBMaW5lIDE3MCkgcGFyZW50VHlwZS5oYXNJbnRlcm5hbFR5cGUobm9kZS5nZXROYW1lKCkuZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5oYXNJbnRlcm5hbFR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNzApIG5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTcwKSBub2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXROYW1lKCkKKyAgTGluZSAxNzEpIHBhcmVudFR5cGUuZ2V0SW50ZXJuYWxUeXBlKG5vZGUuZ2V0TmFtZSgpLmdldElkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0SW50ZXJuYWxUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTcxKSBub2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE3MSkgbm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTczKSBub2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE3Mykgbm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTgwKSBub2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDE4MSkgbm9kZS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxODIpIG5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTgzKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShzdGF0aWNWYWx1ZS50b1N0cmluZygpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTgzKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTgzKSBzdGF0aWNWYWx1ZS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDE4NCkgdHlwZUFjY2Vzc2VkU3RhdGljYWxseS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxODYpIHNvbHZlRG90RXhwcmVzc2lvblR5cGUodHlwZUFjY2Vzc2VkU3RhdGljYWxseS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1JlZmVyZW5jZVR5cGUoKSwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLlR5cGVFeHRyYWN0b3Iuc29sdmVEb3RFeHByZXNzaW9uVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIpCisgIExpbmUgMTg3KSB0eXBlQWNjZXNzZWRTdGF0aWNhbGx5LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxODcpIHR5cGVBY2Nlc3NlZFN0YXRpY2FsbHkuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxODkpIG5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTkyKSBmYWNhZGUuc29sdmUoKFRoaXNFeHByKSBub2RlLmdldFNjb3BlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwcikKKyAgTGluZSAxOTIpIG5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTk0KSBzb2x2ZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxOTUpIHNvbHZlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTk3KSBzb2x2ZURvdEV4cHJlc3Npb25UeXBlKGNvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKSwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLlR5cGVFeHRyYWN0b3Iuc29sdmVEb3RFeHByZXNzaW9uVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIpCisgIExpbmUgMTk3KSBjb3JyZXNwb25kaW5nRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDIwMSkgbm9kZS5nZXRTY29wZSgpLnRvU3RyaW5nKCkuaW5kZXhPZignLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLmluZGV4T2YoaW50KQorICBMaW5lIDIwMSkgbm9kZS5nZXRTY29wZSgpLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgMjAxKSBub2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDIwMykgdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShub2RlLmdldFNjb3BlKCkudG9TdHJpbmcoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjAzKSBub2RlLmdldFNjb3BlKCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAyMDMpIG5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgMjA0KSBzci5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAyMDUpIHNvbHZlRG90RXhwcmVzc2lvblR5cGUoc3IuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCksIG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5UeXBlRXh0cmFjdG9yLnNvbHZlRG90RXhwcmVzc2lvblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByKQorICBMaW5lIDIwNSkgc3IuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAyMTApIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xBc1ZhbHVlKG5vZGUuZ2V0RmllbGQoKS5nZXRJZCgpLCBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEFzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDIxMCkgbm9kZS5nZXRGaWVsZCgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMjEwKSBub2RlLmdldEZpZWxkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0RmllbGQoKQorICBMaW5lIDIxNCkgdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShub2RlLnRvU3RyaW5nKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIxNCkgbm9kZS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDIxNSkgc3JlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAyMTYpIHNyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAyMTkpIHZhbHVlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAyMjApIHZhbHVlLmdldCgpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlLmdldFR5cGUoKQorICBMaW5lIDIyMCkgdmFsdWUuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDIyMikgbm9kZS5nZXRGaWVsZCgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMjIyKSBub2RlLmdldEZpZWxkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0RmllbGQoKQorICBMaW5lIDIzMykgbmV3IFJlZmxlY3Rpb25UeXBlU29sdmVyKCkuc29sdmVUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1Mykgbm9kZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoImYiKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1Mykgbm9kZS5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcudG9Mb3dlckNhc2UoKQorICBMaW5lIDI1Mykgbm9kZS5nZXRWYWx1ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwci5nZXRWYWx1ZSgpCisgIExpbmUgMjcxKSBsb2dnZXIuZmluZXN0KCJnZXRUeXBlIG9uIG1ldGhvZCBjYWxsICIgKyBub2RlKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVzdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI3MykgZmFjYWRlLnNvbHZlTWV0aG9kQXNVc2FnZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZU1ldGhvZEFzVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByKQorICBMaW5lIDI3NCkgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBtZXRob2QgY2FsbCAiICsgbm9kZSArICIgcmVzb2x2ZWQgdG8gIiArIHJlZikgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5maW5lc3QoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNzUpIGxvZ2dlci5maW5lc3QoImdldFR5cGUgb24gbWV0aG9kIGNhbGwgIiArIG5vZGUgKyAiIHJldHVybiB0eXBlIGlzICIgKyByZWYucmV0dXJuVHlwZSgpKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVzdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI3NSkgcmVmLnJldHVyblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJldHVyblR5cGUoKQorICBMaW5lIDI3NikgcmVmLnJldHVyblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJldHVyblR5cGUoKQorICBMaW5lIDI4MikgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBuYW1lIGV4cHIgIiArIG5vZGUpID09PiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIuZmluZXN0KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjgzKSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sQXNWYWx1ZShub2RlLmdldE5hbWUoKS5nZXRJZCgpLCBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEFzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI4Mykgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAyODMpIG5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMjg0KSB2YWx1ZS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMjg1KSBub2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDI4NSkgbm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAyODcpIHZhbHVlLmdldCgpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlZhbHVlLmdldFR5cGUoKQorICBMaW5lIDI4NykgdmFsdWUuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDI5MykgZmFjYWRlLmNvbnZlcnRUb1VzYWdlKG5vZGUuZ2V0VHlwZSgpLCBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDI5Mykgbm9kZS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMzAwKSBub2RlLmdldENsYXNzRXhwcigpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzMDApIG5vZGUuZ2V0Q2xhc3NFeHByKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwci5nZXRDbGFzc0V4cHIoKQorICBMaW5lIDMwMikgbm9kZS5nZXRDbGFzc0V4cHIoKS5nZXQoKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDMwMikgbm9kZS5nZXRDbGFzc0V4cHIoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMzAyKSBub2RlLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAzMDQpIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoY2xhc3NOYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMDUpIGNsYXp6LmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDMwNikgY2xhenouZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAzMDkpIG5vZGUuZ2V0QW5jZXN0b3JPZlR5cGUoQ29tcGlsYXRpb25Vbml0LmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkhhc1BhcmVudE5vZGUuZ2V0QW5jZXN0b3JPZlR5cGUoamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDMxMCkgY3UuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDMxMSkgY3UuZ2V0KCkuZ2V0Q2xhc3NCeU5hbWUoY2xhc3NOYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0Q2xhc3NCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMTEpIGN1LmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzMTIpIGNsYXNzQnlOYW1lLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzMTMpIGZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NCeU5hbWUuZ2V0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKQorICBMaW5lIDMxMykgY2xhc3NCeU5hbWUuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDMxOCkgZmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihmYWNhZGUuZmluZENvbnRhaW5pbmdUeXBlRGVjbChub2RlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4pCisgIExpbmUgMzE4KSBmYWNhZGUuZmluZENvbnRhaW5pbmdUeXBlRGVjbChub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5maW5kQ29udGFpbmluZ1R5cGVEZWNsKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzMjMpIGZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oZmFjYWRlLmZpbmRDb250YWluaW5nVHlwZURlY2wobm9kZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDMyMykgZmFjYWRlLmZpbmRDb250YWluaW5nVHlwZURlY2wobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZmluZENvbnRhaW5pbmdUeXBlRGVjbChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzI1KSAoKENsYXNzRGVjbGFyYXRpb24pIHR5cGVPZk5vZGUpLmdldFN1cGVyQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAzMjcpIG5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMjcpIG5vZGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMzMzKSBub2RlLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuZ2V0T3BlcmF0b3IoKQorICBMaW5lIDMzNikgbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzMzYpIG5vZGUuZ2V0RXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldEV4cHJlc3Npb24oKQorICBMaW5lIDM0Mykgbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAzNDMpIG5vZGUuZ2V0RXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldEV4cHJlc3Npb24oKQorICBMaW5lIDM0NSkgbm9kZS5nZXRPcGVyYXRvcigpLm5hbWUoKSA9PT4gamF2YS5sYW5nLkVudW0ubmFtZSgpCisgIExpbmUgMzQ1KSBub2RlLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHIuZ2V0T3BlcmF0b3IoKQorICBMaW5lIDM1MSkgbm9kZS5nZXRWYXJpYWJsZXMoKS5zaXplKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Quc2l6ZSgpCisgIExpbmUgMzUxKSBub2RlLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAzNTQpIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShub2RlLmdldFZhcmlhYmxlcygpLmdldCgwKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2VWYXJpYWJsZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcikKKyAgTGluZSAzNTQpIG5vZGUuZ2V0VmFyaWFibGVzKCkuZ2V0KDApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmdldChpbnQpCisgIExpbmUgMzU0KSBub2RlLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSAzNjApIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzYxKSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDM2MikgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmdldFBhcmFtUG9zKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmdldFBhcmFtUG9zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzNjMpIGZhY2FkZS5zb2x2ZShjYWxsRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByKQorICBMaW5lIDM2NCkgcmVmTWV0aG9kLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDM2NSkgZ2V0UGFyZW50Tm9kZShub2RlKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDM2NSkgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzNjUpIGNhbGxFeHByLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDM2NSkgY2FsbEV4cHIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMzY3KSBsb2dnZXIuZmluZXN0KCJnZXRUeXBlIG9uIGxhbWJkYSBleHByICIgKyByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVzdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM2NykgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMzY3KSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAzNzEpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSAzNzEpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaW50KQorICBMaW5lIDM3MSkgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMzczKSBjYWxsRXhwci5nZXRTY29wZSgpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzNzMpIGNhbGxFeHByLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgMzc0KSBjYWxsRXhwci5nZXRTY29wZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzNzQpIGNhbGxFeHByLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgMzgxKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5hbWVFeHByLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZUV4cHIuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzODEpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobmFtZUV4cHIsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzgxKSBuYW1lRXhwci5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAzODEpIG5hbWVFeHByLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDM4MikgdHlwZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAzOTEpIGZhY2FkZS5nZXRUeXBlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzOTIpIHNjb3BlVHlwZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAzOTMpIHNjb3BlVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShyZXN1bHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLnVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDM5Mykgc2NvcGVUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDM5OSkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQwMCkgZmFjYWRlLnNvbHZlR2VuZXJpY1R5cGVzKHJlc3VsdCwgY3R4LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZUdlbmVyaWNUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDA1KSBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChyZXN1bHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQwNikgZnVuY3Rpb25hbE1ldGhvZC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgNDE1KSBSZWZlcmVuY2VUeXBlSW1wbC51bmRldGVybWluZWRQYXJhbWV0ZXJzKGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkuZ2V0RGVjbGFyYXRpb24oKS5kZWNsYXJpbmdUeXBlKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGwudW5kZXRlcm1pbmVkUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQxNSkgZnVuY3Rpb25hbE1ldGhvZC5nZXQoKS5nZXREZWNsYXJhdGlvbigpLmRlY2xhcmluZ1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmRlY2xhcmluZ1R5cGUoKQorICBMaW5lIDQxNSkgZnVuY3Rpb25hbE1ldGhvZC5nZXQoKS5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDQxNSkgZnVuY3Rpb25hbE1ldGhvZC5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNDE3KSBsYW1iZGFDdHguYWRkUGFpcihyZXN1bHQsIGZ1bmN0aW9uYWxJbnRlcmZhY2VUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQyMSkgbGFtYmRhRXhwci5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldEJvZHkoKQorICBMaW5lIDQyMikgZmFjYWRlLmdldFR5cGUoKChFeHByZXNzaW9uU3RtdCkgbGFtYmRhRXhwci5nZXRCb2R5KCkpLmdldEV4cHJlc3Npb24oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDIyKSAoKEV4cHJlc3Npb25TdG10KSBsYW1iZGFFeHByLmdldEJvZHkoKSkuZ2V0RXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQuZ2V0RXhwcmVzc2lvbigpCisgIExpbmUgNDIyKSBsYW1iZGFFeHByLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0Qm9keSgpCisgIExpbmUgNDIzKSBsYW1iZGFFeHByLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0Qm9keSgpCisgIExpbmUgNDI0KSBsYW1iZGFFeHByLmdldEJvZHkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxhbWJkYUV4cHIuZ2V0Qm9keSgpCisgIExpbmUgNDI1KSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10LmdldFN0YXRlbWVudHMoKQorICBMaW5lIDQyOCkgYmxvY2tTdG10LmdldE5vZGVzQnlUeXBlKFJldHVyblN0bXQuY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZ2V0Tm9kZXNCeVR5cGUoamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDQzMCkgcmV0dXJuU3RtdHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0MzIpIHJldHVyblN0bXRzLnN0cmVhbSgpLm1hcChyZXR1cm5TdG10IC0+IHsKKyAgICBPcHRpb25hbDxFeHByZXNzaW9uPiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgaWYgKGV4cHJlc3Npb24uaXNQcmVzZW50KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24uZ2V0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWb2lkVHlwZS5JTlNUQU5DRTsKKyAgICB9Cit9KS5maWx0ZXIoeCAtPiB4ICE9IG51bGwgJiYgIXguaXNWb2lkKCkgJiYgIXguaXNOdWxsKCkpLmZpbmRGaXJzdCgpLm9yRWxzZShWb2lkVHlwZS5JTlNUQU5DRSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vckVsc2UoVCkKKyAgTGluZSA0MzIpIHJldHVyblN0bXRzLnN0cmVhbSgpLm1hcChyZXR1cm5TdG10IC0+IHsKKyAgICBPcHRpb25hbDxFeHByZXNzaW9uPiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgaWYgKGV4cHJlc3Npb24uaXNQcmVzZW50KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24uZ2V0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWb2lkVHlwZS5JTlNUQU5DRTsKKyAgICB9Cit9KS5maWx0ZXIoeCAtPiB4ICE9IG51bGwgJiYgIXguaXNWb2lkKCkgJiYgIXguaXNOdWxsKCkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDQzMikgcmV0dXJuU3RtdHMuc3RyZWFtKCkubWFwKHJldHVyblN0bXQgLT4geworICAgIE9wdGlvbmFsPEV4cHJlc3Npb24+IGV4cHJlc3Npb24gPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICBpZiAoZXhwcmVzc2lvbi5pc1ByZXNlbnQoKSkgeworICAgICAgICByZXR1cm4gZmFjYWRlLmdldFR5cGUoZXhwcmVzc2lvbi5nZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFZvaWRUeXBlLklOU1RBTkNFOworICAgIH0KK30pLmZpbHRlcih4IC0+IHggIT0gbnVsbCAmJiAheC5pc1ZvaWQoKSAmJiAheC5pc051bGwoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgNDMyKSByZXR1cm5TdG10cy5zdHJlYW0oKS5tYXAocmV0dXJuU3RtdCAtPiB7CisgICAgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbiA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpOworICAgIGlmIChleHByZXNzaW9uLmlzUHJlc2VudCgpKSB7CisgICAgICAgIHJldHVybiBmYWNhZGUuZ2V0VHlwZShleHByZXNzaW9uLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVm9pZFR5cGUuSU5TVEFOQ0U7CisgICAgfQorfSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgNDMyKSByZXR1cm5TdG10cy5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA0MzQpIHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCkKKyAgTGluZSA0MzUpIGV4cHJlc3Npb24uaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDQzNikgZmFjYWRlLmdldFR5cGUoZXhwcmVzc2lvbi5nZXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDM2KSBleHByZXNzaW9uLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA0NDEpIHguaXNWb2lkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVm9pZCgpCisgIExpbmUgNDQxKSB4LmlzTnVsbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc051bGwoKQorICBMaW5lIDQ1NCkgZnVuY3Rpb25hbE1ldGhvZC5nZXQoKS5yZXR1cm5UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkKKyAgTGluZSA0NTQpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDQ1NykgZnVuY0ludGVyZmFjZUN0eC5hZGRQYWlyKGZvcm1hbFR5cGUsIGFjdHVhbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNDU5KSBmdW5jSW50ZXJmYWNlQ3R4LnJlc29sdmUoZnVuY0ludGVyZmFjZUN0eC5hZGRTaW5nbGUoZnVuY3Rpb25hbEludGVyZmFjZVR5cGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNDU5KSBmdW5jSW50ZXJmYWNlQ3R4LmFkZFNpbmdsZShmdW5jdGlvbmFsSW50ZXJmYWNlVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNDY0KSBsYW1iZGFDdHguYWRkUGFpcihyZXN1bHQsIGZ1bmN0aW9uYWxUeXBlV2l0aFJldHVybikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5hZGRQYWlyKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NjUpIGxhbWJkYUN0eC5yZXNvbHZlKGxhbWJkYUN0eC5hZGRTaW5nbGUocmVzdWx0KSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQ2NSkgbGFtYmRhQ3R4LmFkZFNpbmdsZShyZXN1bHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQ3MSkgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKHBvcykuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDQ3MSkgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFBhcmFtKHBvcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgNDcxKSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA0ODApIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDgxKSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQ4MikgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmdldFBhcmFtUG9zKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmdldFBhcmFtUG9zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0ODMpIGZhY2FkZS5zb2x2ZShjYWxsRXhwciwgZmFsc2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwciwgYm9vbGVhbikKKyAgTGluZSA0ODQpIHJlZk1ldGhvZC5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA0ODUpIGdldFBhcmVudE5vZGUobm9kZSkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSA0ODUpIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDg1KSBjYWxsRXhwci5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA0ODUpIGNhbGxFeHByLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWUoKQorICBMaW5lIDQ4NykgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBtZXRob2QgcmVmZXJlbmNlIGV4cHIgIiArIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpID09PiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIuZmluZXN0KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDg3KSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA0ODcpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDQ5MCkgZmFjYWRlLnNvbHZlTWV0aG9kQXNVc2FnZShjYWxsRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcikKKyAgTGluZSA0OTEpIHVzYWdlLmdldFBhcmFtVHlwZShwb3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlKGludCkKKyAgTGluZSA0OTMpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0OTQpIGZhY2FkZS5zb2x2ZUdlbmVyaWNUeXBlcyhyZXN1bHQsIGN0eCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVHZW5lcmljVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQ5OSkgRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QocmVzdWx0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA1MDApIGZ1bmN0aW9uYWxNZXRob2QuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDUwNCkgZmFjYWRlLnRvTWV0aG9kVXNhZ2UobWV0aG9kUmVmZXJlbmNlRXhwcikucmV0dXJuVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpCisgIExpbmUgNTA0KSBmYWNhZGUudG9NZXRob2RVc2FnZShtZXRob2RSZWZlcmVuY2VFeHByKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS50b01ldGhvZFVzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RSZWZlcmVuY2VFeHByKQorICBMaW5lIDUwNSkgZnVuY3Rpb25hbE1ldGhvZC5nZXQoKS5yZXR1cm5UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkKKyAgTGluZSA1MDUpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDUwOCkgaW5mZXJlbmNlQ29udGV4dC5hZGRQYWlyKGZvcm1hbFR5cGUsIGFjdHVhbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTA5KSBpbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoaW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUocmVzdWx0KSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDUwOSkgaW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUocmVzdWx0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFNpbmdsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA1MTUpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSA1MTUpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaW50KQorICBMaW5lIDUxNSkgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfVHlwZUV4dHJhY3Rvcl9KOS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfVHlwZUV4dHJhY3Rvcl9KOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjMTEzZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9UeXBlRXh0cmFjdG9yX0o5LnR4dApAQCAtMCwwICsxLDI3OSBAQAorICBMaW5lIDQxKSBMb2dnZXIuZ2V0TG9nZ2VyKFR5cGVFeHRyYWN0b3IuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmdldExvZ2dlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQxKSBUeXBlRXh0cmFjdG9yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQ0KSBsb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTykgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5zZXRMZXZlbChqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKyAgTGluZSA0NikgY29uc29sZUhhbmRsZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTykgPT0+IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXIuc2V0TGV2ZWwoamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisgIExpbmUgNDcpIGxvZ2dlci5hZGRIYW5kbGVyKGNvbnNvbGVIYW5kbGVyKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmFkZEhhbmRsZXIoamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcikKKyAgTGluZSA2MCkgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2MikgZmFjYWRlLmNvbnZlcnRUb1VzYWdlVmFyaWFibGVUeXBlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlVmFyaWFibGVUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IpCisgIExpbmUgNjMpIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNjUpIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yKQorICBMaW5lIDY3KSBnZXRQYXJlbnROb2RlKG5vZGUpLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNjcpIGdldFBhcmVudE5vZGUobm9kZSkuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNjcpIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzMpIG5vZGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldFR5cGUoKQorICBMaW5lIDc2KSBmYWNhZGUuY29udmVydFRvVXNhZ2Uobm9kZS5nZXRUeXBlKCksIG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzYpIG5vZGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmdldFR5cGUoKQorICBMaW5lIDgyKSBub2RlLmdldE5hbWUoKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDgyKSBub2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwci5nZXROYW1lKCkKKyAgTGluZSA4MykgYXJyYXlVc2FnZVR5cGUuaXNBcnJheSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0FycmF5KCkKKyAgTGluZSA4NCkgKChBcnJheVR5cGUpIGFycmF5VXNhZ2VUeXBlKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgOTEpIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldEVsZW1lbnRUeXBlKCksIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDkxKSBub2RlLmdldEVsZW1lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRFbGVtZW50VHlwZSgpCisgIExpbmUgOTEpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5Mikgbm9kZS5nZXRMZXZlbHMoKS5zaXplKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Quc2l6ZSgpCisgIExpbmUgOTIpIG5vZGUuZ2V0TGV2ZWxzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwci5nZXRMZXZlbHMoKQorICBMaW5lIDEwMCkgbm9kZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEwMCkgbm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxMDUpIG5vZGUuZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIHNvbHZlTGFtYmRhcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGUuYWNjZXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjxSLCBBPiwgQSkKKyAgTGluZSAxMDUpIG5vZGUuZ2V0VGFyZ2V0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByLmdldFRhcmdldCgpCisgIExpbmUgMTEwKSBub2RlLmdldE9wZXJhdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSAxMTUpIGZhY2FkZS5nZXRCaW5hcnlUeXBlQ29uY3JldGUobm9kZS5nZXRMZWZ0KCksIG5vZGUuZ2V0UmlnaHQoKSwgc29sdmVMYW1iZGFzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRCaW5hcnlUeXBlQ29uY3JldGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGJvb2xlYW4pCisgIExpbmUgMTE1KSBub2RlLmdldExlZnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0TGVmdCgpCisgIExpbmUgMTE1KSBub2RlLmdldFJpZ2h0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByLmdldFJpZ2h0KCkKKyAgTGluZSAxMzIpIG5vZGUuZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMTMyKSBub2RlLmdldExlZnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0TGVmdCgpCisgIExpbmUgMTM0KSBub2RlLmdldE9wZXJhdG9yKCkubmFtZSgpID09PiBqYXZhLmxhbmcuRW51bS5uYW1lKCkKKyAgTGluZSAxMzQpIG5vZGUuZ2V0T3BlcmF0b3IoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkJpbmFyeUV4cHIuZ2V0T3BlcmF0b3IoKQorICBMaW5lIDE0MCkgZmFjYWRlLmNvbnZlcnRUb1VzYWdlKG5vZGUuZ2V0VHlwZSgpLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0VG9Vc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSAxNDApIG5vZGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2FzdEV4cHIuZ2V0VHlwZSgpCisgIExpbmUgMTQwKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTQ2KSBub2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwci5nZXRUeXBlKCkKKyAgTGluZSAxNDcpIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShhc3RUeXBlLCBub2RlLmdldFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNDcpIG5vZGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByLmdldFR5cGUoKQorICBMaW5lIDE0OCkgSW1tdXRhYmxlTGlzdC5vZihqc3NUeXBlKSA9PT4gamF2YS51dGlsLkxpc3Qub2YoRS4uLikKKyAgTGluZSAxNTMpIG5vZGUuZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1Mykgbm9kZS5nZXRUaGVuRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByLmdldFRoZW5FeHByKCkKKyAgTGluZSAxNTgpIG5vZGUuZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgc29sdmVMYW1iZGFzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZpc2l0YWJsZS5hY2NlcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yPFIsIEE+LCBBKQorICBMaW5lIDE1OCkgbm9kZS5nZXRJbm5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByLmdldElubmVyKCkKKyAgTGluZSAxNjgpIHBhcmVudFR5cGUuaGFzRmllbGQobm9kZS5nZXROYW1lKCkuZ2V0SWQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5oYXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE2OCkgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNjgpIG5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldE5hbWUoKQorICBMaW5lIDE2OSkgcGFyZW50VHlwZS5nZXRGaWVsZChub2RlLmdldE5hbWUoKS5nZXRJZCgpKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMTY5KSBwYXJlbnRUeXBlLmdldEZpZWxkKG5vZGUuZ2V0TmFtZSgpLmdldElkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0RmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNjkpIG5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTY5KSBub2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXROYW1lKCkKKyAgTGluZSAxNzApIHBhcmVudFR5cGUuaGFzSW50ZXJuYWxUeXBlKG5vZGUuZ2V0TmFtZSgpLmdldElkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaGFzSW50ZXJuYWxUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTcwKSBub2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE3MCkgbm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTcxKSBwYXJlbnRUeXBlLmdldEludGVybmFsVHlwZShub2RlLmdldE5hbWUoKS5nZXRJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldEludGVybmFsVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE3MSkgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNzEpIG5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldE5hbWUoKQorICBMaW5lIDE3Mykgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNzMpIG5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldE5hbWUoKQorICBMaW5lIDE4MCkgbm9kZS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxODEpIG5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgMTgyKSBub2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDE4MykgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUoc3RhdGljVmFsdWUudG9TdHJpbmcoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE4MykgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE4Mykgc3RhdGljVmFsdWUudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAxODQpIHR5cGVBY2Nlc3NlZFN0YXRpY2FsbHkuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTg2KSBzb2x2ZURvdEV4cHJlc3Npb25UeXBlKHR5cGVBY2Nlc3NlZFN0YXRpY2FsbHkuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNSZWZlcmVuY2VUeXBlKCksIG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5UeXBlRXh0cmFjdG9yLnNvbHZlRG90RXhwcmVzc2lvblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByKQorICBMaW5lIDE4NykgdHlwZUFjY2Vzc2VkU3RhdGljYWxseS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTg3KSB0eXBlQWNjZXNzZWRTdGF0aWNhbGx5LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTg5KSBub2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDE5MikgZmFjYWRlLnNvbHZlKChUaGlzRXhwcikgbm9kZS5nZXRTY29wZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIpCisgIExpbmUgMTkyKSBub2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDE5NCkgc29sdmUuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTk1KSBzb2x2ZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDE5Nykgc29sdmVEb3RFeHByZXNzaW9uVHlwZShjb3JyZXNwb25kaW5nRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCksIG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5UeXBlRXh0cmFjdG9yLnNvbHZlRG90RXhwcmVzc2lvblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByKQorICBMaW5lIDE5NykgY29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyMDEpIG5vZGUuZ2V0U2NvcGUoKS50b1N0cmluZygpLmluZGV4T2YoJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5pbmRleE9mKGludCkKKyAgTGluZSAyMDEpIG5vZGUuZ2V0U2NvcGUoKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDIwMSkgbm9kZS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldFNjb3BlKCkKKyAgTGluZSAyMDMpIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUobm9kZS5nZXRTY29wZSgpLnRvU3RyaW5nKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIwMykgbm9kZS5nZXRTY29wZSgpLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgMjAzKSBub2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDIwNCkgc3IuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjA1KSBzb2x2ZURvdEV4cHJlc3Npb25UeXBlKHNyLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLCBub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuVHlwZUV4dHJhY3Rvci5zb2x2ZURvdEV4cHJlc3Npb25UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwcikKKyAgTGluZSAyMDUpIHNyLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMjEwKSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sQXNWYWx1ZShub2RlLmdldEZpZWxkKCkuZ2V0SWQoKSwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xBc1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyMTApIG5vZGUuZ2V0RmllbGQoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDIxMCkgbm9kZS5nZXRGaWVsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldEZpZWxkKCkKKyAgTGluZSAyMTQpIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUobm9kZS50b1N0cmluZygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMTQpIG5vZGUudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAyMTUpIHNyZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjE2KSBzcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMjE5KSB2YWx1ZS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMjIwKSB2YWx1ZS5nZXQoKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZS5nZXRUeXBlKCkKKyAgTGluZSAyMjApIHZhbHVlLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAyMjIpIG5vZGUuZ2V0RmllbGQoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDIyMikgbm9kZS5nZXRGaWVsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldEZpZWxkKCkKKyAgTGluZSAyMzMpIG5ldyBSZWZsZWN0aW9uVHlwZVNvbHZlcigpLnNvbHZlVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNTMpIG5vZGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCJmIikgPT0+IGphdmEubGFuZy5TdHJpbmcuZW5kc1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNTMpIG5vZGUuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpID09PiBqYXZhLmxhbmcuU3RyaW5nLnRvTG93ZXJDYXNlKCkKKyAgTGluZSAyNTMpIG5vZGUuZ2V0VmFsdWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxpdGVyYWxTdHJpbmdWYWx1ZUV4cHIuZ2V0VmFsdWUoKQorICBMaW5lIDI3MSkgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBtZXRob2QgY2FsbCAiICsgbm9kZSkgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5maW5lc3QoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNzMpIGZhY2FkZS5zb2x2ZU1ldGhvZEFzVXNhZ2Uobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcikKKyAgTGluZSAyNzQpIGxvZ2dlci5maW5lc3QoImdldFR5cGUgb24gbWV0aG9kIGNhbGwgIiArIG5vZGUgKyAiIHJlc29sdmVkIHRvICIgKyByZWYpID09PiBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIuZmluZXN0KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjc1KSBsb2dnZXIuZmluZXN0KCJnZXRUeXBlIG9uIG1ldGhvZCBjYWxsICIgKyBub2RlICsgIiByZXR1cm4gdHlwZSBpcyAiICsgcmVmLnJldHVyblR5cGUoKSkgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5maW5lc3QoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNzUpIHJlZi5yZXR1cm5UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkKKyAgTGluZSAyNzYpIHJlZi5yZXR1cm5UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkKKyAgTGluZSAyODIpIGxvZ2dlci5maW5lc3QoImdldFR5cGUgb24gbmFtZSBleHByICIgKyBub2RlKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVzdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI4MykgbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVN5bWJvbEFzVmFsdWUobm9kZS5nZXROYW1lKCkuZ2V0SWQoKSwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xBc1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyODMpIG5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMjgzKSBub2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDI4NCkgdmFsdWUuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDI4NSkgbm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAyODUpIG5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMjg3KSB2YWx1ZS5nZXQoKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZS5nZXRUeXBlKCkKKyAgTGluZSAyODcpIHZhbHVlLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAyOTMpIGZhY2FkZS5jb252ZXJ0VG9Vc2FnZShub2RlLmdldFR5cGUoKSwgbm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAyOTMpIG5vZGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDMwMCkgbm9kZS5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMzAwKSBub2RlLmdldENsYXNzRXhwcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHIuZ2V0Q2xhc3NFeHByKCkKKyAgTGluZSAzMDIpIG5vZGUuZ2V0Q2xhc3NFeHByKCkuZ2V0KCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAzMDIpIG5vZGUuZ2V0Q2xhc3NFeHByKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDMwMikgbm9kZS5nZXRDbGFzc0V4cHIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlRoaXNFeHByLmdldENsYXNzRXhwcigpCisgIExpbmUgMzA0KSB0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGNsYXNzTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzA1KSBjbGF6ei5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAzMDYpIGNsYXp6LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMzA5KSBub2RlLmdldEFuY2VzdG9yT2ZUeXBlKENvbXBpbGF0aW9uVW5pdC5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlLmdldEFuY2VzdG9yT2ZUeXBlKGphdmEubGFuZy5DbGFzczxOPikKKyAgTGluZSAzMTApIGN1LmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzMTEpIGN1LmdldCgpLmdldENsYXNzQnlOYW1lKGNsYXNzTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldENsYXNzQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzExKSBjdS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMzEyKSBjbGFzc0J5TmFtZS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMzEzKSBmYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzQnlOYW1lLmdldCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikKKyAgTGluZSAzMTMpIGNsYXNzQnlOYW1lLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzMTgpIGZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oZmFjYWRlLmZpbmRDb250YWluaW5nVHlwZURlY2wobm9kZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDMxOCkgZmFjYWRlLmZpbmRDb250YWluaW5nVHlwZURlY2wobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZmluZENvbnRhaW5pbmdUeXBlRGVjbChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzIzKSBmYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGZhY2FkZS5maW5kQ29udGFpbmluZ1R5cGVEZWNsKG5vZGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PikKKyAgTGluZSAzMjMpIGZhY2FkZS5maW5kQ29udGFpbmluZ1R5cGVEZWNsKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmZpbmRDb250YWluaW5nVHlwZURlY2woY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDMyNSkgKChDbGFzc0RlY2xhcmF0aW9uKSB0eXBlT2ZOb2RlKS5nZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMzI3KSBub2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzI3KSBub2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDMzMykgbm9kZS5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSAzMzYpIG5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzM2KSBub2RlLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5nZXRFeHByZXNzaW9uKCkKKyAgTGluZSAzNDMpIG5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBzb2x2ZUxhbWJkYXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVmlzaXRhYmxlLmFjY2VwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I8UiwgQT4sIEEpCisgIExpbmUgMzQzKSBub2RlLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwci5nZXRFeHByZXNzaW9uKCkKKyAgTGluZSAzNDUpIG5vZGUuZ2V0T3BlcmF0b3IoKS5uYW1lKCkgPT0+IGphdmEubGFuZy5FbnVtLm5hbWUoKQorICBMaW5lIDM0NSkgbm9kZS5nZXRPcGVyYXRvcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVW5hcnlFeHByLmdldE9wZXJhdG9yKCkKKyAgTGluZSAzNTEpIG5vZGUuZ2V0VmFyaWFibGVzKCkuc2l6ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnNpemUoKQorICBMaW5lIDM1MSkgbm9kZS5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldFZhcmlhYmxlcygpCisgIExpbmUgMzU0KSBmYWNhZGUuY29udmVydFRvVXNhZ2VWYXJpYWJsZVR5cGUobm9kZS5nZXRWYXJpYWJsZXMoKS5nZXQoMCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlVmFyaWFibGVUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IpCisgIExpbmUgMzU0KSBub2RlLmdldFZhcmlhYmxlcygpLmdldCgwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDM1NCkgbm9kZS5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldFZhcmlhYmxlcygpCisgIExpbmUgMzYwKSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDM2MSkgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAzNjIpIEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5nZXRQYXJhbVBvcyhub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5nZXRQYXJhbVBvcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzYzKSBmYWNhZGUuc29sdmUoY2FsbEV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcikKKyAgTGluZSAzNjQpIHJlZk1ldGhvZC5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAzNjUpIGdldFBhcmVudE5vZGUobm9kZSkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAzNjUpIGdldFBhcmVudE5vZGUobm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzY1KSBjYWxsRXhwci5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAzNjUpIGNhbGxFeHByLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldE5hbWUoKQorICBMaW5lIDM2NykgbG9nZ2VyLmZpbmVzdCgiZ2V0VHlwZSBvbiBsYW1iZGEgZXhwciAiICsgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSkgPT0+IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5maW5lc3QoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzNjcpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDM2NykgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMzcxKSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UGFyYW0ocG9zKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMzcxKSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UGFyYW0ocG9zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSAzNzEpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDM3MykgY2FsbEV4cHIuZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMzczKSBjYWxsRXhwci5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDM3NCkgY2FsbEV4cHIuZ2V0U2NvcGUoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMzc0KSBjYWxsRXhwci5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDM4MSkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChuYW1lRXhwciwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWVFeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzgxKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5hbWVFeHByLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDM4MSkgbmFtZUV4cHIuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMzgxKSBuYW1lRXhwci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci5nZXROYW1lKCkKKyAgTGluZSAzODIpIHR5cGUuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMzkxKSBmYWNhZGUuZ2V0VHlwZShzY29wZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMzkyKSBzY29wZVR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMzkzKSBzY29wZVR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUocmVzdWx0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlci51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzOTMpIHNjb3BlVHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAzOTkpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0MDApIGZhY2FkZS5zb2x2ZUdlbmVyaWNUeXBlcyhyZXN1bHQsIGN0eCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVHZW5lcmljVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQwNSkgRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QocmVzdWx0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0MDYpIGZ1bmN0aW9uYWxNZXRob2QuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDQxNSkgUmVmZXJlbmNlVHlwZUltcGwudW5kZXRlcm1pbmVkUGFyYW1ldGVycyhmdW5jdGlvbmFsTWV0aG9kLmdldCgpLmdldERlY2xhcmF0aW9uKCkuZGVjbGFyaW5nVHlwZSgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGVJbXBsLnVuZGV0ZXJtaW5lZFBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0MTUpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkuZ2V0RGVjbGFyYXRpb24oKS5kZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkKKyAgTGluZSA0MTUpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkuZ2V0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSA0MTUpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDQxNykgbGFtYmRhQ3R4LmFkZFBhaXIocmVzdWx0LCBmdW5jdGlvbmFsSW50ZXJmYWNlVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5hZGRQYWlyKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0MjEpIGxhbWJkYUV4cHIuZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwci5nZXRCb2R5KCkKKyAgTGluZSA0MjIpIGZhY2FkZS5nZXRUeXBlKCgoRXhwcmVzc2lvblN0bXQpIGxhbWJkYUV4cHIuZ2V0Qm9keSgpKS5nZXRFeHByZXNzaW9uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQyMikgKChFeHByZXNzaW9uU3RtdCkgbGFtYmRhRXhwci5nZXRCb2R5KCkpLmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10LmdldEV4cHJlc3Npb24oKQorICBMaW5lIDQyMikgbGFtYmRhRXhwci5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldEJvZHkoKQorICBMaW5lIDQyMykgbGFtYmRhRXhwci5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldEJvZHkoKQorICBMaW5lIDQyNCkgbGFtYmRhRXhwci5nZXRCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldEJvZHkoKQorICBMaW5lIDQyNSkgYmxvY2tTdG10LmdldFN0YXRlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkKKyAgTGluZSA0MjgpIGJsb2NrU3RtdC5nZXROb2Rlc0J5VHlwZShSZXR1cm5TdG10LmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldE5vZGVzQnlUeXBlKGphdmEubGFuZy5DbGFzczxOPikKKyAgTGluZSA0MzApIHJldHVyblN0bXRzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNDMyKSByZXR1cm5TdG10cy5zdHJlYW0oKS5tYXAocmV0dXJuU3RtdCAtPiB7CisgICAgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbiA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpOworICAgIGlmIChleHByZXNzaW9uLmlzUHJlc2VudCgpKSB7CisgICAgICAgIHJldHVybiBmYWNhZGUuZ2V0VHlwZShleHByZXNzaW9uLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVm9pZFR5cGUuSU5TVEFOQ0U7CisgICAgfQorfSkuZmlsdGVyKHggLT4geCAhPSBudWxsICYmICF4LmlzVm9pZCgpICYmICF4LmlzTnVsbCgpKS5maW5kRmlyc3QoKS5vckVsc2UoVm9pZFR5cGUuSU5TVEFOQ0UpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub3JFbHNlKFQpCisgIExpbmUgNDMyKSByZXR1cm5TdG10cy5zdHJlYW0oKS5tYXAocmV0dXJuU3RtdCAtPiB7CisgICAgT3B0aW9uYWw8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbiA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpOworICAgIGlmIChleHByZXNzaW9uLmlzUHJlc2VudCgpKSB7CisgICAgICAgIHJldHVybiBmYWNhZGUuZ2V0VHlwZShleHByZXNzaW9uLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVm9pZFR5cGUuSU5TVEFOQ0U7CisgICAgfQorfSkuZmlsdGVyKHggLT4geCAhPSBudWxsICYmICF4LmlzVm9pZCgpICYmICF4LmlzTnVsbCgpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSA0MzIpIHJldHVyblN0bXRzLnN0cmVhbSgpLm1hcChyZXR1cm5TdG10IC0+IHsKKyAgICBPcHRpb25hbDxFeHByZXNzaW9uPiBleHByZXNzaW9uID0gcmV0dXJuU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgaWYgKGV4cHJlc3Npb24uaXNQcmVzZW50KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24uZ2V0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBWb2lkVHlwZS5JTlNUQU5DRTsKKyAgICB9Cit9KS5maWx0ZXIoeCAtPiB4ICE9IG51bGwgJiYgIXguaXNWb2lkKCkgJiYgIXguaXNOdWxsKCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDQzMikgcmV0dXJuU3RtdHMuc3RyZWFtKCkubWFwKHJldHVyblN0bXQgLT4geworICAgIE9wdGlvbmFsPEV4cHJlc3Npb24+IGV4cHJlc3Npb24gPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKTsKKyAgICBpZiAoZXhwcmVzc2lvbi5pc1ByZXNlbnQoKSkgeworICAgICAgICByZXR1cm4gZmFjYWRlLmdldFR5cGUoZXhwcmVzc2lvbi5nZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFZvaWRUeXBlLklOU1RBTkNFOworICAgIH0KK30pID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDQzMikgcmV0dXJuU3RtdHMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNDM0KSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpCisgIExpbmUgNDM1KSBleHByZXNzaW9uLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0MzYpIGZhY2FkZS5nZXRUeXBlKGV4cHJlc3Npb24uZ2V0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQzNikgZXhwcmVzc2lvbi5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNDQxKSB4LmlzVm9pZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ZvaWQoKQorICBMaW5lIDQ0MSkgeC5pc051bGwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNOdWxsKCkKKyAgTGluZSA0NTQpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkucmV0dXJuVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpCisgIExpbmUgNDU0KSBmdW5jdGlvbmFsTWV0aG9kLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA0NTcpIGZ1bmNJbnRlcmZhY2VDdHguYWRkUGFpcihmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQ1OSkgZnVuY0ludGVyZmFjZUN0eC5yZXNvbHZlKGZ1bmNJbnRlcmZhY2VDdHguYWRkU2luZ2xlKGZ1bmN0aW9uYWxJbnRlcmZhY2VUeXBlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQ1OSkgZnVuY0ludGVyZmFjZUN0eC5hZGRTaW5nbGUoZnVuY3Rpb25hbEludGVyZmFjZVR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDQ2NCkgbGFtYmRhQ3R4LmFkZFBhaXIocmVzdWx0LCBmdW5jdGlvbmFsVHlwZVdpdGhSZXR1cm4pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNDY1KSBsYW1iZGFDdHgucmVzb2x2ZShsYW1iZGFDdHguYWRkU2luZ2xlKHJlc3VsdCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NjUpIGxhbWJkYUN0eC5hZGRTaW5nbGUocmVzdWx0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFNpbmdsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NzEpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSA0NzEpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRQYXJhbShwb3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaW50KQorICBMaW5lIDQ3MSkgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgNDgwKSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQ4MSkgZ2V0UGFyZW50Tm9kZShub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0ODIpIEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5nZXRQYXJhbVBvcyhub2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5nZXRQYXJhbVBvcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDgzKSBmYWNhZGUuc29sdmUoY2FsbEV4cHIsIGZhbHNlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5zb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIsIGJvb2xlYW4pCisgIExpbmUgNDg0KSByZWZNZXRob2QuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgNDg1KSBnZXRQYXJlbnROb2RlKG5vZGUpLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgNDg1KSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQ4NSkgY2FsbEV4cHIuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNDg1KSBjYWxsRXhwci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXROYW1lKCkKKyAgTGluZSA0ODcpIGxvZ2dlci5maW5lc3QoImdldFR5cGUgb24gbWV0aG9kIHJlZmVyZW5jZSBleHByICIgKyByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKSA9PT4gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmZpbmVzdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQ4NykgcmVmTWV0aG9kLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNDg3KSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA0OTApIGZhY2FkZS5zb2x2ZU1ldGhvZEFzVXNhZ2UoY2FsbEV4cHIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlTWV0aG9kQXNVc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIpCisgIExpbmUgNDkxKSB1c2FnZS5nZXRQYXJhbVR5cGUocG9zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpbnQpCisgIExpbmUgNDkzKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDk0KSBmYWNhZGUuc29sdmVHZW5lcmljVHlwZXMocmVzdWx0LCBjdHgsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLnNvbHZlR2VuZXJpY1R5cGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0OTkpIEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKHJlc3VsdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTAwKSBmdW5jdGlvbmFsTWV0aG9kLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA1MDQpIGZhY2FkZS50b01ldGhvZFVzYWdlKG1ldGhvZFJlZmVyZW5jZUV4cHIpLnJldHVyblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJldHVyblR5cGUoKQorICBMaW5lIDUwNCkgZmFjYWRlLnRvTWV0aG9kVXNhZ2UobWV0aG9kUmVmZXJlbmNlRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUudG9NZXRob2RVc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcikKKyAgTGluZSA1MDUpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkucmV0dXJuVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpCisgIExpbmUgNTA1KSBmdW5jdGlvbmFsTWV0aG9kLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA1MDgpIGluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDUwOSkgaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKHJlc3VsdCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA1MDkpIGluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKHJlc3VsdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTE1KSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UGFyYW0ocG9zKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgNTE1KSByZWZNZXRob2QuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuZ2V0UGFyYW0ocG9zKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSA1MTUpIHJlZk1ldGhvZC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX1Vuc29sdmVkU3ltYm9sRXhjZXB0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1YWI5MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi50eHQKQEAgLTAsMCArMSBAQAorICBMaW5lIDQzKSBjb250ZXh0LnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0Fic3RyYWN0SmF2YVBhcnNlckNvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0Fic3RyYWN0SmF2YVBhcnNlckNvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MWE5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC50eHQKQEAgLTAsMCArMSwzMCBAQAorICBMaW5lIDQ5KSBzeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvci5nZXRTeW1ib2xEZWNsYXJhdGlvbnMoKQorICBMaW5lIDUwKSBkZWNsLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTApIGRlY2wuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1MSkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChkZWNsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgNTQpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQorICBMaW5lIDc2KSBnZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA3Nikgby5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA4MCkgd3JhcHBlZE5vZGUuZXF1YWxzKHRoYXQud3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODcpIHdyYXBwZWROb2RlLmhhc2hDb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5oYXNoQ29kZSgpCisgIExpbmUgOTIpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgOTQpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgOTYpIHBhcmVudC5zb2x2ZUdlbmVyaWNUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlR2VuZXJpY1R5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTAyKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMDMpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwNSkgcGFyZW50Q2FsbC5nZXRBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50cygpCisgIExpbmUgMTA2KSBwYXJlbnRDYWxsLmdldEFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0QXJndW1lbnRzKCkKKyAgTGluZSAxMTMpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExNSkgZ2V0UGFyZW50Tm9kZShub3RNZXRob2QpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExNykgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub3RNZXRob2QsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTIwKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjIpIGdldFBhcmVudE5vZGUobm90TWV0aG9kKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjQpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm90TWV0aG9kLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEzMikgc3ltYm9sRGVjbGFyYXRvci5nZXRTeW1ib2xEZWNsYXJhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoZCAtPiBkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLm1hcChkIC0+IFZhbHVlLmZyb20oZCkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDEzMikgc3ltYm9sRGVjbGFyYXRvci5nZXRTeW1ib2xEZWNsYXJhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoZCAtPiBkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLm1hcChkIC0+IFZhbHVlLmZyb20oZCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDEzMikgc3ltYm9sRGVjbGFyYXRvci5nZXRTeW1ib2xEZWNsYXJhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoZCAtPiBkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDEzMikgc3ltYm9sRGVjbGFyYXRvci5nZXRTeW1ib2xEZWNsYXJhdGlvbnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMzIpIHN5bWJvbERlY2xhcmF0b3IuZ2V0U3ltYm9sRGVjbGFyYXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpCisgIExpbmUgMTMzKSBkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTMzKSBkLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTM0KSBWYWx1ZS5mcm9tKGQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWUuZnJvbShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0Fic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQWJzdHJhY3RNZXRob2RMaWtlRGVjbGFyYXRpb25Db250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQyMWVjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0Fic3RyYWN0TWV0aG9kTGlrZURlY2xhcmF0aW9uQ29udGV4dC50eHQKQEAgLTAsMCArMSw0NCBAQAorICBMaW5lIDM0KSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoUGFyYW1ldGVycy5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAzNSkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihwYXJhbWV0ZXIsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzYpIEFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuc29sdmVXaXRoKHNiLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbERlY2xhcmF0b3IsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzcpIHN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA0MykgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDMpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgNDgpIHdyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZVBhcmFtZXRlcnMuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDQ5KSB0cC5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDkpIHRwLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDQ5KSB0cC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDUwKSBPcHRpb25hbC5vZihuZXcgVHlwZVZhcmlhYmxlKG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcih0cCwgdHlwZVNvbHZlcikpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNTMpIHN1cGVyLnNvbHZlR2VuZXJpY1R5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuc29sdmVHZW5lcmljVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1OCkgd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNTkpIEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3IocGFyYW1ldGVyLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDYwKSBzb2x2ZVdpdGhBc1ZhbHVlKHNiLCBuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGhBc1ZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MSkgc3ltYm9sUmVmZXJlbmNlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA2OCkgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2OCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA3Mykgd3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlUGFyYW1ldGVycy5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgNzQpIHdyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZVBhcmFtZXRlcnMuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDc1KSB0cC5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzUpIHRwLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDc1KSB0cC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDc2KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcih0cCwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA4Mikgd3JhcHBlZE5vZGUuZ2V0Q2hpbGROb2Rlc0J5VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldENoaWxkTm9kZXNCeVR5cGUoamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDg1KSBsb2NhbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg1KSBsb2NhbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgODUpIGxvY2FsVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgODYpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGxvY2FsVHlwZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA4NikgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGxvY2FsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4pCisgIExpbmUgODYpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4NykgbmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiIsIGxvY2FsVHlwZS5nZXROYW1lKCkpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODcpIFN0cmluZy5mb3JtYXQoIiVzLiIsIGxvY2FsVHlwZS5nZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDg3KSBsb2NhbFR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDg4KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGxvY2FsVHlwZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKGxvY2FsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5sZW5ndGgoKSArIDEpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgODgpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobG9jYWxUeXBlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDg5KSBuYW1lLnN1YnN0cmluZyhsb2NhbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkubGVuZ3RoKCkgKyAxKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50KQorICBMaW5lIDg5KSBsb2NhbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSA4OSkgbG9jYWxUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDg5KSBsb2NhbFR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDkzKSBnZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDkzKSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDk5KSBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgOTkpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkNvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0Fub255bW91c0NsYXNzRGVjbGFyYXRpb25Db250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTU2MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0Fub255bW91c0NsYXNzRGVjbGFyYXRpb25Db250ZXh0LnR4dApAQCAtMCwwICsxLDk2IEBACisgIExpbmUgMzcpIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChub2RlLmdldEFub255bW91c0NsYXNzQm9keSgpLmlzUHJlc2VudCgpLCAiQW4gYW5vbnltb3VzIGNsYXNzIG11c3QgaGF2ZSBhIGJvZHkiKSA9PT4gY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoYm9vbGVhbiwgamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNykgbm9kZS5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMzcpIG5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkKKyAgTGluZSA0NykgbXlEZWNsYXJhdGlvbi5nZXREZWNsYXJlZE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgJiYgKCFzdGF0aWNPbmx5IHx8IG0uaXNTdGF0aWMoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA0NykgbXlEZWNsYXJhdGlvbi5nZXREZWNsYXJlZE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgJiYgKCFzdGF0aWNPbmx5IHx8IG0uaXNTdGF0aWMoKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDQ3KSBteURlY2xhcmF0aW9uLmdldERlY2xhcmVkTWV0aG9kcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDQ3KSBteURlY2xhcmF0aW9uLmdldERlY2xhcmVkTWV0aG9kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSA1MCkgbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUwKSBtLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNTApIG0uaXNTdGF0aWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24uaXNTdGF0aWMoKQorICBMaW5lIDUxKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSA1MykgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobXlEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUzKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNTMpIG15RGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNTQpIG15RGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKQorICBMaW5lIDU2KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTYpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDY0KSByZXMuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgNjUpIGNhbmRpZGF0ZU1ldGhvZHMuYWRkKHJlcy5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDY1KSByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA3MikgY2FuZGlkYXRlTWV0aG9kcy5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDc0KSBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3NCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA3NSkgcGFyZW50U29sdXRpb24uaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgNzYpIGNhbmRpZGF0ZU1ldGhvZHMuYWRkKHBhcmVudFNvbHV0aW9uLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNzYpIHBhcmVudFNvbHV0aW9uLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgODEpIGNhbmRpZGF0ZU1ldGhvZHMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA4MSkgbXlEZWNsYXJhdGlvbi5nZXRTdXBlclR5cGVEZWNsYXJhdGlvbigpLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgODEpIG15RGVjbGFyYXRpb24uZ2V0U3VwZXJUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyVHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSA4MykgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihPYmplY3QuY2xhc3MsIHR5cGVTb2x2ZXIpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4OSkgcmVzLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDkwKSBjYW5kaWRhdGVNZXRob2RzLmFkZChyZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA5MCkgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgOTQpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoY2FuZGlkYXRlTWV0aG9kcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTAzKSBteURlY2xhcmF0aW9uLmZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24uZmluZE1lbWJlcnNPZktpbmQoamF2YS5sYW5nLkNsYXNzPFQ+KQorICBMaW5lIDEwNykgdHlwZURlY2xhcmF0aW9ucy5zdHJlYW0oKS5maWx0ZXIoaW50ZXJuYWxUeXBlIC0+IGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkpLmZpbmRGaXJzdCgpLm1hcChpbnRlcm5hbFR5cGUgLT4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oaW50ZXJuYWxUeXBlKSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBVPikKKyAgTGluZSAxMDcpIHR5cGVEZWNsYXJhdGlvbnMuc3RyZWFtKCkuZmlsdGVyKGludGVybmFsVHlwZSAtPiBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSAxMDcpIHR5cGVEZWNsYXJhdGlvbnMuc3RyZWFtKCkuZmlsdGVyKGludGVybmFsVHlwZSAtPiBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAxMDcpIHR5cGVEZWNsYXJhdGlvbnMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTA5KSBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwOSkgaW50ZXJuYWxUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDEwOSkgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxMTIpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGludGVybmFsVHlwZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAxMTMpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbihpbnRlcm5hbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDExMykgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDExNSkgZXhhY3RNYXRjaC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTE2KSBleGFjdE1hdGNoLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxMjApIHR5cGVEZWNsYXJhdGlvbnMuc3RyZWFtKCkuZmlsdGVyKGludGVybmFsVHlwZSAtPiBuYW1lLnN0YXJ0c1dpdGgoU3RyaW5nLmZvcm1hdCgiJXMuIiwgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSkpKS5maW5kRmlyc3QoKS5tYXAoaW50ZXJuYWxUeXBlIC0+IEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZS5zdWJzdHJpbmcoaW50ZXJuYWxUeXBlLmdldE5hbWUoKS5nZXRJZCgpLmxlbmd0aCgpICsgMSksIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgVT4pCisgIExpbmUgMTIwKSB0eXBlRGVjbGFyYXRpb25zLnN0cmVhbSgpLmZpbHRlcihpbnRlcm5hbFR5cGUgLT4gbmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiIsIGludGVybmFsVHlwZS5nZXROYW1lKCkpKSkuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgMTIwKSB0eXBlRGVjbGFyYXRpb25zLnN0cmVhbSgpLmZpbHRlcihpbnRlcm5hbFR5cGUgLT4gbmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiIsIGludGVybmFsVHlwZS5nZXROYW1lKCkpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTIwKSB0eXBlRGVjbGFyYXRpb25zLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEyMikgbmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiIsIGludGVybmFsVHlwZS5nZXROYW1lKCkpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTIyKSBTdHJpbmcuZm9ybWF0KCIlcy4iLCBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxMjIpIGludGVybmFsVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTI1KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGludGVybmFsVHlwZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5sZW5ndGgoKSArIDEpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTI1KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGludGVybmFsVHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMjcpIG5hbWUuc3Vic3RyaW5nKGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5sZW5ndGgoKSArIDEpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQpCisgIExpbmUgMTI3KSBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAxMjcpIGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxMjcpIGludGVybmFsVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTMwKSByZWN1cnNpdmVNYXRjaC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTMxKSByZWN1cnNpdmVNYXRjaC5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTM1KSB3cmFwcGVkTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKG5vZGVzIC0+ICgoTm9kZVdpdGhUeXBlQXJndW1lbnRzPD8+KSBub2RlcykuZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShuZXcgTm9kZUxpc3Q8PigpKSkub3JFbHNlKG5ldyBOb2RlTGlzdDw+KCkpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpLmZpbmRGaXJzdCgpLm1hcChtYXRjaGluZ1R5cGUgLT4gU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIobmV3IFR5cGVQYXJhbWV0ZXIobWF0Y2hpbmdUeXBlLnRvU3RyaW5nKCkpLCB0eXBlU29sdmVyKSkpID09PiBFUlJPUgorICBMaW5lIDEzNSkgd3JhcHBlZE5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpLm1hcChub2RlcyAtPiAoKE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/Pikgbm9kZXMpLmdldFR5cGVBcmd1bWVudHMoKS5vckVsc2UobmV3IE5vZGVMaXN0PD4oKSkpLm9yRWxzZShuZXcgTm9kZUxpc3Q8PigpKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKSA9PT4gRVJST1IKKyAgTGluZSAxMzUpIHdyYXBwZWROb2RlLmdldFR5cGVBcmd1bWVudHMoKS5tYXAobm9kZXMgLT4gKChOb2RlV2l0aFR5cGVBcmd1bWVudHM8Pz4pIG5vZGVzKS5nZXRUeXBlQXJndW1lbnRzKCkub3JFbHNlKG5ldyBOb2RlTGlzdDw+KCkpKS5vckVsc2UobmV3IE5vZGVMaXN0PD4oKSkuc3RyZWFtKCkuZmlsdGVyKHR5cGUgLT4gdHlwZS50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgPT0+IEVSUk9SCisgIExpbmUgMTM1KSB3cmFwcGVkTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkubWFwKG5vZGVzIC0+ICgoTm9kZVdpdGhUeXBlQXJndW1lbnRzPD8+KSBub2RlcykuZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShuZXcgTm9kZUxpc3Q8PigpKSkub3JFbHNlKG5ldyBOb2RlTGlzdDw+KCkpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEzNSkgd3JhcHBlZE5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpLm1hcChub2RlcyAtPiAoKE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/Pikgbm9kZXMpLmdldFR5cGVBcmd1bWVudHMoKS5vckVsc2UobmV3IE5vZGVMaXN0PD4oKSkpLm9yRWxzZShuZXcgTm9kZUxpc3Q8PigpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDEzNSkgd3JhcHBlZE5vZGUuZ2V0VHlwZUFyZ3VtZW50cygpLm1hcChub2RlcyAtPiAoKE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/Pikgbm9kZXMpLmdldFR5cGVBcmd1bWVudHMoKS5vckVsc2UobmV3IE5vZGVMaXN0PD4oKSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBVPikKKyAgTGluZSAxMzUpIHdyYXBwZWROb2RlLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMzgpICgoTm9kZVdpdGhUeXBlQXJndW1lbnRzPD8+KSBub2RlcykuZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShuZXcgTm9kZUxpc3Q8PigpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZShUKQorICBMaW5lIDEzOCkgKChOb2RlV2l0aFR5cGVBcmd1bWVudHM8Pz4pIG5vZGVzKS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50cy5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxNDIpIHR5cGUudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkgPT0+IEVSUk9SCisgIExpbmUgMTQyKSB0eXBlLnRvU3RyaW5nKCkgPT0+IEVSUk9SCisgIExpbmUgMTQ1KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcihuZXcgVHlwZVBhcmFtZXRlcihtYXRjaGluZ1R5cGUudG9TdHJpbmcoKSksIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMTQ2KSBtYXRjaGluZ1R5cGUudG9TdHJpbmcoKSA9PT4gRVJST1IKKyAgTGluZSAxNDkpIHR5cGVBcmd1bWVudHNNYXRjaC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTUwKSB0eXBlQXJndW1lbnRzTWF0Y2guZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDE1NCkgbXlEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpCisgIExpbmUgMTU2KSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE1NikgYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxNTYpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE1NykgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDE1NykgYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTYxKSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5pbnRlcm5hbFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pbnRlcm5hbFR5cGVzKCkKKyAgTGluZSAxNjEpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE2MikgaW50ZXJuYWxUeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNjIpIGludGVybmFsVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTYzKSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGludGVybmFsVHlwZURlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMTcxKSBnZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE3MSkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxNzcpIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudCh0eXBlU29sdmVyICE9IG51bGwpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChib29sZWFuKQorICBMaW5lIDE3OSkgbXlEZWNsYXJhdGlvbi5oYXNWaXNpYmxlRmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5oYXNWaXNpYmxlRmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxODApIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQobXlEZWNsYXJhdGlvbi5nZXRWaXNpYmxlRmllbGQobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAxODApIG15RGVjbGFyYXRpb24uZ2V0VmlzaWJsZUZpZWxkKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0VmlzaWJsZUZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTgzKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxODMpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQ2F0Y2hDbGF1c2VDb250ZXh0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19DYXRjaENsYXVzZUNvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmJhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQ2F0Y2hDbGF1c2VDb250ZXh0LnR4dApAQCAtMCwwICsxLDE0IEBACisgIExpbmUgMjYpIEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3Iod3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVyKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjYpIHdyYXBwZWROb2RlLmdldFBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2UuZ2V0UGFyYW1ldGVyKCkKKyAgTGluZSAyNykgQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGgoc2IsIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LnNvbHZlV2l0aChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvciwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyOCkgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDMzKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzMykgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAzOCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcih3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXIoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3IoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzOCkgd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZS5nZXRQYXJhbWV0ZXIoKQorICBMaW5lIDM5KSBzb2x2ZVdpdGhBc1ZhbHVlKHNiLCBuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGhBc1ZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0MCkgc3ltYm9sUmVmZXJlbmNlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NikgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0NikgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA1MikgZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDUyKSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGFiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQ29udGV4dC50eHQKQEAgLTAsMCArMSwyOCBAQAorICBMaW5lIDQ2KSBnZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0LmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSA1NykgdGhpcy5nZXREZWNsYXJhdGlvbigpLmhhc1Zpc2libGVGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmhhc1Zpc2libGVGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU3KSB0aGlzLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDU4KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRWaXNpYmxlRmllbGQobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA1OCkgdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFZpc2libGVGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldFZpc2libGVGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU4KSB0aGlzLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDYyKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MikgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA2OSkgdGhpcy5nZXREZWNsYXJhdGlvbigpLmhhc1Zpc2libGVGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmhhc1Zpc2libGVGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5KSB0aGlzLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkNvbnRleHQuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDcwKSBPcHRpb25hbC5vZihWYWx1ZS5mcm9tKHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRWaXNpYmxlRmllbGQobmFtZSkpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNzApIFZhbHVlLmZyb20odGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFZpc2libGVGaWVsZChuYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZS5mcm9tKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24pCisgIExpbmUgNzApIHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRWaXNpYmxlRmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRWaXNpYmxlRmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3MCkgdGhpcy5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25Db250ZXh0LmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSA3NCkgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3NCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA3OSkgd3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgODApIHRwLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MCkgdHAuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgODApIHRwLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpCisgIExpbmUgODEpIE9wdGlvbmFsLm9mKG5ldyBUeXBlVmFyaWFibGUobmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKHRwLCB0eXBlU29sdmVyKSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSA4NCkgZ2V0UGFyZW50KCkuc29sdmVHZW5lcmljVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZUdlbmVyaWNUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDg0KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDg5KSBqYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5NCkgamF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5KYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDk4KSBqYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci5zb2x2ZUNvbnN0cnVjdG9yKGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuSmF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuc29sdmVDb25zdHJ1Y3RvcihqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEwNikgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKHRoaXMud3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKQorICBMaW5lIDEwNikgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NvbXBpbGF0aW9uVW5pdENvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NvbXBpbGF0aW9uVW5pdENvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjEyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQ29tcGlsYXRpb25Vbml0Q29udGV4dC50eHQKQEAgLTAsMCArMSwxMzAgQEAKKyAgTGluZSA0OSkgbmFtZS5jb250YWlucygiLiIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmNvbnRhaW5zKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpCisgIExpbmUgNjkpIGl0TmFtZS5jb250YWlucygiLiIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmNvbnRhaW5zKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpCisgIExpbmUgNzApIGdldFR5cGUoaXROYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQ29tcGlsYXRpb25Vbml0Q29udGV4dC5nZXRUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzEpIGdldE1lbWJlcihpdE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db21waWxhdGlvblVuaXRDb250ZXh0LmdldE1lbWJlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcyKSB0aGlzLnNvbHZlVHlwZSh0eXBlTmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNvbXBpbGF0aW9uVW5pdENvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDczKSB0eXBlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDc0KSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sSW5UeXBlKHR5cGUuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCksIG1lbWJlck5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3NCkgdHlwZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDgxKSB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDgyKSB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDgzKSBpbXBvcnREZWNsLmlzU3RhdGljKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uaXNTdGF0aWMoKQorICBMaW5lIDg0KSBpbXBvcnREZWNsLmlzQXN0ZXJpc2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5pc0FzdGVyaXNrKCkKKyAgTGluZSA4NSkgaW1wb3J0RGVjbC5nZXROYW1lQXNTdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLmdldE5hbWVBc1N0cmluZygpCisgIExpbmUgODYpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKHFOYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODcpIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVTeW1ib2xJblR5cGUoaW1wb3J0ZWRUeXBlLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODgpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA5MikgaW1wb3J0RGVjbC5nZXROYW1lQXNTdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLmdldE5hbWVBc1N0cmluZygpCisgIExpbmUgOTUpIGdldE1lbWJlcih3aG9sZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNvbXBpbGF0aW9uVW5pdENvbnRleHQuZ2V0TWVtYmVyKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTYpIGdldFR5cGUod2hvbGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db21waWxhdGlvblVuaXRDb250ZXh0LmdldFR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5OCkgbWVtYmVyTmFtZS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTkpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKHR5cGVOYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTAwKSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sSW5UeXBlKGltcG9ydGVkVHlwZSwgbWVtYmVyTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVTeW1ib2xJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwNykgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFZhbHVlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMTEyKSB3cmFwcGVkTm9kZS5nZXRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpCisgIExpbmUgMTEzKSB3cmFwcGVkTm9kZS5nZXRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpCisgIExpbmUgMTE0KSB0eXBlLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTQpIHR5cGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTE0KSB0eXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxMTYpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMTE2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pCisgIExpbmUgMTE2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTE4KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uKChBbm5vdGF0aW9uRGVjbGFyYXRpb24pIHR5cGUsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMTIwKSB0eXBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTIwKSB0eXBlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDEyNikgd3JhcHBlZE5vZGUuZ2V0SW1wb3J0cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRJbXBvcnRzKCkKKyAgTGluZSAxMjcpIG5hbWUuaW5kZXhPZignLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLmluZGV4T2YoaW50KQorICBMaW5lIDEzMCkgbmFtZS5zdWJzdHJpbmcoMCwgZG90UG9zKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgMTMzKSB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDEzNCkgaW1wb3J0RGVjbC5pc0FzdGVyaXNrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uaXNBc3RlcmlzaygpCisgIExpbmUgMTM1KSBpbXBvcnREZWNsLmdldE5hbWVBc1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuZ2V0TmFtZUFzU3RyaW5nKCkKKyAgTGluZSAxMzYpIGltcG9ydERlY2wuZ2V0TmFtZSgpLmdldFF1YWxpZmllcigpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMzYpIGltcG9ydERlY2wuZ2V0TmFtZSgpLmdldFF1YWxpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZS5nZXRRdWFsaWZpZXIoKQorICBMaW5lIDEzNikgaW1wb3J0RGVjbC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTM3KSBpbXBvcnREZWNsLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEzNykgaW1wb3J0RGVjbC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZS5nZXRJZGVudGlmaWVyKCkKKyAgTGluZSAxMzcpIGltcG9ydERlY2wuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDE0MCkgcU5hbWUuZW5kc1dpdGgoIi4iICsgcHJlZml4KSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0MikgbmFtZS5zdWJzdHJpbmcoZG90UG9zKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50KQorICBMaW5lIDE0NykgdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShxTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ4KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTQ5KSBTeW1ib2xSZWZlcmVuY2UuYWRhcHQocmVmLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmFkYXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIE8+LCBqYXZhLmxhbmcuQ2xhc3M8Tz4pCisgIExpbmUgMTU1KSB3cmFwcGVkTm9kZS5nZXRJbXBvcnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldEltcG9ydHMoKQorICBMaW5lIDE1NikgaW1wb3J0RGVjbC5pc0FzdGVyaXNrKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb24uaXNBc3RlcmlzaygpCisgIExpbmUgMTU3KSBpbXBvcnREZWNsLmdldE5hbWVBc1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWUuZ2V0TmFtZUFzU3RyaW5nKCkKKyAgTGluZSAxNTgpIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUocU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1OSkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE2MCkgU3ltYm9sUmVmZXJlbmNlLmFkYXB0KHJlZiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5hZGFwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBPPiwgamF2YS5sYW5nLkNsYXNzPE8+KQorICBMaW5lIDE2NykgdGhpcy53cmFwcGVkTm9kZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTY3KSB0aGlzLndyYXBwZWROb2RlLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKQorICBMaW5lIDE2OCkgdGhpcy53cmFwcGVkTm9kZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5nZXQoKS5nZXROYW1lKCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAxNjgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxNjgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDE2OCkgdGhpcy53cmFwcGVkTm9kZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxNjkpIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUocU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE3MCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE3MSkgU3ltYm9sUmVmZXJlbmNlLmFkYXB0KHJlZiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5hZGFwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBPPiwgamF2YS5sYW5nLkNsYXNzPE8+KQorICBMaW5lIDE3NikgdHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShxTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTc3KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTc4KSBTeW1ib2xSZWZlcmVuY2UuYWRhcHQocmVmLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmFkYXB0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2U8PyBleHRlbmRzIE8+LCBqYXZhLmxhbmcuQ2xhc3M8Tz4pCisgIExpbmUgMTgzKSB0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKCJqYXZhLmxhbmcuIiArIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE4NCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE4NSkgU3ltYm9sUmVmZXJlbmNlLmFkYXB0KHJlZiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5hZGFwdChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlPD8gZXh0ZW5kcyBPPiwgamF2YS5sYW5nLkNsYXNzPE8+KQorICBMaW5lIDE4OSkgaXNRdWFsaWZpZWROYW1lKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db21waWxhdGlvblVuaXRDb250ZXh0LmlzUXVhbGlmaWVkTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE5MCkgU3ltYm9sUmVmZXJlbmNlLmFkYXB0KHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUobmFtZSksIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuYWRhcHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZTw/IGV4dGVuZHMgTz4sIGphdmEubGFuZy5DbGFzczxPPikKKyAgTGluZSAxOTApIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTkyKSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQorICBMaW5lIDE5NykgdHlwZS5nZXRTY29wZSgpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxOTcpIHR5cGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAxOTgpIHFOYW1lKHR5cGUuZ2V0U2NvcGUoKS5nZXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNvbXBpbGF0aW9uVW5pdENvbnRleHQucU5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKQorICBMaW5lIDE5OCkgdHlwZS5nZXRTY29wZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxOTgpIHR5cGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAxOTgpIHR5cGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTk4KSB0eXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDIwMCkgdHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAyMDApIHR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMjA1KSBuYW1lLmdldFF1YWxpZmllcigpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAyMDUpIG5hbWUuZ2V0UXVhbGlmaWVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lLmdldFF1YWxpZmllcigpCisgIExpbmUgMjA2KSBxTmFtZShuYW1lLmdldFF1YWxpZmllcigpLmdldCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQ29tcGlsYXRpb25Vbml0Q29udGV4dC5xTmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZSkKKyAgTGluZSAyMDYpIG5hbWUuZ2V0UXVhbGlmaWVyKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDIwNikgbmFtZS5nZXRRdWFsaWZpZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuZ2V0UXVhbGlmaWVyKCkKKyAgTGluZSAyMDYpIG5hbWUuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAyMDgpIG5hbWUuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAyMTMpIHFOYW1lLnNwbGl0KCJcXC4iKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zcGxpdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIxOCkgcU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sYXN0SW5kZXhPZihpbnQpCisgIExpbmUgMjIyKSBxTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCwgaW50KQorICBMaW5lIDIyOCkgd3JhcHBlZE5vZGUuZ2V0SW1wb3J0cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRJbXBvcnRzKCkKKyAgTGluZSAyMjkpIGltcG9ydERlY2wuaXNTdGF0aWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5pc1N0YXRpYygpCisgIExpbmUgMjMwKSBpbXBvcnREZWNsLmlzQXN0ZXJpc2soKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbi5pc0FzdGVyaXNrKCkKKyAgTGluZSAyMzEpIGltcG9ydERlY2wuZ2V0TmFtZUFzU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTmFtZS5nZXROYW1lQXNTdHJpbmcoKQorICBMaW5lIDIzMykgdGhpcy53cmFwcGVkTm9kZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMjMzKSB0aGlzLndyYXBwZWROb2RlLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKQorICBMaW5lIDIzNCkgdGhpcy53cmFwcGVkTm9kZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5nZXQoKS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhwYWNrYWdlTmFtZShpbXBvcnRTdHJpbmcpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMzQpIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWUuZ2V0SWRlbnRpZmllcigpCisgIExpbmUgMjM0KSB0aGlzLndyYXBwZWROb2RlLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmdldCgpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMjM0KSB0aGlzLndyYXBwZWROb2RlLmdldFBhY2thZ2VEZWNsYXJhdGlvbigpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAyMzQpIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2VEZWNsYXJhdGlvbigpCisgIExpbmUgMjM0KSBwYWNrYWdlTmFtZShpbXBvcnRTdHJpbmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db21waWxhdGlvblVuaXRDb250ZXh0LnBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjM1KSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVzKCkuc3RyZWFtKCkuYW55TWF0Y2goaXQgLT4gaXQuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHModG9TaW1wbGVOYW1lKGltcG9ydFN0cmluZykpKSA9PT4gRVJST1IKKyAgTGluZSAyMzUpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyMzUpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKQorICBMaW5lIDIzNSkgaXQuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHModG9TaW1wbGVOYW1lKGltcG9ydFN0cmluZykpID09PiBFUlJPUgorICBMaW5lIDIzNSkgaXQuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSA9PT4gRVJST1IKKyAgTGluZSAyMzUpIGl0LmdldE5hbWUoKSA9PT4gRVJST1IKKyAgTGluZSAyMzUpIHRvU2ltcGxlTmFtZShpbXBvcnRTdHJpbmcpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db21waWxhdGlvblVuaXRDb250ZXh0LnRvU2ltcGxlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIzOCkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQorICBMaW5lIDI0MSkgdHlwZVNvbHZlci5zb2x2ZVR5cGUoaW1wb3J0U3RyaW5nKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjQyKSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUocmVmLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHJ1ZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDI0NCkgbWV0aG9kLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDI0OCkgaW1wb3J0RGVjbC5nZXROYW1lQXNTdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lLmdldE5hbWVBc1N0cmluZygpCisgIExpbmUgMjUwKSBxTmFtZS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjUwKSBxTmFtZS5lbmRzV2l0aCgiLiIgKyBuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1MSkgZ2V0VHlwZShxTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNvbXBpbGF0aW9uVW5pdENvbnRleHQuZ2V0VHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1MikgdHlwZVNvbHZlci5zb2x2ZVR5cGUodHlwZU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNTMpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShyZWYsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0cnVlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjU0KSBtZXRob2QuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjYxKSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMjY5KSBxTmFtZS5sYXN0SW5kZXhPZignLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxhc3RJbmRleE9mKGludCkKKyAgTGluZSAyNzMpIHFOYW1lLnN1YnN0cmluZygwLCBpbmRleCkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCwgaW50KQorICBMaW5lIDI3OCkgcU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sYXN0SW5kZXhPZihpbnQpCisgIExpbmUgMjgyKSBxTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NvbnN0cnVjdG9yQ29udGV4dC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfQ29uc3RydWN0b3JDb250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NvbnN0cnVjdG9yQ29udGV4dC50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19Db250ZXh0SGVscGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19Db250ZXh0SGVscGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZhYTM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0NvbnRleHRIZWxwZXIudHh0CkBAIC0wLDAgKzEsMTMgQEAKKyAgTGluZSA1MCkgKChKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLnNvbHZlTWV0aG9kQXNVc2FnZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNTIpICgoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCwgdHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLnNvbHZlTWV0aG9kQXNVc2FnZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNTQpICgoSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24uc29sdmVNZXRob2RBc1VzYWdlKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA1NikgKChSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLnNvbHZlTWV0aG9kQXNVc2FnZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNTgpICgoUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uLnNvbHZlTWV0aG9kQXNVc2FnZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNjApICgoUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24uc29sdmVNZXRob2RBc1VzYWdlKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA2MikgKChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRDb250ZXh0KCkuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MikgKChKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRDb250ZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSA2NCkgKChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjQpICgoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSA2NikgKChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDY2KSAoKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSA2OCkgdHlwZURlY2xhcmF0aW9uLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0VudW1EZWNsYXJhdGlvbkNvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0VudW1EZWNsYXJhdGlvbkNvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNWRhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfRW51bURlY2xhcmF0aW9uQ29udGV4dC50eHQKQEAgLTAsMCArMSwxNSBAQAorICBMaW5lIDQxKSBnZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5FbnVtRGVjbGFyYXRpb25Db250ZXh0LmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSA0OSkgd3JhcHBlZE5vZGUuZ2V0RW50cmllcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEVudHJpZXMoKQorICBMaW5lIDUwKSBjb25zdGFudC5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTApIGNvbnN0YW50LmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDUwKSBjb25zdGFudC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1MSkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlckVudW1Db25zdGFudERlY2xhcmF0aW9uKGNvbnN0YW50LCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDU1KSB0aGlzLmdldERlY2xhcmF0aW9uKCkuaGFzRmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5oYXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU1KSB0aGlzLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkVudW1EZWNsYXJhdGlvbkNvbnRleHQuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDU2KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRGaWVsZChuYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDU2KSB0aGlzLmdldERlY2xhcmF0aW9uKCkuZ2V0RmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU2KSB0aGlzLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkVudW1EZWNsYXJhdGlvbkNvbnRleHQuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDYwKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA2NSkgamF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5KYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzApIGphdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuSmF2YVBhcnNlclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19GaWVsZEFjY2Vzc0NvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0ZpZWxkQWNjZXNzQ29udGV4dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwMzlmNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19GaWVsZEFjY2Vzc0NvbnRleHQudHh0CkBAIC0wLDAgKzEsMzcgQEAKKyAgTGluZSA1Mikgd3JhcHBlZE5vZGUuZ2V0RmllbGQoKS50b1N0cmluZygpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1Mikgd3JhcHBlZE5vZGUuZ2V0RmllbGQoKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDUyKSB3cmFwcGVkTm9kZS5nZXRGaWVsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByLmdldEZpZWxkKCkKKyAgTGluZSA1Mykgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgNTQpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVPZlRoaXNJbih3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZU9mVGhpc0luKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA1NCkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU1KSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sSW5UeXBlKHR5cGVPZlRoaXMuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1NSkgdHlwZU9mVGhpcy5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSA1NSkgdHlwZU9mVGhpcy5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA1OCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSwgdHlwZVNvbHZlcikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTgpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTgpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDYzKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDYzKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDYzKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2OCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSwgdHlwZVNvbHZlcikuc29sdmVNZXRob2QobmFtZSwgcGFyYW1ldGVyVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDY4KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDY4KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3Mykgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRTY29wZSgpCisgIExpbmUgNzQpIHdyYXBwZWROb2RlLmdldEZpZWxkKCkudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzQpIHdyYXBwZWROb2RlLmdldEZpZWxkKCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSA3NCkgd3JhcHBlZE5vZGUuZ2V0RmllbGQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkZpZWxkQWNjZXNzRXhwci5nZXRGaWVsZCgpCisgIExpbmUgNzUpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUoc2NvcGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDc1KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzYpIHR5cGVPZlNjb3BlLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgNzYpIG5hbWUuZXF1YWxzKEFSUkFZX0xFTkdUSF9GSUVMRF9OQU1FKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3NykgT3B0aW9uYWwub2YobmV3IFZhbHVlKFByaW1pdGl2ZVR5cGUuSU5ULCBBUlJBWV9MRU5HVEhfRklFTERfTkFNRSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSA3OSkgdHlwZU9mU2NvcGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgODApIHR5cGVPZlNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpLmdldEZpZWxkVHlwZShuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0RmllbGRUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODApIHR5cGVPZlNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDgxKSB0eXBlVXNhZ2UuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDgyKSBPcHRpb25hbC5vZihuZXcgVmFsdWUodHlwZVVzYWdlLmdldCgpLCBuYW1lKSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDgyKSB0eXBlVXNhZ2UuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDg0KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDg3KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDkwKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDkwKSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0ZvclN0YXRlbWVudENvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0ZvclN0YXRlbWVudENvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGU2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfRm9yU3RhdGVtZW50Q29udGV4dC50eHQKQEAgLTAsMCArMSwxNSBAQAorICBMaW5lIDQ1KSB3cmFwcGVkTm9kZS5nZXRJbml0aWFsaXphdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpCisgIExpbmUgNDgpIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSA0OSkgdmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0OSkgdmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDQ5KSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKQorICBMaW5lIDUwKSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2YXJpYWJsZURlY2xhcmF0b3IsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgNTApIEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2YXJpYWJsZURlY2xhcmF0b3IsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU0KSBleHByZXNzaW9uLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNTQpIGV4cHJlc3Npb24uZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNTgpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDU5KSBTdGF0ZW1lbnRDb250ZXh0LnNvbHZlSW5CbG9jayhuYW1lLCB0eXBlU29sdmVyLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLlN0YXRlbWVudENvbnRleHQuc29sdmVJbkJsb2NrKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDYxKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MSkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA2NykgZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDY3KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0ZvcmVjaFN0YXRlbWVudENvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0ZvcmVjaFN0YXRlbWVudENvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNWYzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfRm9yZWNoU3RhdGVtZW50Q29udGV4dC50eHQKQEAgLTAsMCArMSwxNyBAQAorICBMaW5lIDQxKSB3cmFwcGVkTm9kZS5nZXRWYXJpYWJsZSgpLmdldFZhcmlhYmxlcygpLnNpemUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5zaXplKCkKKyAgTGluZSA0MSkgd3JhcHBlZE5vZGUuZ2V0VmFyaWFibGUoKS5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldFZhcmlhYmxlcygpCisgIExpbmUgNDEpIHdyYXBwZWROb2RlLmdldFZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdC5nZXRWYXJpYWJsZSgpCisgIExpbmUgNDQpIHdyYXBwZWROb2RlLmdldFZhcmlhYmxlKCkuZ2V0VmFyaWFibGVzKCkuZ2V0KDApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmdldChpbnQpCisgIExpbmUgNDQpIHdyYXBwZWROb2RlLmdldFZhcmlhYmxlKCkuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDQ0KSB3cmFwcGVkTm9kZS5nZXRWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQuZ2V0VmFyaWFibGUoKQorICBMaW5lIDQ1KSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ1KSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNDUpIHZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpCisgIExpbmUgNDYpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKHZhcmlhYmxlRGVjbGFyYXRvciwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA0NikgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKHZhcmlhYmxlRGVjbGFyYXRvciwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24ubG9jYWxWYXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDgpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQ5KSBTdGF0ZW1lbnRDb250ZXh0LnNvbHZlSW5CbG9jayhuYW1lLCB0eXBlU29sdmVyLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLlN0YXRlbWVudENvbnRleHQuc29sdmVJbkJsb2NrKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50KQorICBMaW5lIDUxKSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1MSkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSA1OCkgZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU4KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0phdmFQYXJzZXJUeXBlRGVjbGFyYXRpb25BZGFwdGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19KYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5YmIyNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19KYXZhUGFyc2VyVHlwZURlY2xhcmF0aW9uQWRhcHRlci50eHQKQEAgLTAsMCArMSw4MCBAQAorICBMaW5lIDQyKSB0aGlzLndyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MikgdGhpcy53cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA0MikgdGhpcy53cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNDMpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKHdyYXBwZWROb2RlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDQzKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24od3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDQzKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDcpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDUwKSBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDUwKSBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNTApIGludGVybmFsVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNTEpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGludGVybmFsVHlwZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA1MSkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKGludGVybmFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4pCisgIExpbmUgNTEpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1MikgbmFtZS5zdGFydHNXaXRoKFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLCBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUyKSBTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIHdyYXBwZWROb2RlLmdldE5hbWUoKSwgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgNTIpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1MikgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1MykgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChpbnRlcm5hbFR5cGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShuYW1lLnN1YnN0cmluZyh3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKS5sZW5ndGgoKSArIDEpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTMpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDUzKSBuYW1lLnN1YnN0cmluZyh3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKS5sZW5ndGgoKSArIDEpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQpCisgIExpbmUgNTMpIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgNTMpIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDUzKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNTQpIG5hbWUuc3RhcnRzV2l0aChTdHJpbmcuZm9ybWF0KCIlcy4iLCBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU0KSBTdHJpbmcuZm9ybWF0KCIlcy4iLCBpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSA1NCkgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1NSkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChpbnRlcm5hbFR5cGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShuYW1lLnN1YnN0cmluZyhpbnRlcm5hbFR5cGUuZ2V0TmFtZSgpLmdldElkKCkubGVuZ3RoKCkgKyAxKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU1KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGludGVybmFsVHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1NSkgbmFtZS5zdWJzdHJpbmcoaW50ZXJuYWxUeXBlLmdldE5hbWUoKS5nZXRJZCgpLmxlbmd0aCgpICsgMSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCkKKyAgTGluZSA1NSkgaW50ZXJuYWxUeXBlLmdldE5hbWUoKS5nZXRJZCgpLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgNTUpIGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA1NSkgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA2Mikgbm9kZVdpdGhUeXBlUGFyYW1ldGVycy5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA2NCkgYXN0VHAuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY0KSBhc3RUcC5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA2NCkgYXN0VHAuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSA2NSkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIoYXN0VHAsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgNzEpIHRoaXMudHlwZURlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkKKyAgTGluZSA3MykgYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgNzMpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDc0KSBpbnRlcm5hbFR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc0KSBpbnRlcm5hbFR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc1KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGludGVybmFsVHlwZURlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgODMpIGNvbnRleHQuZ2V0UGFyZW50KCkuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4MykgY29udGV4dC5nZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDg3KSB0eXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maWx0ZXIobSAtPiAhc3RhdGljT25seSB8fCAoc3RhdGljT25seSAmJiBtLmlzU3RhdGljKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgODcpIHR5cGVEZWNsYXJhdGlvbi5nZXREZWNsYXJlZE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLmZpbHRlcihtIC0+ICFzdGF0aWNPbmx5IHx8IChzdGF0aWNPbmx5ICYmIG0uaXNTdGF0aWMoKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDg3KSB0eXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA4NykgdHlwZURlY2xhcmF0aW9uLmdldERlY2xhcmVkTWV0aG9kcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDg3KSB0eXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDg4KSBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODgpIG0uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA4OSkgbS5pc1N0YXRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbi5pc1N0YXRpYygpCisgIExpbmUgOTApIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDkyKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyh0eXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MikgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDkyKSB0eXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgOTMpIHR5cGVEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpCisgIExpbmUgOTUpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDk2KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgOTcpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDEwMSkgcmVzLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDEwMikgY2FuZGlkYXRlTWV0aG9kcy5hZGQocmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTAyKSByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMDkpIGNhbmRpZGF0ZU1ldGhvZHMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxMTApIGNvbnRleHQuZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTEwKSBjb250ZXh0LmdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMTExKSBwYXJlbnRTb2x1dGlvbi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxMTIpIGNhbmRpZGF0ZU1ldGhvZHMuYWRkKHBhcmVudFNvbHV0aW9uLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTEyKSBwYXJlbnRTb2x1dGlvbi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDExNykgY2FuZGlkYXRlTWV0aG9kcy5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDExNykgdHlwZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMTE4KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDExOSkgcmVzLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDEyMCkgY2FuZGlkYXRlTWV0aG9kcy5hZGQocmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTIwKSByZXMuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMjQpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoY2FuZGlkYXRlTWV0aG9kcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTI5KSBDb25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoKChDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnN0cnVjdG9ycygpLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTI5KSAoKENsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29uc3RydWN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNsYXNzRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCkKKyAgTGluZSAxMzEpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX0xhbWJkYUV4cHJDb250ZXh0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19MYW1iZGFFeHByQ29udGV4dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllNmQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19MYW1iZGFFeHByQ29udGV4dC50eHQKQEAgLTAsMCArMSw3OCBAQAorICBMaW5lIDU4KSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDU5KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKHBhcmFtZXRlciwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3IoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MSkgc2IuZ2V0U3ltYm9sRGVjbGFyYXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpCisgIExpbmUgNjIpIGRlY2wuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MikgZGVjbC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDYzKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2NCkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNjUpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShtZXRob2RDYWxsRXhwcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcikKKyAgTGluZSA2NSkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDY2KSBwb3MobWV0aG9kQ2FsbEV4cHIsIHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTGFtYmRhRXhwckNvbnRleHQucG9zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb24pCisgIExpbmUgNjcpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNjcpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKQorICBMaW5lIDcwKSBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChsYW1iZGFUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA3MSkgZnVuY3Rpb25hbE1ldGhvZE9wdC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgNzIpIGZ1bmN0aW9uYWxNZXRob2RPcHQuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDc3KSBpbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIobGFtYmRhVHlwZSwgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGxhbWJkYVR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCksIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDc3KSBsYW1iZGFUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDc3KSBsYW1iZGFUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDgyKSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnNpemUoKQorICBMaW5lIDgyKSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDgzKSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXIobGFtYmRhUGFyYW1JbmRleCkuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODMpIHdyYXBwZWROb2RlLmdldFBhcmFtZXRlcihsYW1iZGFQYXJhbUluZGV4KS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZS5nZXRJZGVudGlmaWVyKCkKKyAgTGluZSA4Mykgd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVyKGxhbWJkYVBhcmFtSW5kZXgpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSA4Mykgd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVyKGxhbWJkYVBhcmFtSW5kZXgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKGludCkKKyAgTGluZSA4OCkgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSA5MSkgaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKGZ1bmN0aW9uYWxNZXRob2QuZ2V0UGFyYW1UeXBlKGxhbWJkYVBhcmFtSW5kZXgpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDkxKSBpbmZlcmVuY2VDb250ZXh0LmFkZFNpbmdsZShmdW5jdGlvbmFsTWV0aG9kLmdldFBhcmFtVHlwZShsYW1iZGFQYXJhbUluZGV4KSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgOTEpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0UGFyYW1UeXBlKGxhbWJkYVBhcmFtSW5kZXgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlKGludCkKKyAgTGluZSA5NCkgYXJnVHlwZS5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDk1KSBMYW1iZGFDb25zdHJhaW50VHlwZS5ib3VuZChhcmdUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmJvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDk1KSBhcmdUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDk1KSBhcmdUeXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgOTcpIExhbWJkYUNvbnN0cmFpbnRUeXBlLmJvdW5kKGFyZ1R5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGFtYmRhQ29uc3RyYWludFR5cGUuYm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTAwKSBPcHRpb25hbC5vZih2YWx1ZSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDEwMikgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSAxMDQpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEwNSkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTA2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0VG9Vc2FnZVZhcmlhYmxlVHlwZSh2YXJpYWJsZURlY2xhcmF0b3IpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlVmFyaWFibGVUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IpCisgIExpbmUgMTA2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTA3KSBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZCh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMDgpIGZ1bmN0aW9uYWxNZXRob2QuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDEwOSkgZnVuY3Rpb25hbE1ldGhvZC5nZXQoKS5nZXRQYXJhbVR5cGUoaW5kZXgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlKGludCkKKyAgTGluZSAxMDkpIGZ1bmN0aW9uYWxNZXRob2QuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDExMykgbGFtYmRhVHlwZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMTQpIGxhbWJkYVR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZVBhcmFtZXRlcnNNYXAoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZVBhcmFtZXRlcnNNYXAoKQorICBMaW5lIDExNCkgbGFtYmRhVHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMTUpIGVudHJ5Ll8yLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAxMTUpIGVudHJ5Ll8yLmFzVHlwZVBhcmFtZXRlcigpLmRlY2xhcmVkT25UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uVHlwZSgpCisgIExpbmUgMTE1KSBlbnRyeS5fMi5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAxMTYpIHQuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZShlbnRyeS5fMSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKQorICBMaW5lIDExNikgdC5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc01hcCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc01hcCgpCisgIExpbmUgMTE2KSB0LmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDExNykgbGFtYmRhVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhlbnRyeS5fMSwgb3QsIGluZmVycmVkVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDEyMCkgbGFtYmRhVHlwZS5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTIwKSBsYW1iZGFUeXBlLmFzVHlwZVBhcmFtZXRlcigpLmRlY2xhcmVkT25UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uVHlwZSgpCisgIExpbmUgMTIwKSBsYW1iZGFUeXBlLmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDEyMSkgdC5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKGxhbWJkYVR5cGUuYXNUeXBlUGFyYW1ldGVyKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLmdldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikKKyAgTGluZSAxMjEpIHQuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNNYXAoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNNYXAoKQorICBMaW5lIDEyMSkgdC5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMjEpIGxhbWJkYVR5cGUuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgMTI1KSBPcHRpb25hbC5vZih2YWx1ZSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDEzOCkgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMzgpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMTQzKSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDE0NCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihwYXJhbWV0ZXIsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTQ1KSBzb2x2ZVdpdGgoc2IsIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LnNvbHZlV2l0aChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvciwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNDYpIHN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxNTIpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE1MikgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxNTcpIGdldFBhcmVudCgpLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTU3KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDE2MykgZ2V0UGFyZW50KCkuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE2MykgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxNzEpIHN5bWJvbERlY2xhcmF0b3IuZ2V0U3ltYm9sRGVjbGFyYXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLmdldFN5bWJvbERlY2xhcmF0aW9ucygpCisgIExpbmUgMTcyKSBkZWNsLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTcyKSBkZWNsLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTc3KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDE4NikgY2FsbEV4cHIuZ2V0QXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX01ldGhvZENhbGxFeHByQ29udGV4dC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfTWV0aG9kQ2FsbEV4cHJDb250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc1MWZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX01ldGhvZENhbGxFeHByQ29udGV4dC50eHQKQEAgLTAsMCArMSwzMjIgQEAKKyAgTGluZSA2NCkgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgNjQpIHdyYXBwZWROb2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgNjUpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUod3JhcHBlZE5vZGUuZ2V0U2NvcGUoKS5nZXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNjUpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2NSkgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNjUpIHdyYXBwZWROb2RlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRTY29wZSgpCisgIExpbmUgNjYpIHR5cGVPZlNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpLmdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NikgdHlwZU9mU2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNjkpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgODApIHdyYXBwZWROb2RlLmdldFNjb3BlKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDgwKSB3cmFwcGVkTm9kZS5nZXRTY29wZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKQorICBMaW5lIDgxKSB3cmFwcGVkTm9kZS5nZXRTY29wZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA4MSkgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSA4NCkgKChOYW1lRXhwcikgc2NvcGUpLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDg0KSAoKE5hbWVFeHByKSBzY29wZSkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuZ2V0TmFtZSgpCisgIExpbmUgODUpIHNvbHZlVHlwZShjbGFzc05hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4NikgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDg3KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDg3KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA4OCkgbS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA4OSkgbS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDkwKSByZXNvbHZlTWV0aG9kVHlwZVBhcmFtZXRlcnNGcm9tRXhwbGljaXRMaXN0KHR5cGVTb2x2ZXIsIG1ldGhvZFVzYWdlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0LnJlc29sdmVNZXRob2RUeXBlUGFyYW1ldGVyc0Zyb21FeHBsaWNpdExpc3QoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZSkKKyAgTGluZSA5MSkgcmVzb2x2ZU1ldGhvZFR5cGVQYXJhbWV0ZXJzKG1ldGhvZFVzYWdlLCBhcmd1bWVudHNUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5yZXNvbHZlTWV0aG9kVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgOTIpIE9wdGlvbmFsLm9mKG1ldGhvZFVzYWdlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgOTQpIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS50b1N0cmluZygpID09PiBqYXZhLmxhbmcuT2JqZWN0LnRvU3RyaW5nKCkKKyAgTGluZSA5NCkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTAwKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMDApIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMDQpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTA3KSBhcmd1bWVudHNUeXBlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTA4KSB1c2luZ1BhcmFtZXRlclR5cGVzRnJvbVNjb3BlKHR5cGVPZlNjb3BlLCBvcmlnaW5hbEFyZ3VtZW50VHlwZSwgaW5mZXJyZWRUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC51c2luZ1BhcmFtZXRlclR5cGVzRnJvbVNjb3BlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAxMDkpIGFyZ3VtZW50c1R5cGVzLnNldChpLCB1cGRhdGVkQXJndW1lbnRUeXBlKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAxMTEpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTEyKSBhcHBseUluZmVycmVkVHlwZXMoYXJndW1lbnRzVHlwZXMuZ2V0KGkpLCBpbmZlcnJlZFR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0LmFwcGx5SW5mZXJyZWRUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAxMTIpIGFyZ3VtZW50c1R5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMTMpIGFyZ3VtZW50c1R5cGVzLnNldChpLCB1cGRhdGVkQXJndW1lbnRUeXBlKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAxMTYpIHNvbHZlTWV0aG9kQXNVc2FnZSh0eXBlT2ZTY29wZSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDExOCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxMjApIHBhcmVudENvbnRleHQuZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxMjIpIHBhcmVudENvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMjcpIHdyYXBwZWROb2RlLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTI3KSB3cmFwcGVkTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMjkpIHdyYXBwZWROb2RlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTI5KSB3cmFwcGVkTm9kZS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMzApIHR5cGVBcmd1bWVudHMuYWRkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnRUb1VzYWdlKHR5KSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDEzMCkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydFRvVXNhZ2UodHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmNvbnZlcnRUb1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDEzMCkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEzMykgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDEzMykgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSAxMzQpIHR5UGFyYW1EZWNscy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDEzNCkgdHlwZUFyZ3VtZW50cy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDEzNSkgdHlQYXJhbURlY2xzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTM2KSBtZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcih0eVBhcmFtRGVjbHMuZ2V0KGkpLCB0eXBlQXJndW1lbnRzLmdldChpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDEzNikgdHlQYXJhbURlY2xzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMzYpIHR5cGVBcmd1bWVudHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDE0NikgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTQ2KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDE1MSkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxNTIpIHBhcmVudENvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNTcpIHdyYXBwZWROb2RlLmdldFNjb3BlKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDE1Nykgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxNTgpIHdyYXBwZWROb2RlLmdldFNjb3BlKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDE1OCkgd3JhcHBlZE5vZGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldFNjb3BlKCkKKyAgTGluZSAxNjMpIHRoaXMuc29sdmVUeXBlKHNjb3BlQXNOYW1lLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTYzKSBzY29wZUFzTmFtZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNjMpIHNjb3BlQXNOYW1lLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLmdldE5hbWUoKQorICBMaW5lIDE2NCkgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE2NCkgc3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmlzVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaXNUeXBlKCkKKyAgTGluZSAxNjQpIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDE2NSkgc3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNUeXBlKCkKKyAgTGluZSAxNjUpIHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDE2NikgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKHR5cGVEZWNsYXJhdGlvbiwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTcyKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKHNjb3BlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNzIpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNzQpIFN0cmluZy5mb3JtYXQoIklzc3VlIGNhbGN1bGF0aW5nIHRoZSB0eXBlIG9mIHRoZSBzY29wZSBvZiAiICsgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgMTc2KSB0eXBlT2ZTY29wZS5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDE3NykgdHlwZU9mU2NvcGUuYXNXaWxkY2FyZCgpLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSAxNzcpIHR5cGVPZlNjb3BlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTc3KSB0eXBlT2ZTY29wZS5hc1dpbGRjYXJkKCkuaXNTdXBlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNTdXBlcigpCisgIExpbmUgMTc3KSB0eXBlT2ZTY29wZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDE3OCkgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKHR5cGVPZlNjb3BlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNzgpIHR5cGVPZlNjb3BlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE3OCkgdHlwZU9mU2NvcGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTc4KSB0eXBlT2ZTY29wZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAxNzgpIHR5cGVPZlNjb3BlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTgwKSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE4MikgdHlwZU9mU2NvcGUuaXNBcnJheSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0FycmF5KCkKKyAgTGluZSAxODQpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShuZXcgUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzLCB0eXBlU29sdmVyKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTg1KSB0eXBlT2ZTY29wZS5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTg2KSB0eXBlT2ZTY29wZS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRCb3VuZHModHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRCb3VuZHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTg2KSB0eXBlT2ZTY29wZS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAxODcpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShib3VuZC5nZXRUeXBlKCkuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE4NykgYm91bmQuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE4NykgYm91bmQuZ2V0VHlwZSgpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDE4NykgYm91bmQuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQuZ2V0VHlwZSgpCisgIExpbmUgMTg4KSByZXMuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTkyKSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMTkzKSB0eXBlT2ZTY29wZS5pc0NvbnN0cmFpbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNDb25zdHJhaW50KCkKKyAgTGluZSAxOTQpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZSh0eXBlT2ZTY29wZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxOTQpIHR5cGVPZlNjb3BlLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE5NCkgdHlwZU9mU2NvcGUuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTk0KSB0eXBlT2ZTY29wZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSAxOTQpIHR5cGVPZlNjb3BlLmFzQ29uc3RyYWludFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNDb25zdHJhaW50VHlwZSgpCisgIExpbmUgMTk2KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUodHlwZU9mU2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE5NikgdHlwZU9mU2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTk2KSB0eXBlT2ZTY29wZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxOTkpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVPZlRoaXNJbih3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZU9mVGhpc0luKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxOTkpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyMDApIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZSh0eXBlT2ZTY29wZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjAwKSB0eXBlT2ZTY29wZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAyMDApIHR5cGVPZlNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDIxMSkgQ29udGV4dEhlbHBlci5zb2x2ZU1ldGhvZEFzVXNhZ2UocmVmVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCByZWZUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5Db250ZXh0SGVscGVyLnNvbHZlTWV0aG9kQXNVc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAyMTEpIHJlZlR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMjExKSByZWZUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSAyMTIpIHJlZi5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMjEzKSByZWYuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDIxNSkgcmVzb2x2ZU1ldGhvZFR5cGVQYXJhbWV0ZXJzRnJvbUV4cGxpY2l0TGlzdCh0eXBlU29sdmVyLCBtZXRob2RVc2FnZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5yZXNvbHZlTWV0aG9kVHlwZVBhcmFtZXRlcnNGcm9tRXhwbGljaXRMaXN0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UpCisgIExpbmUgMjM2KSBtZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAyMzYpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKQorICBMaW5lIDIzNykgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5nZXRQYXJhbShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSAyMzcpIG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpCisgIExpbmUgMjM4KSBwYXJhbWV0ZXIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDIzOSkgcGFyYW1ldGVyLmlzVmFyaWFkaWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUGFyYW1ldGVyRGVjbGFyYXRpb24uaXNWYXJpYWRpYygpCisgIExpbmUgMjQwKSBwYXJhbWV0ZXJUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDI0MCkgcGFyYW1ldGVyVHlwZS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgMjQyKSBpbmZlclR5cGVzKGFyZ3VtZW50c1R5cGVzLmdldChpKSwgcGFyYW1ldGVyVHlwZSwgZGVyaXZlZFZhbHVlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5pbmZlclR5cGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAyNDIpIGFyZ3VtZW50c1R5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAyNDUpIGRlcml2ZWRWYWx1ZXMuZW50cnlTZXQoKSA9PT4gamF2YS51dGlsLk1hcC5lbnRyeVNldCgpCisgIExpbmUgMjQ2KSBtZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcihlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDI0NikgZW50cnkuZ2V0S2V5KCkgPT0+IGphdmEudXRpbC5NYXAuRW50cnkuZ2V0S2V5KCkKKyAgTGluZSAyNDYpIGVudHJ5LmdldFZhbHVlKCkgPT0+IGphdmEudXRpbC5NYXAuRW50cnkuZ2V0VmFsdWUoKQorICBMaW5lIDI0OSkgcmVmVHlwZS51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShtZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLnVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDI0OSkgbWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpCisgIExpbmUgMjUwKSBtZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkKKyAgTGluZSAyNTEpIG1ldGhvZFVzYWdlLnJlcGxhY2VSZXR1cm5UeXBlKHJldHVyblR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmVwbGFjZVJldHVyblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjUzKSBtZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAyNTMpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKQorICBMaW5lIDI1NCkgcmVmVHlwZS51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShtZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkuZ2V0KGkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlci51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAyNTQpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZXMoKS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMjU0KSBtZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkKKyAgTGluZSAyNTUpIG1ldGhvZFVzYWdlLnJlcGxhY2VQYXJhbVR5cGUoaSwgcmVwbGFjZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmVwbGFjZVBhcmFtVHlwZShpbnQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDI1NykgT3B0aW9uYWwub2YobWV0aG9kVXNhZ2UpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAyNjQpIHNvdXJjZS5lcXVhbHModGFyZ2V0KSA9PT4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNjcpIHNvdXJjZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyNjcpIHRhcmdldC5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyNjgpIHNvdXJjZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyNjkpIHRhcmdldC5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyNzApIHNvdXJjZVJlZlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0YXJnZXRSZWZUeXBlLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjcwKSBzb3VyY2VSZWZUeXBlLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjcwKSB0YXJnZXRSZWZUeXBlLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjcxKSBzb3VyY2VSZWZUeXBlLmlzUmF3VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5pc1Jhd1R5cGUoKQorICBMaW5lIDI3MSkgdGFyZ2V0UmVmVHlwZS5pc1Jhd1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuaXNSYXdUeXBlKCkKKyAgTGluZSAyNzIpIHNvdXJjZVJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDI3Mikgc291cmNlUmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpCisgIExpbmUgMjczKSBpbmZlclR5cGVzKHNvdXJjZVJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSksIHRhcmdldFJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSksIG1hcHBpbmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0LmluZmVyVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDI3Mykgc291cmNlUmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAyNzMpIHNvdXJjZVJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDI3MykgdGFyZ2V0UmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAyNzMpIHRhcmdldFJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDI3OSkgc291cmNlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDI3OSkgdGFyZ2V0LmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMjgwKSB0YXJnZXQuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNCb3VuZGVkKCkKKyAgTGluZSAyODApIHRhcmdldC5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDI4MSkgaW5mZXJUeXBlcyhzb3VyY2UsIHRhcmdldC5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgbWFwcGluZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQuaW5mZXJUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMjgxKSB0YXJnZXQuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMjgxKSB0YXJnZXQuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAyODYpIHNvdXJjZS5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDI4NikgdGFyZ2V0LmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMjg3KSBzb3VyY2UuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNCb3VuZGVkKCkKKyAgTGluZSAyODcpIHNvdXJjZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDI4NykgdGFyZ2V0LmFzV2lsZGNhcmQoKS5pc0JvdW5kZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzQm91bmRlZCgpCisgIExpbmUgMjg3KSB0YXJnZXQuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAyODgpIGluZmVyVHlwZXMoc291cmNlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLCB0YXJnZXQuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCksIG1hcHBpbmdzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0LmluZmVyVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDI4OCkgc291cmNlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDI4OCkgc291cmNlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMjg4KSB0YXJnZXQuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMjg4KSB0YXJnZXQuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAyOTIpIHNvdXJjZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyOTIpIHRhcmdldC5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMjkzKSBtYXBwaW5ncy5wdXQodGFyZ2V0LmFzVHlwZVBhcmFtZXRlcigpLCBzb3VyY2UpID09PiBqYXZhLnV0aWwuTWFwLnB1dChLLCBWKQorICBMaW5lIDI5MykgdGFyZ2V0LmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDI5Nikgc291cmNlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMjk2KSB0YXJnZXQuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDI5NykgbWFwcGluZ3MucHV0KHRhcmdldC5hc1R5cGVQYXJhbWV0ZXIoKSwgc291cmNlKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAyOTcpIHRhcmdldC5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAzMDApIHNvdXJjZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDMwMCkgdGFyZ2V0LmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMzAxKSB0YXJnZXQuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNCb3VuZGVkKCkKKyAgTGluZSAzMDEpIHRhcmdldC5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDMwMikgaW5mZXJUeXBlcyhzb3VyY2UsIHRhcmdldC5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgbWFwcGluZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQuaW5mZXJUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMzAyKSB0YXJnZXQuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMzAyKSB0YXJnZXQuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAzMDcpIHNvdXJjZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDMwNykgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAzMDgpIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMzA4KSB0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgMzEyKSBzb3VyY2UuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSAzMTIpIHRhcmdldC5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAzMTMpIHNvdXJjZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0JvdW5kZWQoKQorICBMaW5lIDMxMykgc291cmNlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMzE0KSBpbmZlclR5cGVzKHNvdXJjZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgdGFyZ2V0LCBtYXBwaW5ncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5pbmZlclR5cGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAzMTQpIHNvdXJjZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAzMTQpIHNvdXJjZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDMxOCkgc291cmNlLmlzQ29uc3RyYWludCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0NvbnN0cmFpbnQoKQorICBMaW5lIDMxOCkgdGFyZ2V0LmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDMxOSkgaW5mZXJUeXBlcyhzb3VyY2UuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCksIHRhcmdldCwgbWFwcGluZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQuaW5mZXJUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMzE5KSBzb3VyY2UuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYW1iZGFDb25zdHJhaW50VHlwZS5nZXRCb3VuZCgpCisgIExpbmUgMzE5KSBzb3VyY2UuYXNDb25zdHJhaW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkKKyAgTGluZSAzMjMpIHNvdXJjZS5pc0NvbnN0cmFpbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNDb25zdHJhaW50KCkKKyAgTGluZSAzMjMpIHRhcmdldC5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMzI0KSBpbmZlclR5cGVzKHNvdXJjZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSwgdGFyZ2V0LCBtYXBwaW5ncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5pbmZlclR5cGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAzMjQpIHNvdXJjZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSAzMjQpIHNvdXJjZS5hc0NvbnN0cmFpbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzQ29uc3RyYWludFR5cGUoKQorICBMaW5lIDMyNykgc291cmNlLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAzMjcpIHRhcmdldC5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMzI4KSBtYXBwaW5ncy5wdXQodGFyZ2V0LmFzVHlwZVBhcmFtZXRlcigpLCBzb3VyY2UpID09PiBqYXZhLnV0aWwuTWFwLnB1dChLLCBWKQorICBMaW5lIDMyOCkgdGFyZ2V0LmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDMzMSkgc291cmNlLmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSAzMzEpIHRhcmdldC5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMzM0KSBzb3VyY2UuaXNOdWxsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzTnVsbCgpCisgIExpbmUgMzM3KSBzb3VyY2UuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDMzNykgdGFyZ2V0LmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAzNDMpIG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkKKyAgTGluZSAzNDMpIG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpCisgIExpbmUgMzQ0KSBhY3R1YWxQYXJhbVR5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzQ0KSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgMzQ0KSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDM0NykgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5nZXRMYXN0UGFyYW0oKS5nZXRUeXBlKCkuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgMzQ3KSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmdldExhc3RQYXJhbSgpLmdldFR5cGUoKS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgMzQ3KSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmdldExhc3RQYXJhbSgpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSAzNDcpIG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkuZ2V0TGFzdFBhcmFtKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRMYXN0UGFyYW0oKQorICBMaW5lIDM0NykgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSAzNTApIGFjdHVhbFBhcmFtVHlwZXMuZ2V0KGFjdHVhbFBhcmFtVHlwZXMuc2l6ZSgpIC0gMSkuaXNBcnJheSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0FycmF5KCkKKyAgTGluZSAzNTApIGFjdHVhbFBhcmFtVHlwZXMuZ2V0KGFjdHVhbFBhcmFtVHlwZXMuc2l6ZSgpIC0gMSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMzUwKSBhY3R1YWxQYXJhbVR5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMzUxKSBhY3R1YWxQYXJhbVR5cGVzLmdldChhY3R1YWxQYXJhbVR5cGVzLnNpemUoKSAtIDEpLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDM1MSkgYWN0dWFsUGFyYW1UeXBlcy5nZXQoYWN0dWFsUGFyYW1UeXBlcy5zaXplKCkgLSAxKS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgMzUxKSBhY3R1YWxQYXJhbVR5cGVzLmdldChhY3R1YWxQYXJhbVR5cGVzLnNpemUoKSAtIDEpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDM1MSkgYWN0dWFsUGFyYW1UeXBlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDM1MikgYWN0dWFsUGFyYW1UeXBlcy5nZXQoYWN0dWFsUGFyYW1UeXBlcy5zaXplKCkgLSAxKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzNTIpIGFjdHVhbFBhcmFtVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzNTMpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzU0KSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMzU0KSBtZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDM1NSkgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnJlcGxhY2VUeXBlUGFyYW0oZXhwZWN0ZWRUeXBlLCB0cCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzNTgpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzYxKSBTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gcmVzb2x2ZSB0aGUgdHlwZSB0eXBlUGFyYW1ldGVyc1ZhbHVlcyBpbiBhIE1ldGhvZFVzYWdlLiBFeHBlY3RlZCB0eXBlOiAlcywgQWN0dWFsIHR5cGU6ICVzLiBNZXRob2QgRGVjbGFyYXRpb246ICVzLiBNZXRob2RVc2FnZTogJXMiLCBleHBlY3RlZFR5cGUsIGFjdHVhbFR5cGUsIG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCksIG1ldGhvZFVzYWdlKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAzNjQpIG1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpCisgIExpbmUgMzY4KSBtYXRjaFR5cGVQYXJhbWV0ZXJzKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSwgbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0Lm1hdGNoVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDM3NCkgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKS5oYXNWYXJpYWRpY1BhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKQorICBMaW5lIDM3NCkgbWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSAzNzUpIGFjdHVhbFBhcmFtVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzNzYpIGFjdHVhbFBhcmFtVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzNzkpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpbnQpCisgIExpbmUgMzgwKSBhY3R1YWxQYXJhbVR5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzODEpIG1hdGNoVHlwZVBhcmFtZXRlcnMoZXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlLCBtYXRjaGVkVHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQubWF0Y2hUeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMzgzKSBtYXRjaGVkVHlwZVBhcmFtZXRlcnMua2V5U2V0KCkgPT0+IGphdmEudXRpbC5NYXAua2V5U2V0KCkKKyAgTGluZSAzODQpIG1ldGhvZFVzYWdlLnJlcGxhY2VUeXBlUGFyYW1ldGVyKHRwLCBtYXRjaGVkVHlwZVBhcmFtZXRlcnMuZ2V0KHRwKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDM4NCkgbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzLmdldCh0cCkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzkwKSBleHBlY3RlZFR5cGUuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDM5MSkgYWN0dWFsVHlwZS5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMzkxKSBhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDM5MikgYWN0dWFsVHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM5MikgYWN0dWFsVHlwZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzOTQpIG1hdGNoZWRUeXBlUGFyYW1ldGVycy5wdXQoZXhwZWN0ZWRUeXBlLmFzVHlwZVBhcmFtZXRlcigpLCBhY3R1YWxUeXBlKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAzOTQpIGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAzOTUpIGV4cGVjdGVkVHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDM5NikgYWN0dWFsVHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDM5NykgYWN0dWFsVHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM5NykgYWN0dWFsVHlwZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAzOTkpIG1hdGNoVHlwZVBhcmFtZXRlcnMoZXhwZWN0ZWRUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBtYXRjaGVkVHlwZVBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQubWF0Y2hUeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNDAwKSBleHBlY3RlZFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgNDAwKSBleHBlY3RlZFR5cGUuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDQwMSkgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA0MDEpIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDQwMykgZXhwZWN0ZWRUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDQwNSkgYWN0dWFsVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNDA1KSBhY3R1YWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSA0MDUpIGFjdHVhbFR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNDA3KSBleHBlY3RlZFR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDQwNykgZXhwZWN0ZWRUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDQwOCkgbWF0Y2hUeXBlUGFyYW1ldGVycyh0cCwgYWN0dWFsVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSwgbWF0Y2hlZFR5cGVQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0Lm1hdGNoVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDQwOCkgYWN0dWFsVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA0MDgpIGFjdHVhbFR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDQwOCkgYWN0dWFsVHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA0MTMpIGV4cGVjdGVkVHlwZS5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgNDE1KSBleHBlY3RlZFR5cGUuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSA0MTgpIGV4cGVjdGVkVHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQxOCkgZXhwZWN0ZWRUeXBlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQyMykgdHAuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Qm91bmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQyMykgdHAuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVmFyaWFibGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSA0MjQpIHNvbHZlTWV0aG9kQXNVc2FnZShib3VuZC5nZXRUeXBlKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNDI0KSBib3VuZC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5nZXRUeXBlKCkKKyAgTGluZSA0MjUpIG1ldGhvZFVzYWdlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0MjkpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgNDM0KSBzb2x2ZU1ldGhvZEFzVXNhZ2UoKFJlZmVyZW5jZVR5cGUpIHR5cGUsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNDM2KSBzb2x2ZU1ldGhvZEFzVXNhZ2UoKFR5cGVWYXJpYWJsZSkgdHlwZSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuTWV0aG9kQ2FsbEV4cHJDb250ZXh0LnNvbHZlTWV0aG9kQXNVc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZVZhcmlhYmxlLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDQzOSkgd2lsZGNhcmRVc2FnZS5pc1N1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc1N1cGVyKCkKKyAgTGluZSA0NDApIHNvbHZlTWV0aG9kQXNVc2FnZSh3aWxkY2FyZFVzYWdlLmdldEJvdW5kZWRUeXBlKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLk1ldGhvZENhbGxFeHByQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNDQwKSB3aWxkY2FyZFVzYWdlLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgNDQxKSB3aWxkY2FyZFVzYWdlLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSA0NDgpIHNvbHZlTWV0aG9kQXNVc2FnZShjb25zdHJhaW50VHlwZS5nZXRCb3VuZCgpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDQ0OCkgY29uc3RyYWludFR5cGUuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSA0NTEpIHNvbHZlTWV0aG9kQXNVc2FnZShuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5NZXRob2RDYWxsRXhwckNvbnRleHQuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDQ1MykgdHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQ1MykgdHlwZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0NTgpIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNDU5KSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVQYXJhbWV0ZXJzTWFwKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVQYXJhbWV0ZXJzTWFwKCkKKyAgTGluZSA0NTkpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNDYwKSBlbnRyeS5fMS5kZWNsYXJlZE9uVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPblR5cGUoKQorICBMaW5lIDQ2MCkgc2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0R2VuZXJpY1BhcmFtZXRlckJ5TmFtZShlbnRyeS5fMS5nZXROYW1lKCkpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA0NjApIHNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpLmdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUoZW50cnkuXzEuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0R2VuZXJpY1BhcmFtZXRlckJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDQ2MCkgc2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNDYwKSBlbnRyeS5fMS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA0NjEpIHR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoZW50cnkuXzEsIHNjb3BlLmFzUmVmZXJlbmNlVHlwZSgpLmdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUoZW50cnkuXzEuZ2V0TmFtZSgpKS5nZXQoKSwgaW5mZXJyZWRUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNDYxKSBzY29wZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRHZW5lcmljUGFyYW1ldGVyQnlOYW1lKGVudHJ5Ll8xLmdldE5hbWUoKSkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDQ2MSkgc2NvcGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0R2VuZXJpY1BhcmFtZXRlckJ5TmFtZShlbnRyeS5fMS5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRHZW5lcmljUGFyYW1ldGVyQnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNDYxKSBzY29wZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA0NjEpIGVudHJ5Ll8xLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDQ3MSkgaW5mZXJyZWRUeXBlcy5rZXlTZXQoKSA9PT4gamF2YS51dGlsLk1hcC5rZXlTZXQoKQorICBMaW5lIDQ3MikgdHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgaW5mZXJyZWRUeXBlcy5nZXQodHApLCBpbmZlcnJlZFR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA0NzIpIGluZmVycmVkVHlwZXMuZ2V0KHRwKSA9PT4gamF2YS51dGlsLk1hcC5nZXQoamF2YS5sYW5nLk9iamVjdCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19NZXRob2RDb250ZXh0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19NZXRob2RDb250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX01ldGhvZENvbnRleHQudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfU3RhdGVtZW50Q29udGV4dC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfY29udGV4dHNfU3RhdGVtZW50Q29udGV4dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19TdGF0ZW1lbnRDb250ZXh0LnR4dApAQCAtMCwwICsxLDkzIEBACisgIExpbmUgNDkpIGdldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNTIpIGdldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNTQpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnNpemUoKQorICBMaW5lIDU0KSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuZ2V0U3RhdGVtZW50cygpCisgIExpbmUgNTUpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLmVxdWFscyhzdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU1KSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpLmdldChpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDU1KSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuZ2V0U3RhdGVtZW50cygpCisgIExpbmUgNjMpIEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3IoYmxvY2tTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjMpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmdldChpbnQpCisgIExpbmUgNjMpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50cy5nZXRTdGF0ZW1lbnRzKCkKKyAgTGluZSA2NCkgc29sdmVXaXRoKHN5bWJvbERlY2xhcmF0b3IsIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LnNvbHZlV2l0aChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvciwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2NSkgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDcxKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGdldFBhcmVudE5vZGUoc3RtdCksIHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDcxKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGdldFBhcmVudE5vZGUoc3RtdCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzEpIGdldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzUpIGdldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzgpIGdldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgODApIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnNpemUoKQorICBMaW5lIDgwKSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuZ2V0U3RhdGVtZW50cygpCisgIExpbmUgODEpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLmVxdWFscyhzdG10KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgxKSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpLmdldChpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDgxKSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuZ2V0U3RhdGVtZW50cygpCisgIExpbmUgODkpIEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3IoYmxvY2tTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgODkpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmdldChpbnQpCisgIExpbmUgODkpIGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50cy5nZXRTdGF0ZW1lbnRzKCkKKyAgTGluZSA5MCkgc29sdmVXaXRoKHN5bWJvbERlY2xhcmF0b3IsIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LnNvbHZlV2l0aChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvciwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5MSkgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDkyKSBPcHRpb25hbC5vZihWYWx1ZS5mcm9tKHN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSA5MikgVmFsdWUuZnJvbShzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVmFsdWUuZnJvbShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uKQorICBMaW5lIDkyKSBzeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA5NykgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChnZXRQYXJlbnROb2RlKHN0bXQpLCB0eXBlU29sdmVyKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDk3KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGdldFBhcmVudE5vZGUoc3RtdCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgOTcpIGdldFBhcmVudE5vZGUoc3RtdCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTA0KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEwNSkgc29sdmVXaXRoQXNWYWx1ZShzeW1ib2xEZWNsYXJhdG9yLCBuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGhBc1ZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMDYpIHN5bWJvbFJlZmVyZW5jZS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTExKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMTIpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTEyKSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDExNCkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTE1KSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDExNSkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxMTcpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDExOCkgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMTgpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMTIwKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjEpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTIxKSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDEyMykgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTI1KSBub2RlV2l0aFN0bXQuZ2V0U3RhdGVtZW50cygpLnNpemUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5zaXplKCkKKyAgTGluZSAxMjUpIG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50cy5nZXRTdGF0ZW1lbnRzKCkKKyAgTGluZSAxMjYpIG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLmVxdWFscyh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjYpIG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmdldChpbnQpCisgIExpbmUgMTI2KSBub2RlV2l0aFN0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHMuZ2V0U3RhdGVtZW50cygpCisgIExpbmUgMTM0KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkuZ2V0KGkpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0U3ltYm9sRGVjbGFyYXRvcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEzNCkgbm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3QuZ2V0KGludCkKKyAgTGluZSAxMzQpIG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50cy5nZXRTdGF0ZW1lbnRzKCkKKyAgTGluZSAxMzUpIHNvbHZlV2l0aEFzVmFsdWUoc3ltYm9sRGVjbGFyYXRvciwgbmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuc29sdmVXaXRoQXNWYWx1ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvciwgamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTM2KSBzeW1ib2xSZWZlcmVuY2UuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDE0MikgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxNDMpIHBhcmVudENvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sQXNWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNTApIEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3Iod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTUxKSBzb2x2ZVdpdGgoc3ltYm9sRGVjbGFyYXRvciwgbmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuc29sdmVXaXRoKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xEZWNsYXJhdG9yLCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1Mikgc3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE1NykgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTU4KSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNTgpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMTYwKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNjEpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE2MSkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxNjMpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE2NCkgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTY0KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDE2NikgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTY3KSBnZXRQYXJlbnQoKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNjcpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMTY5KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNzEpIG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkuc2l6ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LnNpemUoKQorICBMaW5lIDE3MSkgbm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzLmdldFN0YXRlbWVudHMoKQorICBMaW5lIDE3Mikgbm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSkuZXF1YWxzKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE3Mikgbm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3QuZ2V0KGludCkKKyAgTGluZSAxNzIpIG5vZGVXaXRoU3RtdC5nZXRTdGF0ZW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU3RhdGVtZW50cy5nZXRTdGF0ZW1lbnRzKCkKKyAgTGluZSAxODApIEphdmFQYXJzZXJGYWN0b3J5LmdldFN5bWJvbERlY2xhcmF0b3Iobm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKS5nZXQoaSksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTgwKSBub2RlV2l0aFN0bXQuZ2V0U3RhdGVtZW50cygpLmdldChpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDE4MCkgbm9kZVdpdGhTdG10LmdldFN0YXRlbWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTdGF0ZW1lbnRzLmdldFN0YXRlbWVudHMoKQorICBMaW5lIDE4MSkgc29sdmVXaXRoKHN5bWJvbERlY2xhcmF0b3IsIG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LnNvbHZlV2l0aChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sRGVjbGFyYXRvciwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxODIpIHN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxODgpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE4OCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAxOTMpIGdldFBhcmVudCgpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxOTMpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMTk4KSBnZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE5OCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19Td2l0Y2hFbnRyeUNvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX1N3aXRjaEVudHJ5Q29udGV4dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1MmNlMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19Td2l0Y2hFbnRyeUNvbnRleHQudHh0CkBAIC0wLDAgKzEsMjMgQEAKKyAgTGluZSA0NykgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNDgpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGUoc3dpdGNoU3RtdC5nZXRTZWxlY3RvcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0OCkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQ4KSBzd2l0Y2hTdG10LmdldFNlbGVjdG9yKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LmdldFNlbGVjdG9yKCkKKyAgTGluZSA0OSkgdHlwZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA0OSkgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKS5pc0VudW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmlzRW51bSgpCisgIExpbmUgNDkpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgNDkpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNTIpIHR5cGVVc2FnZU9mVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLmhhc0ZpZWxkKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uaGFzRmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1MikgdHlwZVVzYWdlT2ZUeXBlRGVjbGFyYXRpb24uZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgNTMpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQodHlwZVVzYWdlT2ZUeXBlRGVjbGFyYXRpb24uZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0RmllbGQobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA1MykgdHlwZVVzYWdlT2ZUeXBlRGVjbGFyYXRpb24uZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0RmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDUzKSB0eXBlVXNhZ2VPZlR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSA2MSkgc3dpdGNoU3RtdC5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10LmdldEVudHJpZXMoKQorICBMaW5lIDYyKSBzZVN0bXQuZXF1YWxzKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYzKSBzZVN0bXQuZ2V0U3RhdGVtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10LmdldFN0YXRlbWVudHMoKQorICBMaW5lIDY0KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKHN0bXQsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRTeW1ib2xEZWNsYXJhdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjUpIHNvbHZlV2l0aChzeW1ib2xEZWNsYXJhdG9yLCBuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5zb2x2ZVdpdGgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbERlY2xhcmF0b3IsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjYpIHN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA3MykgZ2V0UGFyZW50KCkuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzMpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgNzgpIGdldFBhcmVudCgpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3OCkgZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkFic3RyYWN0SmF2YVBhcnNlckNvbnRleHQuZ2V0UGFyZW50KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19UcnlXaXRoUmVzb3VyY2VDb250ZXh0LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9jb250ZXh0c19UcnlXaXRoUmVzb3VyY2VDb250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTRjMGNhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2NvbnRleHRzX1RyeVdpdGhSZXNvdXJjZUNvbnRleHQudHh0CkBAIC0wLDAgKzEsMjUgQEAKKyAgTGluZSA0NSkgd3JhcHBlZE5vZGUuZ2V0UmVzb3VyY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10LmdldFJlc291cmNlcygpCisgIExpbmUgNDYpIGV4cHIuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDQ3KSB2LmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ3KSB2LmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKQorICBMaW5lIDQ3KSB2LmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkKKyAgTGluZSA0OCkgSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKHYsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQ5KSBPcHRpb25hbC5vZihWYWx1ZS5mcm9tKGRlY2wpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNDkpIFZhbHVlLmZyb20oZGVjbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5WYWx1ZS5mcm9tKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24pCisgIExpbmUgNTQpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDU1KSBTdGF0ZW1lbnRDb250ZXh0LnNvbHZlSW5CbG9ja0FzVmFsdWUobmFtZSwgdHlwZVNvbHZlciwgd3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5TdGF0ZW1lbnRDb250ZXh0LnNvbHZlSW5CbG9ja0FzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNTcpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTcpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgNjMpIHdyYXBwZWROb2RlLmdldFJlc291cmNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdC5nZXRSZXNvdXJjZXMoKQorICBMaW5lIDY0KSBleHByLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGVzKCkKKyAgTGluZSA2NSkgdi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2NSkgdi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZS5nZXRJZGVudGlmaWVyKCkKKyAgTGluZSA2NSkgdi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpCisgIExpbmUgNjYpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKHYsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgNjYpIEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcih2LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5sb2NhbFZhcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3MSkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzIpIFN0YXRlbWVudENvbnRleHQuc29sdmVJbkJsb2NrKG5hbWUsIHR5cGVTb2x2ZXIsIHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuU3RhdGVtZW50Q29udGV4dC5zb2x2ZUluQmxvY2soamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQpCisgIExpbmUgNzQpIGdldFBhcmVudCgpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDc0KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQWJzdHJhY3RKYXZhUGFyc2VyQ29udGV4dC5nZXRQYXJlbnQoKQorICBMaW5lIDgwKSBnZXRQYXJlbnQoKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgODApIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5jb250ZXh0cy5BYnN0cmFjdEphdmFQYXJzZXJDb250ZXh0LmdldFBhcmVudCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0RlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfRGVmYXVsdENvbnN0cnVjdG9yRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYWQ2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0RlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDIgQEAKKyAgTGluZSA1MikgY2xhc3NEZWNsYXJhdGlvbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDYyKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0hlbHBlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0hlbHBlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0MDAyNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSGVscGVyLnR4dApAQCAtMCwwICsxLDI2IEBACisgIExpbmUgMzYpIG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QUklWQVRFKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM4KSBtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFJPVEVDVEVEKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQwKSBtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSA9PT4gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jb250YWlucyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ4KSBnZXRQYWNrYWdlTmFtZShjb250YWluZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldFBhY2thZ2VOYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0OSkgZ2V0Q2xhc3NOYW1lKCIiLCBjb250YWluZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldENsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNTEpIHBhY2thZ2VOYW1lLmlzRW1wdHkoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5pc0VtcHR5KCkKKyAgTGluZSA1MSkgY2xhc3NOYW1lLmlzRW1wdHkoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5pc0VtcHR5KCkKKyAgTGluZSA1NykgKChDb21waWxhdGlvblVuaXQpIGNvbnRhaW5lcikuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2VEZWNsYXJhdGlvbigpCisgIExpbmUgNTgpIHAuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDU5KSBwLmdldCgpLmdldE5hbWUoKS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDU5KSBwLmdldCgpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNTkpIHAuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDYyKSBnZXRQYWNrYWdlTmFtZShnZXRQYXJlbnROb2RlKGNvbnRhaW5lcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldFBhY2thZ2VOYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2MikgZ2V0UGFyZW50Tm9kZShjb250YWluZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY5KSBnZXRDbGFzc05hbWUoYmFzZSwgZ2V0UGFyZW50Tm9kZShjb250YWluZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkhlbHBlci5nZXRDbGFzc05hbWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY5KSBnZXRQYXJlbnROb2RlKGNvbnRhaW5lcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzApICgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA3MCkgKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA3MSkgYi5pc0VtcHR5KCkgPT0+IGphdmEubGFuZy5TdHJpbmcuaXNFbXB0eSgpCisgIExpbmUgNzcpIGdldENsYXNzTmFtZShiYXNlLCBnZXRQYXJlbnROb2RlKGNvbnRhaW5lcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldENsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzcpIGdldFBhcmVudE5vZGUoY29udGFpbmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3OCkgKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDc4KSAoKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24pIGNvbnRhaW5lcikuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc5KSBiLmlzRW1wdHkoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5pc0VtcHR5KCkKKyAgTGluZSA4NSkgZ2V0Q2xhc3NOYW1lKGJhc2UsIGdldFBhcmVudE5vZGUoY29udGFpbmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuZ2V0Q2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA4NSkgZ2V0UGFyZW50Tm9kZShjb250YWluZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyQW5ub3RhdGlvbkRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzNzI1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckFubm90YXRpb25EZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxMiBAQAorICBMaW5lIDYwKSBIZWxwZXIuZ2V0UGFja2FnZU5hbWUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldFBhY2thZ2VOYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2NSkgSGVscGVyLmdldENsYXNzTmFtZSgiIiwgd3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldENsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzApIEhlbHBlci5jb250YWluZXJOYW1lKGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkhlbHBlci5jb250YWluZXJOYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3MCkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNzEpIGNvbnRhaW5lck5hbWUuaXNFbXB0eSgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmlzRW1wdHkoKQorICBMaW5lIDcyKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA3Mikgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc0KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgODApIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDgwKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgOTApIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA5MCkgdGhpcy5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5NWY4MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsODcgQEAKKyAgTGluZSAzNykgVVVJRC5yYW5kb21VVUlEKCkgPT0+IGphdmEudXRpbC5VVUlELnJhbmRvbVVVSUQoKQorICBMaW5lIDQ0KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKHdyYXBwZWROb2RlLmdldFR5cGUoKS5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA0NCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCksIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZSh3cmFwcGVkTm9kZS5nZXRUeXBlKCkuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA0NCkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDQpIHdyYXBwZWROb2RlLmdldFBhcmVudE5vZGUoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgNDQpIHdyYXBwZWROb2RlLmdldFBhcmVudE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKQorICBMaW5lIDQ1KSB3cmFwcGVkTm9kZS5nZXRUeXBlKCkuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNDUpIHdyYXBwZWROb2RlLmdldFR5cGUoKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkKKyAgTGluZSA0NSkgd3JhcHBlZE5vZGUuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuT2JqZWN0Q3JlYXRpb25FeHByLmdldFR5cGUoKQorICBMaW5lIDU0KSB3cmFwcGVkTm9kZS5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5nZXQoKS5zdHJlYW0oKS5maWx0ZXIobm9kZSAtPiBtZW1iZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG5vZGUuZ2V0Q2xhc3MoKSkpLm1hcChub2RlIC0+IChUKSBub2RlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBFUlJPUgorICBMaW5lIDU0KSB3cmFwcGVkTm9kZS5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5nZXQoKS5zdHJlYW0oKS5maWx0ZXIobm9kZSAtPiBtZW1iZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG5vZGUuZ2V0Q2xhc3MoKSkpLm1hcChub2RlIC0+IChUKSBub2RlKSA9PT4gRVJST1IKKyAgTGluZSA1NCkgd3JhcHBlZE5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuZ2V0KCkuc3RyZWFtKCkuZmlsdGVyKG5vZGUgLT4gbWVtYmVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShub2RlLmdldENsYXNzKCkpKSA9PT4gRVJST1IKKyAgTGluZSA1NCkgd3JhcHBlZE5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuZ2V0KCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNTQpIHdyYXBwZWROb2RlLmdldEFub255bW91c0NsYXNzQm9keSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA1NCkgd3JhcHBlZE5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHIuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkKKyAgTGluZSA1OCkgbWVtYmVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShub2RlLmdldENsYXNzKCkpID09PiBFUlJPUgorICBMaW5lIDU4KSBub2RlLmdldENsYXNzKCkgPT0+IEVSUk9SCisgIExpbmUgNjApIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDY1KSB0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjUpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA3MCkgc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDc2KSBzdXBlclR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKS5nZXRBbmNlc3RvcnMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmlzSW50ZXJmYWNlKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA3Nikgc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkuZ2V0QW5jZXN0b3JzKCkuc3RyZWFtKCkuZmlsdGVyKHR5cGUgLT4gdHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5pc0ludGVyZmFjZSgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA3Nikgc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkuZ2V0QW5jZXN0b3JzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNzYpIHN1cGVyVHlwZURlY2xhcmF0aW9uLmFzUmVmZXJlbmNlVHlwZSgpLmdldEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkKKyAgTGluZSA3Nikgc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDc5KSB0eXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgNzkpIHR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgODApIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDg2KSBmaW5kTWVtYmVyc09mS2luZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcykuc3RyZWFtKCkubWFwKGN0b3IgLT4gbmV3IEphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMsIGN0b3IsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgODYpIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKS5zdHJlYW0oKS5tYXAoY3RvciAtPiBuZXcgSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24odGhpcywgY3RvciwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDg2KSBmaW5kTWVtYmVyc09mS2luZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5jbGFzcykuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgODYpIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmZpbmRNZW1iZXJzT2ZLaW5kKGphdmEubGFuZy5DbGFzczxUPikKKyAgTGluZSA4OSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTAwKSBJbW11dGFibGVMaXN0LjxSZWZlcmVuY2VUeXBlPmJ1aWxkZXIoKS5hZGQoZ2V0U3VwZXJDbGFzcygpKS5hZGRBbGwoc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkuZ2V0QW5jZXN0b3JzKCkpLmJ1aWxkKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5CdWlsZGVyLmJ1aWxkKCkKKyAgTGluZSAxMDApIEltbXV0YWJsZUxpc3QuPFJlZmVyZW5jZVR5cGU+YnVpbGRlcigpLmFkZChnZXRTdXBlckNsYXNzKCkpLmFkZEFsbChzdXBlclR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKS5nZXRBbmNlc3RvcnMoKSkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5CdWlsZGVyLmFkZEFsbChqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzIEU+KQorICBMaW5lIDEwMCkgSW1tdXRhYmxlTGlzdC48UmVmZXJlbmNlVHlwZT5idWlsZGVyKCkuYWRkKGdldFN1cGVyQ2xhc3MoKSkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5CdWlsZGVyLmFkZChFLi4uKQorICBMaW5lIDEwMCkgSW1tdXRhYmxlTGlzdC48UmVmZXJlbmNlVHlwZT5idWlsZGVyKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5idWlsZGVyKCkKKyAgTGluZSAxMDIpIGdldFN1cGVyQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyQ2xhc3MoKQorICBMaW5lIDEwMykgc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkuZ2V0QW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKQorICBMaW5lIDEwMykgc3VwZXJUeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDExMSkgZmluZE1lbWJlcnNPZktpbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uY2xhc3MpLnN0cmVhbSgpLmZsYXRNYXAoZmllbGQgLT4gZmllbGQuZ2V0VmFyaWFibGVzKCkuc3RyZWFtKCkubWFwKHZhcmlhYmxlIC0+IG5ldyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbih2YXJpYWJsZSwgdHlwZVNvbHZlcikpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBFUlJPUgorICBMaW5lIDExMSkgZmluZE1lbWJlcnNPZktpbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uY2xhc3MpLnN0cmVhbSgpLmZsYXRNYXAoZmllbGQgLT4gZmllbGQuZ2V0VmFyaWFibGVzKCkuc3RyZWFtKCkubWFwKHZhcmlhYmxlIC0+IG5ldyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbih2YXJpYWJsZSwgdHlwZVNvbHZlcikpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmxhdE1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgamF2YS51dGlsLnN0cmVhbS5TdHJlYW08PyBleHRlbmRzIFI+PikKKyAgTGluZSAxMTEpIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmNsYXNzKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMTEpIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmZpbmRNZW1iZXJzT2ZLaW5kKGphdmEubGFuZy5DbGFzczxUPikKKyAgTGluZSAxMTQpIGZpZWxkLmdldFZhcmlhYmxlcygpLnN0cmVhbSgpLm1hcCh2YXJpYWJsZSAtPiBuZXcgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24odmFyaWFibGUsIHR5cGVTb2x2ZXIpKSA9PT4gRVJST1IKKyAgTGluZSAxMTQpIGZpZWxkLmdldFZhcmlhYmxlcygpLnN0cmVhbSgpID09PiBFUlJPUgorICBMaW5lIDExNCkgZmllbGQuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMTE3KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxMjApIGdldFN1cGVyQ2xhc3MoKS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpCisgIExpbmUgMTIwKSBnZXRTdXBlckNsYXNzKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTIwKSBnZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAxMjMpIGdldEludGVyZmFjZXMoKS5zdHJlYW0oKS5mbGF0TWFwKGludGVmYWNlIC0+IGludGVmYWNlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpLnN0cmVhbSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTIzKSBnZXRJbnRlcmZhY2VzKCkuc3RyZWFtKCkuZmxhdE1hcChpbnRlZmFjZSAtPiBpbnRlZmFjZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKS5zdHJlYW0oKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZsYXRNYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIGphdmEudXRpbC5zdHJlYW0uU3RyZWFtPD8gZXh0ZW5kcyBSPj4pCisgIExpbmUgMTIzKSBnZXRJbnRlcmZhY2VzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTIzKSBnZXRJbnRlcmZhY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAxMjQpIGludGVmYWNlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEyNCkgaW50ZWZhY2UuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0QWxsRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKQorICBMaW5lIDEyNCkgaW50ZWZhY2UuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTI1KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxMjgpIEltbXV0YWJsZUxpc3QuPEZpZWxkRGVjbGFyYXRpb24+YnVpbGRlcigpLmFkZEFsbChteUZpZWxkcykuYWRkQWxsKHN1cGVyQ2xhc3NGaWVsZHMpLmFkZEFsbChpbnRlcmZhY2VGaWVsZHMpLmJ1aWxkKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5CdWlsZGVyLmJ1aWxkKCkKKyAgTGluZSAxMjgpIEltbXV0YWJsZUxpc3QuPEZpZWxkRGVjbGFyYXRpb24+YnVpbGRlcigpLmFkZEFsbChteUZpZWxkcykuYWRkQWxsKHN1cGVyQ2xhc3NGaWVsZHMpLmFkZEFsbChpbnRlcmZhY2VGaWVsZHMpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3QuQnVpbGRlci5hZGRBbGwoamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxMjgpIEltbXV0YWJsZUxpc3QuPEZpZWxkRGVjbGFyYXRpb24+YnVpbGRlcigpLmFkZEFsbChteUZpZWxkcykuYWRkQWxsKHN1cGVyQ2xhc3NGaWVsZHMpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3QuQnVpbGRlci5hZGRBbGwoamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxMjgpIEltbXV0YWJsZUxpc3QuPEZpZWxkRGVjbGFyYXRpb24+YnVpbGRlcigpLmFkZEFsbChteUZpZWxkcykgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5CdWlsZGVyLmFkZEFsbChqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzIEU+KQorICBMaW5lIDEyOCkgSW1tdXRhYmxlTGlzdC48RmllbGREZWNsYXJhdGlvbj5idWlsZGVyKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5idWlsZGVyKCkKKyAgTGluZSAxMzkpIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbi5jbGFzcykuc3RyZWFtKCkubWFwKG1ldGhvZCAtPiBuZXcgSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDEzOSkgZmluZE1lbWJlcnNPZktpbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKS5zdHJlYW0oKS5tYXAobWV0aG9kIC0+IG5ldyBKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMTM5KSBmaW5kTWVtYmVyc09mS2luZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEzOSkgZmluZE1lbWJlcnNPZktpbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmZpbmRNZW1iZXJzT2ZLaW5kKGphdmEubGFuZy5DbGFzczxUPikKKyAgTGluZSAxNDIpIENvbGxlY3RvcnMudG9TZXQoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvU2V0KCkKKyAgTGluZSAxNjIpIEhlbHBlci5nZXRQYWNrYWdlTmFtZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuZ2V0UGFja2FnZU5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE2NykgSGVscGVyLmdldENsYXNzTmFtZSgiIiwgd3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmdldENsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTcyKSBIZWxwZXIuY29udGFpbmVyTmFtZShnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuY29udGFpbmVyTmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTcyKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNzMpIGNvbnRhaW5lck5hbWUuaXNFbXB0eSgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmlzRW1wdHkoKQorICBMaW5lIDE3NCkgZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckFub255bW91c0NsYXNzRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTc2KSBnZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxODMpIGZpbmRNZW1iZXJzT2ZLaW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uY2xhc3MpLnN0cmVhbSgpLm1hcCh0eXBlTWVtYmVyIC0+IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbih0eXBlTWVtYmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTgzKSBmaW5kTWVtYmVyc09mS2luZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmNsYXNzKS5zdHJlYW0oKS5tYXAodHlwZU1lbWJlciAtPiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24odHlwZU1lbWJlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDE4MykgZmluZE1lbWJlcnNPZktpbmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5jbGFzcykuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTgzKSBmaW5kTWVtYmVyc09mS2luZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmZpbmRNZW1iZXJzT2ZLaW5kKGphdmEubGFuZy5DbGFzczxUPikKKyAgTGluZSAxODUpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbih0eXBlTWVtYmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PikKKyAgTGluZSAxODUpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxODYpIENvbGxlY3RvcnMudG9TZXQoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvU2V0KCkKKyAgTGluZSAxOTYpIExpc3RzLm5ld0FycmF5TGlzdCgpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzLm5ld0FycmF5TGlzdCgpCisgIExpbmUgMjAxKSB0aGlzLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjAxKSB0aGlzLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjYyN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxMzkgQEAKKyAgTGluZSA2NCkgd3JhcHBlZE5vZGUuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgNzkpIGdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDc5KSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDgzKSB3cmFwcGVkTm9kZS5lcXVhbHModGhhdC53cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5MCkgd3JhcHBlZE5vZGUuaGFzaENvZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmhhc2hDb2RlKCkKKyAgTGluZSAxMDcpIHdyYXBwZWROb2RlLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAxMTApIGZpZWxkLmdldFZhcmlhYmxlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDExMSkgZmllbGRzLmFkZChuZXcgSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24odmQsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdC5hZGQoRSkKKyAgTGluZSAxMTYpIHRoaXMuZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDExNikgdGhpcy5nZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAxMTgpIGZpZWxkcy5hZGRBbGwoc3VwZXJjbGFzcy5nZXRBbGxGaWVsZHMoKSkgPT0+IGphdmEudXRpbC5BcnJheUxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxMTgpIHN1cGVyY2xhc3MuZ2V0QWxsRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKQorICBMaW5lIDEyMCkgZ2V0SW50ZXJmYWNlcygpLmZvckVhY2goaW50ZXJmIC0+IGludGVyZi5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKS5mb3JFYWNoKGYgLT4geworICAgIGZpZWxkcy5hZGQoZik7Cit9KSkgPT0+IGphdmEubGFuZy5JdGVyYWJsZS5mb3JFYWNoKGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjw/IHN1cGVyIFQ+KQorICBMaW5lIDEyMCkgZ2V0SW50ZXJmYWNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTIwKSBpbnRlcmYuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0QWxsRmllbGRzKCkuZm9yRWFjaChmIC0+IHsKKyAgICBmaWVsZHMuYWRkKGYpOworfSkgPT0+IGphdmEubGFuZy5JdGVyYWJsZS5mb3JFYWNoKGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjw/IHN1cGVyIFQ+KQorICBMaW5lIDEyMCkgaW50ZXJmLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkKKyAgTGluZSAxMjApIGludGVyZi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxMjEpIGZpZWxkcy5hZGQoZikgPT0+IGphdmEudXRpbC5BcnJheUxpc3QuYWRkKEUpCisgIExpbmUgMTMyKSBnZXRDb250ZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSAxMzMpIGN0eC5zb2x2ZU1ldGhvZChuYW1lLCBwYXJhbWV0ZXJUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTM4KSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE0Nykgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTQ3KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTUyKSB3cmFwcGVkTm9kZS5nZXRFeHRlbmRlZFR5cGVzKCkuaXNFbXB0eSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmlzRW1wdHkoKQorICBMaW5lIDE1Mikgd3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZGVkVHlwZXMoKQorICBMaW5lIDE1Mykgb2JqZWN0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5vYmplY3QoKQorICBMaW5lIDE1NSkgdG9SZWZlcmVuY2VUeXBlKHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKS5nZXQoMCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24udG9SZWZlcmVuY2VUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSkKKyAgTGluZSAxNTUpIHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKS5nZXQoMCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3QuZ2V0KGludCkKKyAgTGluZSAxNTUpIHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRFeHRlbmRlZFR5cGVzKCkKKyAgTGluZSAxNjIpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAxNjMpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAxNjQpIGludGVyZmFjZXMuYWRkKHRvUmVmZXJlbmNlVHlwZSh0KSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE2NCkgdG9SZWZlcmVuY2VUeXBlKHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24udG9SZWZlcmVuY2VUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSkKKyAgTGluZSAxNzMpIHdyYXBwZWROb2RlLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAxNzYpIGRlY2xhcmVkLmFkZChuZXcgSmF2YVBhcnNlckNvbnN0cnVjdG9yRGVjbGFyYXRpb24odGhpcywgY29uc3RydWN0b3JEZWNsYXJhdGlvbiwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxNzkpIGRlY2xhcmVkLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgMTgxKSBJbW11dGFibGVMaXN0Lm9mKG5ldyBEZWZhdWx0Q29uc3RydWN0b3JEZWNsYXJhdGlvbih0aGlzKSkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZihFKQorICBMaW5lIDE4OSkgd3JhcHBlZE5vZGUuZ2V0QW5ub3RhdGlvbnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpCisgIExpbmUgMTkwKSBzb2x2ZVR5cGUoYW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY2Fub25pY2FsTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTkwKSBzb2x2ZVR5cGUoYW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE5MCkgc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDE5MCkgc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxOTApIGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDE5MCkgYW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpCisgIExpbmUgMTk5KSB3cmFwcGVkTm9kZS5pc0ludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkKKyAgTGluZSAyMDQpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRQYWNrYWdlTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFBhY2thZ2VOYW1lKCkKKyAgTGluZSAyMDkpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRDbGFzc05hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRDbGFzc05hbWUoKQorICBMaW5lIDIxNCkgamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAyMTkpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeShvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDIyNCkgamF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDIzMCkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjMwKSB0aGlzLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDIzMCkgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjMzKSBnZXRTdXBlckNsYXNzKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMjMzKSBnZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAyMzYpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKHN1cGVyY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMzYpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyMzYpIHN1cGVyY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjM5KSBzdXBlcmNsYXNzLmNhbkJlQXNzaWduZWRUbyhvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jYW5CZUFzc2lnbmVkVG8oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDI0NCkgdGhpcy53cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50ZWRUeXBlcygpCisgIExpbmUgMjQ1KSB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50ZWRUeXBlcygpCisgIExpbmUgMjQ2KSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlVHlwZSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUpCisgIExpbmUgMjQ3KSBhbmNlc3Rvci5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2FuQmVBc3NpZ25lZFRvKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSAyNjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI2MykgdGhpcy53cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAyNjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDI2NCkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZCh0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMjY2KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuc29sdmVUeXBlKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyNjcpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAyNzEpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNzIpIG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN0YXJ0c1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNzIpIG5hbWUubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAyNzIpIHByZWZpeC5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDI3MykgbmV3IEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKHRoaXMud3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShuYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyNzMpIG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCkKKyAgTGluZSAyNzMpIHByZWZpeC5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDI3NikgZ2V0Q29udGV4dCgpLmdldFBhcmVudCgpLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjc2KSBnZXRDb250ZXh0KCkuZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAyNzYpIGdldENvbnRleHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLmdldENvbnRleHQoKQorICBMaW5lIDI4MikgZ2V0U3VwZXJDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMjg0KSBhbmNlc3RvcnMuYWRkKHN1cGVyY2xhc3MpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyODYpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAyODcpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAyODgpIHRvUmVmZXJlbmNlVHlwZShpbXBsZW1lbnRlZCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi50b1JlZmVyZW5jZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKQorICBMaW5lIDI4OSkgYW5jZXN0b3JzLmFkZChhbmNlc3RvcikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI5OCkgd3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDMwMCkgbWV0aG9kcy5hZGQobmV3IEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uKSBtZW1iZXIsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLlNldC5hZGQoRSkKKyAgTGluZSAzMDgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAoKHRwKSAtPiBuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIodHAsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBFUlJPUgorICBMaW5lIDMwOCkgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCgodHApIC0+IG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcih0cCwgdHlwZVNvbHZlcikpID09PiBFUlJPUgorICBMaW5lIDMwOCkgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDMwOCkgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAzMTApIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDMyNCkgSGVscGVyLnRvQWNjZXNzTGV2ZWwod3JhcHBlZE5vZGUuZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLnRvQWNjZXNzTGV2ZWwoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgMzI0KSB3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDMzMykgdHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMzMykgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDMzOSkgdGhpcy53cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzQxKSByZXMuYWRkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbikgbWVtYmVyKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgMzQxKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pIG1lbWJlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4pCisgIExpbmUgMzQxKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzQ5KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmNvbnRhaW5lclR5cGUoKQorICBMaW5lIDM1NykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMzU3KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkKKyAgTGluZSAzNTgpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDM1OCkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAzNjApIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkuZ2V0KCkudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAzNjApIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDM2MCkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAzNjIpIHNvbHZlVHlwZShjbGFzc05hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDM2MykgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDM2NCkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0U2NvcGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkKKyAgTGluZSAzNjUpIGxvY2FsU2NvcGUuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDM2NikgbG9jYWxTY29wZS5nZXQoKS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAzNjYpIGxvY2FsU2NvcGUuZ2V0KCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMzY2KSBsb2NhbFNjb3BlLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzNjYpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDM2NikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMzY3KSBzb2x2ZVR5cGUobG9jYWxOYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzNzApIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAzNzEpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDM3MSkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMzczKSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDM3MykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMzc0KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDM3NCkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMzc2KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuc3RyZWFtKCkubWFwKHRhIC0+IG5ldyBMYXp5VHlwZSh2IC0+IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQodGEsIHRhKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IEVSUk9SCisgIExpbmUgMzc2KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuc3RyZWFtKCkubWFwKHRhIC0+IG5ldyBMYXp5VHlwZSh2IC0+IEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQodGEsIHRhKSkpID09PiBFUlJPUgorICBMaW5lIDM3NikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDM3NikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzNzYpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDM3NykgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh0YSwgdGEpID09PiBFUlJPUgorICBMaW5lIDM3NykgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDM3OCkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMzc5KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDM3OSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uX0o5LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb25fSjkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTJkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uX0o5LnR4dApAQCAtMCwwICsxLDEzOSBAQAorICBMaW5lIDY0KSB3cmFwcGVkTm9kZS5pc0ludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkKKyAgTGluZSA3OSkgZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNzkpIG8uZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgODMpIHdyYXBwZWROb2RlLmVxdWFscyh0aGF0LndyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDkwKSB3cmFwcGVkTm9kZS5oYXNoQ29kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzaENvZGUoKQorICBMaW5lIDEwNykgd3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDExMCkgZmllbGQuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMTExKSBmaWVsZHMuYWRkKG5ldyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbih2ZCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZChFKQorICBMaW5lIDExNikgdGhpcy5nZXRTdXBlckNsYXNzKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTE2KSB0aGlzLmdldFN1cGVyQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyQ2xhc3MoKQorICBMaW5lIDExOCkgZmllbGRzLmFkZEFsbChzdXBlcmNsYXNzLmdldEFsbEZpZWxkcygpKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIEU+KQorICBMaW5lIDExOCkgc3VwZXJjbGFzcy5nZXRBbGxGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpCisgIExpbmUgMTIwKSBnZXRJbnRlcmZhY2VzKCkuZm9yRWFjaChpbnRlcmYgLT4gaW50ZXJmLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpLmZvckVhY2goZiAtPiB7CisgICAgZmllbGRzLmFkZChmKTsKK30pKSA9PT4gamF2YS5sYW5nLkl0ZXJhYmxlLmZvckVhY2goamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyPD8gc3VwZXIgVD4pCisgIExpbmUgMTIwKSBnZXRJbnRlcmZhY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAxMjApIGludGVyZi5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKS5mb3JFYWNoKGYgLT4geworICAgIGZpZWxkcy5hZGQoZik7Cit9KSA9PT4gamF2YS5sYW5nLkl0ZXJhYmxlLmZvckVhY2goamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyPD8gc3VwZXIgVD4pCisgIExpbmUgMTIwKSBpbnRlcmYuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0QWxsRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKQorICBMaW5lIDEyMCkgaW50ZXJmLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDEyMSkgZmllbGRzLmFkZChmKSA9PT4gamF2YS51dGlsLkFycmF5TGlzdC5hZGQoRSkKKyAgTGluZSAxMzIpIGdldENvbnRleHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLmdldENvbnRleHQoKQorICBMaW5lIDEzMykgY3R4LnNvbHZlTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMzgpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTQ3KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxNDcpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxNTIpIHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKS5pc0VtcHR5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3QuaXNFbXB0eSgpCisgIExpbmUgMTUyKSB3cmFwcGVkTm9kZS5nZXRFeHRlbmRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0RXh0ZW5kZWRUeXBlcygpCisgIExpbmUgMTUzKSBvYmplY3QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLm9iamVjdCgpCisgIExpbmUgMTU1KSB0b1JlZmVyZW5jZVR5cGUod3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpLmdldCgwKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi50b1JlZmVyZW5jZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKQorICBMaW5lIDE1NSkgd3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpLmdldCgwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDE1NSkgd3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZGVkVHlwZXMoKQorICBMaW5lIDE2Mikgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDE2Mykgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDE2NCkgaW50ZXJmYWNlcy5hZGQodG9SZWZlcmVuY2VUeXBlKHQpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTY0KSB0b1JlZmVyZW5jZVR5cGUodCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi50b1JlZmVyZW5jZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKQorICBMaW5lIDE3Mykgd3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDE3NikgZGVjbGFyZWQuYWRkKG5ldyBKYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbih0aGlzLCBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE3OSkgZGVjbGFyZWQuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxODEpIEltbXV0YWJsZUxpc3Qub2YobmV3IERlZmF1bHRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKHRoaXMpKSA9PT4gamF2YS51dGlsLkxpc3Qub2YoRS4uLikKKyAgTGluZSAxODkpIHdyYXBwZWROb2RlLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDE5MCkgc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE5MCkgc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxOTApIHNvbHZlVHlwZShhbm5vdGF0aW9uRXhwci5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxOTApIHNvbHZlVHlwZShhbm5vdGF0aW9uRXhwci5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTkwKSBhbm5vdGF0aW9uRXhwci5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxOTApIGFubm90YXRpb25FeHByLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByLmdldE5hbWUoKQorICBMaW5lIDE5OSkgd3JhcHBlZE5vZGUuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgMjA0KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgMjA5KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0Q2xhc3NOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0Q2xhc3NOYW1lKCkKKyAgTGluZSAyMTQpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjE5KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuaXNBc3NpZ25hYmxlQnkob3RoZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSAyMjQpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAyMzApIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDIzMCkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAyMzApIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDIzMykgZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDIzMykgZ2V0U3VwZXJDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMjM2KSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhzdXBlcmNsYXNzLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjM2KSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjM2KSBzdXBlcmNsYXNzLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDIzOSkgc3VwZXJjbGFzcy5jYW5CZUFzc2lnbmVkVG8ob3RoZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2FuQmVBc3NpZ25lZFRvKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSAyNDQpIHRoaXMud3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDI0NSkgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDI0NikgbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDI0NykgYW5jZXN0b3IuY2FuQmVBc3NpZ25lZFRvKG90aGVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNhbkJlQXNzaWduZWRUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pCisgIExpbmUgMjYzKSB0aGlzLndyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyNjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMjYzKSB0aGlzLndyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNjQpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDI2NikgamF2YVBhcnNlclR5cGVBZGFwdGVyLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjY3KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjcxKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMjcyKSBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjcyKSBuYW1lLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMjcyKSBwcmVmaXgubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAyNzMpIG5ldyBKYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbih0aGlzLndyYXBwZWROb2RlLCB0eXBlU29sdmVyKS5zb2x2ZVR5cGUobmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjczKSBuYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQpCisgIExpbmUgMjczKSBwcmVmaXgubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAyNzYpIGdldENvbnRleHQoKS5nZXRQYXJlbnQoKS5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDI3NikgZ2V0Q29udGV4dCgpLmdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LmdldFBhcmVudCgpCisgIExpbmUgMjc2KSBnZXRDb250ZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSAyODIpIGdldFN1cGVyQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyQ2xhc3MoKQorICBMaW5lIDI4NCkgYW5jZXN0b3JzLmFkZChzdXBlcmNsYXNzKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMjg2KSB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50ZWRUeXBlcygpCisgIExpbmUgMjg3KSB3cmFwcGVkTm9kZS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0SW1wbGVtZW50ZWRUeXBlcygpCisgIExpbmUgMjg4KSB0b1JlZmVyZW5jZVR5cGUoaW1wbGVtZW50ZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24udG9SZWZlcmVuY2VUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZSkKKyAgTGluZSAyODkpIGFuY2VzdG9ycy5hZGQoYW5jZXN0b3IpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyOTgpIHdyYXBwZWROb2RlLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAzMDApIG1ldGhvZHMuYWRkKG5ldyBKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbikgbWVtYmVyLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgMzA4KSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKCh0cCkgLT4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKHRwLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gRVJST1IKKyAgTGluZSAzMDgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAoKHRwKSAtPiBuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIodHAsIHR5cGVTb2x2ZXIpKSA9PT4gRVJST1IKKyAgTGluZSAzMDgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAzMDgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMzEwKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAzMjQpIEhlbHBlci50b0FjY2Vzc0xldmVsKHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkhlbHBlci50b0FjY2Vzc0xldmVsKGphdmEudXRpbC5FbnVtU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI+KQorICBMaW5lIDMyNCkgd3JhcHBlZE5vZGUuZ2V0TW9kaWZpZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzMzMpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMzMpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMzkpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDM0MSkgcmVzLmFkZChKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pIG1lbWJlcikpID09PiBqYXZhLnV0aWwuU2V0LmFkZChFKQorICBMaW5lIDM0MSkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uKSBtZW1iZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDM0MSkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDM0OSkgamF2YVBhcnNlclR5cGVBZGFwdGVyLmNvbnRhaW5lclR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5jb250YWluZXJUeXBlKCkKKyAgTGluZSAzNTcpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDM1NykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMzU4KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzNTgpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMzYwKSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpLmdldCgpLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgMzYwKSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzNjApIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMzYyKSBzb2x2ZVR5cGUoY2xhc3NOYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzNjMpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAzNjQpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFNjb3BlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRTY29wZSgpCisgIExpbmUgMzY1KSBsb2NhbFNjb3BlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzNjYpIGxvY2FsU2NvcGUuZ2V0KCkuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMzY2KSBsb2NhbFNjb3BlLmdldCgpLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDM2NikgbG9jYWxTY29wZS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMzY2KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAzNjYpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDM2Nykgc29sdmVUeXBlKGxvY2FsTmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyQ2xhc3NEZWNsYXJhdGlvbi5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzcwKSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMzcxKSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAzNzEpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDM3MykgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzNzMpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKQorICBMaW5lIDM3NCkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAzNzQpIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDM3NikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLnN0cmVhbSgpLm1hcCh0YSAtPiBuZXcgTGF6eVR5cGUodiAtPiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHRhLCB0YSkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBFUlJPUgorICBMaW5lIDM3NikgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpLmdldCgpLnN0cmVhbSgpLm1hcCh0YSAtPiBuZXcgTGF6eVR5cGUodiAtPiBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHRhLCB0YSkpKSA9PT4gRVJST1IKKyAgTGluZSAzNzYpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAzNzYpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMzc2KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAzNzcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQodGEsIHRhKSA9PT4gRVJST1IKKyAgTGluZSAzNzcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzNzgpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDM3OSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAzNzkpIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJiZjNlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxNSBAQAorICBMaW5lIDQ4KSB0aGlzLndyYXBwZWROb2RlLmdldFBhcmFtZXRlcnMoKS5zaXplKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Quc2l6ZSgpCisgIExpbmUgNDgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2FsbGFibGVEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA1MykgZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA1NCkgU3RyaW5nLmZvcm1hdCgiTm8gcGFyYW0gd2l0aCBpbmRleCAlZC4gTnVtYmVyIG9mIHBhcmFtczogJWQiLCBpLCBnZXROdW1iZXJPZlBhcmFtcygpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSA1NCkgZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA1Nikgd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpLmdldChpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDU2KSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDYxKSB0aGlzLmNsYXNzRGVjbGFyYXRpb24uZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA3NSkgSGVscGVyLnRvQWNjZXNzTGV2ZWwod3JhcHBlZE5vZGUuZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLnRvQWNjZXNzTGV2ZWwoamF2YS51dGlsLkVudW1TZXQ8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcj4pCisgIExpbmUgNzUpIHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2FsbGFibGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDgwKSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKChhc3RUcCkgLT4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKGFzdFRwLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gRVJST1IKKyAgTGluZSA4MCkgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCgoYXN0VHApIC0+IG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcihhc3RUcCwgdHlwZVNvbHZlcikpID09PiBFUlJPUgorICBMaW5lIDgwKSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgODApIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDgwKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckVudW1Db25zdGFudERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckVudW1Db25zdGFudERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I5MTMyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyRW51bUNvbnN0YW50RGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMyBAQAorICBMaW5lIDQyKSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0Nykgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNDcpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldE5hbWUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiYjM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw3MSBAQAorICBMaW5lIDY5KSB3cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgNzEpIG1ldGhvZHMuYWRkKG5ldyBKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbikgbWVtYmVyLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgNzgpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgODMpIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDgzKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTA5KSBvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDkpIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDEwOSkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDExMikgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhFbnVtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTEyKSBvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMTIpIEVudW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTE2KSBvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKENvbXBhcmFibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTYpIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDExNikgQ29tcGFyYWJsZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMTkpIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoU2VyaWFsaXphYmxlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTE5KSBvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMTkpIFNlcmlhbGl6YWJsZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMjIpIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTIyKSBvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMjIpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNDApIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRQYWNrYWdlTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFBhY2thZ2VOYW1lKCkKKyAgTGluZSAxNDUpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRDbGFzc05hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRDbGFzc05hbWUoKQorICBMaW5lIDE1MCkgamF2YVBhcnNlclR5cGVBZGFwdGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxNTUpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeShvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDE2MCkgamF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE3MSkgZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTcxKSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE3NSkgd3JhcHBlZE5vZGUuZXF1YWxzKHRoYXQud3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTgyKSB3cmFwcGVkTm9kZS5oYXNoQ29kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzaENvZGUoKQorICBMaW5lIDE4NykgbmFtZS5lcXVhbHMoInZhbHVlcyIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE4NykgcGFyYW1ldGVyVHlwZXMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAxODgpIE9wdGlvbmFsLm9mKG5ldyBWYWx1ZXNNZXRob2QodGhpcywgdHlwZVNvbHZlcikuZ2V0VXNhZ2UobnVsbCkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAxODgpIG5ldyBWYWx1ZXNNZXRob2QodGhpcywgdHlwZVNvbHZlcikuZ2V0VXNhZ2UobnVsbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uLlZhbHVlc01ldGhvZC5nZXRVc2FnZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTkxKSBnZXRDb250ZXh0KCkuc29sdmVNZXRob2RBc1VzYWdlKG5hbWUsIHBhcmFtZXRlclR5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZEFzVXNhZ2UoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxOTEpIGdldENvbnRleHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24uZ2V0Q29udGV4dCgpCisgIExpbmUgMTk3KSB0aGlzLndyYXBwZWROb2RlLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAxOTgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDIwMSkgZmllbGQuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMjAyKSBmaWVsZHMuYWRkKG5ldyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbih2ZCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZChFKQorICBMaW5lIDIwOCkgdGhpcy53cmFwcGVkTm9kZS5nZXRFbnRyaWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb24uZ2V0RW50cmllcygpCisgIExpbmUgMjA5KSB0aGlzLndyYXBwZWROb2RlLmdldEVudHJpZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbi5nZXRFbnRyaWVzKCkKKyAgTGluZSAyMTApIGZpZWxkcy5hZGQobmV3IEphdmFQYXJzZXJGaWVsZERlY2xhcmF0aW9uKG1lbWJlciwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZChFKQorICBMaW5lIDIyMCkgUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKEVudW0uY2xhc3MsIHR5cGVTb2x2ZXIpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDIyMCkgUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKEVudW0uY2xhc3MsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoamF2YS5sYW5nLnJlZmxlY3QuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjIxKSBlbnVtQ2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKS5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMjIxKSBlbnVtQ2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyMjEpIGVudW1DbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAyMjIpIGVudW1DbGFzcy5kZXJpdmVUeXBlUGFyYW1ldGVycyhuZXcgVHlwZVBhcmFtZXRlcnNNYXAuQnVpbGRlcigpLnNldFZhbHVlKGVUeXBlUGFyYW1ldGVyLCBuZXcgUmVmZXJlbmNlVHlwZUltcGwodGhpcywgdHlwZVNvbHZlcikpLmJ1aWxkKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5kZXJpdmVUeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwKQorICBMaW5lIDIyMikgbmV3IFR5cGVQYXJhbWV0ZXJzTWFwLkJ1aWxkZXIoKS5zZXRWYWx1ZShlVHlwZVBhcmFtZXRlciwgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHRoaXMsIHR5cGVTb2x2ZXIpKS5idWlsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLkJ1aWxkZXIuYnVpbGQoKQorICBMaW5lIDIyMikgbmV3IFR5cGVQYXJhbWV0ZXJzTWFwLkJ1aWxkZXIoKS5zZXRWYWx1ZShlVHlwZVBhcmFtZXRlciwgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHRoaXMsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyc01hcC5CdWlsZGVyLnNldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjIzKSBhbmNlc3RvcnMuYWRkKGVudW1DbGFzcykgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDIyNCkgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDIyNSkgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDIyNikgbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVR5cGVJblR5cGUodGhpcywgaW1wbGVtZW50ZWRUeXBlLmdldE5hbWUoKS5nZXRJZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVR5cGVJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIyNikgaW1wbGVtZW50ZWRUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDIyNikgaW1wbGVtZW50ZWRUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDIyNykgaW1wbGVtZW50ZWREZWNsUmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDIyOCkgaW1wbGVtZW50ZWRUeXBlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDIyOCkgaW1wbGVtZW50ZWRUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDIzMCkgYW5jZXN0b3JzLmFkZChuZXcgUmVmZXJlbmNlVHlwZUltcGwoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgaW1wbGVtZW50ZWREZWNsUmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDIzMCkgaW1wbGVtZW50ZWREZWNsUmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMjM4KSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCisgIExpbmUgMzExKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCisgIExpbmUgMzE2KSBIZWxwZXIudG9BY2Nlc3NMZXZlbChlbnVtRGVjbGFyYXRpb24uZ2V0V3JhcHBlZE5vZGUoKS5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIudG9BY2Nlc3NMZXZlbChqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSAzMTYpIGVudW1EZWNsYXJhdGlvbi5nZXRXcmFwcGVkTm9kZSgpLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMzE2KSBlbnVtRGVjbGFyYXRpb24uZ2V0V3JhcHBlZE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24uZ2V0V3JhcHBlZE5vZGUoKQorICBMaW5lIDMyOCkgdGhpcy53cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgMzMwKSByZXMuYWRkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbikgbWVtYmVyKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgMzMwKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24pIG1lbWJlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb248Pz4pCisgIExpbmUgMzMwKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzM4KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmNvbnRhaW5lclR5cGUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJGaWVsZERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJmZTBjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwyMyBAQAorICBMaW5lIDUxKSBnZXRQYXJlbnROb2RlKHZhcmlhYmxlRGVjbGFyYXRvcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNTIpIGdldFBhcmVudE5vZGUodmFyaWFibGVEZWNsYXJhdG9yKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDUyKSBnZXRQYXJlbnROb2RlKHZhcmlhYmxlRGVjbGFyYXRvcikuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgNTIpIGdldFBhcmVudE5vZGUodmFyaWFibGVEZWNsYXJhdG9yKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA1NCkgZ2V0UGFyZW50Tm9kZSh2YXJpYWJsZURlY2xhcmF0b3IpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY4KSBnZXRQYXJlbnROb2RlKGVudW1Db25zdGFudERlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA3MSkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh2YXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDcxKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzEpIHZhcmlhYmxlRGVjbGFyYXRvci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpCisgIExpbmUgNzkpIGVudW1Db25zdGFudERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDc5KSBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA4MSkgdmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDgxKSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWUoKQorICBMaW5lIDg3KSB3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5TVEFUSUMpID09PiBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODcpIHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDEwNikgZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckZpZWxkRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTExKSBIZWxwZXIudG9BY2Nlc3NMZXZlbCh3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIudG9BY2Nlc3NMZXZlbChqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSAxMTEpIHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQorICBMaW5lIDExNikgTmF2aWdhdG9yLmZpbmRBbmNlc3Rvcih3cmFwcGVkTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZmluZEFuY2VzdG9yKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgamF2YS5sYW5nLkNsYXNzPE4+KQorICBMaW5lIDExNykgdHlwZURlY2xhcmF0aW9uLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMTgpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24uZ2V0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDExOCkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDExOCkgdHlwZURlY2xhcmF0aW9uLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmExNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMTIwIEBACisgIExpbmUgNTIpIHdyYXBwZWROb2RlLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uaXNJbnRlcmZhY2UoKQorICBMaW5lIDYzKSB3cmFwcGVkTm9kZS5nZXRNZW1iZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpCisgIExpbmUgNjUpIG1ldGhvZHMuYWRkKG5ldyBKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbikgbWVtYmVyLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgNzIpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgODIpIGdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDgyKSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDg2KSB3cmFwcGVkTm9kZS5lcXVhbHModGhhdC53cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA5Mykgd3JhcHBlZE5vZGUuaGFzaENvZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmhhc2hDb2RlKCkKKyAgTGluZSA5OCkgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgOTgpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxMDgpIHdyYXBwZWROb2RlLmdldEFubm90YXRpb25zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKQorICBMaW5lIDEwOSkgc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwOSkgc29sdmVUeXBlKGFubm90YXRpb25FeHByLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMDkpIHNvbHZlVHlwZShhbm5vdGF0aW9uRXhwci5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMDkpIHNvbHZlVHlwZShhbm5vdGF0aW9uRXhwci5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24uc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEwOSkgYW5ub3RhdGlvbkV4cHIuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTA5KSBhbm5vdGF0aW9uRXhwci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwci5nZXROYW1lKCkKKyAgTGluZSAxMjQpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAxMjUpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAxMjYpIGludGVyZmFjZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChzb2x2ZVR5cGUodC5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuYXNJbnRlcmZhY2UoKSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxMjYpIHNvbHZlVHlwZSh0LmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc0ludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNJbnRlcmZhY2UoKQorICBMaW5lIDEyNikgc29sdmVUeXBlKHQuZ2V0TmFtZSgpLmdldElkKCksIHR5cGVTb2x2ZXIpLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTI2KSBzb2x2ZVR5cGUodC5nZXROYW1lKCkuZ2V0SWQoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24uc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEyNikgdC5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxMjYpIHQuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMTM0KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgMTM5KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0Q2xhc3NOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0Q2xhc3NOYW1lKCkKKyAgTGluZSAxNDQpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTQ5KSBqYXZhUGFyc2VyVHlwZUFkYXB0ZXIuaXNBc3NpZ25hYmxlQnkob3RoZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSAxNTQpIGphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNjApIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE2MCkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTYwKSBvdGhlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxNjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZGVkVHlwZXMoKQorICBMaW5lIDE2NCkgd3JhcHBlZE5vZGUuZ2V0RXh0ZW5kZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEV4dGVuZGVkVHlwZXMoKQorICBMaW5lIDE2NSkgbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlKQorICBMaW5lIDE2NikgYW5jZXN0b3IuY2FuQmVBc3NpZ25lZFRvKG90aGVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNhbkJlQXNzaWduZWRUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pCisgIExpbmUgMTcyKSB0aGlzLndyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAxNzMpIHdyYXBwZWROb2RlLmdldEltcGxlbWVudGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkKKyAgTGluZSAxNzQpIG5ldyBTeW1ib2xTb2x2ZXIodHlwZVNvbHZlcikuc29sdmVUeXBlKHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSkKKyAgTGluZSAxNzUpIGFuY2VzdG9yLmNhbkJlQXNzaWduZWRUbyhvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jYW5CZUFzc2lnbmVkVG8oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDE5Mikgd3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKQorICBMaW5lIDE5NSkgZmllbGQuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpCisgIExpbmUgMTk2KSBmaWVsZHMuYWRkKG5ldyBKYXZhUGFyc2VyRmllbGREZWNsYXJhdGlvbih2ZCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZChFKQorICBMaW5lIDIwMSkgZ2V0QW5jZXN0b3JzKCkuZm9yRWFjaChhIC0+IHsKKyAgICBpZiAoYS5nZXRUeXBlRGVjbGFyYXRpb24oKSAhPSB0aGlzKSB7CisgICAgICAgIGZpZWxkcy5hZGRBbGwoYS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKSk7CisgICAgfQorfSkgPT0+IGphdmEubGFuZy5JdGVyYWJsZS5mb3JFYWNoKGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjw/IHN1cGVyIFQ+KQorICBMaW5lIDIwMSkgZ2V0QW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkKKyAgTGluZSAyMDIpIGEuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMjAzKSBmaWVsZHMuYWRkQWxsKGEuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0QWxsRmllbGRzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMjAzKSBhLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEFsbEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkKKyAgTGluZSAyMDMpIGEuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMjIwKSB0aGlzLndyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMjApIHRoaXMud3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMjIwKSB0aGlzLndyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMjEpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDIyMykgamF2YVBhcnNlclR5cGVBZGFwdGVyLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlQWRhcHRlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjI0KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjI4KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMjI5KSBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjI5KSBuYW1lLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMjI5KSBwcmVmaXgubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAyMzApIG5ldyBKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24odGhpcy53cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyMzApIG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCkKKyAgTGluZSAyMzApIHByZWZpeC5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDIzMykgZ2V0Q29udGV4dCgpLmdldFBhcmVudCgpLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjMzKSBnZXRDb250ZXh0KCkuZ2V0UGFyZW50KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuZ2V0UGFyZW50KCkKKyAgTGluZSAyMzMpIGdldENvbnRleHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSAyMzkpIHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRFeHRlbmRlZFR5cGVzKCkKKyAgTGluZSAyNDApIHdyYXBwZWROb2RlLmdldEV4dGVuZGVkVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRFeHRlbmRlZFR5cGVzKCkKKyAgTGluZSAyNDEpIGFuY2VzdG9ycy5hZGQodG9SZWZlcmVuY2VUeXBlKGV4dGVuZGVkKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI0MSkgdG9SZWZlcmVuY2VUeXBlKGV4dGVuZGVkKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi50b1JlZmVyZW5jZVR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlKQorICBMaW5lIDI0NCkgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDI0NSkgd3JhcHBlZE5vZGUuZ2V0SW1wbGVtZW50ZWRUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmdldEltcGxlbWVudGVkVHlwZXMoKQorICBMaW5lIDI0NikgYW5jZXN0b3JzLmFkZCh0b1JlZmVyZW5jZVR5cGUoaW1wbGVtZW50ZWQpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMjQ2KSB0b1JlZmVyZW5jZVR5cGUoaW1wbGVtZW50ZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uLnRvUmVmZXJlbmNlVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUpCisgIExpbmUgMjU0KSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDI1NSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICBMaW5lIDI1NykgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCgodHApIC0+IG5ldyBKYXZhUGFyc2VyVHlwZVBhcmFtZXRlcih0cCwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IEVSUk9SCisgIExpbmUgMjU3KSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKCh0cCkgLT4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKHRwLCB0eXBlU29sdmVyKSkgPT0+IEVSUk9SCisgIExpbmUgMjU3KSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjU3KSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDI1OSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjc0KSBIZWxwZXIudG9BY2Nlc3NMZXZlbCh3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIudG9BY2Nlc3NMZXZlbChqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSAyNzQpIHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpCisgIExpbmUgMjgwKSB0aGlzLndyYXBwZWROb2RlLmdldE1lbWJlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkKKyAgTGluZSAyODIpIHJlcy5hZGQoSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuZ2V0VHlwZURlY2xhcmF0aW9uKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uKSBtZW1iZXIpKSA9PT4gamF2YS51dGlsLlNldC5hZGQoRSkKKyAgTGluZSAyODIpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbikgbWVtYmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PikKKyAgTGluZSAyODIpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyOTApIGphdmFQYXJzZXJUeXBlQWRhcHRlci5jb250YWluZXJUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuY29udGFpbmVyVHlwZSgpCisgIExpbmUgMjk5KSBjbGFzc09ySW50ZXJmYWNlVHlwZS50b1N0cmluZygpLmluZGV4T2YoJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5pbmRleE9mKGludCkKKyAgTGluZSAyOTkpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLnRvU3RyaW5nKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS50b1N0cmluZygpCisgIExpbmUgMzAwKSB0eXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGNsYXNzT3JJbnRlcmZhY2VUeXBlLnRvU3RyaW5nKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMwMCkgY2xhc3NPckludGVyZmFjZVR5cGUudG9TdHJpbmcoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLnRvU3RyaW5nKCkKKyAgTGluZSAzMDIpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAzMDMpIHNvbHZlVHlwZShjbGFzc09ySW50ZXJmYWNlVHlwZS50b1N0cmluZygpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzAzKSBjbGFzc09ySW50ZXJmYWNlVHlwZS50b1N0cmluZygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUudG9TdHJpbmcoKQorICBMaW5lIDMwNSkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDMwNikgc29sdmVUeXBlKGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKS5nZXRJZCgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzA2KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAzMDYpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldE5hbWUoKQorICBMaW5lIDMwOCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDMwOSkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMzA5KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXROYW1lKCkKKyAgTGluZSAzMTEpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMzExKSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAzMTIpIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMzEyKSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAzMTQpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5zdHJlYW0oKS5tYXAodGEgLT4gbmV3IExhenlUeXBlKHYgLT4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh0YSwgdGEpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gRVJST1IKKyAgTGluZSAzMTQpIGNsYXNzT3JJbnRlcmZhY2VUeXBlLmdldFR5cGVBcmd1bWVudHMoKS5nZXQoKS5zdHJlYW0oKS5tYXAodGEgLT4gbmV3IExhenlUeXBlKHYgLT4gSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh0YSwgdGEpKSkgPT0+IEVSUk9SCisgIExpbmUgMzE0KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMzE0KSBjbGFzc09ySW50ZXJmYWNlVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDMxNCkgY2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMzE1KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHRhLCB0YSkgPT0+IEVSUk9SCisgIExpbmUgMzE1KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzE2KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAzMTcpIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMzE3KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZhNTZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMzAgQEAKKyAgTGluZSA1OCkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgNTkpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDYyKSBKYXZhUGFyc2VyRmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjIpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY4KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHdyYXBwZWROb2RlLmdldFR5cGUoKSwgZ2V0Q29udGV4dCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDY4KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjgpIHdyYXBwZWROb2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDY4KSBnZXRDb250ZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24uZ2V0Q29udGV4dCgpCisgIExpbmUgNzMpIHdyYXBwZWROb2RlLmdldFBhcmFtZXRlcnMoKS5zaXplKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Quc2l6ZSgpCisgIExpbmUgNzMpIHdyYXBwZWROb2RlLmdldFBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpCisgIExpbmUgNzgpIGdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKQorICBMaW5lIDc5KSBTdHJpbmcuZm9ybWF0KCJObyBwYXJhbSB3aXRoIGluZGV4ICVkLiBOdW1iZXIgb2YgcGFyYW1zOiAlZCIsIGksIGdldE51bWJlck9mUGFyYW1zKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDc5KSBnZXROdW1iZXJPZlBhcmFtcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA4MSkgd3JhcHBlZE5vZGUuZ2V0UGFyYW1ldGVycygpLmdldChpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5nZXQoaW50KQorICBMaW5lIDgxKSB3cmFwcGVkTm9kZS5nZXRQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DYWxsYWJsZURlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDg5KSBuZXcgTWV0aG9kRGVjbGFyYXRpb25Db21tb25Mb2dpYyh0aGlzLCB0eXBlU29sdmVyKS5yZXNvbHZlVHlwZVZhcmlhYmxlcyhjb250ZXh0LCBwYXJhbWV0ZXJUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuZGVjbGFyYXRpb25zLmNvbW1vbi5NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA5MykgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dCh3cmFwcGVkTm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5OCkgd3JhcHBlZE5vZGUuZ2V0Qm9keSgpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA5OCkgd3JhcHBlZE5vZGUuZ2V0Qm9keSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpCisgIExpbmUgMTAzKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSAxMDMpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTIzKSB0aGlzLndyYXBwZWROb2RlLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKChhc3RUcCkgLT4gbmV3IEphdmFQYXJzZXJUeXBlUGFyYW1ldGVyKGFzdFRwLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gRVJST1IKKyAgTGluZSAxMjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAoKGFzdFRwKSAtPiBuZXcgSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIoYXN0VHAsIHR5cGVTb2x2ZXIpKSA9PT4gRVJST1IKKyAgTGluZSAxMjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMjMpIHRoaXMud3JhcHBlZE5vZGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNhbGxhYmxlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDEyMykgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTI4KSB3cmFwcGVkTm9kZS5pc0RlZmF1bHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uLmlzRGVmYXVsdCgpCisgIExpbmUgMTMzKSB3cmFwcGVkTm9kZS5pc1N0YXRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5tb2RpZmllcnMuTm9kZVdpdGhTdGF0aWNNb2RpZmllci5pc1N0YXRpYygpCisgIExpbmUgMTQ3KSBIZWxwZXIudG9BY2Nlc3NMZXZlbCh3cmFwcGVkTm9kZS5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIudG9BY2Nlc3NMZXZlbChqYXZhLnV0aWwuRW51bVNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyPikKKyAgTGluZSAxNDcpIHdyYXBwZWROb2RlLmdldE1vZGlmaWVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2FsbGFibGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyUGFyYW1ldGVyRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyUGFyYW1ldGVyRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDZkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJQYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw3IEBACisgIExpbmUgNDEpIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDQxKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0TmFtZSgpCisgIExpbmUgNTYpIHdyYXBwZWROb2RlLmlzVmFyQXJncygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLmlzVmFyQXJncygpCisgIExpbmUgNjYpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnQod3JhcHBlZE5vZGUuZ2V0VHlwZSgpLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjYpIHdyYXBwZWROb2RlLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRUeXBlKCkKKyAgTGluZSA2NykgaXNWYXJpYWRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclBhcmFtZXRlckRlY2xhcmF0aW9uLmlzVmFyaWFkaWMoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzUwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw0NiBAQAorICBMaW5lIDY3KSB2YXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNjcpIHZhcmlhYmxlRGVjbGFyYXRvci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0TmFtZSgpCisgIExpbmUgNzIpIGdldFBhcmVudE5vZGUocGFyYW1ldGVyKS5nZXRDaGlsZE5vZGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5nZXRDaGlsZE5vZGVzKCkKKyAgTGluZSA3MikgZ2V0UGFyZW50Tm9kZShwYXJhbWV0ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDgzKSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDg0KSBnZXRQYXJlbnROb2RlKG5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDg1KSBjYWxsLmdldEFyZ3VtZW50cygpLnNpemUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5zaXplKCkKKyAgTGluZSA4NSkgY2FsbC5nZXRBcmd1bWVudHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50cygpCisgIExpbmUgODYpIGNhbGwuZ2V0QXJndW1lbnRzKCkuZ2V0KGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0LmdldChpbnQpCisgIExpbmUgODYpIGNhbGwuZ2V0QXJndW1lbnRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudHMoKQorICBMaW5lIDEyNikgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTI3KSBnZXRQYXJhbVBvcyhwYXJhbWV0ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmdldFBhcmFtUG9zKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIpCisgIExpbmUgMTI4KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5nZXRUeXBlKGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjgpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMjgpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDEzMykgd3JhcHBlZE5vZGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMzMpIHdyYXBwZWROb2RlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDEzNikgcGFyYW1ldGVyLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlci5nZXRUeXBlKCkKKyAgTGluZSAxMzcpIFByaW1pdGl2ZVR5cGUuYnlOYW1lKCgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUpIHBhcmFtZXRlci5nZXRUeXBlKCkpLmdldFR5cGUoKS5uYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUHJpbWl0aXZlVHlwZS5ieU5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzcpICgoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUpIHBhcmFtZXRlci5nZXRUeXBlKCkpLmdldFR5cGUoKS5uYW1lKCkgPT0+IGphdmEubGFuZy5FbnVtLm5hbWUoKQorICBMaW5lIDEzNykgKChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZSkgcGFyYW1ldGVyLmdldFR5cGUoKSkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZS5nZXRUeXBlKCkKKyAgTGluZSAxMzcpIHBhcmFtZXRlci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0VHlwZSgpCisgIExpbmUgMTM5KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0VG9Vc2FnZShwYXJhbWV0ZXIuZ2V0VHlwZSgpLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMzkpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMzkpIHBhcmFtZXRlci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuZ2V0VHlwZSgpCisgIExpbmUgMTQxKSBwYXJhbWV0ZXIuaXNWYXJBcmdzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXIuaXNWYXJBcmdzKCkKKyAgTGluZSAxNDkpIGdldFBhcmVudE5vZGUod3JhcHBlZE5vZGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmdldFBhcmVudE5vZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDE1MCkgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikuY29udmVydCh2YXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpLCBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSAxNTApIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNTApIHZhcmlhYmxlRGVjbGFyYXRvci5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3IuZ2V0VHlwZSgpCisgIExpbmUgMTUwKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHdyYXBwZWROb2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE1MikgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlci5OYXZpZ2F0b3IuZ2V0UGFyZW50Tm9kZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUpCisgIExpbmUgMTUzKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKS5jb252ZXJ0KHZhcmlhYmxlRGVjbGFyYXRvci5nZXRUeXBlKCksIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5jb252ZXJ0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDE1MykgSmF2YVBhcnNlckZhY2FkZS5nZXQodHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE1MykgdmFyaWFibGVEZWNsYXJhdG9yLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvci5nZXRUeXBlKCkKKyAgTGluZSAxNTMpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTU1KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE1NSkgZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTU1KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNTgpIHdyYXBwZWROb2RlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTU4KSB3cmFwcGVkTm9kZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNjQpIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNjQpIHRoaXMuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTY0KSB0aGlzLmdldFdyYXBwZWROb2RlKCkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNjQpIHRoaXMuZ2V0V3JhcHBlZE5vZGUoKS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNjQpIHRoaXMuZ2V0V3JhcHBlZE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5nZXRXcmFwcGVkTm9kZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJUeXBlQWRhcHRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRpb25zX0phdmFQYXJzZXJUeXBlQWRhcHRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkYTFkYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlclR5cGVBZGFwdGVyLnR4dApAQCAtMCwwICsxLDQ4IEBACisgIExpbmUgMzkpIEhlbHBlci5nZXRQYWNrYWdlTmFtZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuZ2V0UGFja2FnZU5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQzKSBIZWxwZXIuZ2V0Q2xhc3NOYW1lKCIiLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuZ2V0Q2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0NykgSGVscGVyLmNvbnRhaW5lck5hbWUoZ2V0UGFyZW50Tm9kZSh3cmFwcGVkTm9kZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSGVscGVyLmNvbnRhaW5lck5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDQ3KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0OCkgY29udGFpbmVyTmFtZS5pc0VtcHR5KCkgPT0+IGphdmEubGFuZy5TdHJpbmcuaXNFbXB0eSgpCisgIExpbmUgNDkpIHdyYXBwZWROb2RlLmdldE5hbWUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aElkZW50aWZpZXIuZ2V0SWQoKQorICBMaW5lIDQ5KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoU2ltcGxlTmFtZS5nZXROYW1lKCkKKyAgTGluZSA1MSkgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgNTEpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhTaW1wbGVOYW1lLmdldE5hbWUoKQorICBMaW5lIDU2KSBvdGhlci5nZXRBbGxBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpCisgIExpbmUgNTcpIGFuY2VzdG9yc09mT3RoZXIuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChvdGhlciwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1OSkgYW5jZXN0b3JPZk90aGVyLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU5KSBhbmNlc3Rvck9mT3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA1OSkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZUFkYXB0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNjcpIHR5cGUuaXNOdWxsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzTnVsbCgpCisgIExpbmUgNzApIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNzEpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKHR5cGUuZGVzY3JpYmUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDcxKSB0eXBlLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSA3MikgaXNBc3NpZ25hYmxlQnkob3RoZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVBZGFwdGVyLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSA3OSkgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA4MCkgdGhpcy53cmFwcGVkTm9kZS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVQYXJhbWV0ZXJzLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA4MSkgdHlwZVBhcmFtZXRlci5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODEpIHR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgODEpIHR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSA4MikgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uKHR5cGVQYXJhbWV0ZXIsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgODgpIHRoaXMud3JhcHBlZE5vZGUuZ2V0TWVtYmVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1lbWJlcnMuZ2V0TWVtYmVycygpCisgIExpbmUgOTEpIGludGVybmFsVHlwZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgOTIpIGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTIpIGludGVybmFsVHlwZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA5MikgaW50ZXJuYWxUeXBlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA5NCkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIGludGVybmFsVHlwZSwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA5NikgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbikgaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDEwMCkgbmFtZS5zdGFydHNXaXRoKHByZWZpeCkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwMCkgbmFtZS5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDEwMCkgcHJlZml4Lmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMTAyKSBuZXcgSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24oKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIGludGVybmFsVHlwZSwgdHlwZVNvbHZlcikuc29sdmVUeXBlKG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEwMikgbmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50KQorICBMaW5lIDEwMikgcHJlZml4Lmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMTA0KSBuZXcgU3ltYm9sU29sdmVyKHR5cGVTb2x2ZXIpLnNvbHZlVHlwZUluVHlwZShuZXcgSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbigoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbikgaW50ZXJuYWxUeXBlLCB0eXBlU29sdmVyKSwgbmFtZS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVUeXBlSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDQpIG5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCkKKyAgTGluZSAxMDQpIHByZWZpeC5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDExMSkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFR5cGVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSAxMTUpIHdyYXBwZWROb2RlLmdldFBhcmVudE5vZGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmdldFBhcmVudE5vZGUoKQorICBMaW5lIDExNikgcGFyZW50LmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMTcpIE9wdGlvbmFsLm9mKEphdmFQYXJzZXJGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKHBhcmVudC5nZXQoKSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAxMTcpIEphdmFQYXJzZXJGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKHBhcmVudC5nZXQoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTE3KSBwYXJlbnQuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDExOCkgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyVHlwZVBhcmFtZXRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2NDU0YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIudHh0CkBAIC0wLDAgKzEsNDUgQEAKKyAgTGluZSA1NikgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5U2V0KCkKKyAgTGluZSA2MCkgZ2V0Q29udGV4dCgpLnNvbHZlTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBmYWxzZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MCkgZ2V0Q29udGV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIuZ2V0Q29udGV4dCgpCisgIExpbmUgNzApIHdyYXBwZWROb2RlLmVxdWFscyh0aGF0LndyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc3KSB3cmFwcGVkTm9kZS5oYXNoQ29kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuaGFzaENvZGUoKQorICBMaW5lIDc4KSB0eXBlU29sdmVyLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDg0KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA4NCkgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSA4OSkgaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG90aGVyLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVBhcmFtZXRlci5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA5NCkgZ2V0Q29udGFpbmVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVBhcmFtZXRlci5nZXRDb250YWluZXIoKQorICBMaW5lIDk2KSAoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA5OCkgKChKYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpCisgIExpbmUgMTAwKSAoKEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpCisgIExpbmUgMTA2KSBnZXRDb250YWluZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlUGFyYW1ldGVyLmdldENvbnRhaW5lcigpCisgIExpbmUgMTA4KSAoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0SWQoKQorICBMaW5lIDExMCkgKChKYXZhUGFyc2VyQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpCisgIExpbmUgMTEyKSAoKEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpCisgIExpbmUgMTE4KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxMjEpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbihqcFR5cGVEZWNsYXJhdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pCisgIExpbmUgMTIxKSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTI0KSBqcENvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JPZlR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlLmdldEFuY2VzdG9yT2ZUeXBlKGphdmEubGFuZy5DbGFzczxOPikKKyAgTGluZSAxMjUpIGpwVHlwZURlY2xhcmF0aW9uLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMjYpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmdldFR5cGVEZWNsYXJhdGlvbihqcFR5cGVEZWNsYXJhdGlvbi5nZXQoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0VHlwZURlY2xhcmF0aW9uKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pCisgIExpbmUgMTI2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTI2KSBqcFR5cGVEZWNsYXJhdGlvbi5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTI3KSB0eXBlRGVjbGFyYXRpb24uaXNDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaXNDbGFzcygpCisgIExpbmUgMTI4KSB0eXBlRGVjbGFyYXRpb24uYXNDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uYXNDbGFzcygpCisgIExpbmUgMTQwKSBTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIGdldENvbnRhaW5lclF1YWxpZmllZE5hbWUoKSwgZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxNDApIGdldENvbnRhaW5lclF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlUGFyYW1ldGVyLmdldENvbnRhaW5lclF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE0MCkgZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpCisgIExpbmUgMTQ1KSB3cmFwcGVkTm9kZS5nZXRUeXBlQm91bmQoKS5zdHJlYW0oKS5tYXAoKGFzdEIpIC0+IHRvQm91bmQoYXN0QiwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IEVSUk9SCisgIExpbmUgMTQ1KSB3cmFwcGVkTm9kZS5nZXRUeXBlQm91bmQoKS5zdHJlYW0oKS5tYXAoKGFzdEIpIC0+IHRvQm91bmQoYXN0QiwgdHlwZVNvbHZlcikpID09PiBFUlJPUgorICBMaW5lIDE0NSkgd3JhcHBlZE5vZGUuZ2V0VHlwZUJvdW5kKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTQ1KSB3cmFwcGVkTm9kZS5nZXRUeXBlQm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0VHlwZUJvdW5kKCkKKyAgTGluZSAxNDUpIHRvQm91bmQoYXN0QiwgdHlwZVNvbHZlcikgPT0+IEVSUk9SCisgIExpbmUgMTQ1KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxNDkpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpLmNvbnZlcnRUb1VzYWdlKGNsYXNzT3JJbnRlcmZhY2VUeXBlLCBjbGFzc09ySW50ZXJmYWNlVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuY29udmVydFRvVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSAxNDkpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNTApIEJvdW5kLmV4dGVuZHNCb3VuZCh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kLmV4dGVuZHNCb3VuZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxOTkpIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgTGluZSAyMTMpIHdyYXBwZWROb2RlLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpCisgIExpbmUgMjEzKSB3cmFwcGVkTm9kZS5nZXRUeXBlQm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGVQYXJhbWV0ZXIuZ2V0VHlwZUJvdW5kKCkKKyAgTGluZSAyMTgpIGdldENvbnRhaW5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVQYXJhbWV0ZXIuZ2V0Q29udGFpbmVyKCkKKyAgTGluZSAyMjApIE9wdGlvbmFsLm9mKChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pIGNvbnRhaW5lcikgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDIyMikgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdGlvbnNfSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDJjY2JjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0aW9uc19KYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMTMgQEAKKyAgTGluZSA1NCkgaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG90aGVyLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyVHlwZVZhcmlhYmxlRGVjbGFyYXRpb24uaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTkpIEhlbHBlci5nZXRQYWNrYWdlTmFtZSh3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuZ2V0UGFja2FnZU5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlKQorICBMaW5lIDY0KSBIZWxwZXIuZ2V0Q2xhc3NOYW1lKCIiLCB3cmFwcGVkTm9kZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5IZWxwZXIuZ2V0Q2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA2OSkgZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc5KSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDkzKSB0eXBlLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSA5NCkgdHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTI3KSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlTZXQoKQorICBMaW5lIDEzMikgd3JhcHBlZE5vZGUuZ2V0TmFtZSgpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSWRlbnRpZmllci5nZXRJZCgpCisgIExpbmUgMTMyKSB3cmFwcGVkTm9kZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDE2NykgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICBMaW5lIDE4NSkgYXNUeXBlUGFyYW1ldGVyKCkuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uY29udGFpbmVyVHlwZSgpCisgIExpbmUgMTg1KSBhc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJUeXBlVmFyaWFibGVEZWNsYXJhdGlvbi5hc1R5cGVQYXJhbWV0ZXIoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX0Fic3RyYWN0U3ltYm9sRGVjbGFyYXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRvcnNfQWJzdHJhY3RTeW1ib2xEZWNsYXJhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX0Fic3RyYWN0U3ltYm9sRGVjbGFyYXRvci50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdG9yc19GaWVsZFN5bWJvbERlY2xhcmF0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX0ZpZWxkU3ltYm9sRGVjbGFyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwZjEzMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdG9yc19GaWVsZFN5bWJvbERlY2xhcmF0b3IudHh0CkBAIC0wLDAgKzEsMyBAQAorICBMaW5lIDQwKSB3cmFwcGVkTm9kZS5nZXRWYXJpYWJsZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkKKyAgTGluZSA0MSkgc3ltYm9scy5hZGQoSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmZpZWxkKHYsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNDEpIEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5maWVsZCh2LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5maWVsZChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdG9yc19Ob1N5bWJvbERlY2xhcmF0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX05vU3ltYm9sRGVjbGFyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0NjBkMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdG9yc19Ob1N5bWJvbERlY2xhcmF0b3IudHh0CkBAIC0wLDAgKzEgQEAKKyAgTGluZSAzNykgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX1BhcmFtZXRlclN5bWJvbERlY2xhcmF0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX1BhcmFtZXRlclN5bWJvbERlY2xhcmF0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGZjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhcGFyc2VybW9kZWxfZGVjbGFyYXRvcnNfUGFyYW1ldGVyU3ltYm9sRGVjbGFyYXRvci50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgMzkpIHN5bWJvbHMuYWRkKEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5wYXJhbWV0ZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMzkpIEphdmFQYXJzZXJTeW1ib2xEZWNsYXJhdGlvbi5wYXJhbWV0ZXIod3JhcHBlZE5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLnBhcmFtZXRlcihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdG9yc19WYXJpYWJsZVN5bWJvbERlY2xhcmF0b3IudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXBhcnNlcm1vZGVsX2RlY2xhcmF0b3JzX1ZhcmlhYmxlU3ltYm9sRGVjbGFyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkMjhkMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFwYXJzZXJtb2RlbF9kZWNsYXJhdG9yc19WYXJpYWJsZVN5bWJvbERlY2xhcmF0b3IudHh0CkBAIC0wLDAgKzEsNyBAQAorICBMaW5lIDM4KSBnZXRQYXJlbnROb2RlKHdyYXBwZWROb2RlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5nZXRQYXJlbnROb2RlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSkKKyAgTGluZSA0NSkgd3JhcHBlZE5vZGUuZ2V0VmFyaWFibGVzKCkuc3RyZWFtKCkubWFwKHYgLT4gSmF2YVBhcnNlclN5bWJvbERlY2xhcmF0aW9uLmxvY2FsVmFyKHYsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IG5ldyBMaW5rZWRMaXN0PD4oKSkpID09PiBFUlJPUgorICBMaW5lIDQ1KSB3cmFwcGVkTm9kZS5nZXRWYXJpYWJsZXMoKS5zdHJlYW0oKS5tYXAodiAtPiBKYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24ubG9jYWxWYXIodiwgdHlwZVNvbHZlcikpID09PiBFUlJPUgorICBMaW5lIDQ1KSB3cmFwcGVkTm9kZS5nZXRWYXJpYWJsZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA0NSkgd3JhcHBlZE5vZGUuZ2V0VmFyaWFibGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRWYXJpYWJsZXMoKQorICBMaW5lIDQ2KSBKYXZhUGFyc2VyU3ltYm9sRGVjbGFyYXRpb24ubG9jYWxWYXIodiwgdHlwZVNvbHZlcikgPT0+IEVSUk9SCisgIExpbmUgNDgpIENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IG5ldyBMaW5rZWRMaXN0PD4oKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPEM+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVlYzgxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxMjggQEAKKyAgTGluZSA1OSkgY3RDbGFzcy5pc0ludGVyZmFjZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgNTkpIGN0Q2xhc3MuaXNBbm5vdGF0aW9uKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmlzQW5ub3RhdGlvbigpCisgIExpbmUgNTkpIGN0Q2xhc3MuaXNQcmltaXRpdmUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuaXNQcmltaXRpdmUoKQorICBMaW5lIDU5KSBjdENsYXNzLmlzRW51bSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0VudW0oKQorICBMaW5lIDYwKSBjdENsYXNzLnRvU3RyaW5nKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLnRvU3RyaW5nKCkKKyAgTGluZSA2OSkgdHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDY5KSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNzkpIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDg0KSBpc0Fzc2lnbmFibGVCeShuZXcgUmVmZXJlbmNlVHlwZUltcGwob3RoZXIsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDkwKSBnZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA5MCkgby5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA5NCkgY3RDbGFzcy5lcXVhbHModGhhdC5jdENsYXNzKSA9PT4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDEpIGN0Q2xhc3MuaGFzaENvZGUoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5oYXNoQ29kZSgpCisgIExpbmUgMTA2KSBjdENsYXNzLmdldFBhY2thZ2VOYW1lKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldFBhY2thZ2VOYW1lKCkKKyAgTGluZSAxMTEpIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSAxMTEpIGN0Q2xhc3MuZ2V0TmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXROYW1lKCkKKyAgTGluZSAxMTIpIGdldFBhY2thZ2VOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgMTEzKSBjbGFzc05hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBjbGFzc05hbWUubGVuZ3RoKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQsIGludCkKKyAgTGluZSAxMTMpIGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAxMTMpIGdldFBhY2thZ2VOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgMTEzKSBjbGFzc05hbWUubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAxMjApIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSAxMjApIGN0Q2xhc3MuZ2V0TmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXROYW1lKCkKKyAgTGluZSAxMjUpIEphdmFzc2lzdFV0aWxzLmdldE1ldGhvZFVzYWdlKGN0Q2xhc3MsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VXRpbHMuZ2V0TWV0aG9kVXNhZ2UoamF2YXNzaXN0LkN0Q2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgMTMwKSBjdENsYXNzLmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldERlY2xhcmVkRmllbGRzKCkKKyAgTGluZSAxMzEpIGZpZWxkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTMxKSBmaWVsZC5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5DdEZpZWxkLmdldE5hbWUoKQorICBMaW5lIDEzMikgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgSmF2YXNzaXN0RmllbGREZWNsYXJhdGlvbihmaWVsZCwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAxMzcpIGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAxMzkpIG5ldyBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKHN1cGVyQ2xhc3MsIHR5cGVTb2x2ZXIpLnNvbHZlU3ltYm9sKG5hbWUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTQwKSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTQ5KSBjdENsYXNzLmdldEludGVyZmFjZXMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTUwKSBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNTEpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxNTkpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChWYWx1ZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQorICBMaW5lIDE2NSkgZ2V0U3VwZXJDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMTY2KSBhbmNlc3RvcnMuYWRkKGdldFN1cGVyQ2xhc3MoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE2NikgZ2V0U3VwZXJDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMTY4KSBhbmNlc3RvcnMuYWRkQWxsKGdldEludGVyZmFjZXMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMTY4KSBnZXRJbnRlcmZhY2VzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAxNzUpIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhpbnQpCisgIExpbmUgMTc1KSBtLmdldE1vZGlmaWVycygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDE3NikgY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSAxNzcpIG1ldGhvZC5nZXRNZXRob2RJbmZvKCkuZ2V0QXR0cmlidXRlKFN5bnRoZXRpY0F0dHJpYnV0ZS50YWcpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuTWV0aG9kSW5mby5nZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNzcpIG1ldGhvZC5nZXRNZXRob2RJbmZvKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldE1ldGhvZEluZm8oKQorICBMaW5lIDE3OCkgbWV0aG9kLmdldE1ldGhvZEluZm8oKS5nZXRBY2Nlc3NGbGFncygpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuTWV0aG9kSW5mby5nZXRBY2Nlc3NGbGFncygpCisgIExpbmUgMTc4KSBtZXRob2QuZ2V0TWV0aG9kSW5mbygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRNZXRob2RJbmZvKCkKKyAgTGluZSAxNzkpIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE3OSkgbWV0aG9kLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0TWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDE3OSkgc3RhdGljT25seUNoZWNrLnRlc3QobWV0aG9kKSA9PT4gamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZS50ZXN0KFQpCisgIExpbmUgMTgwKSBjYW5kaWRhdGVzLmFkZChuZXcgSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE4NSkgY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldFN1cGVyY2xhc3MoKQorICBMaW5lIDE4NykgbmV3IEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24oc3VwZXJDbGFzcywgdHlwZVNvbHZlcikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuKQorICBMaW5lIDE4OCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE4OSkgY2FuZGlkYXRlcy5hZGQocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTg5KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxOTcpIGN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAxOTgpIG5ldyBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4pCisgIExpbmUgMTk5KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjAwKSBjYW5kaWRhdGVzLmFkZChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyMDApIHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDIwNykgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShjYW5kaWRhdGVzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uPiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyMTYpIHR5cGUuaXNOdWxsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzTnVsbCgpCisgIExpbmUgMjIxKSBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5pc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKQorICBMaW5lIDIyNSkgdHlwZS5kZXNjcmliZSgpLmVxdWFscyh0aGlzLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjI1KSB0eXBlLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAyMjUpIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjI5KSB0aGlzLmN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAyMzApIG5ldyBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKHRoaXMuY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCksIHR5cGVTb2x2ZXIpLmlzQXNzaWduYWJsZUJ5KHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjMwKSB0aGlzLmN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAyMzMpIGN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAyMzQpIG5ldyBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpLmlzQXNzaWduYWJsZUJ5KHR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDI1MSkgamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRGaWVsZHMoKQorICBMaW5lIDI1NikgY3RDbGFzcy5nZXRTaW1wbGVOYW1lKCkucmVwbGFjZSgnJCcsICcuJykuc3BsaXQoIlxcLiIpID09PiBqYXZhLmxhbmcuU3RyaW5nLnNwbGl0KGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjU2KSBjdENsYXNzLmdldFNpbXBsZU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5yZXBsYWNlKGNoYXIsIGNoYXIpCisgIExpbmUgMjU2KSBjdENsYXNzLmdldFNpbXBsZU5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgIExpbmUgMjc3KSBjdENsYXNzLmlzSW50ZXJmYWNlKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmlzSW50ZXJmYWNlKCkKKyAgTGluZSAyODMpIGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAyODQpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyODQpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyODYpIGN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSAyODcpIGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAyOTApIFNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjkwKSBjdENsYXNzLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpCisgIExpbmUgMjkxKSBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKGNsYXNzU2lnbmF0dXJlLmdldFN1cGVyQ2xhc3MoKSwgdHlwZVNvbHZlciwgdGhpcykuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMjkxKSBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKGNsYXNzU2lnbmF0dXJlLmdldFN1cGVyQ2xhc3MoKSwgdHlwZVNvbHZlciwgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VXRpbHMuc2lnbmF0dXJlVHlwZVRvVHlwZShqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUpCisgIExpbmUgMjkxKSBjbGFzc1NpZ25hdHVyZS5nZXRTdXBlckNsYXNzKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NTaWduYXR1cmUuZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMzAyKSBjdENsYXNzLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpCisgIExpbmUgMzAzKSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKS5tYXAoaSAtPiBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaSwgdHlwZVNvbHZlcikpLm1hcChpIC0+IG5ldyBSZWZlcmVuY2VUeXBlSW1wbChpLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDMwMykgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldEludGVyZmFjZXMoKSkubWFwKGkgLT4gbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGksIHR5cGVTb2x2ZXIpKS5tYXAoaSAtPiBuZXcgUmVmZXJlbmNlVHlwZUltcGwoaSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDMwMykgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldEludGVyZmFjZXMoKSkubWFwKGkgLT4gbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGksIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAzMDMpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMzAzKSBjdENsYXNzLmdldEludGVyZmFjZXMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMzA2KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAzMDgpIFNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzA4KSBjdENsYXNzLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpCisgIExpbmUgMzA5KSBBcnJheXMuc3RyZWFtKGNsYXNzU2lnbmF0dXJlLmdldEludGVyZmFjZXMoKSkubWFwKGkgLT4gSmF2YXNzaXN0VXRpbHMuc2lnbmF0dXJlVHlwZVRvVHlwZShpLCB0eXBlU29sdmVyLCB0aGlzKS5hc1JlZmVyZW5jZVR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDMwOSkgQXJyYXlzLnN0cmVhbShjbGFzc1NpZ25hdHVyZS5nZXRJbnRlcmZhY2VzKCkpLm1hcChpIC0+IEphdmFzc2lzdFV0aWxzLnNpZ25hdHVyZVR5cGVUb1R5cGUoaSwgdHlwZVNvbHZlciwgdGhpcykuYXNSZWZlcmVuY2VUeXBlKCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDMwOSkgQXJyYXlzLnN0cmVhbShjbGFzc1NpZ25hdHVyZS5nZXRJbnRlcmZhY2VzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMzA5KSBjbGFzc1NpZ25hdHVyZS5nZXRJbnRlcmZhY2VzKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NTaWduYXR1cmUuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMzEwKSBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKGksIHR5cGVTb2x2ZXIsIHRoaXMpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDMxMCkgSmF2YXNzaXN0VXRpbHMuc2lnbmF0dXJlVHlwZVRvVHlwZShpLCB0eXBlU29sdmVyLCB0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZSkKKyAgTGluZSAzMTEpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDMyMikgY3RDbGFzcy5pc0ludGVyZmFjZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgMzI3KSBjdENsYXNzLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgMzMyKSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMzM3KSBKYXZhc3Npc3RGYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoY3RDbGFzcy5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGludCkKKyAgTGluZSAzMzcpIGN0Q2xhc3MuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldE1vZGlmaWVycygpCisgIExpbmUgMzQyKSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldENvbnN0cnVjdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0Q29uc3RydWN0b3JzKCkKKyAgTGluZSAzNDcpIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuY29udGFpbmVyVHlwZSgpCisgIExpbmUgMzU3KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpdHlwZSAtPiBKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGl0eXBlLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMzU3KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpdHlwZSAtPiBKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGl0eXBlLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMzU3KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMzU3KSBjdENsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKQorICBMaW5lIDM1NykgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihpdHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihqYXZhc3Npc3QuQ3RDbGFzcywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzU3KSBDb2xsZWN0b3JzLnRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMzcwKSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSkuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgMzcwKSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMzcwKSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAzNzApIHRoaXMuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgMzcwKSBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM3MCkgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDM3MSkgdHlwZS5vckVsc2VUaHJvdygoKSAtPiBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIkludGVybmFsIHR5cGUgbm90IGZvdW5kOiAiICsgbmFtZSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub3JFbHNlVGhyb3coamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPD8gZXh0ZW5kcyBYPikKKyAgTGluZSAzODEpIHRoaXMuaW50ZXJuYWxUeXBlcygpLnN0cmVhbSgpLmFueU1hdGNoKGYgLT4gZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMzgxKSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAzODEpIHRoaXMuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgMzgxKSBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDM4MSkgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IzNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwyMiBAQAorICBMaW5lIDUyKSBjdENvbnN0cnVjdG9yLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q29uc3RydWN0b3IuZ2V0TmFtZSgpCisgIExpbmUgNzIpIGN0Q29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PT4gamF2YXNzaXN0LkN0TWVtYmVyLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSA3OCkgY3RDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRQYXJhbWV0ZXJUeXBlcygpCisgIExpbmUgODgpIGN0Q29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldE1vZGlmaWVycygpCisgIExpbmUgODkpIGN0Q29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0UGFyYW1ldGVyVHlwZXMoKQorICBMaW5lIDkxKSBjdENvbnN0cnVjdG9yLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpCisgIExpbmUgOTIpIFNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShjdENvbnN0cnVjdG9yLmdldEdlbmVyaWNTaWduYXR1cmUoKSkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUudG9NZXRob2RTaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA5MikgY3RDb25zdHJ1Y3Rvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldEdlbmVyaWNTaWduYXR1cmUoKQorICBMaW5lIDkzKSBtZXRob2RTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5NZXRob2RTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKQorICBMaW5lIDk0KSBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKHNpZ25hdHVyZVR5cGUsIHR5cGVTb2x2ZXIsIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFV0aWxzLnNpZ25hdHVyZVR5cGVUb1R5cGUoamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlKQorICBMaW5lIDk2KSBjdENvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldFBhcmFtZXRlclR5cGVzKCkKKyAgTGluZSAxMDgpIGN0Q29uc3RydWN0b3IuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSAxMDkpIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKKyAgTGluZSAxMTEpIFNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShjdENvbnN0cnVjdG9yLmdldEdlbmVyaWNTaWduYXR1cmUoKSkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUudG9NZXRob2RTaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTEpIGN0Q29uc3RydWN0b3IuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSAxMTIpIEFycmF5cy5zdHJlYW0obWV0aG9kU2lnbmF0dXJlLmdldFR5cGVQYXJhbWV0ZXJzKCkpLm1hcCgoamFzVHApIC0+IG5ldyBKYXZhc3Npc3RUeXBlUGFyYW1ldGVyKGphc1RwLCB0aGlzLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDExMikgQXJyYXlzLnN0cmVhbShtZXRob2RTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlcnMoKSkubWFwKChqYXNUcCkgLT4gbmV3IEphdmFzc2lzdFR5cGVQYXJhbWV0ZXIoamFzVHAsIHRoaXMsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAxMTIpIEFycmF5cy5zdHJlYW0obWV0aG9kU2lnbmF0dXJlLmdldFR5cGVQYXJhbWV0ZXJzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMTEyKSBtZXRob2RTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5NZXRob2RTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDExMikgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTIwKSBKYXZhc3Npc3RGYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoY3RDb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGludCkKKyAgTGluZSAxMjApIGN0Q29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldE1vZGlmaWVycygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM4YjIyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDgxIEBACisgIExpbmUgNTMpIGN0Q2xhc3MuaXNFbnVtKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmlzRW51bSgpCisgIExpbmUgNTQpIGN0Q2xhc3MudG9TdHJpbmcoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MudG9TdHJpbmcoKQorICBMaW5lIDYzKSBKYXZhc3Npc3RGYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoY3RDbGFzcy5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGludCkKKyAgTGluZSA2MykgY3RDbGFzcy5nZXRNb2RpZmllcnMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA2OCkgY3RDbGFzcy5nZXRQYWNrYWdlTmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgNzMpIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSA3MykgY3RDbGFzcy5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldE5hbWUoKQorICBMaW5lIDc0KSBnZXRQYWNrYWdlTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEVudW1EZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgNzUpIG5hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBuYW1lLmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgNzUpIGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSA3NSkgZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24uZ2V0UGFja2FnZU5hbWUoKQorICBMaW5lIDc1KSBuYW1lLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgODIpIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSA4MikgY3RDbGFzcy5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldE5hbWUoKQorICBMaW5lIDkxKSBjdENsYXNzLmdldFN1cGVyY2xhc3MoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpCisgIExpbmUgOTQpIEphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKHN1cGVyQ2xhc3MsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmFzc2lzdC5DdENsYXNzLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5Nikgc3VwZXJDbGFzc1R5cGVVc2FnZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA5NykgYW5jZXN0b3JzLmFkZChzdXBlckNsYXNzVHlwZVVzYWdlLmFzUmVmZXJlbmNlVHlwZSgpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgOTcpIHN1cGVyQ2xhc3NUeXBlVXNhZ2UuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTAxKSBjdENsYXNzLmdldEludGVyZmFjZXMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTAyKSBKYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmFzc2lzdC5DdENsYXNzLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMDQpIGludGVyZmF6ZVR5cGVVc2FnZS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMDUpIGFuY2VzdG9ycy5hZGQoaW50ZXJmYXplVHlwZVVzYWdlLmFzUmVmZXJlbmNlVHlwZSgpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTA1KSBpbnRlcmZhemVUeXBlVXNhZ2UuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTA5KSBjdENsYXNzLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgMTE3KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSAxMTcpIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDExNykgamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDExNykgamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRGaWVsZHMoKQorICBMaW5lIDExNykgZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExNykgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDExOSkgZmllbGQub3JFbHNlVGhyb3coKCkgLT4gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBkb2VzIG5vdCBleGlzdCBpbiAiICsgY3RDbGFzcy5nZXROYW1lKCkgKyAiLiIpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZVRocm93KGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjw/IGV4dGVuZHMgWD4pCisgIExpbmUgMTE5KSBjdENsYXNzLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgMTI0KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkuc3RyZWFtKCkuYW55TWF0Y2goZiAtPiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTI0KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTI0KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpCisgIExpbmUgMTI0KSBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTI0KSBmLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTI5KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpCisgIExpbmUgMTM0KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkTWV0aG9kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSAxNTQpIGN0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpLnNwbGl0KCJcXC4iKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zcGxpdChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1NCkgY3RDbGFzcy5nZXRTaW1wbGVOYW1lKCkucmVwbGFjZSgnJCcsICcuJykgPT0+IGphdmEubGFuZy5TdHJpbmcucmVwbGFjZShjaGFyLCBjaGFyKQorICBMaW5lIDE1NCkgY3RDbGFzcy5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldFNpbXBsZU5hbWUoKQorICBMaW5lIDE2MCkgamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDE2NSkgamF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5jb250YWluZXJUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5jb250YWluZXJUeXBlKCkKKyAgTGluZSAxNzApIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhpbnQpCisgIExpbmUgMTcwKSBtLmdldE1vZGlmaWVycygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRNb2RpZmllcnMoKQorICBMaW5lIDE3MSkgY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSAxNzIpIG1ldGhvZC5nZXRNZXRob2RJbmZvKCkuZ2V0QXR0cmlidXRlKFN5bnRoZXRpY0F0dHJpYnV0ZS50YWcpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuTWV0aG9kSW5mby5nZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNzIpIG1ldGhvZC5nZXRNZXRob2RJbmZvKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldE1ldGhvZEluZm8oKQorICBMaW5lIDE3MykgbWV0aG9kLmdldE1ldGhvZEluZm8oKS5nZXRBY2Nlc3NGbGFncygpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuTWV0aG9kSW5mby5nZXRBY2Nlc3NGbGFncygpCisgIExpbmUgMTczKSBtZXRob2QuZ2V0TWV0aG9kSW5mbygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRNZXRob2RJbmZvKCkKKyAgTGluZSAxNzQpIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE3NCkgbWV0aG9kLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0TWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDE3NCkgc3RhdGljT25seUNoZWNrLnRlc3QobWV0aG9kKSA9PT4gamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZS50ZXN0KFQpCisgIExpbmUgMTc1KSBjYW5kaWRhdGVzLmFkZChuZXcgSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE4MCkgY3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldFN1cGVyY2xhc3MoKQorICBMaW5lIDE4MikgbmV3IEphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24oc3VwZXJDbGFzcywgdHlwZVNvbHZlcikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuKQorICBMaW5lIDE4MykgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE4NCkgY2FuZGlkYXRlcy5hZGQocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTg0KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxOTEpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoY2FuZGlkYXRlcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTk1KSBKYXZhc3Npc3RVdGlscy5nZXRNZXRob2RVc2FnZShjdENsYXNzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFV0aWxzLmdldE1ldGhvZFVzYWdlKGphdmFzc2lzdC5DdENsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDIwNSkgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpKS5tYXAoaXR5cGUgLT4gSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihpdHlwZSwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDIwNSkgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpKS5tYXAoaXR5cGUgLT4gSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihpdHlwZSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDIwNSkgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDIwNSkgY3RDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkKKyAgTGluZSAyMDUpIEphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oaXR5cGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oamF2YXNzaXN0LkN0Q2xhc3MsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDIwNSkgQ29sbGVjdG9ycy50b1NldCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9TZXQoKQorICBMaW5lIDIxOCkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDIxOCkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDIxOCkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjE4KSB0aGlzLmludGVybmFsVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RFbnVtRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgMjE4KSBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIxOCkgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDIxOSkgdHlwZS5vckVsc2VUaHJvdygoKSAtPiBuZXcgVW5zb2x2ZWRTeW1ib2xFeGNlcHRpb24oIkludGVybmFsIHR5cGUgbm90IGZvdW5kOiAiICsgbmFtZSkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub3JFbHNlVGhyb3coamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyPD8gZXh0ZW5kcyBYPikKKyAgTGluZSAyMjkpIHRoaXMuaW50ZXJuYWxUeXBlcygpLnN0cmVhbSgpLmFueU1hdGNoKGYgLT4gZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjI5KSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyMjkpIHRoaXMuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEVudW1EZWNsYXJhdGlvbi5pbnRlcm5hbFR5cGVzKCkKKyAgTGluZSAyMjkpIGYuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVuZHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjI5KSBmLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RGYWN0b3J5LnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdEZhY3RvcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDllOWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RGYWN0b3J5LnR4dApAQCAtMCwwICsxLDE3IEBACisgIExpbmUgMzMpIGN0Q2xhenouaXNBcnJheSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0FycmF5KCkKKyAgTGluZSAzNCkgdHlwZVVzYWdlRm9yKGN0Q2xhenouZ2V0Q29tcG9uZW50VHlwZSgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhc3Npc3QuQ3RDbGFzcywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzQpIGN0Q2xhenouZ2V0Q29tcG9uZW50VHlwZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSAzNSkgY3RDbGF6ei5pc1ByaW1pdGl2ZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMzYpIGN0Q2xhenouZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM2KSBjdENsYXp6LmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgMzkpIFByaW1pdGl2ZVR5cGUuYnlOYW1lKGN0Q2xhenouZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlByaW1pdGl2ZVR5cGUuYnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzkpIGN0Q2xhenouZ2V0TmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXROYW1lKCkKKyAgTGluZSA0MikgY3RDbGF6ei5pc0ludGVyZmFjZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgNDUpIGN0Q2xhenouaXNFbnVtKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmlzRW51bSgpCisgIExpbmUgNTkpIGN0Q2xhenouaXNJbnRlcmZhY2UoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDYxKSBjdENsYXp6LmlzRW51bSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0VudW0oKQorICBMaW5lIDYzKSBjdENsYXp6LmlzQW5ub3RhdGlvbigpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5pc0Fubm90YXRpb24oKQorICBMaW5lIDY1KSBjdENsYXp6LmlzQXJyYXkoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuaXNBcnJheSgpCisgIExpbmUgNzMpIE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKGludCkKKyAgTGluZSA3NSkgTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcm90ZWN0ZWQoaW50KQorICBMaW5lIDc3KSBNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcml2YXRlKGludCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdEZpZWxkRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0RmllbGREZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1MzNiYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdEZpZWxkRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsOSBAQAorICBMaW5lIDQ0KSBKYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihjdEZpZWxkLmdldFR5cGUoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeS50eXBlVXNhZ2VGb3IoamF2YXNzaXN0LkN0Q2xhc3MsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQ0KSBjdEZpZWxkLmdldFR5cGUoKSA9PT4gamF2YXNzaXN0LkN0RmllbGQuZ2V0VHlwZSgpCisgIExpbmUgNTIpIE1vZGlmaWVyLmlzU3RhdGljKGN0RmllbGQuZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhpbnQpCisgIExpbmUgNTIpIGN0RmllbGQuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmFzc2lzdC5DdEZpZWxkLmdldE1vZGlmaWVycygpCisgIExpbmUgNTcpIGN0RmllbGQuZ2V0TmFtZSgpID09PiBqYXZhc3Npc3QuQ3RGaWVsZC5nZXROYW1lKCkKKyAgTGluZSA3NykgSmF2YXNzaXN0RmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGN0RmllbGQuZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChpbnQpCisgIExpbmUgNzcpIGN0RmllbGQuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmFzc2lzdC5DdEZpZWxkLmdldE1vZGlmaWVycygpCisgIExpbmUgODIpIEphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oY3RGaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGphdmFzc2lzdC5DdENsYXNzLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4MikgY3RGaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhc3Npc3QuQ3RGaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkZDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDEwNCBAQAorICBMaW5lIDU0KSBjdENsYXNzLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgNjApIGN0Q2xhc3MuaXNJbnRlcmZhY2UoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDYxKSBjdENsYXNzLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgNzEpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpLm1hcChpIC0+IG5ldyBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbihpLCB0eXBlU29sdmVyKSkubWFwKGkgLT4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGksIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNzEpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkpLm1hcChpIC0+IG5ldyBKYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbihpLCB0eXBlU29sdmVyKSkubWFwKGkgLT4gbmV3IFJlZmVyZW5jZVR5cGVJbXBsKGksIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSA3MSkgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldEludGVyZmFjZXMoKSkubWFwKGkgLT4gbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGksIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSA3MSkgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldEludGVyZmFjZXMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSA3MSkgY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldEludGVyZmFjZXMoKQorICBMaW5lIDcyKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSA4MCkgY3RDbGFzcy5nZXRQYWNrYWdlTmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgODUpIGN0Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSA4NSkgY3RDbGFzcy5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldE5hbWUoKQorICBMaW5lIDg2KSBnZXRQYWNrYWdlTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLmdldFBhY2thZ2VOYW1lKCkKKyAgTGluZSA4NykgY2xhc3NOYW1lLnN1YnN0cmluZyhnZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICsgMSwgY2xhc3NOYW1lLmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgODcpIGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSA4NykgZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgODcpIGNsYXNzTmFtZS5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDk0KSBjdENsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5yZXBsYWNlKGNoYXIsIGNoYXIpCisgIExpbmUgOTQpIGN0Q2xhc3MuZ2V0TmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXROYW1lKCkKKyAgTGluZSAxMDEpIEphdmFzc2lzdFV0aWxzLmdldE1ldGhvZFVzYWdlKGN0Q2xhc3MsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VXRpbHMuZ2V0TWV0aG9kVXNhZ2UoamF2YXNzaXN0LkN0Q2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgMTA3KSBNb2RpZmllci5pc1N0YXRpYyhtLmdldE1vZGlmaWVycygpKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMoaW50KQorICBMaW5lIDEwNykgbS5nZXRNb2RpZmllcnMoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAxMDgpIGN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpCisgIExpbmUgMTA5KSBtZXRob2QuZ2V0TWV0aG9kSW5mbygpLmdldEF0dHJpYnV0ZShTeW50aGV0aWNBdHRyaWJ1dGUudGFnKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLk1ldGhvZEluZm8uZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTA5KSBtZXRob2QuZ2V0TWV0aG9kSW5mbygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRNZXRob2RJbmZvKCkKKyAgTGluZSAxMTApIG1ldGhvZC5nZXRNZXRob2RJbmZvKCkuZ2V0QWNjZXNzRmxhZ3MoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLk1ldGhvZEluZm8uZ2V0QWNjZXNzRmxhZ3MoKQorICBMaW5lIDExMCkgbWV0aG9kLmdldE1ldGhvZEluZm8oKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0TWV0aG9kSW5mbygpCisgIExpbmUgMTExKSBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMTEpIG1ldGhvZC5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5DdE1ldGhvZC5nZXROYW1lKCkKKyAgTGluZSAxMTEpIHN0YXRpY09ubHlDaGVjay50ZXN0KG1ldGhvZCkgPT0+IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGUudGVzdChUKQorICBMaW5lIDExMikgY2FuZGlkYXRlcy5hZGQobmV3IEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxMTcpIGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAxMTkpIG5ldyBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKHN1cGVyQ2xhc3MsIHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbikKKyAgTGluZSAxMjApIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxMjEpIGNhbmRpZGF0ZXMuYWRkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDEyMSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTI5KSBjdENsYXNzLmdldEludGVyZmFjZXMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTMwKSBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24uc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuKQorICBMaW5lIDEzMSkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDEzMikgY2FuZGlkYXRlcy5hZGQocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTMyKSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMzkpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoY2FuZGlkYXRlcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTQ5KSBqYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5nZXREZWNsYXJlZEZpZWxkcygpCisgIExpbmUgMTYxKSBjdENsYXNzLmdldEludGVyZmFjZXMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTYyKSBKYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDE2MikgSmF2YXNzaXN0RmFjdG9yeS50eXBlVXNhZ2VGb3IoaW50ZXJmYXplLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhc3Npc3QuQ3RDbGFzcywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTYzKSBhbmNlc3RvcnMuYWRkKHN1cGVySW50ZXJmYXplKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTY4KSBhbmNlc3RvcnMuc3RyZWFtKCkuZmlsdGVyKGEgLT4gYS5nZXRRdWFsaWZpZWROYW1lKCkgIT0gT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDE2OCkgYW5jZXN0b3JzLnN0cmVhbSgpLmZpbHRlcihhIC0+IGEuZ2V0UXVhbGlmaWVkTmFtZSgpICE9IE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDE2OCkgYW5jZXN0b3JzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDE2OCkgYS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE2OCkgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE2OSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTcwKSBhbmNlc3RvcnMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxNzApIHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNzApIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNzYpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkubWFwKG0gLT4gbmV3IEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKG0sIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAxNzYpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkubWFwKG0gLT4gbmV3IEphdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uKG0sIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAxNzYpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAxNzYpIGN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpCisgIExpbmUgMTc4KSBDb2xsZWN0b3JzLnRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMTg0KSBjdENsYXNzLmdldEFubm90YXRpb25zKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldEFubm90YXRpb25zKCkKKyAgTGluZSAxODUpIGFubm90YXRpb25SYXcuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE4NSkgYW5ub3RhdGlvblJhdy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE4NSkgYW5ub3RhdGlvblJhdy5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxODgpIEFycmF5cy5zdHJlYW0oYW5ub3RhdGlvblJhdy5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSkuYW55TWF0Y2goaXQgLT4gaXQuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhjYW5vbmljYWxOYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmFueU1hdGNoKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAxODgpIEFycmF5cy5zdHJlYW0oYW5ub3RhdGlvblJhdy5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAxODgpIGFubm90YXRpb25SYXcuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAxODgpIGFubm90YXRpb25SYXcuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTg4KSBpdC5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGNhbm9uaWNhbE5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE4OCkgaXQuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjAwKSBjdENsYXNzLmdldFNpbXBsZU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKS5zcGxpdCgiXFwuIikgPT0+IGphdmEubGFuZy5TdHJpbmcuc3BsaXQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMDApIGN0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpID09PiBqYXZhLmxhbmcuU3RyaW5nLnJlcGxhY2UoY2hhciwgY2hhcikKKyAgTGluZSAyMDApIGN0Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSAyMDYpIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyMTEpIEphdmFzc2lzdEZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChjdENsYXNzLmdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RGYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoaW50KQorICBMaW5lIDIxMSkgY3RDbGFzcy5nZXRNb2RpZmllcnMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAyMjIpIGN0Q2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKQorICBMaW5lIDIyMykgZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyMjMpIGZpZWxkLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0RmllbGQuZ2V0TmFtZSgpCisgIExpbmUgMjI0KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKG5ldyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDIyOSkgY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldEludGVyZmFjZXMoKQorICBMaW5lIDIzMCkgbmV3IEphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uKGludGVyZmF6ZSwgdHlwZVNvbHZlcikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24uc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjMxKSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMjM5KSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoVmFsdWVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSAyNDQpIGphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIuY29udGFpbmVyVHlwZSgpCisgIExpbmUgMjU0KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpdHlwZSAtPiBKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGl0eXBlLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjU0KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpdHlwZSAtPiBKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGl0eXBlLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMjU0KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMjU0KSBjdENsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKQorICBMaW5lIDI1NCkgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihpdHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihqYXZhc3Npc3QuQ3RDbGFzcywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjU0KSBDb2xsZWN0b3JzLnRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMjY3KSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSkuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgMjY3KSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lbmRzV2l0aChuYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjY3KSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyNjcpIHRoaXMuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLmludGVybmFsVHlwZXMoKQorICBMaW5lIDI2NykgZi5nZXROYW1lKCkuZW5kc1dpdGgobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZW5kc1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNjcpIGYuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNjgpIHR5cGUub3JFbHNlVGhyb3coKCkgLT4gbmV3IFVuc29sdmVkU3ltYm9sRXhjZXB0aW9uKCJJbnRlcm5hbCB0eXBlIG5vdCBmb3VuZDogIiArIG5hbWUpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZVRocm93KGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjw/IGV4dGVuZHMgWD4pCisgIExpbmUgMjc4KSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uYW55TWF0Y2goamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDI3OCkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMjc4KSB0aGlzLmludGVybmFsVHlwZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5pbnRlcm5hbFR5cGVzKCkKKyAgTGluZSAyNzgpIGYuZ2V0TmFtZSgpLmVuZHNXaXRoKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVuZHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjc4KSBmLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxMDAwMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdE1ldGhvZERlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDMzIEBACisgIExpbmUgNTEpIGN0TWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuaXNJbnRlcmZhY2UoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDUxKSBjdE1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhc3Npc3QuQ3RNZW1iZXIuZ2V0RGVjbGFyaW5nQ2xhc3MoKQorICBMaW5lIDUxKSBpc0Fic3RyYWN0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24uaXNBYnN0cmFjdCgpCisgIExpbmUgNTYpIE1vZGlmaWVyLmlzU3RhdGljKGN0TWV0aG9kLmdldE1vZGlmaWVycygpKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMoaW50KQorICBMaW5lIDU2KSBjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA2OCkgY3RNZXRob2QuZ2V0TmFtZSgpID09PiBqYXZhc3Npc3QuQ3RNZXRob2QuZ2V0TmFtZSgpCisgIExpbmUgODgpIGN0TWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuaXNJbnRlcmZhY2UoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDg4KSBjdE1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhc3Npc3QuQ3RNZW1iZXIuZ2V0RGVjbGFyaW5nQ2xhc3MoKQorICBMaW5lIDg5KSBjdE1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhc3Npc3QuQ3RNZW1iZXIuZ2V0RGVjbGFyaW5nQ2xhc3MoKQorICBMaW5lIDkxKSBjdE1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhc3Npc3QuQ3RNZW1iZXIuZ2V0RGVjbGFyaW5nQ2xhc3MoKQorICBMaW5lIDk4KSBKYXZhc3Npc3RGYWN0b3J5LnR5cGVVc2FnZUZvcihjdE1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmFzc2lzdC5DdENsYXNzLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5OCkgY3RNZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09PiBqYXZhc3Npc3QuQ3RNZXRob2QuZ2V0UmV0dXJuVHlwZSgpCisgIExpbmUgMTA4KSBjdE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRQYXJhbWV0ZXJUeXBlcygpCisgIExpbmUgMTE4KSBjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAxMTkpIGN0TWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldFBhcmFtZXRlclR5cGVzKCkKKyAgTGluZSAxMjEpIGN0TWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpCisgIExpbmUgMTIyKSBTaWduYXR1cmVBdHRyaWJ1dGUudG9NZXRob2RTaWduYXR1cmUoY3RNZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyMikgY3RNZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSAxMjMpIG1ldGhvZFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLk1ldGhvZFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygpCisgIExpbmUgMTI0KSBKYXZhc3Npc3RVdGlscy5zaWduYXR1cmVUeXBlVG9UeXBlKHNpZ25hdHVyZVR5cGUsIHR5cGVTb2x2ZXIsIHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFV0aWxzLnNpZ25hdHVyZVR5cGVUb1R5cGUoamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlKQorICBMaW5lIDEyNikgY3RNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0UGFyYW1ldGVyVHlwZXMoKQorICBMaW5lIDE0MCkgbmV3IE1ldGhvZERlY2xhcmF0aW9uQ29tbW9uTG9naWModGhpcywgdHlwZVNvbHZlcikucmVzb2x2ZVR5cGVWYXJpYWJsZXMoY29udGV4dCwgcGFyYW1ldGVyVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmRlY2xhcmF0aW9ucy5jb21tb24uTWV0aG9kRGVjbGFyYXRpb25Db21tb25Mb2dpYy5yZXNvbHZlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTQ1KSBNb2RpZmllci5pc0Fic3RyYWN0KGN0TWV0aG9kLmdldE1vZGlmaWVycygpKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChpbnQpCisgIExpbmUgMTQ1KSBjdE1ldGhvZC5nZXRNb2RpZmllcnMoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAxNTEpIGN0TWV0aG9kLmdldEdlbmVyaWNTaWduYXR1cmUoKSA9PT4gamF2YXNzaXN0LkN0QmVoYXZpb3IuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpCisgIExpbmUgMTUyKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCisgIExpbmUgMTU0KSBTaWduYXR1cmVBdHRyaWJ1dGUudG9NZXRob2RTaWduYXR1cmUoY3RNZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS50b01ldGhvZFNpZ25hdHVyZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1NCkgY3RNZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSAxNTUpIEFycmF5cy5zdHJlYW0obWV0aG9kU2lnbmF0dXJlLmdldFR5cGVQYXJhbWV0ZXJzKCkpLm1hcCgoamFzVHApIC0+IG5ldyBKYXZhc3Npc3RUeXBlUGFyYW1ldGVyKGphc1RwLCB0aGlzLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDE1NSkgQXJyYXlzLnN0cmVhbShtZXRob2RTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlcnMoKSkubWFwKChqYXNUcCkgLT4gbmV3IEphdmFzc2lzdFR5cGVQYXJhbWV0ZXIoamFzVHAsIHRoaXMsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAxNTUpIEFycmF5cy5zdHJlYW0obWV0aG9kU2lnbmF0dXJlLmdldFR5cGVQYXJhbWV0ZXJzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMTU1KSBtZXRob2RTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5NZXRob2RTaWduYXR1cmUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDE1NSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RQYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2NjI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdFBhcmFtZXRlckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxIEBACisgIExpbmUgMzMpIEphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKHR5cGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmFzc2lzdC5DdENsYXNzLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2OWE0NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIudHh0CkBAIC0wLDAgKzEsMzIgQEAKKyAgTGluZSA0MSkgQXJyYXlzLnN0cmVhbShjdENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKS5tYXAobSAtPiBuZXcgSmF2YXNzaXN0TWV0aG9kRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDQxKSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpLm1hcChtIC0+IG5ldyBKYXZhc3Npc3RNZXRob2REZWNsYXJhdGlvbihtLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgNDEpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSA0MSkgY3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSA0MikgQ29sbGVjdG9ycy50b1NldCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9TZXQoKQorICBMaW5lIDQ2KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkpLm1hcChtIC0+IG5ldyBKYXZhc3Npc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG0sIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNDYpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKSkubWFwKG0gLT4gbmV3IEphdmFzc2lzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDQ2KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgNDYpIGN0Q2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldENvbnN0cnVjdG9ycygpCisgIExpbmUgNDcpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDUyKSBjb2xsZWN0RGVjbGFyZWRGaWVsZHMoY3RDbGFzcywgZmllbGREZWNscykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZURlY2xhcmF0aW9uQWRhcHRlci5jb2xsZWN0RGVjbGFyZWRGaWVsZHMoamF2YXNzaXN0LkN0Q2xhc3MsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkZpZWxkRGVjbGFyYXRpb24+KQorICBMaW5lIDU4KSBBcnJheXMuc3RyZWFtKGN0Q2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKSkuZm9yRWFjaChmIC0+IGZpZWxkRGVjbHMuYWRkKG5ldyBKYXZhc3Npc3RGaWVsZERlY2xhcmF0aW9uKGYsIHR5cGVTb2x2ZXIpKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZvckVhY2goamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyPD8gc3VwZXIgVD4pCisgIExpbmUgNTgpIEFycmF5cy5zdHJlYW0oY3RDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDU4KSBjdENsYXNzLmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldERlY2xhcmVkRmllbGRzKCkKKyAgTGluZSA1OSkgZmllbGREZWNscy5hZGQobmV3IEphdmFzc2lzdEZpZWxkRGVjbGFyYXRpb24oZiwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA2MSkgY29sbGVjdERlY2xhcmVkRmllbGRzKGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpLCBmaWVsZERlY2xzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLmNvbGxlY3REZWNsYXJlZEZpZWxkcyhqYXZhc3Npc3QuQ3RDbGFzcywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRmllbGREZWNsYXJhdGlvbj4pCisgIExpbmUgNjEpIGN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSA2OSkgY3RDbGFzcy5nZXRHZW5lcmljU2lnbmF0dXJlKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldEdlbmVyaWNTaWduYXR1cmUoKQorICBMaW5lIDcwKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCisgIExpbmUgNzQpIFNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS50b0NsYXNzU2lnbmF0dXJlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzQpIGN0Q2xhc3MuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSA3NSkgQXJyYXlzLjxTaWduYXR1cmVBdHRyaWJ1dGUuVHlwZVBhcmFtZXRlcj5zdHJlYW0oY2xhc3NTaWduYXR1cmUuZ2V0UGFyYW1ldGVycygpKS5tYXAoKHRwKSAtPiBuZXcgSmF2YXNzaXN0VHlwZVBhcmFtZXRlcih0cCwgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdENsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA3NSkgQXJyYXlzLjxTaWduYXR1cmVBdHRyaWJ1dGUuVHlwZVBhcmFtZXRlcj5zdHJlYW0oY2xhc3NTaWduYXR1cmUuZ2V0UGFyYW1ldGVycygpKS5tYXAoKHRwKSAtPiBuZXcgSmF2YXNzaXN0VHlwZVBhcmFtZXRlcih0cCwgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdENsYXNzLCB0eXBlU29sdmVyKSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDc1KSBBcnJheXMuPFNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlUGFyYW1ldGVyPnN0cmVhbShjbGFzc1NpZ25hdHVyZS5nZXRQYXJhbWV0ZXJzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgNzUpIGNsYXNzU2lnbmF0dXJlLmdldFBhcmFtZXRlcnMoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5DbGFzc1NpZ25hdHVyZS5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA3NikgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdENsYXNzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGphdmFzc2lzdC5DdENsYXNzLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3NykgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgODYpIGN0Q2xhc3MuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0RGVjbGFyaW5nQ2xhc3MoKQorICBMaW5lIDg3KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDg4KSBPcHRpb25hbC5vZihKYXZhc3Npc3RGYWN0b3J5LnRvVHlwZURlY2xhcmF0aW9uKGN0Q2xhc3MuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSA4OCkgSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjdENsYXNzLmdldERlY2xhcmluZ0NsYXNzKCksIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oamF2YXNzaXN0LkN0Q2xhc3MsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDg4KSBjdENsYXNzLmdldERlY2xhcmluZ0NsYXNzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldERlY2xhcmluZ0NsYXNzKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdFR5cGVQYXJhbWV0ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0VHlwZVBhcmFtZXRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMzEzNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2phdmFzc2lzdG1vZGVsX0phdmFzc2lzdFR5cGVQYXJhbWV0ZXIudHh0CkBAIC0wLDAgKzEsMjMgQEAKKyAgTGluZSA1MykgZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGF0LmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTMpIGdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDUzKSB0aGF0LmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDU2KSBkZWNsYXJlZE9uVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPblR5cGUoKQorICBMaW5lIDU2KSB0aGF0LmRlY2xhcmVkT25UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uVHlwZSgpCisgIExpbmUgNTkpIGRlY2xhcmVkT25NZXRob2QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25NZXRob2QoKQorICBMaW5lIDU5KSB0aGF0LmRlY2xhcmVkT25NZXRob2QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25NZXRob2QoKQorICBMaW5lIDY5KSB3cmFwcGVkLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDc1KSB3cmFwcGVkLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlUGFyYW1ldGVyLmdldE5hbWUoKQorICBMaW5lIDgxKSAoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgdGhpcy5jb250YWluZXIpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDgzKSAoKE1ldGhvZExpa2VEZWNsYXJhdGlvbikgdGhpcy5jb250YWluZXIpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDkwKSBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VHlwZVBhcmFtZXRlci5nZXRDb250YWluZXJRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMDEpIHdyYXBwZWQuZ2V0Q2xhc3NCb3VuZCgpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLlR5cGVQYXJhbWV0ZXIuZ2V0Q2xhc3NCb3VuZCgpCisgIExpbmUgMTAxKSB3cmFwcGVkLmdldENsYXNzQm91bmQoKS50b1N0cmluZygpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDEpIHdyYXBwZWQuZ2V0Q2xhc3NCb3VuZCgpLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKQorICBMaW5lIDEwMSkgd3JhcHBlZC5nZXRDbGFzc0JvdW5kKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuVHlwZVBhcmFtZXRlci5nZXRDbGFzc0JvdW5kKCkKKyAgTGluZSAxMDEpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMDIpIHdyYXBwZWQuZ2V0Q2xhc3NCb3VuZCgpLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKQorICBMaW5lIDEwMikgd3JhcHBlZC5nZXRDbGFzc0JvdW5kKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuVHlwZVBhcmFtZXRlci5nZXRDbGFzc0JvdW5kKCkKKyAgTGluZSAxMDQpIHdyYXBwZWQuZ2V0SW50ZXJmYWNlQm91bmQoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlUGFyYW1ldGVyLmdldEludGVyZmFjZUJvdW5kKCkKKyAgTGluZSAxMDUpIG90LnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKQorICBMaW5lIDExMykgT3B0aW9uYWwub2YoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMTE1KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0VXRpbHMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfamF2YXNzaXN0bW9kZWxfSmF2YXNzaXN0VXRpbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTU5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9qYXZhc3Npc3Rtb2RlbF9KYXZhc3Npc3RVdGlscy50eHQKQEAgLTAsMCArMSw3NyBAQAorICBMaW5lIDQ0KSBjdENsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpID09PiBqYXZhc3Npc3QuQ3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDQ1KSBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NSkgbWV0aG9kLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LkN0TWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDQ4KSBhcmd1bWVudHNUeXBlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDQ4KSBtZXRob2RVc2FnZS5nZXROb1BhcmFtcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0Tm9QYXJhbXMoKQorICBMaW5lIDUzKSBtZXRob2QuZ2V0R2VuZXJpY1NpZ25hdHVyZSgpID09PiBqYXZhc3Npc3QuQ3RCZWhhdmlvci5nZXRHZW5lcmljU2lnbmF0dXJlKCkKKyAgTGluZSA1NCkgU2lnbmF0dXJlQXR0cmlidXRlLnRvTWV0aG9kU2lnbmF0dXJlKG1ldGhvZC5nZXRHZW5lcmljU2lnbmF0dXJlKCkpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLnRvTWV0aG9kU2lnbmF0dXJlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTQpIG1ldGhvZC5nZXRHZW5lcmljU2lnbmF0dXJlKCkgPT0+IGphdmFzc2lzdC5DdEJlaGF2aW9yLmdldEdlbmVyaWNTaWduYXR1cmUoKQorICBMaW5lIDU1KSBwYXJzZVR5cGVQYXJhbWV0ZXJzKGNsYXNzU2lnbmF0dXJlLmdldFJldHVyblR5cGUoKS50b1N0cmluZygpLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VXRpbHMucGFyc2VUeXBlUGFyYW1ldGVycyhqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA1NSkgY2xhc3NTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZSgpLnRvU3RyaW5nKCkgPT0+IGphdmEubGFuZy5PYmplY3QudG9TdHJpbmcoKQorICBMaW5lIDU1KSBjbGFzc1NpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuTWV0aG9kU2lnbmF0dXJlLmdldFJldHVyblR5cGUoKQorICBMaW5lIDU2KSBtZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkKKyAgTGluZSA1OSkgbmV3UmV0dXJuVHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiBwYXJhbWV0ZXJzT2ZSZXR1cm5UeXBlLnJlbW92ZSgwKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnRyYW5zZm9ybVR5cGVQYXJhbWV0ZXJzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVHJhbnNmb3JtZXIpCisgIExpbmUgNTkpIG5ld1JldHVyblR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNTkpIHBhcmFtZXRlcnNPZlJldHVyblR5cGUucmVtb3ZlKDApID09PiBqYXZhLnV0aWwuTGlzdC5yZW1vdmUoaW50KQorICBMaW5lIDYxKSBtZXRob2RVc2FnZS5yZXBsYWNlUmV0dXJuVHlwZShuZXdSZXR1cm5UeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJlcGxhY2VSZXR1cm5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDYzKSBPcHRpb25hbC5vZihtZXRob2RVc2FnZSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDcxKSBjdENsYXNzLmdldFN1cGVyY2xhc3MoKSA9PT4gamF2YXNzaXN0LkN0Q2xhc3MuZ2V0U3VwZXJjbGFzcygpCisgIExpbmUgNzMpIG5ldyBKYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uKHN1cGVyQ2xhc3MsIHR5cGVTb2x2ZXIpLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIG51bGwpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdENsYXNzRGVjbGFyYXRpb24uc29sdmVNZXRob2RBc1VzYWdlKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA3NCkgcmVmLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA4MykgY3RDbGFzcy5nZXRJbnRlcmZhY2VzKCkgPT0+IGphdmFzc2lzdC5DdENsYXNzLmdldEludGVyZmFjZXMoKQorICBMaW5lIDg0KSBuZXcgSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24oaW50ZXJmYXplLCB0eXBlU29sdmVyKS5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCBudWxsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RJbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZEFzVXNhZ2UoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDg1KSByZWYuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDkzKSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDk4KSBzaWduYXR1cmUuY29udGFpbnMoIjwiKSA9PT4gamF2YS5sYW5nLlN0cmluZy5jb250YWlucyhqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQorICBMaW5lIDk5KSBzaWduYXR1cmUuc3Vic3RyaW5nKHNpZ25hdHVyZS5pbmRleE9mKCc8JykgKyAxKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50KQorICBMaW5lIDk5KSBzaWduYXR1cmUuaW5kZXhPZignPCcpID09PiBqYXZhLmxhbmcuU3RyaW5nLmluZGV4T2YoaW50KQorICBMaW5lIDEwMCkgc2lnbmF0dXJlLmVuZHNXaXRoKCI+IikgPT0+IGphdmEubGFuZy5TdHJpbmcuZW5kc1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDMpIHNpZ25hdHVyZS5zdWJzdHJpbmcoMCwgc2lnbmF0dXJlLmxlbmd0aCgpIC0gMSkgPT0+IGphdmEubGFuZy5TdHJpbmcuc3Vic3RyaW5nKGludCwgaW50KQorICBMaW5lIDEwMykgc2lnbmF0dXJlLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMTA0KSBzaWduYXR1cmUuY29udGFpbnMoIiwiKSA9PT4gamF2YS5sYW5nLlN0cmluZy5jb250YWlucyhqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKQorICBMaW5lIDEwNykgc2lnbmF0dXJlLmNvbnRhaW5zKCI8IikgPT0+IGphdmEubGFuZy5TdHJpbmcuY29udGFpbnMoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSkKKyAgTGluZSAxMTApIHNpZ25hdHVyZS5jb250YWlucygiPiIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmNvbnRhaW5zKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpCisgIExpbmUgMTE0KSB0eXBlcy5hZGQobmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVR5cGVVc2FnZShzaWduYXR1cmUsIGludm9rYXRpb25Db250ZXh0KSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDExNCkgbmV3IFN5bWJvbFNvbHZlcih0eXBlU29sdmVyKS5zb2x2ZVR5cGVVc2FnZShzaWduYXR1cmUsIGludm9rYXRpb25Db250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVR5cGVVc2FnZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0KQorICBMaW5lIDExNykgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICBMaW5lIDEyNCkgY2xhc3NUeXBlLmdldFR5cGVBcmd1bWVudHMoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5DbGFzc1R5cGUuZ2V0VHlwZUFyZ3VtZW50cygpCisgIExpbmUgMTI0KSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCisgIExpbmUgMTI0KSBBcnJheXMuc3RyZWFtKGNsYXNzVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkpLm1hcCh0YSAtPiB0eXBlQXJndW1lbnRUb1R5cGUodGEsIHR5cGVTb2x2ZXIsIHR5cGVQYXJhbWV0cml6YWJsZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAxMjQpIEFycmF5cy5zdHJlYW0oY2xhc3NUeXBlLmdldFR5cGVBcmd1bWVudHMoKSkubWFwKHRhIC0+IHR5cGVBcmd1bWVudFRvVHlwZSh0YSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMTI0KSBBcnJheXMuc3RyZWFtKGNsYXNzVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMTI0KSBjbGFzc1R5cGUuZ2V0VHlwZUFyZ3VtZW50cygpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLkNsYXNzVHlwZS5nZXRUeXBlQXJndW1lbnRzKCkKKyAgTGluZSAxMjQpIHR5cGVBcmd1bWVudFRvVHlwZSh0YSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RVdGlscy50eXBlQXJndW1lbnRUb1R5cGUoamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlQXJndW1lbnQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUpCisgIExpbmUgMTI0KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxMjYpIGNsYXNzVHlwZS5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLkNsYXNzVHlwZS5nZXREZWNsYXJpbmdDbGFzcygpCisgIExpbmUgMTI3KSBjbGFzc1R5cGUuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NUeXBlLmdldE5hbWUoKQorICBMaW5lIDEyNykgY2xhc3NUeXBlLmdldERlY2xhcmluZ0NsYXNzKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NUeXBlLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSAxMjcpIGNsYXNzVHlwZS5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuQ2xhc3NUeXBlLmdldE5hbWUoKQorICBMaW5lIDEyOCkgY2xhc3NUeXBlLmdldE5hbWUoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5DbGFzc1R5cGUuZ2V0TmFtZSgpCisgIExpbmUgMTI5KSB0eXBlU29sdmVyLnNvbHZlVHlwZShpbnRlcm5hbE5hbWVUb0Nhbm9uaWNhbE5hbWUodHlwZU5hbWUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTMwKSBpbnRlcm5hbE5hbWVUb0Nhbm9uaWNhbE5hbWUodHlwZU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdFV0aWxzLmludGVybmFsTmFtZVRvQ2Fub25pY2FsTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzNCkgdHlwZVBhcmFtZXRyaXphYmxlLmZpbmRUeXBlUGFyYW1ldGVyKHR5cGVWYXJpYWJsZVNpZ25hdHVyZS5nZXROYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZmluZFR5cGVQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzQpIHR5cGVWYXJpYWJsZVNpZ25hdHVyZS5nZXROYW1lKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuVHlwZVZhcmlhYmxlLmdldE5hbWUoKQorICBMaW5lIDEzNSkgdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uT3B0LmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMzgpIHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbk9wdC5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTQxKSBzaWduYXR1cmVUeXBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTQxKSBzaWduYXR1cmVUeXBlLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE0NikgdHlwZU5hbWUucmVwbGFjZUFsbCgiXFwkIiwgIi4iKSA9PT4gamF2YS5sYW5nLlN0cmluZy5yZXBsYWNlQWxsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTUwKSB0eXBlQXJndW1lbnQuanZtVHlwZU5hbWUoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlLmp2bVR5cGVOYW1lKCkKKyAgTGluZSAxNTEpIGdldEdlbmVyaWNQYXJhbWV0ZXJCeU5hbWUodHlwZU5hbWUsIHR5cGVQYXJhbWV0cml6YWJsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VXRpbHMuZ2V0R2VuZXJpY1BhcmFtZXRlckJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUpCisgIExpbmUgMTUyKSB0eXBlLm9yRWxzZUdldCgoKSAtPiBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoaW50ZXJuYWxOYW1lVG9DYW5vbmljYWxOYW1lKHR5cGVOYW1lKSksIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9yRWxzZUdldChqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI8PyBleHRlbmRzIFQ+KQorICBMaW5lIDE1MykgdHlwZVNvbHZlci5zb2x2ZVR5cGUoaW50ZXJuYWxOYW1lVG9DYW5vbmljYWxOYW1lKHR5cGVOYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1MykgaW50ZXJuYWxOYW1lVG9DYW5vbmljYWxOYW1lKHR5cGVOYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RVdGlscy5pbnRlcm5hbE5hbWVUb0Nhbm9uaWNhbE5hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxNTgpIHR5cGVQYXJhbWV0cml6YWJsZS5maW5kVHlwZVBhcmFtZXRlcih0eXBlTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5maW5kVHlwZVBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE1OSkgdHAubWFwKFR5cGVWYXJpYWJsZTo6bmV3KSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgVT4pCisgIExpbmUgMTYzKSB0eXBlQXJndW1lbnQuaXNXaWxkY2FyZCgpID09PiBqYXZhc3Npc3QuYnl0ZWNvZGUuU2lnbmF0dXJlQXR0cmlidXRlLlR5cGVBcmd1bWVudC5pc1dpbGRjYXJkKCkKKyAgTGluZSAxNjQpIHR5cGVBcmd1bWVudC5nZXRUeXBlKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuVHlwZUFyZ3VtZW50LmdldFR5cGUoKQorICBMaW5lIDE2NikgdHlwZUFyZ3VtZW50LmdldEtpbmQoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlQXJndW1lbnQuZ2V0S2luZCgpCisgIExpbmUgMTY3KSBXaWxkY2FyZC5leHRlbmRzQm91bmQob2JqZWN0VHlwZUFyZ3VtZW50VG9UeXBlKHR5cGVBcmd1bWVudC5nZXRUeXBlKCksIHR5cGVTb2x2ZXIsIHR5cGVQYXJhbWV0cml6YWJsZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE2Nykgb2JqZWN0VHlwZUFyZ3VtZW50VG9UeXBlKHR5cGVBcmd1bWVudC5nZXRUeXBlKCksIHR5cGVTb2x2ZXIsIHR5cGVQYXJhbWV0cml6YWJsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0VXRpbHMub2JqZWN0VHlwZUFyZ3VtZW50VG9UeXBlKGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuT2JqZWN0VHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZSkKKyAgTGluZSAxNjcpIHR5cGVBcmd1bWVudC5nZXRUeXBlKCkgPT0+IGphdmFzc2lzdC5ieXRlY29kZS5TaWduYXR1cmVBdHRyaWJ1dGUuVHlwZUFyZ3VtZW50LmdldFR5cGUoKQorICBMaW5lIDE2OCkgdHlwZUFyZ3VtZW50LmdldEtpbmQoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlQXJndW1lbnQuZ2V0S2luZCgpCisgIExpbmUgMTY5KSBXaWxkY2FyZC5zdXBlckJvdW5kKG9iamVjdFR5cGVBcmd1bWVudFRvVHlwZSh0eXBlQXJndW1lbnQuZ2V0VHlwZSgpLCB0eXBlU29sdmVyLCB0eXBlUGFyYW1ldHJpemFibGUpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLnN1cGVyQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTY5KSBvYmplY3RUeXBlQXJndW1lbnRUb1R5cGUodHlwZUFyZ3VtZW50LmdldFR5cGUoKSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RVdGlscy5vYmplY3RUeXBlQXJndW1lbnRUb1R5cGUoamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5PYmplY3RUeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlKQorICBMaW5lIDE2OSkgdHlwZUFyZ3VtZW50LmdldFR5cGUoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlQXJndW1lbnQuZ2V0VHlwZSgpCisgIExpbmUgMTc0KSBvYmplY3RUeXBlQXJndW1lbnRUb1R5cGUodHlwZUFyZ3VtZW50LmdldFR5cGUoKSwgdHlwZVNvbHZlciwgdHlwZVBhcmFtZXRyaXphYmxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RVdGlscy5vYmplY3RUeXBlQXJndW1lbnRUb1R5cGUoamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5PYmplY3RUeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlKQorICBMaW5lIDE3NCkgdHlwZUFyZ3VtZW50LmdldFR5cGUoKSA9PT4gamF2YXNzaXN0LmJ5dGVjb2RlLlNpZ25hdHVyZUF0dHJpYnV0ZS5UeXBlQXJndW1lbnQuZ2V0VHlwZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX0xhenlUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fTGF6eVR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWFjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX0xhenlUeXBlLnR4dApAQCAtMCwwICsxLDM5IEBACisgIExpbmUgMTgpIHByb3ZpZGVyLmFwcGx5KG51bGwpID09PiBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb24uYXBwbHkoVCkKKyAgTGluZSAyNSkgZ2V0VHlwZSgpLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgMjUpIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQorICBMaW5lIDMwKSBnZXRUeXBlKCkuYXJyYXlMZXZlbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hcnJheUxldmVsKCkKKyAgTGluZSAzMCkgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgMzUpIGdldFR5cGUoKS5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMzUpIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQorICBMaW5lIDQwKSBnZXRUeXBlKCkuaXNOdWxsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzTnVsbCgpCisgIExpbmUgNDApIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQorICBMaW5lIDQ1KSBnZXRUeXBlKCkuaXNSZWZlcmVuY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2UoKQorICBMaW5lIDQ1KSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZS5nZXRUeXBlKCkKKyAgTGluZSA1MCkgZ2V0VHlwZSgpLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDUwKSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZS5nZXRUeXBlKCkKKyAgTGluZSA1NSkgZ2V0VHlwZSgpLmlzVm9pZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ZvaWQoKQorICBMaW5lIDU1KSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZS5nZXRUeXBlKCkKKyAgTGluZSA2MCkgZ2V0VHlwZSgpLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSA2MCkgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgNjUpIGdldFR5cGUoKS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDY1KSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZS5nZXRUeXBlKCkKKyAgTGluZSA3MCkgZ2V0VHlwZSgpLmFzQXJyYXlUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzQXJyYXlUeXBlKCkKKyAgTGluZSA3MCkgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgNzUpIGdldFR5cGUoKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA3NSkgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgODApIGdldFR5cGUoKS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSA4MCkgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgODUpIGdldFR5cGUoKS5hc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgODUpIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQorICBMaW5lIDkwKSBnZXRUeXBlKCkuYXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNQcmltaXRpdmUoKQorICBMaW5lIDkwKSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZS5nZXRUeXBlKCkKKyAgTGluZSA5NSkgZ2V0VHlwZSgpLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgOTUpIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQorICBMaW5lIDEwMCkgZ2V0VHlwZSgpLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAxMDApIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQorICBMaW5lIDEwNSkgZ2V0VHlwZSgpLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCByZXBsYWNlZCwgaW5mZXJyZWRUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTA1KSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5MYXp5VHlwZS5nZXRUeXBlKCkKKyAgTGluZSAxMTApIGdldFR5cGUoKS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgcmVwbGFjZWQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDExMCkgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGF6eVR5cGUuZ2V0VHlwZSgpCisgIExpbmUgMTE1KSBnZXRUeXBlKCkuaXNBc3NpZ25hYmxlQnkob3RoZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMTUpIGdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhenlUeXBlLmdldFR5cGUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9SZWZlcmVuY2VUeXBlSW1wbC50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1JlZmVyZW5jZVR5cGVJbXBsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk1NzQzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9SZWZlcmVuY2VUeXBlSW1wbC50eHQKQEAgLTAsMCArMSw1MyBAQAorICBMaW5lIDQyKSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAodHAgLT4gbmV3IFR5cGVWYXJpYWJsZSh0cCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA0MikgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHRwIC0+IG5ldyBUeXBlVmFyaWFibGUodHApKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSA0MikgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNDIpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDQ0KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSA2OSkgamF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlclR5cGVWYXJpYWJsZURlY2xhcmF0aW9uLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgNzEpIHRoaXMudHlwZURlY2xhcmF0aW9uLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNzEpIHRoaXMudHlwZURlY2xhcmF0aW9uLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDgwKSB0aGlzLmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSA4Mykgb3RoZXIuaXNWb2lkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVm9pZCgpCisgIExpbmUgODMpIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MykgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDgzKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgODcpIG90aGVyLmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSA4OCkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg4KSB0aGlzLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgODgpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA5MikgaXNDb3JyZXNwb25kaW5nQm94aW5nVHlwZShvdGhlci5kZXNjcmliZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuaXNDb3JyZXNwb25kaW5nQm94aW5nVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDkyKSBvdGhlci5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgOTUpIHR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUob3RoZXIuYXNQcmltaXRpdmUoKS5nZXRCb3hUeXBlUU5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTUpIG90aGVyLmFzUHJpbWl0aXZlKCkuZ2V0Qm94VHlwZVFOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5QcmltaXRpdmVUeXBlLmdldEJveFR5cGVRTmFtZSgpCisgIExpbmUgOTUpIG90aGVyLmFzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUHJpbWl0aXZlKCkKKyAgTGluZSA5NikgdHlwZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKS5jYW5CZUFzc2lnbmVkVG8oc3VwZXIudHlwZURlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNhbkJlQXNzaWduZWRUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pCisgIExpbmUgOTYpIHR5cGUuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMDApIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaGFzQW5ub3RhdGlvbihGdW5jdGlvbmFsSW50ZXJmYWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5oYXNBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTAwKSB0aGlzLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDEwMCkgRnVuY3Rpb25hbEludGVyZmFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMDMpIGNvbXBhcmVDb25zaWRlcmluZ1R5cGVQYXJhbWV0ZXJzKG90aGVyUmVmKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuY29tcGFyZUNvbnNpZGVyaW5nVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUpCisgIExpbmUgMTA2KSBvdGhlclJlZi5nZXRBbGxBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0QWxsQW5jZXN0b3JzKCkKKyAgTGluZSAxMDcpIGNvbXBhcmVDb25zaWRlcmluZ1R5cGVQYXJhbWV0ZXJzKG90aGVyQW5jZXN0b3IpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5jb21wYXJlQ29uc2lkZXJpbmdUeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZSkKKyAgTGluZSAxMTIpIG90aGVyLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAxMTMpIG90aGVyLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Qm91bmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDExMykgb3RoZXIuYXNUeXBlVmFyaWFibGUoKS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGVWYXJpYWJsZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDExMykgb3RoZXIuYXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDExNCkgYm91bmQuaXNFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5pc0V4dGVuZHMoKQorICBMaW5lIDExNSkgdGhpcy5pc0Fzc2lnbmFibGVCeShib3VuZC5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGwuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTE1KSBib3VuZC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5nZXRUeXBlKCkKKyAgTGluZSAxMjEpIG90aGVyLmlzQ29uc3RyYWludCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0NvbnN0cmFpbnQoKQorICBMaW5lIDEyMikgaXNBc3NpZ25hYmxlQnkob3RoZXIuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZUltcGwuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTIyKSBvdGhlci5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSAxMjIpIG90aGVyLmFzQ29uc3RyYWludFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNDb25zdHJhaW50VHlwZSgpCisgIExpbmUgMTIzKSBvdGhlci5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDEyNCkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyNCkgdGhpcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDEyNCkgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEyNikgb3RoZXIuYXNXaWxkY2FyZCgpLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSAxMjYpIG90aGVyLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTI3KSBpc0Fzc2lnbmFibGVCeShvdGhlci5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlSW1wbC5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMjcpIG90aGVyLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDEyNykgb3RoZXIuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxNDApIGdldFR5cGVEZWNsYXJhdGlvbigpLmdldERlY2xhcmVkTWV0aG9kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSAxNDApIGdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE0MikgbWV0aG9kcy5hZGQobWV0aG9kVXNhZ2UpID09PiBqYXZhLnV0aWwuU2V0LmFkZChFKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX015T2JqZWN0UHJvdmlkZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX015T2JqZWN0UHJvdmlkZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZTMwNmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfTXlPYmplY3RQcm92aWRlci50eHQKQEAgLTAsMCArMSwzIEBACisgIExpbmUgMjkpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKHF1YWxpZmllZE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMCkgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAzMCkgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkNsYXNzQWRhcHRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkNsYXNzQWRhcHRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MzQyYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLnR4dApAQCAtMCwwICsxLDg5IEBACisgIExpbmUgMzYpIGNsYXp6LmdldEdlbmVyaWNTdXBlcmNsYXNzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRHZW5lcmljU3VwZXJjbGFzcygpCisgIExpbmUgMzkpIGNsYXp6LmdldEdlbmVyaWNTdXBlcmNsYXNzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRHZW5lcmljU3VwZXJjbGFzcygpCisgIExpbmUgNDIpIEFycmF5cy5zdHJlYW0ocGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKS5tYXAoKHQpIC0+IFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcih0LCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDQyKSBBcnJheXMuc3RyZWFtKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkubWFwKCh0KSAtPiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IodCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDQyKSBBcnJheXMuc3RyZWFtKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSA0MikgcGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA0MykgUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKHQsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoamF2YS5sYW5nLnJlZmxlY3QuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDQpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDQ1KSBjbGF6ei5nZXRTdXBlcmNsYXNzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSA0NykgY2xhenouZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U3VwZXJjbGFzcygpCisgIExpbmUgNTIpIGNsYXp6LmdldEdlbmVyaWNJbnRlcmZhY2VzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRHZW5lcmljSW50ZXJmYWNlcygpCisgIExpbmUgNTUpIEFycmF5cy5zdHJlYW0ocGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKS5tYXAoKHQpIC0+IFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcih0LCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDU1KSBBcnJheXMuc3RyZWFtKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkubWFwKCh0KSAtPiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IodCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDU1KSBBcnJheXMuc3RyZWFtKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSA1NSkgcGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA1NikgUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKHQsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoamF2YS5sYW5nLnJlZmxlY3QuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTcpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDU4KSBpbnRlcmZhY2VzLmFkZChuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbigoQ2xhc3M8Pz4pICgoUGFyYW1ldGVyaXplZFR5cGUpIHN1cGVySW50ZXJmYWNlKS5nZXRSYXdUeXBlKCksIHR5cGVTb2x2ZXIpLCB0eXBlUGFyYW1ldGVycywgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1OCkgKChQYXJhbWV0ZXJpemVkVHlwZSkgc3VwZXJJbnRlcmZhY2UpLmdldFJhd1R5cGUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGUuZ2V0UmF3VHlwZSgpCisgIExpbmUgNjApIGludGVyZmFjZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKChDbGFzczw/Pikgc3VwZXJJbnRlcmZhY2UsIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDY4KSBnZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgNjkpIGdldFN1cGVyQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSA3MCkgYW5jZXN0b3JzLmFkZChzdXBlckNsYXNzKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNzMpIGFuY2VzdG9ycy5hZGQob2JqZWN0KSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNzUpIGFuY2VzdG9ycy5hZGRBbGwoZ2V0SW50ZXJmYWNlcygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSA3NSkgZ2V0SW50ZXJmYWNlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldEludGVyZmFjZXMoKQorICBMaW5lIDc2KSBhbmNlc3RvcnMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA3NykgYW5jZXN0b3JzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA3OCkgYW5jZXN0b3IuaGFzTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5oYXNOYW1lKCkKKyAgTGluZSA3OCkgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3OCkgYW5jZXN0b3IuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA3OCkgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDc5KSBhbmNlc3RvcnMucmVtb3ZlKGkpID09PiBqYXZhLnV0aWwuTGlzdC5yZW1vdmUoaW50KQorICBMaW5lIDg3KSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKQorICBMaW5lIDg4KSBmaWVsZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg4KSBmaWVsZC5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldE5hbWUoKQorICBMaW5lIDkyKSB0eXBlRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKQorICBMaW5lIDkzKSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5oYXNGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmhhc0ZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTMpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDk0KSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEZpZWxkKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgOTQpIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDk1KSByZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbi5yZXBsYWNlVHlwZShhbmNlc3Rvci5nZXRGaWVsZFR5cGUobmFtZSkuZ2V0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbi5yZXBsYWNlVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA5NSkgYW5jZXN0b3IuZ2V0RmllbGRUeXBlKG5hbWUpLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA5NSkgYW5jZXN0b3IuZ2V0RmllbGRUeXBlKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRGaWVsZFR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMDIpIGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpCisgIExpbmUgMTAzKSBmaWVsZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwMykgZmllbGQuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZC5nZXROYW1lKCkKKyAgTGluZSAxMDcpIGdldFN1cGVyQ2xhc3MoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAxMTEpIHN1cGVyY2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaGFzRmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5oYXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExMSkgc3VwZXJjbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxMTcpIGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpCisgIExpbmUgMTE4KSBmaWVsZHMuYWRkKG5ldyBSZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbihmaWVsZCwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZChFKQorICBMaW5lIDEyMCkgdHlwZURlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkKKyAgTGluZSAxMjEpIGZpZWxkcy5hZGRBbGwoYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0QWxsRmllbGRzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlMaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMTIxKSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRBbGxGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpCisgIExpbmUgMTIxKSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxMjcpIEFycmF5cy5zdHJlYW0oY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpLmZpbHRlcihtIC0+ICFtLmlzU3ludGhldGljKCkgJiYgIW0uaXNCcmlkZ2UoKSkubWFwKG0gLT4gbmV3IFJlZmxlY3Rpb25NZXRob2REZWNsYXJhdGlvbihtLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTI3KSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKS5maWx0ZXIobSAtPiAhbS5pc1N5bnRoZXRpYygpICYmICFtLmlzQnJpZGdlKCkpLm1hcChtIC0+IG5ldyBSZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDEyNykgQXJyYXlzLnN0cmVhbShjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkuZmlsdGVyKG0gLT4gIW0uaXNTeW50aGV0aWMoKSAmJiAhbS5pc0JyaWRnZSgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAxMjcpIEFycmF5cy5zdHJlYW0oY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMTI3KSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpCisgIExpbmUgMTI4KSBtLmlzU3ludGhldGljKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc1N5bnRoZXRpYygpCisgIExpbmUgMTI4KSBtLmlzQnJpZGdlKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc0JyaWRnZSgpCisgIExpbmUgMTMwKSBDb2xsZWN0b3JzLnRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMTM1KSB0aGlzLmNsYXp6LmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTM2KSBwYXJhbXMuYWRkKG5ldyBSZWZsZWN0aW9uVHlwZVBhcmFtZXRlcih0diwgdHJ1ZSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxNDYpIGlzRnVuY3Rpb25hbEludGVyZmFjZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmlzRnVuY3Rpb25hbEludGVyZmFjZSgpCisgIExpbmUgMTQ4KSB0eXBlLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgMTUxKSB0eXBlLmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSAxNTQpIHR5cGUuZGVzY3JpYmUoKS5lcXVhbHModHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTU0KSB0eXBlLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAxNTQpIHR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxNTkpIG90aGVyVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLmNhbkJlQXNzaWduZWRUbyh0eXBlRGVjbGFyYXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2FuQmVBc3NpZ25lZFRvKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikKKyAgTGluZSAxNTkpIG90aGVyVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE2NikgY2xhenouZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpCisgIExpbmUgMTY3KSBhLmFubm90YXRpb25UeXBlKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhjYW5vbmljYWxOYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNjcpIGEuYW5ub3RhdGlvblR5cGUoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNjcpIGEuYW5ub3RhdGlvblR5cGUoKSA9PT4gamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpCisgIExpbmUgMTc1KSBGdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0RnVuY3Rpb25hbE1ldGhvZCh0eXBlRGVjbGFyYXRpb24pLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxNzUpIEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKHR5cGVEZWNsYXJhdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDE3OSkgQXJyYXlzLnN0cmVhbShjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKSkubWFwKG0gLT4gbmV3IFJlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKG0sIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTc5KSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldENvbnN0cnVjdG9ycygpKS5tYXAobSAtPiBuZXcgUmVmbGVjdGlvbkNvbnN0cnVjdG9yRGVjbGFyYXRpb24obSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDE3OSkgQXJyYXlzLnN0cmVhbShjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAxNzkpIGNsYXp6LmdldENvbnN0cnVjdG9ycygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkKKyAgTGluZSAxODEpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDE4NSkgY2xhenouZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSAxODcpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgMTg4KSBPcHRpb25hbC5vZihSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoZGVjbGFyaW5nQ2xhc3MsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMTg4KSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoZGVjbGFyaW5nQ2xhc3MsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoamF2YS5sYW5nLkNsYXNzPD8+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2ViNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMTIxIEBACisgIExpbmUgNjIpIGNsYXp6LmlzSW50ZXJmYWNlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgNjUpIGNsYXp6LmlzUHJpbWl0aXZlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc1ByaW1pdGl2ZSgpCisgIExpbmUgNjgpIGNsYXp6LmlzQXJyYXkoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzQXJyYXkoKQorICBMaW5lIDcxKSBjbGF6ei5pc0VudW0oKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzRW51bSgpCisgIExpbmUgODUpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSA5MCkgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbmNlc3RvcnMoKQorICBMaW5lIDk2KSBnZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA5Nikgby5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxMDApIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHModGhhdC5jbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwMCkgY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTAwKSB0aGF0LmNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEwNykgY2xhenouaGFzaENvZGUoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5oYXNoQ29kZSgpCisgIExpbmUgMTEzKSBjbGF6ei5nZXRQYWNrYWdlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRQYWNrYWdlKCkKKyAgTGluZSAxMTQpIGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5QYWNrYWdlLmdldE5hbWUoKQorICBMaW5lIDExNCkgY2xhenouZ2V0UGFja2FnZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0UGFja2FnZSgpCisgIExpbmUgMTIxKSBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMjIpIGdldFBhY2thZ2VOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmdldFBhY2thZ2VOYW1lKCkKKyAgTGluZSAxMjMpIGNhbm9uaWNhbE5hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBjYW5vbmljYWxOYW1lLmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgMTIzKSBnZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMTIzKSBnZXRQYWNrYWdlTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgMTIzKSBjYW5vbmljYWxOYW1lLmxlbmd0aCgpID09PiBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCisgIExpbmUgMTMwKSBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMzYpIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhpbnQpCisgIExpbmUgMTM2KSBtLmdldE1vZGlmaWVycygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAxMzcpIEFycmF5cy5zdHJlYW0oY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpLmZpbHRlcigobSkgLT4gbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maWx0ZXIoc3RhdGljRmlsdGVyKS5zb3J0ZWQobmV3IE1ldGhvZENvbXBhcmF0b3IoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDEzNykgQXJyYXlzLnN0cmVhbShjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkuZmlsdGVyKChtKSAtPiBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLmZpbHRlcihzdGF0aWNGaWx0ZXIpLnNvcnRlZChuZXcgTWV0aG9kQ29tcGFyYXRvcigpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uc29ydGVkKGphdmEudXRpbC5Db21wYXJhdG9yPD8gc3VwZXIgVD4pCisgIExpbmUgMTM3KSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKS5maWx0ZXIoKG0pIC0+IG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmlsdGVyKHN0YXRpY0ZpbHRlcikgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTM3KSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKS5maWx0ZXIoKG0pIC0+IG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTM3KSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDEzNykgY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDEzNykgbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEzNykgbS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXROYW1lKCkKKyAgTGluZSAxMzgpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDEzOSkgbWV0aG9kLmlzQnJpZGdlKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc0JyaWRnZSgpCisgIExpbmUgMTM5KSBtZXRob2QuaXNTeW50aGV0aWMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmlzU3ludGhldGljKCkKKyAgTGluZSAxNDEpIG1ldGhvZHMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTQzKSBnZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyQ2xhc3MoKQorICBMaW5lIDE0NCkgZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE0NCkgZ2V0U3VwZXJDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAxNDUpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShzdXBlckNsYXNzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE0NikgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDE0NykgbWV0aG9kcy5hZGQocmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTQ3KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxNTApIGdldEludGVyZmFjZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTUxKSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTUxKSBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxNTIpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSAxNTMpIG1ldGhvZHMuYWRkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE1MykgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTU2KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKG1ldGhvZHMsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24+LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE2MikgZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldElkKCkKKyAgTGluZSAxNzMpIEFycmF5cy5zdHJlYW0oY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpLmZpbHRlcigobSkgLT4gbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5zb3J0ZWQobmV3IE1ldGhvZENvbXBhcmF0b3IoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDE3MykgQXJyYXlzLnN0cmVhbShjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkuZmlsdGVyKChtKSAtPiBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLnNvcnRlZChuZXcgTWV0aG9kQ29tcGFyYXRvcigpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uc29ydGVkKGphdmEudXRpbC5Db21wYXJhdG9yPD8gc3VwZXIgVD4pCisgIExpbmUgMTczKSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKS5maWx0ZXIoKG0pIC0+IG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTczKSBBcnJheXMuc3RyZWFtKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDE3MykgY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDE3MykgbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE3MykgbS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXROYW1lKCkKKyAgTGluZSAxNzMpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDE3NCkgbWV0aG9kLmlzQnJpZGdlKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc0JyaWRnZSgpCisgIExpbmUgMTc0KSBtZXRob2QuaXNTeW50aGV0aWMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmlzU3ludGhldGljKCkKKyAgTGluZSAxNzcpIGdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxNzcpIGdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxNzcpIHR5cGVQYXJhbWV0ZXJWYWx1ZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxNzgpIGdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDE3OCkgZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDE3OSkgdHlwZVBhcmFtZXRlclZhbHVlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTgwKSBtZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcih0cFRvUmVwbGFjZSwgbmV3VmFsdWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmVwbGFjZVR5cGVQYXJhbWV0ZXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxODIpIG1ldGhvZHMuYWRkKG1ldGhvZFVzYWdlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTg0KSBnZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyQ2xhc3MoKQorICBMaW5lIDE4NSkgZ2V0U3VwZXJDbGFzcygpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDE4NSkgZ2V0U3VwZXJDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlckNsYXNzKCkKKyAgTGluZSAxODYpIENvbnRleHRIZWxwZXIuc29sdmVNZXRob2RBc1VzYWdlKHN1cGVyQ2xhc3MsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBpbnZva2F0aW9uQ29udGV4dCwgdHlwZVBhcmFtZXRlclZhbHVlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmNvbnRleHRzLkNvbnRleHRIZWxwZXIuc29sdmVNZXRob2RBc1VzYWdlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDE4NykgcmVmLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxODgpIG1ldGhvZHMuYWRkKHJlZi5nZXQoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE4OCkgcmVmLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxOTEpIGdldEludGVyZmFjZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24uZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMTkyKSBDb250ZXh0SGVscGVyLnNvbHZlTWV0aG9kQXNVc2FnZShpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVyVmFsdWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuY29udGV4dHMuQ29udGV4dEhlbHBlci5zb2x2ZU1ldGhvZEFzVXNhZ2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTkyKSBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAxOTMpIHJlZi5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTk0KSBtZXRob2RzLmFkZChyZWYuZ2V0KCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxOTQpIHJlZi5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTk3KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlVXNhZ2UobWV0aG9kcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZVVzYWdlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZT4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjA0KSBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5pc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKQorICBMaW5lIDIwNikgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhnZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDIwNikgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjA2KSBnZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDIwOSkgdGhpcy5jbGF6ei5nZXRTdXBlcmNsYXNzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAyMTApIG5ldyBSZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbihjbGF6ei5nZXRTdXBlcmNsYXNzKCksIHR5cGVTb2x2ZXIpLmNhbkJlQXNzaWduZWRUbyhvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmNhbkJlQXNzaWduZWRUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pCisgIExpbmUgMjEwKSBjbGF6ei5nZXRTdXBlcmNsYXNzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAyMTMpIGNsYXp6LmdldEludGVyZmFjZXMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldEludGVyZmFjZXMoKQorICBMaW5lIDIxNCkgbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpLmNhbkJlQXNzaWduZWRUbyhvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5jYW5CZUFzc2lnbmVkVG8oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDIyNCkgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5pc0Fzc2lnbmFibGVCeSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAyMzQpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMzkpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QWxsRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QWxsRmllbGRzKCkKKyAgTGluZSAyNDQpIGNsYXp6LmdldEZpZWxkcygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0RmllbGRzKCkKKyAgTGluZSAyNDUpIGZpZWxkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQ1KSBmaWVsZC5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldE5hbWUoKQorICBMaW5lIDI0NikgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24oZmllbGQsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMjQ5KSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoVmFsdWVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSAyNTQpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaGFzRGlyZWN0bHlBbm5vdGF0aW9uKGNhbm9uaWNhbE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmhhc0RpcmVjdGx5QW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1OSkgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5oYXNGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5oYXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI2NCkgaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG90aGVyLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDI2OSkgY2xhenouZ2V0U2ltcGxlTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpCisgIExpbmUgMjg5KSBjbGF6ei5pc0ludGVyZmFjZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDI5NCkgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgMjk5KSByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldEludGVyZmFjZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSAzMDQpIGNsYXp6LmlzSW50ZXJmYWNlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgMzA5KSByZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDMxNCkgUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbCh0aGlzLmNsYXp6LmdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChpbnQpCisgIExpbmUgMzE0KSB0aGlzLmNsYXp6LmdldE1vZGlmaWVycygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSAzMTkpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0Q29uc3RydWN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0Q29uc3RydWN0b3JzKCkKKyAgTGluZSAzMjQpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmNvbnRhaW5lclR5cGUoKQorICBMaW5lIDMyOSkgQXJyYXlzLnN0cmVhbSh0aGlzLmNsYXp6LmdldERlY2xhcmVkQ2xhc3NlcygpKS5tYXAoaWMgLT4gUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGljLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMzI5KSBBcnJheXMuc3RyZWFtKHRoaXMuY2xhenouZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpYyAtPiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoaWMsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAzMjkpIEFycmF5cy5zdHJlYW0odGhpcy5jbGF6ei5nZXREZWNsYXJlZENsYXNzZXMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAzMjkpIHRoaXMuY2xhenouZ2V0RGVjbGFyZWRDbGFzc2VzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKQorICBMaW5lIDMzMCkgUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGljLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGphdmEubGFuZy5DbGFzczw/PiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzMxKSBDb2xsZWN0b3JzLnRvU2V0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldCgpCisgIExpbmUgMzQwKSB0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzQwKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkNvbnN0cnVjdG9yRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX1JlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE3OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX1JlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDE3IEBACisgIExpbmUgNDMpIGNvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSA0OCkgY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyQ291bnQoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyQ291bnQoKQorICBMaW5lIDUzKSBnZXROdW1iZXJPZlBhcmFtcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgNTQpIFN0cmluZy5mb3JtYXQoIk5vIHBhcmFtIHdpdGggaW5kZXggJWQuIE51bWJlciBvZiBwYXJhbXM6ICVkIiwgaSwgZ2V0TnVtYmVyT2ZQYXJhbXMoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgNTQpIGdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA1NykgY29uc3RydWN0b3IuaXNWYXJBcmdzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmlzVmFyQXJncygpCisgIExpbmUgNTgpIGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlckNvdW50KCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmdldFBhcmFtZXRlckNvdW50KCkKKyAgTGluZSA2MCkgY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKQorICBMaW5lIDYwKSBjb25zdHJ1Y3Rvci5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkKKyAgTGluZSA2NSkgY29uc3RydWN0b3IuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5nZXROYW1lKCkKKyAgTGluZSA3MCkgUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoaW50KQorICBMaW5lIDcwKSBjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkKKyAgTGluZSA3NSkgQXJyYXlzLnN0cmVhbShjb25zdHJ1Y3Rvci5nZXRUeXBlUGFyYW1ldGVycygpKS5tYXAoKHJlZlRwKSAtPiBuZXcgUmVmbGVjdGlvblR5cGVQYXJhbWV0ZXIocmVmVHAsIGZhbHNlLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDc1KSBBcnJheXMuc3RyZWFtKGNvbnN0cnVjdG9yLmdldFR5cGVQYXJhbWV0ZXJzKCkpLm1hcCgocmVmVHApIC0+IG5ldyBSZWZsZWN0aW9uVHlwZVBhcmFtZXRlcihyZWZUcCwgZmFsc2UsIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSA3NSkgQXJyYXlzLnN0cmVhbShjb25zdHJ1Y3Rvci5nZXRUeXBlUGFyYW1ldGVycygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDc1KSBjb25zdHJ1Y3Rvci5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvci5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgNzUpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX1JlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX1JlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYThmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw0NCBAQAorICBMaW5lIDUyKSBjbGF6ei5pc0ludGVyZmFjZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDU1KSBjbGF6ei5pc1ByaW1pdGl2ZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNQcmltaXRpdmUoKQorICBMaW5lIDU4KSBjbGF6ei5pc0FycmF5KCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0FycmF5KCkKKyAgTGluZSA2MSkgY2xhenouaXNFbnVtKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0VudW0oKQorICBMaW5lIDc1KSBSZWZsZWN0aW9uRmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKHRoaXMuY2xhenouZ2V0TW9kaWZpZXJzKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKGludCkKKyAgTGluZSA3NSkgdGhpcy5jbGF6ei5nZXRNb2RpZmllcnMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldE1vZGlmaWVycygpCisgIExpbmUgODApIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuY29udGFpbmVyVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmNvbnRhaW5lclR5cGUoKQorICBMaW5lIDg1KSBjbGF6ei5nZXRQYWNrYWdlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRQYWNrYWdlKCkKKyAgTGluZSA4NikgY2xhenouZ2V0UGFja2FnZSgpLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLlBhY2thZ2UuZ2V0TmFtZSgpCisgIExpbmUgODYpIGNsYXp6LmdldFBhY2thZ2UoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldFBhY2thZ2UoKQorICBMaW5lIDkzKSBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA5NCkgZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgOTUpIGNhbm9uaWNhbE5hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBjYW5vbmljYWxOYW1lLmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgOTUpIGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSA5NSkgZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkVudW1EZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgOTUpIGNhbm9uaWNhbE5hbWUubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSAxMDIpIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEwNykgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbmNlc3RvcnMoKQorICBMaW5lIDExMikgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExNykgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5oYXNGaWVsZChuYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5oYXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEyMikgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbGxGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRBbGxGaWVsZHMoKQorICBMaW5lIDEyNykgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXREZWNsYXJlZE1ldGhvZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDEzMikgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5pc0Fzc2lnbmFibGVCeSh0eXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMzcpIGlzQXNzaWduYWJsZUJ5KG5ldyBSZWZlcmVuY2VUeXBlSW1wbChvdGhlciwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE0MikgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5oYXNEaXJlY3RseUFubm90YXRpb24ocXVhbGlmaWVkTmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaGFzRGlyZWN0bHlBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ3KSBjbGF6ei5nZXRTaW1wbGVOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgTGluZSAxNTIpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTU2KSBSZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyLCB0aGlzLCBjbGF6eikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuQ2xhc3MpCisgIExpbmUgMTYxKSBSZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kQXNVc2FnZShuYW1lLCBwYXJhbWV0ZXJUeXBlcywgdHlwZVNvbHZlciwgaW52b2thdGlvbkNvbnRleHQsIHR5cGVQYXJhbWV0ZXJWYWx1ZXMsIHRoaXMsIGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEFzVXNhZ2UoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5DbGFzcykKKyAgTGluZSAxNjMpIHJlcy5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTY2KSByZXMuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDE3MCkgbWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlKGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlKGludCkKKyAgTGluZSAxNzMpIHBhcmFtZXRlcnMuYWRkKGluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDE3MykgaW5mZXJlbmNlQ29udGV4dC5hZGRQYWlyKGZvcm1hbFR5cGUsIGFjdHVhbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTc3KSBpbmZlcmVuY2VDb250ZXh0LmFkZFNpbmdsZShtZXRob2RVc2FnZS5yZXR1cm5UeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQuYWRkU2luZ2xlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE3NykgbWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpCisgIExpbmUgMTc4KSBwYXJhbWV0ZXJzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTc5KSBtZXRob2RVc2FnZS5yZXBsYWNlUGFyYW1UeXBlKGosIGluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShwYXJhbWV0ZXJzLmdldChqKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmVwbGFjZVBhcmFtVHlwZShpbnQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE3OSkgaW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKHBhcmFtZXRlcnMuZ2V0KGopKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTc5KSBwYXJhbWV0ZXJzLmdldChqKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxODEpIG1ldGhvZFVzYWdlLnJlcGxhY2VSZXR1cm5UeXBlKGluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShyZXR1cm5UeXBlKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5yZXBsYWNlUmV0dXJuVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxODEpIGluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShyZXR1cm5UeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTgyKSBPcHRpb25hbC5vZihtZXRob2RVc2FnZSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDE4NCkgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uRmFjdG9yeS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkZhY3RvcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjY3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkZhY3RvcnkudHh0CkBAIC0wLDAgKzEsNDggQEAKKyAgTGluZSAzOSkgY2xhenouaXNBcnJheSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNBcnJheSgpCisgIExpbmUgNDEpIGNsYXp6LmlzUHJpbWl0aXZlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc1ByaW1pdGl2ZSgpCisgIExpbmUgNDMpIGNsYXp6LmlzSW50ZXJmYWNlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgNDUpIGNsYXp6LmlzRW51bSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNFbnVtKCkKKyAgTGluZSA1NSkgdHYuZ2V0R2VuZXJpY0RlY2xhcmF0aW9uKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZS5nZXRHZW5lcmljRGVjbGFyYXRpb24oKQorICBMaW5lIDYwKSB0eXBlVXNhZ2VGb3IocHQuZ2V0UmF3VHlwZSgpLCB0eXBlU29sdmVyKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA2MCkgdHlwZVVzYWdlRm9yKHB0LmdldFJhd1R5cGUoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhLmxhbmcucmVmbGVjdC5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MCkgcHQuZ2V0UmF3VHlwZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZS5nZXRSYXdUeXBlKCkKKyAgTGluZSA2MikgYWN0dWFsVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgNjIpIEFycmF5cy5hc0xpc3QocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5hc0xpc3QoVC4uLikKKyAgTGluZSA2MikgcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkKKyAgTGluZSA2NCkgcmF3VHlwZS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiB0eXBlVXNhZ2VGb3IoYWN0dWFsVHlwZXMucmVtb3ZlKDApLCB0eXBlU29sdmVyKSkuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNjQpIHJhd1R5cGUudHJhbnNmb3JtVHlwZVBhcmFtZXRlcnModHAgLT4gdHlwZVVzYWdlRm9yKGFjdHVhbFR5cGVzLnJlbW92ZSgwKSwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZVRyYW5zZm9ybWVyKQorICBMaW5lIDY0KSB0eXBlVXNhZ2VGb3IoYWN0dWFsVHlwZXMucmVtb3ZlKDApLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmEubGFuZy5yZWZsZWN0LlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDY0KSBhY3R1YWxUeXBlcy5yZW1vdmUoMCkgPT0+IGphdmEudXRpbC5MaXN0LnJlbW92ZShpbnQpCisgIExpbmUgNjgpIGMuaXNQcmltaXRpdmUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzUHJpbWl0aXZlKCkKKyAgTGluZSA2OSkgYy5nZXROYW1lKCkuZXF1YWxzKFZvaWQuVFlQRS5nZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY5KSBjLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldE5hbWUoKQorICBMaW5lIDY5KSBWb2lkLlRZUEUuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgNzIpIFByaW1pdGl2ZVR5cGUuYnlOYW1lKGMuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlByaW1pdGl2ZVR5cGUuYnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzIpIGMuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0TmFtZSgpCisgIExpbmUgNzQpIGMuaXNBcnJheSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNBcnJheSgpCisgIExpbmUgNzUpIHR5cGVVc2FnZUZvcihjLmdldENvbXBvbmVudFR5cGUoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhLmxhbmcucmVmbGVjdC5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3NSkgYy5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA3NykgdHlwZURlY2xhcmF0aW9uRm9yKGMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoamF2YS5sYW5nLkNsYXNzPD8+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4MSkgdHlwZVVzYWdlRm9yKGdlbmVyaWNBcnJheVR5cGUuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhLmxhbmcucmVmbGVjdC5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4MSkgZ2VuZXJpY0FycmF5VHlwZS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkKKyAgTGluZSA4NCkgd2lsZGNhcmRUeXBlLmdldExvd2VyQm91bmRzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZS5nZXRMb3dlckJvdW5kcygpCisgIExpbmUgODQpIHdpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGUuZ2V0VXBwZXJCb3VuZHMoKQorICBMaW5lIDg1KSB3aWxkY2FyZFR5cGUuZ2V0VXBwZXJCb3VuZHMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKCkKKyAgTGluZSA4NSkgd2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKClbMF0uZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4NSkgd2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKClbMF0uZ2V0VHlwZU5hbWUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuVHlwZS5nZXRUeXBlTmFtZSgpCisgIExpbmUgODUpIHdpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGUuZ2V0VXBwZXJCb3VuZHMoKQorICBMaW5lIDg5KSB3aWxkY2FyZFR5cGUuZ2V0TG93ZXJCb3VuZHMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlLmdldExvd2VyQm91bmRzKCkKKyAgTGluZSA5MCkgd2lsZGNhcmRUeXBlLmdldExvd2VyQm91bmRzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZS5nZXRMb3dlckJvdW5kcygpCisgIExpbmUgOTMpIFdpbGRjYXJkLnN1cGVyQm91bmQodHlwZVVzYWdlRm9yKHdpbGRjYXJkVHlwZS5nZXRMb3dlckJvdW5kcygpWzBdLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5zdXBlckJvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDkzKSB0eXBlVXNhZ2VGb3Iod2lsZGNhcmRUeXBlLmdldExvd2VyQm91bmRzKClbMF0sIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoamF2YS5sYW5nLnJlZmxlY3QuVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgOTMpIHdpbGRjYXJkVHlwZS5nZXRMb3dlckJvdW5kcygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5XaWxkY2FyZFR5cGUuZ2V0TG93ZXJCb3VuZHMoKQorICBMaW5lIDk1KSB3aWxkY2FyZFR5cGUuZ2V0VXBwZXJCb3VuZHMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKCkKKyAgTGluZSA5Nikgd2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpCisgIExpbmUgOTkpIFdpbGRjYXJkLmV4dGVuZHNCb3VuZCh0eXBlVXNhZ2VGb3Iod2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKClbMF0sIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmV4dGVuZHNCb3VuZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA5OSkgdHlwZVVzYWdlRm9yKHdpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpWzBdLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmEubGFuZy5yZWZsZWN0LlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDk5KSB3aWxkY2FyZFR5cGUuZ2V0VXBwZXJCb3VuZHMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlLmdldFVwcGVyQm91bmRzKCkKKyAgTGluZSAxMDMpIHR5cGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMDMpIHR5cGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTA4KSBNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1B1YmxpYyhpbnQpCisgIExpbmUgMTEwKSBNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1Byb3RlY3RlZChpbnQpCisgIExpbmUgMTEyKSBNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNQcml2YXRlKGludCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uRmllbGREZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTI5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMTAgQEAKKyAgTGluZSA0MCkgY2FsY1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24uY2FsY1R5cGUoKQorICBMaW5lIDU2KSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IoZmllbGQuZ2V0R2VuZXJpY1R5cGUoKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhLmxhbmcucmVmbGVjdC5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1NikgZmllbGQuZ2V0R2VuZXJpY1R5cGUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0R2VuZXJpY1R5cGUoKQorICBMaW5lIDYxKSBmaWVsZC5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldE5hbWUoKQorICBMaW5lIDY2KSBNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3RhdGljKGludCkKKyAgTGluZSA2NikgZmllbGQuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldE1vZGlmaWVycygpCisgIExpbmUgNzYpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVEZWNsYXJhdGlvbkZvcihmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGphdmEubGFuZy5DbGFzczw/PiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzYpIGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSA5NSkgUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChmaWVsZC5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoaW50KQorICBMaW5lIDk1KSBmaWVsZC5nZXRNb2RpZmllcnMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuZ2V0TW9kaWZpZXJzKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX1JlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlMjQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsODEgQEAKKyAgTGluZSA1NikgY2xhenouaXNJbnRlcmZhY2UoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzSW50ZXJmYWNlKCkKKyAgTGluZSA3MSkgaXNBc3NpZ25hYmxlQnkobmV3IFJlZmVyZW5jZVR5cGVJbXBsKG90aGVyLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA3NikgY2xhenouZ2V0UGFja2FnZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0UGFja2FnZSgpCisgIExpbmUgNzcpIGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5QYWNrYWdlLmdldE5hbWUoKQorICBMaW5lIDc3KSBjbGF6ei5nZXRQYWNrYWdlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRQYWNrYWdlKCkKKyAgTGluZSA4NCkgY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgODUpIGdldFBhY2thZ2VOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgODYpIGNhbm9uaWNhbE5hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgKyAxLCBjYW5vbmljYWxOYW1lLmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgODYpIGdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgPT0+IGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKKyAgTGluZSA4NikgZ2V0UGFja2FnZU5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uLmdldFBhY2thZ2VOYW1lKCkKKyAgTGluZSA4NikgY2Fub25pY2FsTmFtZS5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDkzKSBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA5OCkgUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZChuYW1lLCBwYXJhbWV0ZXJUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlciwgdGhpcywgY2xhenopID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLkNsYXNzKQorICBMaW5lIDEwNSkgY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTIwKSBjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKHRoYXQuY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjApIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEyMCkgdGhhdC5jbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMjIpIGdldFR5cGVQYXJhbWV0ZXJzKCkuZXF1YWxzKHRoYXQuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEyMikgZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxMjIpIHRoYXQuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxMzEpIGNsYXp6Lmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDEzNSkgUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEFzVXNhZ2UobmFtZSwgcGFyYW1ldGVyVHlwZXMsIHR5cGVTb2x2ZXIsIGludm9rYXRpb25Db250ZXh0LCB0eXBlUGFyYW1ldGVyVmFsdWVzLCB0aGlzLCBjbGF6eikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RBc1VzYWdlKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuQ2xhc3MpCisgIExpbmUgMTM3KSByZXMuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDE0MCkgcmVzLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxNDQpIG1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpbnQpCisgIExpbmUgMTQ3KSBwYXJhbWV0ZXJzLmFkZChpbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoZm9ybWFsVHlwZSwgYWN0dWFsVHlwZSkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAxNDcpIGluZmVyZW5jZUNvbnRleHQuYWRkUGFpcihmb3JtYWxUeXBlLCBhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFBhaXIoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE1MSkgaW5mZXJlbmNlQ29udGV4dC5hZGRTaW5nbGUobWV0aG9kVXNhZ2UucmV0dXJuVHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmFkZFNpbmdsZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNTEpIG1ldGhvZFVzYWdlLnJldHVyblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJldHVyblR5cGUoKQorICBMaW5lIDE1MikgcGFyYW1ldGVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE1MykgbWV0aG9kVXNhZ2UucmVwbGFjZVBhcmFtVHlwZShqLCBpbmZlcmVuY2VDb250ZXh0LnJlc29sdmUocGFyYW1ldGVycy5nZXQoaikpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJlcGxhY2VQYXJhbVR5cGUoaW50LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNTMpIGluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShwYXJhbWV0ZXJzLmdldChqKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE1MykgcGFyYW1ldGVycy5nZXQoaikgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTU1KSBtZXRob2RVc2FnZS5yZXBsYWNlUmV0dXJuVHlwZShpbmZlcmVuY2VDb250ZXh0LnJlc29sdmUocmV0dXJuVHlwZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmVwbGFjZVJldHVyblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTU1KSBpbmZlcmVuY2VDb250ZXh0LnJlc29sdmUocmV0dXJuVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZXNvbHZlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE1NikgT3B0aW9uYWwub2YobWV0aG9kVXNhZ2UpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAxNTgpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgMTY4KSBpc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi5pc0Z1bmN0aW9uYWxJbnRlcmZhY2UoKQorICBMaW5lIDE3MCkgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhnZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE3MCkgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTcwKSBnZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxNzMpIHRoaXMuY2xhenouZ2V0U3VwZXJjbGFzcygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0U3VwZXJjbGFzcygpCisgIExpbmUgMTc0KSBuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKGNsYXp6LmdldFN1cGVyY2xhc3MoKSwgdHlwZVNvbHZlcikuY2FuQmVBc3NpZ25lZFRvKG90aGVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uLmNhbkJlQXNzaWduZWRUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pCisgIExpbmUgMTc0KSBjbGF6ei5nZXRTdXBlcmNsYXNzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRTdXBlcmNsYXNzKCkKKyAgTGluZSAxNzcpIGNsYXp6LmdldEludGVyZmFjZXMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldEludGVyZmFjZXMoKQorICBMaW5lIDE3OCkgbmV3IFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbihpbnRlcmZhemUsIHR5cGVTb2x2ZXIpLmNhbkJlQXNzaWduZWRUbyhvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5jYW5CZUFzc2lnbmVkVG8oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDE4Mykgb3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxODMpIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE4MykgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE5NikgaXNGdW5jdGlvbmFsSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24uaXNGdW5jdGlvbmFsSW50ZXJmYWNlKCkKKyAgTGluZSAxOTgpIHR5cGUuaXNBcnJheSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0FycmF5KCkKKyAgTGluZSAyMDEpIHR5cGUuaXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNQcmltaXRpdmUoKQorICBMaW5lIDIwNCkgdHlwZS5kZXNjcmliZSgpLmVxdWFscyhnZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDIwNCkgdHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMjA0KSBnZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAyMDkpIG90aGVyVHlwZURlY2xhcmF0aW9uLmdldFR5cGVEZWNsYXJhdGlvbigpLmNhbkJlQXNzaWduZWRUbyh0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNhbkJlQXNzaWduZWRUbyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pCisgIExpbmUgMjA5KSBvdGhlclR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAyMjIpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMjcpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QWxsRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QWxsRmllbGRzKCkKKyAgTGluZSAyMzIpIGNsYXp6LmdldEZpZWxkcygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0RmllbGRzKCkKKyAgTGluZSAyMzMpIGZpZWxkLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjMzKSBmaWVsZC5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmdldE5hbWUoKQorICBMaW5lIDIzNCkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChuZXcgUmVmbGVjdGlvbkZpZWxkRGVjbGFyYXRpb24oZmllbGQsIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMjM3KSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoVmFsdWVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSAyNDIpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0QW5jZXN0b3JzKCkKKyAgTGluZSAyNDcpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgTGluZSAyNTIpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaGFzRmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaGFzRmllbGQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyNTcpIGNsYXp6LmdldFNpbXBsZU5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldFNpbXBsZU5hbWUoKQorICBMaW5lIDI2OCkgY2xhenouZ2V0SW50ZXJmYWNlcygpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0SW50ZXJmYWNlcygpCisgIExpbmUgMjY5KSByZXMuYWRkKG5ldyBSZWZlcmVuY2VUeXBlSW1wbChuZXcgUmVmbGVjdGlvbkludGVyZmFjZURlY2xhcmF0aW9uKGksIHR5cGVTb2x2ZXIpLCB0eXBlU29sdmVyKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDI3NikgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5jb250YWluZXJUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuY29udGFpbmVyVHlwZSgpCisgIExpbmUgMjgxKSBBcnJheXMuc3RyZWFtKHRoaXMuY2xhenouZ2V0RGVjbGFyZWRDbGFzc2VzKCkpLm1hcChpYyAtPiBSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoaWMsIHR5cGVTb2x2ZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAyODEpIEFycmF5cy5zdHJlYW0odGhpcy5jbGF6ei5nZXREZWNsYXJlZENsYXNzZXMoKSkubWFwKGljIC0+IFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVEZWNsYXJhdGlvbkZvcihpYywgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDI4MSkgQXJyYXlzLnN0cmVhbSh0aGlzLmNsYXp6LmdldERlY2xhcmVkQ2xhc3NlcygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDI4MSkgdGhpcy5jbGF6ei5nZXREZWNsYXJlZENsYXNzZXMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpCisgIExpbmUgMjgyKSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoaWMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRmFjdG9yeS50eXBlRGVjbGFyYXRpb25Gb3IoamF2YS5sYW5nLkNsYXNzPD8+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyODMpIENvbGxlY3RvcnMudG9TZXQoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvU2V0KCkKKyAgTGluZSAyOTMpIHJlZmxlY3Rpb25DbGFzc0FkYXB0ZXIuaGFzRGlyZWN0bHlBbm5vdGF0aW9uKGNhbm9uaWNhbE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmhhc0RpcmVjdGx5QW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI5OCkgcmVmbGVjdGlvbkNsYXNzQWRhcHRlci5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NBZGFwdGVyLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAzMDMpIFJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwodGhpcy5jbGF6ei5nZXRNb2RpZmllcnMoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5Lm1vZGlmaWVyc1RvQWNjZXNzTGV2ZWwoaW50KQorICBMaW5lIDMwMykgdGhpcy5jbGF6ei5nZXRNb2RpZmllcnMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldE1vZGlmaWVycygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbk1ldGhvZERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uTWV0aG9kRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTMyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbk1ldGhvZERlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDMwIEBACisgIExpbmUgNDIpIG1ldGhvZC5pc1N5bnRoZXRpYygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaXNTeW50aGV0aWMoKQorICBMaW5lIDQyKSBtZXRob2QuaXNCcmlkZ2UoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmlzQnJpZGdlKCkKKyAgTGluZSA1MCkgbWV0aG9kLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDc3KSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNJbnRlcmZhY2UoKQorICBMaW5lIDc3KSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSA3OCkgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpCisgIExpbmUgODApIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmlzRW51bSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNFbnVtKCkKKyAgTGluZSA4MCkgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpCisgIExpbmUgODEpIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKQorICBMaW5lIDgzKSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkKKyAgTGluZSA4OSkgUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKG1ldGhvZC5nZXRHZW5lcmljUmV0dXJuVHlwZSgpLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKGphdmEubGFuZy5yZWZsZWN0LlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDg5KSBtZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkKKyAgTGluZSA5NCkgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpCisgIExpbmUgMTAwKSBtZXRob2QuaXNWYXJBcmdzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc1ZhckFyZ3MoKQorICBMaW5lIDEwMSkgbWV0aG9kLmdldFBhcmFtZXRlckNvdW50KCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRQYXJhbWV0ZXJDb3VudCgpCisgIExpbmUgMTAzKSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkKKyAgTGluZSAxMDMpIG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpCisgIExpbmUgMTA4KSBBcnJheXMuc3RyZWFtKG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVycygpKS5tYXAoKHJlZlRwKSAtPiBuZXcgUmVmbGVjdGlvblR5cGVQYXJhbWV0ZXIocmVmVHAsIGZhbHNlLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDEwOCkgQXJyYXlzLnN0cmVhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKSkubWFwKChyZWZUcCkgLT4gbmV3IFJlZmxlY3Rpb25UeXBlUGFyYW1ldGVyKHJlZlRwLCBmYWxzZSwgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDEwOCkgQXJyYXlzLnN0cmVhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgPT0+IGphdmEudXRpbC5BcnJheXMuc3RyZWFtKFRbXSkKKyAgTGluZSAxMDgpIG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVycygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDEwOCkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTEyKSBuZXcgTWV0aG9kRGVjbGFyYXRpb25Db21tb25Mb2dpYyh0aGlzLCB0eXBlU29sdmVyKS5yZXNvbHZlVHlwZVZhcmlhYmxlcyhjb250ZXh0LCBwYXJhbWV0ZXJUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuZGVjbGFyYXRpb25zLmNvbW1vbi5NZXRob2REZWNsYXJhdGlvbkNvbW1vbkxvZ2ljLnJlc29sdmVUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAxMTcpIE1vZGlmaWVyLmlzQWJzdHJhY3QobWV0aG9kLmdldE1vZGlmaWVycygpKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChpbnQpCisgIExpbmUgMTE3KSBtZXRob2QuZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRNb2RpZmllcnMoKQorICBMaW5lIDEyMikgbWV0aG9kLmlzRGVmYXVsdCgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaXNEZWZhdWx0KCkKKyAgTGluZSAxMjcpIE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3RhdGljKGludCkKKyAgTGluZSAxMjcpIG1ldGhvZC5nZXRNb2RpZmllcnMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE1vZGlmaWVycygpCisgIExpbmUgMTMyKSBSZWZsZWN0aW9uRmFjdG9yeS5tb2RpZmllcnNUb0FjY2Vzc0xldmVsKHRoaXMubWV0aG9kLmdldE1vZGlmaWVycygpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkubW9kaWZpZXJzVG9BY2Nlc3NMZXZlbChpbnQpCisgIExpbmUgMTMyKSB0aGlzLm1ldGhvZC5nZXRNb2RpZmllcnMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE1vZGlmaWVycygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvbk1ldGhvZFJlc29sdXRpb25Mb2dpYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhNDk3NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnR4dApAQCAtMCwwICsxLDg1IEBACisgIExpbmUgNDkpIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpID09PiBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1N0YXRpYyhpbnQpCisgIExpbmUgNDkpIG0uZ2V0TW9kaWZpZXJzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRNb2RpZmllcnMoKQorICBMaW5lIDUwKSBjbGF6ei5nZXRNZXRob2RzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRNZXRob2RzKCkKKyAgTGluZSA1MSkgbWV0aG9kLmlzQnJpZGdlKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc0JyaWRnZSgpCisgIExpbmUgNTEpIG1ldGhvZC5pc1N5bnRoZXRpYygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaXNTeW50aGV0aWMoKQorICBMaW5lIDUxKSBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MSkgbWV0aG9kLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDUxKSBzdGF0aWNPbmx5Q2hlY2sudGVzdChtZXRob2QpID09PiBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlLnRlc3QoVCkKKyAgTGluZSA1MykgbWV0aG9kcy5hZGQobWV0aG9kRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1Nikgc2NvcGVUeXBlLmdldEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkKKyAgTGluZSA1NykgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBwYXJhbWV0ZXJUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU3KSBhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSA1OCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDU5KSBtZXRob2RzLmFkZChyZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1OSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgNjMpIHNjb3BlVHlwZS5nZXRBbmNlc3RvcnMoKS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDYzKSBzY29wZVR5cGUuZ2V0QW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKQorICBMaW5lIDY1KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUob2JqZWN0Q2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCksIG5hbWUsIHBhcmFtZXRlclR5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjUpIG9iamVjdENsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDY2KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgNjcpIG1ldGhvZHMuYWRkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDY3KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA3MCkgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShtZXRob2RzLCBuYW1lLCBwYXJhbWV0ZXJUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uPiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA3NikgdHlwZVBhcmFtZXRlclZhbHVlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDc2KSBzY29wZVR5cGUuZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDc2KSBzY29wZVR5cGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA3OCkgc2NvcGVUeXBlLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA3OCkgc2NvcGVUeXBlLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgODEpIHNjb3BlVHlwZS5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgODEpIHNjb3BlVHlwZS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDgyKSB0eXBlUGFyYW1ldGVyVmFsdWVzLmFkZChuZXcgUmVmZXJlbmNlVHlwZUltcGwobmV3IFJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uKE9iamVjdC5jbGFzcywgdHlwZVNvbHZlciksIHR5cGVTb2x2ZXIpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgODcpIGNsYXp6LmdldE1ldGhvZHMoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldE1ldGhvZHMoKQorICBMaW5lIDg4KSBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4OCkgbWV0aG9kLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDg4KSBtZXRob2QuaXNCcmlkZ2UoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmlzQnJpZGdlKCkKKyAgTGluZSA4OCkgbWV0aG9kLmlzU3ludGhldGljKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pc1N5bnRoZXRpYygpCisgIExpbmUgOTApIHJlcGxhY2VQYXJhbXModHlwZVBhcmFtZXRlclZhbHVlcywgc2NvcGVUeXBlLCBtZXRob2REZWNsYXJhdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25NZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVBhcmFtcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24pCisgIExpbmUgOTEpIG1ldGhvZHMuYWRkKG1ldGhvZFVzYWdlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgOTYpIHNjb3BlVHlwZS5nZXRBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFuY2VzdG9ycygpCisgIExpbmUgOTcpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShhbmNlc3Rvci5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA5NykgYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgOTgpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA5OSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTAwKSByZXBsYWNlUGFyYW1zKHR5cGVQYXJhbWV0ZXJWYWx1ZXMsIGFuY2VzdG9yLmdldFR5cGVEZWNsYXJhdGlvbigpLCBjb3JyZXNwb25kaW5nRGVjbGFyYXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnJlcGxhY2VQYXJhbXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uKQorICBMaW5lIDEwMCkgYW5jZXN0b3IuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTAxKSBtZXRob2RzLmFkZChtZXRob2RVc2FnZSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDEwNSkgc2NvcGVUeXBlLmdldEFuY2VzdG9ycygpLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgMTA1KSBzY29wZVR5cGUuZ2V0QW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbmNlc3RvcnMoKQorICBMaW5lIDEwNykgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnNvbHZlTWV0aG9kSW5UeXBlKG9iamVjdENsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuc29sdmVNZXRob2RJblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEwNykgb2JqZWN0Q2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTA4KSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTA5KSByZXBsYWNlUGFyYW1zKHR5cGVQYXJhbWV0ZXJWYWx1ZXMsIG9iamVjdENsYXNzLmdldFR5cGVEZWNsYXJhdGlvbigpLCByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnJlcGxhY2VQYXJhbXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uKQorICBMaW5lIDEwOSkgb2JqZWN0Q2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMTA5KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMTApIG1ldGhvZHMuYWRkKHVzYWdlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgMTE1KSBhcmd1bWVudHNUeXBlcy5zdHJlYW0oKS5tYXAoKHB0KSAtPiB7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHRwIDogc2NvcGVUeXBlLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgcHQgPSBwdC5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgZmluYWxUeXBlUGFyYW1ldGVyVmFsdWVzLmdldChpKSk7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIHB0OworfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDExNSkgYXJndW1lbnRzVHlwZXMuc3RyZWFtKCkubWFwKChwdCkgLT4geworICAgIGludCBpID0gMDsKKyAgICBmb3IgKFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB0cCA6IHNjb3BlVHlwZS5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisgICAgICAgIHB0ID0gcHQucmVwbGFjZVR5cGVWYXJpYWJsZXModHAsIGZpbmFsVHlwZVBhcmFtZXRlclZhbHVlcy5nZXQoaSkpOworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBwdDsKK30pID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDExNSkgYXJndW1lbnRzVHlwZXMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTE3KSBzY29wZVR5cGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxMTgpIHB0LnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBmaW5hbFR5cGVQYXJhbWV0ZXJWYWx1ZXMuZ2V0KGkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMTgpIGZpbmFsVHlwZVBhcmFtZXRlclZhbHVlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTIyKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxMjMpIE1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGVVc2FnZShtZXRob2RzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuZmluZE1vc3RBcHBsaWNhYmxlVXNhZ2UoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlPiwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMzEpIHR5cGVQYXJhbWV0ZXJWYWx1ZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxMzEpIHR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTMxKSB0eXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxMzIpIHR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDEzMykgbWV0aG9kVXNhZ2UucmVwbGFjZVR5cGVQYXJhbWV0ZXIodHAsIHR5cGVQYXJhbWV0ZXJWYWx1ZXMuZ2V0KGkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJlcGxhY2VUeXBlUGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTMzKSB0eXBlUGFyYW1ldGVyVmFsdWVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMzgpIG1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTM5KSBtZXRob2RVc2FnZS5yZXBsYWNlVHlwZVBhcmFtZXRlcihtZXRob2RUeXBlUGFyYW1ldGVyLCBuZXcgVHlwZVZhcmlhYmxlKG1ldGhvZFR5cGVQYXJhbWV0ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJlcGxhY2VUeXBlUGFyYW1ldGVyKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvblBhcmFtZXRlckRlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uUGFyYW1ldGVyRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWEzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvblBhcmFtZXRlckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxIEBACisgIExpbmUgNzMpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihnZW5lcmljVHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhLmxhbmcucmVmbGVjdC5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9SZWZsZWN0aW9uVHlwZVBhcmFtZXRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvblR5cGVQYXJhbWV0ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YWExNTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfUmVmbGVjdGlvblR5cGVQYXJhbWV0ZXIudHh0CkBAIC0wLDAgKzEsMjUgQEAKKyAgTGluZSA0NCkgdHlwZVZhcmlhYmxlLmdldEdlbmVyaWNEZWNsYXJhdGlvbigpID09PiBqYXZhLmxhbmcucmVmbGVjdC5UeXBlVmFyaWFibGUuZ2V0R2VuZXJpY0RlY2xhcmF0aW9uKCkKKyAgTGluZSA0NikgUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKChDbGFzcykgZ2VuZXJpY0RlY2xhcmF0aW9uLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGphdmEubGFuZy5DbGFzczw/PiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjMpIGdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhhdC5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYzKSBnZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA2MykgdGhhdC5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA2NikgZGVjbGFyZWRPblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25UeXBlKCkKKyAgTGluZSA2NikgdGhhdC5kZWNsYXJlZE9uVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPblR5cGUoKQorICBMaW5lIDY5KSBkZWNsYXJlZE9uTWV0aG9kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uTWV0aG9kKCkKKyAgTGluZSA2OSkgdGhhdC5kZWNsYXJlZE9uTWV0aG9kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uTWV0aG9kKCkKKyAgTGluZSA3OCkgdHlwZVZhcmlhYmxlLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDc5KSBjb250YWluZXIuaGFzaENvZGUoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5oYXNoQ29kZSgpCisgIExpbmUgODUpIHR5cGVWYXJpYWJsZS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZS5nZXROYW1lKCkKKyAgTGluZSA5MSkgKChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24pIGNvbnRhaW5lcikuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgOTMpICgoTWV0aG9kTGlrZURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkKKyAgTGluZSAxMDApICgoUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKSBjb250YWluZXIpLmdldElkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRJZCgpCisgIExpbmUgMTAyKSAoKE1ldGhvZExpa2VEZWNsYXJhdGlvbikgY29udGFpbmVyKS5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpCisgIExpbmUgMTEzKSBBcnJheXMuc3RyZWFtKHR5cGVWYXJpYWJsZS5nZXRCb3VuZHMoKSkubWFwKChyZWZCKSAtPiBCb3VuZC5leHRlbmRzQm91bmQoUmVmbGVjdGlvbkZhY3RvcnkudHlwZVVzYWdlRm9yKHJlZkIsIHR5cGVTb2x2ZXIpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDExMykgQXJyYXlzLnN0cmVhbSh0eXBlVmFyaWFibGUuZ2V0Qm91bmRzKCkpLm1hcCgocmVmQikgLT4gQm91bmQuZXh0ZW5kc0JvdW5kKFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihyZWZCLCB0eXBlU29sdmVyKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDExMykgQXJyYXlzLnN0cmVhbSh0eXBlVmFyaWFibGUuZ2V0Qm91bmRzKCkpID09PiBqYXZhLnV0aWwuQXJyYXlzLnN0cmVhbShUW10pCisgIExpbmUgMTEzKSB0eXBlVmFyaWFibGUuZ2V0Qm91bmRzKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZS5nZXRCb3VuZHMoKQorICBMaW5lIDExMykgQm91bmQuZXh0ZW5kc0JvdW5kKFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihyZWZCLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5leHRlbmRzQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTEzKSBSZWZsZWN0aW9uRmFjdG9yeS50eXBlVXNhZ2VGb3IocmVmQiwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25GYWN0b3J5LnR5cGVVc2FnZUZvcihqYXZhLmxhbmcucmVmbGVjdC5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMTMpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDEyNikgT3B0aW9uYWwub2YoKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbikgY29udGFpbmVyKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMTI4KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX2NvbXBhcmF0b3JzX0NsYXNzQ29tcGFyYXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfY29tcGFyYXRvcnNfQ2xhc3NDb21wYXJhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI5YWU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVmbGVjdGlvbm1vZGVsX2NvbXBhcmF0b3JzX0NsYXNzQ29tcGFyYXRvci50eHQKQEAgLTAsMCArMSwxNSBAQAorICBMaW5lIDEzKSBvMS5nZXRDYW5vbmljYWxOYW1lKCkuY29tcGFyZVRvKG8yLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuY29tcGFyZVRvKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTMpIG8xLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDEzKSBvMi5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxNSkgQm9vbGVhbi5jb21wYXJlKG8xLmlzQW5ub3RhdGlvbigpLCBvMi5pc0Fubm90YXRpb24oKSkgPT0+IGphdmEubGFuZy5Cb29sZWFuLmNvbXBhcmUoYm9vbGVhbiwgYm9vbGVhbikKKyAgTGluZSAxNSkgbzEuaXNBbm5vdGF0aW9uKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0Fubm90YXRpb24oKQorICBMaW5lIDE1KSBvMi5pc0Fubm90YXRpb24oKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzQW5ub3RhdGlvbigpCisgIExpbmUgMTcpIEJvb2xlYW4uY29tcGFyZShvMS5pc0FycmF5KCksIG8yLmlzQXJyYXkoKSkgPT0+IGphdmEubGFuZy5Cb29sZWFuLmNvbXBhcmUoYm9vbGVhbiwgYm9vbGVhbikKKyAgTGluZSAxNykgbzEuaXNBcnJheSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNBcnJheSgpCisgIExpbmUgMTcpIG8yLmlzQXJyYXkoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzQXJyYXkoKQorICBMaW5lIDE5KSBCb29sZWFuLmNvbXBhcmUobzEuaXNFbnVtKCksIG8yLmlzRW51bSgpKSA9PT4gamF2YS5sYW5nLkJvb2xlYW4uY29tcGFyZShib29sZWFuLCBib29sZWFuKQorICBMaW5lIDE5KSBvMS5pc0VudW0oKSA9PT4gamF2YS5sYW5nLkNsYXNzLmlzRW51bSgpCisgIExpbmUgMTkpIG8yLmlzRW51bSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuaXNFbnVtKCkKKyAgTGluZSAyMSkgQm9vbGVhbi5jb21wYXJlKG8xLmlzSW50ZXJmYWNlKCksIG8yLmlzSW50ZXJmYWNlKCkpID09PiBqYXZhLmxhbmcuQm9vbGVhbi5jb21wYXJlKGJvb2xlYW4sIGJvb2xlYW4pCisgIExpbmUgMjEpIG8xLmlzSW50ZXJmYWNlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0ludGVyZmFjZSgpCisgIExpbmUgMjEpIG8yLmlzSW50ZXJmYWNlKCkgPT0+IGphdmEubGFuZy5DbGFzcy5pc0ludGVyZmFjZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfY29tcGFyYXRvcnNfTWV0aG9kQ29tcGFyYXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfY29tcGFyYXRvcnNfTWV0aG9kQ29tcGFyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMGI5NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9jb21wYXJhdG9yc19NZXRob2RDb21wYXJhdG9yLnR4dApAQCAtMCwwICsxLDEyIEBACisgIExpbmUgMTMpIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5jb21wYXJlVG8oamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMykgbzEuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0TmFtZSgpCisgIExpbmUgMTMpIG8yLmdldE5hbWUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmdldE5hbWUoKQorICBMaW5lIDE1KSBvMS5nZXRQYXJhbWV0ZXJDb3VudCgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0UGFyYW1ldGVyQ291bnQoKQorICBMaW5lIDE1KSBvMi5nZXRQYXJhbWV0ZXJDb3VudCgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0UGFyYW1ldGVyQ291bnQoKQorICBMaW5lIDE3KSBvMS5nZXRQYXJhbWV0ZXJDb3VudCgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0UGFyYW1ldGVyQ291bnQoKQorICBMaW5lIDE4KSBuZXcgUGFyYW1ldGVyQ29tcGFyYXRvcigpLmNvbXBhcmUobzEuZ2V0UGFyYW1ldGVycygpW2ldLCBvMi5nZXRQYXJhbWV0ZXJzKClbaV0pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5jb21wYXJhdG9ycy5QYXJhbWV0ZXJDb21wYXJhdG9yLmNvbXBhcmUoamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyLCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXIpCisgIExpbmUgMTgpIG8xLmdldFBhcmFtZXRlcnMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuRXhlY3V0YWJsZS5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSAxOCkgbzIuZ2V0UGFyYW1ldGVycygpID09PiBqYXZhLmxhbmcucmVmbGVjdC5FeGVjdXRhYmxlLmdldFBhcmFtZXRlcnMoKQorICBMaW5lIDIxKSBuZXcgQ2xhc3NDb21wYXJhdG9yKCkuY29tcGFyZShvMS5nZXRSZXR1cm5UeXBlKCksIG8yLmdldFJldHVyblR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLmNvbXBhcmF0b3JzLkNsYXNzQ29tcGFyYXRvci5jb21wYXJlKGphdmEubGFuZy5DbGFzczw/PiwgamF2YS5sYW5nLkNsYXNzPD8+KQorICBMaW5lIDIxKSBvMS5nZXRSZXR1cm5UeXBlKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXRSZXR1cm5UeXBlKCkKKyAgTGluZSAyMSkgbzIuZ2V0UmV0dXJuVHlwZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuZ2V0UmV0dXJuVHlwZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfY29tcGFyYXRvcnNfUGFyYW1ldGVyQ29tcGFyYXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZWZsZWN0aW9ubW9kZWxfY29tcGFyYXRvcnNfUGFyYW1ldGVyQ29tcGFyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhYjYyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3JlZmxlY3Rpb25tb2RlbF9jb21wYXJhdG9yc19QYXJhbWV0ZXJDb21wYXJhdG9yLnR4dApAQCAtMCwwICsxLDYgQEAKKyAgTGluZSAxMykgbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmNvbXBhcmVUbyhqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzKSBvMS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlci5nZXROYW1lKCkKKyAgTGluZSAxMykgbzIuZ2V0TmFtZSgpID09PiBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXIuZ2V0TmFtZSgpCisgIExpbmUgMTUpIG5ldyBDbGFzc0NvbXBhcmF0b3IoKS5jb21wYXJlKG8xLmdldFR5cGUoKSwgbzIuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuY29tcGFyYXRvcnMuQ2xhc3NDb21wYXJhdG9yLmNvbXBhcmUoamF2YS5sYW5nLkNsYXNzPD8+LCBqYXZhLmxhbmcuQ2xhc3M8Pz4pCisgIExpbmUgMTUpIG8xLmdldFR5cGUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyLmdldFR5cGUoKQorICBMaW5lIDE1KSBvMi5nZXRUeXBlKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlci5nZXRUeXBlKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl9Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YzhiOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMudHh0CkBAIC0wLDAgKzEsMTEwIEBACisgIExpbmUgMzgpIGFyZ3VtZW50c1R5cGVzLnN1Ykxpc3QoMCwgc3RhcnRWYXJpYWRpYykgPT0+IGphdmEudXRpbC5MaXN0LnN1Ykxpc3QoaW50LCBpbnQpCisgIExpbmUgMzkpIGFyZ3VtZW50c1R5cGVzLnN1Ykxpc3Qoc3RhcnRWYXJpYWRpYywgYXJndW1lbnRzVHlwZXMuc2l6ZSgpKSA9PT4gamF2YS51dGlsLkxpc3Quc3ViTGlzdChpbnQsIGludCkKKyAgTGluZSAzOSkgYXJndW1lbnRzVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0MCkgdmFyaWFkaWNWYWx1ZXMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA0MikgcmVzLmFkZCh2YXJpYWRpY1R5cGUpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA0NCkgZmluZENvbW1vblR5cGUodmFyaWFkaWNWYWx1ZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMuZmluZENvbW1vblR5cGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDQ1KSByZXMuYWRkKG5ldyBBcnJheVR5cGUoY29tcG9uZW50VHlwZSkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1MSkgdmFyaWFkaWNWYWx1ZXMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA1NSkgdmFyaWFkaWNWYWx1ZXMuZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDYwKSBpc0FwcGxpY2FibGUoY29uc3RydWN0b3IsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBmYWxzZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5pc0FwcGxpY2FibGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgYm9vbGVhbikKKyAgTGluZSA2NSkgY29uc3RydWN0b3IuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkKKyAgTGluZSA2NikgY29uc3RydWN0b3IuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA2NykgY29uc3RydWN0b3IuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA2NykgYXJndW1lbnRzVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA2OSkgY29uc3RydWN0b3IuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDY5KSBjb25zdHJ1Y3Rvci5nZXRMYXN0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldExhc3RQYXJhbSgpCisgIExpbmUgNzApIGFyZ3VtZW50c1R5cGVzLmdldChwb3MpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDcxKSBleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDcyKSBjb25zdHJ1Y3Rvci5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDczKSBNZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbShleHBlY3RlZFR5cGUsIHRwLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5yZXBsYWNlVHlwZVBhcmFtKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDc1KSBleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDc2KSBhY3R1YWxUeXBlLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgNzcpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNzcpIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgNzcpIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDc4KSBhcmd1bWVudHNUeXBlcy5zZXQocG9zLCBhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA3OCkgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA3OCkgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgODApIGdyb3VwVmFyaWFkaWNQYXJhbVZhbHVlcyhhcmd1bWVudHNUeXBlcywgcG9zLCBjb25zdHJ1Y3Rvci5nZXRMYXN0UGFyYW0oKS5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMuZ3JvdXBWYXJpYWRpY1BhcmFtVmFsdWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgaW50LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA4MSkgY29uc3RydWN0b3IuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDgxKSBjb25zdHJ1Y3Rvci5nZXRMYXN0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldExhc3RQYXJhbSgpCisgIExpbmUgODYpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgOTApIGdyb3VwVmFyaWFkaWNQYXJhbVZhbHVlcyhhcmd1bWVudHNUeXBlcywgcG9zLCBjb25zdHJ1Y3Rvci5nZXRMYXN0UGFyYW0oKS5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uQ29uc3RydWN0b3JSZXNvbHV0aW9uTG9naWMuZ3JvdXBWYXJpYWRpY1BhcmFtVmFsdWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgaW50LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA5MCkgY29uc3RydWN0b3IuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDkwKSBjb25zdHJ1Y3Rvci5nZXRMYXN0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldExhc3RQYXJhbSgpCisgIExpbmUgOTQpIGNvbnN0cnVjdG9yLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgOTQpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgOTkpIGNvbnN0cnVjdG9yLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgMTAwKSBjb25zdHJ1Y3Rvci5nZXRQYXJhbShpKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMTAwKSBjb25zdHJ1Y3Rvci5nZXRQYXJhbShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSAxMDEpIGFyZ3VtZW50c1R5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxMDIpIGV4cGVjdGVkVHlwZS5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTAyKSBleHBlY3RlZFR5cGUuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSAxMDMpIGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKS5kZWNsYXJlZE9uTWV0aG9kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uTWV0aG9kKCkKKyAgTGluZSAxMDMpIGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAxMDQpIG1hdGNoZWRQYXJhbWV0ZXJzLnB1dChleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpLCBhY3R1YWxUeXBlKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxMDQpIGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxMDQpIGV4cGVjdGVkVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAxMDgpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTA4KSBjb25zdHJ1Y3Rvci5nZXRQYXJhbShpKS5pc1ZhcmlhZGljKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlBhcmFtZXRlckRlY2xhcmF0aW9uLmlzVmFyaWFkaWMoKQorICBMaW5lIDEwOCkgY29uc3RydWN0b3IuZ2V0UGFyYW0oaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgMTA5KSBuZXcgQXJyYXlUeXBlKGV4cGVjdGVkVHlwZSkuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTEwKSBleHBlY3RlZFR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTExKSBhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDExMikgTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnMoZXhwZWN0ZWRUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLCBhY3R1YWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpLCBtYXRjaGVkUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDExMykgZXhwZWN0ZWRUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDExMykgYWN0dWFsVHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMTYpIGNvbnN0cnVjdG9yLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTE3KSB0eXBlUGFyYW1ldGVycy5hZGRBbGwoY29uc3RydWN0b3IuZGVjbGFyaW5nVHlwZSgpLmdldFR5cGVQYXJhbWV0ZXJzKCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIEU+KQorICBMaW5lIDExNykgY29uc3RydWN0b3IuZGVjbGFyaW5nVHlwZSgpLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTE3KSBjb25zdHJ1Y3Rvci5kZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgMTE5KSBNZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbShleHBlY3RlZFR5cGUsIHRwLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5yZXBsYWNlVHlwZVBhcmFtKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEyMikgZXhwZWN0ZWRUeXBlLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMjMpIGFjdHVhbFR5cGUuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSAxMjMpIGV4cGVjdGVkVHlwZS5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMTI3KSBjb25zdHJ1Y3Rvci5oYXNWYXJpYWRpY1BhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKQorICBMaW5lIDEyNykgY29uc3RydWN0b3IuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAxMjgpIG5ldyBBcnJheVR5cGUoZXhwZWN0ZWRUeXBlKS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNDkpIGZpbmRNb3N0QXBwbGljYWJsZShjb25zdHJ1Y3RvcnMsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBmYWxzZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGJvb2xlYW4pCisgIExpbmUgMTUwKSByZXMuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTUzKSBmaW5kTW9zdEFwcGxpY2FibGUoY29uc3RydWN0b3JzLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgdHJ1ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5maW5kTW9zdEFwcGxpY2FibGUoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGJvb2xlYW4pCisgIExpbmUgMTU3KSBjb25zdHJ1Y3RvcnMuc3RyZWFtKCkuZmlsdGVyKChtKSAtPiBpc0FwcGxpY2FibGUobSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHdpbGRjYXJkVG9sZXJhbmNlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDE1NykgY29uc3RydWN0b3JzLnN0cmVhbSgpLmZpbHRlcigobSkgLT4gaXNBcHBsaWNhYmxlKG0sIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCB3aWxkY2FyZFRvbGVyYW5jZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDE1NykgY29uc3RydWN0b3JzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDE1NykgaXNBcHBsaWNhYmxlKG0sIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCB3aWxkY2FyZFRvbGVyYW5jZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5pc0FwcGxpY2FibGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlciwgYm9vbGVhbikKKyAgTGluZSAxNTcpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDE1OCkgYXBwbGljYWJsZUNvbnN0cnVjdG9ycy5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDE1OSkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKENvbnN0cnVjdG9yRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMTYxKSBhcHBsaWNhYmxlQ29uc3RydWN0b3JzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTYyKSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGFwcGxpY2FibGVDb25zdHJ1Y3RvcnMuZ2V0KDApKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMTYyKSBhcHBsaWNhYmxlQ29uc3RydWN0b3JzLmdldCgwKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAxNjQpIGFwcGxpY2FibGVDb25zdHJ1Y3RvcnMuZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDE2NykgYXBwbGljYWJsZUNvbnN0cnVjdG9ycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE2OCkgYXBwbGljYWJsZUNvbnN0cnVjdG9ycy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTY5KSBpc01vcmVTcGVjaWZpYyh3aW5uaW5nQ2FuZGlkYXRlLCBvdGhlciwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5Db25zdHJ1Y3RvclJlc29sdXRpb25Mb2dpYy5pc01vcmVTcGVjaWZpYyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNzEpIGlzTW9yZVNwZWNpZmljKG90aGVyLCB3aW5uaW5nQ2FuZGlkYXRlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLkNvbnN0cnVjdG9yUmVzb2x1dGlvbkxvZ2ljLmlzTW9yZVNwZWNpZmljKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE3NSkgd2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvdGhlci5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNzUpIHdpbm5pbmdDYW5kaWRhdGUuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE3NSkgd2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgMTc2KSBvdGhlci5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTc2KSBvdGhlci5kZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgMTg1KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuaXNFeGFjdE1hdGNoKHdpbm5pbmdDYW5kaWRhdGUsIGFyZ3VtZW50c1R5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0V4YWN0TWF0Y2goY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTg2KSBNZXRob2RSZXNvbHV0aW9uTG9naWMuaXNFeGFjdE1hdGNoKG90aGVyLCBhcmd1bWVudHNUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNFeGFjdE1hdGNoKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDE5MykgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZCh3aW5uaW5nQ2FuZGlkYXRlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMjAwKSBjb25zdHJ1Y3RvckEuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAyMDApIGNvbnN0cnVjdG9yQi5nZXROdW1iZXJPZlBhcmFtcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKQorICBMaW5lIDIwMykgY29uc3RydWN0b3JBLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgMjAzKSBjb25zdHJ1Y3RvckIuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAyMDYpIGNvbnN0cnVjdG9yQS5nZXROdW1iZXJPZlBhcmFtcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKQorICBMaW5lIDIwNykgY29uc3RydWN0b3JBLmdldFBhcmFtKGkpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSAyMDcpIGNvbnN0cnVjdG9yQS5nZXRQYXJhbShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSAyMDgpIGNvbnN0cnVjdG9yQi5nZXRQYXJhbShpKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMjA4KSBjb25zdHJ1Y3RvckIuZ2V0UGFyYW0oaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgMjEwKSB0ZEIuaXNBc3NpZ25hYmxlQnkodGRBKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjEwKSB0ZEEuaXNBc3NpZ25hYmxlQnkodGRCKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjE0KSB0ZEEuaXNBc3NpZ25hYmxlQnkodGRCKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjE0KSB0ZEIuaXNBc3NpZ25hYmxlQnkodGRBKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjE5KSBjb25zdHJ1Y3RvckEuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAyMTkpIHRkQS5hcnJheUxldmVsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFycmF5TGV2ZWwoKQorICBMaW5lIDIxOSkgdGRCLmFycmF5TGV2ZWwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXJyYXlMZXZlbCgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX01ldGhvZFJlc29sdXRpb25Mb2dpYy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX01ldGhvZFJlc29sdXRpb25Mb2dpYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzN2JmNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnR4dApAQCAtMCwwICsxLDQxNiBAQAorICBMaW5lIDQ1KSBhcmd1bWVudHNUeXBlcy5zdWJMaXN0KDAsIHN0YXJ0VmFyaWFkaWMpID09PiBqYXZhLnV0aWwuTGlzdC5zdWJMaXN0KGludCwgaW50KQorICBMaW5lIDQ2KSBhcmd1bWVudHNUeXBlcy5zdWJMaXN0KHN0YXJ0VmFyaWFkaWMsIGFyZ3VtZW50c1R5cGVzLnNpemUoKSkgPT0+IGphdmEudXRpbC5MaXN0LnN1Ykxpc3QoaW50LCBpbnQpCisgIExpbmUgNDYpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNDcpIHZhcmlhZGljVmFsdWVzLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgNDkpIHJlcy5hZGQodmFyaWFkaWNUeXBlKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNTEpIGZpbmRDb21tb25UeXBlKHZhcmlhZGljVmFsdWVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5maW5kQ29tbW9uVHlwZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNTIpIHJlcy5hZGQobmV3IEFycmF5VHlwZShjb21wb25lbnRUeXBlKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDU4KSB2YXJpYWRpY1ZhbHVlcy5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDYyKSB2YXJpYWRpY1ZhbHVlcy5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNjYpIGlzQXBwbGljYWJsZShtZXRob2QsIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCBmYWxzZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBcHBsaWNhYmxlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLCBib29sZWFuKQorICBMaW5lIDcwKSBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3MCkgbWV0aG9kLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNzMpIG1ldGhvZC5oYXNWYXJpYWRpY1BhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKQorICBMaW5lIDc0KSBtZXRob2QuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA3NSkgbWV0aG9kLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgNzUpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNzcpIG1ldGhvZC5nZXRMYXN0UGFyYW0oKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgNzcpIG1ldGhvZC5nZXRMYXN0UGFyYW0oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldExhc3RQYXJhbSgpCisgIExpbmUgNzgpIGFyZ3VtZW50c1R5cGVzLmdldChwb3MpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDc5KSBleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDgwKSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA4MSkgcmVwbGFjZVR5cGVQYXJhbShleHBlY3RlZFR5cGUsIHRwLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5yZXBsYWNlVHlwZVBhcmFtKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDgzKSBleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDg0KSBhY3R1YWxUeXBlLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgODQpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgODQpIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgODQpIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDg1KSBhcmd1bWVudHNUeXBlcy5zZXQocG9zLCBhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSA4NSkgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA4NSkgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgODcpIGdyb3VwVmFyaWFkaWNQYXJhbVZhbHVlcyhhcmd1bWVudHNUeXBlcywgcG9zLCBtZXRob2QuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5ncm91cFZhcmlhZGljUGFyYW1WYWx1ZXMoamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBpbnQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDg3KSBtZXRob2QuZ2V0TGFzdFBhcmFtKCkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDg3KSBtZXRob2QuZ2V0TGFzdFBhcmFtKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRMYXN0UGFyYW0oKQorICBMaW5lIDkyKSBhcmd1bWVudHNUeXBlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDk1KSBncm91cFZhcmlhZGljUGFyYW1WYWx1ZXMoYXJndW1lbnRzVHlwZXMsIHBvcywgbWV0aG9kLmdldExhc3RQYXJhbSgpLmdldFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuZ3JvdXBWYXJpYWRpY1BhcmFtVmFsdWVzKGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgaW50LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA5NSkgbWV0aG9kLmdldExhc3RQYXJhbSgpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSA5NSkgbWV0aG9kLmdldExhc3RQYXJhbSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0TGFzdFBhcmFtKCkKKyAgTGluZSA5OSkgbWV0aG9kLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgOTkpIGFyZ3VtZW50c1R5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTA0KSBtZXRob2QuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAxMDUpIG1ldGhvZC5nZXRQYXJhbShpKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMTA1KSBtZXRob2QuZ2V0UGFyYW0oaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgMTA2KSBhcmd1bWVudHNUeXBlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTA3KSBleHBlY3RlZFR5cGUuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDEwNykgZXhwZWN0ZWRUeXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMTA3KSBleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCkuZGVjbGFyZWRPbk1ldGhvZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPbk1ldGhvZCgpCisgIExpbmUgMTA3KSBleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgMTA4KSBtYXRjaGVkUGFyYW1ldGVycy5wdXQoZXhwZWN0ZWRUeXBlLmFzVHlwZVBhcmFtZXRlcigpLmdldE5hbWUoKSwgYWN0dWFsVHlwZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMTA4KSBleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTA4KSBleHBlY3RlZFR5cGUuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgMTExKSBleHBlY3RlZFR5cGUuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDExMikgbWV0aG9kLmdldFBhcmFtKGkpLmlzVmFyaWFkaWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUGFyYW1ldGVyRGVjbGFyYXRpb24uaXNWYXJpYWRpYygpCisgIExpbmUgMTEyKSBtZXRob2QuZ2V0UGFyYW0oaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgMTEyKSBuZXcgQXJyYXlUeXBlKGV4cGVjdGVkVHlwZSkuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTEzKSBleHBlY3RlZFR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTEzKSBhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDExNCkgaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVycyhleHBlY3RlZFR5cGUuYXNSZWZlcmVuY2VUeXBlKCksIGFjdHVhbFR5cGUuYXNSZWZlcmVuY2VUeXBlKCksIG1hdGNoZWRQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0Fzc2lnbmFibGVNYXRjaFR5cGVQYXJhbWV0ZXJzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZSwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTE1KSBleHBlY3RlZFR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTE2KSBhY3R1YWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDEyMCkgbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTIxKSB0eXBlUGFyYW1ldGVycy5hZGRBbGwobWV0aG9kLmRlY2xhcmluZ1R5cGUoKS5nZXRUeXBlUGFyYW1ldGVycygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxMjEpIG1ldGhvZC5kZWNsYXJpbmdUeXBlKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAxMjEpIG1ldGhvZC5kZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkKKyAgTGluZSAxMjMpIHJlcGxhY2VUeXBlUGFyYW0oZXhwZWN0ZWRUeXBlLCB0cCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMjYpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTI3KSBhY3R1YWxUeXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMTI3KSBleHBlY3RlZFR5cGUuaXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNQcmltaXRpdmUoKQorICBMaW5lIDEzMSkgbWV0aG9kLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5oYXNWYXJpYWRpY1BhcmFtZXRlcigpCisgIExpbmUgMTMxKSBtZXRob2QuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAxMzIpIG5ldyBBcnJheVR5cGUoZXhwZWN0ZWRUeXBlKS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNDUpIGV4cGVjdGVkLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDE0NSkgYWN0dWFsLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDE0NikgaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVycyhleHBlY3RlZC5hc1JlZmVyZW5jZVR5cGUoKSwgYWN0dWFsLmFzUmVmZXJlbmNlVHlwZSgpLCBtYXRjaGVkUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDE0NikgZXhwZWN0ZWQuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTQ2KSBhY3R1YWwuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTQ3KSBleHBlY3RlZC5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTQ4KSBtYXRjaGVkUGFyYW1ldGVycy5wdXQoZXhwZWN0ZWQuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpLCBhY3R1YWwpID09PiBqYXZhLnV0aWwuTWFwLnB1dChLLCBWKQorICBMaW5lIDE0OCkgZXhwZWN0ZWQuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTQ4KSBleHBlY3RlZC5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAxNTEpIGV4cGVjdGVkLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMTUxKSBleHBlY3RlZC5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAxNTEpIGFjdHVhbC5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDE1MSkgYWN0dWFsLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDE1NykgYWN0dWFsLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZXhwZWN0ZWQuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxNTcpIGFjdHVhbC5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE1NykgZXhwZWN0ZWQuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxNTgpIGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnNNYXRjaGluZ1FOYW1lKGV4cGVjdGVkLCBhY3R1YWwsIG1hdGNoZWRQYXJhbWV0ZXJzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0Fzc2lnbmFibGVNYXRjaFR5cGVQYXJhbWV0ZXJzTWF0Y2hpbmdRTmFtZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDE2MCkgYWN0dWFsLmdldEFsbEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRBbGxBbmNlc3RvcnMoKQorICBMaW5lIDE2MikgaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVyc01hdGNoaW5nUU5hbWUoZXhwZWN0ZWQsIGFuY2VzdG9yLCBtYXRjaGVkUGFyYW1ldGVycykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBc3NpZ25hYmxlTWF0Y2hUeXBlUGFyYW1ldGVyc01hdGNoaW5nUU5hbWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAxNzMpIGV4cGVjdGVkLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYWN0dWFsLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTczKSBleHBlY3RlZC5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE3MykgYWN0dWFsLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTc2KSBleHBlY3RlZC50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMTc2KSBleHBlY3RlZC50eXBlUGFyYW1ldGVyc1ZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpCisgIExpbmUgMTc2KSBhY3R1YWwudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDE3NikgYWN0dWFsLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSAxODApIGV4cGVjdGVkLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxODApIGV4cGVjdGVkLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSAxODEpIGV4cGVjdGVkLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDE4MSkgZXhwZWN0ZWQudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDE4MikgYWN0dWFsLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDE4MikgYWN0dWFsLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSAxODYpIGV4cGVjdGVkUGFyYW0uaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTg2KSBhY3R1YWxQYXJhbS5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxODcpIGV4cGVjdGVkUGFyYW0uYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTg4KSBhY3R1YWxQYXJhbS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxOTApIGlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnNNYXRjaGluZ1FOYW1lKHIxLCByMiwgbWF0Y2hlZFBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnNNYXRjaGluZ1FOYW1lKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZSwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTkzKSBleHBlY3RlZFBhcmFtLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAxOTQpIGV4cGVjdGVkUGFyYW0uYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTk0KSBleHBlY3RlZFBhcmFtLmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDE5NSkgYWN0dWFsUGFyYW0uaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDE5NSkgYWN0dWFsUGFyYW0uYXNUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpLmVxdWFscyhleHBlY3RlZFBhcmFtTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTk1KSBhY3R1YWxQYXJhbS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxOTUpIGFjdHVhbFBhcmFtLmFzVHlwZVBhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDE5NikgbWF0Y2hlZFBhcmFtZXRlcnMuY29udGFpbnNLZXkoZXhwZWN0ZWRQYXJhbU5hbWUpID09PiBqYXZhLnV0aWwuTWFwLmNvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTk3KSBtYXRjaGVkUGFyYW1ldGVycy5nZXQoZXhwZWN0ZWRQYXJhbU5hbWUpID09PiBqYXZhLnV0aWwuTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE5OCkgbWF0Y2hlZFBhcmFtZXRlci5pc0Fzc2lnbmFibGVCeShhY3R1YWxQYXJhbSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDIwMCkgYWN0dWFsUGFyYW0uaXNBc3NpZ25hYmxlQnkobWF0Y2hlZFBhcmFtZXRlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDIwMSkgbWF0Y2hlZFBhcmFtZXRlcnMucHV0KGV4cGVjdGVkUGFyYW1OYW1lLCBhY3R1YWxQYXJhbSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMjA2KSBtYXRjaGVkUGFyYW1ldGVycy5wdXQoZXhwZWN0ZWRQYXJhbU5hbWUsIGFjdHVhbFBhcmFtKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAyMDkpIGV4cGVjdGVkUGFyYW0uaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMjEwKSBleHBlY3RlZFBhcmFtLmVxdWFscyhhY3R1YWxQYXJhbSkgPT0+IGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjEzKSBleHBlY3RlZFBhcmFtLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMjE0KSBleHBlY3RlZFBhcmFtLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzRXh0ZW5kcygpCisgIExpbmUgMjE0KSBleHBlY3RlZFBhcmFtLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMjE1KSBpc0Fzc2lnbmFibGVNYXRjaFR5cGVQYXJhbWV0ZXJzKGV4cGVjdGVkUGFyYW0uYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCksIGFjdHVhbCwgbWF0Y2hlZFBhcmFtZXRlcnMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzQXNzaWduYWJsZU1hdGNoVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAyMTUpIGV4cGVjdGVkUGFyYW0uYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMjE1KSBleHBlY3RlZFBhcmFtLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMjIwKSBleHBlY3RlZFBhcmFtLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAyMjcpIHR5cGUuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDIyOCkgdHlwZS5kZXNjcmliZSgpLmVxdWFscyh0cC5nZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDIyOCkgdHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMjI4KSB0cC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMjkpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldEJvdW5kcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyMzApIGJvdW5kcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDIzMikgYm91bmRzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMjMzKSBib3VuZHMuZ2V0KDApLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kLmdldFR5cGUoKQorICBMaW5lIDIzMykgYm91bmRzLmdldCgwKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAyMzUpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAyMzUpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAyMzkpIHR5cGUuaXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNQcmltaXRpdmUoKQorICBMaW5lIDI0MSkgdHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDI0MikgcmVwbGFjZVR5cGVQYXJhbSh0eXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCB0cCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMucmVwbGFjZVR5cGVQYXJhbShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAyNDIpIHR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgMjQyKSB0eXBlLmFzQXJyYXlUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzQXJyYXlUeXBlKCkKKyAgTGluZSAyNDMpIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMjQ0KSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDI0NSkgcmVzdWx0LnRyYW5zZm9ybVR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbSAtPiByZXBsYWNlVHlwZVBhcmFtKHR5cGVQYXJhbSwgdHAsIHR5cGVTb2x2ZXIpKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyNDUpIHJlc3VsdC50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0eXBlUGFyYW0gLT4gcmVwbGFjZVR5cGVQYXJhbSh0eXBlUGFyYW0sIHRwLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnRyYW5zZm9ybVR5cGVQYXJhbWV0ZXJzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVHJhbnNmb3JtZXIpCisgIExpbmUgMjQ1KSByZXBsYWNlVHlwZVBhcmFtKHR5cGVQYXJhbSwgdHAsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLnJlcGxhY2VUeXBlUGFyYW0oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMjQ3KSB0eXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMjQ4KSB0eXBlLmRlc2NyaWJlKCkuZXF1YWxzKHRwLmdldE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQ4KSB0eXBlLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAyNDgpIHRwLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDI0OSkgdHAuZ2V0Qm91bmRzKHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Qm91bmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDI1MCkgYm91bmRzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMjUyKSBib3VuZHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAyNTMpIGJvdW5kcy5nZXQoMCkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQuZ2V0VHlwZSgpCisgIExpbmUgMjUzKSBib3VuZHMuZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDI1NSkgdHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDI1NSkgT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDI2MCkgdHlwZS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDI2MCkgdHlwZS5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSAyNjUpIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDI2NSkgbWV0aG9kLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldE5hbWUoKQorICBMaW5lIDI2OSkgbWV0aG9kLmdldE5vUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXROb1BhcmFtcygpCisgIExpbmUgMjY5KSBhcmd1bWVudHNUeXBlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDI3MikgbWV0aG9kLmdldE5vUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXROb1BhcmFtcygpCisgIExpbmUgMjczKSBtZXRob2QuZ2V0UGFyYW1UeXBlKGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0UGFyYW1UeXBlKGludCkKKyAgTGluZSAyNzUpIG1ldGhvZC5nZXRQYXJhbVR5cGUoaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXRQYXJhbVR5cGUoaW50KQorICBMaW5lIDI3NikgYXJndW1lbnRzVHlwZXMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDI3OCkgbWV0aG9kLmdldERlY2xhcmF0aW9uKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyNzgpIG1ldGhvZC5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDI3OSkgdHlwZVBhcmFtZXRlcnMuYWRkQWxsKG1ldGhvZC5kZWNsYXJpbmdUeXBlKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMjc5KSBtZXRob2QuZGVjbGFyaW5nVHlwZSgpLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMjc5KSBtZXRob2QuZGVjbGFyaW5nVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgMjgxKSBleHBlY3RlZFR5cGUuZGVzY3JpYmUoKS5lcXVhbHMoYWN0dWFsVHlwZS5kZXNjcmliZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAyODEpIGV4cGVjdGVkVHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMjgxKSBhY3R1YWxUeXBlLmRlc2NyaWJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmRlc2NyaWJlKCkKKyAgTGluZSAyODYpIG1ldGhvZC5nZXRQYXJhbVR5cGVzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAyODYpIG1ldGhvZC5nZXRQYXJhbVR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkKKyAgTGluZSAyODcpIG1ldGhvZC5nZXREZWNsYXJhdGlvbigpLmdldFBhcmFtKGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaW50KQorICBMaW5lIDI4NykgbWV0aG9kLmdldERlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXREZWNsYXJhdGlvbigpCisgIExpbmUgMjg4KSBwYXJhbWV0ZXIuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDI4OSkgcGFyYW1ldGVyLmlzVmFyaWFkaWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUGFyYW1ldGVyRGVjbGFyYXRpb24uaXNWYXJpYWRpYygpCisgIExpbmUgMjkwKSBwYXJhbWV0ZXJUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDI5MCkgcGFyYW1ldGVyVHlwZS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgMjkyKSBpbmZlclR5cGVzKGFyZ3VtZW50c1R5cGVzLmdldChqKSwgcGFyYW1ldGVyVHlwZSwgZGVyaXZlZFZhbHVlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaW5mZXJUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMjkyKSBhcmd1bWVudHNUeXBlcy5nZXQoaikgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMjk1KSBkZXJpdmVkVmFsdWVzLmVudHJ5U2V0KCkgPT0+IGphdmEudXRpbC5NYXAuZW50cnlTZXQoKQorICBMaW5lIDI5NikgZW50cnkuZ2V0S2V5KCkgPT0+IGphdmEudXRpbC5NYXAuRW50cnkuZ2V0S2V5KCkKKyAgTGluZSAyOTcpIGV4cGVjdGVkVHlwZVdpdGhJbmZlcmVuY2UucmVwbGFjZVR5cGVWYXJpYWJsZXModHAsIGVudHJ5LmdldFZhbHVlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDI5NykgZW50cnkuZ2V0VmFsdWUoKSA9PT4gamF2YS51dGlsLk1hcC5FbnRyeS5nZXRWYWx1ZSgpCisgIExpbmUgMzAxKSB0cC5nZXRCb3VuZHModHlwZVNvbHZlcikuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAzMDEpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldEJvdW5kcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzMDMpIGV4cGVjdGVkVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKG5ldyBSZWZlcmVuY2VUeXBlSW1wbCh0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgdHlwZVNvbHZlcikpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzMDMpIFdpbGRjYXJkLmV4dGVuZHNCb3VuZChuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmV4dGVuZHNCb3VuZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzMDMpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMDMpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMDQpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDMwNCkgdHAuZ2V0Qm91bmRzKHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Qm91bmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDMwNSkgdHAuZ2V0Qm91bmRzKHR5cGVTb2x2ZXIpLmdldCgwKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzMDUpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldEJvdW5kcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzMDYpIGJvdW5kLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQuaXNFeHRlbmRzKCkKKyAgTGluZSAzMDgpIGV4cGVjdGVkVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGJvdW5kLmdldFR5cGUoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDMwOCkgV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGJvdW5kLmdldFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5leHRlbmRzQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzA4KSBib3VuZC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5nZXRUeXBlKCkKKyAgTGluZSAzMTEpIGV4cGVjdGVkVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgV2lsZGNhcmQuc3VwZXJCb3VuZChib3VuZC5nZXRUeXBlKCkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzMTEpIFdpbGRjYXJkLnN1cGVyQm91bmQoYm91bmQuZ2V0VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLnN1cGVyQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzExKSBib3VuZC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5nZXRUeXBlKCkKKyAgTGluZSAzMTkpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDMxOSkgdHAuZ2V0Qm91bmRzKHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Qm91bmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDMyMCkgZXhwZWN0ZWRUeXBlMi5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgbmV3IFJlZmVyZW5jZVR5cGVJbXBsKHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzIwKSB0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMzIwKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzIxKSB0cC5nZXRCb3VuZHModHlwZVNvbHZlcikuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzMjEpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldEJvdW5kcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAzMjIpIHRwLmdldEJvdW5kcyh0eXBlU29sdmVyKS5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMzIyKSB0cC5nZXRCb3VuZHModHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRCb3VuZHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzIzKSBib3VuZC5pc0V4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLkJvdW5kLmlzRXh0ZW5kcygpCisgIExpbmUgMzI0KSBleHBlY3RlZFR5cGUyLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBib3VuZC5nZXRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDMyNCkgYm91bmQuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQuZ2V0VHlwZSgpCisgIExpbmUgMzI2KSBleHBlY3RlZFR5cGUyLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwLCBuZXcgUmVmZXJlbmNlVHlwZUltcGwodHlwZVNvbHZlci5zb2x2ZVR5cGUoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSksIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzMjYpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzMjYpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMzIpIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVCeShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzMzKSBleHBlY3RlZFR5cGUyLmlzQXNzaWduYWJsZUJ5KGFjdHVhbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzMzQpIGV4cGVjdGVkVHlwZVdpdGhJbmZlcmVuY2UuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDMzNSkgZXhwZWN0ZWRUeXBlV2l0aG91dFN1YnN0aXR1dGlvbnMuaXNBc3NpZ25hYmxlQnkoYWN0dWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDM0NykgKChKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24pIG0xKS5nZXRXcmFwcGVkTm9kZSgpLmVxdWFscygoKEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbikgbTIpLmdldFdyYXBwZWROb2RlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzQ3KSAoKEphdmFQYXJzZXJNZXRob2REZWNsYXJhdGlvbikgbTEpLmdldFdyYXBwZWROb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24uZ2V0V3JhcHBlZE5vZGUoKQorICBMaW5lIDM0NykgKChKYXZhUGFyc2VyTWV0aG9kRGVjbGFyYXRpb24pIG0yKS5nZXRXcmFwcGVkTm9kZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlck1ldGhvZERlY2xhcmF0aW9uLmdldFdyYXBwZWROb2RlKCkKKyAgTGluZSAzNTMpIHMuYWRkQWxsKG1ldGhvZHMpID09PiBqYXZhLnV0aWwuU2V0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgMzU3KSBtZC5nZXRRdWFsaWZpZWRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpCisgIExpbmUgMzU4KSB1c2VkU2lnbmF0dXJlcy5jb250YWlucyhzaWduYXR1cmUpID09PiBqYXZhLnV0aWwuU2V0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMzU5KSB1c2VkU2lnbmF0dXJlcy5hZGQoc2lnbmF0dXJlKSA9PT4gamF2YS51dGlsLlNldC5hZGQoRSkKKyAgTGluZSAzNjApIHJlcy5hZGQobWQpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAzNzQpIGZpbmRNb3N0QXBwbGljYWJsZShtZXRob2RzLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlciwgZmFsc2UpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGJvb2xlYW4pCisgIExpbmUgMzc1KSByZXMuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMzc4KSBmaW5kTW9zdEFwcGxpY2FibGUobWV0aG9kcywgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHRydWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmZpbmRNb3N0QXBwbGljYWJsZShqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGJvb2xlYW4pCisgIExpbmUgMzgyKSBnZXRNZXRob2RzV2l0aG91dER1cGxpY2F0ZXMobWV0aG9kcykuc3RyZWFtKCkuZmlsdGVyKChtKSAtPiBpc0FwcGxpY2FibGUobSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHdpbGRjYXJkVG9sZXJhbmNlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDM4MikgZ2V0TWV0aG9kc1dpdGhvdXREdXBsaWNhdGVzKG1ldGhvZHMpLnN0cmVhbSgpLmZpbHRlcigobSkgLT4gaXNBcHBsaWNhYmxlKG0sIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyLCB3aWxkY2FyZFRvbGVyYW5jZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDM4MikgZ2V0TWV0aG9kc1dpdGhvdXREdXBsaWNhdGVzKG1ldGhvZHMpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDM4MikgZ2V0TWV0aG9kc1dpdGhvdXREdXBsaWNhdGVzKG1ldGhvZHMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmdldE1ldGhvZHNXaXRob3V0RHVwbGljYXRlcyhqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbj4pCisgIExpbmUgMzgyKSBpc0FwcGxpY2FibGUobSwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIHR5cGVTb2x2ZXIsIHdpbGRjYXJkVG9sZXJhbmNlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc0FwcGxpY2FibGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIsIGJvb2xlYW4pCisgIExpbmUgMzgyKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAzODMpIGFwcGxpY2FibGVNZXRob2RzLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgMzg0KSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMzg3KSBhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDM4OSkgYXJndW1lbnRzVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAzOTApIGFyZ3VtZW50c1R5cGVzLmdldChpKS5pc051bGwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNOdWxsKCkKKyAgTGluZSAzOTApIGFyZ3VtZW50c1R5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAzOTEpIG51bGxQYXJhbUluZGV4ZXMuYWRkKGkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAzOTQpIG51bGxQYXJhbUluZGV4ZXMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAzOTkpIG1ldGhEZWNsLmdldFBhcmFtKG51bGxQYXJhbUluZGV4LmludFZhbHVlKCkpLmdldFR5cGUoKS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDM5OSkgbWV0aERlY2wuZ2V0UGFyYW0obnVsbFBhcmFtSW5kZXguaW50VmFsdWUoKSkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDM5OSkgbWV0aERlY2wuZ2V0UGFyYW0obnVsbFBhcmFtSW5kZXguaW50VmFsdWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgMzk5KSBudWxsUGFyYW1JbmRleC5pbnRWYWx1ZSgpID09PiBqYXZhLmxhbmcuSW50ZWdlci5pbnRWYWx1ZSgpCisgIExpbmUgNDAwKSByZW1vdmVDYW5kaWRhdGVzLmFkZChtZXRoRGVjbCkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgNDA0KSByZW1vdmVDYW5kaWRhdGVzLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLlNldC5pc0VtcHR5KCkKKyAgTGluZSA0MDQpIHJlbW92ZUNhbmRpZGF0ZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuU2V0LnNpemUoKQorICBMaW5lIDQwNCkgYXBwbGljYWJsZU1ldGhvZHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0MDUpIGFwcGxpY2FibGVNZXRob2RzLnJlbW92ZUFsbChyZW1vdmVDYW5kaWRhdGVzKSA9PT4gamF2YS51dGlsLkxpc3QucmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PikKKyAgTGluZSA0MDkpIGFwcGxpY2FibGVNZXRob2RzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNDEwKSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGFwcGxpY2FibGVNZXRob2RzLmdldCgwKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDQxMCkgYXBwbGljYWJsZU1ldGhvZHMuZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDQxMikgYXBwbGljYWJsZU1ldGhvZHMuZ2V0KDApID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDQxNSkgYXBwbGljYWJsZU1ldGhvZHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0MTYpIGFwcGxpY2FibGVNZXRob2RzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA0MTcpIGlzTW9yZVNwZWNpZmljKHdpbm5pbmdDYW5kaWRhdGUsIG90aGVyLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNNb3JlU3BlY2lmaWMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZERlY2xhcmF0aW9uLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQxOSkgaXNNb3JlU3BlY2lmaWMob3RoZXIsIHdpbm5pbmdDYW5kaWRhdGUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc01vcmVTcGVjaWZpYyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2REZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDIzKSB3aW5uaW5nQ2FuZGlkYXRlLmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG90aGVyLmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQyMykgd2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDIzKSB3aW5uaW5nQ2FuZGlkYXRlLmRlY2xhcmluZ1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmRlY2xhcmluZ1R5cGUoKQorICBMaW5lIDQyMykgb3RoZXIuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDQyMykgb3RoZXIuZGVjbGFyaW5nVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgNDMyKSBpc0V4YWN0TWF0Y2god2lubmluZ0NhbmRpZGF0ZSwgYXJndW1lbnRzVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzRXhhY3RNYXRjaChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA0MzMpIGlzRXhhY3RNYXRjaChvdGhlciwgYXJndW1lbnRzVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzRXhhY3RNYXRjaChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSA0NDApIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQod2lubmluZ0NhbmRpZGF0ZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDQ0NSkgbWV0aG9kLmdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgNDQ2KSBtZXRob2QuZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpLmVxdWFscyhhcmd1bWVudHNUeXBlcy5nZXQoaSkpID09PiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQ0NikgbWV0aG9kLmdldFBhcmFtKGkpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSA0NDYpIG1ldGhvZC5nZXRQYXJhbShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSA0NDYpIGFyZ3VtZW50c1R5cGVzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA0NTUpIG1ldGhvZEEuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA0NTUpIG1ldGhvZEIuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA0NTgpIG1ldGhvZEEuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA0NTgpIG1ldGhvZEIuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA0NjEpIG1ldGhvZEEuZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA0NjIpIG1ldGhvZEEuZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDQ2MikgbWV0aG9kQS5nZXRQYXJhbShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSA0NjMpIG1ldGhvZEIuZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDQ2MykgbWV0aG9kQi5nZXRQYXJhbShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSA0NjUpIHRkQi5pc0Fzc2lnbmFibGVCeSh0ZEEpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NjUpIHRkQS5pc0Fzc2lnbmFibGVCeSh0ZEIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NjkpIHRkQS5pc0Fzc2lnbmFibGVCeSh0ZEIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NjkpIHRkQi5pc0Fzc2lnbmFibGVCeSh0ZEEpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NzUpIGFyZ3VtZW50VHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0NzcpIG1ldGhvZEEuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkKKyAgTGluZSA0NzcpIG1ldGhvZEIuaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmhhc1ZhcmlhZGljUGFyYW1ldGVyKCkKKyAgTGluZSA0NzkpIGFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkuaXNBcnJheSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0FycmF5KCkKKyAgTGluZSA0NzkpIGFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNDgzKSBhcmd1bWVudFR5cGVzLmdldChsYXN0SW5kZXgpLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgNDgzKSBhcmd1bWVudFR5cGVzLmdldChsYXN0SW5kZXgpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDQ4NykgbWV0aG9kQS5oYXNWYXJpYWRpY1BhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKQorICBMaW5lIDQ4NykgbWV0aG9kQi5oYXNWYXJpYWRpY1BhcmFtZXRlcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uaGFzVmFyaWFkaWNQYXJhbWV0ZXIoKQorICBMaW5lIDQ5MCkgYXJndW1lbnRUeXBlcy5nZXQobGFzdEluZGV4KS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDQ5MCkgYXJndW1lbnRUeXBlcy5nZXQobGFzdEluZGV4KSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA0OTQpIGFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkuaXNBcnJheSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0FycmF5KCkKKyAgTGluZSA0OTQpIGFyZ3VtZW50VHlwZXMuZ2V0KGxhc3RJbmRleCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNTA1KSBtZXRob2RBLmdldE5vUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXROb1BhcmFtcygpCisgIExpbmUgNTA2KSBtZXRob2RBLmdldFBhcmFtVHlwZShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpbnQpCisgIExpbmUgNTA3KSBtZXRob2RCLmdldFBhcmFtVHlwZShpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldFBhcmFtVHlwZShpbnQpCisgIExpbmUgNTA5KSB0ZEEuaXNBc3NpZ25hYmxlQnkodGRCKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTEwKSB0ZEIuaXNBc3NpZ25hYmxlQnkodGRBKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTI1KSBtZXRob2RzLnN0cmVhbSgpLmZpbHRlcigobSkgLT4gaXNBcHBsaWNhYmxlKG0sIG5hbWUsIGFyZ3VtZW50c1R5cGVzLCB0eXBlU29sdmVyKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDUyNSkgbWV0aG9kcy5zdHJlYW0oKS5maWx0ZXIoKG0pIC0+IGlzQXBwbGljYWJsZShtLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDUyNSkgbWV0aG9kcy5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA1MjUpIGlzQXBwbGljYWJsZShtLCBuYW1lLCBhcmd1bWVudHNUeXBlcywgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaXNBcHBsaWNhYmxlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1MjUpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDUyNykgYXBwbGljYWJsZU1ldGhvZHMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA1MjgpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCisgIExpbmUgNTMwKSBhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDUzMSkgT3B0aW9uYWwub2YoYXBwbGljYWJsZU1ldGhvZHMuZ2V0KDApKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNTMxKSBhcHBsaWNhYmxlTWV0aG9kcy5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNTMzKSBhcHBsaWNhYmxlTWV0aG9kcy5nZXQoMCkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNTM0KSBhcHBsaWNhYmxlTWV0aG9kcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDUzNSkgYXBwbGljYWJsZU1ldGhvZHMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDUzNikgaXNNb3JlU3BlY2lmaWMod2lubmluZ0NhbmRpZGF0ZSwgb3RoZXIsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmlzTW9yZVNwZWNpZmljKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA1MzgpIGlzTW9yZVNwZWNpZmljKG90aGVyLCB3aW5uaW5nQ2FuZGlkYXRlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5pc01vcmVTcGVjaWZpYyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTQxKSB3aW5uaW5nQ2FuZGlkYXRlLmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG90aGVyLmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU0MSkgd2lubmluZ0NhbmRpZGF0ZS5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNTQxKSB3aW5uaW5nQ2FuZGlkYXRlLmRlY2xhcmluZ1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmRlY2xhcmluZ1R5cGUoKQorICBMaW5lIDU0MSkgb3RoZXIuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDU0MSkgb3RoZXIuZGVjbGFyaW5nVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgNTQyKSBhcmVPdmVycmlkZSh3aW5uaW5nQ2FuZGlkYXRlLCBvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuYXJlT3ZlcnJpZGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UpCisgIExpbmUgNTQzKSB3aW5uaW5nQ2FuZGlkYXRlLmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA1NDMpIHdpbm5pbmdDYW5kaWRhdGUuZGVjbGFyaW5nVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZGVjbGFyaW5nVHlwZSgpCisgIExpbmUgNTUxKSBPcHRpb25hbC5vZih3aW5uaW5nQ2FuZGlkYXRlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgNTU2KSB3aW5uaW5nQ2FuZGlkYXRlLmdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1NTYpIHdpbm5pbmdDYW5kaWRhdGUuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0TmFtZSgpCisgIExpbmUgNTU2KSBvdGhlci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXROYW1lKCkKKyAgTGluZSA1NTkpIHdpbm5pbmdDYW5kaWRhdGUuZ2V0Tm9QYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldE5vUGFyYW1zKCkKKyAgTGluZSA1NTkpIG90aGVyLmdldE5vUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXROb1BhcmFtcygpCisgIExpbmUgNTYyKSB3aW5uaW5nQ2FuZGlkYXRlLmdldE5vUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXROb1BhcmFtcygpCisgIExpbmUgNTYzKSB3aW5uaW5nQ2FuZGlkYXRlLmdldFBhcmFtVHlwZXMoKS5nZXQoaSkuZXF1YWxzKG90aGVyLmdldFBhcmFtVHlwZXMoKS5nZXQoaSkpID09PiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU2Mykgd2lubmluZ0NhbmRpZGF0ZS5nZXRQYXJhbVR5cGVzKCkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDU2Mykgd2lubmluZ0NhbmRpZGF0ZS5nZXRQYXJhbVR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkKKyAgTGluZSA1NjMpIG90aGVyLmdldFBhcmFtVHlwZXMoKS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNTYzKSBvdGhlci5nZXRQYXJhbVR5cGVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwubWV0aG9kcy5NZXRob2RVc2FnZS5nZXRQYXJhbVR5cGVzKCkKKyAgTGluZSA1NzEpIHNvbHZlTWV0aG9kSW5UeXBlKHR5cGVEZWNsYXJhdGlvbiwgbmFtZSwgYXJndW1lbnRzVHlwZXMsIGZhbHNlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLk1ldGhvZFJlc29sdXRpb25Mb2dpYy5zb2x2ZU1ldGhvZEluVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTg3KSAoKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLmdldENvbnRleHQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLmdldENvbnRleHQoKQorICBMaW5lIDU4OCkgY3R4LnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU5MSkgKChKYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uLmdldENvbnRleHQoKQorICBMaW5lIDU5MikgY3R4LnNvbHZlTWV0aG9kKG5hbWUsIGFyZ3VtZW50c1R5cGVzLCBzdGF0aWNPbmx5LCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDU5NSkgbmFtZS5lcXVhbHMoInZhbHVlcyIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDU5NSkgYXJndW1lbnRzVHlwZXMuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA1OTYpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQobmV3IEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24uVmFsdWVzTWV0aG9kKChKYXZhUGFyc2VyRW51bURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24sIHR5cGVTb2x2ZXIpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgNTk4KSAoKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSA1OTkpIGN0eC5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBib29sZWFuLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2MDIpICgoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uQ2xhc3NEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4pCisgIExpbmUgNjA1KSAoKFJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4pCisgIExpbmUgNjA4KSAoKFJlZmxlY3Rpb25FbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlZmxlY3Rpb25tb2RlbC5SZWZsZWN0aW9uRW51bURlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbikKKyAgTGluZSA2MTEpICgoSmF2YXNzaXN0SW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVNZXRob2QobmFtZSwgYXJndW1lbnRzVHlwZXMsIHN0YXRpY09ubHkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEludGVyZmFjZURlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbikKKyAgTGluZSA2MTQpICgoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbi5zb2x2ZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4sIGJvb2xlYW4pCisgIExpbmUgNjE3KSAoKEphdmFzc2lzdEVudW1EZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZU1ldGhvZChuYW1lLCBhcmd1bWVudHNUeXBlcywgc3RhdGljT25seSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXNzaXN0bW9kZWwuSmF2YXNzaXN0RW51bURlY2xhcmF0aW9uLnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbikKKyAgTGluZSA2MTkpIHR5cGVEZWNsYXJhdGlvbi5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDYxOSkgdHlwZURlY2xhcmF0aW9uLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDYyNSkgc291cmNlLmVxdWFscyh0YXJnZXQpID09PiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDYyOCkgc291cmNlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDYyOCkgdGFyZ2V0LmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDYyOSkgc291cmNlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDYzMCkgdGFyZ2V0LmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDYzMSkgc291cmNlUmVmVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRhcmdldFJlZlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA2MzEpIHNvdXJjZVJlZlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA2MzEpIHRhcmdldFJlZlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA2MzIpIHNvdXJjZVJlZlR5cGUuaXNSYXdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmlzUmF3VHlwZSgpCisgIExpbmUgNjMyKSB0YXJnZXRSZWZUeXBlLmlzUmF3VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5pc1Jhd1R5cGUoKQorICBMaW5lIDYzMykgc291cmNlUmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNjMzKSBzb3VyY2VSZWZUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSA2MzQpIGluZmVyVHlwZXMoc291cmNlUmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSwgdGFyZ2V0UmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSwgbWFwcGluZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmluZmVyVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDYzNCkgc291cmNlUmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA2MzQpIHNvdXJjZVJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDYzNCkgdGFyZ2V0UmVmVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA2MzQpIHRhcmdldFJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDY0MCkgc291cmNlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDY0MCkgdGFyZ2V0LmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgNjQxKSB0YXJnZXQuYXNXaWxkY2FyZCgpLmlzQm91bmRlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNCb3VuZGVkKCkKKyAgTGluZSA2NDEpIHRhcmdldC5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDY0MikgaW5mZXJUeXBlcyhzb3VyY2UsIHRhcmdldC5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgbWFwcGluZ3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uTWV0aG9kUmVzb2x1dGlvbkxvZ2ljLmluZmVyVHlwZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQorICBMaW5lIDY0MikgdGFyZ2V0LmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDY0MikgdGFyZ2V0LmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgNjQ3KSBzb3VyY2UuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSA2NDcpIHRhcmdldC5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDY1MCkgc291cmNlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDY1MCkgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSA2NTEpIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgNjUxKSB0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgNjU1KSBzb3VyY2UuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSA2NTUpIHRhcmdldC5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA2NTYpIHNvdXJjZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0JvdW5kZWQoKQorICBMaW5lIDY1Nikgc291cmNlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgNjU3KSBpbmZlclR5cGVzKHNvdXJjZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSwgdGFyZ2V0LCBtYXBwaW5ncykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5NZXRob2RSZXNvbHV0aW9uTG9naWMuaW5mZXJUeXBlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgNjU3KSBzb3VyY2UuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgNjU3KSBzb3VyY2UuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSA2NjIpIHNvdXJjZS5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDY2MikgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSA2NjMpIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgNjYzKSB0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgNjY2KSBzb3VyY2UuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDY2NikgdGFyZ2V0LmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSA2NjcpIG1hcHBpbmdzLnB1dCh0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCksIHNvdXJjZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgNjY3KSB0YXJnZXQuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgNjcwKSBzb3VyY2UuaXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNQcmltaXRpdmUoKQorICBMaW5lIDY3MCkgdGFyZ2V0LmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSA2NzMpIHNvdXJjZS5pc051bGwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNOdWxsKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fU3ltYm9sRGVjbGFyYXRvci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX1N5bWJvbERlY2xhcmF0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX1N5bWJvbERlY2xhcmF0b3IudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX1N5bWJvbFNvbHZlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX1N5bWJvbFNvbHZlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYWEwYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fU3ltYm9sU29sdmVyLnR4dApAQCAtMCwwICsxLDQwIEBACisgIExpbmUgNTgpIGNvbnRleHQuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjIpIHNvbHZlU3ltYm9sKG5hbWUsIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNjIpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA2NikgY29udGV4dC5zb2x2ZVN5bWJvbEFzVmFsdWUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2xBc1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDcwKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KG5vZGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNzEpIHNvbHZlU3ltYm9sQXNWYWx1ZShuYW1lLCBjb250ZXh0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLlN5bWJvbFNvbHZlci5zb2x2ZVN5bWJvbEFzVmFsdWUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA3NSkgY29udGV4dC5zb2x2ZVR5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDc5KSBzb2x2ZVR5cGUobmFtZSwgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi5TeW1ib2xTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQpCisgIExpbmUgNzkpIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSA4MykgY29udGV4dC5zb2x2ZU1ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHNUeXBlcywgZmFsc2UsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmNvcmUucmVzb2x1dGlvbi5Db250ZXh0LnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgYm9vbGVhbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgODQpIGRlY2wuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgODcpIGRlY2wuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA5MSkgc29sdmVNZXRob2QobWV0aG9kTmFtZSwgYXJndW1lbnRzVHlwZXMsIEphdmFQYXJzZXJGYWN0b3J5LmdldENvbnRleHQobm9kZSwgdHlwZVNvbHZlcikpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24uU3ltYm9sU29sdmVyLnNvbHZlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dCkKKyAgTGluZSA5MSkgSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChub2RlLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY3RvcnkuZ2V0Q29udGV4dChjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDk5KSAoKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0eXBlKS5nZXROYW1lKCkuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhJZGVudGlmaWVyLmdldElkKCkKKyAgTGluZSA5OSkgKChDbGFzc09ySW50ZXJmYWNlVHlwZSkgdHlwZSkuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGUuZ2V0TmFtZSgpCisgIExpbmUgMTAwKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHR5cGUsIHR5cGVTb2x2ZXIpLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTAwKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHR5cGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTAxKSByZWYuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgMTAyKSBKYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KHR5cGUsIHR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjdG9yeS5nZXRDb250ZXh0KGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZSwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTA0KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSAxMDYpIHR5cGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAxMDYpIHR5cGUuZ2V0Q2xhc3MoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5nZXRDbGFzcygpCisgIExpbmUgMTExKSBjb250ZXh0LnNvbHZlR2VuZXJpY1R5cGUobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVHZW5lcmljVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMTIpIGdlbmVyaWNUeXBlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxMTMpIGdlbmVyaWNUeXBlLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxMTUpIHR5cGVTb2x2ZXIuc29sdmVUeXBlKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjgpICgoSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckNsYXNzRGVjbGFyYXRpb24uZ2V0Q29udGV4dCgpCisgIExpbmUgMTI5KSBjdHguc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTMyKSAoKEphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRDb250ZXh0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLmRlY2xhcmF0aW9ucy5KYXZhUGFyc2VySW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0Q29udGV4dCgpCisgIExpbmUgMTMzKSBjdHguc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuY29yZS5yZXNvbHV0aW9uLkNvbnRleHQuc29sdmVTeW1ib2woamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTM2KSAoKEphdmFQYXJzZXJFbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuZ2V0Q29udGV4dCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5kZWNsYXJhdGlvbnMuSmF2YVBhcnNlckVudW1EZWNsYXJhdGlvbi5nZXRDb250ZXh0KCkKKyAgTGluZSAxMzcpIGN0eC5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5jb3JlLnJlc29sdXRpb24uQ29udGV4dC5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNDApICgoUmVmbGVjdGlvbkNsYXNzRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25DbGFzc0RlY2xhcmF0aW9uLnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE0MykgKChSZWZsZWN0aW9uSW50ZXJmYWNlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbikuc29sdmVTeW1ib2wobmFtZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVmbGVjdGlvbm1vZGVsLlJlZmxlY3Rpb25JbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZVN5bWJvbChqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNDYpICgoSmF2YXNzaXN0Q2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5zb2x2ZVN5bWJvbChuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhc3Npc3Rtb2RlbC5KYXZhc3Npc3RDbGFzc0RlY2xhcmF0aW9uLnNvbHZlU3ltYm9sKGphdmEubGFuZy5TdHJpbmcsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE0OCkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFZhbHVlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgMTU3KSAoKEphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJDbGFzc0RlY2xhcmF0aW9uLnNvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNjApICgoSmF2YVBhcnNlckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb24pLnNvbHZlVHlwZShuYW1lLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuZGVjbGFyYXRpb25zLkphdmFQYXJzZXJJbnRlcmZhY2VEZWNsYXJhdGlvbi5zb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZywgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTYyKSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19Db21iaW5lZFR5cGVTb2x2ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19Db21iaW5lZFR5cGVTb2x2ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjVhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX3R5cGVzb2x2ZXJzX0NvbWJpbmVkVHlwZVNvbHZlci50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgMzcpIGFkZChlbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5Db21iaW5lZFR5cGVTb2x2ZXIuYWRkKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDUyKSB0aGlzLmVsZW1lbnRzLmFkZCh0eXBlU29sdmVyKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNTMpIHR5cGVTb2x2ZXIuc2V0UGFyZW50KHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5zZXRQYXJlbnQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNTkpIHRzLnRyeVRvU29sdmVUeXBlKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYwKSByZXMuaXNTb2x2ZWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5pc1NvbHZlZCgpCisgIExpbmUgNjQpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgNjkpIHRyeVRvU29sdmVUeXBlKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuQ29tYmluZWRUeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzApIHJlcy5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA3MSkgcmVzLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX3R5cGVzb2x2ZXJzX0phclR5cGVTb2x2ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19KYXJUeXBlU29sdmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJlNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19KYXJUeXBlU29sdmVyLnR4dApAQCAtMCwwICsxLDMxIEBACisgIExpbmUgNDYpIGFkZFBhdGhUb0phcihwYXRoVG9KYXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlci5hZGRQYXRoVG9KYXIoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1MykgaW5zdGFuY2UuYWRkUGF0aFRvSmFyKHBhdGhUb0phcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXJUeXBlU29sdmVyLmFkZFBhdGhUb0phcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDYwKSBjbGFzc1Bvb2wuYXBwZW5kQ2xhc3NQYXRoKHBhdGhUb0phcikgPT0+IGphdmFzc2lzdC5DbGFzc1Bvb2wuYXBwZW5kQ2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjEpIGNsYXNzUG9vbC5hcHBlbmRTeXN0ZW1QYXRoKCkgPT0+IGphdmFzc2lzdC5DbGFzc1Bvb2wuYXBwZW5kU3lzdGVtUGF0aCgpCisgIExpbmUgNjcpIGphckZpbGUuZW50cmllcygpID09PiBqYXZhLnV0aWwuamFyLkphckZpbGUuZW50cmllcygpCisgIExpbmUgNjgpIGUuaGFzTW9yZUVsZW1lbnRzKCkgPT0+IGphdmEudXRpbC5FbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKQorICBMaW5lIDY5KSBlLm5leHRFbGVtZW50KCkgPT0+IGphdmEudXRpbC5FbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpCisgIExpbmUgNzApIGVudHJ5LmlzRGlyZWN0b3J5KCkgPT0+IGphdmEudXRpbC56aXAuWmlwRW50cnkuaXNEaXJlY3RvcnkoKQorICBMaW5lIDcwKSBlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVuZHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNzApIGVudHJ5LmdldE5hbWUoKSA9PT4gamF2YS51dGlsLnppcC5aaXBFbnRyeS5nZXROYW1lKCkKKyAgTGluZSA3MSkgZW50cnlQYXRoVG9DbGFzc05hbWUoZW50cnkuZ2V0TmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphclR5cGVTb2x2ZXIuZW50cnlQYXRoVG9DbGFzc05hbWUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3MSkgZW50cnkuZ2V0TmFtZSgpID09PiBqYXZhLnV0aWwuemlwLlppcEVudHJ5LmdldE5hbWUoKQorICBMaW5lIDcyKSBjbGFzc3BhdGhFbGVtZW50cy5wdXQobmFtZSwgbmV3IENsYXNzcGF0aEVsZW1lbnQoamFyRmlsZSwgZW50cnksIG5hbWUpKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSA4OCkgZW50cnlQYXRoLmVuZHNXaXRoKCIuY2xhc3MiKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lbmRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDkxKSBlbnRyeVBhdGguc3Vic3RyaW5nKDAsIGVudHJ5UGF0aC5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5zdWJzdHJpbmcoaW50LCBpbnQpCisgIExpbmUgOTEpIGVudHJ5UGF0aC5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDkxKSAiLmNsYXNzIi5sZW5ndGgoKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sZW5ndGgoKQorICBMaW5lIDkyKSBjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJykgPT0+IGphdmEubGFuZy5TdHJpbmcucmVwbGFjZShjaGFyLCBjaGFyKQorICBMaW5lIDkzKSBjbGFzc05hbWUucmVwbGFjZSgnJCcsICcuJykgPT0+IGphdmEubGFuZy5TdHJpbmcucmVwbGFjZShjaGFyLCBjaGFyKQorICBMaW5lIDEwMCkgY2xhc3NwYXRoRWxlbWVudHMuY29udGFpbnNLZXkobmFtZSkgPT0+IGphdmEudXRpbC5NYXAuY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDEpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YXNzaXN0RmFjdG9yeS50b1R5cGVEZWNsYXJhdGlvbihjbGFzc3BhdGhFbGVtZW50cy5nZXQobmFtZSkudG9DdENsYXNzKCksIGdldFJvb3QoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAxMDIpIEphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oY2xhc3NwYXRoRWxlbWVudHMuZ2V0KG5hbWUpLnRvQ3RDbGFzcygpLCBnZXRSb290KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFzc2lzdG1vZGVsLkphdmFzc2lzdEZhY3RvcnkudG9UeXBlRGVjbGFyYXRpb24oamF2YXNzaXN0LkN0Q2xhc3MsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDEwMikgY2xhc3NwYXRoRWxlbWVudHMuZ2V0KG5hbWUpLnRvQ3RDbGFzcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlci5DbGFzc3BhdGhFbGVtZW50LnRvQ3RDbGFzcygpCisgIExpbmUgMTAyKSBjbGFzc3BhdGhFbGVtZW50cy5nZXQobmFtZSkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTAyKSBnZXRSb290KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLmdldFJvb3QoKQorICBMaW5lIDEwNCkgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKFJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5jbGFzcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoamF2YS5sYW5nLkNsYXNzPFMyPikKKyAgTGluZSAxMTMpIHRyeVRvU29sdmVUeXBlKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmFyVHlwZVNvbHZlci50cnlUb1NvbHZlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDExNCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDExNSkgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCisgIExpbmUgMTMzKSBqYXJGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSA9PT4gamF2YS51dGlsLmphci5KYXJGaWxlLmdldElucHV0U3RyZWFtKGphdmEudXRpbC56aXAuWmlwRW50cnkpCisgIExpbmUgMTM0KSBjbGFzc1Bvb2wubWFrZUNsYXNzKGlzKSA9PT4gamF2YXNzaXN0LkNsYXNzUG9vbC5tYWtlQ2xhc3MoamF2YS5pby5JbnB1dFN0cmVhbSkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fdHlwZXNvbHZlcnNfSmF2YVBhcnNlclR5cGVTb2x2ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19KYXZhUGFyc2VyVHlwZVNvbHZlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmYWE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItY29yZS9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX3Jlc29sdXRpb25fdHlwZXNvbHZlcnNfSmF2YVBhcnNlclR5cGVTb2x2ZXIudHh0CkBAIC0wLDAgKzEsNDggQEAKKyAgTGluZSA3MikgcGFyc2VkRmlsZXMuY29udGFpbnNLZXkoc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkgPT0+IGphdmEudXRpbC5NYXAuY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3Mikgc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSA9PT4gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCisgIExpbmUgNzMpIHBhcnNlZEZpbGVzLnB1dChzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpLCBKYXZhUGFyc2VyLnBhcnNlKHNyY0ZpbGUpKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSA3Mykgc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSA9PT4gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCisgIExpbmUgNzMpIEphdmFQYXJzZXIucGFyc2Uoc3JjRmlsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlKGphdmEuaW8uRmlsZSkKKyAgTGluZSA3NSkgcGFyc2VkRmlsZXMuZ2V0KHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpID09PiBqYXZhLnV0aWwuTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc1KSBzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpID09PiBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgTGluZSA3OSkgcGFyc2VkRGlyZWN0b3JpZXMuY29udGFpbnNLZXkoc3JjRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKSA9PT4gamF2YS51dGlsLk1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc5KSBzcmNEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgPT0+IGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICBMaW5lIDgxKSBzcmNEaXJlY3RvcnkubGlzdEZpbGVzKCkgPT0+IGphdmEuaW8uRmlsZS5saXN0RmlsZXMoKQorICBMaW5lIDgyKSBzcmNEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgPT0+IGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICBMaW5lIDg0KSBmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVuZHNXaXRoKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgODQpIGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcudG9Mb3dlckNhc2UoKQorICBMaW5lIDg0KSBmaWxlLmdldE5hbWUoKSA9PT4gamF2YS5pby5GaWxlLmdldE5hbWUoKQorICBMaW5lIDg1KSB1bml0cy5hZGQocGFyc2UoZmlsZSkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA4NSkgcGFyc2UoZmlsZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlci5wYXJzZShqYXZhLmlvLkZpbGUpCisgIExpbmUgODgpIHBhcnNlZERpcmVjdG9yaWVzLnB1dChzcmNEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCksIHVuaXRzKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSA4OCkgc3JjRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpID09PiBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgTGluZSA5MSkgcGFyc2VkRGlyZWN0b3JpZXMuZ2V0KHNyY0RpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTEpIHNyY0RpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSA9PT4gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCisgIExpbmUgOTYpIHNyY0Rpci5leGlzdHMoKSA9PT4gamF2YS5pby5GaWxlLmV4aXN0cygpCisgIExpbmUgOTYpIHNyY0Rpci5pc0RpcmVjdG9yeSgpID09PiBqYXZhLmlvLkZpbGUuaXNEaXJlY3RvcnkoKQorICBMaW5lIDk3KSBzcmNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgPT0+IGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICBMaW5lIDEwMikgZm91bmRUeXBlcy5jb250YWluc0tleShuYW1lKSA9PT4gamF2YS51dGlsLk1hcC5jb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDEwMykgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChmb3VuZFR5cGVzLmdldChuYW1lKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDEwMykgZm91bmRUeXBlcy5nZXQobmFtZSkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA1KSB0cnlUb1NvbHZlVHlwZVVuY2FjaGVkKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuSmF2YVBhcnNlclR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGVVbmNhY2hlZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEwNikgcmVzdWx0LmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDEwNykgZm91bmRUeXBlcy5wdXQobmFtZSwgcmVzdWx0LmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSAxMDcpIHJlc3VsdC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDExNCkgbmFtZS5zcGxpdCgiXFwuIikgPT0+IGphdmEubGFuZy5TdHJpbmcuc3BsaXQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMTcpIHNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSA9PT4gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpCisgIExpbmUgMTMzKSBwYXJzZShzcmNGaWxlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZXNvbHV0aW9uLnR5cGVzb2x2ZXJzLkphdmFQYXJzZXJUeXBlU29sdmVyLnBhcnNlKGphdmEuaW8uRmlsZSkKKyAgTGluZSAxMzQpIE5hdmlnYXRvci5maW5kVHlwZShjb21waWxhdGlvblVuaXQsIHR5cGVOYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VyLk5hdmlnYXRvci5maW5kVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdCwgamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzUpIGFzdFR5cGVEZWNsYXJhdGlvbi5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTM2KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKEphdmFQYXJzZXJGYWNhZGUuZ2V0KHRoaXMpLmdldFR5cGVEZWNsYXJhdGlvbihhc3RUeXBlRGVjbGFyYXRpb24uZ2V0KCkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgMTM2KSBKYXZhUGFyc2VyRmFjYWRlLmdldCh0aGlzKS5nZXRUeXBlRGVjbGFyYXRpb24oYXN0VHlwZURlY2xhcmF0aW9uLmdldCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5qYXZhcGFyc2VybW9kZWwuSmF2YVBhcnNlckZhY2FkZS5nZXRUeXBlRGVjbGFyYXRpb24oY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjw/PikKKyAgTGluZSAxMzYpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxMzYpIGFzdFR5cGVEZWNsYXJhdGlvbi5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMTQzKSBwYXJzZURpcmVjdG9yeShzcmNGaWxlLmdldFBhcmVudEZpbGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIucmVzb2x1dGlvbi50eXBlc29sdmVycy5KYXZhUGFyc2VyVHlwZVNvbHZlci5wYXJzZURpcmVjdG9yeShqYXZhLmlvLkZpbGUpCisgIExpbmUgMTQzKSBzcmNGaWxlLmdldFBhcmVudEZpbGUoKSA9PT4gamF2YS5pby5GaWxlLmdldFBhcmVudEZpbGUoKQorICBMaW5lIDE0NSkgTmF2aWdhdG9yLmZpbmRUeXBlKGNvbXBpbGF0aW9uVW5pdCwgdHlwZU5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXIuTmF2aWdhdG9yLmZpbmRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0LCBqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDE0NikgYXN0VHlwZURlY2xhcmF0aW9uLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAxNDcpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoSmF2YVBhcnNlckZhY2FkZS5nZXQodGhpcykuZ2V0VHlwZURlY2xhcmF0aW9uKGFzdFR5cGVEZWNsYXJhdGlvbi5nZXQoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSAxNDcpIEphdmFQYXJzZXJGYWNhZGUuZ2V0KHRoaXMpLmdldFR5cGVEZWNsYXJhdGlvbihhc3RUeXBlRGVjbGFyYXRpb24uZ2V0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmphdmFwYXJzZXJtb2RlbC5KYXZhUGFyc2VyRmFjYWRlLmdldFR5cGVEZWNsYXJhdGlvbihjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uPD8+KQorICBMaW5lIDE0NykgSmF2YVBhcnNlckZhY2FkZS5nZXQodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIuamF2YXBhcnNlcm1vZGVsLkphdmFQYXJzZXJGYWNhZGUuZ2V0KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDE0NykgYXN0VHlwZURlY2xhcmF0aW9uLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAxNTUpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX3R5cGVzb2x2ZXJzX01lbW9yeVR5cGVTb2x2ZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19NZW1vcnlUeXBlU29sdmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzczM2RiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19NZW1vcnlUeXBlU29sdmVyLnR4dApAQCAtMCwwICsxLDkgQEAKKyAgTGluZSA1MSkgcGFyZW50LmVxdWFscyh0aGF0LnBhcmVudCkgPT0+IGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTIpIGRlY2xhcmF0aW9uTWFwLmVxdWFscyh0aGF0LmRlY2xhcmF0aW9uTWFwKSA9PT4gamF2YS51dGlsLk1hcC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1OCkgcGFyZW50Lmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDU5KSBkZWNsYXJhdGlvbk1hcC5oYXNoQ29kZSgpID09PiBqYXZhLnV0aWwuTWFwLmhhc2hDb2RlKCkKKyAgTGluZSA3NCkgdGhpcy5kZWNsYXJhdGlvbk1hcC5wdXQobmFtZSwgdHlwZURlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSA3OSkgZGVjbGFyYXRpb25NYXAuY29udGFpbnNLZXkobmFtZSkgPT0+IGphdmEudXRpbC5NYXAuY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MCkgU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChkZWNsYXJhdGlvbk1hcC5nZXQobmFtZSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA4MCkgZGVjbGFyYXRpb25NYXAuZ2V0KG5hbWUpID09PiBqYXZhLnV0aWwuTWFwLmdldChqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgyKSBTeW1ib2xSZWZlcmVuY2UudW5zb2x2ZWQoUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmNsYXNzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19SZWZsZWN0aW9uVHlwZVNvbHZlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWNvcmUvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9yZXNvbHV0aW9uX3R5cGVzb2x2ZXJzX1JlZmxlY3Rpb25UeXBlU29sdmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTI3YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1jb3JlL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfcmVzb2x1dGlvbl90eXBlc29sdmVyc19SZWZsZWN0aW9uVHlwZVNvbHZlci50eHQKQEAgLTAsMCArMSwyNiBAQAorICBMaW5lIDU1KSBuYW1lLnN0YXJ0c1dpdGgoImphdmEuIikgPT0+IGphdmEubGFuZy5TdHJpbmcuc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDU1KSBuYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN0YXJ0c1dpdGgoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1NykgUmVmbGVjdGlvblR5cGVTb2x2ZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENsYXNzTG9hZGVyKCkKKyAgTGluZSA2NSkgY2xhc3NMb2FkZXIubG9hZENsYXNzKG5hbWUpID09PiBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIubG9hZENsYXNzKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjYpIFN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGNsYXp6LCBnZXRSb290KCkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5zb2x2ZWQoUzIpCisgIExpbmUgNjYpIFJlZmxlY3Rpb25GYWN0b3J5LnR5cGVEZWNsYXJhdGlvbkZvcihjbGF6eiwgZ2V0Um9vdCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5yZWZsZWN0aW9ubW9kZWwuUmVmbGVjdGlvbkZhY3RvcnkudHlwZURlY2xhcmF0aW9uRm9yKGphdmEubGFuZy5DbGFzczw/PiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNjYpIGdldFJvb3QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuZ2V0Um9vdCgpCisgIExpbmUgNjkpIG5hbWUubGFzdEluZGV4T2YoJy4nKSA9PT4gamF2YS5sYW5nLlN0cmluZy5sYXN0SW5kZXhPZihpbnQpCisgIExpbmUgNzEpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgNzMpIG5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQsIGludCkKKyAgTGluZSA3NCkgbmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpID09PiBqYXZhLmxhbmcuU3RyaW5nLnN1YnN0cmluZyhpbnQpCisgIExpbmUgNzUpIHRyeVRvU29sdmVUeXBlKHBhcmVudE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLnJlc29sdXRpb24udHlwZXNvbHZlcnMuUmVmbGVjdGlvblR5cGVTb2x2ZXIudHJ5VG9Tb2x2ZVR5cGUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA3NikgcGFyZW50LmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDc3KSBwYXJlbnQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaW50ZXJuYWxUeXBlcygpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpLmZpbmRGaXJzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maW5kRmlyc3QoKQorICBMaW5lIDc3KSBwYXJlbnQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaW50ZXJuYWxUeXBlcygpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDc3KSBwYXJlbnQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaW50ZXJuYWxUeXBlcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDc3KSBwYXJlbnQuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgNzcpIHBhcmVudC5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKQorICBMaW5lIDc4KSBpdC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzgpIGl0LmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNzkpIGlubmVyQ2xhc3MuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDgwKSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKGlubmVyQ2xhc3MuZ2V0KCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnNvbHZlZChTMikKKyAgTGluZSA4MCkgaW5uZXJDbGFzcy5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgODIpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgODUpIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCisgIExpbmUgOTApIFN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChSZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uY2xhc3MpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGphdmEubGFuZy5DbGFzczxTMj4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9sb2dpY19BYnN0cmFjdENsYXNzRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTFhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDE4IEBACisgIExpbmUgMzkpIGdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDQ1KSBnZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgNDcpIHN1cGVyY2xhc3Nlcy5hZGQoc3VwZXJDbGFzcykgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDQ4KSBzdXBlcmNsYXNzZXMuYWRkQWxsKHN1cGVyQ2xhc3MuZ2V0QWxsQ2xhc3Nlc0FuY2VzdG9ycygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSA0OCkgc3VwZXJDbGFzcy5nZXRBbGxDbGFzc2VzQW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldEFsbENsYXNzZXNBbmNlc3RvcnMoKQorICBMaW5lIDUxKSBzdXBlcmNsYXNzZXMucmVtb3ZlSWYocyAtPiBzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5yZW1vdmVJZihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgRT4pCisgIExpbmUgNTEpIHMuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MSkgcy5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDUxKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNTIpIHN1cGVyY2xhc3Nlcy5hZGQob2JqZWN0KCkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA1Mikgb2JqZWN0KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uLm9iamVjdCgpCisgIExpbmUgNjApIGdldEludGVyZmFjZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuQ2xhc3NEZWNsYXJhdGlvbi5nZXRJbnRlcmZhY2VzKCkKKyAgTGluZSA2MSkgaW50ZXJmYWNlcy5hZGQoaW50ZXJmYWNlRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSA2MikgaW50ZXJmYWNlcy5hZGRBbGwoaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlc0FuY2VzdG9ycygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSA2MikgaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0QWxsSW50ZXJmYWNlc0FuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRBbGxJbnRlcmZhY2VzQW5jZXN0b3JzKCkKKyAgTGluZSA2NCkgdGhpcy5nZXRTdXBlckNsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJDbGFzcygpCisgIExpbmUgNjYpIGludGVyZmFjZXMuYWRkQWxsKHN1cGVyQ2xhc3MuZ2V0QWxsSW50ZXJmYWNlc0FuY2VzdG9ycygpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSA2Nikgc3VwZXJDbGFzcy5nZXRBbGxJbnRlcmZhY2VzQW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldEFsbEludGVyZmFjZXNBbmNlc3RvcnMoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0Fic3RyYWN0VHlwZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9sb2dpY19BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExOGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9sb2dpY19BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSwxMyBAQAorICBMaW5lIDQyKSBnZXREZWNsYXJlZE1ldGhvZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldERlY2xhcmVkTWV0aG9kcygpCisgIExpbmUgNDMpIG1ldGhvZHMuYWRkKG5ldyBNZXRob2RVc2FnZShtZXRob2REZWNsYXJhdGlvbikpID09PiBqYXZhLnV0aWwuU2V0LmFkZChFKQorICBMaW5lIDQ0KSBtZXRob2RzU2lnbmF0dXJlcy5hZGQobWV0aG9kRGVjbGFyYXRpb24uZ2V0U2lnbmF0dXJlKCkpID09PiBqYXZhLnV0aWwuU2V0LmFkZChFKQorICBMaW5lIDQ0KSBtZXRob2REZWNsYXJhdGlvbi5nZXRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFNpZ25hdHVyZSgpCisgIExpbmUgNDcpIGdldEFsbEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkKKyAgTGluZSA0OCkgYW5jZXN0b3IuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldERlY2xhcmVkTWV0aG9kcygpCisgIExpbmUgNDkpIG11LmdldERlY2xhcmF0aW9uKCkuZ2V0U2lnbmF0dXJlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRTaWduYXR1cmUoKQorICBMaW5lIDQ5KSBtdS5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKQorICBMaW5lIDUwKSBtZXRob2RzU2lnbmF0dXJlcy5jb250YWlucyhzaWduYXR1cmUpID09PiBqYXZhLnV0aWwuU2V0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTEpIG1ldGhvZHNTaWduYXR1cmVzLmFkZChzaWduYXR1cmUpID09PiBqYXZhLnV0aWwuU2V0LmFkZChFKQorICBMaW5lIDUyKSBtZXRob2RzLmFkZChtdSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgNjIpIEZ1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy5nZXRGdW5jdGlvbmFsTWV0aG9kKHRoaXMpLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA2MikgRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QodGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0NvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfQ29uZmlsaWN0aW5nR2VuZXJpY1R5cGVzRXhjZXB0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY1Y2ZmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0NvbmZpbGljdGluZ0dlbmVyaWNUeXBlc0V4Y2VwdGlvbi50eHQKQEAgLTAsMCArMSBAQAorICBMaW5lIDExKSBTdHJpbmcuZm9ybWF0KCJObyBtYXRjaGluZyBiZXR3ZWVuICVzIChmb3JtYWwpIGFuZCAlcyAoYWN0dWFsKSIsIGZvcm1hbFR5cGUsIGFjdHVhbFR5cGUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0Z1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM1OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0Z1bmN0aW9uYWxJbnRlcmZhY2VMb2dpYy50eHQKQEAgLTAsMCArMSw0MiBAQAorICBMaW5lIDQ0KSB0eXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDQ0KSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpLmlzSW50ZXJmYWNlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpCisgIExpbmUgNDQpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgNDQpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNDUpIGdldEZ1bmN0aW9uYWxNZXRob2QodHlwZS5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLmdldEZ1bmN0aW9uYWxNZXRob2QoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDQ1KSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDQ1KSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDQ3KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDU2KSB0eXBlRGVjbGFyYXRpb24uZ2V0QWxsTWV0aG9kcygpLnN0cmVhbSgpLmZpbHRlcihtIC0+IG0uZ2V0RGVjbGFyYXRpb24oKS5pc0Fic3RyYWN0KCkpLmZpbHRlcihtIC0+ICFkZWNsYXJlZE9uT2JqZWN0KG0pKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA1NikgdHlwZURlY2xhcmF0aW9uLmdldEFsbE1ldGhvZHMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmdldERlY2xhcmF0aW9uKCkuaXNBYnN0cmFjdCgpKS5maWx0ZXIobSAtPiAhZGVjbGFyZWRPbk9iamVjdChtKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgNTYpIHR5cGVEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkuZmlsdGVyKG0gLT4gbS5nZXREZWNsYXJhdGlvbigpLmlzQWJzdHJhY3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgNTYpIHR5cGVEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNTYpIHR5cGVEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbGxNZXRob2RzKCkKKyAgTGluZSA1NykgbS5nZXREZWNsYXJhdGlvbigpLmlzQWJzdHJhY3QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24uaXNBYnN0cmFjdCgpCisgIExpbmUgNTcpIG0uZ2V0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkKKyAgTGluZSA2MCkgZGVjbGFyZWRPbk9iamVjdChtKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZGVjbGFyZWRPbk9iamVjdChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UpCisgIExpbmUgNjEpIENvbGxlY3RvcnMudG9TZXQoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvU2V0KCkKKyAgTGluZSA2MykgbWV0aG9kcy5zaXplKCkgPT0+IGphdmEudXRpbC5TZXQuc2l6ZSgpCisgIExpbmUgNjQpIE9wdGlvbmFsLm9mKG1ldGhvZHMuaXRlcmF0b3IoKS5uZXh0KCkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSA2NCkgbWV0aG9kcy5pdGVyYXRvcigpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDY0KSBtZXRob2RzLml0ZXJhdG9yKCkgPT0+IGphdmEudXRpbC5TZXQuaXRlcmF0b3IoKQorICBMaW5lIDY2KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDcxKSBTdHJpbmcuZm9ybWF0KCIlcyglcykiLCBtLmdldE5hbWUoKSwgU3RyaW5nLmpvaW4oIiwgIiwgQXJyYXlzLnN0cmVhbShtLmdldFBhcmFtZXRlcnMoKSkubWFwKHAgLT4gdG9TaWduYXR1cmUocCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSA3MSkgbS5nZXROYW1lKCkgPT0+IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5nZXROYW1lKCkKKyAgTGluZSA3MSkgU3RyaW5nLmpvaW4oIiwgIiwgQXJyYXlzLnN0cmVhbShtLmdldFBhcmFtZXRlcnMoKSkubWFwKHAgLT4gdG9TaWduYXR1cmUocCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmpvaW4oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlPikKKyAgTGluZSA3MSkgQXJyYXlzLnN0cmVhbShtLmdldFBhcmFtZXRlcnMoKSkubWFwKHAgLT4gdG9TaWduYXR1cmUocCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA3MSkgQXJyYXlzLnN0cmVhbShtLmdldFBhcmFtZXRlcnMoKSkubWFwKHAgLT4gdG9TaWduYXR1cmUocCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDcxKSBBcnJheXMuc3RyZWFtKG0uZ2V0UGFyYW1ldGVycygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDcxKSBtLmdldFBhcmFtZXRlcnMoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuRXhlY3V0YWJsZS5nZXRQYXJhbWV0ZXJzKCkKKyAgTGluZSA3MSkgdG9TaWduYXR1cmUocCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuRnVuY3Rpb25hbEludGVyZmFjZUxvZ2ljLnRvU2lnbmF0dXJlKGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcikKKyAgTGluZSA3MSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgNzUpIHAuZ2V0VHlwZSgpLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDc1KSBwLmdldFR5cGUoKSA9PT4gamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyLmdldFR5cGUoKQorICBMaW5lIDc4KSBBcnJheXMuc3RyZWFtKE9iamVjdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkubWFwKG1ldGhvZCAtPiBnZXRTaWduYXR1cmUobWV0aG9kKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDc4KSBBcnJheXMuc3RyZWFtKE9iamVjdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSkubWFwKG1ldGhvZCAtPiBnZXRTaWduYXR1cmUobWV0aG9kKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgNzgpIEFycmF5cy5zdHJlYW0oT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpKSA9PT4gamF2YS51dGlsLkFycmF5cy5zdHJlYW0oVFtdKQorICBMaW5lIDc4KSBPYmplY3QuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKQorICBMaW5lIDc5KSBnZXRTaWduYXR1cmUobWV0aG9kKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5GdW5jdGlvbmFsSW50ZXJmYWNlTG9naWMuZ2V0U2lnbmF0dXJlKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKKyAgTGluZSA4MCkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgODMpIE9CSkVDVF9NRVRIT0RTX1NJR05BVFVSRVMuY29udGFpbnMobS5nZXREZWNsYXJhdGlvbigpLmdldFNpZ25hdHVyZSgpKSA9PT4gamF2YS51dGlsLkxpc3QuY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4MykgbS5nZXREZWNsYXJhdGlvbigpLmdldFNpZ25hdHVyZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0U2lnbmF0dXJlKCkKKyAgTGluZSA4MykgbS5nZXREZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UuZ2V0RGVjbGFyYXRpb24oKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0luZmVyZW5jZUNvbnRleHQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1sb2dpYy9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX2xvZ2ljX0luZmVyZW5jZUNvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTFhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfSW5mZXJlbmNlQ29udGV4dC50eHQKQEAgLTAsMCArMSwxNjkgQEAKKyAgTGluZSA0NCkgaW5mZXJlbmNlVmFyaWFibGVUeXBlTWFwLmNvbnRhaW5zS2V5KHRwLmdldE5hbWUoKSkgPT0+IGphdmEudXRpbC5NYXAuY29udGFpbnNLZXkoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0NCkgdHAuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNDYpIGluZmVyZW5jZVZhcmlhYmxlVHlwZXMuYWRkKGluZmVyZW5jZVZhcmlhYmxlVHlwZSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDQ3KSBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuc2V0Q29ycmVzcG9uZGluZ1RwKHRwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VWYXJpYWJsZVR5cGUuc2V0Q29ycmVzcG9uZGluZ1RwKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikKKyAgTGluZSA0OCkgaW5mZXJlbmNlVmFyaWFibGVUeXBlTWFwLnB1dCh0cC5nZXROYW1lKCksIGluZmVyZW5jZVZhcmlhYmxlVHlwZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgNDgpIHRwLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDUwKSBpbmZlcmVuY2VWYXJpYWJsZVR5cGVNYXAuZ2V0KHRwLmdldE5hbWUoKSkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTApIHRwLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDU4KSBwbGFjZUluZmVyZW5jZVZhcmlhYmxlcyh0YXJnZXQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQucGxhY2VJbmZlcmVuY2VWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNTkpIHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKGFjdHVhbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5wbGFjZUluZmVyZW5jZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA2MCkgcmVnaXN0ZXJDb3JyZXNwb25kYW5jZSh0YXJnZXQsIGFjdHVhbCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZWdpc3RlckNvcnJlc3BvbmRhbmNlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA2NSkgcGxhY2VJbmZlcmVuY2VWYXJpYWJsZXMoYWN0dWFsKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDY5KSBmb3JtYWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDY5KSBhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDcwKSBmb3JtYWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDcxKSBhY3R1YWxUeXBlLmFzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDczKSBmb3JtYWxUeXBlQXNSZWZlcmVuY2UuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhhY3R1YWxUeXBlQXNSZWZlcmVuY2UuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3MykgZm9ybWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNzMpIGFjdHVhbFR5cGVBc1JlZmVyZW5jZS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDc0KSBhY3R1YWxUeXBlQXNSZWZlcmVuY2UuZ2V0QWxsQW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldEFsbEFuY2VzdG9ycygpCisgIExpbmUgNzUpIGZvcm1hbFR5cGVBc1JlZmVyZW5jZS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDc2KSBhbmNlc3RvcnMuc3RyZWFtKCkuZmlsdGVyKChhKSAtPiBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZm9ybWFsUGFyYW1UeXBlUU5hbWUpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNzYpIGFuY2VzdG9ycy5zdHJlYW0oKS5maWx0ZXIoKGEpIC0+IGEuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhmb3JtYWxQYXJhbVR5cGVRTmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDc2KSBhbmNlc3RvcnMuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNzYpIGEuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhmb3JtYWxQYXJhbVR5cGVRTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzYpIGEuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA3NikgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgNzcpIGNvcnJlc3BvbmRpbmdGb3JtYWxUeXBlLmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLkxpc3QuaXNFbXB0eSgpCisgIExpbmUgNzgpIGZvcm1hbFR5cGVBc1JlZmVyZW5jZS5nZXRBbGxBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0QWxsQW5jZXN0b3JzKCkKKyAgTGluZSA3OSkgYWN0dWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgODApIGFuY2VzdG9ycy5zdHJlYW0oKS5maWx0ZXIoYSAtPiBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYWN0dWFsUGFyYW1UeXBlUW5hbWUpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgODApIGFuY2VzdG9ycy5zdHJlYW0oKS5maWx0ZXIoYSAtPiBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYWN0dWFsUGFyYW1UeXBlUW5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA4MCkgYW5jZXN0b3JzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDgwKSBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYWN0dWFsUGFyYW1UeXBlUW5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDgwKSBhLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgODApIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDgxKSBjb3JyZXNwb25kaW5nQWN0dWFsVHlwZS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5MaXN0LmlzRW1wdHkoKQorICBMaW5lIDg3KSBjb3JyZXNwb25kaW5nRm9ybWFsVHlwZS5nZXQoMCkuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgODcpIGNvcnJlc3BvbmRpbmdGb3JtYWxUeXBlLmdldCgwKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA5MCkgZm9ybWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYWN0dWFsVHlwZUFzUmVmZXJlbmNlLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgOTApIGZvcm1hbFR5cGVBc1JlZmVyZW5jZS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDkwKSBhY3R1YWxUeXBlQXNSZWZlcmVuY2UuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA5MSkgZm9ybWFsVHlwZUFzUmVmZXJlbmNlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSA5MSkgZm9ybWFsVHlwZUFzUmVmZXJlbmNlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSA5MikgYWN0dWFsVHlwZUFzUmVmZXJlbmNlLmlzUmF3VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5pc1Jhd1R5cGUoKQorICBMaW5lIDk2KSBmb3JtYWxUeXBlQXNSZWZlcmVuY2UudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDk3KSByZWdpc3RlckNvcnJlc3BvbmRhbmNlKGZvcm1hbFR5cGVQYXJhbWV0ZXIsIGFjdHVhbFR5cGVBc1JlZmVyZW5jZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5yZWdpc3RlckNvcnJlc3BvbmRhbmNlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA5NykgYWN0dWFsVHlwZUFzUmVmZXJlbmNlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDk3KSBhY3R1YWxUeXBlQXNSZWZlcmVuY2UudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDEwMykgYWN0dWFsVHlwZS5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMTA0KSAoKEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgZm9ybWFsVHlwZSkucmVnaXN0ZXJFcXVpdmFsZW50VHlwZShhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VWYXJpYWJsZVR5cGUucmVnaXN0ZXJFcXVpdmFsZW50VHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMDYpICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBhY3R1YWxUeXBlKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGZvcm1hbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDEwOCkgYWN0dWFsVHlwZS5pc051bGwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNOdWxsKCkKKyAgTGluZSAxMTApIGFjdHVhbFR5cGUuZXF1YWxzKGZvcm1hbFR5cGUpID09PiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMikgYWN0dWFsVHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDExMikgZm9ybWFsVHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDExMykgcmVnaXN0ZXJDb3JyZXNwb25kYW5jZShmb3JtYWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBhY3R1YWxUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDExMykgZm9ybWFsVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSAxMTMpIGZvcm1hbFR5cGUuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDExMykgYWN0dWFsVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSAxMTMpIGFjdHVhbFR5cGUuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDExNCkgZm9ybWFsVHlwZS5pc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDExNikgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0JvdW5kZWQoKQorICBMaW5lIDExNikgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDExNykgKChJbmZlcmVuY2VWYXJpYWJsZVR5cGUpIGFjdHVhbFR5cGUpLnJlZ2lzdGVyRXF1aXZhbGVudFR5cGUoZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlLnJlZ2lzdGVyRXF1aXZhbGVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTE3KSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDExNykgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDExOCkgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAxMTgpIGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMTkpICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGFjdHVhbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDExOSkgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAxMTkpIGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMjIpIGFjdHVhbFR5cGUuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSAxMjMpIGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMjQpIGFjdHVhbFR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMjUpIGZvcm1hbFdpbGRjYXJkLmlzQm91bmRlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNCb3VuZGVkKCkKKyAgTGluZSAxMjUpIGZvcm1hbFdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMTI2KSBmb3JtYWxXaWxkY2FyZC5pc1N1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc1N1cGVyKCkKKyAgTGluZSAxMjYpIGFjdHVhbFdpbGRjYXJkLmlzU3VwZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzU3VwZXIoKQorICBMaW5lIDEyNykgKChJbmZlcmVuY2VWYXJpYWJsZVR5cGUpIGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpLnJlZ2lzdGVyRXF1aXZhbGVudFR5cGUoYWN0dWFsV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlLnJlZ2lzdGVyRXF1aXZhbGVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTI3KSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDEyNykgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDEyNykgYWN0dWFsV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAxMjgpIGZvcm1hbFdpbGRjYXJkLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSAxMjgpIGFjdHVhbFdpbGRjYXJkLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSAxMjkpICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGFjdHVhbFdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDEyOSkgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAxMjkpIGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxMjkpIGFjdHVhbFdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMTM0KSBhY3R1YWxUeXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDEzNSkgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0JvdW5kZWQoKQorICBMaW5lIDEzNSkgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDEzNikgcmVnaXN0ZXJDb3JyZXNwb25kYW5jZShmb3JtYWxUeXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpLCBhY3R1YWxUeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDEzNikgZm9ybWFsVHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAxMzYpIGZvcm1hbFR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxNDEpICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBhY3R1YWxUeXBlKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGZvcm1hbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE0MykgKChJbmZlcmVuY2VWYXJpYWJsZVR5cGUpIGFjdHVhbFR5cGUpLnJlZ2lzdGVyRXF1aXZhbGVudFR5cGUoZm9ybWFsVHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlLnJlZ2lzdGVyRXF1aXZhbGVudFR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTQ1KSBhY3R1YWxUeXBlLmlzQ29uc3RyYWludCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0NvbnN0cmFpbnQoKQorICBMaW5lIDE0NikgYWN0dWFsVHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzQ29uc3RyYWludFR5cGUoKQorICBMaW5lIDE0NykgY29uc3RyYWludFR5cGUuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSAxNDgpICgoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSBjb25zdHJhaW50VHlwZS5nZXRCb3VuZCgpKS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGZvcm1hbFR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5yZWdpc3RlckVxdWl2YWxlbnRUeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE0OCkgY29uc3RyYWludFR5cGUuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSAxNTApIGFjdHVhbFR5cGUuaXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNQcmltaXRpdmUoKQorICBMaW5lIDE1MSkgZm9ybWFsVHlwZS5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMTU0KSByZWdpc3RlckNvcnJlc3BvbmRhbmNlKGZvcm1hbFR5cGUsIG9iamVjdFByb3ZpZGVyLmJ5TmFtZShhY3R1YWxUeXBlLmFzUHJpbWl0aXZlKCkuZ2V0Qm94VHlwZVFOYW1lKCkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlZ2lzdGVyQ29ycmVzcG9uZGFuY2UoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE1NCkgb2JqZWN0UHJvdmlkZXIuYnlOYW1lKGFjdHVhbFR5cGUuYXNQcmltaXRpdmUoKS5nZXRCb3hUeXBlUU5hbWUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuT2JqZWN0UHJvdmlkZXIuYnlOYW1lKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTU0KSBhY3R1YWxUeXBlLmFzUHJpbWl0aXZlKCkuZ2V0Qm94VHlwZVFOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5QcmltaXRpdmVUeXBlLmdldEJveFR5cGVRTmFtZSgpCisgIExpbmUgMTU0KSBhY3R1YWxUeXBlLmFzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUHJpbWl0aXZlKCkKKyAgTGluZSAxNTcpIGZvcm1hbFR5cGUuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDE1NykgYWN0dWFsVHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTYyKSB0eXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMTYzKSB0eXBlLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzRXh0ZW5kcygpCisgIExpbmUgMTYzKSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTY0KSBXaWxkY2FyZC5leHRlbmRzQm91bmQocGxhY2VJbmZlcmVuY2VWYXJpYWJsZXModHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE2NCkgcGxhY2VJbmZlcmVuY2VWYXJpYWJsZXModHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5wbGFjZUluZmVyZW5jZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNjQpIHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMTY0KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTY1KSB0eXBlLmFzV2lsZGNhcmQoKS5pc1N1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc1N1cGVyKCkKKyAgTGluZSAxNjUpIHR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAxNjYpIFdpbGRjYXJkLnN1cGVyQm91bmQocGxhY2VJbmZlcmVuY2VWYXJpYWJsZXModHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuc3VwZXJCb3VuZChjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNjYpIHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQucGxhY2VJbmZlcmVuY2VWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTY2KSB0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDE2NikgdHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDE3MCkgdHlwZS5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTcxKSBpbmZlcmVuY2VWYXJpYWJsZVR5cGVGb3JUcCh0eXBlLmFzVHlwZVBhcmFtZXRlcigpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LmluZmVyZW5jZVZhcmlhYmxlVHlwZUZvclRwKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikKKyAgTGluZSAxNzEpIHR5cGUuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzVHlwZVBhcmFtZXRlcigpCisgIExpbmUgMTcyKSB0eXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDE3MykgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyh0cCAtPiBwbGFjZUluZmVyZW5jZVZhcmlhYmxlcyh0cCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50cmFuc2Zvcm1UeXBlUGFyYW1ldGVycyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZVRyYW5zZm9ybWVyKQorICBMaW5lIDE3MykgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxNzMpIHBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKHRwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE3NCkgdHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDE3NSkgcGxhY2VJbmZlcmVuY2VWYXJpYWJsZXModHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlQ29udGV4dC5wbGFjZUluZmVyZW5jZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxNzUpIHR5cGUuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5BcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpCisgIExpbmUgMTc1KSB0eXBlLmFzQXJyYXlUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzQXJyYXlUeXBlKCkKKyAgTGluZSAxNzYpIHR5cGUuaXNOdWxsKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzTnVsbCgpCisgIExpbmUgMTc2KSB0eXBlLmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSAxNzYpIHR5cGUuaXNWb2lkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVm9pZCgpCisgIExpbmUgMTc4KSB0eXBlLmlzQ29uc3RyYWludCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0NvbnN0cmFpbnQoKQorICBMaW5lIDE3OSkgTGFtYmRhQ29uc3RyYWludFR5cGUuYm91bmQocGxhY2VJbmZlcmVuY2VWYXJpYWJsZXModHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGFtYmRhQ29uc3RyYWludFR5cGUuYm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTc5KSBwbGFjZUluZmVyZW5jZVZhcmlhYmxlcyh0eXBlLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnBsYWNlSW5mZXJlbmNlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE3OSkgdHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkuZ2V0Qm91bmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkxhbWJkYUNvbnN0cmFpbnRUeXBlLmdldEJvdW5kKCkKKyAgTGluZSAxNzkpIHR5cGUuYXNDb25zdHJhaW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkKKyAgTGluZSAxODMpIHR5cGUuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDE5MCkgaW5mZXJlbmNlVmFyaWFibGVUeXBlLmVxdWl2YWxlbnRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlLmVxdWl2YWxlbnRUeXBlKCkKKyAgTGluZSAxOTEpIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTkyKSB0eXBlLmFzUmVmZXJlbmNlVHlwZSgpLnRyYW5zZm9ybVR5cGVQYXJhbWV0ZXJzKHRwIC0+IHJlc29sdmUodHApKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHJhbnNmb3JtVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGVUcmFuc2Zvcm1lcikKKyAgTGluZSAxOTIpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTkyKSByZXNvbHZlKHRwKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTkzKSB0eXBlLmlzTnVsbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc051bGwoKQorICBMaW5lIDE5MykgdHlwZS5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMTkzKSB0eXBlLmlzVm9pZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ZvaWQoKQorICBMaW5lIDE5NSkgdHlwZS5pc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDE5NikgcmVzb2x2ZSh0eXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTk2KSB0eXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKQorICBMaW5lIDE5NikgdHlwZS5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgMTk3KSB0eXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMTk4KSB0eXBlLmFzV2lsZGNhcmQoKS5pc0V4dGVuZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzRXh0ZW5kcygpCisgIExpbmUgMTk4KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTk5KSBXaWxkY2FyZC5leHRlbmRzQm91bmQocmVzb2x2ZSh0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5leHRlbmRzQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTk5KSByZXNvbHZlKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZUNvbnRleHQucmVzb2x2ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxOTkpIHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMTk5KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMjAwKSB0eXBlLmFzV2lsZGNhcmQoKS5pc1N1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc1N1cGVyKCkKKyAgTGluZSAyMDApIHR5cGUuYXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1dpbGRjYXJkKCkKKyAgTGluZSAyMDEpIFdpbGRjYXJkLnN1cGVyQm91bmQocmVzb2x2ZSh0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5zdXBlckJvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDIwMSkgcmVzb2x2ZSh0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VDb250ZXh0LnJlc29sdmUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMjAxKSB0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDIwMSkgdHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDIwNikgdHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfSW5mZXJlbmNlVmFyaWFibGVUeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9sb2dpY19JbmZlcmVuY2VWYXJpYWJsZVR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmJmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfSW5mZXJlbmNlVmFyaWFibGVUeXBlLnR4dApAQCAtMCwwICsxLDUzIEBACisgIExpbmUgNTMpIHRoaXMuZXF1aXZhbGVudFR5cGVzLmFkZCh0eXBlKSA9PT4gamF2YS51dGlsLlNldC5hZGQoRSkKKyAgTGluZSA4MSkgd2lsZGNhcmQuaXNFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0V4dGVuZHMoKQorICBMaW5lIDgyKSBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuc3VwZXJUeXBlcy5hZGQod2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgODIpIHdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgODQpIHdpbGRjYXJkLmlzU3VwZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzU3VwZXIoKQorICBMaW5lIDg2KSBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuc3VwZXJUeXBlcy5hZGQod2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSkgPT0+IGphdmEudXRpbC5TZXQuYWRkKEUpCisgIExpbmUgODYpIHdpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpCisgIExpbmUgMTAyKSBjb25zaWRlcmVkLmFkZChpbmZlcmVuY2VWYXJpYWJsZVR5cGUpID09PiBqYXZhLnV0aWwuU2V0LmFkZChFKQorICBMaW5lIDEwNCkgcmVzdWx0LmFkZEFsbChpbmZlcmVuY2VWYXJpYWJsZVR5cGUuZXF1aXZhbGVudFR5cGVzLnN0cmVhbSgpLmZpbHRlcih0IC0+ICF0LmlzVHlwZVZhcmlhYmxlKCkgJiYgISh0IGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKSA9PT4gamF2YS51dGlsLlNldC5hZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIEU+KQorICBMaW5lIDEwNCkgaW5mZXJlbmNlVmFyaWFibGVUeXBlLmVxdWl2YWxlbnRUeXBlcy5zdHJlYW0oKS5maWx0ZXIodCAtPiAhdC5pc1R5cGVWYXJpYWJsZSgpICYmICEodCBpbnN0YW5jZW9mIEluZmVyZW5jZVZhcmlhYmxlVHlwZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDEwNCkgaW5mZXJlbmNlVmFyaWFibGVUeXBlLmVxdWl2YWxlbnRUeXBlcy5zdHJlYW0oKS5maWx0ZXIodCAtPiAhdC5pc1R5cGVWYXJpYWJsZSgpICYmICEodCBpbnN0YW5jZW9mIEluZmVyZW5jZVZhcmlhYmxlVHlwZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDEwNCkgaW5mZXJlbmNlVmFyaWFibGVUeXBlLmVxdWl2YWxlbnRUeXBlcy5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMDQpIHQuaXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDEwNCkgQ29sbGVjdG9ycy50b1NldCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9TZXQoKQorICBMaW5lIDEwNSkgaW5mZXJlbmNlVmFyaWFibGVUeXBlLmVxdWl2YWxlbnRUeXBlcy5zdHJlYW0oKS5maWx0ZXIodCAtPiB0IGluc3RhbmNlb2YgSW5mZXJlbmNlVmFyaWFibGVUeXBlKS5mb3JFYWNoKHQgLT4geworICAgIEluZmVyZW5jZVZhcmlhYmxlVHlwZSBpdnQgPSAoSW5mZXJlbmNlVmFyaWFibGVUeXBlKSB0OworICAgIGlmICghY29uc2lkZXJlZC5jb250YWlucyhpdnQpKSB7CisgICAgICAgIHJlc3VsdC5hZGRBbGwoY29uY3JldGVFcXVpdmFsZW50VHlwZXNBbHNvSW5kaXJlY3RseShjb25zaWRlcmVkLCBpdnQpKTsKKyAgICB9Cit9KSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZm9yRWFjaChqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI8PyBzdXBlciBUPikKKyAgTGluZSAxMDUpIGluZmVyZW5jZVZhcmlhYmxlVHlwZS5lcXVpdmFsZW50VHlwZXMuc3RyZWFtKCkuZmlsdGVyKHQgLT4gdCBpbnN0YW5jZW9mIEluZmVyZW5jZVZhcmlhYmxlVHlwZSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTA1KSBpbmZlcmVuY2VWYXJpYWJsZVR5cGUuZXF1aXZhbGVudFR5cGVzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEwNykgY29uc2lkZXJlZC5jb250YWlucyhpdnQpID09PiBqYXZhLnV0aWwuU2V0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA4KSByZXN1bHQuYWRkQWxsKGNvbmNyZXRlRXF1aXZhbGVudFR5cGVzQWxzb0luZGlyZWN0bHkoY29uc2lkZXJlZCwgaXZ0KSkgPT0+IGphdmEudXRpbC5TZXQuYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uPD8gZXh0ZW5kcyBFPikKKyAgTGluZSAxMDgpIGNvbmNyZXRlRXF1aXZhbGVudFR5cGVzQWxzb0luZGlyZWN0bHkoY29uc2lkZXJlZCwgaXZ0KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VWYXJpYWJsZVR5cGUuY29uY3JldGVFcXVpdmFsZW50VHlwZXNBbHNvSW5kaXJlY3RseShqYXZhLnV0aWwuU2V0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5sb2dpYy5JbmZlcmVuY2VWYXJpYWJsZVR5cGUpCisgIExpbmUgMTE1KSBjb25jcmV0ZUVxdWl2YWxlbnRUeXBlc0Fsc29JbmRpcmVjdGx5KG5ldyBIYXNoU2V0PD4oKSwgdGhpcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlLmNvbmNyZXRlRXF1aXZhbGVudFR5cGVzQWxzb0luZGlyZWN0bHkoamF2YS51dGlsLlNldDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZT4sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlKQorICBMaW5lIDExNikgY29uY3JldGVFcXVpdmFsZW50LmlzRW1wdHkoKSA9PT4gamF2YS51dGlsLlNldC5pc0VtcHR5KCkKKyAgTGluZSAxMTgpIG9iamVjdFByb3ZpZGVyLm9iamVjdCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLk9iamVjdFByb3ZpZGVyLm9iamVjdCgpCisgIExpbmUgMTIzKSBjb25jcmV0ZUVxdWl2YWxlbnQuc2l6ZSgpID09PiBqYXZhLnV0aWwuU2V0LnNpemUoKQorICBMaW5lIDEyNCkgY29uY3JldGVFcXVpdmFsZW50Lml0ZXJhdG9yKCkubmV4dCgpID09PiBqYXZhLnV0aWwuSXRlcmF0b3IubmV4dCgpCisgIExpbmUgMTI0KSBjb25jcmV0ZUVxdWl2YWxlbnQuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLlNldC5pdGVyYXRvcigpCisgIExpbmUgMTI2KSBlcXVpdmFsZW50VHlwZXMuc3RyZWFtKCkuZmlsdGVyKHQgLT4gIXQuaXNUeXBlVmFyaWFibGUoKSAmJiAhaGFzSW5mZXJlbmNlVmFyaWFibGVzKHQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAxMjYpIGVxdWl2YWxlbnRUeXBlcy5zdHJlYW0oKS5maWx0ZXIodCAtPiAhdC5pc1R5cGVWYXJpYWJsZSgpICYmICFoYXNJbmZlcmVuY2VWYXJpYWJsZXModCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDEyNikgZXF1aXZhbGVudFR5cGVzLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEyNykgdC5pc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTI3KSBoYXNJbmZlcmVuY2VWYXJpYWJsZXModCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubG9naWMuSW5mZXJlbmNlVmFyaWFibGVUeXBlLmhhc0luZmVyZW5jZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMjgpIENvbGxlY3RvcnMudG9TZXQoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvU2V0KCkKKyAgTGluZSAxMjkpIG5vdFR5cGVWYXJpYWJsZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuU2V0LnNpemUoKQorICBMaW5lIDEzMCkgbm90VHlwZVZhcmlhYmxlcy5pdGVyYXRvcigpLm5leHQoKSA9PT4gamF2YS51dGlsLkl0ZXJhdG9yLm5leHQoKQorICBMaW5lIDEzMCkgbm90VHlwZVZhcmlhYmxlcy5pdGVyYXRvcigpID09PiBqYXZhLnV0aWwuU2V0Lml0ZXJhdG9yKCkKKyAgTGluZSAxMzEpIG5vdFR5cGVWYXJpYWJsZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuU2V0LnNpemUoKQorICBMaW5lIDEzMSkgc3VwZXJUeXBlcy5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5TZXQuaXNFbXB0eSgpCisgIExpbmUgMTMyKSBzdXBlclR5cGVzLnNpemUoKSA9PT4gamF2YS51dGlsLlNldC5zaXplKCkKKyAgTGluZSAxMzMpIHN1cGVyVHlwZXMuaXRlcmF0b3IoKS5uZXh0KCkgPT0+IGphdmEudXRpbC5JdGVyYXRvci5uZXh0KCkKKyAgTGluZSAxMzMpIHN1cGVyVHlwZXMuaXRlcmF0b3IoKSA9PT4gamF2YS51dGlsLlNldC5pdGVyYXRvcigpCisgIExpbmUgMTQ3KSB0eXBlLmlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDE0OCkgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxNDkpIHJlZlR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDE1MCkgaGFzSW5mZXJlbmNlVmFyaWFibGVzKHQpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5oYXNJbmZlcmVuY2VWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTU3KSB0eXBlLmlzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNXaWxkY2FyZCgpCisgIExpbmUgMTU4KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMTU5KSBoYXNJbmZlcmVuY2VWYXJpYWJsZXMod2lsZGNhcmRUeXBlLmdldEJvdW5kZWRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLmxvZ2ljLkluZmVyZW5jZVZhcmlhYmxlVHlwZS5oYXNJbmZlcmVuY2VWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTU5KSB3aWxkY2FyZFR5cGUuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbG9naWMvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9sb2dpY19PYmplY3RQcm92aWRlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfT2JqZWN0UHJvdmlkZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLWxvZ2ljL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbG9naWNfT2JqZWN0UHJvdmlkZXIudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0FjY2Vzc0xldmVsLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfQWNjZXNzTGV2ZWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0FjY2Vzc0xldmVsLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19Bbm5vdGF0aW9uRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19Bbm5vdGF0aW9uRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0Fubm90YXRpb25EZWNsYXJhdGlvbi50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfQ2xhc3NEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0NsYXNzRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0NsYXNzRGVjbGFyYXRpb24udHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0NvbnN0cnVjdG9yRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19EZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0RlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDk1MzMxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19EZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw0IEBACisgIExpbmUgNzApIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIEZpZWxkRGVjbGFyYXRpb24iLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSA3NykgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgUGFyYW1ldGVyRGVjbGFyYXRpb24iLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSA4NCkgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgVHlwZURlY2xhcmF0aW9uIiwgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgOTEpIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIE1ldGhvZERlY2xhcmF0aW9uIiwgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0VudW1EZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0VudW1EZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfRW51bURlY2xhcmF0aW9uLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19GaWVsZERlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfRmllbGREZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfRmllbGREZWNsYXJhdGlvbi50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfSGFzQWNjZXNzTGV2ZWwudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19IYXNBY2Nlc3NMZXZlbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfSGFzQWNjZXNzTGV2ZWwudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0ludGVyZmFjZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfSW50ZXJmYWNlRGVjbGFyYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NmQ3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX0ludGVyZmFjZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDQgQEAKKyAgTGluZSA0NikgZ2V0SW50ZXJmYWNlc0V4dGVuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkludGVyZmFjZURlY2xhcmF0aW9uLmdldEludGVyZmFjZXNFeHRlbmRlZCgpCisgIExpbmUgNDcpIGludGVyZmFjZXMuYWRkKGludGVyZmFjZURlY2xhcmF0aW9uKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNDgpIGludGVyZmFjZXMuYWRkQWxsKGludGVyZmFjZURlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXNBbmNlc3RvcnMoKSkgPT0+IGphdmEudXRpbC5MaXN0LmFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4pCisgIExpbmUgNDgpIGludGVyZmFjZURlY2xhcmF0aW9uLmdldEFsbEludGVyZmFjZXNBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0QWxsSW50ZXJmYWNlc0FuY2VzdG9ycygpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX01ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX01ldGhvZEFtYmlndWl0eUV4Y2VwdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfTWV0aG9kQW1iaWd1aXR5RXhjZXB0aW9uLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19NZXRob2REZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX01ldGhvZERlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19NZXRob2REZWNsYXJhdGlvbi50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfTWV0aG9kTGlrZURlY2xhcmF0aW9uLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfTWV0aG9kTGlrZURlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ5ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19NZXRob2RMaWtlRGVjbGFyYXRpb24udHh0CkBAIC0wLDAgKzEsMzMgQEAKKyAgTGluZSAzMSkgZGVjbGFyaW5nVHlwZSgpLmdldFBhY2thZ2VOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpCisgIExpbmUgMzEpIGRlY2xhcmluZ1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmRlY2xhcmluZ1R5cGUoKQorICBMaW5lIDM4KSBkZWNsYXJpbmdUeXBlKCkuZ2V0Q2xhc3NOYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRDbGFzc05hbWUoKQorICBMaW5lIDM4KSBkZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkKKyAgTGluZSA0NikgZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDQ2KSBkZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkKKyAgTGluZSA0NikgdGhpcy5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDU0KSBzYi5hcHBlbmQoZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA1NCkgZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1NSkgc2IuYXBwZW5kKCIoIikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWZmZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNTYpIGdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgNTgpIHNiLmFwcGVuZCgiLCAiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MCkgc2IuYXBwZW5kKGdldFBhcmFtKGkpLmRlc2NyaWJlVHlwZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2MCkgZ2V0UGFyYW0oaSkuZGVzY3JpYmVUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlBhcmFtZXRlckRlY2xhcmF0aW9uLmRlc2NyaWJlVHlwZSgpCisgIExpbmUgNjApIGdldFBhcmFtKGkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UGFyYW0oaW50KQorICBMaW5lIDYyKSBzYi5hcHBlbmQoIikiKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSA2Mykgc2IudG9TdHJpbmcoKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlci50b1N0cmluZygpCisgIExpbmUgNzEpIGRlY2xhcmluZ1R5cGUoKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0SWQoKQorICBMaW5lIDcxKSBkZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkKKyAgTGluZSA3MSkgdGhpcy5nZXRTaWduYXR1cmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFNpZ25hdHVyZSgpCisgIExpbmUgOTUpIGdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgOTgpIGdldFBhcmFtKGdldE51bWJlck9mUGFyYW1zKCkgLSAxKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSA5OCkgZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSAxMDYpIGdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgMTA5KSBnZXRQYXJhbShnZXROdW1iZXJPZlBhcmFtcygpIC0gMSkuaXNWYXJpYWRpYygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5QYXJhbWV0ZXJEZWNsYXJhdGlvbi5pc1ZhcmlhZGljKCkKKyAgTGluZSAxMDkpIGdldFBhcmFtKGdldE51bWJlck9mUGFyYW1zKCkgLSAxKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldFBhcmFtKGludCkKKyAgTGluZSAxMDkpIGdldE51bWJlck9mUGFyYW1zKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXROdW1iZXJPZlBhcmFtcygpCisgIExpbmUgMTE1KSB0aGlzLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMTE2KSB0cC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExNikgdHAuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTE3KSBPcHRpb25hbC5vZih0cCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDEyMCkgZGVjbGFyaW5nVHlwZSgpLmZpbmRUeXBlUGFyYW1ldGVyKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZmluZFR5cGVQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMjApIGRlY2xhcmluZ1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmRlY2xhcmluZ1R5cGUoKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19QYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1BhcmFtZXRlckRlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNlNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19QYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSw3IEBACisgIExpbmUgNDYpIGlzVmFyaWFkaWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUGFyYW1ldGVyRGVjbGFyYXRpb24uaXNWYXJpYWRpYygpCisgIExpbmUgNDcpIGdldFR5cGUoKS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgNDcpIGdldFR5cGUoKS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA0NykgZ2V0VHlwZSgpLmFzQXJyYXlUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzQXJyYXlUeXBlKCkKKyAgTGluZSA0NykgZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDQ5KSBnZXRUeXBlKCkuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDQ5KSBnZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1JlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1JlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjMzYxMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDg1IEBACisgIExpbmUgNDUpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKGdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDUpIE9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0NSkgZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDYpIGdldEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QW5jZXN0b3JzKCkKKyAgTGluZSA0NykgYW5jZXN0b3JzLmFkZChhbmNlc3RvcikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDQ4KSBhbmNlc3Rvci5nZXRBbGxBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0QWxsQW5jZXN0b3JzKCkKKyAgTGluZSA0OSkgYW5jZXN0b3JzLmNvbnRhaW5zKGluaGVyaXRlZEFuY2VzdG9yKSA9PT4gamF2YS51dGlsLkxpc3QuY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1MCkgYW5jZXN0b3JzLmFkZChpbmhlcml0ZWRBbmNlc3RvcikgPT0+IGphdmEudXRpbC5MaXN0LmFkZChFKQorICBMaW5lIDc0KSB0aGlzLmdldEFsbEZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihmIC0+IGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgNzQpIHRoaXMuZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA3NCkgdGhpcy5nZXRBbGxGaWVsZHMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA3NCkgdGhpcy5nZXRBbGxGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpCisgIExpbmUgNzQpIGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA3NCkgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc1KSBmaWVsZC5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgNzYpIGZpZWxkLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA4NikgZ2V0VmlzaWJsZUZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihmIC0+IGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbmRGaXJzdCgpCisgIExpbmUgODYpIGdldFZpc2libGVGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDg2KSBnZXRWaXNpYmxlRmllbGRzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgODYpIGdldFZpc2libGVGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldFZpc2libGVGaWVsZHMoKQorICBMaW5lIDg2KSBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgODYpIGYuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA4NykgZmllbGQuaXNQcmVzZW50KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5pc1ByZXNlbnQoKQorICBMaW5lIDg4KSBmaWVsZC5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgOTgpIHRoaXMuZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgOTgpIHRoaXMuZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSA5OCkgdGhpcy5nZXRBbGxGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDk4KSB0aGlzLmdldEFsbEZpZWxkcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDk4KSB0aGlzLmdldEFsbEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkKKyAgTGluZSA5OCkgZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk4KSBmLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTA1KSBnZXRWaXNpYmxlRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMTA1KSBnZXRWaXNpYmxlRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSAxMDUpIGdldFZpc2libGVGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDEwNSkgZ2V0VmlzaWJsZUZpZWxkcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEwNSkgZ2V0VmlzaWJsZUZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0VmlzaWJsZUZpZWxkcygpCisgIExpbmUgMTA1KSBmLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA1KSBmLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgMTE5KSBnZXRBbGxGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoZiAtPiBmLmRlY2xhcmluZ1R5cGUoKS5lcXVhbHModGhpcykgfHwgZi5hY2Nlc3NMZXZlbCgpICE9IEFjY2Vzc0xldmVsLlBSSVZBVEUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSAxMTkpIGdldEFsbEZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihmIC0+IGYuZGVjbGFyaW5nVHlwZSgpLmVxdWFscyh0aGlzKSB8fCBmLmFjY2Vzc0xldmVsKCkgIT0gQWNjZXNzTGV2ZWwuUFJJVkFURSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTE5KSBnZXRBbGxGaWVsZHMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMTkpIGdldEFsbEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkKKyAgTGluZSAxMjApIGYuZGVjbGFyaW5nVHlwZSgpLmVxdWFscyh0aGlzKSA9PT4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMjApIGYuZGVjbGFyaW5nVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5GaWVsZERlY2xhcmF0aW9uLmRlY2xhcmluZ1R5cGUoKQorICBMaW5lIDEyMCkgZi5hY2Nlc3NMZXZlbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5IYXNBY2Nlc3NMZXZlbC5hY2Nlc3NMZXZlbCgpCisgIExpbmUgMTIxKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxMjgpIGdldEFsbEZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiAhaXQuaXNTdGF0aWMoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDEyOCkgZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGl0IC0+ICFpdC5pc1N0YXRpYygpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAxMjgpIGdldEFsbEZpZWxkcygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDEyOCkgZ2V0QWxsRmllbGRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRBbGxGaWVsZHMoKQorICBMaW5lIDEyOCkgaXQuaXNTdGF0aWMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRmllbGREZWNsYXJhdGlvbi5pc1N0YXRpYygpCisgIExpbmUgMTI4KSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxMzUpIGdldEFsbEZpZWxkcygpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5pc1N0YXRpYygpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTM1KSBnZXRBbGxGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuaXNTdGF0aWMoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMTM1KSBnZXRBbGxGaWVsZHMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMzUpIGdldEFsbEZpZWxkcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsRmllbGRzKCkKKyAgTGluZSAxMzUpIGl0LmlzU3RhdGljKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkZpZWxkRGVjbGFyYXRpb24uaXNTdGF0aWMoKQorICBMaW5lIDEzNSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTQyKSBnZXRBbGxGaWVsZHMoKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZ2V0UXVhbGlmaWVkTmFtZSgpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDE0MikgZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkuZmlsdGVyKGl0IC0+IGl0LmRlY2xhcmluZ1R5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGdldFF1YWxpZmllZE5hbWUoKSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5maWx0ZXIoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTw/IHN1cGVyIFQ+KQorICBMaW5lIDE0MikgZ2V0QWxsRmllbGRzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgMTQyKSBnZXRBbGxGaWVsZHMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEZpZWxkcygpCisgIExpbmUgMTQyKSBpdC5kZWNsYXJpbmdUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhnZXRRdWFsaWZpZWROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE0MikgaXQuZGVjbGFyaW5nVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE0MikgaXQuZGVjbGFyaW5nVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5GaWVsZERlY2xhcmF0aW9uLmRlY2xhcmluZ1R5cGUoKQorICBMaW5lIDE0MikgZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTQyKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSAxNzUpIG90aGVyLmlzQXNzaWduYWJsZUJ5KHRoaXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDE5NykgaGFzRGlyZWN0bHlBbm5vdGF0aW9uKHF1YWxpZmllZE5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uaGFzRGlyZWN0bHlBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjAwKSBnZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5hbnlNYXRjaChpdCAtPiBpdC5hc1JlZmVyZW5jZVR5cGUoKS5nZXRUeXBlRGVjbGFyYXRpb24oKS5oYXNEaXJlY3RseUFubm90YXRpb24ocXVhbGlmaWVkTmFtZSkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5hbnlNYXRjaChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjAwKSBnZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyMDApIGdldEFsbEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24uZ2V0QWxsQW5jZXN0b3JzKCkKKyAgTGluZSAyMDApIGl0LmFzUmVmZXJlbmNlVHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpLmhhc0RpcmVjdGx5QW5ub3RhdGlvbihxdWFsaWZpZWROYW1lKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmhhc0RpcmVjdGx5QW5ub3RhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIwMCkgaXQuYXNSZWZlcmVuY2VUeXBlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpCisgIExpbmUgMjAwKSBpdC5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyMTUpIHRoaXMuZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyMTYpIHRwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjE2KSB0cC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMTcpIE9wdGlvbmFsLm9mKHRwKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMjIwKSB0aGlzLmNvbnRhaW5lclR5cGUoKS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMjIwKSB0aGlzLmNvbnRhaW5lclR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmNvbnRhaW5lclR5cGUoKQorICBMaW5lIDIyMSkgdGhpcy5jb250YWluZXJUeXBlKCkuZ2V0KCkuZmluZFR5cGVQYXJhbWV0ZXIobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5maW5kVHlwZVBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDIyMSkgdGhpcy5jb250YWluZXJUeXBlKCkuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDIyMSkgdGhpcy5jb250YWluZXJUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5jb250YWluZXJUeXBlKCkKKyAgTGluZSAyMjMpIE9wdGlvbmFsLmVtcHR5KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5lbXB0eSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1R5cGVEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1R5cGVEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNDk0MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfVHlwZURlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDIyIEBACisgIExpbmUgNDApIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0MCkgdGhpcy5nZXRDbGFzcygpID09PiBqYXZhLmxhbmcuT2JqZWN0LmdldENsYXNzKCkKKyAgTGluZSA0OSkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKS5maW5kRmlyc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmluZEZpcnN0KCkKKyAgTGluZSA0OSkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKGYgLT4gZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA0OSkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNDkpIHRoaXMuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgNDkpIGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0OSkgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDUwKSB0eXBlLm9yRWxzZVRocm93KCgpIC0+IG5ldyBVbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbigiSW50ZXJuYWwgdHlwZSBub3QgZm91bmQ6ICIgKyBuYW1lKSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vckVsc2VUaHJvdyhqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI8PyBleHRlbmRzIFg+KQorICBMaW5lIDU5KSB0aGlzLmludGVybmFsVHlwZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmFueU1hdGNoKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSA1OSkgdGhpcy5pbnRlcm5hbFR5cGVzKCkuc3RyZWFtKCkgPT0+IGphdmEudXRpbC5Db2xsZWN0aW9uLnN0cmVhbSgpCisgIExpbmUgNTkpIHRoaXMuaW50ZXJuYWxUeXBlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uaW50ZXJuYWxUeXBlcygpCisgIExpbmUgNTkpIGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA1OSkgZi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDExNikgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgY2xhc3MiLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxMjMpIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhbiBpbnRlcmZhY2UiLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxMzApIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhbiBlbnVtIiwgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgMTM3KSBTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSB0eXBlIHBhcmFtZXRlciIsIHRoaXMpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDE0MSkgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgcmVmZXJlbmNlIHR5cGUiLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxNjQpIGdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDE2NikgU3RyaW5nLmZvcm1hdCgiPGxvY2FsQ2xhc3M+OiVzIiwgZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxNjYpIGdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlZTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLnR4dApAQCAtMCwwICsxLDcgQEAKKyAgTGluZSAxMDQpIGdldENvbnRhaW5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkKKyAgTGluZSAxMTEpIGdldENvbnRhaW5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkKKyAgTGluZSAxMTgpIGdldENvbnRhaW5lcigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkKKyAgTGluZSAxNDMpIFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgZ2V0Q29udGFpbmVySWQoKSwgZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxNDMpIGdldENvbnRhaW5lcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRDb250YWluZXJJZCgpCisgIExpbmUgMTQzKSBnZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyMTgpIGlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQuaXNFeHRlbmRzKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfVHlwZVBhcmFtZXRyaXphYmxlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9kZWNsYXJhdGlvbnNfVHlwZVBhcmFtZXRyaXphYmxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19UeXBlUGFyYW1ldHJpemFibGUudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfZGVjbGFyYXRpb25zX1ZhbHVlRGVjbGFyYXRpb24udHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19WYWx1ZURlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX2RlY2xhcmF0aW9uc19WYWx1ZURlY2xhcmF0aW9uLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX21ldGhvZHNfTWV0aG9kVXNhZ2UudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX21ldGhvZHNfTWV0aG9kVXNhZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2QwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfbWV0aG9kc19NZXRob2RVc2FnZS50eHQKQEAgLTAsMCArMSwyNCBAQAorICBMaW5lIDQxKSBUeXBlUGFyYW1ldGVyc01hcC5lbXB0eSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLmVtcHR5KCkKKyAgTGluZSA0MykgZGVjbGFyYXRpb24uZ2V0TnVtYmVyT2ZQYXJhbXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kTGlrZURlY2xhcmF0aW9uLmdldE51bWJlck9mUGFyYW1zKCkKKyAgTGluZSA0NCkgcGFyYW1UeXBlcy5hZGQoZGVjbGFyYXRpb24uZ2V0UGFyYW0oaSkuZ2V0VHlwZSgpKSA9PT4gamF2YS51dGlsLkxpc3QuYWRkKEUpCisgIExpbmUgNDQpIGRlY2xhcmF0aW9uLmdldFBhcmFtKGkpLmdldFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVmFsdWVEZWNsYXJhdGlvbi5nZXRUeXBlKCkKKyAgTGluZSA0NCkgZGVjbGFyYXRpb24uZ2V0UGFyYW0oaSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5nZXRQYXJhbShpbnQpCisgIExpbmUgNDYpIGRlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuTWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpCisgIExpbmUgNTApIFR5cGVQYXJhbWV0ZXJzTWFwLmVtcHR5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZW1wdHkoKQorICBMaW5lIDczKSBkZWNsYXJhdGlvbi5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLkRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc3KSBkZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLk1ldGhvZExpa2VEZWNsYXJhdGlvbi5kZWNsYXJpbmdUeXBlKCkKKyAgTGluZSA4OSkgcGFyYW1UeXBlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgOTMpIG5ld1BhcmFtcy5zZXQoaSwgcmVwbGFjZWQpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDEwOSkgcGFyYW1UeXBlcy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDExNikgcGFyYW1UeXBlcy5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMTI1KSB0eXBlUGFyYW1ldGVyc01hcC50b0J1aWxkZXIoKS5zZXRWYWx1ZSh0eXBlUGFyYW1ldGVyLCB0eXBlKS5idWlsZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLkJ1aWxkZXIuYnVpbGQoKQorICBMaW5lIDEyNSkgdHlwZVBhcmFtZXRlcnNNYXAudG9CdWlsZGVyKCkuc2V0VmFsdWUodHlwZVBhcmFtZXRlciwgdHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuQnVpbGRlci5zZXRWYWx1ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDEyNSkgdHlwZVBhcmFtZXRlcnNNYXAudG9CdWlsZGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAudG9CdWlsZGVyKCkKKyAgTGluZSAxMjgpIHBhcmFtVHlwZXMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSAxMjkpIHBhcmFtVHlwZXMuZ2V0KGkpID09PiBqYXZhLnV0aWwuTGlzdC5nZXQoaW50KQorICBMaW5lIDEzMCkgb3JpZ2luYWxQYXJhbVR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXModHlwZVBhcmFtZXRlciwgdHlwZSwgaW5mZXJyZWRUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTMxKSByZXMucmVwbGFjZVBhcmFtVHlwZShpLCBuZXdQYXJhbVR5cGUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLm1ldGhvZHMuTWV0aG9kVXNhZ2UucmVwbGFjZVBhcmFtVHlwZShpbnQsIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDEzNCkgb2xkUmV0dXJuVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0eXBlUGFyYW1ldGVyLCB0eXBlLCBpbmZlcnJlZFR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAxMzUpIHJlcy5yZXBsYWNlUmV0dXJuVHlwZShuZXdSZXR1cm5UeXBlKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLnJlcGxhY2VSZXR1cm5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE0NikgdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZFNpZ25hdHVyZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5NZXRob2RMaWtlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkU2lnbmF0dXJlKCkKKyAgTGluZSAxNDYpIHRoaXMuZ2V0RGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5tZXRob2RzLk1ldGhvZFVzYWdlLmdldERlY2xhcmF0aW9uKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9yZXNvbHV0aW9uX1N5bWJvbFJlZmVyZW5jZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfcmVzb2x1dGlvbl9TeW1ib2xSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDRlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfcmVzb2x1dGlvbl9TeW1ib2xSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEsOSBAQAorICBMaW5lIDQxKSBPcHRpb25hbC5vZihzeW1ib2xEZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDQ4KSBPcHRpb25hbC48Uz5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDYwKSBpc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA2MykgY29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSA3MCkgY29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSA3NCkgcmVmLmlzU29sdmVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuaXNTb2x2ZWQoKQorICBMaW5lIDc1KSBTeW1ib2xSZWZlcmVuY2Uuc29sdmVkKHJlZi5nZXRDb3JyZXNwb25kaW5nRGVjbGFyYXRpb24oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2Uuc29sdmVkKFMyKQorICBMaW5lIDc1KSByZWYuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5TeW1ib2xSZWZlcmVuY2UuZ2V0Q29ycmVzcG9uZGluZ0RlY2xhcmF0aW9uKCkKKyAgTGluZSA3NykgU3ltYm9sUmVmZXJlbmNlLnVuc29sdmVkKGNsYXp6KSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlN5bWJvbFJlZmVyZW5jZS51bnNvbHZlZChqYXZhLmxhbmcuQ2xhc3M8UzI+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3Jlc29sdXRpb25fVHlwZVNvbHZlci50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfcmVzb2x1dGlvbl9UeXBlU29sdmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEzODQzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3Jlc29sdXRpb25fVHlwZVNvbHZlci50eHQKQEAgLTAsMCArMSw2IEBACisgIExpbmUgMzMpIGdldFBhcmVudCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlci5nZXRQYXJlbnQoKQorICBMaW5lIDM2KSBnZXRQYXJlbnQoKS5nZXRSb290KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLmdldFJvb3QoKQorICBMaW5lIDM2KSBnZXRQYXJlbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuZ2V0UGFyZW50KCkKKyAgTGluZSA2MCkgdHJ5VG9Tb2x2ZVR5cGUobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyLnRyeVRvU29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgNjEpIHJlZi5pc1NvbHZlZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmlzU29sdmVkKCkKKyAgTGluZSA2MikgcmVmLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uU3ltYm9sUmVmZXJlbmNlLmdldENvcnJlc3BvbmRpbmdEZWNsYXJhdGlvbigpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfcmVzb2x1dGlvbl9VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfcmVzb2x1dGlvbl9VbnNvbHZlZFN5bWJvbEV4Y2VwdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF9yZXNvbHV0aW9uX1Vuc29sdmVkU3ltYm9sRXhjZXB0aW9uLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3Jlc29sdXRpb25fVmFsdWUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3Jlc29sdXRpb25fVmFsdWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjM1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfcmVzb2x1dGlvbl9WYWx1ZS50eHQKQEAgLTAsMCArMSwyIEBACisgIExpbmUgNDApIGRlY2wuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5WYWx1ZURlY2xhcmF0aW9uLmdldFR5cGUoKQorICBMaW5lIDQxKSBkZWNsLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuRGVjbGFyYXRpb24uZ2V0TmFtZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9BcnJheVR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fQXJyYXlUeXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWQ0OTcxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fQXJyYXlUeXBlLnR4dApAQCAtMCwwICsxLDE4IEBACisgIExpbmUgNDMpIGdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQzKSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQ3KSBiYXNlVHlwZS5lcXVhbHModGhhdC5iYXNlVHlwZSkgPT0+IGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTQpIGJhc2VUeXBlLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDc4KSBiYXNlVHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgODcpIG90aGVyLmlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgODgpIGJhc2VUeXBlLmlzUHJpbWl0aXZlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUHJpbWl0aXZlKCkKKyAgTGluZSA4OCkgb3RoZXIuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNQcmltaXRpdmUoKQorICBMaW5lIDg4KSBvdGhlci5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA4OCkgb3RoZXIuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDg5KSBiYXNlVHlwZS5lcXVhbHMob3RoZXIuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkpID09PiBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDg5KSBvdGhlci5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA4OSkgb3RoZXIuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDkxKSBiYXNlVHlwZS5pc0Fzc2lnbmFibGVCeShvdGhlci5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDkxKSBvdGhlci5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA5MSkgb3RoZXIuYXNBcnJheVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNBcnJheVR5cGUoKQorICBMaW5lIDkyKSBvdGhlci5pc051bGwoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNOdWxsKCkKKyAgTGluZSAxMDApIGJhc2VUeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHRwVG9SZXBsYWNlLCByZXBsYWNlZCwgaW5mZXJyZWRUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9MYW1iZGFDb25zdHJhaW50VHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9MYW1iZGFDb25zdHJhaW50VHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkZDJhMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX0xhbWJkYUNvbnN0cmFpbnRUeXBlLnR4dApAQCAtMCwwICsxLDIgQEAKKyAgTGluZSAxMikgYm91bmQuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDM1KSBib3VuZC5pc0Fzc2lnbmFibGVCeShvdGhlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXNzaWduYWJsZUJ5KGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fTnVsbFR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fTnVsbFR5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9OdWxsVHlwZS50eHQKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1ByaW1pdGl2ZVR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fUHJpbWl0aXZlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzYjVmNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1ByaW1pdGl2ZVR5cGUudHh0CkBAIC0wLDAgKzEsMzMgQEAKKyAgTGluZSAzMikgQnl0ZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMikgSW1tdXRhYmxlTGlzdC5vZigpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Qub2YoKQorICBMaW5lIDMzKSBTaG9ydC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMykgSW1tdXRhYmxlTGlzdC5vZihCWVRFKSA9PT4gY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0Lm9mKEUpCisgIExpbmUgMzQpIENoYXJhY3Rlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzNCkgSW1tdXRhYmxlTGlzdC5vZigpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Qub2YoKQorICBMaW5lIDM1KSBJbnRlZ2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM1KSBJbW11dGFibGVMaXN0Lm9mKEJZVEUsIFNIT1JULCBDSEFSKSA9PT4gY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0Lm9mKEUsIEUsIEUpCisgIExpbmUgMzYpIExvbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzYpIEltbXV0YWJsZUxpc3Qub2YoQllURSwgU0hPUlQsIElOVCwgQ0hBUikgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZihFLCBFLCBFLCBFKQorICBMaW5lIDM3KSBCb29sZWFuLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM3KSBJbW11dGFibGVMaXN0Lm9mKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZigpCisgIExpbmUgMzgpIEZsb2F0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM4KSBJbW11dGFibGVMaXN0Lm9mKExPTkcsIElOVCwgU0hPUlQsIEJZVEUsIENIQVIpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Qub2YoRSwgRSwgRSwgRSwgRSkKKyAgTGluZSAzOSkgRG91YmxlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM5KSBJbW11dGFibGVMaXN0Lm9mKEZMT0FULCBMT05HLCBJTlQsIFNIT1JULCBCWVRFLCBDSEFSKSA9PT4gY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0Lm9mKEUsIEUsIEUsIEUsIEUsIEUpCisgIExpbmUgNDApIEltbXV0YWJsZUxpc3Qub2YoSU5ULCBCT09MRUFOLCBMT05HLCBDSEFSLCBGTE9BVCwgRE9VQkxFLCBTSE9SVCwgQllURSkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZihFLCBFLCBFLCBFLCBFLCBFLCBFLCBFKQorICBMaW5lIDU3KSBuYW1lLnRvTG93ZXJDYXNlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcudG9Mb3dlckNhc2UoKQorICBMaW5lIDU5KSBwdHUuZGVzY3JpYmUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTkpIHB0dS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUHJpbWl0aXZlVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTA0KSBvdGhlci5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMTA1KSBwcm9tb3Rpb25UeXBlcy5jb250YWlucyhvdGhlcikgPT0+IGphdmEudXRpbC5MaXN0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA2KSBvdGhlci5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMDcpIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYm94VHlwZVFOYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDcpIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTA3KSBvdGhlci5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMTEpIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMocHJvbW90aW9uLmJveFR5cGVRTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTExKSBvdGhlci5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDExMSkgb3RoZXIuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTE2KSBvdGhlci5pc0NvbnN0cmFpbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNDb25zdHJhaW50KCkKKyAgTGluZSAxMTcpIHRoaXMuaXNBc3NpZ25hYmxlQnkob3RoZXIuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUHJpbWl0aXZlVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMTcpIG90aGVyLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGFtYmRhQ29uc3RyYWludFR5cGUuZ2V0Qm91bmQoKQorICBMaW5lIDExNykgb3RoZXIuYXNDb25zdHJhaW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1ByaW1pdGl2ZVR5cGVfSjkudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fUHJpbWl0aXZlVHlwZV9KOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhN2MyYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1ByaW1pdGl2ZVR5cGVfSjkudHh0CkBAIC0wLDAgKzEsMzMgQEAKKyAgTGluZSAzMikgQnl0ZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMikgSW1tdXRhYmxlTGlzdC5vZigpID09PiBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Qub2YoKQorICBMaW5lIDMzKSBTaG9ydC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSAzMykgSW1tdXRhYmxlTGlzdC5vZihCWVRFKSA9PT4gamF2YS51dGlsLkxpc3Qub2YoRS4uLikKKyAgTGluZSAzNCkgQ2hhcmFjdGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM0KSBJbW11dGFibGVMaXN0Lm9mKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZigpCisgIExpbmUgMzUpIEludGVnZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzUpIEltbXV0YWJsZUxpc3Qub2YoQllURSwgU0hPUlQsIENIQVIpID09PiBqYXZhLnV0aWwuTGlzdC5vZihFLi4uKQorICBMaW5lIDM2KSBMb25nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM2KSBJbW11dGFibGVMaXN0Lm9mKEJZVEUsIFNIT1JULCBJTlQsIENIQVIpID09PiBqYXZhLnV0aWwuTGlzdC5vZihFLi4uKQorICBMaW5lIDM3KSBCb29sZWFuLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM3KSBJbW11dGFibGVMaXN0Lm9mKCkgPT0+IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdC5vZigpCisgIExpbmUgMzgpIEZsb2F0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDM4KSBJbW11dGFibGVMaXN0Lm9mKExPTkcsIElOVCwgU0hPUlQsIEJZVEUsIENIQVIpID09PiBqYXZhLnV0aWwuTGlzdC5vZihFLi4uKQorICBMaW5lIDM5KSBEb3VibGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMzkpIEltbXV0YWJsZUxpc3Qub2YoRkxPQVQsIExPTkcsIElOVCwgU0hPUlQsIEJZVEUsIENIQVIpID09PiBqYXZhLnV0aWwuTGlzdC5vZihFLi4uKQorICBMaW5lIDQwKSBJbW11dGFibGVMaXN0Lm9mKElOVCwgQk9PTEVBTiwgTE9ORywgQ0hBUiwgRkxPQVQsIERPVUJMRSwgU0hPUlQsIEJZVEUpID09PiBqYXZhLnV0aWwuTGlzdC5vZihFLi4uKQorICBMaW5lIDU3KSBuYW1lLnRvTG93ZXJDYXNlKCkgPT0+IGphdmEubGFuZy5TdHJpbmcudG9Mb3dlckNhc2UoKQorICBMaW5lIDU5KSBwdHUuZGVzY3JpYmUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTkpIHB0dS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUHJpbWl0aXZlVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTA0KSBvdGhlci5pc1ByaW1pdGl2ZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1ByaW1pdGl2ZSgpCisgIExpbmUgMTA1KSBwcm9tb3Rpb25UeXBlcy5jb250YWlucyhvdGhlcikgPT0+IGphdmEudXRpbC5MaXN0LmNvbnRhaW5zKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA2KSBvdGhlci5pc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMDcpIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoYm94VHlwZVFOYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxMDcpIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMTA3KSBvdGhlci5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxMTEpIG90aGVyLmFzUmVmZXJlbmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMocHJvbW90aW9uLmJveFR5cGVRTmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTExKSBvdGhlci5hc1JlZmVyZW5jZVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDExMSkgb3RoZXIuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTE2KSBvdGhlci5pc0NvbnN0cmFpbnQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNDb25zdHJhaW50KCkKKyAgTGluZSAxMTcpIHRoaXMuaXNBc3NpZ25hYmxlQnkob3RoZXIuYXNDb25zdHJhaW50VHlwZSgpLmdldEJvdW5kKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUHJpbWl0aXZlVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAxMTcpIG90aGVyLmFzQ29uc3RyYWludFR5cGUoKS5nZXRCb3VuZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uTGFtYmRhQ29uc3RyYWludFR5cGUuZ2V0Qm91bmQoKQorICBMaW5lIDExNykgb3RoZXIuYXNDb25zdHJhaW50VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0NvbnN0cmFpbnRUeXBlKCkKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1JlZmVyZW5jZVR5cGUudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fUmVmZXJlbmNlVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExODk1ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1JlZmVyZW5jZVR5cGUudHh0CkBAIC0wLDAgKzEsMjQwIEBACisgIExpbmUgNTMpIGRlcml2ZVBhcmFtcyh0eXBlRGVjbGFyYXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5kZXJpdmVQYXJhbXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uKQorICBMaW5lIDYwKSB0eXBlRGVjbGFyYXRpb24uaXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc1R5cGVQYXJhbWV0ZXIoKQorICBMaW5lIDYzKSB0eXBlUGFyYW1ldGVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDYzKSB0eXBlUGFyYW1ldGVycy5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDYzKSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDYzKSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA2NCkgU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgZWl0aGVyIHplcm8gdHlwZSBwYXJhbWV0ZXJzIG9yIGhhcyBtYW55IGFzIGRlZmluZWQgaW4gdGhlIGRlY2xhcmF0aW9uICglZCkuIEZvdW5kICVkIiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpLCB0eXBlUGFyYW1ldGVycy5zaXplKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDY1KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDY1KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSA2NSkgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA2OCkgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA2OSkgdHlwZVBhcmFtZXRlcnNNYXBCdWlsZGVyLnNldFZhbHVlKHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldChpKSwgdHlwZVBhcmFtZXRlcnMuZ2V0KGkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyc01hcC5CdWlsZGVyLnNldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgNjkpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA2OSkgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgNjkpIHR5cGVQYXJhbWV0ZXJzLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA3MSkgdHlwZVBhcmFtZXRlcnNNYXBCdWlsZGVyLmJ1aWxkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuQnVpbGRlci5idWlsZCgpCisgIExpbmUgODMpIGdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDgzKSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDg3KSB0eXBlRGVjbGFyYXRpb24uZXF1YWxzKHRoYXQudHlwZURlY2xhcmF0aW9uKSA9PT4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4OCkgdHlwZVBhcmFtZXRlcnNNYXAuZXF1YWxzKHRoYXQudHlwZVBhcmFtZXRlcnNNYXApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDk1KSB0eXBlRGVjbGFyYXRpb24uaGFzaENvZGUoKSA9PT4gamF2YS5sYW5nLk9iamVjdC5oYXNoQ29kZSgpCisgIExpbmUgOTYpIHR5cGVQYXJhbWV0ZXJzTWFwLmhhc2hDb2RlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuaGFzaENvZGUoKQorICBMaW5lIDEwMikgZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMzIpIGhhc05hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuaGFzTmFtZSgpCisgIExpbmUgMTMzKSBzYi5hcHBlbmQodHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzMykgdHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDEzNSkgc2IuYXBwZW5kKCI8YW5vbnltb3VzIGNsYXNzPiIpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci5hcHBlbmQoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAxMzcpIHR5cGVQYXJhbWV0ZXJzTWFwKCkuaXNFbXB0eSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLmlzRW1wdHkoKQorICBMaW5lIDEzNykgdHlwZVBhcmFtZXRlcnNNYXAoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNNYXAoKQorICBMaW5lIDEzOCkgc2IuYXBwZW5kKCI8IikgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzOSkgc2IuYXBwZW5kKFN0cmluZy5qb2luKCIsICIsIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCh0cCAtPiB0eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHRwKS5kZXNjcmliZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKSkgPT0+IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyLmFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDEzOSkgU3RyaW5nLmpvaW4oIiwgIiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHRwIC0+IHR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWUodHApLmRlc2NyaWJlKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmpvaW4oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlPikKKyAgTGluZSAxMzkpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCh0cCAtPiB0eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHRwKS5kZXNjcmliZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMTM5KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAodHAgLT4gdHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZSh0cCkuZGVzY3JpYmUoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgMTM5KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAxMzkpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDE0MCkgdHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZSh0cCkuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuZGVzY3JpYmUoKQorICBMaW5lIDE0MCkgdHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZSh0cCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKQorICBMaW5lIDE0MCkgdHlwZVBhcmFtZXRlcnNNYXAoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNNYXAoKQorICBMaW5lIDE0MSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMTQyKSBzYi5hcHBlbmQoIj4iKSA9PT4gamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIuYXBwZW5kKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMTQ0KSBzYi50b1N0cmluZygpID09PiBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlci50b1N0cmluZygpCisgIExpbmUgMTU3KSB0aGlzLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSAxNTgpIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh0cCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVHJhbnNmb3JtZXIudHJhbnNmb3JtKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDE2MSkgcmVzdWx0LmFzUmVmZXJlbmNlVHlwZSgpLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSAxNjEpIHJlc3VsdC5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAxNjIpIHR5cGVQYXJhbWV0ZXJzQ29ycmVjdGVkLnNldChpLCB0cmFuc2Zvcm1lZFRwKSA9PT4gamF2YS51dGlsLkxpc3Quc2V0KGludCwgRSkKKyAgTGluZSAxNjMpIGNyZWF0ZSh0eXBlRGVjbGFyYXRpb24sIHR5cGVQYXJhbWV0ZXJzQ29ycmVjdGVkLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuY3JlYXRlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxNzgpIHRoaXMudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDE3OSkgdHAucmVwbGFjZVR5cGVWYXJpYWJsZXModHBUb1JlcGxhY2UsIHJlcGxhY2VkLCBpbmZlcnJlZFR5cGVzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUucmVwbGFjZVR5cGVWYXJpYWJsZXMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSwgamF2YS51dGlsLk1hcDxjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPikKKyAgTGluZSAxODEpIHRwLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAxODEpIHRwLmFzVHlwZVZhcmlhYmxlKCkuZGVzY3JpYmUoKS5lcXVhbHModHBUb1JlcGxhY2UuZ2V0TmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxODEpIHRwLmFzVHlwZVZhcmlhYmxlKCkuZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGVWYXJpYWJsZS5kZXNjcmliZSgpCisgIExpbmUgMTgxKSB0cC5hc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgMTgxKSB0cFRvUmVwbGFjZS5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxODIpIGluZmVycmVkVHlwZXMucHV0KHRwLmFzVHlwZVBhcmFtZXRlcigpLCByZXBsYWNlZCkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgMTgyKSB0cC5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAxODUpIHJlc3VsdC5hc1JlZmVyZW5jZVR5cGUoKS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpCisgIExpbmUgMTg1KSByZXN1bHQuYXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmFzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgMTg2KSB0eXBlUGFyYW1ldGVyc0NvcnJlY3RlZC5zZXQoaSwgdHJhbnNmb3JtZWRUcCkgPT0+IGphdmEudXRpbC5MaXN0LnNldChpbnQsIEUpCisgIExpbmUgMTg3KSBjcmVhdGUodHlwZURlY2xhcmF0aW9uLCB0eXBlUGFyYW1ldGVyc0NvcnJlY3RlZCwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmNyZWF0ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMTkyKSByZXN1bHQudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDE5MykgdmFsdWVzLmNvbnRhaW5zKHRwVG9SZXBsYWNlKSA9PT4gamF2YS51dGlsLkxpc3QuY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAxOTQpIHZhbHVlcy5pbmRleE9mKHRwVG9SZXBsYWNlKSA9PT4gamF2YS51dGlsLkxpc3QuaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDE5NSkgdmFsdWVzLnNldChpbmRleCwgcmVwbGFjZWQpID09PiBqYXZhLnV0aWwuTGlzdC5zZXQoaW50LCBFKQorICBMaW5lIDE5NikgY3JlYXRlKHJlc3VsdC5nZXRUeXBlRGVjbGFyYXRpb24oKSwgdmFsdWVzLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuY3JlYXRlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwgamF2YS51dGlsLkxpc3Q8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+LCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnJlc29sdXRpb24uVHlwZVNvbHZlcikKKyAgTGluZSAxOTYpIHJlc3VsdC5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAyMzMpIHR5cGVEZWNsYXJhdGlvbi5nZXRBbGxBbmNlc3RvcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuUmVmZXJlbmNlVHlwZURlY2xhcmF0aW9uLmdldEFsbEFuY2VzdG9ycygpCisgIExpbmUgMjM1KSBhbmNlc3RvcnMuc3RyZWFtKCkubWFwKGEgLT4gdHlwZVBhcmFtZXRlcnNNYXAoKS5yZXBsYWNlQWxsKGEpLmFzUmVmZXJlbmNlVHlwZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjM1KSBhbmNlc3RvcnMuc3RyZWFtKCkubWFwKGEgLT4gdHlwZVBhcmFtZXRlcnNNYXAoKS5yZXBsYWNlQWxsKGEpLmFzUmVmZXJlbmNlVHlwZSgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAyMzUpIGFuY2VzdG9ycy5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyMzYpIHR5cGVQYXJhbWV0ZXJzTWFwKCkucmVwbGFjZUFsbChhKS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSAyMzYpIHR5cGVQYXJhbWV0ZXJzTWFwKCkucmVwbGFjZUFsbChhKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyc01hcC5yZXBsYWNlQWxsKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDIzNikgdHlwZVBhcmFtZXRlcnNNYXAoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNNYXAoKQorICBMaW5lIDIzNykgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjQwKSBhbmNlc3RvcnMucmVtb3ZlSWYoYSAtPiBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5yZW1vdmVJZihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgRT4pCisgIExpbmUgMjQwKSBhLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjQwKSBhLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgMjQwKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjQxKSB0eXBlU29sdmVyLnNvbHZlVHlwZShPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIuc29sdmVUeXBlKGphdmEubGFuZy5TdHJpbmcpCisgIExpbmUgMjQxKSBPYmplY3QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgMjQyKSBjcmVhdGUob2JqZWN0VHlwZSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmNyZWF0ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDI0MykgYW5jZXN0b3JzLmFkZChvYmplY3RSZWYpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyNDgpIGdldEFsbEFuY2VzdG9ycygpLnN0cmVhbSgpLmZpbHRlcihpdCAtPiBpdC5nZXRUeXBlRGVjbGFyYXRpb24oKS5pc0ludGVyZmFjZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjQ4KSBnZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaXNJbnRlcmZhY2UoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmZpbHRlcihqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPD8gc3VwZXIgVD4pCisgIExpbmUgMjQ4KSBnZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSAyNDgpIGdldEFsbEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRBbGxBbmNlc3RvcnMoKQorICBMaW5lIDI0OSkgaXQuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaXNJbnRlcmZhY2UoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZURlY2xhcmF0aW9uLmlzSW50ZXJmYWNlKCkKKyAgTGluZSAyNDkpIGl0LmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDI1MCkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjU0KSBnZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaXNDbGFzcygpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjU0KSBnZXRBbGxBbmNlc3RvcnMoKS5zdHJlYW0oKS5maWx0ZXIoaXQgLT4gaXQuZ2V0VHlwZURlY2xhcmF0aW9uKCkuaXNDbGFzcygpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uZmlsdGVyKGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU8PyBzdXBlciBUPikKKyAgTGluZSAyNTQpIGdldEFsbEFuY2VzdG9ycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDI1NCkgZ2V0QWxsQW5jZXN0b3JzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldEFsbEFuY2VzdG9ycygpCisgIExpbmUgMjU1KSBpdC5nZXRUeXBlRGVjbGFyYXRpb24oKS5pc0NsYXNzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5pc0NsYXNzKCkKKyAgTGluZSAyNTUpIGl0LmdldFR5cGVEZWNsYXJhdGlvbigpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKQorICBMaW5lIDI1NikgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjY4KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyNjkpIHRwLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMjY5KSB0cC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAyNzApIE9wdGlvbmFsLm9mKHRoaXMudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZSh0cCkpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAyNzApIHRoaXMudHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZSh0cCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKQorICBMaW5lIDI3MCkgdGhpcy50eXBlUGFyYW1ldGVyc01hcCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc01hcCgpCisgIExpbmUgMjczKSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDI4MSkgdGhpcy50eXBlUGFyYW1ldGVyc01hcC5pc0VtcHR5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuaXNFbXB0eSgpCisgIExpbmUgMjgxKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCisgIExpbmUgMjgxKSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAodHAgLT4gdHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUodHApKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMjgxKSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAodHAgLT4gdHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUodHApKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAyODEpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDI4MSkgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMjgxKSB0eXBlUGFyYW1ldGVyc01hcC5nZXRWYWx1ZSh0cCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKQorICBMaW5lIDI4MSkgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgMjkwKSBpc1Jhd1R5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuaXNSYXdUeXBlKCkKKyAgTGluZSAyOTEpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgMjkxKSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRyaXphYmxlLmdldFR5cGVQYXJhbWV0ZXJzKCkKKyAgTGluZSAyOTIpIHR5cGVQYXJhbWV0ZXJzTWFwLmFkZChuZXcgVHVwbGUyPD4odHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KDApLCB0eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSkpID09PiBqYXZhLnV0aWwuTGlzdC5hZGQoRSkKKyAgTGluZSAyOTIpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLmdldCgwKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSAyOTIpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDI5MikgdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgMjkyKSB0eXBlUGFyYW1ldGVyc1ZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpCisgIExpbmUgMzE5KSB0eXBlRGVjbGFyYXRpb24uaGFzRmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5oYXNGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyMCkgT3B0aW9uYWwuZW1wdHkoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmVtcHR5KCkKKyAgTGluZSAzMjIpIHR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZChuYW1lKS5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlZhbHVlRGVjbGFyYXRpb24uZ2V0VHlwZSgpCisgIExpbmUgMzIyKSB0eXBlRGVjbGFyYXRpb24uZ2V0RmllbGQobmFtZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbi5nZXRGaWVsZChqYXZhLmxhbmcuU3RyaW5nKQorICBMaW5lIDMyMykgdXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUodHlwZSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlclZhbHVlUHJvdmlkZXIudXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzI0KSBPcHRpb25hbC5vZih0eXBlKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLm9mKFQpCisgIExpbmUgMzMxKSB0eXBlRGVjbGFyYXRpb24uaGFzTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5EZWNsYXJhdGlvbi5oYXNOYW1lKCkKKyAgTGluZSAzMzgpIHR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAzNDUpIHR5cGVEZWNsYXJhdGlvbi5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0SWQoKQorICBMaW5lIDM1NCkgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpID09PiBqYXZhLnV0aWwuTGlzdC5pc0VtcHR5KCkKKyAgTGluZSAzNTQpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldHJpemFibGUuZ2V0VHlwZVBhcmFtZXRlcnMoKQorICBMaW5lIDM1NSkgdHlwZVBhcmFtZXRlcnNNYXAoKS5pc0VtcHR5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuaXNFbXB0eSgpCisgIExpbmUgMzU1KSB0eXBlUGFyYW1ldGVyc01hcCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc01hcCgpCisgIExpbmUgMzU4KSB0eXBlUGFyYW1ldGVyc01hcCgpLmdldE5hbWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0TmFtZXMoKQorICBMaW5lIDM1OCkgdHlwZVBhcmFtZXRlcnNNYXAoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNNYXAoKQorICBMaW5lIDM1OSkgdHlwZVBhcmFtZXRlcnNNYXAoKS5nZXRWYWx1ZUJ5U2lnbmF0dXJlKG5hbWUpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLmdldFZhbHVlQnlTaWduYXR1cmUoamF2YS5sYW5nLlN0cmluZykKKyAgTGluZSAzNTkpIHR5cGVQYXJhbWV0ZXJzTWFwKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzTWFwKCkKKyAgTGluZSAzNjApIHZhbHVlLmlzUHJlc2VudCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuaXNQcmVzZW50KCkKKyAgTGluZSAzNjApIHZhbHVlLmdldCgpLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAzNjApIHZhbHVlLmdldCgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZ2V0KCkKKyAgTGluZSAzNjApIHZhbHVlLmdldCgpLmFzVHlwZVZhcmlhYmxlKCkucXVhbGlmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSAzNjApIHZhbHVlLmdldCgpLmFzVHlwZVZhcmlhYmxlKCkucXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZVZhcmlhYmxlLnF1YWxpZmllZE5hbWUoKQorICBMaW5lIDM2MCkgdmFsdWUuZ2V0KCkuYXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDM2MCkgdmFsdWUuZ2V0KCkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5nZXQoKQorICBMaW5lIDM3MikgdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25NZXRob2QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25NZXRob2QoKQorICBMaW5lIDM3NSkgdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRJZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlRGVjbGFyYXRpb24uZ2V0SWQoKQorICBMaW5lIDM3NSkgdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24oKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkKKyAgTGluZSAzNzYpIHR5cGVJZC5lcXVhbHModHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldENvbnRhaW5lcklkKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM3NikgdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldENvbnRhaW5lcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRDb250YWluZXJJZCgpCisgIExpbmUgMzc3KSBPcHRpb25hbC5vZih0aGlzLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWUodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDM3NykgdGhpcy50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKQorICBMaW5lIDM3NykgdGhpcy50eXBlUGFyYW1ldGVyc01hcCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc01hcCgpCisgIExpbmUgMzc5KSB0aGlzLmdldEFsbEFuY2VzdG9ycygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRBbGxBbmNlc3RvcnMoKQorICBMaW5lIDM4MCkgYW5jZXN0b3IuZ2V0SWQoKS5lcXVhbHModHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldENvbnRhaW5lcklkKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDM4MCkgYW5jZXN0b3IuZ2V0SWQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0SWQoKQorICBMaW5lIDM4MCkgdHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldENvbnRhaW5lcklkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRDb250YWluZXJJZCgpCisgIExpbmUgMzgxKSBPcHRpb25hbC5vZihhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpLmdldFZhbHVlKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwub2YoVCkKKyAgTGluZSAzODEpIGFuY2VzdG9yLnR5cGVQYXJhbWV0ZXJzTWFwKCkuZ2V0VmFsdWUodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyc01hcC5nZXRWYWx1ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pCisgIExpbmUgMzgxKSBhbmNlc3Rvci50eXBlUGFyYW1ldGVyc01hcCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc01hcCgpCisgIExpbmUgMzg0KSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDM5NCkgY3JlYXRlKHR5cGVEZWNsYXJhdGlvbiwgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHRwIC0+IHR5cGVQYXJhbWV0ZXJzTWFwLmdldFZhbHVlKHRwKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwgdHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmNyZWF0ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5SZWZlcmVuY2VUeXBlRGVjbGFyYXRpb24sIGphdmEudXRpbC5MaXN0PGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlPiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgMzk0KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAodHAgLT4gdHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUodHApKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgMzk0KSB0eXBlRGVjbGFyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAodHAgLT4gdHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUodHApKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSAzOTQpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDM5NCkgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgMzk1KSB0eXBlUGFyYW1ldGVyc01hcC5nZXRWYWx1ZSh0cCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuZ2V0VmFsdWUoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKQorICBMaW5lIDM5NikgQ29sbGVjdG9ycy50b0xpc3QoKSA9PT4gamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdCgpCisgIExpbmUgNDA0KSBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEJvb2xlYW4uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MDQpIGdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDA0KSBCb29sZWFuLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQwNikgZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhDaGFyYWN0ZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MDYpIGdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDA2KSBDaGFyYWN0ZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDA4KSBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEJ5dGUuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MDgpIGdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDA4KSBCeXRlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQxMCkgZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTaG9ydC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQxMCkgZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA0MTApIFNob3J0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSA9PT4gamF2YS5sYW5nLkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKQorICBMaW5lIDQxMikgZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhJbnRlZ2VyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDEyKSBnZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDQxMikgSW50ZWdlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0MTQpIGdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoTG9uZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQxNCkgZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA0MTQpIExvbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDE2KSBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEZsb2F0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDE2KSBnZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDQxNikgRmxvYXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpID09PiBqYXZhLmxhbmcuQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpCisgIExpbmUgNDE4KSBnZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKERvdWJsZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDQxOCkgZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA0MTgpIERvdWJsZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkgPT0+IGphdmEubGFuZy5DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkKKyAgTGluZSA0MjUpIG90aGVyLmVxdWFscyh0aGlzKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDI4KSB0aGlzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0UXVhbGlmaWVkTmFtZSgpKSA9PT4gamF2YS5sYW5nLlN0cmluZy5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA0MjgpIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSA0MjgpIG90aGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDI5KSB0aGlzLmlzUmF3VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS5pc1Jhd1R5cGUoKQorICBMaW5lIDQyOSkgb3RoZXIuaXNSYXdUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLmlzUmF3VHlwZSgpCisgIExpbmUgNDMyKSB0aGlzLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0MzIpIHRoaXMudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDQzMikgb3RoZXIudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDQzMikgb3RoZXIudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDQzNSkgdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5zaXplKCkgPT0+IGphdmEudXRpbC5MaXN0LnNpemUoKQorICBMaW5lIDQzNSkgdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHlwZVBhcmFtZXRlcnNWYWx1ZXMoKQorICBMaW5lIDQzNikgdHlwZVBhcmFtZXRlcnNWYWx1ZXMoKS5nZXQoaSkgPT0+IGphdmEudXRpbC5MaXN0LmdldChpbnQpCisgIExpbmUgNDM2KSB0eXBlUGFyYW1ldGVyc1ZhbHVlcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uUmVmZXJlbmNlVHlwZS50eXBlUGFyYW1ldGVyc1ZhbHVlcygpCisgIExpbmUgNDM3KSBvdGhlci50eXBlUGFyYW1ldGVyc1ZhbHVlcygpLmdldChpKSA9PT4gamF2YS51dGlsLkxpc3QuZ2V0KGludCkKKyAgTGluZSA0MzcpIG90aGVyLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5SZWZlcmVuY2VUeXBlLnR5cGVQYXJhbWV0ZXJzVmFsdWVzKCkKKyAgTGluZSA0MzgpIHRoaXNQYXJhbS5lcXVhbHMob3RoZXJQYXJhbSkgPT0+IGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNDQxKSB0aGlzUGFyYW1Bc1dpbGRjYXJkLmlzU3VwZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmlzU3VwZXIoKQorICBMaW5lIDQ0MSkgb3RoZXJQYXJhbS5pc0Fzc2lnbmFibGVCeSh0aGlzUGFyYW1Bc1dpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NDEpIHRoaXNQYXJhbUFzV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSA0NDMpIHRoaXNQYXJhbUFzV2lsZGNhcmQuaXNFeHRlbmRzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0V4dGVuZHMoKQorICBMaW5lIDQ0MykgdGhpc1BhcmFtQXNXaWxkY2FyZC5nZXRCb3VuZGVkVHlwZSgpLmlzQXNzaWduYWJsZUJ5KG90aGVyUGFyYW0pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc0Fzc2lnbmFibGVCeShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSA0NDMpIHRoaXNQYXJhbUFzV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSA0NDUpIHRoaXNQYXJhbUFzV2lsZGNhcmQuaXNCb3VuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0JvdW5kZWQoKQorICBMaW5lIDQ1MikgdGhpc1BhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKHRoaXMudHlwZVNvbHZlcikuc3RyZWFtKCkubWFwKGJvdW5kIC0+IGJvdW5kLmdldFR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0uY29sbGVjdChqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3Rvcjw/IHN1cGVyIFQsIEEsIFI+KQorICBMaW5lIDQ1MikgdGhpc1BhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKHRoaXMudHlwZVNvbHZlcikuc3RyZWFtKCkubWFwKGJvdW5kIC0+IGJvdW5kLmdldFR5cGUoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLm1hcChqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgUj4pCisgIExpbmUgNDUyKSB0aGlzUGFyYW0uYXNUeXBlVmFyaWFibGUoKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRCb3VuZHModGhpcy50eXBlU29sdmVyKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA0NTIpIHRoaXNQYXJhbS5hc1R5cGVWYXJpYWJsZSgpLmFzVHlwZVBhcmFtZXRlcigpLmdldEJvdW5kcyh0aGlzLnR5cGVTb2x2ZXIpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0Qm91bmRzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwucmVzb2x1dGlvbi5UeXBlU29sdmVyKQorICBMaW5lIDQ1MikgdGhpc1BhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVmFyaWFibGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSA0NTIpIHRoaXNQYXJhbS5hc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgNDUyKSBib3VuZC5nZXRUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5Cb3VuZC5nZXRUeXBlKCkKKyAgTGluZSA0NTIpIENvbGxlY3RvcnMudG9MaXN0KCkgPT0+IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3QoKQorICBMaW5lIDQ1Mykgb3RoZXJQYXJhbS5hc1R5cGVWYXJpYWJsZSgpLmFzVHlwZVBhcmFtZXRlcigpLmdldEJvdW5kcyhvdGhlci50eXBlU29sdmVyKS5zdHJlYW0oKS5tYXAoYm91bmQgLT4gYm91bmQuZ2V0VHlwZSgpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5jb2xsZWN0KGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yPD8gc3VwZXIgVCwgQSwgUj4pCisgIExpbmUgNDUzKSBvdGhlclBhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkuZ2V0Qm91bmRzKG90aGVyLnR5cGVTb2x2ZXIpLnN0cmVhbSgpLm1hcChib3VuZCAtPiBib3VuZC5nZXRUeXBlKCkpID09PiBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbS5tYXAoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFI+KQorICBMaW5lIDQ1Mykgb3RoZXJQYXJhbS5hc1R5cGVWYXJpYWJsZSgpLmFzVHlwZVBhcmFtZXRlcigpLmdldEJvdW5kcyhvdGhlci50eXBlU29sdmVyKS5zdHJlYW0oKSA9PT4gamF2YS51dGlsLkNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgTGluZSA0NTMpIG90aGVyUGFyYW0uYXNUeXBlVmFyaWFibGUoKS5hc1R5cGVQYXJhbWV0ZXIoKS5nZXRCb3VuZHMob3RoZXIudHlwZVNvbHZlcikgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRCb3VuZHMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCisgIExpbmUgNDUzKSBvdGhlclBhcmFtLmFzVHlwZVZhcmlhYmxlKCkuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVmFyaWFibGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSA0NTMpIG90aGVyUGFyYW0uYXNUeXBlVmFyaWFibGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlVmFyaWFibGUoKQorICBMaW5lIDQ1MykgYm91bmQuZ2V0VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uQm91bmQuZ2V0VHlwZSgpCisgIExpbmUgNDUzKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSA0NTQpIHRoaXNCb3VuZHMuc2l6ZSgpID09PiBqYXZhLnV0aWwuTGlzdC5zaXplKCkKKyAgTGluZSA0NTQpIG90aGVyQm91bmRzLnNpemUoKSA9PT4gamF2YS51dGlsLkxpc3Quc2l6ZSgpCisgIExpbmUgNDU0KSBvdGhlckJvdW5kcy5jb250YWluc0FsbCh0aGlzQm91bmRzKSA9PT4gamF2YS51dGlsLkxpc3QuY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb248PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+KQorICBMaW5lIDQ3MikgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKCh0cCkgLT4gbmV3IFR5cGVWYXJpYWJsZSh0cCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgPT0+IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbGxlY3QoamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I8PyBzdXBlciBULCBBLCBSPikKKyAgTGluZSA0NzIpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpLm1hcCgodHApIC0+IG5ldyBUeXBlVmFyaWFibGUodHApKSA9PT4gamF2YS51dGlsLnN0cmVhbS5TdHJlYW0ubWFwKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBSPikKKyAgTGluZSA0NzIpIHR5cGVEZWNsYXJhdGlvbi5nZXRUeXBlUGFyYW1ldGVycygpLnN0cmVhbSgpID09PiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5zdHJlYW0oKQorICBMaW5lIDQ3MikgdHlwZURlY2xhcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0cml6YWJsZS5nZXRUeXBlUGFyYW1ldGVycygpCisgIExpbmUgNDcyKSBDb2xsZWN0b3JzLnRvTGlzdCgpID09PiBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0KCkKKyAgTGluZSA0NzYpIGNyZWF0ZSh0eXBlRGVjbGFyYXRpb24sIHR5cGVQYXJhbWV0ZXJzTWFwLCB0eXBlU29sdmVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUuY3JlYXRlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlJlZmVyZW5jZVR5cGVEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyc01hcCwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5yZXNvbHV0aW9uLlR5cGVTb2x2ZXIpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9UeXBlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1R5cGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDdiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9UeXBlLnR4dApAQCAtMCwwICsxLDE3IEBACisgIExpbmUgNDgpIGlzQXJyYXkoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBcnJheSgpCisgIExpbmUgNDkpIHRoaXMuYXNBcnJheVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkuYXJyYXlMZXZlbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hcnJheUxldmVsKCkKKyAgTGluZSA0OSkgdGhpcy5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLkFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCkKKyAgTGluZSA0OSkgdGhpcy5hc0FycmF5VHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5hc0FycmF5VHlwZSgpCisgIExpbmUgNzMpIGlzUmVmZXJlbmNlVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1JlZmVyZW5jZVR5cGUoKQorICBMaW5lIDczKSBpc0FycmF5KCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzQXJyYXkoKQorICBMaW5lIDczKSBpc1R5cGVWYXJpYWJsZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1R5cGVWYXJpYWJsZSgpCisgIExpbmUgNzMpIGlzTnVsbCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc051bGwoKQorICBMaW5lIDczKSBpc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzV2lsZGNhcmQoKQorICBMaW5lIDEwNikgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGFuIEFycmF5IiwgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgMTEwKSBTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSBSZWZlcmVuY2UgVHlwZSIsIHRoaXMpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDExNCkgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgVHlwZSBwYXJhbWV0ZXIiLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxMTgpIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIFR5cGUgdmFyaWFibGUiLCB0aGlzKSA9PT4gamF2YS5sYW5nLlN0cmluZy5mb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdC4uLikKKyAgTGluZSAxMjIpIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIFByaW1pdGl2ZSB0eXBlIiwgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgMTI2KSBTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSBXaWxkY2FyZCIsIHRoaXMpID09PiBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Li4uKQorICBMaW5lIDEzMCkgU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgY29uc3RyYWludCB0eXBlIiwgdGhpcykgPT0+IGphdmEubGFuZy5TdHJpbmcuZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QuLi4pCisgIExpbmUgMTU2KSByZXBsYWNlVHlwZVZhcmlhYmxlcyh0cCwgcmVwbGFjZWQsIG5ldyBIYXNoTWFwPD4oKSkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9UeXBlVHJhbnNmb3JtZXIudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fVHlwZVRyYW5zZm9ybWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fVHlwZVRyYW5zZm9ybWVyLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fVHlwZVZhcmlhYmxlLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1R5cGVWYXJpYWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmNzJlOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1R5cGVWYXJpYWJsZS50eHQKQEAgLTAsMCArMSwyMiBAQAorICBMaW5lIDM5KSB0eXBlUGFyYW1ldGVyLmdldFF1YWxpZmllZE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKQorICBMaW5lIDQzKSB0aGlzLnR5cGVQYXJhbWV0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNDkpIGdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDQ5KSBvLmdldENsYXNzKCkgPT0+IGphdmEubGFuZy5PYmplY3QuZ2V0Q2xhc3MoKQorICBMaW5lIDUzKSB0eXBlUGFyYW1ldGVyLmdldE5hbWUoKS5lcXVhbHModGhhdC50eXBlUGFyYW1ldGVyLmdldE5hbWUoKSkgPT0+IGphdmEubGFuZy5TdHJpbmcuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNTMpIHR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0TmFtZSgpCisgIExpbmUgNTMpIHRoYXQudHlwZVBhcmFtZXRlci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA1NCkgdHlwZVBhcmFtZXRlci5kZWNsYXJlZE9uVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPblR5cGUoKQorICBMaW5lIDU0KSB0aGF0LnR5cGVQYXJhbWV0ZXIuZGVjbGFyZWRPblR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25UeXBlKCkKKyAgTGluZSA1NSkgdHlwZVBhcmFtZXRlci5kZWNsYXJlZE9uTWV0aG9kKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5kZWNsYXJlZE9uTWV0aG9kKCkKKyAgTGluZSA1NSkgdGhhdC50eXBlUGFyYW1ldGVyLmRlY2xhcmVkT25NZXRob2QoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmRlY2xhcmVkT25NZXRob2QoKQorICBMaW5lIDYyKSB0eXBlUGFyYW1ldGVyLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDc3KSB0cFRvQmVSZXBsYWNlZC5nZXROYW1lKCkuZXF1YWxzKHRoaXMudHlwZVBhcmFtZXRlci5nZXROYW1lKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDc3KSB0cFRvQmVSZXBsYWNlZC5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSA3NykgdGhpcy50eXBlUGFyYW1ldGVyLmdldE5hbWUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLmdldE5hbWUoKQorICBMaW5lIDc4KSBpbmZlcnJlZFR5cGVzLnB1dCh0aGlzLmFzVHlwZVBhcmFtZXRlcigpLCByZXBsYWNlZCkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgNzgpIHRoaXMuYXNUeXBlUGFyYW1ldGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlVmFyaWFibGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSA5MikgdHlwZVBhcmFtZXRlci5nZXROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXROYW1lKCkKKyAgTGluZSAxMTIpIG90aGVyLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAxMTMpIGRlc2NyaWJlKCkuZXF1YWxzKG90aGVyLmRlc2NyaWJlKCkpID09PiBqYXZhLmxhbmcuU3RyaW5nLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDExMykgZGVzY3JpYmUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGVWYXJpYWJsZS5kZXNjcmliZSgpCisgIExpbmUgMTEzKSBvdGhlci5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9Wb2lkVHlwZS50eHQgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9Wb2lkVHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX1ZvaWRUeXBlLnR4dApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fV2lsZGNhcmQudHh0IGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fV2lsZGNhcmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTVkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YXN5bWJvbHNvbHZlcl8wXzZfMC9leHBlY3RlZF9vdXRwdXQvamF2YS1zeW1ib2wtc29sdmVyLW1vZGVsL2NvbV9naXRodWJfamF2YXBhcnNlcl9zeW1ib2xzb2x2ZXJfbW9kZWxfdHlwZXN5c3RlbV9XaWxkY2FyZC50eHQKQEAgLTAsMCArMSw5IEBACisgIExpbmUgODEpIGJvdW5kZWRUeXBlLmVxdWFscyh0aGF0LmJvdW5kZWRUeXBlKSA9PT4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgTGluZSA4OSkgdHlwZS5oYXNoQ29kZSgpID09PiBqYXZhLmxhbmcuRW51bS5oYXNoQ29kZSgpCisgIExpbmUgOTApIGJvdW5kZWRUeXBlLmhhc2hDb2RlKCkgPT0+IGphdmEubGFuZy5PYmplY3QuaGFzaENvZGUoKQorICBMaW5lIDk5KSBib3VuZGVkVHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTAxKSBib3VuZGVkVHlwZS5kZXNjcmliZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5kZXNjcmliZSgpCisgIExpbmUgMTE2KSBpc1N1cGVyKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc1N1cGVyKCkKKyAgTGluZSAxMTYpIGlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSAxMzIpIGJvdW5kZWRUeXBlLmlzQXNzaWduYWJsZUJ5KG90aGVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuaXNBc3NpZ25hYmxlQnkoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMTQ4KSBib3VuZGVkVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyh0cFRvUmVwbGFjZSwgcmVwbGFjZWQsIGluZmVycmVkVHlwZXMpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5yZXBsYWNlVHlwZVZhcmlhYmxlcyhjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLCBqYXZhLnV0aWwuTWFwPGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGU+KQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fcGFyYW1ldHJpemF0aW9uX1R5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX3BhcmFtZXRyaXphdGlvbl9UeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhZDlhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX3BhcmFtZXRyaXphdGlvbl9UeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlci50eHQKQEAgLTAsMCArMSwyMyBAQAorICBMaW5lIDI1KSB0eXBlLmlzVHlwZVZhcmlhYmxlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzVHlwZVZhcmlhYmxlKCkKKyAgTGluZSAyNikgdHlwZS5hc1R5cGVQYXJhbWV0ZXIoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNUeXBlUGFyYW1ldGVyKCkKKyAgTGluZSAyNykgdHlwZVBhcmFtZXRlci5kZWNsYXJlZE9uVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZGVjbGFyZWRPblR5cGUoKQorICBMaW5lIDI4KSB0eXBlUGFyYW1WYWx1ZSh0eXBlUGFyYW1ldGVyKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlci50eXBlUGFyYW1WYWx1ZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pCisgIExpbmUgMjkpIHR5cGVQYXJhbS5pc1ByZXNlbnQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmlzUHJlc2VudCgpCisgIExpbmUgMzApIHR5cGVQYXJhbS5nZXQoKSA9PT4gamF2YS51dGlsLk9wdGlvbmFsLmdldCgpCisgIExpbmUgMzUpIHR5cGUuaXNXaWxkY2FyZCgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZS5pc1dpbGRjYXJkKCkKKyAgTGluZSAzNSkgdHlwZS5hc1dpbGRjYXJkKCkuaXNCb3VuZGVkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5XaWxkY2FyZC5pc0JvdW5kZWQoKQorICBMaW5lIDM1KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgMzYpIHR5cGUuYXNXaWxkY2FyZCgpLmlzRXh0ZW5kcygpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuaXNFeHRlbmRzKCkKKyAgTGluZSAzNikgdHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDM3KSBXaWxkY2FyZC5leHRlbmRzQm91bmQodXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUodHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZXh0ZW5kc0JvdW5kKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDM3KSB1c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZSh0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLnBhcmFtZXRyaXphdGlvbi5UeXBlUGFyYW1ldGVyVmFsdWVQcm92aWRlci51c2VUaGlzVHlwZVBhcmFtZXRlcnNPblRoZUdpdmVuVHlwZShjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZSkKKyAgTGluZSAzNykgdHlwZS5hc1dpbGRjYXJkKCkuZ2V0Qm91bmRlZFR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLmdldEJvdW5kZWRUeXBlKCkKKyAgTGluZSAzNykgdHlwZS5hc1dpbGRjYXJkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmFzV2lsZGNhcmQoKQorICBMaW5lIDM5KSBXaWxkY2FyZC5zdXBlckJvdW5kKHVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLldpbGRjYXJkLnN1cGVyQm91bmQoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUpCisgIExpbmUgMzkpIHVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKHR5cGUuYXNXaWxkY2FyZCgpLmdldEJvdW5kZWRUeXBlKCkpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLnVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQorICBMaW5lIDM5KSB0eXBlLmFzV2lsZGNhcmQoKS5nZXRCb3VuZGVkVHlwZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uV2lsZGNhcmQuZ2V0Qm91bmRlZFR5cGUoKQorICBMaW5lIDM5KSB0eXBlLmFzV2lsZGNhcmQoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNXaWxkY2FyZCgpCisgIExpbmUgNDMpIHR5cGUuaXNSZWZlcmVuY2VUeXBlKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLmlzUmVmZXJlbmNlVHlwZSgpCisgIExpbmUgNDQpIHR5cGUuYXNSZWZlcmVuY2VUeXBlKCkudHJhbnNmb3JtVHlwZVBhcmFtZXRlcnModHAgLT4gdXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUodHApKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlJlZmVyZW5jZVR5cGUudHJhbnNmb3JtVHlwZVBhcmFtZXRlcnMoY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGVUcmFuc2Zvcm1lcikKKyAgTGluZSA0NCkgdHlwZS5hc1JlZmVyZW5jZVR5cGUoKSA9PT4gY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUuYXNSZWZlcmVuY2VUeXBlKCkKKyAgTGluZSA0NCkgdXNlVGhpc1R5cGVQYXJhbWV0ZXJzT25UaGVHaXZlblR5cGUodHApID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJWYWx1ZVByb3ZpZGVyLnVzZVRoaXNUeXBlUGFyYW1ldGVyc09uVGhlR2l2ZW5UeXBlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlKQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fcGFyYW1ldHJpemF0aW9uX1R5cGVQYXJhbWV0ZXJzTWFwLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX3BhcmFtZXRyaXphdGlvbl9UeXBlUGFyYW1ldGVyc01hcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkOTk4NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX3BhcmFtZXRyaXphdGlvbl9UeXBlUGFyYW1ldGVyc01hcC50eHQKQEAgLTAsMCArMSwyNCBAQAorICBMaW5lIDQzKSB0aGlzLm5hbWVUb1ZhbHVlLnB1dEFsbChuYW1lVG9WYWx1ZSkgPT0+IGphdmEudXRpbC5NYXAucHV0QWxsKGphdmEudXRpbC5NYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPikKKyAgTGluZSA0NSkgdGhpcy5uYW1lVG9EZWNsYXJhdGlvbi5wdXRBbGwobmFtZVRvRGVjbGFyYXRpb24pID09PiBqYXZhLnV0aWwuTWFwLnB1dEFsbChqYXZhLnV0aWwuTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4pCisgIExpbmUgNTQpIHR5cGVQYXJhbWV0ZXIuZ2V0UXVhbGlmaWVkTmFtZSgpID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLmRlY2xhcmF0aW9ucy5UeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpCisgIExpbmUgNTUpIG5hbWVUb1ZhbHVlLnB1dChxdWFsaWZpZWROYW1lLCB2YWx1ZSkgPT0+IGphdmEudXRpbC5NYXAucHV0KEssIFYpCisgIExpbmUgNTYpIG5hbWVUb0RlY2xhcmF0aW9uLnB1dChxdWFsaWZpZWROYW1lLCB0eXBlUGFyYW1ldGVyKSA9PT4gamF2YS51dGlsLk1hcC5wdXQoSywgVikKKyAgTGluZSA2OCkgbmFtZVRvVmFsdWUuZXF1YWxzKHRoYXQubmFtZVRvVmFsdWUpID09PiBqYXZhLnV0aWwuTWFwLmVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICBMaW5lIDY4KSBuYW1lVG9EZWNsYXJhdGlvbi5lcXVhbHModGhhdC5uYW1lVG9EZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5NYXAuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgNzQpIG5hbWVUb1ZhbHVlLmhhc2hDb2RlKCkgPT0+IGphdmEudXRpbC5NYXAuaGFzaENvZGUoKQorICBMaW5lIDg4KSBuZXcgQnVpbGRlcigpLmJ1aWxkKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5wYXJhbWV0cml6YXRpb24uVHlwZVBhcmFtZXRlcnNNYXAuQnVpbGRlci5idWlsZCgpCisgIExpbmUgOTMpIHRoaXMubmFtZVRvVmFsdWUucHV0QWxsKG5hbWVUb1ZhbHVlKSA9PT4gamF2YS51dGlsLk1hcC5wdXRBbGwoamF2YS51dGlsLk1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+KQorICBMaW5lIDk1KSB0aGlzLm5hbWVUb0RlY2xhcmF0aW9uLnB1dEFsbChuYW1lVG9EZWNsYXJhdGlvbikgPT0+IGphdmEudXRpbC5NYXAucHV0QWxsKGphdmEudXRpbC5NYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPikKKyAgTGluZSA5OSkgdHlwZVBhcmFtZXRlci5nZXRRdWFsaWZpZWROYW1lKCkgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkKKyAgTGluZSAxMDApIG5hbWVUb1ZhbHVlLmNvbnRhaW5zS2V5KHF1YWxpZmllZE5hbWUpID09PiBqYXZhLnV0aWwuTWFwLmNvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTAxKSBuYW1lVG9WYWx1ZS5nZXQocXVhbGlmaWVkTmFtZSkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA4KSBuYW1lVG9WYWx1ZS5jb250YWluc0tleShzaWduYXR1cmUpID09PiBqYXZhLnV0aWwuTWFwLmNvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTA5KSBPcHRpb25hbC5vZihuYW1lVG9WYWx1ZS5nZXQoc2lnbmF0dXJlKSkgPT0+IGphdmEudXRpbC5PcHRpb25hbC5vZihUKQorICBMaW5lIDEwOSkgbmFtZVRvVmFsdWUuZ2V0KHNpZ25hdHVyZSkgPT0+IGphdmEudXRpbC5NYXAuZ2V0KGphdmEubGFuZy5PYmplY3QpCisgIExpbmUgMTExKSBPcHRpb25hbC5lbXB0eSgpID09PiBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHkoKQorICBMaW5lIDExNikgbmFtZVRvVmFsdWUua2V5U2V0KCkgPT0+IGphdmEudXRpbC5NYXAua2V5U2V0KCkKKyAgTGluZSAxMjApIG5hbWVUb1ZhbHVlLnZhbHVlcygpID09PiBqYXZhLnV0aWwuTWFwLnZhbHVlcygpCisgIExpbmUgMTI4KSBuYW1lVG9WYWx1ZS5pc0VtcHR5KCkgPT0+IGphdmEudXRpbC5NYXAuaXNFbXB0eSgpCisgIExpbmUgMTMzKSB0aGlzLm5hbWVUb0RlY2xhcmF0aW9uLnZhbHVlcygpID09PiBqYXZhLnV0aWwuTWFwLnZhbHVlcygpCisgIExpbmUgMTM0KSB0eXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKHR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgZ2V0VmFsdWUodHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKSwgaW5mZXJyZWRUeXBlcykgPT0+IGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwudHlwZXN5c3RlbS5UeXBlLnJlcGxhY2VUeXBlVmFyaWFibGVzKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC50eXBlc3lzdGVtLlR5cGUsIGphdmEudXRpbC5NYXA8Y29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN5bWJvbHNvbHZlci5tb2RlbC5kZWNsYXJhdGlvbnMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0uVHlwZT4pCisgIExpbmUgMTM0KSBnZXRWYWx1ZSh0eXBlUGFyYW1ldGVyRGVjbGFyYXRpb24pID09PiBjb20uZ2l0aHViLmphdmFwYXJzZXIuc3ltYm9sc29sdmVyLm1vZGVsLnR5cGVzeXN0ZW0ucGFyYW1ldHJpemF0aW9uLlR5cGVQYXJhbWV0ZXJzTWFwLmdldFZhbHVlKGNvbS5naXRodWIuamF2YXBhcnNlci5zeW1ib2xzb2x2ZXIubW9kZWwuZGVjbGFyYXRpb25zLlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbikKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX3BhcmFtZXRyaXphdGlvbl9UeXBlUGFyYW1ldHJpemVkLnR4dCBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhc3ltYm9sc29sdmVyXzBfNl8wL2V4cGVjdGVkX291dHB1dC9qYXZhLXN5bWJvbC1zb2x2ZXItbW9kZWwvY29tX2dpdGh1Yl9qYXZhcGFyc2VyX3N5bWJvbHNvbHZlcl9tb2RlbF90eXBlc3lzdGVtX3BhcmFtZXRyaXphdGlvbl9UeXBlUGFyYW1ldHJpemVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmFzeW1ib2xzb2x2ZXJfMF82XzAvZXhwZWN0ZWRfb3V0cHV0L2phdmEtc3ltYm9sLXNvbHZlci1tb2RlbC9jb21fZ2l0aHViX2phdmFwYXJzZXJfc3ltYm9sc29sdmVyX21vZGVsX3R5cGVzeXN0ZW1fcGFyYW1ldHJpemF0aW9uX1R5cGVQYXJhbWV0cml6ZWQudHh0CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvanVuaXQtNC44LjEuamFyIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2p1bml0LTQuOC4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRjZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2p1bml0LTQuOC4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvcmVjdXJzaW9uLWlzc3VlL0Jhc2UuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9yZWN1cnNpb24taXNzdWUvQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWViZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvcmVjdXJzaW9uLWlzc3VlL0Jhc2UuamF2YQpAQCAtMCwwICsxLDUgQEAKKworCitwdWJsaWMgaW50ZXJmYWNlIEJhc2U8VCwgUyBleHRlbmRzIEJhc2U8VCwgUz4+eworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3JlY3Vyc2lvbi1pc3N1ZS9FeHRlbmRzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvcmVjdXJzaW9uLWlzc3VlL0V4dGVuZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY5OTM1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3JlY3Vyc2lvbi1pc3N1ZS9FeHRlbmRzLmphdmEKQEAgLTAsMCArMSw4IEBACitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5CYXNlU3RyZWFtOworCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZHMgZXh0ZW5kcyBCYXNlPEludGVnZXIsIEV4dGVuZHM+IHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oKSB7CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3JlY3Vyc2lvbi1pc3N1ZS9Vc2FnZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3JlY3Vyc2lvbi1pc3N1ZS9Vc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGZiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvcmVjdXJzaW9uLWlzc3VlL1VzYWdlLmphdmEKQEAgLTAsMCArMSw2IEBACitjbGFzcyBVc2FnZXsKKworICAgIHZvaWQgYmFyKCl7CisgICAgICAgIEV4dGVuZHMuZm9vKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9hL3NyYy9hLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvc3ltYm9sc29sdmVyX3F1aWNrc2V0dXAvYS9zcmMvYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTA0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvc3ltYm9sc29sdmVyX3F1aWNrc2V0dXAvYS9zcmMvYS5qYXZhCkBAIC0wLDAgKzEsMiBAQAorcHVibGljIGNsYXNzIGEgeworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL2Evc3JjL3BhY2thZ2VfYS9hLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvc3ltYm9sc29sdmVyX3F1aWNrc2V0dXAvYS9zcmMvcGFja2FnZV9hL2EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThjMmU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL2Evc3JjL3BhY2thZ2VfYS9hLmphdmEKQEAgLTAsMCArMSw0IEBACitwYWNrYWdlIHBhY2thZ2VfYTsKKworcHVibGljIGNsYXNzIGEgeworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL2Ivc3JjL2IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9iL3NyYy9iLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxMTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9iL3NyYy9iLmphdmEKQEAgLTAsMCArMSwyIEBACitwdWJsaWMgY2xhc3MgYiB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvc3ltYm9sc29sdmVyX3F1aWNrc2V0dXAvYi9zcmMvcGFja2FnZV9iL2IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9iL3NyYy9wYWNrYWdlX2IvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGM2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvc3ltYm9sc29sdmVyX3F1aWNrc2V0dXAvYi9zcmMvcGFja2FnZV9iL2IuamF2YQpAQCAtMCwwICsxLDQgQEAKK3BhY2thZ2UgcGFja2FnZV9iOworCitwdWJsaWMgY2xhc3MgYiB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvc3ltYm9sc29sdmVyX3F1aWNrc2V0dXAvYy9zcmMvYy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL2Mvc3JjL2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc0NWExCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL2Mvc3JjL2MuamF2YQpAQCAtMCwwICsxLDIgQEAKK3B1YmxpYyBjbGFzcyBjIHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9jL3NyYy9wYWNrYWdlX2MvYy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL2Mvc3JjL3BhY2thZ2VfYy9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViNTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9jL3NyYy9wYWNrYWdlX2MvYy5qYXZhCkBAIC0wLDAgKzEsNCBAQAorcGFja2FnZSBwYWNrYWdlX2M7CisKK3B1YmxpYyBjbGFzcyBjIHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9zcmMvTWFpbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL3N5bWJvbHNvbHZlcl9xdWlja3NldHVwL3NyYy9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MjhkYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9zeW1ib2xzb2x2ZXJfcXVpY2tzZXR1cC9zcmMvTWFpbi5qYXZhCkBAIC0wLDAgKzEsNiBAQAorcHVibGljIGNsYXNzIE1haW4geworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIFdvcmxkISIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9Db21tZW50c0luc2VydGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvQ29tbWVudHNJbnNlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTQ1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvQ29tbWVudHNJbnNlcnRlci5qYXZhCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5OT0RFX0JZX0JFR0lOX1BPU0lUSU9OOworCisvKioKKyAqIEFzc2lnbnMgY29tbWVudHMgdG8gbm9kZXMgb2YgdGhlIEFTVC4KKyAqIAorICogQGF1dGhvciBTZWJhc3RpYW4gS3VlcnRlbgorICogQGF1dGhvciBKw7psaW8gVmlsbWFyIEdlc3NlcgorICovCitjbGFzcyBDb21tZW50c0luc2VydGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIENvbW1lbnRzSW5zZXJ0ZXIoUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbW1lbnRzIGFyZSBhdHRyaWJ1dGVkIHRvIHRoZSB0aGluZyB0aGV5IGNvbW1lbnQgYW5kIGFyZSByZW1vdmVkIGZyb20KKyAgICAgKiB0aGUgY29tbWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydENvbW1lbnRzKENvbXBpbGF0aW9uVW5pdCBjdSwgVHJlZVNldDxDb21tZW50PiBjb21tZW50cykgeworICAgICAgICBpZiAoY29tbWVudHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8qIEkgc2hvdWxkIHNvcnQgYWxsIHRoZSBkaXJlY3QgY2hpbGRyZW4gYW5kIHRoZSBjb21tZW50cywgaWYgYSBjb21tZW50CisgICAgICAgICBpcyB0aGUgZmlyc3QgdGhpbmcgdGhlbiBpdAorICAgICAgICAgYSBjb21tZW50IHRvIHRoZSBDb21waWxhdGlvblVuaXQgKi8KKworICAgICAgICAvLyBGSVhNRSBpZiB0aGVyZSBpcyBubyBwYWNrYWdlIGl0IGNvdWxkIGJlIGFsc28gYSBjb21tZW50IHRvIHRoZSBmb2xsb3dpbmcgY2xhc3MuLi4KKyAgICAgICAgLy8gc28gSSBjb3VsZCB1c2Ugc29tZSBoZXVyaXN0aWNzIGluIHRoZXNlIGNhc2VzIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28KKyAgICAgICAgLy8gY2FzZXMKKworICAgICAgICBMaXN0PE5vZGU+IGNoaWxkcmVuID0gY3UuZ2V0Q2hpbGRyZW5Ob2RlcygpOworICAgICAgICBQb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb24oY2hpbGRyZW4pOworCisgICAgICAgIENvbW1lbnQgZmlyc3RDb21tZW50ID0gY29tbWVudHMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGlmIChjdS5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIChjaGlsZHJlbi5pc0VtcHR5KCkgfHwgUG9zaXRpb25VdGlscy5hcmVJbk9yZGVyKAorICAgICAgICAgICAgICAgIGZpcnN0Q29tbWVudCwgY2hpbGRyZW4uZ2V0KDApKSkpIHsKKyAgICAgICAgICAgIGN1LnNldENvbW1lbnQoZmlyc3RDb21tZW50KTsKKyAgICAgICAgICAgIGNvbW1lbnRzLnJlbW92ZShmaXJzdENvbW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdHJ5IHRvIGF0dHJpYnV0ZXMgdGhlIG5vZGVzIHJlY2VpdmVkIHRvIGNoaWxkIG9mIHRoZSBub2RlLiBJdAorICAgICAqIHJldHVybnMgdGhlIG5vZGUgdGhhdCB3ZXJlIG5vdCBhdHRyaWJ1dGVkLgorICAgICAqLworICAgIHZvaWQgaW5zZXJ0Q29tbWVudHMoTm9kZSBub2RlLCBUcmVlU2V0PENvbW1lbnQ+IGNvbW1lbnRzVG9BdHRyaWJ1dGUpIHsKKyAgICAgICAgaWYgKGNvbW1lbnRzVG9BdHRyaWJ1dGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYobm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCl7CisgICAgICAgICAgICBpbnNlcnRDb21tZW50cygoQ29tcGlsYXRpb25Vbml0KW5vZGUsIGNvbW1lbnRzVG9BdHRyaWJ1dGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGNvbW1lbnRzIGNhbjoKKyAgICAgICAgLy8gMSkgSW5zaWRlIG9uZSBvZiB0aGUgY2hpbGQsIHRoZW4gaXQgaXMgdGhlIGNoaWxkIHRoYXQgaGF2ZSB0bworICAgICAgICAvLyBhc3NvY2lhdGUgdGhlbQorICAgICAgICAvLyAyKSBJZiB0aGV5IGFyZSBub3QgaW5zaWRlIGEgY2hpbGQgdGhleSBjb3VsZCBiZSBwcmVjZWVkaW5nIG5vdGhpbmcsIGEKKyAgICAgICAgLy8gY29tbWVudCBvciBhIGNoaWxkCisgICAgICAgIC8vIGlmIHRoZXkgcHJlY2VlZCBhIGNoaWxkIHRoZXkgYXJlIGFzc2lnbmVkIHRvIGl0LCBvdGhlcndlaXNlIHRoZXkKKyAgICAgICAgLy8gcmVtYWluICJvcnBoYW5zIgorCisgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGRyZW4gPSBub2RlLmdldENoaWxkcmVuTm9kZXMoKTsKKyAgICAgICAgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKTsKKworICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgVHJlZVNldDxDb21tZW50PiBjb21tZW50c0luc2lkZUNoaWxkID0gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIGZvciAoQ29tbWVudCBjIDogY29tbWVudHNUb0F0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgIGlmIChQb3NpdGlvblV0aWxzLm5vZGVDb250YWlucyhjaGlsZCwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzSW5zaWRlQ2hpbGQuYWRkKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1lbnRzVG9BdHRyaWJ1dGUucmVtb3ZlQWxsKGNvbW1lbnRzSW5zaWRlQ2hpbGQpOworICAgICAgICAgICAgaW5zZXJ0Q29tbWVudHMoY2hpbGQsIGNvbW1lbnRzSW5zaWRlQ2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgLyogSSBjYW4gYXR0cmlidXRlIGluIGxpbmUgY29tbWVudHMgdG8gZWxlbWVudHMgcHJlY2VlZGluZyB0aGVtLCBpZgorICAgICAgICAgdGhlcmUgaXMgc29tZXRoaW5nIGNvbnRhaW5lZCBpbiB0aGVpciBsaW5lICovCisgICAgICAgIExpc3Q8Q29tbWVudD4gYXR0cmlidXRlZENvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKENvbW1lbnQgY29tbWVudCA6IGNvbW1lbnRzVG9BdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIGlmIChjb21tZW50LmlzTGluZUNvbW1lbnQoKSkgeworICAgICAgICAgICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRFbmQoKS5saW5lID09IGNvbW1lbnQuZ2V0QmVnaW4oKS5saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdHRyaWJ1dGVMaW5lQ29tbWVudFRvTm9kZU9yQ2hpbGQoY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQuYXNMaW5lQ29tbWVudCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZWRDb21tZW50cy5hZGQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBhdCB0aGlzIHBvaW50IEkgY3JlYXRlIGFuIG9yZGVyZWQgbGlzdCBvZiBhbGwgcmVtYWluaW5nIGNvbW1lbnRzIGFuZAorICAgICAgICAgY2hpbGRyZW4gKi8KKyAgICAgICAgQ29tbWVudCBwcmV2aW91c0NvbW1lbnQgPSBudWxsOworICAgICAgICBhdHRyaWJ1dGVkQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGRyZW5BbmRDb21tZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgY2hpbGRyZW5BbmRDb21tZW50cy5hZGRBbGwoY2hpbGRyZW4pOworICAgICAgICBjaGlsZHJlbkFuZENvbW1lbnRzLmFkZEFsbChjb21tZW50c1RvQXR0cmlidXRlKTsKKyAgICAgICAgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuQW5kQ29tbWVudHMsCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5kb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbik7CisKKyAgICAgICAgZm9yIChOb2RlIHRoaW5nIDogY2hpbGRyZW5BbmRDb21tZW50cykgeworICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgQ29tbWVudCkgeworICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tbWVudCA9IChDb21tZW50KSB0aGluZzsKKyAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzQ29tbWVudC5pc09ycGhhbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNDb21tZW50ICE9IG51bGwgJiYgIXRoaW5nLmhhc0NvbW1lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uZG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZGluZ0VtcHR5TGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhdGhlcmVBcmVMaW5lc0JldHdlZW4ocHJldmlvdXNDb21tZW50LCB0aGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLnNldENvbW1lbnQocHJldmlvdXNDb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZWRDb21tZW50cy5hZGQocHJldmlvdXNDb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb21tZW50c1RvQXR0cmlidXRlLnJlbW92ZUFsbChhdHRyaWJ1dGVkQ29tbWVudHMpOworCisgICAgICAgIC8vIGFsbCB0aGUgcmVtYWluaW5nIGFyZSBvcnBoYW4gbm9kZXMKKyAgICAgICAgZm9yIChDb21tZW50IGMgOiBjb21tZW50c1RvQXR0cmlidXRlKSB7CisgICAgICAgICAgICBpZiAoYy5pc09ycGhhbigpKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hZGRPcnBoYW5Db21tZW50KGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGF0dHJpYnV0ZUxpbmVDb21tZW50VG9Ob2RlT3JDaGlsZChOb2RlIG5vZGUsIExpbmVDb21tZW50IGxpbmVDb21tZW50KSB7CisgICAgICAgIC8vIFRoZSBub2RlIHN0YXJ0IGFuZCBlbmQgYXQgdGhlIHNhbWUgbGluZSBhcyB0aGUgY29tbWVudCwKKyAgICAgICAgLy8gbGV0J3MgZ2l2ZSB0byBpdCB0aGUgY29tbWVudAorICAgICAgICBpZiAobm9kZS5nZXRCZWdpbigpLmxpbmUgPT0gbGluZUNvbW1lbnQuZ2V0QmVnaW4oKS5saW5lCisgICAgICAgICAgICAgICAgJiYgIW5vZGUuaGFzQ29tbWVudCgpKSB7CisgICAgICAgICAgICBpZighKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSkgeworICAgICAgICAgICAgICAgIG5vZGUuc2V0Q29tbWVudChsaW5lQ29tbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRyeSB3aXRoIGFsbCB0aGUgY2hpbGRyZW4sIHNvcnRlZCBieSByZXZlcnNlIHBvc2l0aW9uIChzbyB0aGUKKyAgICAgICAgICAgIC8vIGZpcnN0IG9uZSBpcyB0aGUgbmVhcmVzdCB0byB0aGUgY29tbWVudAorICAgICAgICAgICAgTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICBjaGlsZHJlbi5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkpOworICAgICAgICAgICAgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoY2hpbGRyZW4pOworCisgICAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVMaW5lQ29tbWVudFRvTm9kZU9yQ2hpbGQoY2hpbGQsIGxpbmVDb21tZW50KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB0aGVyZUFyZUxpbmVzQmV0d2VlbihOb2RlIGEsIE5vZGUgYikgeworICAgICAgICBpZiAoIVBvc2l0aW9uVXRpbHMuYXJlSW5PcmRlcihhLCBiKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoZXJlQXJlTGluZXNCZXR3ZWVuKGIsIGEpOworICAgICAgICB9CisgICAgICAgIGludCBlbmRPZkEgPSBhLmdldEVuZCgpLmxpbmU7CisgICAgICAgIHJldHVybiBiLmdldEJlZ2luKCkubGluZSA+IChlbmRPZkEgKyAxKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvSmF2YVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGM3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvSmF2YVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLlVURjg7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CisKKy8qKgorICogUGFyc2UgSmF2YSBzb3VyY2UgY29kZSBhbmQgY3JlYXRlcyBBYnN0cmFjdCBTeW50YXggVHJlZXMuCisgKgorICogQGF1dGhvciBKw7psaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmF2YVBhcnNlciB7CisJcHJpdmF0ZSBmaW5hbCBDb21tZW50c0luc2VydGVyIGNvbW1lbnRzSW5zZXJ0ZXI7CisKKwlwcml2YXRlIEFTVFBhcnNlciBhc3RQYXJzZXIgPSBudWxsOworCisJLyoqCisJICogSW5zdGFudGlhdGUgdGhlIHBhcnNlciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gTm90ZSB0aGF0IHBhcnNpbmcgY2FuIGFsc28gYmUgZG9uZSB3aXRoIHRoZSBzdGF0aWMgbWV0aG9kcyBvbiB0aGlzIGNsYXNzLgorCSAqIENyZWF0aW5nIGFuIGluc3RhbmNlIHdpbGwgcmVkdWNlIHNldHVwIHRpbWUgYmV0d2VlbiBwYXJzaW5nIGZpbGVzLgorCSAqLworCXB1YmxpYyBKYXZhUGFyc2VyKCkgeworCQl0aGlzKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkpOworCX0KKworCS8qKgorCSAqIEluc3RhbnRpYXRlIHRoZSBwYXJzZXIuIE5vdGUgdGhhdCBwYXJzaW5nIGNhbiBhbHNvIGJlIGRvbmUgd2l0aCB0aGUgc3RhdGljIG1ldGhvZHMgb24gdGhpcyBjbGFzcy4KKwkgKiBDcmVhdGluZyBhbiBpbnN0YW5jZSB3aWxsIHJlZHVjZSBzZXR1cCB0aW1lIGJldHdlZW4gcGFyc2luZyBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgSmF2YVBhcnNlcihQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKwkJY29tbWVudHNJbnNlcnRlciA9IG5ldyBDb21tZW50c0luc2VydGVyKGNvbmZpZ3VyYXRpb24pOworCX0KKworCXByaXZhdGUgQVNUUGFyc2VyIGdldFBhcnNlckZvclByb3ZpZGVyKFByb3ZpZGVyIHByb3ZpZGVyKSB7CisJCWlmIChhc3RQYXJzZXIgPT0gbnVsbCkgeworCQkJYXN0UGFyc2VyID0gbmV3IEFTVFBhcnNlcihwcm92aWRlcik7CisJCX0gZWxzZSB7CisJCQlhc3RQYXJzZXIuUmVJbml0KHByb3ZpZGVyKTsKKwkJfQorCQlyZXR1cm4gYXN0UGFyc2VyOworCX0KKworCS8qKgorCSAqIFBhcnNlcyBzb3VyY2UgY29kZS4KKwkgKiBJdCB0YWtlcyB0aGUgc291cmNlIGNvZGUgZnJvbSBhIFByb3ZpZGVyLgorCSAqIFRoZSBzdGFydCBpbmRpY2F0ZXMgd2hhdCBjYW4gYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlIChjb21waWxhdGlvbiB1bml0LCBibG9jaywgaW1wb3J0Li4uKQorCSAqCisgICAgICogQHBhcmFtIHN0YXJ0ICAgIHJlZmVyIHRvIHRoZSBjb25zdGFudHMgaW4gUGFyc2VTdGFydCB0byBzZWUgd2hhdCBjYW4gYmUgcGFyc2VkLgorICAgICAqIEBwYXJhbSBwcm92aWRlciByZWZlciB0byBQcm92aWRlcnMgdG8gc2VlIGhvdyB5b3UgY2FuIHJlYWQgc291cmNlLgorICAgICAqIEBwYXJhbSA8Tj4gICAgICB0aGUgc3ViY2xhc3Mgb2YgTm9kZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgcGFyc2luZyBpbiB0aGUgc3RhcnQuCisgICAgICogQHJldHVybiB0aGUgcGFyc2UgcmVzdWx0LCBhIGNvbGxlY3Rpb24gb2YgZW5jb3VudGVyZWQgcHJvYmxlbXMsIGFuZCBzb21lIGV4dHJhIGRhdGEuCisgICAgICovCisJcHVibGljIDxOIGV4dGVuZHMgTm9kZT4gUGFyc2VSZXN1bHQ8Tj4gcGFyc2UoUGFyc2VTdGFydDxOPiBzdGFydCwgUHJvdmlkZXIgcHJvdmlkZXIpIHsKKwkJdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEFTVFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXJGb3JQcm92aWRlcihwcm92aWRlcik7CisJCQlOIHJlc3VsdE5vZGUgPSBzdGFydC5wYXJzZShwYXJzZXIpOworICAgICAgICAgICAgZmluYWwgQ29tbWVudHNDb2xsZWN0aW9uIGNvbW1lbnRzID0gYXN0UGFyc2VyLmdldENvbW1lbnRzQ29sbGVjdGlvbigpOworICAgICAgICAgICAgY29tbWVudHNJbnNlcnRlci5pbnNlcnRDb21tZW50cyhyZXN1bHROb2RlLCBjb21tZW50cy5jb3B5KCkuZ2V0Q29tbWVudHMoKSk7CisgICAgICAgICAgICAKKwkJCXJldHVybiBuZXcgUGFyc2VSZXN1bHQ8PihPcHRpb25hbC5vZihyZXN1bHROb2RlKSwgcGFyc2VyLnByb2JsZW1zLCBPcHRpb25hbC5vZihhc3RQYXJzZXIuZ2V0VG9rZW5zKCkpLCBPcHRpb25hbC5vZihhc3RQYXJzZXIuZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkpKTsKKwkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG5ldyBQYXJzZVJlc3VsdDw+KGUpOworICAgICAgICB9IGNhdGNoIChUb2tlbk1nckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlUmVzdWx0PD4oZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCXByb3ZpZGVyLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gU2luY2Ugd2UncmUgZG9uZSBwYXJzaW5nIGFuZCBoYXZlIG91ciByZXN1bHQsIHdlIGRvbid0IGNhcmUgYWJvdXQgYW55IGVycm9ycy4KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgcmV0dXJucyBhCisJICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGluICAgICAgIHtAbGluayBJbnB1dFN0cmVhbX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisJICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgY29kZQorCSAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorCSAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGluLCBDaGFyc2V0IGVuY29kaW5nKSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoaW4sIGVuY29kaW5nKSk7CisJfQorCisJLyoqCisJICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuPGJyPgorCSAqIE5vdGU6IFVzZXMgVVRGLTggZW5jb2RpbmcKKwkgKgorCSAqIEBwYXJhbSBpbiB7QGxpbmsgSW5wdXRTdHJlYW19IGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZQorCSAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorCSAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGluKSB7CisJCXJldHVybiBwYXJzZShpbiwgVVRGOCk7CisJfQorCisJLyoqCisJICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIGEge0BsaW5rIEZpbGV9IGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisJICoKKwkgKiBAcGFyYW0gZmlsZSAgICAge0BsaW5rIEZpbGV9IGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZQorCSAqIEBwYXJhbSBlbmNvZGluZyBlbmNvZGluZyBvZiB0aGUgc291cmNlIGNvZGUKKwkgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKwkgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB0aGUgZmlsZSB3YXMgbm90IGZvdW5kCisJICovCisJcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBDaGFyc2V0IGVuY29kaW5nKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihmaWxlLCBlbmNvZGluZykpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiBhIHtAbGluayBGaWxlfSBhbmQgcmV0dXJucyBhCisJICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0Ljxicj4KKwkgKiBOb3RlOiBVc2VzIFVURi04IGVuY29kaW5nCisJICoKKwkgKiBAcGFyYW0gZmlsZSB7QGxpbmsgRmlsZX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisJICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisJICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gdGhlIGZpbGUgd2FzIG5vdCBmb3VuZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoZmlsZSkpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiBhIGZpbGUgYW5kIHJldHVybnMgYQorCSAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKwkgKgorCSAqIEBwYXJhbSBwYXRoICAgICBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUKKwkgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisJICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgYWNjZXNzZWQKKwkgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBQYXRoIHBhdGgsIGZpbmFsIENoYXJzZXQgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocGF0aCwgZW5jb2RpbmcpKTsKKwl9CisKKwkvKioKKwkgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSBmaWxlIGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuPGJyPgorCSAqIE5vdGU6IFVzZXMgVVRGLTggZW5jb2RpbmcKKwkgKgorCSAqIEBwYXJhbSBwYXRoICAgICBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUKKwkgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKwkgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRoZSBwYXRoIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIFBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihwYXRoKSk7CisJfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIEphdmEgY29kZSBmcm9tIGEgUmVhZGVyIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuPGJyPgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIFJlYWRlciByZWFkZXIpIHsKKwkJcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihyZWFkZXIpKTsKKwl9CisKKwkvKioKKwkgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gY29kZSBhbmQgcmV0dXJucyBhCisJICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGNvZGUgICAgICAgICAgICAgSmF2YSBzb3VyY2UgY29kZQorCSAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorCSAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKFN0cmluZyBjb2RlKSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoY29kZSkpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBibG9jayBjb250YWluZWQgaW4gYSB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhCisJICoge0BsaW5rIEJsb2NrU3RtdH0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGJsb2NrU3RhdGVtZW50IHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBibG9jayBjb2RlCisJICogQHJldHVybiBCbG9ja1N0bXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIGJsb2NrCisJICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisJICovCisJcHVibGljIHN0YXRpYyBCbG9ja1N0bXQgcGFyc2VCbG9jayhmaW5hbCBTdHJpbmcgYmxvY2tTdGF0ZW1lbnQpIHsKKwkJcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShCTE9DSywgcHJvdmlkZXIoYmxvY2tTdGF0ZW1lbnQpKTsKKwl9CisKKwkvKioKKwkgKiBQYXJzZXMgdGhlIEphdmEgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgU3RhdGVtZW50fSB0aGF0IHJlcHJlc2VudHMgaXQuCisJICoKKwkgKiBAcGFyYW0gc3RhdGVtZW50IHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBzdGF0ZW1lbnQgY29kZQorCSAqIEByZXR1cm4gU3RhdGVtZW50IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzdGF0ZW1lbnQKKwkgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0YXRlbWVudCBwYXJzZVN0YXRlbWVudChmaW5hbCBTdHJpbmcgc3RhdGVtZW50KSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcihzdGF0ZW1lbnQpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIE5vZGU+IFQgc2ltcGxpZmllZFBhcnNlKFBhcnNlU3RhcnQ8VD4gY29udGV4dCwgUHJvdmlkZXIgcHJvdmlkZXIpIHsKKwkJUGFyc2VSZXN1bHQ8VD4gcmVzdWx0ID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKSkucGFyc2UoY29udGV4dCwgcHJvdmlkZXIpOworCQlpZiAocmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKSB7CisJCQlyZXR1cm4gcmVzdWx0LmdldFJlc3VsdCgpLmdldCgpOworCQl9CisJCXRocm93IG5ldyBQYXJzZVByb2JsZW1FeGNlcHRpb24ocmVzdWx0LmdldFByb2JsZW1zKCkpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBpbXBvcnQgY29udGFpbmVkIGluIGEge0BsaW5rIFN0cmluZ30gYW5kIHJldHVybnMgYQorCSAqIHtAbGluayBJbXBvcnREZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGltcG9ydERlY2xhcmF0aW9uIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBpbXBvcnQgY29kZQorCSAqIEByZXR1cm4gSW1wb3J0RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGltcG9ydCBkZWNsYXJhdGlvbgorCSAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworCSAqLworCXB1YmxpYyBzdGF0aWMgSW1wb3J0RGVjbGFyYXRpb24gcGFyc2VJbXBvcnQoZmluYWwgU3RyaW5nIGltcG9ydERlY2xhcmF0aW9uKSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoSU1QT1JUX0RFQ0xBUkFUSU9OLCBwcm92aWRlcihpbXBvcnREZWNsYXJhdGlvbikpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBleHByZXNzaW9uIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgRXhwcmVzc2lvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGV4cHJlc3Npb24ge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGV4cHJlc3Npb24KKwkgKiBAcmV0dXJuIEV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGV4cHJlc3Npb24KKwkgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb24gcGFyc2VFeHByZXNzaW9uKGZpbmFsIFN0cmluZyBleHByZXNzaW9uKSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoRVhQUkVTU0lPTiwgcHJvdmlkZXIoZXhwcmVzc2lvbikpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBhbm5vdGF0aW9uIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgQW5ub3RhdGlvbkV4cHJ9IHRoYXQgcmVwcmVzZW50cyBpdC4KKwkgKgorCSAqIEBwYXJhbSBhbm5vdGF0aW9uIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBhbm5vdGF0aW9uCisJICogQHJldHVybiBBbm5vdGF0aW9uRXhwciByZXByZXNlbnRpbmcgdGhlIEphdmEgYW5ub3RhdGlvbgorCSAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkV4cHIgcGFyc2VBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uKSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoQU5OT1RBVElPTiwgcHJvdmlkZXIoYW5ub3RhdGlvbikpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyB0aGUgSmF2YSBhbm5vdGF0aW9uIGJvZHkgZGVjbGFyYXRpb24oZS5nIGZpZWxkcyBvciBtZXRob2RzKSBjb250YWluZWQgaW4gYQorCSAqIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGJvZHkge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGJvZHkgZGVjbGFyYXRpb24KKwkgKiBAcmV0dXJuIEJvZHlEZWNsYXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIEphdmEgYW5ub3RhdGlvbgorCSAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworCSAqLworCXB1YmxpYyBzdGF0aWMgQm9keURlY2xhcmF0aW9uPD8+IHBhcnNlQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvbihmaW5hbCBTdHJpbmcgYm9keSkgeworCQlyZXR1cm4gc2ltcGxpZmllZFBhcnNlKEFOTk9UQVRJT05fQk9EWSwgcHJvdmlkZXIoYm9keSkpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyBhIEphdmEgY2xhc3MgYm9keSBkZWNsYXJhdGlvbihlLmcgZmllbGRzIG9yIG1ldGhvZHMpIGFuZCByZXR1cm5zIGEKKwkgKiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisJICoKKwkgKiBAcGFyYW0gYm9keSB0aGUgYm9keSBvZiBhIGNsYXNzCisJICogQHJldHVybiBCb2R5RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGNsYXNzIGJvZHkKKwkgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEJvZHlEZWNsYXJhdGlvbjw/PiBwYXJzZUNsYXNzQm9keURlY2xhcmF0aW9uKFN0cmluZyBib2R5KSB7CisJCXJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ0xBU1NfQk9EWSwgcHJvdmlkZXIoYm9keSkpOworCX0KKworCS8qKgorCSAqIFBhcnNlcyBhIEphdmEgaW50ZXJmYWNlIGJvZHkgZGVjbGFyYXRpb24oZS5nIGZpZWxkcyBvciBtZXRob2RzKSBhbmQgcmV0dXJucyBhCisJICoge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorCSAqCisJICogQHBhcmFtIGJvZHkgdGhlIGJvZHkgb2YgYW4gaW50ZXJmYWNlCisJICogQHJldHVybiBCb2R5RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGludGVyZmFjZSBib2R5CisJICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisJICovCisJcHVibGljIHN0YXRpYyBCb2R5RGVjbGFyYXRpb24gcGFyc2VJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24oU3RyaW5nIGJvZHkpIHsKKwkJcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShJTlRFUkZBQ0VfQk9EWSwgcHJvdmlkZXIoYm9keSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYWNrYWdlTG9jYWxDbGFzc2VzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFja2FnZUxvY2FsQ2xhc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTMzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFja2FnZUxvY2FsQ2xhc3Nlcy5qYXZhCkBAIC0wLDAgKzEsNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2NsYXNzIEZvb0NsYXNzIHt9CitjbGFzcyBCYXJDbGFzcyB7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVByb2JsZW1FeGNlcHRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVByb2JsZW1FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmEwMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlUHJvYmxlbUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworCisvKioKKyAqIFRocm93biB3aGVuIHBhcnNpbmcgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHBhcnNpbmcgd2l0aCB0aGUgc3RhdGljIG1ldGhvZHMgb24gSmF2YVBhcnNlci4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIC8qKgorICAgICAqIFRoZSBwcm9ibGVtcyB0aGF0IHdlcmUgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvYmxlbT4gcHJvYmxlbXM7CisKKyAgICBQYXJzZVByb2JsZW1FeGNlcHRpb24oTGlzdDxQcm9ibGVtPiBwcm9ibGVtcykgeworICAgICAgICBzdXBlcihjcmVhdGVNZXNzYWdlKGFzc2VydE5vdE51bGwocHJvYmxlbXMpKSk7CisgICAgICAgIHRoaXMucHJvYmxlbXMgPSBwcm9ibGVtczsKKyAgICB9CisKKyAgICBQYXJzZVByb2JsZW1FeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICB0aGlzKHNpbmdsZXRvbkxpc3QobmV3IFByb2JsZW0odGhyb3dhYmxlLmdldE1lc3NhZ2UoKSwgT3B0aW9uYWwuZW1wdHkoKSwgT3B0aW9uYWwub2YodGhyb3dhYmxlKSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWVzc2FnZShMaXN0PFByb2JsZW0+IHByb2JsZW1zKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvcihQcm9ibGVtIHByb2JsZW06IHByb2JsZW1zKXsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHByb2JsZW0udG9TdHJpbmcoKSkuYXBwZW5kKEVPTCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxQcm9ibGVtPiBnZXRQcm9ibGVtcygpIHsKKyAgICAgICAgcmV0dXJuIHByb2JsZW1zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVJlc3VsdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlNDAwNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CisKKy8qKgorICogVGhlIHJlc3VsdHMgZ2l2ZW4gd2hlbiBwYXJzaW5nIHdpdGggYW4gaW5zdGFuY2Ugb2YgSmF2YVBhcnNlci4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlUmVzdWx0PFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIE9wdGlvbmFsPFQ+IHJlc3VsdDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvYmxlbT4gcHJvYmxlbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBPcHRpb25hbDxMaXN0PFRva2VuPj4gdG9rZW5zOworICAgIHByaXZhdGUgZmluYWwgT3B0aW9uYWw8Q29tbWVudHNDb2xsZWN0aW9uPiBjb21tZW50c0NvbGxlY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmFsIGNvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIEFTVCwgb3IgZW1wdHkgaWYgaXQgd2Fzbid0IGNyZWF0ZWQuCisgICAgICogQHBhcmFtIHByb2JsZW1zIGEgbGlzdCBvZiBlbmNvdW50ZXJlZCBwYXJzaW5nIHByb2JsZW1zLgorICAgICAqIEBwYXJhbSB0b2tlbnMgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd2VyZSBwYXJzZWQsIG9yIGVtcHR5IGlmIHBhcnNpbmcgZmFpbGVkIGNvbXBsZXRlbHkuCisgICAgICovCisgICAgUGFyc2VSZXN1bHQoT3B0aW9uYWw8VD4gcmVzdWx0LCBMaXN0PFByb2JsZW0+IHByb2JsZW1zLCBPcHRpb25hbDxMaXN0PFRva2VuPj4gdG9rZW5zLCBPcHRpb25hbDxDb21tZW50c0NvbGxlY3Rpb24+IGNvbW1lbnRzQ29sbGVjdGlvbikgeworICAgICAgICB0aGlzLmNvbW1lbnRzQ29sbGVjdGlvbiA9IGFzc2VydE5vdE51bGwoY29tbWVudHNDb2xsZWN0aW9uKTsKKyAgICAgICAgdGhpcy5yZXN1bHQgPSBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CisgICAgICAgIHRoaXMucHJvYmxlbXMgPSBhc3NlcnROb3ROdWxsKHByb2JsZW1zKTsKKyAgICAgICAgdGhpcy50b2tlbnMgPSBhc3NlcnROb3ROdWxsKHRva2Vucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB3aGVuIHBhcnNpbmcgZmFpbGVkIGNvbXBsZXRlbHkgd2l0aCBhbiBleGNlcHRpb24uCisgICAgICovCisgICAgUGFyc2VSZXN1bHQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICB0aGlzKE9wdGlvbmFsLmVtcHR5KCksIHNpbmdsZXRvbkxpc3QobmV3IFByb2JsZW0odGhyb3dhYmxlLmdldE1lc3NhZ2UoKSwgT3B0aW9uYWwuZW1wdHkoKSwgT3B0aW9uYWwub2YodGhyb3dhYmxlKSkpLCBPcHRpb25hbC5lbXB0eSgpLCBPcHRpb25hbC5lbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwsIG1lYW5pbmcgbm8gZXJyb3JzIG9mIGFueSBraW5kIHdlcmUgZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCkgeworICAgICAgICByZXR1cm4gcHJvYmxlbXMuaXNFbXB0eSgpICYmIHJlc3VsdC5pc1ByZXNlbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGVuY291bnRlcmVkIHBhcnNpbmcgcHJvYmxlbXMuIEVtcHR5IHdoZW4gbm8gcHJvYmxlbXMgd2VyZSBlbmNvdW50ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm9ibGVtPiBnZXRQcm9ibGVtcygpIHsKKyAgICAgICAgcmV0dXJuIHByb2JsZW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBsZXRlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd2VyZSBwYXJzZWQsIG9yIGVtcHR5IGlmIHBhcnNpbmcgZmFpbGVkIGNvbXBsZXRlbHkuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPExpc3Q8VG9rZW4+PiBnZXRUb2tlbnMoKSB7CisgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29tcGxldGUgY29sbGVjdGlvbiBvZiBjb21tZW50cyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb25hbDxDb21tZW50c0NvbGxlY3Rpb24+IGdldENvbW1lbnRzQ29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnRzQ29sbGVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBBU1Qgb2YgdGhlIHBhcnNlZCBzb3VyY2UgY29kZSwgb3IgZW1wdHkgaWYgcGFyc2luZyBmYWlsZWQgY29tcGxldGVseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8VD4gZ2V0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChpc1N1Y2Nlc3NmdWwoKSkgeworICAgICAgICAgICAgcmV0dXJuICJQYXJzaW5nIHN1Y2Nlc3NmdWwiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCJQYXJzaW5nIGZhaWxlZDoiKS5hcHBlbmQoRU9MKTsKKyAgICAgICAgZm9yIChQcm9ibGVtIHByb2JsZW0gOiBwcm9ibGVtcykgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQocHJvYmxlbS50b1N0cmluZygpKS5hcHBlbmQoRU9MKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZVN0YXJ0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VTdGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NGE2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VTdGFydC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CisKKy8qKgorICogVGhlIHN0YXJ0IHByb2R1Y3Rpb24gZm9yIEphdmFQYXJzZXIuCisgKiBUZWxscyBKYXZhUGFyc2VyIHdoYXQgcGllY2Ugb2YgSmF2YSBjb2RlIGl0IGNhbiBleHBlY3QuCisgKiBGb3IgZXhhbXBsZSwKKyAqIENPTVBJTEFUSU9OX1VOSVQgaW5kaWNhdGVzIGEgY29tcGxldGUgSmF2YSBmaWxlLAorICogYW5kIENMQVNTX0JPRFkgd291bGQgaW5kaWNhdGUgdGhlIHBhcnQgb2YgYSBjbGFzcyB0aGF0IGlzIHdpdGhpbiB7IGFuZCB9LgorICogQHNlZSBKYXZhUGFyc2VyI3BhcnNlKFBhcnNlU3RhcnQsIFByb3ZpZGVyKQorICovCitARnVuY3Rpb25hbEludGVyZmFjZQorcHVibGljIGludGVyZmFjZSBQYXJzZVN0YXJ0PFI+IHsKKwlQYXJzZVN0YXJ0PENvbXBpbGF0aW9uVW5pdD4gQ09NUElMQVRJT05fVU5JVCA9IEFTVFBhcnNlcjo6Q29tcGlsYXRpb25Vbml0OworCVBhcnNlU3RhcnQ8QmxvY2tTdG10PiBCTE9DSyA9IEFTVFBhcnNlcjo6QmxvY2s7CisJUGFyc2VTdGFydDxTdGF0ZW1lbnQ+IFNUQVRFTUVOVCA9IEFTVFBhcnNlcjo6QmxvY2tTdGF0ZW1lbnQ7CisJUGFyc2VTdGFydDxJbXBvcnREZWNsYXJhdGlvbj4gSU1QT1JUX0RFQ0xBUkFUSU9OPSBBU1RQYXJzZXI6OkltcG9ydERlY2xhcmF0aW9uOworCVBhcnNlU3RhcnQ8RXhwcmVzc2lvbj4gRVhQUkVTU0lPTiA9IEFTVFBhcnNlcjo6RXhwcmVzc2lvbjsKKwlQYXJzZVN0YXJ0PEFubm90YXRpb25FeHByPiBBTk5PVEFUSU9OID0gQVNUUGFyc2VyOjpBbm5vdGF0aW9uOworCVBhcnNlU3RhcnQ8Qm9keURlY2xhcmF0aW9uPD8+PiBBTk5PVEFUSU9OX0JPRFkgPSBBU1RQYXJzZXI6OkFubm90YXRpb25Cb2R5RGVjbGFyYXRpb247CisJUGFyc2VTdGFydDxCb2R5RGVjbGFyYXRpb248Pz4+IENMQVNTX0JPRFkgPSBwIC0+IHAuQ2xhc3NPckludGVyZmFjZUJvZHlEZWNsYXJhdGlvbihmYWxzZSk7CisJUGFyc2VTdGFydDxCb2R5RGVjbGFyYXRpb248Pz4+IElOVEVSRkFDRV9CT0RZID0gcCAtPiBwLkNsYXNzT3JJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24odHJ1ZSk7CisKKwlSIHBhcnNlKEFTVFBhcnNlciBwYXJzZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZXJDb25maWd1cmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VyQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTY1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VyQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBQYXJzZXJDb25maWd1cmF0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBkb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VkaW5nRW1wdHlMaW5lcyA9IHRydWU7CisgICAgcHVibGljIGJvb2xlYW4gZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24gPSBmYWxzZTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUG9zaXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qb3NpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjgyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUG9zaXRpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CisKKy8qKgorICogQSBwb3NpdGlvbiBpbiBhIHNvdXJjZSBmaWxlLiBMaW5lcyBhbmQgY29sdW1ucyBzdGFydCBjb3VudGluZyBhdCAxLgorICovCitwdWJsaWMgY2xhc3MgUG9zaXRpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPFBvc2l0aW9uPiB7CisJcHVibGljIGZpbmFsIGludCBsaW5lOworCXB1YmxpYyBmaW5hbCBpbnQgY29sdW1uOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBQb3NpdGlvbiBBQlNPTFVURV9TVEFSVCA9IG5ldyBQb3NpdGlvbihOb2RlLkFCU09MVVRFX0JFR0lOX0xJTkUsIC0xKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFBvc2l0aW9uIEFCU09MVVRFX0VORCA9IG5ldyBQb3NpdGlvbihOb2RlLkFCU09MVVRFX0VORF9MSU5FLCAtMSk7CisKKwkvKioKKwkgKiBUaGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFBvc2l0aW9uIEhPTUUgPSBuZXcgUG9zaXRpb24oMSwgMSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBQb3NpdGlvbiBVTktOT1dOID0gbmV3IFBvc2l0aW9uKDAsIDApOworCisJcHVibGljIFBvc2l0aW9uKGludCBsaW5lLCBpbnQgY29sdW1uKSB7CisJCWlmIChsaW5lIDwgTm9kZS5BQlNPTFVURV9FTkRfTElORSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcG9zaXRpb24gYXQgbGluZSAiICsgbGluZSk7CisJCX0KKwkJaWYgKGNvbHVtbiA8IC0xKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBwb3NpdGlvbiBhdCBjb2x1bW4gIiArIGNvbHVtbik7CisJCX0KKwkJdGhpcy5saW5lID0gbGluZTsKKwkJdGhpcy5jb2x1bW4gPSBjb2x1bW47CisJfQorCisJLyoqCisJICogQ29udmVuaWVudCBmYWN0b3J5IG1ldGhvZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBvc2l0aW9uIHBvcyhpbnQgbGluZSwgaW50IGNvbHVtbikgeworCQlyZXR1cm4gbmV3IFBvc2l0aW9uKGxpbmUsIGNvbHVtbik7CisJfQorCisJcHVibGljIFBvc2l0aW9uIHdpdGhDb2x1bW4oaW50IGNvbHVtbikgeworCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHRoaXMubGluZSwgY29sdW1uKTsKKwl9CisKKwlwdWJsaWMgUG9zaXRpb24gd2l0aExpbmUoaW50IGxpbmUpIHsKKwkJcmV0dXJuIG5ldyBQb3NpdGlvbihsaW5lLCB0aGlzLmNvbHVtbik7CisJfQorCisJLyoqCisJICogQ2hlY2sgaWYgdGhlIHBvc2l0aW9uIGlzIHVzYWJsZS4gRG9lcyBub3Qga25vdyB3aGF0IGl0IGlzIHBvaW50aW5nIGF0LCBzbyBpdCBjYW4ndCBjaGVjayBpZiB0aGUgcG9zaXRpb24gaXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkKCkgeworCQlyZXR1cm4gbGluZSA+IDAgJiYgY29sdW1uID4gMDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpbnZhbGlkKCkgeworCQlyZXR1cm4gIXZhbGlkKCk7CisJfQorCisJcHVibGljIFBvc2l0aW9uIG9ySWZJbnZhbGlkKFBvc2l0aW9uIGFub3RoZXJQb3NpdGlvbikgeworCQlpZiAodmFsaWQoKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJcmV0dXJuIGFub3RoZXJQb3NpdGlvbjsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNBZnRlcihQb3NpdGlvbiBwb3NpdGlvbikgeworCQlhc3NlcnROb3ROdWxsKHBvc2l0aW9uKTsKKwkJaWYgKHBvc2l0aW9uLmxpbmUgPT0gTm9kZS5BQlNPTFVURV9CRUdJTl9MSU5FKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKGxpbmUgPiBwb3NpdGlvbi5saW5lKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIGlmIChsaW5lID09IHBvc2l0aW9uLmxpbmUpIHsKKwkJCXJldHVybiBjb2x1bW4gPiBwb3NpdGlvbi5jb2x1bW47CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCisJfQorCisJcHVibGljIGJvb2xlYW4gaXNCZWZvcmUoUG9zaXRpb24gcG9zaXRpb24pIHsKKwkJYXNzZXJ0Tm90TnVsbChwb3NpdGlvbik7CisJCWlmIChwb3NpdGlvbi5saW5lID09IE5vZGUuQUJTT0xVVEVfRU5EX0xJTkUpIHJldHVybiB0cnVlOworCQlpZiAobGluZSA8IHBvc2l0aW9uLmxpbmUpIHsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgaWYgKGxpbmUgPT0gcG9zaXRpb24ubGluZSkgeworCQkJcmV0dXJuIGNvbHVtbiA8IHBvc2l0aW9uLmNvbHVtbjsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBjb21wYXJlVG8oUG9zaXRpb24gbykgeworCQlhc3NlcnROb3ROdWxsKG8pOworCQlpZiAoaXNCZWZvcmUobykpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoaXNBZnRlcihvKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJCWlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworCQlpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKwkJUG9zaXRpb24gcG9zaXRpb24gPSAoUG9zaXRpb24pIG87CisKKwkJcmV0dXJuIGxpbmUgPT0gcG9zaXRpb24ubGluZSAmJiBjb2x1bW4gPT0gcG9zaXRpb24uY29sdW1uOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiAzMSAqIGxpbmUgKyBjb2x1bW47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICIobGluZSAiICsgbGluZSArICIsY29sICIgKyBjb2x1bW4gKyAiKSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb2JsZW0uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm9ibGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NWNjOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm9ibGVtLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CisKKy8qKgorICogQSBwcm9ibGVtIHRoYXQgd2FzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLgorICovCitwdWJsaWMgY2xhc3MgUHJvYmxlbSB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIE9wdGlvbmFsPFJhbmdlPiByYW5nZTsKKyAgICBwcml2YXRlIGZpbmFsIE9wdGlvbmFsPFRocm93YWJsZT4gY2F1c2U7CisKKyAgICBQcm9ibGVtKFN0cmluZyBtZXNzYWdlLCBPcHRpb25hbDxSYW5nZT4gcmFuZ2UsIE9wdGlvbmFsPFRocm93YWJsZT4gY2F1c2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5yYW5nZSA9IGFzc2VydE5vdE51bGwocmFuZ2UpOworICAgICAgICB0aGlzLmNhdXNlID0gYXNzZXJ0Tm90TnVsbChjYXVzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcihtZXNzYWdlKTsKKyAgICAgICAgcmFuZ2UuaWZQcmVzZW50KHIgLT4gc3RyLmFwcGVuZCgiICIpLmFwcGVuZChyKSk7CisgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxSYW5nZT4gZ2V0UmFuZ2UoKSB7CisgICAgICAgIHJldHVybiByYW5nZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8VGhyb3dhYmxlPiBnZXRDYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhdXNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm92aWRlcnMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm92aWRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU3MzFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb3ZpZGVycy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuT3Blbk9wdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmFzc2VydE5vdE51bGw7CisKKy8qKgorICogRmFjdG9yeSBmb3IgcHJvdmlkZXJzIG9mIHNvdXJjZSBjb2RlIGZvciBKYXZhUGFyc2VyLgorICogUHJvdmlkZXJzIHRoYXQgaGF2ZSBubyBwYXJhbWV0ZXIgZm9yIGVuY29kaW5nIGJ1dCBuZWVkIGl0IHdpbGwgdXNlIFVURi04LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvdmlkZXJzIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgVVRGOCA9IENoYXJzZXQuZm9yTmFtZSgidXRmLTgiKTsKKworCXByaXZhdGUgUHJvdmlkZXJzKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvdmlkZXIgcHJvdmlkZXIoUmVhZGVyIHJlYWRlcikgeworCQlyZXR1cm4gbmV3IFN0cmVhbVByb3ZpZGVyKGFzc2VydE5vdE51bGwocmVhZGVyKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcihJbnB1dFN0cmVhbSBpbnB1dCwgQ2hhcnNldCBlbmNvZGluZykgeworCQlhc3NlcnROb3ROdWxsKGlucHV0KTsKKwkJYXNzZXJ0Tm90TnVsbChlbmNvZGluZyk7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFN0cmVhbVByb3ZpZGVyKGlucHV0LCBlbmNvZGluZy5uYW1lKCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBUaGUgb25seSBvbmUgdGhhdCBpcyB0aHJvd24gaXMgVW5zdXBwb3J0ZWRDaGFyYWN0ZXJFbmNvZGluZ0V4Y2VwdGlvbiwKKwkJCS8vIGFuZCB0aGF0J3MgYSBmdW5kYW1lbnRhbCBwcm9ibGVtLCBzbyBydW50aW1lIGV4Y2VwdGlvbi4KKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcihJbnB1dFN0cmVhbSBpbnB1dCkgeworCQlyZXR1cm4gcHJvdmlkZXIoaW5wdXQsIFVURjgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvdmlkZXIgcHJvdmlkZXIoRmlsZSBmaWxlLCBDaGFyc2V0IGVuY29kaW5nKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHByb3ZpZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oYXNzZXJ0Tm90TnVsbChmaWxlKSksIGFzc2VydE5vdE51bGwoZW5jb2RpbmcpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXJldHVybiBwcm92aWRlcihhc3NlcnROb3ROdWxsKGZpbGUpLCBVVEY4KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyKFBhdGggcGF0aCwgQ2hhcnNldCBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHByb3ZpZGVyKEZpbGVzLm5ld0lucHV0U3RyZWFtKGFzc2VydE5vdE51bGwocGF0aCkpLCBhc3NlcnROb3ROdWxsKGVuY29kaW5nKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBQcm92aWRlciBwcm92aWRlcihQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBwcm92aWRlcihhc3NlcnROb3ROdWxsKHBhdGgpLCBVVEY4KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFByb3ZpZGVyIHByb3ZpZGVyKFN0cmluZyBzb3VyY2UpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdQcm92aWRlcihhc3NlcnROb3ROdWxsKHNvdXJjZSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1JhbmdlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUmFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzNjRhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1JhbmdlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uLnBvczsKKworLyoqCisgKiBBIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gYSBzb3VyY2UgZmlsZSwgZnJvbSAiYmVnaW4iIHRvICJlbmQiLCBpbmNsdWRpbmcgdGhlIGNoYXJhY3RlcnMgYXQgImJlZ2luIiBhbmQgImVuZCIuCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5nZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSYW5nZSBVTktOT1dOID0gcmFuZ2UoUG9zaXRpb24uVU5LTk9XTiwgUG9zaXRpb24uVU5LTk9XTik7CisKKyAgICBwdWJsaWMgZmluYWwgUG9zaXRpb24gYmVnaW47CisgICAgcHVibGljIGZpbmFsIFBvc2l0aW9uIGVuZDsKKworICAgIHB1YmxpYyBSYW5nZShQb3NpdGlvbiBiZWdpbiwgUG9zaXRpb24gZW5kKSB7CisgICAgICAgIGlmIChiZWdpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiZWdpbiBjYW4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbmQgY2FuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuYmVnaW4gPSBiZWdpbjsKKyAgICAgICAgdGhpcy5lbmQgPSBlbmQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYW5nZSByYW5nZShQb3NpdGlvbiBiZWdpbiwgUG9zaXRpb24gZW5kKSB7CisgICAgICAgIHJldHVybiBuZXcgUmFuZ2UoYmVnaW4sIGVuZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYW5nZSByYW5nZShpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uKSB7CisgICAgICAgIHJldHVybiBuZXcgUmFuZ2UocG9zKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4pLCBwb3MoZW5kTGluZSwgZW5kQ29sdW1uKSk7CisgICAgfQorCisgICAgcHVibGljIFJhbmdlIHdpdGhCZWdpbkNvbHVtbihpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiByYW5nZShiZWdpbi53aXRoQ29sdW1uKGNvbHVtbiksIGVuZCk7CisgICAgfQorCisgICAgcHVibGljIFJhbmdlIHdpdGhCZWdpbkxpbmUoaW50IGxpbmUpIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKGJlZ2luLndpdGhMaW5lKGxpbmUpLCBlbmQpOworICAgIH0KKworICAgIHB1YmxpYyBSYW5nZSB3aXRoRW5kQ29sdW1uKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKGJlZ2luLCBlbmQud2l0aENvbHVtbihjb2x1bW4pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmFuZ2Ugd2l0aEVuZExpbmUoaW50IGxpbmUpIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKGJlZ2luLCBlbmQud2l0aExpbmUobGluZSkpOworICAgIH0KKworICAgIHB1YmxpYyBSYW5nZSB3aXRoQmVnaW4oUG9zaXRpb24gYmVnaW4pIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKGJlZ2luLCB0aGlzLmVuZCk7CisgICAgfQorCisgICAgcHVibGljIFJhbmdlIHdpdGhFbmQoUG9zaXRpb24gZW5kKSB7CisgICAgICAgIHJldHVybiByYW5nZSh0aGlzLmJlZ2luLCBlbmQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFJhbmdlIG90aGVyKSB7CisgICAgICAgIHJldHVybiBiZWdpbi5pc0JlZm9yZShvdGhlci5iZWdpbikgJiYgZW5kLmlzQWZ0ZXIob3RoZXIuZW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZShQb3NpdGlvbiBwb3NpdGlvbikgeworICAgICAgICByZXR1cm4gZW5kLmlzQmVmb3JlKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyKFBvc2l0aW9uIHBvc2l0aW9uKSB7CisgICAgICAgIHJldHVybiBiZWdpbi5pc0FmdGVyKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBSYW5nZSByYW5nZSA9IChSYW5nZSkgbzsKKworICAgICAgICByZXR1cm4gYmVnaW4uZXF1YWxzKHJhbmdlLmJlZ2luKSAmJiBlbmQuZXF1YWxzKHJhbmdlLmVuZCk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gMzEgKiBiZWdpbi5oYXNoQ29kZSgpICsgZW5kLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGJlZ2luKyItIitlbmQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9BY2Nlc3NTcGVjaWZpZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzZjg2MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworLyoqCisgKiBBY2Nlc3Mgc3BlY2lmaWVyLiBSZXByZXNlbnRzIG9uZSBvZiB0aGUgcG9zc2libGUgbGV2ZWxzIG9mCisgKiBhY2Nlc3MgcGVybWl0dGVkIGJ5IHRoZSBsYW5ndWFnZS4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqIEBzaW5jZSBKdWx5IDIwMTQKKyAqLworcHVibGljIGVudW0gQWNjZXNzU3BlY2lmaWVyIHsKKworICAgIFBVQkxJQygicHVibGljIiksCisgICAgUFJJVkFURSgicHJpdmF0ZSIpLAorICAgIFBST1RFQ1RFRCgicHJvdGVjdGVkIiksCisgICAgREVGQVVMVCgiIik7CisKKyAgICBwcml2YXRlIFN0cmluZyBjb2RlUmVwcmVzZW5hdGlvbjsKKworICAgIEFjY2Vzc1NwZWNpZmllcihTdHJpbmcgY29kZVJlcHJlc2VudGF0aW9uKSB7CisgICAgICAgIHRoaXMuY29kZVJlcHJlc2VuYXRpb24gPSBjb2RlUmVwcmVzZW50YXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2RlUmVwcmVzZW5hdGlvbigpeworICAgICAgICByZXR1cm4gdGhpcy5jb2RlUmVwcmVzZW5hdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5QnJhY2tldFBhaXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQXJyYXlCcmFja2V0UGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTBiODcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5QnJhY2tldFBhaXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIEluLCBmb3IgZXhhbXBsZSwgPGNvZGU+aW50W10gYVtdOzwvY29kZT4gdGhlcmUgYXJlIHR3byBBcnJheUJyYWNrZXRQYWlyIG9iamVjdHMsCisgKiBvbmUgZm9yIHRoZSBbXSBhZnRlciBpbnQsIG9uZSBmb3IgdGhlIFtdIGFmdGVyIGEuCisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheUJyYWNrZXRQYWlyIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8QXJyYXlCcmFja2V0UGFpcj4geworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICBwdWJsaWMgQXJyYXlCcmFja2V0UGFpcihSYW5nZSByYW5nZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICBhbm5vdGF0aW9ucyA9IGVuc3VyZU5vdE51bGwoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIEFycmF5QnJhY2tldFBhaXIgc2V0QW5ub3RhdGlvbnMoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQXJyYXlDcmVhdGlvbkxldmVsLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5Q3JlYXRpb25MZXZlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGM2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FycmF5Q3JlYXRpb25MZXZlbC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKKy8qKgorICogSW4gPGNvZGU+bmV3IGludFsxXVsyXTs8L2NvZGU+IHRoZXJlIGFyZSB0d28gQXJyYXlDcmVhdGlvbkxldmVsIG9iamVjdHMsCisgKiB0aGUgZmlyc3Qgb25lIGNvbnRhaW5zIHRoZSBleHByZXNzaW9uICIxIiwKKyAqIHRoZSBzZWNvbmQgdGhlIGV4cHJlc3Npb24gIjIiLgorICovCitwdWJsaWMgY2xhc3MgQXJyYXlDcmVhdGlvbkxldmVsIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8QXJyYXlDcmVhdGlvbkxldmVsPiB7CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGRpbWVuc2lvbjsKKyAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25MZXZlbChSYW5nZSByYW5nZSwgRXhwcmVzc2lvbiBkaW1lbnNpb24sIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0RGltZW5zaW9uKGRpbWVuc2lvbik7CisgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaW1lbnNpb24oRXhwcmVzc2lvbiBkaW1lbnNpb24pIHsKKyAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGRpbWVuc2lvbik7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RGltZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gZGltZW5zaW9uOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgYW5ub3RhdGlvbnMgPSBlbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uTGV2ZWwgc2V0QW5ub3RhdGlvbnMoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQ29tcGlsYXRpb25Vbml0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzA3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLkNsYXNzVXRpbHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5DbGFzc1V0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKKy8qKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGVudGlyZSBjb21waWxhdGlvbiB1bml0LiBFYWNoIGphdmEgZmlsZSBkZW5vdGVzIGEKKyAqIGNvbXBpbGF0aW9uIHVuaXQuCisgKiA8L3A+CisgKiBUaGUgQ29tcGlsYXRpb25Vbml0IGlzIGNvbnN0cnVjdGVkIGZvbGxvd2luZyB0aGUgc3ludGF4Ojxicj4KKyAqIAorICogPHByZT4KKyAqIHtAY29kZQorICogQ29tcGlsYXRpb25Vbml0IDo6PSAgKCB9e0BsaW5rIFBhY2thZ2VEZWNsYXJhdGlvbn17QGNvZGUgKT8KKyAqICAgICAgICAgICAgICAgICAgICAgICggfXtAbGluayBJbXBvcnREZWNsYXJhdGlvbn17QGNvZGUgKSoKKyAqICAgICAgICAgICAgICAgICAgICAgICggfXtAbGluayBUeXBlRGVjbGFyYXRpb259e0Bjb2RlICkqCisgKiB9CisgKiA8L3ByZT4KKyAqIAorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb21waWxhdGlvblVuaXQgZXh0ZW5kcyBOb2RlIHsKKworICAgIHByaXZhdGUgUGFja2FnZURlY2xhcmF0aW9uIHBha2FnZTsKKworICAgIHByaXZhdGUgTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0czsKKworICAgIHByaXZhdGUgTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzOworCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0KFBhY2thZ2VEZWNsYXJhdGlvbiBwYWthZ2UsIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMsIExpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlcykgeworICAgICAgICBzZXRQYWNrYWdlKHBha2FnZSk7CisgICAgICAgIHNldEltcG9ydHMoaW1wb3J0cyk7CisgICAgICAgIHNldFR5cGVzKHR5cGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0KFJhbmdlIHJhbmdlLCBQYWNrYWdlRGVjbGFyYXRpb24gcGFrYWdlLCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0UGFja2FnZShwYWthZ2UpOworICAgICAgICBzZXRJbXBvcnRzKGltcG9ydHMpOworICAgICAgICBzZXRUeXBlcyh0eXBlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgY29tbWVudHMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorICAgICAqIEluY2x1ZGluZyBqYXZhZG9jcywgbGluZSBjb21tZW50cyBhbmQgYmxvY2sgY29tbWVudHMgb2YgYWxsIHR5cGVzLAorICAgICAqIGlubmVyLWNsYXNzZXMgYW5kIG90aGVyIG1lbWJlcnMuPGJyPgorICAgICAqIElmIHRoZXJlIGlzIG5vIGNvbW1lbnQsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbGlzdCB3aXRoIGFsbCBjb21tZW50cyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgb3IKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHNlZSBKYXZhZG9jQ29tbWVudAorICAgICAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudAorICAgICAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxDb21tZW50PiBnZXRDb21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgaW1wb3J0cyBkZWNsYXJlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBpbXBvcnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBpbXBvcnRzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGltcG9ydAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBnZXRJbXBvcnRzKCkgeworICAgICAgICBpbXBvcnRzID0gZW5zdXJlTm90TnVsbChpbXBvcnRzKTsKKyAgICAgICAgcmV0dXJuIGltcG9ydHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC48YnI+CisgICAgICogSWYgdGhpcyBjb21waWxhdGlvbiB1bml0IGhhcyBubyBwYWNrYWdlIGRlY2xhcmF0aW9uIChkZWZhdWx0IHBhY2thZ2UpLAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIGdldFBhY2thZ2UoKSB7CisgICAgICAgIHJldHVybiBwYWthZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC48YnI+CisgICAgICogSWYgdGhlcmUgaXMgbm8gdHlwZXMgZGVjbGFyZWQsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdHlwZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gbnVsbCBpZiB0aGVyZSBpcyBubyB0eXBlCisgICAgICogQHNlZSBBbm5vdGF0aW9uRGVjbGFyYXRpb24KKyAgICAgKiBAc2VlIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorICAgICAqIEBzZWUgRW1wdHlUeXBlRGVjbGFyYXRpb24KKyAgICAgKiBAc2VlIEVudW1EZWNsYXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFR5cGVEZWNsYXJhdGlvbjw/Pj4gZ2V0VHlwZXMoKSB7CisgICAgICAgIHR5cGVzID0gZW5zdXJlTm90TnVsbCh0eXBlcyk7CisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIGNvbW1lbnRzIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tbWVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGNvbW1lbnRzCisgICAgICovCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBzZXRDb21tZW50cyhMaXN0PENvbW1lbnQ+IGNvbW1lbnRzKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiBpbXBvcnRzIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gVGhlIGxpc3QgaXMgaW5pdGlhbGx5CisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGltcG9ydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGltcG9ydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IHNldEltcG9ydHMoTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cykgeworICAgICAgICB0aGlzLmltcG9ydHMgPSBpbXBvcnRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcG9ydHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIG9yIGNsZWFyIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9ucyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICogCisgICAgICogQHBhcmFtIHBha2FnZQorICAgICAqICAgICAgICAgICAgdGhlIHBha2FnZSBkZWNsYXJhdGlvbiB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gZGVmYXVsdAorICAgICAqICAgICAgICAgICAgcGFja2FnZQorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgc2V0UGFja2FnZShQYWNrYWdlRGVjbGFyYXRpb24gcGFrYWdlKSB7CisgICAgICAgIHRoaXMucGFrYWdlID0gcGFrYWdlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnBha2FnZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlcworICAgICAqICAgICAgICAgICAgdGhlIGxpcyBvZiB0eXBlcworICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgc2V0VHlwZXMoTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzKSB7CisgICAgICAgIHRoaXMudHlwZXMgPSB0eXBlczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldHMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fQorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2V0UGFja2FnZShuZXcgUGFja2FnZURlY2xhcmF0aW9uKG5hbWUobmFtZSkpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGltcG9ydCB0byB0aGUgbGlzdCBvZiB7QGxpbmsgSW1wb3J0RGVjbGFyYXRpb259IG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdDxicj4KKyAgICAgKiBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkSW1wb3J0KFN0cmluZywgYm9vbGVhbiwgYm9vbGVhbil9IHdpdGggbmFtZSxmYWxzZSxmYWxzZQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBpbXBvcnQgbmFtZQorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIHtAbGluayBDb21waWxhdGlvblVuaXR9CisgICAgICovCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdCBhZGRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEltcG9ydChuYW1lLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbXBvcnQgdG8gdGhlIGxpc3Qgb2Yge0BsaW5rIEltcG9ydERlY2xhcmF0aW9ufSBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQ8YnI+CisgICAgICogc2hvcnRoYW5kIGZvciB7QGxpbmsgI2FkZEltcG9ydChTdHJpbmcpfSB3aXRoIGNsYXp6LmdldE5hbWUoKQorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3MgdG8gaW1wb3J0CisgICAgICogQHJldHVybiB0aGlzLCB0aGUge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFkZEltcG9ydChDbGFzczw/PiBjbGF6eikgeworICAgICAgICBpZiAoQ2xhc3NVdGlscy5pc1ByaW1pdGl2ZU9yV3JhcHBlcihjbGF6eikgfHwgY2xhenouZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UgaWYgKGNsYXp6LmlzQXJyYXkoKSAmJiAhQ2xhc3NVdGlscy5pc1ByaW1pdGl2ZU9yV3JhcHBlcihjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkpCisgICAgICAgICAgICAgICAgJiYgIWNsYXp6LmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YS5sYW5nIikpCisgICAgICAgICAgICByZXR1cm4gYWRkSW1wb3J0KGNsYXp6LmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gYWRkSW1wb3J0KGNsYXp6LmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGltcG9ydCB0byB0aGUgbGlzdCBvZiB7QGxpbmsgSW1wb3J0RGVjbGFyYXRpb259IG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdDxicj4KKyAgICAgKiA8Yj5UaGlzIG1ldGhvZCBjaGVjayBpZiBubyBpbXBvcnQgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIGxpc3Q8L2I+CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGltcG9ydCBuYW1lCisgICAgICogQHBhcmFtIGlzU3RhdGljICAgICAgaXMgaXQgYW4gImltcG9ydCBzdGF0aWMiCisgICAgICogQHBhcmFtIGlzQXN0ZXJpc2sgZG9lcyB0aGUgaW1wb3J0IGVuZCB3aXRoICIuKiIKKyAgICAgKiBAcmV0dXJuIHRoaXMsIHRoZSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fQorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQgYWRkSW1wb3J0KFN0cmluZyBuYW1lLCBib29sZWFuIGlzU3RhdGljLCBib29sZWFuIGlzQXN0ZXJpc2spIHsKKyAgICAgICAgaWYgKGdldEltcG9ydHMoKS5zdHJlYW0oKS5hbnlNYXRjaChpIC0+IGkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKG5hbWUobmFtZSksIGlzU3RhdGljLAorICAgICAgICAgICAgICAgICAgICBpc0FzdGVyaXNrKTsKKyAgICAgICAgICAgIGdldEltcG9ydHMoKS5hZGQoaW1wb3J0RGVjbGFyYXRpb24pOworICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHVibGljIGNsYXNzIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgY2xhc3MgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGFkZENsYXNzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRDbGFzcyhuYW1lLCBNb2RpZmllci5QVUJMSUMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGNsYXNzIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgY2xhc3MgbmFtZQorICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVycyAobGlrZSBNb2RpZmllci5QVUJMSUMpCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYWRkQ2xhc3MoU3RyaW5nIG5hbWUsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigKKyAgICAgICAgICAgICAgICBBcnJheXMuc3RyZWFtKG1vZGlmaWVycykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpLAorICAgICAgICAgICAgICAgIGZhbHNlLCBuYW1lKTsKKyAgICAgICAgZ2V0VHlwZXMoKS5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUodGhpcyk7CisgICAgICAgIHJldHVybiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHVibGljIGludGVyZmFjZSBjbGFzcyB0byB0aGUgdHlwZXMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGludGVyZmFjZSBuYW1lCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYWRkSW50ZXJmYWNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRJbnRlcmZhY2UobmFtZSwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaW50ZXJmYWNlIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgaW50ZXJmYWNlIG5hbWUKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgKGxpa2UgTW9kaWZpZXIuUFVCTElDKQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGFkZEludGVyZmFjZShTdHJpbmcgbmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKAorICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSksCisgICAgICAgICAgICAgICAgdHJ1ZSwgbmFtZSk7CisgICAgICAgIGdldFR5cGVzKCkuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbik7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5zZXRQYXJlbnROb2RlKHRoaXMpOworICAgICAgICByZXR1cm4gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHB1YmxpYyBlbnVtIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZW51bSBuYW1lCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBFbnVtRGVjbGFyYXRpb24gYWRkRW51bShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYWRkRW51bShuYW1lLCBNb2RpZmllci5QVUJMSUMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnVtIHRvIHRoZSB0eXBlcyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZW51bSBuYW1lCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIChsaWtlIE1vZGlmaWVyLlBVQkxJQykKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbiBhZGRFbnVtKFN0cmluZyBuYW1lLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiA9IG5ldyBFbnVtRGVjbGFyYXRpb24oQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSksIG5hbWUpOworICAgICAgICBnZXRUeXBlcygpLmFkZChlbnVtRGVjbGFyYXRpb24pOworICAgICAgICBlbnVtRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGVudW1EZWNsYXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwdWJsaWMgYW5ub3RhdGlvbiBkZWNsYXJhdGlvbiB0byB0aGUgdHlwZXMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGFubm90YXRpb24gbmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFkZEFubm90YXRpb25EZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYWRkQW5ub3RhdGlvbkRlY2xhcmF0aW9uKG5hbWUsIE1vZGlmaWVyLlBVQkxJQyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGFubm90YXRpb24gZGVjbGFyYXRpb24gdG8gdGhlIHR5cGVzIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhbm5vdGF0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgKGxpa2UgTW9kaWZpZXIuUFVCTElDKQorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFkZEFubm90YXRpb25EZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSBuZXcgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpLCBuYW1lKTsKKyAgICAgICAgZ2V0VHlwZXMoKS5hZGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUodGhpcyk7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGdldCBhIGNsYXNzIGJ5IGl0cyBuYW1lCisgICAgICogCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSAoY2FzZS1zZW5zaXRpdmUpCisgICAgICogQHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCwgdGhlIGNsYXNzIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZ2V0Q2xhc3NCeU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICByZXR1cm4gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKQorICAgICAgICAgICAgICAgICYmIHR5cGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgISgoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlKS5pc0ludGVyZmFjZSgpKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGdldCBhbiBpbnRlcmZhY2UgYnkgaXRzIG5hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSB0aGUgaW50ZXJmYWNlIG5hbWUgKGNhc2Utc2Vuc2l0aXZlKQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQsIHRoZSBpbnRlcmZhY2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBnZXRJbnRlcmZhY2VCeU5hbWUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIGdldFR5cGVzKCkuc3RyZWFtKCkuZmlsdGVyKHR5cGUgLT4gdHlwZS5nZXROYW1lKCkuZXF1YWxzKGludGVyZmFjZU5hbWUpCisgICAgICAgICAgICAgICAgJiYgdHlwZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiAoKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZSkuaXNJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBnZXQgYW4gZW51bSBieSBpdHMgbmFtZQorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnVtTmFtZSB0aGUgZW51bSBuYW1lIChjYXNlLXNlbnNpdGl2ZSkKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLCB0aGUgZW51bSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uIGdldEVudW1CeU5hbWUoU3RyaW5nIGVudW1OYW1lKSB7CisgICAgICAgIHJldHVybiAoRW51bURlY2xhcmF0aW9uKSBnZXRUeXBlcygpLnN0cmVhbSgpLmZpbHRlcih0eXBlIC0+IHR5cGUuZ2V0TmFtZSgpLmVxdWFscyhlbnVtTmFtZSkKKyAgICAgICAgICAgICAgICAmJiB0eXBlIGluc3RhbmNlb2YgRW51bURlY2xhcmF0aW9uKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGdldCBhbiBhbm5vdGF0aW9uIGJ5IGl0cyBuYW1lCisgICAgICogCisgICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBhbm5vdGF0aW9uIG5hbWUgKGNhc2Utc2Vuc2l0aXZlKQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQsIHRoZSBhbm5vdGF0aW9uIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uRGVjbGFyYXRpb24gZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworICAgICAgICByZXR1cm4gKEFubm90YXRpb25EZWNsYXJhdGlvbikgZ2V0VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIodHlwZSAtPiB0eXBlLmdldE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpCisgICAgICAgICAgICAgICAgJiYgdHlwZSBpbnN0YW5jZW9mIEFubm90YXRpb25EZWNsYXJhdGlvbikKKyAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvRXhhbXBsZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9FeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjZjJjZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKKy8qKgorICogQ3JlYXRlZCBieSBmZWRlcmljbyBvbiAwNy8wMS8xNi4KKyAqLworcHVibGljIGNsYXNzIEV4YW1wbGUgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiaW50ZXJmYWNlIEEge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBkZWZhdWx0IENvbXBhcmF0b3I8VD4gdGhlbkNvbXBhcmluZyhDb21wYXJhdG9yPD8gc3VwZXIgVD4gb3RoZXIpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwob3RoZXIpO1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgcmV0dXJuIChDb21wYXJhdG9yPFQ+ICYgU2VyaWFsaXphYmxlKSAoYzEsIGMyKSAtPiB7IC8vIHRoaXMgaXMgdGhlIGRlZmF1bHRpbmcgbGluZVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIGludCByZXMgPSBjb21wYXJlKGMxLCBjMik7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgcmV0dXJuIChyZXMgIT0gMCkgPyByZXMgOiBvdGhlci5jb21wYXJlKGMxLCBjMik7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICB9O1xuIiArCisgICAgICAgICAgICAgICAgIiAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAifSI7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShzdHJlYW0pOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0ltcG9ydERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0ltcG9ydERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYzhkMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvSW1wb3J0RGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGltcG9ydCBkZWNsYXJhdGlvbiBvciBhbiBlbXB0eSBpbXBvcnQgZGVjbGFyYXRpb24uIEltcG9ydHMgYXJlIG9wdGlvbmFsIGZvciB0aGUKKyAqIHtAbGluayBDb21waWxhdGlvblVuaXR9LgorICogPC9wPgorICogVGhlIEltcG9ydERlY2xhcmF0aW9uIGlzIGNvbnN0cnVjdGVkIGZvbGxvd2luZyB0aGUgc3ludGF4Ojxicj4KKyAqIDxwcmU+CisgKiB7QGNvZGUKKyAqIEltcG9ydERlY2xhcmF0aW9uIDo6PSAiaW1wb3J0IiAoICJzdGF0aWMiICk/IH17QGxpbmsgTmFtZUV4cHJ9e0Bjb2RlICggIi4iICIqIiApPyAiOyIKKyAqIH0KKyAqIDwvcHJlPgorICogQW4gZW5tcHR5IGltcG9ydCBkZWNsYXJhdGlvbiBpcyBzaW1wbHkgYSBzZW1pY29sb24gYW1vbmcgdGhlIGltcG9ydCBkZWNsYXJhdGlvbnMuCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydERlY2xhcmF0aW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICBwcml2YXRlIE5hbWVFeHByIG5hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXRpY187CisgICAgcHJpdmF0ZSBib29sZWFuIGFzdGVyaXNrOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5SW1wb3J0RGVjbGFyYXRpb247CisKKyAgICBwcml2YXRlIEltcG9ydERlY2xhcmF0aW9uKCkgeworICAgICAgICB0aGlzLmlzRW1wdHlJbXBvcnREZWNsYXJhdGlvbiA9IHRydWU7CisgICAgICAgIHN0YXRpY18gPSBmYWxzZTsKKyAgICAgICAgYXN0ZXJpc2sgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEltcG9ydERlY2xhcmF0aW9uKFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgdGhpcy5pc0VtcHR5SW1wb3J0RGVjbGFyYXRpb24gPSB0cnVlOworICAgICAgICBzdGF0aWNfID0gZmFsc2U7CisgICAgICAgIGFzdGVyaXNrID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IGltcG9ydCBkZWNsYXJhdGlvbiB3aXRob3V0IHNwZWNpZnlpbmcgaXRzIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0RGVjbGFyYXRpb24gY3JlYXRlRW1wdHlEZWNsYXJhdGlvbigpeworICAgICAgICByZXR1cm4gbmV3IEltcG9ydERlY2xhcmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IGltcG9ydCBkZWNsYXJhdGlvbiBzcGVjaWZ5aW5nIGl0cyBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydERlY2xhcmF0aW9uIGNyZWF0ZUVtcHR5RGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UpeworICAgICAgICByZXR1cm4gbmV3IEltcG9ydERlY2xhcmF0aW9uKHJhbmdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24oTmFtZUV4cHIgbmFtZSwgYm9vbGVhbiBpc1N0YXRpYywgYm9vbGVhbiBpc0FzdGVyaXNrKSB7CisgICAgICAgIHNldEFzdGVyaXNrKGlzQXN0ZXJpc2spOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRTdGF0aWMoaXNTdGF0aWMpOworICAgICAgICB0aGlzLmlzRW1wdHlJbXBvcnREZWNsYXJhdGlvbiA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgTmFtZUV4cHIgbmFtZSwgYm9vbGVhbiBpc1N0YXRpYywgYm9vbGVhbiBpc0FzdGVyaXNrKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0QXN0ZXJpc2soaXNBc3Rlcmlzayk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFN0YXRpYyhpc1N0YXRpYyk7CisgICAgICAgIHRoaXMuaXNFbXB0eUltcG9ydERlY2xhcmF0aW9uID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhpcyBhbiBlbXB0eSBpbXBvcnQgZGVjbGFyYXRpb24gb3IgYSBub3JtYWwgaW1wb3J0IGRlY2xhcmF0aW9uPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlJbXBvcnREZWNsYXJhdGlvbigpeworICAgICAgICByZXR1cm4gdGhpcy5pc0VtcHR5SW1wb3J0RGVjbGFyYXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGltcG9ydAorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiBpbnZva2VkIG9uIGFuIGVtcHR5IGltcG9ydCBkZWNsYXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBOYW1lRXhwciBnZXROYW1lKCkgeworICAgICAgICBpZiAoaXNFbXB0eUltcG9ydERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkVtcHR5IGltcG9ydCBkZWNsYXJhdGlvbnMgaGF2ZSBubyBuYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoZSBpbXBvcnQgZW5kcyB3aXRoICIqIi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbXBvcnQgZW5kcyB3aXRoICIqIiwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogICAgICAgICBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FzdGVyaXNrKCkgeworICAgICAgICByZXR1cm4gYXN0ZXJpc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoZSBpbXBvcnQgaXMgc3RhdGljLgorICAgICAqIAorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGltcG9ydCBpcyBzdGF0aWMsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaWYgdGhpcyBpbXBvcnQgaXMgYXN0ZXJpc2suCisgICAgICogCisgICAgICogQHBhcmFtIGFzdGVyaXNrCisgICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGltcG9ydCBpcyBhc3RlcmlzaworICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiBzZXR0aW5nIHRydWUgb24gYW4gZW1wdHkgaW1wb3J0IGRlY2xhcmF0aW9uCisgICAgICovCisgICAgcHVibGljIEltcG9ydERlY2xhcmF0aW9uIHNldEFzdGVyaXNrKGJvb2xlYW4gYXN0ZXJpc2spIHsKKyAgICAgICAgaWYgKGlzRW1wdHlJbXBvcnREZWNsYXJhdGlvbiAmJiBhc3RlcmlzaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJFbXB0eSBpbXBvcnQgY2Fubm90IGhhdmUgYXN0ZXJpc2siKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFzdGVyaXNrID0gYXN0ZXJpc2s7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgdGhpcyBpbXBvcnQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbiBpbnZva2VkIG9uIGFuIGVtcHR5IGltcG9ydCBkZWNsYXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBzZXROYW1lKE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgaWYgKGlzRW1wdHlJbXBvcnREZWNsYXJhdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJFbXB0eSBpbXBvcnQgY2Fubm90IGhhdmUgbmFtZSIpOworICAgICAgICB9CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMubmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaWYgdGhpcyBpbXBvcnQgaXMgc3RhdGljLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdGF0aWNfCisgICAgICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGltcG9ydCBpcyBzdGF0aWMKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHdoZW4gc2V0dGluZyB0cnVlIG9uIGFuIGVtcHR5IGltcG9ydCBkZWNsYXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBzZXRTdGF0aWMoYm9vbGVhbiBzdGF0aWNfKSB7CisgICAgICAgIGlmIChpc0VtcHR5SW1wb3J0RGVjbGFyYXRpb24gJiYgc3RhdGljXykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJFbXB0eSBpbXBvcnQgY2Fubm90IGJlIHN0YXRpYyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3RhdGljXyA9IHN0YXRpY187CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Nb2RpZmllci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Nb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWE1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L01vZGlmaWVyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK3B1YmxpYyBlbnVtIE1vZGlmaWVyIHsKKwlQVUJMSUMoInB1YmxpYyIpLAorICAgIFBST1RFQ1RFRCgicHJvdGVjdGVkIiksCisJUFJJVkFURSgicHJpdmF0ZSIpLAorICAgIEFCU1RSQUNUKCJhYnN0cmFjdCIpLAorCVNUQVRJQygic3RhdGljIiksCisJRklOQUwoImZpbmFsIiksCisgICAgVFJBTlNJRU5UKCJ0cmFuc2llbnQiKSwgCisgICAgVk9MQVRJTEUoInZvbGF0aWxlIiksCisJU1lOQ0hST05JWkVEKCJzeW5jaHJvbml6ZWQiKSwKKwlOQVRJVkUoIm5hdGl2ZSIpLAorCVNUUklDVEZQKCJzdHJpY3RmcCIpOworCisgICAgU3RyaW5nIGxpYjsKKworICAgIHByaXZhdGUgTW9kaWZpZXIoU3RyaW5nIGxpYikgeworICAgICAgICB0aGlzLmxpYiA9IGxpYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsaWIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExpYigpIHsKKyAgICAgICAgcmV0dXJuIGxpYjsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gdG9FbnVtU2V0KCkgeworICAgICAgICByZXR1cm4gRW51bVNldC5vZih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc1NwZWNpZmllciBnZXRBY2Nlc3NTcGVjaWZpZXIoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QVUJMSUM7CisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLlBST1RFQ1RFRCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIuUFJPVEVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5QUklWQVRFKSkgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUklWQVRFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmJhZTQzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlLmphdmEKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyBmb3IgYWxsIG5vZGVzIG9mIHRoZSBBU1QuCisgKgorICogRWFjaCBOb2RlIGNhbiBoYXZlIG9uZSBhc3NvY2lhdGVkIGNvbW1lbnQgd2hpY2ggZGVzY3JpYmUgaXQgYW5kCisgKiBhIG51bWJlciBvZiAib3JwaGFuIGNvbW1lbnRzIiB3aGljaCBpdCBjb250YWlucyBidXQgYXJlIG5vdCBzcGVjaWZpY2FsbHkKKyAqIGFzc29jaWF0ZWQgdG8gYW55IGVsZW1lbnQuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgLyoqCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBzb3J0IG5vZGVzIG9uIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvcjxOb2RlPiBOT0RFX0JZX0JFR0lOX1BPU0lUSU9OID0gKGEsIGIpIC0+IGEuZ2V0QmVnaW4oKS5jb21wYXJlVG8oYi5nZXRCZWdpbigpKTsKKworICAgIHByaXZhdGUgUmFuZ2UgcmFuZ2U7CisKKyAgICBwcml2YXRlIE5vZGUgcGFyZW50Tm9kZTsKKworICAgIHByaXZhdGUgTGlzdDxOb2RlPiBjaGlsZHJlbk5vZGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgIHByaXZhdGUgTGlzdDxDb21tZW50PiBvcnBoYW5Db21tZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgIHByaXZhdGUgSWRlbnRpdHlIYXNoTWFwPFVzZXJEYXRhS2V5PD8+LCBPYmplY3Q+IHVzZXJEYXRhID0gbnVsbDsKKworICAgIHByaXZhdGUgQ29tbWVudCBjb21tZW50OworCisgICAgcHVibGljIE5vZGUoKSB7CisgICAgICAgIHRoaXMoUmFuZ2UuVU5LTk9XTik7CisgICAgfQorCisgICAgcHVibGljIE5vZGUoUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdCBtZXRob2QgZm9yIHZpc2l0b3Igc3VwcG9ydC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gPFI+CisgICAgICogICAgICAgICAgICB0aGUgdHlwZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yCisgICAgICogQHBhcmFtIDxBPgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgdmlzaXRvcgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgdmlzaXRvciBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBhcmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIHZpc2l0b3IKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIHZpc2l0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZyk7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgbWV0aG9kIGZvciB2aXNpdG9yIHN1cHBvcnQuCisgICAgICogCisgICAgICogQHBhcmFtIDxBPgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgdGhlIGFyZ3VtZW50IHBhc3NlZCBmb3IgdGhlIHZpc2l0b3IKKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2l0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcGFyYW0gYXJnCisgICAgICogICAgICAgICAgICBhbnkgdmFsdWUgcmVsZXZhbnQgZm9yIHRoZSB2aXNpdG9yCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZyk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHJldHVybiBjb21tZW50IHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIGZpbmFsIENvbW1lbnQgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJlZ2luIHBvc2l0aW9uIG9mIHRoaXMgbm9kZSBpbiB0aGUgc291cmNlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIFBvc2l0aW9uIGdldEJlZ2luKCkgeworICAgICAgICByZXR1cm4gcmFuZ2UuYmVnaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGlzIG5vZGUgaW4gdGhlIHNvdXJjZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBQb3NpdGlvbiBnZXRFbmQoKSB7CisgICAgICAgIHJldHVybiByYW5nZS5lbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmVnaW4gcG9zaXRpb24gb2YgdGhpcyBub2RlIGluIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZSBzZXRCZWdpbihQb3NpdGlvbiBiZWdpbikgeworICAgICAgICByYW5nZSA9IHJhbmdlLndpdGhCZWdpbihiZWdpbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGlzIG5vZGUgaW4gdGhlIHNvdXJjZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIHNldEVuZChQb3NpdGlvbiBlbmQpIHsKKyAgICAgICAgcmFuZ2UgPSByYW5nZS53aXRoRW5kKGVuZCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBjb2RlIHRoYXQgdGhpcyBub2RlIGNvdmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmFuZ2UgZ2V0UmFuZ2UoKSB7CisgICAgICAgIHJldHVybiByYW5nZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBjb2RlIHRoYXQgdGhpcyBub2RlIGNvdmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZSBzZXRSYW5nZShSYW5nZSByYW5nZSkgeworICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIGZpbmFsIE5vZGUgc2V0Q29tbWVudChmaW5hbCBDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiAodGhpcyBpbnN0YW5jZW9mIENvbW1lbnQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQSBjb21tZW50IGNhbiBub3QgYmUgY29tbWVudGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuY29tbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1lbnQuc2V0Q29tbWVudGVkTm9kZShudWxsKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OworICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1lbnQuc2V0Q29tbWVudGVkTm9kZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgTm9kZSBzZXRMaW5lQ29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICByZXR1cm4gc2V0Q29tbWVudChuZXcgTGluZUNvbW1lbnQoY29tbWVudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhpcyBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIGZpbmFsIE5vZGUgc2V0QmxvY2tDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHJldHVybiBzZXRDb21tZW50KG5ldyBCbG9ja0NvbW1lbnQoY29tbWVudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgRHVtcFZpc2l0b3IgdmlzaXRvciA9IG5ldyBEdW1wVmlzaXRvcigpOworICAgICAgICBhY2NlcHQodmlzaXRvciwgbnVsbCk7CisgICAgICAgIHJldHVybiB2aXNpdG9yLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSB7CisgICAgICAgIGZpbmFsIER1bXBWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRHVtcFZpc2l0b3IoZmFsc2UpOworICAgICAgICBhY2NlcHQodmlzaXRvciwgbnVsbCk7CisgICAgICAgIHJldHVybiB2aXNpdG9yLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgTm9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRXF1YWxzVmlzaXRvci5lcXVhbHModGhpcywgKE5vZGUpIG9iaik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5vZGUgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnROb2RlOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8VD4gVCBnZXRQYXJlbnROb2RlT2ZUeXBlKENsYXNzPFQ+IGNsYXNzVHlwZSkgeworICAgICAgICBOb2RlIHBhcmVudCA9IHBhcmVudE5vZGU7CisgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNsYXNzVHlwZS5pc0Fzc2lnbmFibGVGcm9tKHBhcmVudC5nZXRDbGFzcygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFQpIHBhcmVudDsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PE5vZGU+IGdldENoaWxkcmVuTm9kZXMoKSB7CisgICAgICAgIHJldHVybiBjaGlsZHJlbk5vZGVzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE5vZGUgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlLmNvbnRhaW5zKG90aGVyLnJhbmdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPcnBoYW5Db21tZW50KENvbW1lbnQgY29tbWVudCkgeworICAgICAgICBvcnBoYW5Db21tZW50cy5hZGQoY29tbWVudCk7CisgICAgICAgIGNvbW1lbnQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbGlzdCBvZiBDb21tZW50IHdoaWNoIGFyZSBpbnNpZGUgdGhlIG5vZGUgYW5kIGFyZSBub3QgYXNzb2NpYXRlZAorICAgICAqIHdpdGggYW55IG1lYW5pbmdmdWwgQVNUIE5vZGUuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgY29tbWVudHMgYXQgdGhlIGVuZCBvZiBtZXRob2RzIChpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHBhcmVudGhlc2lzKQorICAgICAqIG9yIGF0IHRoZSBlbmQgb2YgQ29tcGlsYXRpb25Vbml0IGFyZSBvcnBoYW4gY29tbWVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIG1vcmUgdGhhbiBvbmUgY29tbWVudCBwcmVjZWVkcyBhIHN0YXRlbWVudCwgdGhlIG9uZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgaXQKKyAgICAgKiBpdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXRlbWVudHMsIHdoaWxlIHRoZSBvdGhlcnMgYXJlIG9ycGhhbnMuCisgICAgICogCisgICAgICogQHJldHVybiBhbGwgY29tbWVudHMgdGhhdCBjYW5ub3QgYmUgYXR0cmlidXRlZCB0byBhIGNvbmNlcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxDb21tZW50PiBnZXRPcnBoYW5Db21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIG9ycGhhbkNvbW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGxpc3Qgb2YgQ29tbWVudCB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoZSBOb2RlIGVpdGhlciBiZWNhdXNlCisgICAgICogdGhleSBhcmUgcHJvcGVybHkgYXNzb2NpYXRlZCB0byBvbmUgb2YgaXRzIGNoaWxkcmVuIG9yIGJlY2F1c2UgdGhleSBhcmUgZmxvYXRpbmcKKyAgICAgKiBhcm91bmQgaW5zaWRlIHRoZSBOb2RlCisgICAgICogCisgICAgICogQHJldHVybiBhbGwgQ29tbWVudHMgd2l0aGluIHRoZSBub2RlIGFzIGEgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENvbW1lbnQ+IGdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkgeworICAgICAgICBMaXN0PENvbW1lbnQ+IGNvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBjb21tZW50cy5hZGRBbGwoZ2V0T3JwaGFuQ29tbWVudHMoKSk7CisKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogZ2V0Q2hpbGRyZW5Ob2RlcygpKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb21tZW50cy5hZGQoY2hpbGQuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1lbnRzLmFkZEFsbChjaGlsZC5nZXRBbGxDb250YWluZWRDb21tZW50cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYSBuZXcgcGFyZW50IHRvIHRoaXMgbm9kZSwgcmVtb3ZpbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSBwcmV2aW91cyBwYXJlbnQsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIG5vZGUgdG8gYmUgc2V0IGFzIHBhcmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKSB7CisgICAgICAgIC8vIHJlbW92ZSBmcm9tIG9sZCBwYXJlbnQsIGlmIGFueQorICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5jaGlsZHJlbk5vZGVzLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOworICAgICAgICAvLyBhZGQgdG8gbmV3IHBhcmVudCwgaWYgYW55CisgICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmNoaWxkcmVuTm9kZXMuYWRkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QXNQYXJlbnROb2RlT2YoTGlzdDw/IGV4dGVuZHMgTm9kZT4gY2hpbGROb2RlcykgeworICAgICAgICBpZiAoY2hpbGROb2RlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgY3VycmVudCA6IGNoaWxkTm9kZXMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50LnNldFBhcmVudE5vZGUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBc1BhcmVudE5vZGVPZihOb2RlIGNoaWxkTm9kZSkgeworICAgICAgICBpZiAoY2hpbGROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoaWxkTm9kZS5zZXRQYXJlbnROb2RlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTT0xVVEVfQkVHSU5fTElORSA9IC0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU09MVVRFX0VORF9MSU5FID0gLTI7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Bvc2l0aW9uZWRBZnRlcihQb3NpdGlvbiBwb3NpdGlvbikgeworICAgICAgICByZXR1cm4gcmFuZ2UuaXNBZnRlcihwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQb3NpdGlvbmVkQmVmb3JlKFBvc2l0aW9uIHBvc2l0aW9uKSB7CisgICAgICAgIHJldHVybiByYW5nZS5pc0JlZm9yZShwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChDbGFzczw/PiBjbGF6eikgeworICAgICAgICBDb21waWxhdGlvblVuaXQgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGVPZlR5cGUoQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsKKyAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRJbXBvcnQoY2xhenopOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlbHkgZmluZHMgYWxsIG5vZGVzIG9mIGEgY2VydGFpbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSB0eXBlIG9mIG5vZGUgdG8gZmluZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPE4gZXh0ZW5kcyBOb2RlPiBMaXN0PE4+IGdldE5vZGVzQnlUeXBlKENsYXNzPE4+IGNsYXp6KSB7CisgICAgICAgIExpc3Q8Tj4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogZ2V0Q2hpbGRyZW5Ob2RlcygpKSB7CisgICAgICAgICAgICBpZiAoY2xhenouaXNJbnN0YW5jZShjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICBub2Rlcy5hZGQoY2xhenouY2FzdChjaGlsZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZXMuYWRkQWxsKGNoaWxkLmdldE5vZGVzQnlUeXBlKGNsYXp6KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdXNlciBkYXRhIGZvciB0aGlzIGNvbXBvbmVudCB1c2luZyB0aGUgZ2l2ZW4ga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIDxNPgorICAgICAqICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVzZXIgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIFRoZSBrZXkgZm9yIHRoZSBkYXRhCisgICAgICogQHJldHVybiBUaGUgdXNlciBkYXRhIG9yIG51bGwgb2Ygbm8gdXNlciBkYXRhIHdhcyBmb3VuZCBmb3IgdGhlIGdpdmVuIGtleQorICAgICAqIEBzZWUgVXNlckRhdGFLZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgPE0+IE0gZ2V0VXNlckRhdGEoZmluYWwgVXNlckRhdGFLZXk8TT4ga2V5KSB7CisgICAgICAgIGlmICh1c2VyRGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE0pIHVzZXJEYXRhLmdldChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXNlciBkYXRhIGZvciB0aGlzIGNvbXBvbmVudCB1c2luZyB0aGUgZ2l2ZW4ga2V5LgorICAgICAqIEZvciBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBVc2VyRGF0YUtleSwgc2VlIHtAbGluayBVc2VyRGF0YUtleX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPE0+CisgICAgICogICAgICAgICAgICBUaGUgdHlwZSBvZiB1c2VyIGRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIFRoZSBzaW5nbGV0b24ga2V5IGZvciB0aGUgdXNlciBkYXRhCisgICAgICogQHBhcmFtIG9iamVjdAorICAgICAqICAgICAgICAgICAgVGhlIHVzZXIgZGF0YSBvYmplY3QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqIEBzZWUgVXNlckRhdGFLZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgPE0+IHZvaWQgc2V0VXNlckRhdGEoVXNlckRhdGFLZXk8TT4ga2V5LCBNIG9iamVjdCkgeworICAgICAgICBpZiAodXNlckRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlckRhdGEgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKKyAgICAgICAgfQorICAgICAgICB1c2VyRGF0YS5wdXQoa2V5LCBvYmplY3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFja2FnZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDxwPgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uLiBUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpcworICogb3B0aW9uYWwgZm9yIHRoZSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fS4KKyAqIDwvcD4KKyAqIFRoZSBQYWNrYWdlRGVjbGFyYXRpb24gaXMgY29uc3RydWN0ZWQgZm9sbG93aW5nIHRoZSBzeW50YXg6PGJyPgorICogPHByZT4KKyAqIHtAY29kZQorICogUGFja2FnZURlY2xhcmF0aW9uIDo6PSAoIH17QGxpbmsgQW5ub3RhdGlvbkV4cHJ9e0Bjb2RlICkqICJwYWNrYWdlIiB9e0BsaW5rIE5hbWVFeHByfXtAY29kZSApICI7IgorICogfQorICogPC9wcmU+CisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhY2thZ2VEZWNsYXJhdGlvbiBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBOb2RlV2l0aEFubm90YXRpb25zPFBhY2thZ2VEZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKworICAgIHByaXZhdGUgTmFtZUV4cHIgbmFtZTsKKworICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbihOYW1lRXhwciBuYW1lKSB7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbihMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTmFtZUV4cHIgbmFtZSkgeworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBhbm5vdGF0aW9ucyBkZWNsYXJlZCBiZWZvcmUgdGhlIHBhY2thZ2UKKyAgICAgKiBkZWNsYXJhdGlvbi4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgYW5ub3RhdGlvbnMgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIGFubm90YXRpb25zID0gVXRpbHMuZW5zdXJlTm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZXhwcmVzc2lvbiBvZiB0aGUgcGFja2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZUV4cHIgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGZ1bGwgcGFja2FnZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFubm90YXRpb25zCisgICAgICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbnMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbiBzZXRBbm5vdGF0aW9ucyhMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgcGFja2FnZSBkZWNsYXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbiBzZXROYW1lKE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1VzZXJEYXRhS2V5LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1VzZXJEYXRhS2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3Y2FhMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvVXNlckRhdGFLZXkuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Q7CisKKy8qKgorICogQSBrZXkgdG8gYSBwaWVjZSBvZiB1c2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIE5vZGV9IGF0IHJ1bnRpbWUuCisgKiBUaGUga2V5IGNvbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKKyAqIHR5cGUgb2YgYW55IHVzZXIgZGF0YSB2YWx1ZSBmb3IgdGhlIGtleSB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQuIFVzZXJEYXRhS2V5IGlzIGFic3RyYWN0IGluIG9yZGVyIHRvCisgKiBmb3JjZSB0aGUgY3JlYXRpb24gb2YgYSBzdWJ0eXBlLiBUaGF0IHN1YnR5cGUgaXMgdXNlZCB0byB0ZXN0IGZvciBpZGVudGl0eSB3aGVuIGxvb2tpbmcgZm9yIHRoZQorICogdXNlciBkYXRhIGJlY2F1c2UgYWN0dWFsIG9iamVjdCBpZGVudGl0eSB3b3VsZCBzdWZmZXIgZnJvbSBwcm9ibGVtcyB1bmRlciBzZXJpYWxpemF0aW9uLgorICogU28sIHRoZSBjb3JyZWN0IHdheSB0byBkZWNsYXJlIGEgVXNlckRhdGFLZXkgaXMgbGlrZSB0aGlzOgorICoKKyAqIDxwcmU+CisgKiA8Y29kZT4KKyAqIHB1YmxpYyBzdGF0aWMgZmluYWwgVXNlckRhdGFLZXkmbHQ7Um9sZSZndDsgUk9MRSA9IG5ldyBVc2VyRGF0YUtleSZsdDtSb2xlJmd0OygpIHsgfTsKKyAqIDwvY29kZT4KKyAqIDwvcHJlPgorICoKKyAqIFRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3dpY2tldC5hcGFjaGUub3JnLyI+V2lja2V0IHByb2plY3Q8L2E+LgorICoKKyAqIEBwYXJhbSA8VD4KKyAqICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIG9iamVjdCB3aGljaCBpcyBzdG9yZWQKKyAqCisgKiBAc2VlIE5vZGUjZ2V0VXNlckRhdGEoVXNlckRhdGFLZXkpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBVc2VyRGF0YUtleTxUPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDg0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uPEFubm90YXRpb25EZWNsYXJhdGlvbj4geworCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobW9kaWZpZXJzLCBuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICBzdXBlcihyYW5nZSwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI5ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbjxBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+CisgICAgICAgIGltcGxlbWVudHMgTm9kZVdpdGhKYXZhRG9jPEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbj4sIE5vZGVXaXRoTmFtZTxBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24+LAorICAgICAgICBOb2RlV2l0aFR5cGU8QW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhNb2RpZmllcnM8QW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uPiB7CisKKyAgICBwcml2YXRlIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBUeXBlIHR5cGUsIFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMpOworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RGVmYXVsdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgbWVtYmVyIGRlY2xhcmF0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgTW9kaWZpZXIKKyAgICAgKiBAcmV0dXJuIG1vZGlmaWVycworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHNldERlZmF1bHRWYWx1ZShFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBzZXRNb2RpZmllcnMoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBzZXRUeXBlKFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEphdmFkb2NDb21tZW50IGdldEphdmFEb2MoKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgaW5zdGFuY2VvZiBKYXZhZG9jQ29tbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIChKYXZhZG9jQ29tbWVudCkgZ2V0Q29tbWVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Cb2R5RGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Cb2R5RGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU1ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0JvZHlEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb2R5RGVjbGFyYXRpb248VD4gZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhBbm5vdGF0aW9uczxUPiB7CisKKyAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHVibGljIEJvZHlEZWNsYXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9keURlY2xhcmF0aW9uKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgCXNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9keURlY2xhcmF0aW9uKFJhbmdlIHJhbmdlLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgCXNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIGFubm90YXRpb25zID0gVXRpbHMuZW5zdXJlTm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhIG51bGwgdmFsdWUgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgYW4gZW1wdHkgbGlzdC4gVGhpcyBiZWhhdmlvciBjb3VsZCBjaGFuZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZ1dHVyZSwgc28gcGxlYXNlIGF2b2lkIHBhc3NpbmcgbnVsbAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBUIHNldEFubm90YXRpb25zKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMGQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFeHRlbmRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSW1wbGVtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4KKyAgICAgICAgaW1wbGVtZW50cyBOb2RlV2l0aEltcGxlbWVudHM8Q2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uPiwgTm9kZVdpdGhFeHRlbmRzPENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBib29sZWFuIGludGVyZmFjZV87CisKKyAgICBwcml2YXRlIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CisKKyAgICAvLyBDYW4gY29udGFpbiBtb3JlIHRoYW4gb25lIGl0ZW0gaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UKKyAgICBwcml2YXRlIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dGVuZHNMaXN0OworCisgICAgcHJpdmF0ZSBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdDsKKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIGZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihtb2RpZmllcnMsIG5hbWUpOworICAgICAgICBzZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIGZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRlbmRzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgICAgIHNldEludGVyZmFjZShpc0ludGVyZmFjZSk7CisgICAgICAgIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0RXh0ZW5kcyhleHRlbmRzTGlzdCk7CisgICAgICAgIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UsIGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzKSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBuYW1lLCBtZW1iZXJzKTsKKyAgICAgICAgc2V0SW50ZXJmYWNlKGlzSW50ZXJmYWNlKTsKKyAgICAgICAgc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworICAgICAgICBzZXRFeHRlbmRzKGV4dGVuZHNMaXN0KTsKKyAgICAgICAgc2V0SW1wbGVtZW50cyhpbXBsZW1lbnRzTGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBnZXRFeHRlbmRzKCkgeworICAgICAgICBleHRlbmRzTGlzdCA9IGVuc3VyZU5vdE51bGwoZXh0ZW5kc0xpc3QpOworICAgICAgICByZXR1cm4gZXh0ZW5kc0xpc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldEltcGxlbWVudHMoKSB7CisgICAgICAgIGltcGxlbWVudHNMaXN0ID0gZW5zdXJlTm90TnVsbChpbXBsZW1lbnRzTGlzdCk7CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRzTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUeXBlUGFyYW1ldGVyPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgdHlwZVBhcmFtZXRlcnMgPSBlbnN1cmVOb3ROdWxsKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgeworICAgICAgICByZXR1cm4gaW50ZXJmYWNlXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXh0ZW5kc0xpc3QgYSBudWxsIHZhbHVlIGlzIGN1cnJlbnRseSB0cmVhdGVkIGFzIGFuIGVtcHR5IGxpc3QuIFRoaXMgYmVoYXZpb3IgY291bGQgY2hhbmdlCisgICAgICogICAgICAgICAgICBpbiB0aGUgZnV0dXJlLCBzbyBwbGVhc2UgYXZvaWQgcGFzc2luZyBudWxsCisgICAgICogQHJldHVybgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gc2V0RXh0ZW5kcyhmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRlbmRzTGlzdCkgeworICAgICAgICB0aGlzLmV4dGVuZHNMaXN0ID0gZXh0ZW5kc0xpc3Q7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXh0ZW5kc0xpc3QpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50c0xpc3QgYSBudWxsIHZhbHVlIGlzIGN1cnJlbnRseSB0cmVhdGVkIGFzIGFuIGVtcHR5IGxpc3QuIFRoaXMgYmVoYXZpb3IgY291bGQgY2hhbmdlCisgICAgICogICAgICAgICAgICBpbiB0aGUgZnV0dXJlLCBzbyBwbGVhc2UgYXZvaWQgcGFzc2luZyBudWxsCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBzZXRJbXBsZW1lbnRzKGZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0KSB7CisgICAgICAgIHRoaXMuaW1wbGVtZW50c0xpc3QgPSBpbXBsZW1lbnRzTGlzdDsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbXBsZW1lbnRzTGlzdCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gc2V0SW50ZXJmYWNlKGZpbmFsIGJvb2xlYW4gaW50ZXJmYWNlXykgeworICAgICAgICB0aGlzLmludGVyZmFjZV8gPSBpbnRlcmZhY2VfOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlUGFyYW1ldGVycyBhIG51bGwgdmFsdWUgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgYW4gZW1wdHkgbGlzdC4gVGhpcyBiZWhhdmlvciBjb3VsZCBjaGFuZ2UKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBmdXR1cmUsIHNvIHBsZWFzZSBhdm9pZCBwYXNzaW5nIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHNldFR5cGVQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAKKworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTljZDJhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4KKyAgICAgICAgaW1wbGVtZW50cyBOb2RlV2l0aEphdmFEb2M8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4sIE5vZGVXaXRoRGVjbGFyYXRpb24sCisgICAgICAgIE5vZGVXaXRoTmFtZTxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhNb2RpZmllcnM8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4sCisgICAgICAgIE5vZGVXaXRoUGFyYW1ldGVyczxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiwgTm9kZVdpdGhUaHJvd2FibGU8Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4sCisgICAgICAgIE5vZGVXaXRoQmxvY2tTdG10PENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IHsKKworICAgIHByaXZhdGUgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzID0gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzOworCisgICAgcHJpdmF0ZSBOYW1lRXhwciBuYW1lOworCisgICAgcHJpdmF0ZSBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVyczsKKworICAgIHByaXZhdGUgTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd3NfOworCisgICAgcHJpdmF0ZSBCbG9ja1N0bXQgYm9keTsKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd3NfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU3RtdCBibG9jaykgeworICAgICAgICBzdXBlcihhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIHNldFRocm93cyh0aHJvd3NfKTsKKyAgICAgICAgc2V0Qm9keShibG9jayk7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIExpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXywgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIHNldFRocm93cyh0aHJvd3NfKTsKKyAgICAgICAgc2V0Qm9keShibG9jayk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgbWVtYmVyIGRlY2xhcmF0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgTW9kaWZpZXIKKyAgICAgKiBAcmV0dXJuIG1vZGlmaWVycworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lRXhwciBnZXROYW1lRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBwYXJhbWV0ZXJzID0gZW5zdXJlTm90TnVsbChwYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVmZXJlbmNlVHlwZT4gZ2V0VGhyb3dzKCkgeworICAgICAgICB0aHJvd3NfID0gZW5zdXJlTm90TnVsbCh0aHJvd3NfKTsKKyAgICAgICAgcmV0dXJuIHRocm93c187CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHR5cGVQYXJhbWV0ZXJzID0gZW5zdXJlTm90TnVsbCh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBzZXRNb2RpZmllcnMoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldE5hbWVFeHByKG5ldyBOYW1lRXhwcihuYW1lKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHNldE5hbWVFeHByKE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gc2V0UGFyYW1ldGVycyhMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycykgeworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnBhcmFtZXRlcnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBzZXRUaHJvd3MoTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd3NfKSB7CisgICAgICAgIHRoaXMudGhyb3dzXyA9IHRocm93c187CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudGhyb3dzXyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHNldFR5cGVQYXJhbWV0ZXJzKExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlY2xhcmF0aW9uIHJldHVybmVkIGhhcyB0aGlzIHNjaGVtYToKKyAgICAgKgorICAgICAqIFthY2Nlc3NTcGVjaWZpZXJdIGNsYXNzTmFtZSAoW3BhcmFtVHlwZSBbcGFyYW1OYW1lXV0pCisgICAgICogW3Rocm93cyBleGNlcHRpb25zTGlzdF0KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGluZ1BhcmFtZXRlck5hbWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChpbmNsdWRpbmdNb2RpZmllcnMpIHsKKyAgICAgICAgICAgIEFjY2Vzc1NwZWNpZmllciBhY2Nlc3NTcGVjaWZpZXIgPSBNb2RpZmllci5nZXRBY2Nlc3NTcGVjaWZpZXIoZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKGFjY2Vzc1NwZWNpZmllci5nZXRDb2RlUmVwcmVzZW5hdGlvbigpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIgPT0gQWNjZXNzU3BlY2lmaWVyLkRFRkFVTFQgPyAiIiA6ICIgIik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiKCIpOworICAgICAgICBib29sZWFuIGZpcnN0UGFyYW0gPSB0cnVlOworICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IGdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0UGFyYW0pIHsKKyAgICAgICAgICAgICAgICBmaXJzdFBhcmFtID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmNsdWRpbmdQYXJhbWV0ZXJOYW1lKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFyYW0uZ2V0RWxlbWVudFR5cGUoKS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgaWYgKGluY2x1ZGluZ1Rocm93cykgeworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFRocm93ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlVHlwZSB0aHIgOiBnZXRUaHJvd3MoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdFRocm93KSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0VGhyb3cgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgdGhyb3dzICIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRoci50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzKSB7CisgICAgICAgIHJldHVybiBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGluY2x1ZGluZ01vZGlmaWVycywgaW5jbHVkaW5nVGhyb3dzLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKHRydWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBnZXRKYXZhRG9jKCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpIGluc3RhbmNlb2YgSmF2YWRvY0NvbW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiAoSmF2YWRvY0NvbW1lbnQpIGdldENvbW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmxvY2tTdG10IGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiBib2R5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHNldEJvZHkoQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYm9keSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbXB0eU1lbWJlckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlNZW1iZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmViN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlNZW1iZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSmF2YURvYzsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbjxFbXB0eU1lbWJlckRlY2xhcmF0aW9uPgorICAgICAgICBpbXBsZW1lbnRzIE5vZGVXaXRoSmF2YURvYzxFbXB0eU1lbWJlckRlY2xhcmF0aW9uPiB7CisKKyAgICBwdWJsaWMgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEVtcHR5TWVtYmVyRGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UsIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgaWYoZ2V0Q29tbWVudCgpIGluc3RhbmNlb2YgSmF2YWRvY0NvbW1lbnQpeworICAgICAgICAgICAgcmV0dXJuIChKYXZhZG9jQ29tbWVudCkgZ2V0Q29tbWVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbXB0eVR5cGVEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VtcHR5VHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3NzRkZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbXB0eVR5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5VHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uPEVtcHR5VHlwZURlY2xhcmF0aW9uPiB7CisKKyAgICBwdWJsaWMgRW1wdHlUeXBlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHN1cGVyKG51bGwsIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEVtcHR5VHlwZURlY2xhcmF0aW9uKFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBudWxsLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIG51bGwsIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmY2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bUNvbnN0YW50RGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEphdmFEb2M7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uPEVudW1Db25zdGFudERlY2xhcmF0aW9uPgorICAgICAgICBpbXBsZW1lbnRzIE5vZGVXaXRoSmF2YURvYzxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4sIE5vZGVXaXRoTmFtZTxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBhcmdzOworCisgICAgcHJpdmF0ZSBMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gY2xhc3NCb2R5OworCisgICAgcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU3RyaW5nIG5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGNsYXNzQm9keSkgeworICAgICAgICBzdXBlcihhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEFyZ3MoYXJncyk7CisgICAgICAgIHNldENsYXNzQm9keShjbGFzc0JvZHkpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFN0cmluZyBuYW1lLCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBjbGFzc0JvZHkpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UsIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0QXJncyhhcmdzKTsKKyAgICAgICAgc2V0Q2xhc3NCb2R5KGNsYXNzQm9keSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEV4cHJlc3Npb24+IGdldEFyZ3MoKSB7CisgICAgICAgIGFyZ3MgPSBlbnN1cmVOb3ROdWxsKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGdldENsYXNzQm9keSgpIHsKKyAgICAgICAgY2xhc3NCb2R5ID0gZW5zdXJlTm90TnVsbChjbGFzc0JvZHkpOworICAgICAgICByZXR1cm4gY2xhc3NCb2R5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uIHNldEFyZ3MoTGlzdDxFeHByZXNzaW9uPiBhcmdzKSB7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYXJncyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBzZXRDbGFzc0JvZHkoTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGNsYXNzQm9keSkgeworICAgICAgICB0aGlzLmNsYXNzQm9keSA9IGNsYXNzQm9keTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jbGFzc0JvZHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgaWYoZ2V0Q29tbWVudCgpIGluc3RhbmNlb2YgSmF2YWRvY0NvbW1lbnQpeworICAgICAgICAgICAgcmV0dXJuIChKYXZhZG9jQ29tbWVudCkgZ2V0Q29tbWVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBhZGRBcmd1bWVudChTdHJpbmcgdmFsdWVFeHByKSB7CisgICAgICAgIGdldEFyZ3MoKS5hZGQobmFtZSh2YWx1ZUV4cHIpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1EZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1EZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDMwODkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoSW1wbGVtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudW1EZWNsYXJhdGlvbiBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbjxFbnVtRGVjbGFyYXRpb24+CisgICAgICAgIGltcGxlbWVudHMgTm9kZVdpdGhJbXBsZW1lbnRzPEVudW1EZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdDsKKworICAgIHByaXZhdGUgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllczsKKworICAgIHB1YmxpYyBFbnVtRGVjbGFyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG1vZGlmaWVycywgbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIEVudW1EZWNsYXJhdGlvbihFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0LCBMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgICAgIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpOworICAgICAgICBzZXRFbnRyaWVzKGVudHJpZXMpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtRGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QsIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycykgeworICAgICAgICBzdXBlcihyYW5nZSwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgICAgIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpOworICAgICAgICBzZXRFbnRyaWVzKGVudHJpZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBnZXRFbnRyaWVzKCkgeworICAgICAgICBlbnRyaWVzID0gZW5zdXJlTm90TnVsbChlbnRyaWVzKTsKKyAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldEltcGxlbWVudHMoKSB7CisgICAgICAgIGltcGxlbWVudHNMaXN0ID0gZW5zdXJlTm90TnVsbChpbXBsZW1lbnRzTGlzdCk7CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRzTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uIHNldEVudHJpZXMoTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcykgeworICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVudHJpZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uIHNldEltcGxlbWVudHMoTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QpIHsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRzTGlzdCA9IGltcGxlbWVudHNMaXN0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcGxlbWVudHNMaXN0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBhZGRFbnVtQ29uc3RhbnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50ID0gbmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uKG5hbWUpOworICAgICAgICBnZXRFbnRyaWVzKCkuYWRkKGVudW1Db25zdGFudCk7CisgICAgICAgIGVudW1Db25zdGFudC5zZXRQYXJlbnROb2RlKHRoaXMpOworICAgICAgICByZXR1cm4gZW51bUNvbnN0YW50OworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA0YTUyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwci5PcGVyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllci5QVUJMSUM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZS5WT0lEX1RZUEU7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWVsZERlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uPEZpZWxkRGVjbGFyYXRpb24+IGltcGxlbWVudHMKKyAgICAgICAgTm9kZVdpdGhKYXZhRG9jPEZpZWxkRGVjbGFyYXRpb24+LAorICAgICAgICBOb2RlV2l0aEVsZW1lbnRUeXBlPEZpZWxkRGVjbGFyYXRpb24+LAorICAgICAgICBOb2RlV2l0aE1vZGlmaWVyczxGaWVsZERlY2xhcmF0aW9uPiwKKyAgICAgICAgTm9kZVdpdGhWYXJpYWJsZXM8RmllbGREZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMgPSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyk7CisKKyAgICBwcml2YXRlIFR5cGUgZWxlbWVudFR5cGU7CisKKyAgICBwcml2YXRlIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXM7CisKKyAgICBwcml2YXRlIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlOworCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBUeXBlIGVsZW1lbnRUeXBlLCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGUpIHsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IGF1eCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBhdXguYWRkKHZhcmlhYmxlKTsKKyAgICAgICAgc2V0VmFyaWFibGVzKGF1eCk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBUeXBlIGVsZW1lbnRUeXBlLCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7CisgICAgICAgIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFR5cGUgZWxlbWVudFR5cGUsIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMpOworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgICAgICBzZXRWYXJpYWJsZXModmFyaWFibGVzKTsKKyAgICAgICAgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFR5cGUgZWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcywgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UsIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7CisgICAgICAgIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICBtb2RpZmllcnMKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdHlwZQorICAgICAqIEBwYXJhbSB2YXJpYWJsZQorICAgICAqICAgICAgICAgICAgdmFyaWFibGUgZGVjbGFyYXRvcgorICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlY2xhcmF0aW9uIGNyZWF0ZShFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGUpIHsKKyAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB2YXJpYWJsZXMuYWRkKHZhcmlhYmxlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZERlY2xhcmF0aW9uKG1vZGlmaWVycywgdHlwZSwgdmFyaWFibGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGlmaWVycworICAgICAqICAgICAgICAgICAgbW9kaWZpZXJzCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHR5cGUKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgZmllbGQgbmFtZQorICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWVsZERlY2xhcmF0aW9uIGNyZWF0ZShFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQobmFtZSk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoaWQpOworICAgICAgICByZXR1cm4gY3JlYXRlKG1vZGlmaWVycywgdHlwZSwgdmFyaWFibGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIG1lbWJlciBkZWNsYXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gZ2V0VmFyaWFibGVzKCkgeworICAgICAgICB2YXJpYWJsZXMgPSBlbnN1cmVOb3ROdWxsKHZhcmlhYmxlcyk7CisgICAgICAgIHJldHVybiB2YXJpYWJsZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gc2V0TW9kaWZpZXJzKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycykgeworICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gc2V0VmFyaWFibGVzKExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFyaWFibGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEphdmFkb2NDb21tZW50IGdldEphdmFEb2MoKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgaW5zdGFuY2VvZiBKYXZhZG9jQ29tbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIChKYXZhZG9jQ29tbWVudCkgZ2V0Q29tbWVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdldHRlciBmb3IgdGhpcyBmaWVsZCwgPGI+d2lsbCBvbmx5IHdvcmsgaWYgdGhpcyBmaWVsZCBkZWNsYXJlcyBvbmx5IDEgaWRlbnRpZmllciBhbmQgaWYgdGhpcyBmaWVsZCBpcworICAgICAqIGFscmVhZHkgYWRkZWQgdG8gYSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb248L2I+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBjcmVhdGVkCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgdmFyaWFibGUgaWRlbnRpZmllciBvciBpZiB0aGlzIGZpZWxkIGlzbid0IGF0dGFjaGVkIHRvIGEKKyAgICAgKiAgICAgICAgICAgICBjbGFzcyBvciBlbnVtCisgICAgICovCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIGNyZWF0ZUdldHRlcigpIHsKKyAgICAgICAgaWYgKGdldFZhcmlhYmxlcygpLnNpemUoKSAhPSAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWW91IGNhbiB1c2UgdGhpcyBvbmx5IHdoZW4gdGhlIGZpZWxkIGRlY2xhcmVzIG9ubHkgMSB2YXJpYWJsZSBuYW1lIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBwYXJlbnRDbGFzcyA9IGdldFBhcmVudE5vZGVPZlR5cGUoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgRW51bURlY2xhcmF0aW9uIHBhcmVudEVudW0gPSBnZXRQYXJlbnROb2RlT2ZUeXBlKEVudW1EZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGlmICgocGFyZW50Q2xhc3MgPT0gbnVsbCAmJiBwYXJlbnRFbnVtID09IG51bGwpIHx8IChwYXJlbnRDbGFzcyAhPSBudWxsICYmIHBhcmVudENsYXNzLmlzSW50ZXJmYWNlKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIllvdSBjYW4gdXNlIHRoaXMgb25seSB3aGVuIHRoZSBmaWVsZCBpcyBhdHRhY2hlZCB0byBhIGNsYXNzIG9yIGFuIGVudW0iKTsKKworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGUgPSBnZXRWYXJpYWJsZXMoKS5nZXQoMCk7CisgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSB2YXJpYWJsZS5nZXRJZCgpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpZWxkTmFtZVVwcGVyID0gZmllbGROYW1lLnRvVXBwZXJDYXNlKCkuc3Vic3RyaW5nKDAsIDEpICsgZmllbGROYW1lLnN1YnN0cmluZygxLCBmaWVsZE5hbWUubGVuZ3RoKCkpOworICAgICAgICBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBnZXR0ZXI7CisgICAgICAgIGlmIChwYXJlbnRDbGFzcyAhPSBudWxsKQorICAgICAgICAgICAgZ2V0dGVyID0gcGFyZW50Q2xhc3MuYWRkTWV0aG9kKCJnZXQiICsgZmllbGROYW1lVXBwZXIsIFBVQkxJQyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdldHRlciA9IHBhcmVudEVudW0uYWRkTWV0aG9kKCJnZXQiICsgZmllbGROYW1lVXBwZXIsIFBVQkxJQyk7CisgICAgICAgIGdldHRlci5zZXRUeXBlKHZhcmlhYmxlLmdldFR5cGUoKSk7CisgICAgICAgIEJsb2NrU3RtdCBibG9ja1N0bXQgPSBuZXcgQmxvY2tTdG10KCk7CisgICAgICAgIGdldHRlci5zZXRCb2R5KGJsb2NrU3RtdCk7CisgICAgICAgIGJsb2NrU3RtdC5hZGRTdGF0ZW1lbnQobmV3IFJldHVyblN0bXQobmFtZShmaWVsZE5hbWUpKSk7CisgICAgICAgIHJldHVybiBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2V0dGVyIGZvciB0aGlzIGZpZWxkLCA8Yj53aWxsIG9ubHkgd29yayBpZiB0aGlzIGZpZWxkIGRlY2xhcmVzIG9ubHkgMSBpZGVudGlmaWVyIGFuZCBpZiB0aGlzIGZpZWxkIGlzCisgICAgICogYWxyZWFkeSBhZGRlZCB0byBhIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjwvYj4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSB2YXJpYWJsZSBpZGVudGlmaWVyIG9yIGlmIHRoaXMgZmllbGQgaXNuJ3QgYXR0YWNoZWQgdG8gYQorICAgICAqICAgICAgICAgICAgIGNsYXNzIG9yIGVudW0KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gY3JlYXRlU2V0dGVyKCkgeworICAgICAgICBpZiAoZ2V0VmFyaWFibGVzKCkuc2l6ZSgpICE9IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgY2FuIHVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZmllbGQgZGVjbGFyZXMgb25seSAxIHZhcmlhYmxlIG5hbWUiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHBhcmVudENsYXNzID0gZ2V0UGFyZW50Tm9kZU9mVHlwZShDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBFbnVtRGVjbGFyYXRpb24gcGFyZW50RW51bSA9IGdldFBhcmVudE5vZGVPZlR5cGUoRW51bURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgaWYgKChwYXJlbnRDbGFzcyA9PSBudWxsICYmIHBhcmVudEVudW0gPT0gbnVsbCkgfHwgKHBhcmVudENsYXNzICE9IG51bGwgJiYgcGFyZW50Q2xhc3MuaXNJbnRlcmZhY2UoKSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiWW91IGNhbiB1c2UgdGhpcyBvbmx5IHdoZW4gdGhlIGZpZWxkIGlzIGF0dGFjaGVkIHRvIGEgY2xhc3Mgb3IgYW4gZW51bSIpOworCisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSA9IGdldFZhcmlhYmxlcygpLmdldCgwKTsKKyAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IHZhcmlhYmxlLmdldElkKCkuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgZmllbGROYW1lVXBwZXIgPSBmaWVsZE5hbWUudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMCwgMSkgKyBmaWVsZE5hbWUuc3Vic3RyaW5nKDEsIGZpZWxkTmFtZS5sZW5ndGgoKSk7CisKKyAgICAgICAgZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gc2V0dGVyOworICAgICAgICBpZiAocGFyZW50Q2xhc3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldHRlciA9IHBhcmVudENsYXNzLmFkZE1ldGhvZCgic2V0IiArIGZpZWxkTmFtZVVwcGVyLCBQVUJMSUMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXR0ZXIgPSBwYXJlbnRFbnVtLmFkZE1ldGhvZCgic2V0IiArIGZpZWxkTmFtZVVwcGVyLCBQVUJMSUMpOworICAgICAgICBzZXR0ZXIuc2V0VHlwZShWT0lEX1RZUEUpOworICAgICAgICBzZXR0ZXIuZ2V0UGFyYW1ldGVycygpLmFkZChuZXcgUGFyYW1ldGVyKHZhcmlhYmxlLmdldFR5cGUoKSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKGZpZWxkTmFtZSkpKTsKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrU3RtdDIgPSBuZXcgQmxvY2tTdG10KCk7CisgICAgICAgIHNldHRlci5zZXRCb2R5KGJsb2NrU3RtdDIpOworICAgICAgICBibG9ja1N0bXQyLmFkZFN0YXRlbWVudChuZXcgQXNzaWduRXhwcihuZXcgTmFtZUV4cHIoInRoaXMuIiArIGZpZWxkTmFtZSksIG5ldyBOYW1lRXhwcihmaWVsZE5hbWUpLCBPcGVyYXRvci5hc3NpZ24pKTsKKyAgICAgICAgcmV0dXJuIHNldHRlcjsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldEVsZW1lbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudFR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gc2V0RWxlbWVudFR5cGUoZmluYWwgVHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBicmFja2V0cyBpbiB0aGlzIHBvc2l0aW9uOiA8Y29kZT5jbGFzcyBDIHsgaW50W10gYWJjOyB9PC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlID0gZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUpOworICAgICAgICByZXR1cm4gYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKSB7CisgICAgICAgIHRoaXMuYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlID0gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0luaXRpYWxpemVyRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Jbml0aWFsaXplckRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiODkzZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Jbml0aWFsaXplckRlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEluaXRpYWxpemVyRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248SW5pdGlhbGl6ZXJEZWNsYXJhdGlvbj4KKyAgICAgICAgaW1wbGVtZW50cyBOb2RlV2l0aEphdmFEb2M8SW5pdGlhbGl6ZXJEZWNsYXJhdGlvbj4geworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljOworCisgICAgcHJpdmF0ZSBCbG9ja1N0bXQgYmxvY2s7CisKKyAgICBwdWJsaWMgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbihib29sZWFuIGlzU3RhdGljLCBCbG9ja1N0bXQgYmxvY2spIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgICAgIHNldFN0YXRpYyhpc1N0YXRpYyk7CisgICAgICAgIHNldEJsb2NrKGJsb2NrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgYm9vbGVhbiBpc1N0YXRpYywgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBudWxsKTsKKyAgICAgICAgc2V0U3RhdGljKGlzU3RhdGljKTsKKyAgICAgICAgc2V0QmxvY2soYmxvY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvY2tTdG10IGdldEJsb2NrKCkgeworICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBpc1N0YXRpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBzZXRCbG9jayhCbG9ja1N0bXQgYmxvY2spIHsKKyAgICAgICAgdGhpcy5ibG9jayA9IGJsb2NrOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJsb2NrKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24gc2V0U3RhdGljKGJvb2xlYW4gaXNTdGF0aWMpIHsKKyAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgaWYoZ2V0Q29tbWVudCgpIGluc3RhbmNlb2YgSmF2YWRvY0NvbW1lbnQpeworICAgICAgICAgICAgcmV0dXJuIChKYXZhZG9jQ29tbWVudCkgZ2V0Q29tbWVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01ldGhvZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5MTAzYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGUud3JhcEluQXJyYXlUeXBlczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUGFpcjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248TWV0aG9kRGVjbGFyYXRpb24+IGltcGxlbWVudHMgCisgICAgICAgIE5vZGVXaXRoSmF2YURvYzxNZXRob2REZWNsYXJhdGlvbj4sIAorICAgICAgICBOb2RlV2l0aERlY2xhcmF0aW9uLCAKKyAgICAgICAgTm9kZVdpdGhOYW1lPE1ldGhvZERlY2xhcmF0aW9uPiwKKyAgICAgICAgTm9kZVdpdGhUeXBlPE1ldGhvZERlY2xhcmF0aW9uPiwKKyAgICAgICAgTm9kZVdpdGhFbGVtZW50VHlwZTxNZXRob2REZWNsYXJhdGlvbj4sCisgICAgICAgIE5vZGVXaXRoTW9kaWZpZXJzPE1ldGhvZERlY2xhcmF0aW9uPiwgCisgICAgICAgIE5vZGVXaXRoUGFyYW1ldGVyczxNZXRob2REZWNsYXJhdGlvbj4sCisgICAgICAgIE5vZGVXaXRoVGhyb3dhYmxlPE1ldGhvZERlY2xhcmF0aW9uPiwgCisgICAgICAgIE5vZGVXaXRoQmxvY2tTdG10PE1ldGhvZERlY2xhcmF0aW9uPiB7CisKKyAgICBwcml2YXRlIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKKworICAgIHByaXZhdGUgVHlwZSBlbGVtZW50VHlwZTsKKworICAgIHByaXZhdGUgTmFtZUV4cHIgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIExpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXzsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IGJvZHk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGU7CisKKyAgICBwcml2YXRlIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3Q7CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uKGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgZmluYWwgVHlwZSBlbGVtZW50VHlwZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBmaW5hbCBUeXBlIGVsZW1lbnRUeXBlLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGVsZW1lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd3NfLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQmxvY2tTdG10IGJvZHkpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMpOworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworICAgICAgICBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUpOworICAgICAgICBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdChhcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCk7CisgICAgICAgIHNldFRocm93cyh0aHJvd3NfKTsKKyAgICAgICAgc2V0Qm9keShib2R5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oUmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBlbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5hbWVFeHByIG5hbWVFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0TmFtZUV4cHIobmFtZUV4cHIpOworICAgICAgICBzZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoYXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QpOworICAgICAgICBzZXRUaHJvd3ModGhyb3dzXyk7CisgICAgICAgIHNldEJvZHkoYm9keSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCbG9ja1N0bXQgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtb2RpZmllcnMgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24uCisgICAgICogCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudW1TZXQ8TW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZUV4cHIgZ2V0TmFtZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcGFyYW1ldGVycyA9IGVuc3VyZU5vdE51bGwocGFyYW1ldGVycyk7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFJlZmVyZW5jZVR5cGU+IGdldFRocm93cygpIHsKKyAgICAgICAgdGhyb3dzXyA9IGVuc3VyZU5vdE51bGwodGhyb3dzXyk7CisgICAgICAgIHJldHVybiB0aHJvd3NfOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwSW5BcnJheVR5cGVzKGdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGUgZ2V0RWxlbWVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUeXBlUGFyYW1ldGVyPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgdHlwZVBhcmFtZXRlcnMgPSBlbnN1cmVOb3ROdWxsKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXRCb2R5KGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXRNb2RpZmllcnMoZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXROYW1lRXhwcihuZXcgTmFtZUV4cHIobmFtZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0TmFtZUV4cHIoZmluYWwgTmFtZUV4cHIgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0UGFyYW1ldGVycyhmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycykgeworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnBhcmFtZXRlcnMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0VGhyb3dzKGZpbmFsIExpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXykgeworICAgICAgICB0aGlzLnRocm93c18gPSB0aHJvd3NfOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRocm93c18pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0VHlwZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgUGFpcjxUeXBlLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+PiB0eXBlTGlzdFBhaXIgPSB1bndyYXBBcnJheVR5cGVzKHR5cGUpOworICAgICAgICBzZXRFbGVtZW50VHlwZSh0eXBlTGlzdFBhaXIuYSk7CisgICAgICAgIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSh0eXBlTGlzdFBhaXIuYik7CisgICAgICAgIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KG51bGwpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0RWxlbWVudFR5cGUoZmluYWwgVHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0VHlwZVBhcmFtZXRlcnMoZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgeworICAgICAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgeworICAgICAgICByZXR1cm4gaXNEZWZhdWx0OworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbiBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7CisgICAgICAgIHRoaXMuaXNEZWZhdWx0ID0gaXNEZWZhdWx0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKHRydWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuIGluY2x1ZGluZ01vZGlmaWVycywgYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MpIHsKKyAgICAgICAgcmV0dXJuIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoaW5jbHVkaW5nTW9kaWZpZXJzLCBpbmNsdWRpbmdUaHJvd3MsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWNsYXJhdGlvbiByZXR1cm5lZCBoYXMgdGhpcyBzY2hlbWE6CisgICAgICoKKyAgICAgKiBbYWNjZXNzU3BlY2lmaWVyXSBbc3RhdGljXSBbYWJzdHJhY3RdIFtmaW5hbF0gW25hdGl2ZV0KKyAgICAgKiBbc3luY2hyb25pemVkXSByZXR1cm5UeXBlIG1ldGhvZE5hbWUgKFtwYXJhbVR5cGUgW3BhcmFtTmFtZV1dKQorICAgICAqIFt0aHJvd3MgZXhjZXB0aW9uc0xpc3RdCisgICAgICogCisgICAgICogQHJldHVybiBtZXRob2QgZGVjbGFyYXRpb24gYXMgU3RyaW5nCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4gaW5jbHVkaW5nTW9kaWZpZXJzLCBib29sZWFuIGluY2x1ZGluZ1Rocm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRpbmdQYXJhbWV0ZXJOYW1lKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoaW5jbHVkaW5nTW9kaWZpZXJzKSB7CisgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyID0gTW9kaWZpZXIuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIuZ2V0Q29kZVJlcHJlc2VuYXRpb24oKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyID09IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUID8gIiIgOiAiICIpOworICAgICAgICAgICAgaWYgKGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlNUQVRJQykpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInN0YXRpYyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5BQlNUUkFDVCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoImFic3RyYWN0ICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLkZJTkFMKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiZmluYWwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuTkFUSVZFKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibmF0aXZlICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlNZTkNIUk9OSVpFRCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInN5bmNocm9uaXplZCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIHZlcmlmeSBpdCBkb2VzIG5vdCBwcmludCBjb21tZW50cyBjb25uZWN0ZWQgdG8gdGhlIHR5cGUKKyAgICAgICAgc2IuYXBwZW5kKGdldEVsZW1lbnRUeXBlKCkudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIoIik7CisgICAgICAgIGJvb2xlYW4gZmlyc3RQYXJhbSA9IHRydWU7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3RQYXJhbSkgeworICAgICAgICAgICAgICAgIGZpcnN0UGFyYW0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluY2x1ZGluZ1BhcmFtZXRlck5hbWUpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFyYW0udG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbS5nZXRFbGVtZW50VHlwZSgpLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc1ZhckFyZ3MoKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgaWYgKGluY2x1ZGluZ1Rocm93cykgeworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFRocm93ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlVHlwZSB0aHIgOiBnZXRUaHJvd3MoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdFRocm93KSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0VGhyb3cgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgdGhyb3dzICIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRoci50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnQoKSBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50KSB7CisgICAgICAgICAgICByZXR1cm4gKEphdmFkb2NDb21tZW50KSBnZXRDb21tZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgYnJhY2tldHMgaW4gdGhpcyBwb3NpdGlvbjogPGNvZGU+Y2xhc3MgQyB7IGludFtdIGFiYzsgfTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBnZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSB7CisgICAgICAgIGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlID0gZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSk7CisgICAgICAgIHJldHVybiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUpIHsKKyAgICAgICAgdGhpcy5hcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSA9IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCS8qKgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IGJyYWNrZXRzIGluIHRoaXMgcG9zaXRpb246IDxjb2RlPmludCBhYmMoKVtdIHsuLi59PC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCkgeworICAgICAgICBhcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCA9IGVuc3VyZU5vdE51bGwoYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QpOworICAgICAgICByZXR1cm4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3Q7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QpIHsKKyAgICAgICAgdGhpcy5hcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCA9IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0OworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihhcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9QYXJhbWV0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9QYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZiMzlhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L1BhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUGFpcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLndyYXBJbkFycmF5VHlwZXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMKKyAgICAgICAgTm9kZVdpdGhUeXBlPFBhcmFtZXRlcj4sCisgICAgICAgIE5vZGVXaXRoRWxlbWVudFR5cGU8UGFyYW1ldGVyPiwKKyAgICAgICAgTm9kZVdpdGhBbm5vdGF0aW9uczxQYXJhbWV0ZXI+LAorICAgICAgICBOb2RlV2l0aE5hbWU8UGFyYW1ldGVyPiwKKyAgICAgICAgTm9kZVdpdGhNb2RpZmllcnM8UGFyYW1ldGVyPiB7CisKKyAgICBwcml2YXRlIFR5cGUgZWxlbWVudFR5cGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYXJBcmdzOworCisgICAgcHJpdmF0ZSBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMgPSBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyk7CisKKyAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHJpdmF0ZSBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZDsKKworICAgIHByaXZhdGUgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZTsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlcihUeXBlIGVsZW1lbnRUeXBlLCBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICBzZXRJZChpZCk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQYXJhbWV0ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnRUeXBlCisgICAgICogICAgICAgICAgICB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgUGFyYW1ldGVyfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyIGNyZWF0ZShUeXBlIGVsZW1lbnRUeXBlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihlbGVtZW50VHlwZSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKG5hbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgVHlwZSBlbGVtZW50VHlwZSwgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQpIHsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldElkKGlkKTsKKyAgICAgICAgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoZmluYWwgUmFuZ2UgcmFuZ2UsIAorICAgICAgICAgICAgICAgICAgICAgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCAKKyAgICAgICAgICAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCAKKyAgICAgICAgICAgICAgICAgICAgIFR5cGUgZWxlbWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNWYXJBcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0SWQoaWQpOworICAgICAgICBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7CisgICAgICAgIHNldFZhckFyZ3MoaXNWYXJBcmdzKTsKKyAgICAgICAgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB3cmFwSW5BcnJheVR5cGVzKGVsZW1lbnRUeXBlLAorICAgICAgICAgICAgICAgIGdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIGdldElkKCkuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmFyQXJncygpIHsKKyAgICAgICAgcmV0dXJuIGlzVmFyQXJnczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldFR5cGUoVHlwZSB0eXBlKSB7CisgICAgICAgIFBhaXI8VHlwZSwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPj4gdW53cmFwcGVkID0gQXJyYXlUeXBlLnVud3JhcEFycmF5VHlwZXModHlwZSk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKHVud3JhcHBlZC5hKTsKKyAgICAgICAgc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKHVud3JhcHBlZC5iKTsKKyAgICAgICAgZ2V0SWQoKS5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQobnVsbCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXIgc2V0VmFyQXJncyhib29sZWFuIGlzVmFyQXJncykgeworICAgICAgICB0aGlzLmlzVmFyQXJncyA9IGlzVmFyQXJnczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3QgcmV0dXJuZWQgY291bGQgYmUgaW1tdXRhYmxlIChpbiB0aGF0IGNhc2UgaXQgd2lsbCBiZSBlbXB0eSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIGFubm90YXRpb25zID0gZW5zdXJlTm90TnVsbChhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9ySWQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRJZCgpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGlkICE9IG51bGwpCisgICAgICAgICAgICBpZC5zZXROYW1lKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpZCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtb2RpZmllcnMgb2YgdGhpcyBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bVNldDxNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhIG51bGwgdmFsdWUgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgYW4gZW1wdHkgbGlzdC4gVGhpcyBiZWhhdmlvciBjb3VsZCBjaGFuZ2UKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBmdXR1cmUsIHNvIHBsZWFzZSBhdm9pZCBwYXNzaW5nIG51bGwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldEFubm90YXRpb25zKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFBhcmFtZXRlciBzZXRNb2RpZmllcnMoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJhbWV0ZXIgc2V0RWxlbWVudFR5cGUoZmluYWwgVHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBnZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSB7CisgICAgICAgIGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlID0gZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSk7CisgICAgICAgIHJldHVybiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFyYW1ldGVyIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKSB7CisgICAgICAgIHRoaXMuYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUgPSBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVHlwZURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ZDM3YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9UeXBlRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuaXNOdWxsT3JFbXB0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhKYXZhRG9jOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoTWVtYmVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWU7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlRGVjbGFyYXRpb248VD4gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248VD4KKyAgICAgICAgaW1wbGVtZW50cyBOb2RlV2l0aE5hbWU8VD4sIE5vZGVXaXRoSmF2YURvYzxUPiwgTm9kZVdpdGhNb2RpZmllcnM8VD4sIE5vZGVXaXRoTWVtYmVyczxUPiB7CisKKwlwcml2YXRlIE5hbWVFeHByIG5hbWU7CisKKyAgICBwcml2YXRlIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnM7CisKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uKCkgeworCX0KKworICAgIHB1YmxpYyBUeXBlRGVjbGFyYXRpb24oRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBTdHJpbmcgbmFtZSkgeworCQlzZXROYW1lKG5hbWUpOworCQlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwl9CisKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzKSB7CisJCXN1cGVyKGFubm90YXRpb25zKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisJCXNldE1lbWJlcnMobWVtYmVycyk7CisJfQorCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbihSYW5nZSByYW5nZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMpIHsKKwkJc3VwZXIocmFuZ2UsIGFubm90YXRpb25zKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisJCXNldE1lbWJlcnMobWVtYmVycyk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gdG8gdGhlIHNwZWNpZmllZCB0eXBlLiBUaGUgbGlzdCBvZiBtZW1iZXJzCisJICogd2lsbCBiZSBpbml0aWFsaXplZCBpZiBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBkZWNsCisJICogICAgICAgICAgICBtZW1iZXIgZGVjbGFyYXRpb24KKwkgKi8KKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uPFQ+IGFkZE1lbWJlcihCb2R5RGVjbGFyYXRpb248Pz4gZGVjbCkgeworCQlMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsKKwkJaWYgKGlzTnVsbE9yRW1wdHkobWVtYmVycykpIHsKKwkJCW1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCXNldE1lbWJlcnMobWVtYmVycyk7CisJCX0KKwkJbWVtYmVycy5hZGQoZGVjbCk7CisJCWRlY2wuc2V0UGFyZW50Tm9kZSh0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBnZXRNZW1iZXJzKCkgeworICAgICAgICAJbWVtYmVycyA9IGVuc3VyZU5vdE51bGwobWVtYmVycyk7CisgICAgICAgIAlyZXR1cm4gbWVtYmVyczsKKwl9CisKKwkvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIHR5cGUgZGVjbGFyYXRpb24uCisgICAgICogCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICovCisJQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKKwkJcmV0dXJuIG1vZGlmaWVyczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lLmdldE5hbWUoKTsKKwl9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBzZXRNZW1iZXJzKExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzKSB7CisJCXRoaXMubWVtYmVycyA9IG1lbWJlcnM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMubWVtYmVycyk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKwl9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBzZXRNb2RpZmllcnMoRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlzZXROYW1lRXhwcihuZXcgTmFtZUV4cHIobmFtZSkpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisJfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFQgc2V0TmFtZUV4cHIoTmFtZUV4cHIgbmFtZUV4cHIpIHsKKwkJdGhpcy5uYW1lID0gbmFtZUV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMubmFtZSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKwl9CisKKwlwdWJsaWMgZmluYWwgTmFtZUV4cHIgZ2V0TmFtZUV4cHIoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhZG9jQ29tbWVudCBnZXRKYXZhRG9jKCkgeworCQlpZihnZXRDb21tZW50KCkgaW5zdGFuY2VvZiBKYXZhZG9jQ29tbWVudCl7CisJCQlyZXR1cm4gKEphdmFkb2NDb21tZW50KSBnZXRDb21tZW50KCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3OGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9WYXJpYWJsZURlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5QYWlyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkFycmF5VHlwZS53cmFwSW5BcnJheVR5cGVzOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmFyaWFibGVEZWNsYXJhdG9yIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzCisgICAgICAgIE5vZGVXaXRoVHlwZTxWYXJpYWJsZURlY2xhcmF0b3I+IHsKKworICAgIHByaXZhdGUgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQ7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gaW5pdDsKKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3IoKSB7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICBzZXRJZChpZCk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihTdHJpbmcgdmFyaWFibGVOYW1lKSB7CisgICAgICAgIHNldElkKG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZCh2YXJpYWJsZU5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHZhcmlhYmxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB2YXJpYWJsZS4gSUUuIFRoZSB2YXJpYWJsZXMgbmFtZS4KKyAgICAgKiBAcGFyYW0gaW5pdCBXaGF0IHRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvLgorICAgICAqICAgICAgICAgICAgQW4ge0BsaW5rIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByfSBpcyB1bm5lY2Vzc2FyeSBhcyB0aGUgPGNvZGU+PTwvY29kZT4gb3BlcmF0b3IgaXMKKyAgICAgKiAgICAgICAgICAgIGFscmVhZHkgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCwgRXhwcmVzc2lvbiBpbml0KSB7CisgICAgICAgIHNldElkKGlkKTsKKyAgICAgICAgc2V0SW5pdChpbml0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yKFN0cmluZyB2YXJpYWJsZU5hbWUsIEV4cHJlc3Npb24gaW5pdCkgeworICAgICAgICBzZXRJZChuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQodmFyaWFibGVOYW1lKSk7CisgICAgICAgIHNldEluaXQoaW5pdCk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcihSYW5nZSByYW5nZSwgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQsIEV4cHJlc3Npb24gaW5pdCkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldElkKGlkKTsKKyAgICAgICAgc2V0SW5pdChpbml0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcklkIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0SW5pdCgpIHsKKyAgICAgICAgcmV0dXJuIGluaXQ7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvciBzZXRJZChWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaWQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yIHNldEluaXQoRXhwcmVzc2lvbiBpbml0KSB7CisgICAgICAgIHRoaXMuaW5pdCA9IGluaXQ7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5pdCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdpbGwgY3JlYXRlIGEge0BsaW5rIE5hbWVFeHByfSB3aXRoIHRoZSBpbml0IHBhcmFtCisgICAgICovCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvciBzZXRJbml0KFN0cmluZyBpbml0KSB7CisgICAgICAgIHRoaXMuaW5pdCA9IG5ldyBOYW1lRXhwcihpbml0KTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbml0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICBOb2RlV2l0aEVsZW1lbnRUeXBlPD8+IGVsZW1lbnRUeXBlID0gZ2V0UGFyZW50Tm9kZU9mVHlwZShOb2RlV2l0aEVsZW1lbnRUeXBlLmNsYXNzKTsKKworICAgICAgICByZXR1cm4gd3JhcEluQXJyYXlUeXBlcyhlbGVtZW50VHlwZS5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIGdldElkKCkuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3Igc2V0VHlwZShUeXBlIHR5cGUpIHsKKyAgICAgICAgUGFpcjxUeXBlLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+PiB1bndyYXBwZWQgPSBBcnJheVR5cGUudW53cmFwQXJyYXlUeXBlcyh0eXBlKTsKKyAgICAgICAgTm9kZVdpdGhFbGVtZW50VHlwZTw/PiBub2RlV2l0aEVsZW1lbnRUeXBlID0gZ2V0UGFyZW50Tm9kZU9mVHlwZShOb2RlV2l0aEVsZW1lbnRUeXBlLmNsYXNzKTsKKyAgICAgICAgaWYgKG5vZGVXaXRoRWxlbWVudFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHNldCB0eXBlIHdpdGhvdXQgYSBwYXJlbnQiKTsKKyAgICAgICAgfQorICAgICAgICBub2RlV2l0aEVsZW1lbnRUeXBlLnNldEVsZW1lbnRUeXBlKHVud3JhcHBlZC5hKTsKKyAgICAgICAgbm9kZVdpdGhFbGVtZW50VHlwZS5zZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUobnVsbCk7CisgICAgICAgIGdldElkKCkuc2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKHVud3JhcHBlZC5iKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L1ZhcmlhYmxlRGVjbGFyYXRvcklkLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9ySWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRjY2MyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L1ZhcmlhYmxlRGVjbGFyYXRvcklkLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlCcmFja2V0UGFpcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRvcklkIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5vZGVXaXRoTmFtZTxWYXJpYWJsZURlY2xhcmF0b3JJZD4geworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVySWQ7CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9ySWQoKSB7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcklkKFN0cmluZyBuYW1lKSB7CisgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9ySWQoUmFuZ2UgcmFuZ2UsIFN0cmluZyBuYW1lLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZChhcnJheUJyYWNrZXRQYWlyc0FmdGVySWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCgpIHsKKyAgICAgICAgYXJyYXlCcmFja2V0UGFpcnNBZnRlcklkID0gZW5zdXJlTm90TnVsbChhcnJheUJyYWNrZXRQYWlyc0FmdGVySWQpOworICAgICAgICByZXR1cm4gYXJyYXlCcmFja2V0UGFpcnNBZnRlcklkOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZCBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVySWQpIHsKKyAgICAgICAgdGhpcy5hcnJheUJyYWNrZXRQYWlyc0FmdGVySWQgPSBhcnJheUJyYWNrZXRQYWlyc0FmdGVySWQ7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQmxvY2tDb21tZW50LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0Jsb2NrQ29tbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTU3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0Jsb2NrQ29tbWVudC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiA8cD4KKyAqIEFTVCBub2RlIHRoYXQgcmVwcmVzZW50IGJsb2NrIGNvbW1lbnRzLgorICogPC9wPgorICogQmxvY2sgY29tbWVudHMgY2FuIGhhcyBtdWx0aSBsaW5lcyBhbmQgYXJlIGRlbGltaXRlZCBieSAiLyYjNDI7IiBhbmQKKyAqICImIzQyOy8iLgorICogCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsb2NrQ29tbWVudCBleHRlbmRzIENvbW1lbnQgeworCisgICAgcHVibGljIEJsb2NrQ29tbWVudCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvY2tDb21tZW50KFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKGNvbnRlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBCbG9ja0NvbW1lbnQoUmFuZ2UgcmFuZ2UsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBjb250ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE5OTRlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgQVNUIG5vZGVzIHRoYXQgcmVwcmVzZW50IGNvbW1lbnRzLgorICogCisgKiBAc2VlIEJsb2NrQ29tbWVudAorICogQHNlZSBMaW5lQ29tbWVudAorICogQHNlZSBKYXZhZG9jQ29tbWVudAorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tZW50IGV4dGVuZHMgTm9kZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50OworICAgIHByaXZhdGUgTm9kZSBjb21tZW50ZWROb2RlOworCisgICAgcHVibGljIENvbW1lbnQoKSB7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tbWVudChSYW5nZSByYW5nZSwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBvZiB0aGUgY29tbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRleHQgb2YgdGhlIGNvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvbnRlbnQoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRleHQgb2YgdGhlIGNvbW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXh0IG9mIHRoZSBjb21tZW50IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyBDb21tZW50IHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNMaW5lQ29tbWVudCgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIExpbmVDb21tZW50IGFzTGluZUNvbW1lbnQoKSB7CisgICAgICAgIGlmIChpc0xpbmVDb21tZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoTGluZUNvbW1lbnQpIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBhIGxpbmUgY29tbWVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0Q29tbWVudGVkTm9kZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50ZWROb2RlOworICAgIH0KKworICAgIHB1YmxpYyBDb21tZW50IHNldENvbW1lbnRlZE5vZGUoTm9kZSBjb21tZW50ZWROb2RlKQorICAgIHsKKyAgICAgICAgaWYgKGNvbW1lbnRlZE5vZGU9PW51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudGVkTm9kZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tbWVudGVkTm9kZT09dGhpcykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tZW50ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29tbWVudGVkTm9kZSA9IGNvbW1lbnRlZE5vZGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3JwaGFuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRlZE5vZGUgPT0gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnRzQ29sbGVjdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDJjN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50czsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5OT0RFX0JZX0JFR0lOX1BPU0lUSU9OOworCisvKioKKyAqIFRoZSBjb21tZW50cyBjb250YWluZWQgaW4gYSBjZXJ0YWluIHBhcnNlZCBwaWVjZSBvZiBzb3VyY2UgY29kZS4KKyAqLworcHVibGljIGNsYXNzIENvbW1lbnRzQ29sbGVjdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBUcmVlU2V0PENvbW1lbnQ+IGNvbW1lbnRzID0gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKTsKKworICAgIHB1YmxpYyBDb21tZW50c0NvbGxlY3Rpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbihDb2xsZWN0aW9uPENvbW1lbnQ+IGNvbW1lbnRzVG9Db3B5KSB7CisgICAgICAgIGNvbW1lbnRzLmFkZEFsbChjb21tZW50c1RvQ29weSk7CisgICAgfQorCisgICAgcHVibGljIFNldDxMaW5lQ29tbWVudD4gZ2V0TGluZUNvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIExpbmVDb21tZW50KQorICAgICAgICAgICAgICAgIC5tYXAoY29tbWVudCAtPiAoTGluZUNvbW1lbnQpIGNvbW1lbnQpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKSkpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8QmxvY2tDb21tZW50PiBnZXRCbG9ja0NvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIEJsb2NrQ29tbWVudCkKKyAgICAgICAgICAgICAgICAubWFwKGNvbW1lbnQgLT4gKEJsb2NrQ29tbWVudCkgY29tbWVudCkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBuZXcgVHJlZVNldDw+KE5PREVfQllfQkVHSU5fUE9TSVRJT04pKSk7CisgICAgfQorCisgICAgcHVibGljIFNldDxKYXZhZG9jQ29tbWVudD4gZ2V0SmF2YWRvY0NvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbW1lbnQgLT4gY29tbWVudCBpbnN0YW5jZW9mIEphdmFkb2NDb21tZW50KQorICAgICAgICAgICAgICAgIC5tYXAoY29tbWVudCAtPiAoSmF2YWRvY0NvbW1lbnQpIGNvbW1lbnQpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oKCkgLT4gbmV3IFRyZWVTZXQ8PihOT0RFX0JZX0JFR0lOX1BPU0lUSU9OKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbW1lbnQoQ29tbWVudCBjb21tZW50KSB7CisgICAgICAgIGNvbW1lbnRzLmFkZChjb21tZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDb21tZW50IGNvbW1lbnQpIHsKKyAgICAgICAgZm9yIChDb21tZW50IGMgOiBnZXRDb21tZW50cygpKSB7CisgICAgICAgICAgICAvLyB3ZSB0b2xlcmF0ZSBhIGRpZmZlcmVuY2Ugb2Ygb25lIGVsZW1lbnQgaW4gdGhlIGVuZCBjb2x1bW46CisgICAgICAgICAgICAvLyBpdCBkZXBlbmRzIGhvdyBcciBhbmQgXG4gYXJlIGNhbGN1bGF0ZWQuLi4KKyAgICAgICAgICAgIGlmIChjLmdldEJlZ2luKCkubGluZSA9PSBjb21tZW50LmdldEJlZ2luKCkubGluZSAmJgorICAgICAgICAgICAgICAgICAgICBjLmdldEJlZ2luKCkuY29sdW1uID09IGNvbW1lbnQuZ2V0QmVnaW4oKS5jb2x1bW4gJiYKKyAgICAgICAgICAgICAgICAgICAgYy5nZXRFbmQoKS5saW5lID09IGNvbW1lbnQuZ2V0RW5kKCkubGluZSAmJgorICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhjLmdldEVuZCgpLmNvbHVtbiAtIGNvbW1lbnQuZ2V0RW5kKCkuY29sdW1uKSA8IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFRyZWVTZXQ8Q29tbWVudD4gZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50cy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbiBtaW51cyhDb21tZW50c0NvbGxlY3Rpb24gb3RoZXIpIHsKKyAgICAgICAgQ29tbWVudHNDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBDb21tZW50c0NvbGxlY3Rpb24oKTsKKyAgICAgICAgcmVzdWx0LmNvbW1lbnRzLmFkZEFsbCgKKyAgICAgICAgICAgICAgICBjb21tZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjb21tZW50IC0+ICFvdGhlci5jb250YWlucyhjb21tZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tbWVudHNDb2xsZWN0aW9uIGNvcHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tbWVudHNDb2xsZWN0aW9uKGNvbW1lbnRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0phdmFkb2NDb21tZW50LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0phdmFkb2NDb21tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiNzdhZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvSmF2YWRvY0NvbW1lbnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXZhZG9jQ29tbWVudCBleHRlbmRzIENvbW1lbnQgeworCisgICAgcHVibGljIEphdmFkb2NDb21tZW50KCkgeworICAgIH0KKworICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudChTdHJpbmcgY29udGVudCkgeworICAgICAgICBzdXBlcihjb250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQoUmFuZ2UgcmFuZ2UsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKHJhbmdlLCBjb250ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9MaW5lQ29tbWVudC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9MaW5lQ29tbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjgwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0xpbmVDb21tZW50LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50czsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIDxwPgorICogQVNUIG5vZGUgdGhhdCByZXByZXNlbnQgbGluZSBjb21tZW50cy4KKyAqIDwvcD4KKyAqIExpbmUgY29tbWVudHMgYXJlIHN0YXJ0ZWQgd2l0aCAiLy8iIGFuZCBmaW5pc2ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAoIlxuIikuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTGluZUNvbW1lbnQgZXh0ZW5kcyBDb21tZW50IHsKKworICAgIHB1YmxpYyBMaW5lQ29tbWVudCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTGluZUNvbW1lbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIoY29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIExpbmVDb21tZW50KFJhbmdlIHJhbmdlLCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBzdXBlcihyYW5nZSwgY29udGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTGluZUNvbW1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fubm90YXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQW5ub3RhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNhZDFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fubm90YXRpb25FeHByLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXByb3RlY3RlZCBOYW1lRXhwciBuYW1lOworCisJcHVibGljIEFubm90YXRpb25FeHByKCkge30KKworCXB1YmxpYyBBbm5vdGF0aW9uRXhwcihSYW5nZSByYW5nZSkgeworCQlzdXBlcihyYW5nZSk7CisJfQorCisJcHVibGljIE5hbWVFeHByIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uRXhwciBzZXROYW1lKE5hbWVFeHByIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUFjY2Vzc0V4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUFjY2Vzc0V4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYxZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5QWNjZXNzRXhwci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlBY2Nlc3NFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gbmFtZTsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBpbmRleDsKKworICAgIHB1YmxpYyBBcnJheUFjY2Vzc0V4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIEFycmF5QWNjZXNzRXhwcihFeHByZXNzaW9uIG5hbWUsIEV4cHJlc3Npb24gaW5kZXgpIHsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0SW5kZXgoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUFjY2Vzc0V4cHIoUmFuZ2UgcmFuZ2UsIEV4cHJlc3Npb24gbmFtZSwgRXhwcmVzc2lvbiBpbmRleCkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEluZGV4KGluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlBY2Nlc3NFeHByIHNldEluZGV4KEV4cHJlc3Npb24gaW5kZXgpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluZGV4KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFycmF5QWNjZXNzRXhwciBzZXROYW1lKEV4cHJlc3Npb24gbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlDcmVhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUNyZWF0aW9uRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDU1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlDcmVhdGlvbkV4cHIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5Q3JlYXRpb25MZXZlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBcnJheUNyZWF0aW9uRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGU8QXJyYXlDcmVhdGlvbkV4cHI+IHsKKworICAgIHByaXZhdGUgTGlzdDxBcnJheUNyZWF0aW9uTGV2ZWw+IGxldmVsczsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBBcnJheUluaXRpYWxpemVyRXhwciBpbml0aWFsaXplcjsKKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIoVHlwZSB0eXBlLCBMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gbGV2ZWxzLCBBcnJheUluaXRpYWxpemVyRXhwciBpbml0aWFsaXplcikgeworICAgICAgICBzZXRMZXZlbHMobGV2ZWxzKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwcihSYW5nZSByYW5nZSwgVHlwZSB0eXBlLCBMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gbGV2ZWxzLCBBcnJheUluaXRpYWxpemVyRXhwciBpbml0aWFsaXplcikgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldExldmVscyhsZXZlbHMpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXRJbml0aWFsaXplcihpbml0aWFsaXplcik7CisgICAgfQorCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByKFR5cGUgdHlwZSkgeworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXRJbml0aWFsaXplcihudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIoUmFuZ2UgcmFuZ2UsIFR5cGUgdHlwZSkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldEluaXRpYWxpemVyKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlJbml0aWFsaXplckV4cHIgZ2V0SW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIHJldHVybiBpbml0aWFsaXplcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIgc2V0SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplckV4cHIgaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgdGhpcy5pbml0aWFsaXplciA9IGluaXRpYWxpemVyOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluaXRpYWxpemVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByIHNldFR5cGUoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gZ2V0TGV2ZWxzKCkgeworICAgICAgICBsZXZlbHMgPSBlbnN1cmVOb3ROdWxsKGxldmVscyk7CisgICAgICAgIHJldHVybiBsZXZlbHM7CisgICAgfQorCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByIHNldExldmVscyhMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gbGV2ZWxzKSB7CisgICAgICAgIHRoaXMubGV2ZWxzID0gbGV2ZWxzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZihsZXZlbHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlJbml0aWFsaXplckV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUluaXRpYWxpemVyRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzEwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlJbml0aWFsaXplckV4cHIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXJyYXlJbml0aWFsaXplckV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiB2YWx1ZXM7CisKKyAgICBwdWJsaWMgQXJyYXlJbml0aWFsaXplckV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIEFycmF5SW5pdGlhbGl6ZXJFeHByKExpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzKSB7CisgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5SW5pdGlhbGl6ZXJFeHByKFJhbmdlIHJhbmdlLCBMaXN0PEV4cHJlc3Npb24+IHZhbHVlcykgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxFeHByZXNzaW9uPiBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHZhbHVlcyA9IGVuc3VyZU5vdE51bGwodmFsdWVzKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlJbml0aWFsaXplckV4cHIgc2V0VmFsdWVzKExpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzKSB7CisgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhbHVlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Bc3NpZ25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTZjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwci5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFzc2lnbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHB1YmxpYyBlbnVtIE9wZXJhdG9yIHsKKyAgICAgICAgYXNzaWduLCAvLyA9CisgICAgICAgIHBsdXMsIC8vICs9CisgICAgICAgIG1pbnVzLCAvLyAtPQorICAgICAgICBzdGFyLCAvLyAqPQorICAgICAgICBzbGFzaCwgLy8gLz0KKyAgICAgICAgYW5kLCAvLyAmPQorICAgICAgICBvciwgLy8gfD0KKyAgICAgICAgeG9yLCAvLyBePQorICAgICAgICByZW0sIC8vICU9CisgICAgICAgIGxTaGlmdCwgLy8gPDw9CisgICAgICAgIHJTaWduZWRTaGlmdCwgLy8gPj49CisgICAgICAgIHJVbnNpZ25lZFNoaWZ0LCAvLyA+Pj49CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRhcmdldDsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZTsKKworICAgIHByaXZhdGUgT3BlcmF0b3Igb3A7CisKKyAgICBwdWJsaWMgQXNzaWduRXhwcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzaWduRXhwcihFeHByZXNzaW9uIHRhcmdldCwgRXhwcmVzc2lvbiB2YWx1ZSwgT3BlcmF0b3Igb3ApIHsKKyAgICAgICAgc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgc2V0T3BlcmF0b3Iob3ApOworICAgIH0KKworICAgIHB1YmxpYyBBc3NpZ25FeHByKFJhbmdlIHJhbmdlLCBFeHByZXNzaW9uIHRhcmdldCwgRXhwcmVzc2lvbiB2YWx1ZSwgT3BlcmF0b3Igb3ApIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICBzZXRPcGVyYXRvcihvcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG9wOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBBc3NpZ25FeHByIHNldE9wZXJhdG9yKE9wZXJhdG9yIG9wKSB7CisgICAgICAgIHRoaXMub3AgPSBvcDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFzc2lnbkV4cHIgc2V0VGFyZ2V0KEV4cHJlc3Npb24gdGFyZ2V0KSB7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRhcmdldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBc3NpZ25FeHByIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0JpbmFyeUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NzVjOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHVibGljIGVudW0gT3BlcmF0b3IgeworICAgICAgICBvciwgLy8gfHwKKyAgICAgICAgYW5kLCAvLyAmJgorICAgICAgICBiaW5PciwgLy8gfAorICAgICAgICBiaW5BbmQsIC8vICYKKyAgICAgICAgeG9yLCAvLyBeCisgICAgICAgIGVxdWFscywgLy8gPT0KKyAgICAgICAgbm90RXF1YWxzLCAvLyAhPQorICAgICAgICBsZXNzLCAvLyA8CisgICAgICAgIGdyZWF0ZXIsIC8vID4KKyAgICAgICAgbGVzc0VxdWFscywgLy8gPD0KKyAgICAgICAgZ3JlYXRlckVxdWFscywgLy8gPj0KKyAgICAgICAgbFNoaWZ0LCAvLyA8PAorICAgICAgICByU2lnbmVkU2hpZnQsIC8vID4+CisgICAgICAgIHJVbnNpZ25lZFNoaWZ0LCAvLyA+Pj4KKyAgICAgICAgcGx1cywgLy8gKworICAgICAgICBtaW51cywgLy8gLQorICAgICAgICB0aW1lcywgLy8gKgorICAgICAgICBkaXZpZGUsIC8vIC8KKyAgICAgICAgcmVtYWluZGVyLCAvLyAlCisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGxlZnQ7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gcmlnaHQ7CisKKyAgICBwcml2YXRlIE9wZXJhdG9yIG9wOworCisgICAgcHVibGljIEJpbmFyeUV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIEJpbmFyeUV4cHIoRXhwcmVzc2lvbiBsZWZ0LCBFeHByZXNzaW9uIHJpZ2h0LCBPcGVyYXRvciBvcCkgeworICAgIAlzZXRMZWZ0KGxlZnQpOworICAgIAlzZXRSaWdodChyaWdodCk7CisgICAgCXNldE9wZXJhdG9yKG9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmluYXJ5RXhwcihSYW5nZSByYW5nZSwgRXhwcmVzc2lvbiBsZWZ0LCBFeHByZXNzaW9uIHJpZ2h0LCBPcGVyYXRvciBvcCkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgCXNldExlZnQobGVmdCk7CisgICAgCXNldFJpZ2h0KHJpZ2h0KTsKKyAgICAJc2V0T3BlcmF0b3Iob3ApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRMZWZ0KCkgeworICAgICAgICByZXR1cm4gbGVmdDsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBvcDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRSaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyBCaW5hcnlFeHByIHNldExlZnQoRXhwcmVzc2lvbiBsZWZ0KSB7CisgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMubGVmdCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCaW5hcnlFeHByIHNldE9wZXJhdG9yKE9wZXJhdG9yIG9wKSB7CisgICAgICAgIHRoaXMub3AgPSBvcDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJpbmFyeUV4cHIgc2V0UmlnaHQoRXhwcmVzc2lvbiByaWdodCkgeworICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMucmlnaHQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQm9vbGVhbkxpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQm9vbGVhbkxpdGVyYWxFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyYzhjNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Cb29sZWFuTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJvb2xlYW5MaXRlcmFsRXhwciBleHRlbmRzIExpdGVyYWxFeHByIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKKworICAgIHB1YmxpYyBCb29sZWFuTGl0ZXJhbEV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW5MaXRlcmFsRXhwcihib29sZWFuIHZhbHVlKSB7CisgICAgCXNldFZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbkxpdGVyYWxFeHByKFJhbmdlIHJhbmdlLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBCb29sZWFuTGl0ZXJhbEV4cHIgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DYXN0RXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DYXN0RXhwci5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENhc3RFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZTxDYXN0RXhwcj4geworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcjsKKworICAgIHB1YmxpYyBDYXN0RXhwcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FzdEV4cHIoVHlwZSB0eXBlLCBFeHByZXNzaW9uIGV4cHIpIHsKKyAgICAJc2V0VHlwZSh0eXBlKTsKKyAgICAJc2V0RXhwcihleHByKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FzdEV4cHIoUmFuZ2UgcmFuZ2UsIFR5cGUgdHlwZSwgRXhwcmVzc2lvbiBleHByKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAJc2V0RXhwcihleHByKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGV4cHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIENhc3RFeHByIHNldEV4cHIoRXhwcmVzc2lvbiBleHByKSB7CisgICAgICAgIHRoaXMuZXhwciA9IGV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDYXN0RXhwciBzZXRUeXBlKFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2hhckxpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2hhckxpdGVyYWxFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5OWU4OAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DaGFyTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDaGFyTGl0ZXJhbEV4cHIgZXh0ZW5kcyBTdHJpbmdMaXRlcmFsRXhwciB7CisKKyAgICBwdWJsaWMgQ2hhckxpdGVyYWxFeHByKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDaGFyTGl0ZXJhbEV4cHIoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhckxpdGVyYWxFeHByKFJhbmdlIHJhbmdlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIuIEVzY2FwZXMgRU9MIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyTGl0ZXJhbEV4cHIgZXNjYXBlKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGFyTGl0ZXJhbEV4cHIoVXRpbHMuZXNjYXBlRW5kT2ZMaW5lcyhzdHJpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NsYXNzRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NsYXNzRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZGM5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2xhc3NFeHByLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIERlZmluZXMgYW4gZXhwcmVzc2lvbiB0aGF0IGFjY2Vzc2VzIHRoZSBjbGFzcyBvZiBhIHR5cGUuCisgKiBFeGFtcGxlOgorICogPGNvZGU+CisgKiAgICAgT2JqZWN0LmNsYXNzCisgKiA8L2NvZGU+CisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGU8Q2xhc3NFeHByPiB7CisKKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKworICAgIHB1YmxpYyBDbGFzc0V4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIENsYXNzRXhwcihUeXBlIHR5cGUpIHsKKyAgICAgICBzZXRUeXBlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0V4cHIoUmFuZ2UgcmFuZ2UsIFR5cGUgdHlwZSkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzc0V4cHIgc2V0VHlwZShUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NvbmRpdGlvbmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NvbmRpdGlvbmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDRjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ29uZGl0aW9uYWxFeHByLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25kaXRpb25hbEV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBjb25kaXRpb247CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gdGhlbkV4cHI7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZWxzZUV4cHI7CisKKyAgICBwdWJsaWMgQ29uZGl0aW9uYWxFeHByKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIoRXhwcmVzc2lvbiBjb25kaXRpb24sIEV4cHJlc3Npb24gdGhlbkV4cHIsIEV4cHJlc3Npb24gZWxzZUV4cHIpIHsKKyAgICAgICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisgICAgICAgIHNldFRoZW5FeHByKHRoZW5FeHByKTsKKyAgICAgICAgc2V0RWxzZUV4cHIoZWxzZUV4cHIpOworICAgIH0KKworICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIoUmFuZ2UgcmFuZ2UsIEV4cHJlc3Npb24gY29uZGl0aW9uLCBFeHByZXNzaW9uIHRoZW5FeHByLCBFeHByZXNzaW9uIGVsc2VFeHByKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisgICAgICAgIHNldFRoZW5FeHByKHRoZW5FeHByKTsKKyAgICAgICAgc2V0RWxzZUV4cHIoZWxzZUV4cHIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBjb25kaXRpb247CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RWxzZUV4cHIoKSB7CisgICAgICAgIHJldHVybiBlbHNlRXhwcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRUaGVuRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIHRoZW5FeHByOworICAgIH0KKworICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIgc2V0Q29uZGl0aW9uKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbmRpdGlvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIgc2V0RWxzZUV4cHIoRXhwcmVzc2lvbiBlbHNlRXhwcikgeworICAgICAgICB0aGlzLmVsc2VFeHByID0gZWxzZUV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxzZUV4cHIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uZGl0aW9uYWxFeHByIHNldFRoZW5FeHByKEV4cHJlc3Npb24gdGhlbkV4cHIpIHsKKyAgICAgICAgdGhpcy50aGVuRXhwciA9IHRoZW5FeHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRoZW5FeHByKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0RvdWJsZUxpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRG91YmxlTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg5MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0RvdWJsZUxpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEb3VibGVMaXRlcmFsRXhwciBleHRlbmRzIFN0cmluZ0xpdGVyYWxFeHByIHsKKworCXB1YmxpYyBEb3VibGVMaXRlcmFsRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgRG91YmxlTGl0ZXJhbEV4cHIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJCXN1cGVyKHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgRG91YmxlTGl0ZXJhbEV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcihyYW5nZSwgdmFsdWUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9FbmNsb3NlZEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9FbmNsb3NlZEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M0MGZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0VuY2xvc2VkRXhwci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW5jbG9zZWRFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gaW5uZXI7CisKKwlwdWJsaWMgRW5jbG9zZWRFeHByKCkgeworCX0KKworCXB1YmxpYyBFbmNsb3NlZEV4cHIoZmluYWwgRXhwcmVzc2lvbiBpbm5lcikgeworCQlzZXRJbm5lcihpbm5lcik7CisJfQorCisJcHVibGljIEVuY2xvc2VkRXhwcihmaW5hbCBSYW5nZSByYW5nZSwgZmluYWwgRXhwcmVzc2lvbiBpbm5lcikgeworCQlzdXBlcihyYW5nZSk7CisJCXNldElubmVyKGlubmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRJbm5lcigpIHsKKwkJcmV0dXJuIGlubmVyOworCX0KKworCXB1YmxpYyBFbmNsb3NlZEV4cHIgc2V0SW5uZXIoZmluYWwgRXhwcmVzc2lvbiBpbm5lcikgeworCQl0aGlzLmlubmVyID0gaW5uZXI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5uZXIpOworCQlyZXR1cm4gdGhpczsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRXhwcmVzc2lvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTc0NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0V4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEV4cHJlc3Npb24oKSB7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24oUmFuZ2UgcmFuZ2UpIHsKKwkJc3VwZXIocmFuZ2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ZpZWxkQWNjZXNzRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ZpZWxkQWNjZXNzRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNGJhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRmllbGRBY2Nlc3NFeHByLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVBcmd1bWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmllbGRBY2Nlc3NFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZUFyZ3VtZW50czxGaWVsZEFjY2Vzc0V4cHI+IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBzY29wZTsKKworCXByaXZhdGUgTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzOworCisJcHJpdmF0ZSBOYW1lRXhwciBmaWVsZDsKKworCXB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIoKSB7CisJfQorCisJcHVibGljIEZpZWxkQWNjZXNzRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTdHJpbmcgZmllbGQpIHsKKwkJc2V0U2NvcGUoc2NvcGUpOworCQlzZXRGaWVsZChmaWVsZCk7CisJfQorCisJcHVibGljIEZpZWxkQWNjZXNzRXhwcihmaW5hbCBSYW5nZSByYW5nZSwgZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzLCBmaW5hbCBTdHJpbmcgZmllbGQpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRTY29wZShzY29wZSk7CisJCXNldFR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cyk7CisJCXNldEZpZWxkKGZpZWxkKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZpZWxkKCkgeworCQlyZXR1cm4gZmllbGQuZ2V0TmFtZSgpOworCX0KKworCXB1YmxpYyBOYW1lRXhwciBnZXRGaWVsZEV4cHIoKSB7CisJCXJldHVybiBmaWVsZDsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRTY29wZSgpIHsKKwkJcmV0dXJuIHNjb3BlOworCX0KKworCXB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIgc2V0RmllbGQoZmluYWwgU3RyaW5nIGZpZWxkKSB7CisJCXNldEZpZWxkRXhwcihuZXcgTmFtZUV4cHIoZmllbGQpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIEZpZWxkQWNjZXNzRXhwciBzZXRGaWVsZEV4cHIoTmFtZUV4cHIgZmllbGQpIHsKKwkJdGhpcy5maWVsZCA9IGZpZWxkOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmZpZWxkKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIEZpZWxkQWNjZXNzRXhwciBzZXRTY29wZShmaW5hbCBFeHByZXNzaW9uIHNjb3BlKSB7CisJCXRoaXMuc2NvcGUgPSBzY29wZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSk7CisJCXJldHVybiB0aGlzOworCX0KKworCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8VHlwZTw/Pj4gZ2V0VHlwZUFyZ3VtZW50cygpIHsKKwkJcmV0dXJuIHR5cGVBcmd1bWVudHM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEZpZWxkQWNjZXNzRXhwciBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZXMpIHsKKwkJdGhpcy50eXBlQXJndW1lbnRzID0gdHlwZXM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3VtZW50cyk7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0luc3RhbmNlT2ZFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjMjQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbmNlT2ZFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZTxJbnN0YW5jZU9mRXhwcj4geworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHI7CisKKwlwcml2YXRlIFR5cGUgdHlwZTsKKworCXB1YmxpYyBJbnN0YW5jZU9mRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgSW5zdGFuY2VPZkV4cHIoZmluYWwgRXhwcmVzc2lvbiBleHByLCBmaW5hbCBUeXBlIHR5cGUpIHsKKwkJc2V0RXhwcihleHByKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwl9CisKKwlwdWJsaWMgSW5zdGFuY2VPZkV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIEV4cHJlc3Npb24gZXhwciwgZmluYWwgVHlwZSB0eXBlKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0RXhwcihleHByKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgSW5zdGFuY2VPZkV4cHIgc2V0RXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJdGhpcy5leHByID0gZXhwcjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJQE92ZXJyaWRlCisgICAgcHVibGljIEluc3RhbmNlT2ZFeHByIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY1ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ludGVnZXJMaXRlcmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlckxpdGVyYWxFeHByIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbEV4cHIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU0lHTkVEX01JTl9WQUxVRSA9ICIyMTQ3NDgzNjQ4IjsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9WQUxVRSA9ICItIiArIFVOU0lHTkVEX01JTl9WQUxVRTsKKworCXB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHIoKSB7CisJfQorCisJcHVibGljIEludGVnZXJMaXRlcmFsRXhwcihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIodmFsdWUpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcihyYW5nZSwgdmFsdWUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWluVmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmIC8vCisJCQkJdmFsdWUubGVuZ3RoKCkgPT0gMTAgJiYgLy8KKwkJCQl2YWx1ZS5lcXVhbHMoVU5TSUdORURfTUlOX1ZBTFVFKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjVhYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIGV4dGVuZHMgSW50ZWdlckxpdGVyYWxFeHByIHsKKworCXB1YmxpYyBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcigpIHsKKwkJc3VwZXIoTUlOX1ZBTFVFKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UpIHsKKwkJc3VwZXIocmFuZ2UsIE1JTl9WQUxVRSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGFtYmRhRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xhbWJkYUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGIxYjBkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xhbWJkYUV4cHIuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuKjsKKworLyoqCisgKiBMYW1iZGEgZXhwcmVzc2lvbi4KKyAqCisgKiBAYXV0aG9yIFJhcXVlbCBQYXUKKyAqLworcHVibGljIGNsYXNzIExhbWJkYUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXByaXZhdGUgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKwlwcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyc0VuY2xvc2VkOworCisJcHJpdmF0ZSBTdGF0ZW1lbnQgYm9keTsKKworCXB1YmxpYyBMYW1iZGFFeHByKCkgeworCX0KKworCXB1YmxpYyBMYW1iZGFFeHByKFJhbmdlIHJhbmdlLCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgU3RhdGVtZW50IGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXJhbWV0ZXJzRW5jbG9zZWQpIHsKKworCQlzdXBlcihyYW5nZSk7CisJCXNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisJCXNldEJvZHkoYm9keSk7CisgICAgICAgIHNldFBhcmFtZXRlcnNFbmNsb3NlZChwYXJhbWV0ZXJzRW5jbG9zZWQpOworCX0KKworCXB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcGFyYW1ldGVycyA9IGVuc3VyZU5vdE51bGwocGFyYW1ldGVycyk7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworCX0KKworCXB1YmxpYyBMYW1iZGFFeHByIHNldFBhcmFtZXRlcnMoTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYXJhbWV0ZXJzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworCQlyZXR1cm4gYm9keTsKKwl9CisKKwlwdWJsaWMgTGFtYmRhRXhwciBzZXRCb2R5KFN0YXRlbWVudCBib2R5KSB7CisJCXRoaXMuYm9keSA9IGJvZHk7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSk7CisJCXJldHVybiB0aGlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcnNFbmNsb3NlZCgpIHsKKwkJcmV0dXJuIHBhcmFtZXRlcnNFbmNsb3NlZDsKKwl9CisKKwlwdWJsaWMgTGFtYmRhRXhwciBzZXRQYXJhbWV0ZXJzRW5jbG9zZWQoYm9vbGVhbiBwYXJhbWV0ZXJzRW5jbG9zZWQpIHsKKwkJdGhpcy5wYXJhbWV0ZXJzRW5jbG9zZWQgPSBwYXJhbWV0ZXJzRW5jbG9zZWQ7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FmZWZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGl0ZXJhbEV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXB1YmxpYyBMaXRlcmFsRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgTGl0ZXJhbEV4cHIoUmFuZ2UgcmFuZ2UpIHsKKwkJc3VwZXIocmFuZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Mb25nTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Mb25nTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTJlOGYyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgTG9uZ0xpdGVyYWxFeHByIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbEV4cHIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU0lHTkVEX01JTl9WQUxVRSA9ICI5MjIzMzcyMDM2ODU0Nzc1ODA4IjsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTl9WQUxVRSA9ICItIiArIFVOU0lHTkVEX01JTl9WQUxVRSArICJMIjsKKworCXB1YmxpYyBMb25nTGl0ZXJhbEV4cHIoKSB7CisJfQorCisJcHVibGljIExvbmdMaXRlcmFsRXhwcihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIodmFsdWUpOworCX0KKworCXB1YmxpYyBMb25nTGl0ZXJhbEV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcihyYW5nZSwgdmFsdWUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWluVmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmIC8vCisJCQkJdmFsdWUubGVuZ3RoKCkgPT0gMjAgJiYgLy8KKwkJCQl2YWx1ZS5zdGFydHNXaXRoKFVOU0lHTkVEX01JTl9WQUxVRSkgJiYgLy8KKwkJCQkodmFsdWUuY2hhckF0KDE5KSA9PSAnTCcgfHwgdmFsdWUuY2hhckF0KDE5KSA9PSAnbCcpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Mb25nTGl0ZXJhbE1pblZhbHVlRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsTWluVmFsdWVFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2MTQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Mb25nTGl0ZXJhbE1pblZhbHVlRXhwci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgZXh0ZW5kcyBMb25nTGl0ZXJhbEV4cHIgeworCisJcHVibGljIExvbmdMaXRlcmFsTWluVmFsdWVFeHByKCkgeworCQlzdXBlcihNSU5fVkFMVUUpOworCX0KKworCXB1YmxpYyBMb25nTGl0ZXJhbE1pblZhbHVlRXhwcihmaW5hbCBSYW5nZSByYW5nZSkgeworCQlzdXBlcihyYW5nZSwgTUlOX1ZBTFVFKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NYXJrZXJBbm5vdGF0aW9uRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01hcmtlckFubm90YXRpb25FeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExMTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NYXJrZXJBbm5vdGF0aW9uRXhwci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWFya2VyQW5ub3RhdGlvbkV4cHIgZXh0ZW5kcyBBbm5vdGF0aW9uRXhwciB7CisKKwlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIoKSB7CisJfQorCisJcHVibGljIE1hcmtlckFubm90YXRpb25FeHByKGZpbmFsIE5hbWVFeHByIG5hbWUpIHsKKwkJc2V0TmFtZShuYW1lKTsKKwl9CisKKwlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIE5hbWVFeHByIG5hbWUpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXROYW1lKG5hbWUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01lbWJlclZhbHVlUGFpci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01lbWJlclZhbHVlUGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2FmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWVtYmVyVmFsdWVQYWlyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lbWJlclZhbHVlUGFpciBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBOb2RlV2l0aE5hbWU8TWVtYmVyVmFsdWVQYWlyPiB7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlOworCisJcHVibGljIE1lbWJlclZhbHVlUGFpcigpIHsKKwl9CisKKwlwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBFeHByZXNzaW9uIHZhbHVlKSB7CisJCXNldE5hbWUobmFtZSk7CisJCXNldFZhbHVlKHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSkgeworCQlzdXBlcihyYW5nZSk7CisJCXNldE5hbWUobmFtZSk7CisJCXNldFZhbHVlKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lbWJlclZhbHVlUGFpciBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBNZW1iZXJWYWx1ZVBhaXIgc2V0VmFsdWUoZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFsdWUpOworCQlyZXR1cm4gdGhpczsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kQ2FsbEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTI0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kQ2FsbEV4cHIuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZENhbGxFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE5vZGVXaXRoVHlwZUFyZ3VtZW50czxNZXRob2RDYWxsRXhwcj4geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHNjb3BlOworCisgICAgcHJpdmF0ZSBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHM7CisKKyAgICBwcml2YXRlIE5hbWVFeHByIG5hbWU7CisKKyAgICBwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gYXJnczsKKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kQ2FsbEV4cHIoZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhcmdzKSB7CisgICAgICAgIHNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0QXJncyhhcmdzKTsKKyAgICB9CisKKwlwdWJsaWMgTWV0aG9kQ2FsbEV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIEV4cHJlc3Npb24gc2NvcGUsIGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3VtZW50cywgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncykgeworCQlzdXBlcihyYW5nZSk7CisJCXNldFNjb3BlKHNjb3BlKTsKKwkJc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0QXJncyhhcmdzKTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBhcmd1bWVudCB0byB0aGUgbWV0aG9kIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJnCisgICAgICogICAgICAgICAgICBhcmd1bWVudCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBhZGRBcmd1bWVudChFeHByZXNzaW9uIGFyZykgeworICAgICAgICBnZXRBcmdzKCkuYWRkKGFyZyk7CisgICAgICAgIGFyZy5zZXRQYXJlbnROb2RlKHRoaXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJnKSB7CisgICAgICAgIGFkZEFyZ3VtZW50KG5ldyBOYW1lRXhwcihhcmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0QXJncygpIHsKKyAgICAgICAgYXJncyA9IGVuc3VyZU5vdE51bGwoYXJncyk7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lRXhwciBnZXROYW1lRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzY29wZTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBzZXRBcmdzKGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncykgeworCQl0aGlzLmFyZ3MgPSBhcmdzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFyZ3MpOworCX0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldE5hbWVFeHByKG5ldyBOYW1lRXhwcihuYW1lKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXROYW1lRXhwcihOYW1lRXhwciBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMubmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXRTY29wZShmaW5hbCBFeHByZXNzaW9uIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFR5cGU8Pz4+IGdldFR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiB0eXBlQXJndW1lbnRzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwciBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZXMpIHsKKyAgICAgICAgdGhpcy50eXBlQXJndW1lbnRzID0gdHlwZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RSZWZlcmVuY2VFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kUmVmZXJlbmNlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDhjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kUmVmZXJlbmNlRXhwci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBNZXRob2QgcmVmZXJlbmNlIGV4cHJlc3Npb25zIGludHJvZHVjZWQgaW4gSmF2YSA4IHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzaW1wbGlmeSBsYW1iZGEgRXhwcmVzc2lvbnMuCisgKiBUaGVzZSBhcmUgc29tZSBleGFtcGxlczoKKyAqCisgKiBTeXN0ZW0ub3V0OjpwcmludGxuOyAKKyAqCisgKiAodGVzdCA/IHN0cmVhbS5tYXAoU3RyaW5nOjp0cmltKSA6IHN0cmVhbSk6OnRvQXJyYXk7IAorICogQGF1dGhvciBSYXF1ZWwgUGF1CisgKgorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kUmVmZXJlbmNlRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGVBcmd1bWVudHM8TWV0aG9kUmVmZXJlbmNlRXhwcj4geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHNjb3BlOworCisgICAgcHJpdmF0ZSBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHM7CisKKyAgICBwcml2YXRlIFN0cmluZyBpZGVudGlmaWVyOworCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIoUmFuZ2UgcmFuZ2UsIEV4cHJlc3Npb24gc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzLCBTdHJpbmcgaWRlbnRpZmllcikgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldElkZW50aWZpZXIoaWRlbnRpZmllcik7CisgICAgICAgIHNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIHNjb3BlOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RSZWZlcmVuY2VFeHByIHNldFNjb3BlKEV4cHJlc3Npb24gc2NvcGUpIHsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnNjb3BlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VHlwZTw/Pj4gZ2V0VHlwZUFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVBcmd1bWVudHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIgc2V0VHlwZUFyZ3VtZW50cyhmaW5hbCBMaXN0PFR5cGU8Pz4+IHR5cGVzKSB7CisgICAgICAgIHRoaXMudHlwZUFyZ3VtZW50cyA9IHR5cGVzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVBcmd1bWVudHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisgICAgICAgIHJldHVybiBpZGVudGlmaWVyOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2RSZWZlcmVuY2VFeHByIHNldElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKKyAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OYW1lRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWZhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZUV4cHIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aE5hbWU8TmFtZUV4cHI+IHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwdWJsaWMgTmFtZUV4cHIoKSB7CisJfQorCisJcHVibGljIE5hbWVFeHByKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIE5hbWVFeHByKFJhbmdlIHJhbmdlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworCQlzdXBlcihyYW5nZSk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmFtZUV4cHIgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE5hbWVFeHByfSBmcm9tIGEgcXVhbGlmaWVkIG5hbWUuPGJyPgorCSAqIFRoZSBxdWFsaWZpZWQgbmFtZSBjYW4gY29udGFpbnMgIi4iIChkb3QpIGNoYXJhY3RlcnMuCisJICoKKwkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQorCSAqICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUKKwkgKiBAcmV0dXJuIGluc3RhbmNlb2Yge0BsaW5rIE5hbWVFeHByfQorCSAqLworCXB1YmxpYyBzdGF0aWMgTmFtZUV4cHIgbmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworCQlTdHJpbmdbXSBzcGxpdCA9IHF1YWxpZmllZE5hbWUuc3BsaXQoIlxcLiIpOworCQlOYW1lRXhwciByZXQgPSBuZXcgTmFtZUV4cHIoc3BsaXRbMF0pOworCQlmb3IgKGludCBpID0gMTsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7CisJCQlyZXQgPSBuZXcgUXVhbGlmaWVkTmFtZUV4cHIocmV0LCBzcGxpdFtpXSk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Ob3JtYWxBbm5vdGF0aW9uRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyYjExZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Ob3JtYWxBbm5vdGF0aW9uRXhwci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwci4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5vcm1hbEFubm90YXRpb25FeHByIGV4dGVuZHMgQW5ub3RhdGlvbkV4cHIgeworCisgICAgcHJpdmF0ZSBMaXN0PE1lbWJlclZhbHVlUGFpcj4gcGFpcnM7CisKKyAgICBwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIE5vcm1hbEFubm90YXRpb25FeHByKGZpbmFsIE5hbWVFeHByIG5hbWUsIGZpbmFsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycykgeworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRQYWlycyhwYWlycyk7CisgICAgfQorCisgICAgcHVibGljIE5vcm1hbEFubm90YXRpb25FeHByKGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBOYW1lRXhwciBuYW1lLCBmaW5hbCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gcGFpcnMpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRQYWlycyhwYWlycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0UGFpcnMoKSB7CisgICAgICAgIHBhaXJzID0gZW5zdXJlTm90TnVsbChwYWlycyk7CisgICAgICAgIHJldHVybiBwYWlyczsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHIgc2V0UGFpcnMoZmluYWwgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzKSB7CisgICAgICAgIHRoaXMucGFpcnMgPSBwYWlyczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYWlycyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZHMgYSBwYWlyIHRvIHRoaXMgYW5ub3RhdGlvbgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcywgdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9uRXhwcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHIgYWRkUGFpcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZFBhaXIoa2V5LCBuYW1lKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkcyBhIHBhaXIgdG8gdGhpcyBhbm5vdGF0aW9uCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzLCB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb25FeHByfQorICAgICAqLworICAgIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBhZGRQYWlyKFN0cmluZyBrZXksIE5hbWVFeHByIHZhbHVlKSB7CisgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKGtleSwgdmFsdWUpOworICAgICAgICBnZXRQYWlycygpLmFkZChtZW1iZXJWYWx1ZVBhaXIpOworICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL051bGxMaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL051bGxMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGE5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTnVsbExpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGl0ZXJhbEV4cHIgZXh0ZW5kcyBMaXRlcmFsRXhwciB7CisKKwlwdWJsaWMgTnVsbExpdGVyYWxFeHByKCkgeworCX0KKworCXB1YmxpYyBOdWxsTGl0ZXJhbEV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UpIHsKKwkJc3VwZXIocmFuZ2UpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9PYmplY3RDcmVhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9PYmplY3RDcmVhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDA2ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL09iamVjdENyZWF0aW9uRXhwci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIERlZmluZXMgY29uc3RydWN0b3IgY2FsbCBleHByZXNzaW9uLgorICogRXhhbXBsZToKKyAqIDxjb2RlPgorICogICAgIG5ldyBPYmplY3QoKQorICogPC9jb2RlPgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT2JqZWN0Q3JlYXRpb25FeHByIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIAorICAgICAgICBOb2RlV2l0aFR5cGVBcmd1bWVudHM8T2JqZWN0Q3JlYXRpb25FeHByPiwKKyAgICAgICAgTm9kZVdpdGhUeXBlPE9iamVjdENyZWF0aW9uRXhwcj4geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHNjb3BlOworCisgICAgcHJpdmF0ZSBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHM7CisKKyAgICBwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gYXJnczsKKworICAgIC8vIFRoaXMgY2FuIGJlIG51bGwsIHRvIGluZGljYXRlIHRoZXJlIGlzIG5vIGJvZHkKKyAgICBwcml2YXRlIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBhbm9ueW1vdXNDbGFzc0JvZHk7CisKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgYSBjYWxsIHRvIGEgY29uc3RydWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNjb3BlIG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIHR5cGUgdGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgYmVpbmcgY2FsbGVkIGZvci4KKyAgICAgKiBAcGFyYW0gYXJncyBBbnkgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIE9iamVjdENyZWF0aW9uRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlLCBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKyAgICAgICAgc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXRBcmdzKGFyZ3MpOworICAgIH0KKworCXB1YmxpYyBPYmplY3RDcmVhdGlvbkV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsCisJCQlmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlLCBmaW5hbCBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MsIGZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBhbm9ueW1vdXNCb2R5KSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0U2NvcGUoc2NvcGUpOworCQlzZXRUeXBlKHR5cGUpOworCQlzZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworCQlzZXRBcmdzKGFyZ3MpOworCQlzZXRBbm9ueW1vdXNDbGFzc0JvZHkoYW5vbnltb3VzQm9keSk7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2FuIGJlIG51bGwsIHRvIGluZGljYXRlIHRoZXJlIGlzIG5vIGJvZHkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGdldEFub255bW91c0NsYXNzQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGFub255bW91c0NsYXNzQm9keTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBbm9ueW1vdXNDbGFzc0JvZHkoQm9keURlY2xhcmF0aW9uPD8+IGJvZHkpIHsKKyAgICAgICAgaWYgKGFub255bW91c0NsYXNzQm9keSA9PSBudWxsKQorICAgICAgICAgICAgYW5vbnltb3VzQ2xhc3NCb2R5ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGFub255bW91c0NsYXNzQm9keS5hZGQoYm9keSk7CisgICAgICAgIGJvZHkuc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxFeHByZXNzaW9uPiBnZXRBcmdzKCkgeworICAgICAgICBhcmdzID0gZW5zdXJlTm90TnVsbChhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzY29wZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdENyZWF0aW9uRXhwciBzZXRBbm9ueW1vdXNDbGFzc0JvZHkoZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGFub255bW91c0NsYXNzQm9keSkgeworICAgICAgICB0aGlzLmFub255bW91c0NsYXNzQm9keSA9IGFub255bW91c0NsYXNzQm9keTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm9ueW1vdXNDbGFzc0JvZHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIHNldEFyZ3MoZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhcmdzKSB7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYXJncyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3RDcmVhdGlvbkV4cHIgc2V0U2NvcGUoZmluYWwgRXhwcmVzc2lvbiBzY29wZSkgeworICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2NvcGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIHNldFR5cGUoZmluYWwgVHlwZTw/PiB0eXBlKSB7CisgICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlVHlwZSkpLy8gbmVlZGVkIHNvIHdlIGNhbiB1c2UgTm9kZVdpdGhUeXBlCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiWW91IGNhbiBvbmx5IGFkZCBDbGFzc09ySW50ZXJmYWNlVHlwZSB0byBhbiBPYmplY3RDcmVhdGlvbkV4cHIiKTsKKyAgICAgICAgdGhpcy50eXBlID0gKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUeXBlPD8+PiBnZXRUeXBlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByIHNldFR5cGVBcmd1bWVudHMoZmluYWwgTGlzdDxUeXBlPD8+PiB0eXBlcykgeworICAgICAgICB0aGlzLnR5cGVBcmd1bWVudHMgPSB0eXBlczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJndW1lbnRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1F1YWxpZmllZE5hbWVFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvUXVhbGlmaWVkTmFtZUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkwNjMxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1F1YWxpZmllZE5hbWVFeHByLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBRdWFsaWZpZWROYW1lRXhwciBleHRlbmRzIE5hbWVFeHByIHsKKworCXByaXZhdGUgTmFtZUV4cHIgcXVhbGlmaWVyOworCisJcHVibGljIFF1YWxpZmllZE5hbWVFeHByKCkgeworCX0KKworCXB1YmxpYyBRdWFsaWZpZWROYW1lRXhwcihmaW5hbCBOYW1lRXhwciBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCXNldFF1YWxpZmllcihzY29wZSk7CisJfQorCisJcHVibGljIFF1YWxpZmllZE5hbWVFeHByKGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBOYW1lRXhwciBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIocmFuZ2UsIG5hbWUpOworCQlzZXRRdWFsaWZpZXIoc2NvcGUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBOYW1lRXhwciBnZXRRdWFsaWZpZXIoKSB7CisJCXJldHVybiBxdWFsaWZpZXI7CisJfQorCisJcHVibGljIFF1YWxpZmllZE5hbWVFeHByIHNldFF1YWxpZmllcihmaW5hbCBOYW1lRXhwciBxdWFsaWZpZXIpIHsKKwkJdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMucXVhbGlmaWVyKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY2OTJjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBleHRlbmRzIEFubm90YXRpb25FeHByIHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZTsKKworCXB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoZmluYWwgTmFtZUV4cHIgbmFtZSwgZmluYWwgRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSkgeworCQlzZXROYW1lKG5hbWUpOworCQlzZXRNZW1iZXJWYWx1ZShtZW1iZXJWYWx1ZSk7CisJfQorCisJcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBOYW1lRXhwciBuYW1lLCBmaW5hbCBFeHByZXNzaW9uIG1lbWJlclZhbHVlKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0TWVtYmVyVmFsdWUobWVtYmVyVmFsdWUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldE1lbWJlclZhbHVlKCkgeworCQlyZXR1cm4gbWVtYmVyVmFsdWU7CisJfQorCisJcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIHNldE1lbWJlclZhbHVlKGZpbmFsIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUpIHsKKwkJdGhpcy5tZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLm1lbWJlclZhbHVlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N0cmluZ0xpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3RyaW5nTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZhNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N0cmluZ0xpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlsczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEphdmHCriBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIDMuMTAuNSBTdHJpbmcgTGl0ZXJhbHMKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nTGl0ZXJhbEV4cHIgZXh0ZW5kcyBMaXRlcmFsRXhwciB7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOworCisJcHVibGljIFN0cmluZ0xpdGVyYWxFeHByKCkgeworICAgICAgICB0aGlzLnZhbHVlID0gIiI7CisJfQorCisJcHVibGljIFN0cmluZ0xpdGVyYWxFeHByKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoIlxuIikgfHwgdmFsdWUuY29udGFpbnMoIlxyIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbGl0ZXJhbCBleHByZXNzaW9uOiBuZXdsaW5lcyAobGluZSBmZWVkIG9yIGNhcnJpYWdlIHJldHVybikgaGF2ZSB0byBiZSBlc2NhcGVkIik7CisgICAgICAgIH0KKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBTdHJpbmdMaXRlcmFsRXhwci4gRXNjYXBlcyBFT0wgY2hhcmFjdGVycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ0xpdGVyYWxFeHByIGVzY2FwZShTdHJpbmcgc3RyaW5nKSB7CisJCXJldHVybiBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoVXRpbHMuZXNjYXBlRW5kT2ZMaW5lcyhzdHJpbmcpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcihyYW5nZSk7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TdXBlckV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TdXBlckV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjVlMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N1cGVyRXhwci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3VwZXJFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gY2xhc3NFeHByOworCisJcHVibGljIFN1cGVyRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgU3VwZXJFeHByKGZpbmFsIEV4cHJlc3Npb24gY2xhc3NFeHByKSB7CisJCXNldENsYXNzRXhwcihjbGFzc0V4cHIpOworCX0KKworCXB1YmxpYyBTdXBlckV4cHIoZmluYWwgUmFuZ2UgcmFuZ2UsIGZpbmFsIEV4cHJlc3Npb24gY2xhc3NFeHByKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0Q2xhc3NFeHByKGNsYXNzRXhwcik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0Q2xhc3NFeHByKCkgeworCQlyZXR1cm4gY2xhc3NFeHByOworCX0KKworCXB1YmxpYyBTdXBlckV4cHIgc2V0Q2xhc3NFeHByKGZpbmFsIEV4cHJlc3Npb24gY2xhc3NFeHByKSB7CisJCXRoaXMuY2xhc3NFeHByID0gY2xhc3NFeHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNsYXNzRXhwcik7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UaGlzRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1RoaXNFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3ZmVkNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UaGlzRXhwci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhpc0V4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBjbGFzc0V4cHI7CisKKwlwdWJsaWMgVGhpc0V4cHIoKSB7CisJfQorCisJcHVibGljIFRoaXNFeHByKGZpbmFsIEV4cHJlc3Npb24gY2xhc3NFeHByKSB7CisJCXNldENsYXNzRXhwcihjbGFzc0V4cHIpOworCX0KKworCXB1YmxpYyBUaGlzRXhwcihmaW5hbCBSYW5nZSByYW5nZSwgZmluYWwgRXhwcmVzc2lvbiBjbGFzc0V4cHIpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRDbGFzc0V4cHIoY2xhc3NFeHByKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDbGFzc0V4cHIoKSB7CisJCXJldHVybiBjbGFzc0V4cHI7CisJfQorCisJcHVibGljIFRoaXNFeHByIHNldENsYXNzRXhwcihmaW5hbCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworCQl0aGlzLmNsYXNzRXhwciA9IGNsYXNzRXhwcjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jbGFzc0V4cHIpOworCQlyZXR1cm4gdGhpczsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UeXBlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjE0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBqdXN0IGluc3RhbnRpYXRlZCBhcyBzY29wZXMgZm9yIE1ldGhvZFJlZmVyZW5jZUV4cHIgbm9kZXMgdG8gZW5jYXBzdWxhdGUgVHlwZXMuCisgKiBAYXV0aG9yIFJhcXVlbCBQYXUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlRXhwciBleHRlbmRzIEV4cHJlc3Npb24gaW1wbGVtZW50cyBOb2RlV2l0aFR5cGU8VHlwZUV4cHI+IHsKKworICAgIHByaXZhdGUgVHlwZTw/PiB0eXBlOworCisgICAgcHVibGljIFR5cGVFeHByKCl7fQorCisgICAgcHVibGljIFR5cGVFeHByKFJhbmdlIHJhbmdlLCBUeXBlPD8+IHR5cGUpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZTw/PiBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZUV4cHIgc2V0VHlwZShUeXBlPD8+IHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjkxMDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVW5hcnlFeHByLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbmFyeUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXB1YmxpYyBlbnVtIE9wZXJhdG9yIHsKKwkJcG9zaXRpdmUsIC8vICsKKwkJbmVnYXRpdmUsIC8vIC0KKwkJcHJlSW5jcmVtZW50LCAvLyArKworCQlwcmVEZWNyZW1lbnQsIC8vIC0tCisJCW5vdCwgLy8gIQorCQlpbnZlcnNlLCAvLyB+CisJCXBvc0luY3JlbWVudCwgLy8gKysKKwkJcG9zRGVjcmVtZW50LCAvLyAtLQorCX0KKworCXByaXZhdGUgRXhwcmVzc2lvbiBleHByOworCisJcHJpdmF0ZSBPcGVyYXRvciBvcDsKKworCXB1YmxpYyBVbmFyeUV4cHIoKSB7CisJfQorCisJcHVibGljIFVuYXJ5RXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHIsIGZpbmFsIE9wZXJhdG9yIG9wKSB7CisJCXNldEV4cHIoZXhwcik7CisJCXNldE9wZXJhdG9yKG9wKTsKKwl9CisKKwlwdWJsaWMgVW5hcnlFeHByKGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBFeHByZXNzaW9uIGV4cHIsIGZpbmFsIE9wZXJhdG9yIG9wKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0RXhwcihleHByKTsKKwkJc2V0T3BlcmF0b3Iob3ApOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHIoKSB7CisJCXJldHVybiBleHByOworCX0KKworCXB1YmxpYyBPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKKwkJcmV0dXJuIG9wOworCX0KKworCXB1YmxpYyBVbmFyeUV4cHIgc2V0RXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJdGhpcy5leHByID0gZXhwcjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFVuYXJ5RXhwciBzZXRPcGVyYXRvcihmaW5hbCBPcGVyYXRvciBvcCkgeworCQl0aGlzLm9wID0gb3A7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiMGY2MgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE1vZGlmaWVyczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFZhcmlhYmxlczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMKKyAgICAgICAgTm9kZVdpdGhFbGVtZW50VHlwZTxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4sCisgICAgICAgIE5vZGVXaXRoTW9kaWZpZXJzPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiwKKyAgICAgICAgTm9kZVdpdGhBbm5vdGF0aW9uczxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4sCisgICAgICAgIE5vZGVXaXRoVmFyaWFibGVzPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiB7CisKKyAgICBwcml2YXRlIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICBwcml2YXRlIFR5cGUgZWxlbWVudFR5cGU7CisKKyAgICBwcml2YXRlIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXM7CisKKyAgICBwcml2YXRlIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGU7CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKGZpbmFsIFR5cGUgZWxlbWVudFR5cGUsIFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKKyAgICAgICAgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgICAgICBzZXRWYXJpYWJsZXMoc2luZ2xldG9uTGlzdChuZXcgVmFyaWFibGVEZWNsYXJhdG9yKHZhcmlhYmxlTmFtZSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoZmluYWwgVHlwZSBlbGVtZW50VHlwZSwgVmFyaWFibGVEZWNsYXJhdG9yIHZhcikgeworICAgICAgICBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7CisgICAgICAgIHNldFZhcmlhYmxlcyhzaW5nbGV0b25MaXN0KHZhcikpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihmaW5hbCBUeXBlIGVsZW1lbnRUeXBlLCBTdHJpbmcgdmFyaWFibGVOYW1lLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgICAgICBzZXRWYXJpYWJsZXMoc2luZ2xldG9uTGlzdChuZXcgVmFyaWFibGVEZWNsYXJhdG9yKHZhcmlhYmxlTmFtZSkpKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKEFycmF5cy5zdHJlYW0obW9kaWZpZXJzKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoZmluYWwgVHlwZSBlbGVtZW50VHlwZSwgVmFyaWFibGVEZWNsYXJhdG9yIHZhciwgTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0VmFyaWFibGVzKHNpbmdsZXRvbkxpc3QodmFyKSk7CisgICAgICAgIHNldE1vZGlmaWVycyhBcnJheXMuc3RyZWFtKG1vZGlmaWVycykKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKGZpbmFsIFR5cGUgZWxlbWVudFR5cGUsIGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgc2V0RWxlbWVudFR5cGUoZWxlbWVudFR5cGUpOworICAgICAgICBzZXRWYXJpYWJsZXModmFyaWFibGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBmaW5hbCBUeXBlIGVsZW1lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7CisgICAgICAgIHNldFZhcmlhYmxlcyh2YXJpYWJsZXMpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihmaW5hbCBSYW5nZSByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzLCBmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBlbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSkgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKTsKKyAgICAgICAgc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7CisgICAgICAgIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGNyZWF0ZShUeXBlIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIodHlwZSwgbmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgYW5ub3RhdGlvbnMgPSBlbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgICogCisgICAgICogQHNlZSBNb2RpZmllcgorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudW1TZXQ8TW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gZ2V0VmFyaWFibGVzKCkgeworICAgICAgICB2YXJpYWJsZXMgPSBlbnN1cmVOb3ROdWxsKHZhcmlhYmxlcyk7CisgICAgICAgIHJldHVybiB2YXJpYWJsZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHNldEFubm90YXRpb25zKGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBzZXRNb2RpZmllcnMoZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgc2V0RWxlbWVudFR5cGUoZmluYWwgVHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxlbWVudFR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgc2V0VmFyaWFibGVzKGZpbmFsIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFyaWFibGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkgeworICAgICAgICBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSA9IGVuc3VyZU5vdE51bGwoYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUpOworICAgICAgICByZXR1cm4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHNldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZShMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlKSB7CisgICAgICAgIHRoaXMuYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUgPSBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEFubm90YXRpb25zLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEFubm90YXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmZjcxNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQW5ub3RhdGlvbnMuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHIuKjsKKworLyoqCisgKiBBbiBlbGVtZW50IHdoaWNoIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGFubm90YXRpb25zLgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICogQHNpbmNlIEp1bHkgMjAxNAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoQW5ub3RhdGlvbnM8VD4geworICAgIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCk7CisKKyAgICBUIHNldEFubm90YXRpb25zKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKTsKKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbkV4cHJ9IGFkZGVkCisgICAgICovCisgICAgcHVibGljIGRlZmF1bHQgTm9ybWFsQW5ub3RhdGlvbkV4cHIgYWRkQW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBOb3JtYWxBbm5vdGF0aW9uRXhwciBub3JtYWxBbm5vdGF0aW9uRXhwciA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uRXhwcigKKyAgICAgICAgICAgICAgICBuYW1lKG5hbWUpLCBudWxsKTsKKyAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKS5hZGQobm9ybWFsQW5ub3RhdGlvbkV4cHIpOworICAgICAgICBub3JtYWxBbm5vdGF0aW9uRXhwci5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKTsKKyAgICAgICAgcmV0dXJuIG5vcm1hbEFubm90YXRpb25FeHByOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0CisgICAgICogCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9uRXhwcn0gYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBOb3JtYWxBbm5vdGF0aW9uRXhwciBhZGRBbm5vdGF0aW9uKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBjbGF6eikgeworICAgICAgICAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KGNsYXp6KTsKKyAgICAgICAgcmV0dXJuIGFkZEFubm90YXRpb24oY2xhenouZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0ZXMgdGhpcyB3aXRoIGEgbWFya2VyIGFubm90YXRpb24KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBkZWZhdWx0IFQgYWRkTWFya2VyQW5ub3RhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBNYXJrZXJBbm5vdGF0aW9uRXhwciBtYXJrZXJBbm5vdGF0aW9uRXhwciA9IG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcigKKyAgICAgICAgICAgICAgICBuYW1lKG5hbWUpKTsKKyAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKS5hZGQobWFya2VyQW5ub3RhdGlvbkV4cHIpOworICAgICAgICBtYXJrZXJBbm5vdGF0aW9uRXhwci5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIHdpdGggYSBtYXJrZXIgYW5ub3RhdGlvbiBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydAorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBUIGFkZE1hcmtlckFubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGNsYXp6KSB7CisgICAgICAgICgoTm9kZSkgdGhpcykudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoY2xhenopOworICAgICAgICByZXR1cm4gYWRkTWFya2VyQW5ub3RhdGlvbihjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRlcyB0aGlzIHdpdGggYSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUsIGRvbid0IGZvcmdldCB0byBhZGQgXCJcIiBmb3IgYSBzdHJpbmcgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZGVmYXVsdCBUIGFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciA9IG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcigKKyAgICAgICAgICAgICAgICBuYW1lKG5hbWUpLCBuYW1lKHZhbHVlKSk7CisgICAgICAgIGdldEFubm90YXRpb25zKCkuYWRkKHNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKTsKKyAgICAgICAgc2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0ZXMgdGhpcyB3aXRoIGEgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0CisgICAgICogCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUsIGRvbid0IGZvcmdldCB0byBhZGQgXCJcIiBmb3IgYSBzdHJpbmcgdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBUIGFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgKChOb2RlKSB0aGlzKS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7CisgICAgICAgIHJldHVybiBhZGRTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGNsYXp6LmdldFNpbXBsZU5hbWUoKSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgYW4gYW5ub3RhdGlvbiB3aXRoIHRoaXMgbmFtZSBpcyBwcmVzZW50IG9uIHRoaXMgZWxlbWVudAorICAgICAqIAorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmb3VuZCwgZmFsc2UgaWYgbm90CisgICAgICovCisgICAgcHVibGljIGRlZmF1bHQgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnMoKS5zdHJlYW0oKS5hbnlNYXRjaChhIC0+IGEuZ2V0TmFtZSgpLmdldE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIGFuIGFubm90YXRpb24gd2l0aCB0aGlzIGNsYXNzIGlzIHByZXNlbnQgb24gdGhpcyBlbGVtZW50CisgICAgICogCisgICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQsIGZhbHNlIGlmIG5vdAorICAgICAqLworICAgIHB1YmxpYyBkZWZhdWx0IGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7CisgICAgICAgIHJldHVybiBpc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGFuIGFubm90YXRpb24gYnkgaXRzIG5hbWUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLCB0aGUgYW5ub3RhdGlvbiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBBbm5vdGF0aW9uRXhwciBnZXRBbm5vdGF0aW9uQnlOYW1lKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoYSAtPiBhLmdldE5hbWUoKS5nZXROYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkuZmluZEZpcnN0KCkKKyAgICAgICAgICAgICAgICAub3JFbHNlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGFuIGFubm90YXRpb24gYnkgaXRzIGNsYXNzCisgICAgICogCisgICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIGFubm90YXRpb24KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLCB0aGUgYW5ub3RhdGlvbiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBBbm5vdGF0aW9uRXhwciBnZXRBbm5vdGF0aW9uQnlDbGFzcyhDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7CisgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uQnlOYW1lKGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQmxvY2tTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEJsb2NrU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTMxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEJsb2NrU3RtdC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKKworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aEJsb2NrU3RtdDxUPiB7CisgICAgQmxvY2tTdG10IGdldEJvZHkoKTsKKworICAgIFQgc2V0Qm9keShCbG9ja1N0bXQgYmxvY2spOworCisgICAgZGVmYXVsdCBCbG9ja1N0bXQgY3JlYXRlQm9keSgpIHsKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrID0gbmV3IEJsb2NrU3RtdCgpOworICAgICAgICBzZXRCb2R5KGJsb2NrKTsKKyAgICAgICAgYmxvY2suc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisKKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQm9keS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhCb2R5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkZmU4NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoQm9keS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoQm9keTxUPiB7CisgICAgcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCk7CisKKyAgICBwdWJsaWMgVCBzZXRCb2R5KGZpbmFsIFN0YXRlbWVudCBib2R5KTsKKworICAgIHB1YmxpYyBkZWZhdWx0IEJsb2NrU3RtdCBjcmVhdGVCbG9ja1N0YXRlbWVudEFzQm9keSgpIHsKKyAgICAgICAgQmxvY2tTdG10IGIgPSBuZXcgQmxvY2tTdG10KCk7CisgICAgICAgIGIuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHNldEJvZHkoYik7CisgICAgICAgIHJldHVybiBiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVkMjhkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCisvKioKKyAqIEVsZW1lbnQgd2l0aCBhIGRlY2xhcmF0aW9uIHJlcHJlc2VudGFibGUgYXMgYSBTdHJpbmcuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKiBAc2luY2UgSnVseSAyMDE0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhEZWNsYXJhdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBBcyB7QGxpbmsgTm9kZVdpdGhEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pfSBpbmNsdWRpbmcKKyAgICAgKiB0aGUgbW9kaWZpZXJzLCB0aGUgdGhyb3dzIGNsYXVzZSBhbmQgdGhlIHBhcmFtZXRlcnMgd2l0aCBib3RoIHR5cGUgYW5kIG5hbWUuCisgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZygpOworCisgICAgLyoqCisgICAgICogQXMge0BsaW5rIE5vZGVXaXRoRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuLCBib29sZWFuLCBib29sZWFuKX0gaW5jbHVkaW5nCisgICAgICogdGhlIHBhcmFtZXRlcnMgd2l0aCBib3RoIHR5cGUgYW5kIG5hbWUuCisgICAgICogQHBhcmFtIGluY2x1ZGluZ01vZGlmaWVycyBmbGFnIHRvIGluY2x1ZGUgdGhlIG1vZGlmaWVycyAoaWYgcHJlc2VudCkgaW4gdGhlIHN0cmluZyBwcm9kdWNlZAorICAgICAqIEBwYXJhbSBpbmNsdWRpbmdUaHJvd3MgZmxhZyB0byBpbmNsdWRlIHRoZSB0aHJvd3MgY2xhdXNlIChpZiBwcmVzZW50KSBpbiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGVjbGFyYXRpb24gYmFzZWQgb24gcGFyYW1ldGVyIGZsYWdzCisgICAgICovCisgICAgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzKTsKKworICAgIC8qKgorICAgICAqIEEgc2ltcGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uLgorICAgICAqIEl0IHNob3VsZCBmaXQgb25lIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gaW5jbHVkaW5nTW9kaWZpZXJzIGZsYWcgdG8gaW5jbHVkZSB0aGUgbW9kaWZpZXJzIChpZiBwcmVzZW50KSBpbiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHBhcmFtIGluY2x1ZGluZ1Rocm93cyBmbGFnIHRvIGluY2x1ZGUgdGhlIHRocm93cyBjbGF1c2UgKGlmIHByZXNlbnQpIGluIHRoZSBzdHJpbmcgcHJvZHVjZWQKKyAgICAgKiBAcGFyYW0gaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSBmbGFnIHRvIGluY2x1ZGUgdGhlIHBhcmFtZXRlciBuYW1lICh3aGlsZSB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgYWx3YXlzIGluY2x1ZGVkKSBpbiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGVjbGFyYXRpb24gYmFzZWQgb24gcGFyYW1ldGVyIGZsYWdzCisgICAgICovCisgICAgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzLCBib29sZWFuIGluY2x1ZGluZ1BhcmFtZXRlck5hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFbGVtZW50VHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhFbGVtZW50VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTQxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEVsZW1lbnRUeXBlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFycmF5QnJhY2tldFBhaXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIG5vZGUgaGF2aW5nIGFuIGVsZW1lbnQgdHlwZS4KKyAqIEluIG1vc3QgY2FzZXMsIHRoZSBlbGVtZW50IHR5cGUgaXMgc2ltcGx5IHRoZSB0eXBlLgorICogSW4gY2FzZSBvZiBhcnJheXMsIHRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIHR5cGUgdGhhdCBpcyBpbnNpZGUgdGhlIGRlZXBlc3QgbmVzdGluZzoKKyAqIGZvciBpbnRbXVtdW10sIHRoZSBlbGVtZW50IHR5cGUgaXMgaW50LgorICoKKyAqIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBpbnRlcmZhY2UgaXMgdG8gcGVybWl0IHVzZXJzIHRvIG1hbmlwdWxhdGUgaG9tb2dlbmVvdXNseSBhbGwgbm9kZXMgd2l0aCBnZXRFbGVtZW50VHlwZS9zZXRFbGVtZW50VHlwZQorICogbWV0aG9kcworICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoRWxlbWVudFR5cGU8VD4geworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZQorICAgICAqLworICAgIFR5cGU8Pz4gZ2V0RWxlbWVudFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZSB0aGUgZWxlbWVudCBlbGVtZW50VHlwZQorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIFQgc2V0RWxlbWVudFR5cGUoVHlwZTw/PiBlbGVtZW50VHlwZSk7CisKKyAgICBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpOworCisgICAgVCBzZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdHlwZSB0byB0aGlzIGNsYXNzIGFuZCB0cnkgdG8gaW1wb3J0IGl0IHRvIHRoZSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSBpZiBuZWVkZWQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZUNsYXNzIHRoZSB0eXBlCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgZGVmYXVsdCBUIHNldEVsZW1lbnRUeXBlKENsYXNzPD8+IHR5cGVDbGFzcykgeworICAgICAgICAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KHR5cGVDbGFzcyk7CisgICAgICAgIHJldHVybiBzZXRFbGVtZW50VHlwZShuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUodHlwZUNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIGRlZmF1bHQgVCBzZXRFbGVtZW50VHlwZShmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBjbGFzc09ySW50ZXJmYWNlVHlwZSA9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSh0eXBlKTsKKyAgICAgICAgcmV0dXJuIHNldEVsZW1lbnRUeXBlKGNsYXNzT3JJbnRlcmZhY2VUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEV4dGVuZHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoRXh0ZW5kcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2ZjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEV4dGVuZHMuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoRXh0ZW5kczxUPiB7CisgICAgcHVibGljIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldEV4dGVuZHMoKTsKKworICAgIHB1YmxpYyBUIHNldEV4dGVuZHMoZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kc0xpc3QpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV4dGVuZHMgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydAorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3MgdG8gZXh0YW5kIGZyb20KKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZGVmYXVsdCBUIGFkZEV4dGVuZHMoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgKChOb2RlKSB0aGlzKS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7CisgICAgICAgIHJldHVybiBhZGRFeHRlbmRzKGNsYXp6LmdldFNpbXBsZU5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGV4dGVuZHMgdG8gdGhpcworICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGV4dGVuZHMgZnJvbQorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBkZWZhdWx0IFQgYWRkRXh0ZW5kcyhTdHJpbmcgbmFtZSkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBjbGFzc09ySW50ZXJmYWNlVHlwZSA9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShuYW1lKTsKKyAgICAgICAgZ2V0RXh0ZW5kcygpLmFkZChjbGFzc09ySW50ZXJmYWNlVHlwZSk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhJbXBsZW1lbnRzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEltcGxlbWVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjUxOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhJbXBsZW1lbnRzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKKworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aEltcGxlbWVudHM8VD4geworICAgIHB1YmxpYyBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBnZXRJbXBsZW1lbnRzKCk7CisKKyAgICBwdWJsaWMgVCBzZXRJbXBsZW1lbnRzKExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0KTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbXBsZW1lbnRzIHRvIHRoaXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdHlwZSB0byBleHRlbmRzIGZyb20KKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZGVmYXVsdCBUIGFkZEltcGxlbWVudHMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZVR5cGUgY2xhc3NPckludGVyZmFjZVR5cGUgPSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUobmFtZSk7CisgICAgICAgIGdldEltcGxlbWVudHMoKS5hZGQoY2xhc3NPckludGVyZmFjZVR5cGUpOworICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZS5zZXRQYXJlbnROb2RlKChOb2RlKSB0aGlzKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbXBsZW1lbnRzIHRvIHRoaXMgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbXBvcnQKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhenogdGhlIHR5cGUgdG8gaW1wbGVtZW50cyBmcm9tCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgcHVibGljIGRlZmF1bHQgVCBhZGRJbXBsZW1lbnRzKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgICgoTm9kZSkgdGhpcykudHJ5QWRkSW1wb3J0VG9QYXJlbnRDb21waWxhdGlvblVuaXQoY2xhenopOworICAgICAgICByZXR1cm4gYWRkSW1wbGVtZW50cyhjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoSmF2YURvYy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhKYXZhRG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwY2ZmYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoSmF2YURvYy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKKworLyoqCisgKiBOb2RlIHdoaWNoIGNhbiBiZSBkb2N1bWVudGVkIHRocm91Z2ggYSBKYXZhZG9jIGNvbW1lbnQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhKYXZhRG9jPFQ+IHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBKYXZhRG9jIGZvciB0aGlzIG5vZGUuIFlvdSBjYW4gc2V0IHRoZSBKYXZhRG9jIGJ5IGNhbGxpbmcgc2V0Q29tbWVudCB3aXRoIGEgSmF2YWRvY0NvbW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBKYXZhRG9jIGZvciB0aGlzIG5vZGUgaWYgaXQgZXhpc3RzLCBudWxsIGlmIGl0IGRvZXNuJ3QuCisgICAgICovCisgICAgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpOworCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZGVmYXVsdCBUIHNldEphdmFEb2NDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgICgoTm9kZSkgdGhpcykuc2V0Q29tbWVudChuZXcgSmF2YWRvY0NvbW1lbnQoY29tbWVudCkpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNZW1iZXJzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE1lbWJlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdlNWVkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNZW1iZXJzLmphdmEKQEAgLTAsMCArMSwyODQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlZvaWRUeXBlLlZPSURfVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0NvbGxlY3Rpb247CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b1NldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworCisvKioKKyAqIEEgbm9kZSBoYXZpbmcgbWVtYmVycy4KKyAqCisgKiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgaW50ZXJmYWNlIGlzIHRvIHBlcm1pdCB1c2VycyB0byBtYW5pcHVsYXRlIGhvbW9nZW5lb3VzbHkgYWxsIG5vZGVzIHdpdGggYSBnZXRNZW1iZXJzCisgKiBtZXRob2QuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoTWVtYmVyczxUPiB7CisgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGdldE1lbWJlcnMoKTsKKworICAgIFQgc2V0TWVtYmVycyhMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycyk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGlzIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0IG9mIHRoZSB0eXBlIGlmIG5lZWRlZAorICAgICAqCisgICAgICogQHBhcmFtIHR5cGVDbGFzcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkCisgICAgICovCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZEZpZWxkKENsYXNzPD8+IHR5cGVDbGFzcywgU3RyaW5nIG5hbWUsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgeworICAgICAgICAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KHR5cGVDbGFzcyk7CisgICAgICAgIHJldHVybiBhZGRGaWVsZCh0eXBlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBuYW1lLCBtb2RpZmllcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpZWxkIHRvIHRoaXMKKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVycyBsaWtlIHtAbGluayBNb2RpZmllciNQVUJMSUN9CisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkRmllbGQoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSh0eXBlKSwgbmFtZSwgbW9kaWZpZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGlzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZmllbGQKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkCisgICAgICovCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZEZpZWxkKFR5cGU8Pz4gdHlwZSwgU3RyaW5nIG5hbWUsIE1vZGlmaWVyLi4uIG1vZGlmaWVycykgeworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBuZXcgRmllbGREZWNsYXJhdGlvbigpOworICAgICAgICBmaWVsZERlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyaWFibGUgPSBuZXcgVmFyaWFibGVEZWNsYXJhdG9yKG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChuYW1lKSk7CisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkuYWRkKHZhcmlhYmxlKTsKKyAgICAgICAgdmFyaWFibGUuc2V0UGFyZW50Tm9kZShmaWVsZERlY2xhcmF0aW9uKTsKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKTsKKyAgICAgICAgdmFyaWFibGUuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgZ2V0TWVtYmVycygpLmFkZChmaWVsZERlY2xhcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHJpdmF0ZSBmaWVsZCB0byB0aGlzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZUNsYXNzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkCisgICAgICovCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZFByaXZhdGVGaWVsZChDbGFzczw/PiB0eXBlQ2xhc3MsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRGaWVsZCh0eXBlQ2xhc3MsIG5hbWUsIE1vZGlmaWVyLlBSSVZBVEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHByaXZhdGUgZmllbGQgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydCBvZiB0aGUgdHlwZSBpZgorICAgICAqIG5lZWRlZAorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHJpdmF0ZUZpZWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYWRkRmllbGQodHlwZSwgbmFtZSwgTW9kaWZpZXIuUFJJVkFURSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcHVibGljIGZpZWxkIHRvIHRoaXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZUNsYXNzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkCisgICAgICovCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZFB1YmxpY0ZpZWxkKENsYXNzPD8+IHR5cGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHR5cGVDbGFzcywgbmFtZSwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwdWJsaWMgZmllbGQgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydCBvZiB0aGUgdHlwZSBpZgorICAgICAqIG5lZWRlZAorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHVibGljRmllbGQoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRGaWVsZCh0eXBlLCBuYW1lLCBNb2RpZmllci5QVUJMSUMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3RlY3RlZCBmaWVsZCB0byB0aGlzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZUNsYXNzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkCisgICAgICovCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGFkZFByb3RlY3RlZEZpZWxkKENsYXNzPD8+IHR5cGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKHR5cGVDbGFzcywgbmFtZSwgTW9kaWZpZXIuUFJPVEVDVEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm90ZWN0ZWQgZmllbGQgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydCBvZiB0aGUgdHlwZQorICAgICAqIGlmIG5lZWRlZAorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IEZpZWxkRGVjbGFyYXRpb24gYWRkUHJvdGVjdGVkRmllbGQoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBhZGRGaWVsZCh0eXBlLCBuYW1lLCBNb2RpZmllci5QUk9URUNURUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBtZXRob2RzIHdpdGggdm9pZCByZXR1cm4gYnkgZGVmYXVsdCB0byB0aGlzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIG5hbWUKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gY3JlYXRlZAorICAgICAqLworICAgIGRlZmF1bHQgTWV0aG9kRGVjbGFyYXRpb24gYWRkTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBNb2RpZmllci4uLiBtb2RpZmllcnMpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uc2V0TmFtZShtZXRob2ROYW1lKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uc2V0VHlwZShWT0lEX1RZUEUpOworICAgICAgICBtZXRob2REZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoQXJyYXlzLnN0cmVhbShtb2RpZmllcnMpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9Db2xsZWN0aW9uKCgpIC0+IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSkpKTsKKyAgICAgICAgZ2V0TWVtYmVycygpLmFkZChtZXRob2REZWNsYXJhdGlvbik7CisgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpOworICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbnN0cnVjdG9yIHRvIHRoaXMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gY3JlYXRlZAorICAgICAqLworICAgIGRlZmF1bHQgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBhZGRDdG9yKE1vZGlmaWVyLi4uIG1vZGlmaWVycykgeworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhBcnJheXMuc3RyZWFtKG1vZGlmaWVycykKKyAgICAgICAgICAgICAgICAuY29sbGVjdCh0b0NvbGxlY3Rpb24oKCkgLT4gRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKSkpOworICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLnNldE5hbWUoKChUeXBlRGVjbGFyYXRpb248Pz4pIHRoaXMpLmdldE5hbWUoKSk7CisgICAgICAgIGdldE1lbWJlcnMoKS5hZGQoY29uc3RydWN0b3JEZWNsYXJhdGlvbik7CisgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uOworICAgIH0KKworICAgIGRlZmF1bHQgQmxvY2tTdG10IGFkZEluaXRpYWxpemVyKCkgeworICAgICAgICBCbG9ja1N0bXQgYmxvY2sgPSBuZXcgQmxvY2tTdG10KCk7CisgICAgICAgIEluaXRpYWxpemVyRGVjbGFyYXRpb24gaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiA9IG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKGZhbHNlLCBibG9jayk7CisgICAgICAgIGdldE1lbWJlcnMoKS5hZGQoaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbik7CisgICAgICAgIGluaXRpYWxpemVyRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisKKyAgICBkZWZhdWx0IEJsb2NrU3RtdCBhZGRTdGF0aWNJbml0aWFsaXplcigpIHsKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrID0gbmV3IEJsb2NrU3RtdCgpOworICAgICAgICBJbml0aWFsaXplckRlY2xhcmF0aW9uIGluaXRpYWxpemVyRGVjbGFyYXRpb24gPSBuZXcgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbih0cnVlLCBibG9jayk7CisgICAgICAgIGdldE1lbWJlcnMoKS5hZGQoaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbik7CisgICAgICAgIGluaXRpYWxpemVyRGVjbGFyYXRpb24uc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZmluZCBhIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gYnkgaXRzIG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2RzIGZvdW5kIChtdWx0aXBsZSBpbiBjYXNlIG9mIHBvbHltb3JwaGlzbSkKKyAgICAgKi8KKyAgICBkZWZhdWx0IExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGdldE1ldGhvZHNCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldE1lbWJlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gJiYgKChNZXRob2REZWNsYXJhdGlvbikgbSkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICAubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5jb2xsZWN0KHRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFsbCBtZXRob2RzIGluIHRoZSBtZW1iZXJzIG9mIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZHMgZm91bmQuIFRoaXMgbGlzdCBpcyBpbW11dGFibGUuCisgICAgICovCisgICAgZGVmYXVsdCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gdW5tb2RpZmlhYmxlTGlzdChnZXRNZW1iZXJzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKQorICAgICAgICAgICAgICAgIC5tYXAobSAtPiAoTWV0aG9kRGVjbGFyYXRpb24pIG0pCisgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZmluZCBhIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gYnkgaXRzIHBhcmFtZXRlcnMgdHlwZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzIHRoZSB0eXBlcyBvZiBwYXJhbWV0ZXJzIGxpa2UgIk1hcCZsdDtJbnRlZ2VyLFN0cmluZyZndDsiLCJpbnQiIHRvIG1hdGNoPGJyPgorICAgICAqICAgICAgICAgICAgdm9pZCBmb28oTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyBteU1hcCxpbnQgbnVtYmVyKQorICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZHMgZm91bmQgKG11bHRpcGxlIGluIGNhc2Ugb2YgcG9seW1vcnBoaXNtKQorICAgICAqLworICAgIGRlZmF1bHQgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gZ2V0TWV0aG9kc0J5UGFyYW1ldGVyVHlwZXMoU3RyaW5nLi4uIHBhcmFtVHlwZXMpIHsKKyAgICAgICAgcmV0dXJuIGdldE1lbWJlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICYmICgoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKS5tYXAocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdCh0b1NldCgpKS5lcXVhbHMoU3RyZWFtLm9mKHBhcmFtVHlwZXMpLmNvbGxlY3QodG9TZXQoKSkpKQorICAgICAgICAgICAgICAgIC5tYXAobSAtPiAoTWV0aG9kRGVjbGFyYXRpb24pIG0pLmNvbGxlY3QodG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBieSBpdHMgcGFyYW1ldGVycyB0eXBlcworICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtVHlwZXMgdGhlIHR5cGVzIG9mIHBhcmFtZXRlcnMgbGlrZSAiTWFwJmx0O0ludGVnZXIsU3RyaW5nJmd0OyIsImludCIgdG8gbWF0Y2g8YnI+CisgICAgICogICAgICAgICAgICB2b2lkIGZvbyhNYXAmbHQ7SW50ZWdlcixTdHJpbmcmZ3Q7IG15TWFwLGludCBudW1iZXIpCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kcyBmb3VuZCAobXVsdGlwbGUgaW4gY2FzZSBvZiBwb2x5bW9ycGhpc20pCisgICAgICovCisgICAgZGVmYXVsdCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2RzQnlQYXJhbWV0ZXJUeXBlcyhDbGFzczw/Pi4uLiBwYXJhbVR5cGVzKSB7CisgICAgICAgIHJldHVybiBnZXRNZW1iZXJzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKG0gLT4gbSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkubWFwKHAgLT4gcC5nZXRUeXBlKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QodG9TZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhTdHJlYW0ub2YocGFyYW1UeXBlcykubWFwKENsYXNzOjpnZXRTaW1wbGVOYW1lKS5jb2xsZWN0KHRvU2V0KCkpKSkKKyAgICAgICAgICAgICAgICAubWFwKG0gLT4gKE1ldGhvZERlY2xhcmF0aW9uKSBtKS5jb2xsZWN0KHRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZmluZCBhIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBieSBpdHMgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICogQHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCwgdGhlIEZpZWxkRGVjbGFyYXRpb24gb3RoZXJ3aXNlCisgICAgICovCisgICAgZGVmYXVsdCBGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoRmllbGREZWNsYXJhdGlvbikgZ2V0TWVtYmVycygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihtIC0+IG0gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uICYmICgoRmllbGREZWNsYXJhdGlvbikgbSkuZ2V0VmFyaWFibGVzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaCh2YXIgLT4gdmFyLmdldElkKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkpCisgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKwkgKiBGaW5kIGFsbCBmaWVsZHMgaW4gdGhlIG1lbWJlcnMgb2YgdGhpcyBub2RlLgorICAgICAqCisJICogQHJldHVybiB0aGUgZmllbGRzIGZvdW5kLiBUaGlzIGxpc3QgaXMgaW1tdXRhYmxlLgorICAgICAqLworICAgIGRlZmF1bHQgTGlzdDxGaWVsZERlY2xhcmF0aW9uPiBnZXRGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiB1bm1vZGlmaWFibGVMaXN0KGdldE1lbWJlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobSAtPiBtIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbiApCisgICAgICAgICAgICAgICAgLm1hcChtIC0+IChGaWVsZERlY2xhcmF0aW9uKSBtKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KHRvTGlzdCgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNb2RpZmllcnMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTW9kaWZpZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExOTU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTW9kaWZpZXJzLmphdmEKQEAgLTAsMCArMSw3MyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKKworLyoqCisgKiBBIE5vZGUgd2l0aCBNb2RpZmllcnMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhNb2RpZmllcnM8VD4geworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlIE1vZGlmaWVyCisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBFbnVtU2V0PE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKTsKKworICAgIFQgc2V0TW9kaWZpZXJzKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyk7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IFQgYWRkTW9kaWZpZXIoTW9kaWZpZXIuLi4gbW9kaWZpZXJzKSB7CisgICAgICAgIGdldE1vZGlmaWVycygpLmFkZEFsbChBcnJheXMuc3RyZWFtKG1vZGlmaWVycykKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbigoKSAtPiBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpKSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5TVEFUSUMpOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc0Fic3RyYWN0KCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuQUJTVFJBQ1QpOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc0ZpbmFsKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc05hdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLk5BVElWRSk7CisgICAgfQorCisgICAgZGVmYXVsdCBib29sZWFuIGlzUHJpdmF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBSSVZBVEUpOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBST1RFQ1RFRCk7CisgICAgfQorCisgICAgZGVmYXVsdCBib29sZWFuIGlzUHVibGljKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKTsKKyAgICB9CisKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNTdHJpY3RmcCgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlNUUklDVEZQKTsKKyAgICB9CisKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5TWU5DSFJPTklaRUQpOworICAgIH0KKworICAgIGRlZmF1bHQgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlRSQU5TSUVOVCk7CisgICAgfQorCisgICAgZGVmYXVsdCBib29sZWFuIGlzVm9sYXRpbGUoKSB7CisgICAgICAgIHJldHVybiBnZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5WT0xBVElMRSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTmFtZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjZmY1YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoTmFtZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCisvKioKKyAqIEEgbm9kZSBoYXZpbmcgYSBuYW1lLgorICogIAorICogVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGludGVyZmFjZSBpcyB0byBwZXJtaXQgdXNlcnMgdG8gbWFuaXB1bGF0ZSBob21vZ2VuZW91c2x5IGFsbCBub2RlcyB3aXRoIGEgZ2V0TmFtZSBtZXRob2QuCisgKiAKKyAqIEBzaW5jZSAyLjAuMSAKKyAqLworcHVibGljIGludGVyZmFjZSBOb2RlV2l0aE5hbWU8VD4geworICAgIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICBUIHNldE5hbWUoU3RyaW5nIG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhQYXJhbWV0ZXJzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFBhcmFtZXRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg2OTdmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhQYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhQYXJhbWV0ZXJzPFQ+IHsKKyAgICBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpOworCisgICAgVCBzZXRQYXJhbWV0ZXJzKExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzKTsKKworICAgIGRlZmF1bHQgVCBhZGRQYXJhbWV0ZXIoVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIodHlwZSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKG5hbWUpKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBUIGFkZFBhcmFtZXRlcihDbGFzczw/PiBwYXJhbUNsYXNzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KHBhcmFtQ2xhc3MpOworICAgICAgICByZXR1cm4gYWRkUGFyYW1ldGVyKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShwYXJhbUNsYXNzLmdldFNpbXBsZU5hbWUoKSksIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbWVtYmVyIHRvIGltcG9ydCB0aGUgY2xhc3MgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgeW91cnNlbGYKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcywgZXggOiBvcmcudGVzdC5Gb28gb3IgRm9vIGlmIHlvdSBhZGRlZCBtYW51YWxseSB0aGUgaW1wb3J0CisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqLworICAgIGRlZmF1bHQgVCBhZGRQYXJhbWV0ZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZFBhcmFtZXRlcihuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoY2xhc3NOYW1lKSwgbmFtZSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgZGVmYXVsdCBUIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIGdldFBhcmFtZXRlcnMoKS5hZGQocGFyYW1ldGVyKTsKKyAgICAgICAgcGFyYW1ldGVyLnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgZGVmYXVsdCBQYXJhbWV0ZXIgYWRkQW5kR2V0UGFyYW1ldGVyKFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEFuZEdldFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKHR5cGUsIG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChuYW1lKSkpOworICAgIH0KKworICAgIGRlZmF1bHQgUGFyYW1ldGVyIGFkZEFuZEdldFBhcmFtZXRlcihDbGFzczw/PiBwYXJhbUNsYXNzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KHBhcmFtQ2xhc3MpOworICAgICAgICByZXR1cm4gYWRkQW5kR2V0UGFyYW1ldGVyKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShwYXJhbUNsYXNzLmdldFNpbXBsZU5hbWUoKSksIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbWVtYmVyIHRvIGltcG9ydCB0aGUgY2xhc3MgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgeW91cnNlbGYKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcywgZXggOiBvcmcudGVzdC5Gb28gb3IgRm9vIGlmIHlvdSBhZGRlZCBtYW51YWxseSB0aGUgaW1wb3J0CisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBQYXJhbWV0ZXJ9IGNyZWF0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IFBhcmFtZXRlciBhZGRBbmRHZXRQYXJhbWV0ZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEFuZEdldFBhcmFtZXRlcihuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUoY2xhc3NOYW1lKSwgbmFtZSk7CisgICAgfQorCisgICAgZGVmYXVsdCBQYXJhbWV0ZXIgYWRkQW5kR2V0UGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgZ2V0UGFyYW1ldGVycygpLmFkZChwYXJhbWV0ZXIpOworICAgICAgICBwYXJhbWV0ZXIuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGZpbmQgYSB7QGxpbmsgUGFyYW1ldGVyfSBieSBpdHMgbmFtZQorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwYXJhbQorICAgICAqIEByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQsIHRoZSBwYXJhbSBmb3VuZCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBkZWZhdWx0IFBhcmFtZXRlciBnZXRQYXJhbUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihwIC0+IHAuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIFBhcmFtZXRlcn0gYnkgaXRzIHR5cGUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW0KKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLCB0aGUgcGFyYW0gZm91bmQgb3RoZXJ3aXNlCisgICAgICovCisgICAgZGVmYXVsdCBQYXJhbWV0ZXIgZ2V0UGFyYW1CeVR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpLmVxdWFscyh0eXBlKSkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBmaW5kIGEge0BsaW5rIFBhcmFtZXRlcn0gYnkgaXRzIHR5cGUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW0gPGI+dGFrZSBjYXJlIGFib3V0IGdlbmVyaWNzLCBpdCB3b250IHdvcms8L2I+CisgICAgICogQHJldHVybiBudWxsIGlmIG5vdCBmb3VuZCwgdGhlIHBhcmFtIGZvdW5kIG90aGVyd2lzZQorICAgICAqLworICAgIGRlZmF1bHQgUGFyYW1ldGVyIGdldFBhcmFtQnlUeXBlKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIocCAtPiBwLmdldFR5cGUoKS50b1N0cmluZygpLmVxdWFscyh0eXBlLmdldFNpbXBsZU5hbWUoKSkpLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFN0YXRlbWVudHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoU3RhdGVtZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Yzg5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFN0YXRlbWVudHMuamF2YQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoU3RhdGVtZW50czxUPiB7CisgICAgcHVibGljIExpc3Q8U3RhdGVtZW50PiBnZXRTdG10cygpOworCisgICAgcHVibGljIFQgc2V0U3RtdHMoZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzKTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBkZWZhdWx0IFQgYWRkU3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgZ2V0U3RtdHMoKS5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgc3RhdGVtZW50LnNldFBhcmVudE5vZGUoKE5vZGUpIHRoaXMpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGRlZmF1bHQgVCBhZGRTdGF0ZW1lbnQoaW50IGluZGV4LCBmaW5hbCBTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIGdldFN0bXRzKCkuYWRkKGluZGV4LCBzdGF0ZW1lbnQpOworICAgICAgICBzdGF0ZW1lbnQuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgZGVmYXVsdCBUIGFkZFN0YXRlbWVudChFeHByZXNzaW9uIGV4cHIpIHsKKyAgICAgICAgRXhwcmVzc2lvblN0bXQgc3RhdGVtZW50ID0gbmV3IEV4cHJlc3Npb25TdG10KGV4cHIpOworICAgICAgICBleHByLnNldFBhcmVudE5vZGUoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0dXJuIGFkZFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgIH0KKworICAgIHB1YmxpYyBkZWZhdWx0IFQgYWRkU3RhdGVtZW50KFN0cmluZyBzdGF0ZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGFkZFN0YXRlbWVudChuZXcgTmFtZUV4cHIoc3RhdGVtZW50KSk7CisgICAgfQorCisgICAgcHVibGljIGRlZmF1bHQgVCBhZGRTdGF0ZW1lbnQoaW50IGluZGV4LCBmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKyAgICAgICAgU3RhdGVtZW50IHN0bXQgPSBuZXcgRXhwcmVzc2lvblN0bXQoZXhwcik7CisgICAgICAgIGV4cHIuc2V0UGFyZW50Tm9kZShzdG10KTsKKyAgICAgICAgcmV0dXJuIGFkZFN0YXRlbWVudChpbmRleCwgc3RtdCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFRocm93YWJsZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUaHJvd2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWVlOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUaHJvd2FibGUuamF2YQpAQCAtMCwwICsxLDU3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5SZWZlcmVuY2VUeXBlOworCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVGhyb3dhYmxlPFQ+IHsKKyAgICBUIHNldFRocm93cyhMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93c18pOworCisgICAgTGlzdDxSZWZlcmVuY2VUeXBlPiBnZXRUaHJvd3MoKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhpcyB0eXBlIHRvIHRoZSB0aHJvd3MgY2xhdXNlCisgICAgICogCisgICAgICogQHBhcmFtIHRocm93VHlwZSB0aGUgZXhjZXB0aW9uIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBkZWZhdWx0IFQgYWRkVGhyb3dzKFJlZmVyZW5jZVR5cGUgdGhyb3dUeXBlKSB7CisgICAgICAgIGdldFRocm93cygpLmFkZCh0aHJvd1R5cGUpOworICAgICAgICB0aHJvd1R5cGUuc2V0UGFyZW50Tm9kZSgoTm9kZSkgdGhpcyk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoaXMgY2xhc3MgdG8gdGhlIHRocm93cyBjbGF1c2UKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhenogdGhlIGV4Y2VwdGlvbiBjbGFzcworICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIGRlZmF1bHQgVCBhZGRUaHJvd3MoQ2xhc3M8PyBleHRlbmRzIFRocm93YWJsZT4gY2xhenopIHsKKyAgICAgICAgKChOb2RlKSB0aGlzKS50cnlBZGRJbXBvcnRUb1BhcmVudENvbXBpbGF0aW9uVW5pdChjbGF6eik7CisgICAgICAgIHJldHVybiBhZGRUaHJvd3MobmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKGNsYXp6LmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyBlbGVtZW50cyB0aHJvd3MgdGhpcyBleGNlcHRpb24gY2xhc3MKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQgaW4gdGhyb3dzIGNsYXVzZSwgZmFsc2UgaWYgbm90CisgICAgICovCisgICAgcHVibGljIGRlZmF1bHQgYm9vbGVhbiBpc1Rocm93cyhDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBjbGF6eikgeworICAgICAgICByZXR1cm4gaXNUaHJvd3MoY2xhenouZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgZWxlbWVudHMgdGhyb3dzIHRoaXMgZXhjZXB0aW9uIGNsYXNzCisgICAgICogCisgICAgICogQHBhcmFtIHRocm93YWJsZU5hbWUgdGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQgaW4gdGhyb3dzIGNsYXVzZSwgZmFsc2UgaWYgbm90CisgICAgICovCisgICAgcHVibGljIGRlZmF1bHQgYm9vbGVhbiBpc1Rocm93cyhTdHJpbmcgdGhyb3dhYmxlTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0VGhyb3dzKCkuc3RyZWFtKCkuYW55TWF0Y2godCAtPiB0LnRvU3RyaW5nKCkuZXF1YWxzKHRocm93YWJsZU5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTgzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFR5cGUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CisKKy8qKgorICogQSBub2RlIGhhdmluZyBhIHR5cGUuCisgKgorICogVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGludGVyZmFjZSBpcyB0byBwZXJtaXQgdXNlcnMgdG8gbWFuaXB1bGF0ZSBob21vZ2VuZW91c2x5IGFsbCBub2RlcyB3aXRoIGdldFR5cGUvc2V0VHlwZQorICogbWV0aG9kcworICoKKyAqIEBzaW5jZSAyLjMuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vZGVXaXRoVHlwZTxUPiB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZQorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHR5cGUKKyAgICAgKi8KKyAgICBUeXBlPD8+IGdldFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHR5cGUKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIFQgc2V0VHlwZShUeXBlPD8+IHR5cGUpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHR5cGUgdG8gdGhpcyBjbGFzcyBhbmQgdHJ5IHRvIGltcG9ydCBpdCB0byB0aGUge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gaWYgbmVlZGVkCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGVDbGFzcyB0aGUgdHlwZQorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIGRlZmF1bHQgVCBzZXRUeXBlKENsYXNzPD8+IHR5cGVDbGFzcykgeworICAgICAgICAoKE5vZGUpIHRoaXMpLnRyeUFkZEltcG9ydFRvUGFyZW50Q29tcGlsYXRpb25Vbml0KHR5cGVDbGFzcyk7CisgICAgICAgIHJldHVybiBzZXRUeXBlKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSh0eXBlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgfQorCisgICAgZGVmYXVsdCBUIHNldFR5cGUoZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZVR5cGUgY2xhc3NPckludGVyZmFjZVR5cGUgPSBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUodHlwZSk7CisgICAgICAgIHJldHVybiBzZXRUeXBlKGNsYXNzT3JJbnRlcmZhY2VUeXBlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZUFyZ3VtZW50cy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUeXBlQXJndW1lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlMjc5NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVHlwZUFyZ3VtZW50cy5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXJyYXlUb0xpc3Q7CisKKy8qKgorICogQSBub2RlIHRoYXQgY2FuIGhhdmUgdHlwZSBhcmd1bWVudHMuCisgKiA8cHJlPgorICogICAgIG5ldyBYKCk7ICAgICAgICAtLT4gdHlwZUFyZ3VtZW50cyA9PSBudWxsCisgKiAgICAgbmV3IFgmbHQ7PigpOyAgICAgIC0tPiB0eXBlQXJndW1lbnRzLnR5cGVzID0gW10sIHR5cGVBcmd1bWVudHMuZGlhbW9uZE9wZXJhdG9yPXRydWUgCisgKiAgICAgbmV3IFgmbHQ7QyxEPigpOyAgIC0tPiB0eXBlQXJndW1lbnRzLnR5cGVzID0gW0MsRF0sIHR5cGVBcmd1bWVudHMuZGlhbW9uZE9wZXJhdG9yPWZhbHNlIAorICogPC9wcmU+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhUeXBlQXJndW1lbnRzPFQ+IHsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgdHlwZSBhcmd1bWVudHM6ICZsdDtTdHJpbmcsIEludGVnZXI+LgorICAgICAqLworICAgIExpc3Q8VHlwZTw/Pj4gZ2V0VHlwZUFyZ3VtZW50cygpOworCisgICAgLyoqCisgICAgICogQWxsb3dzIHlvdSB0byBzZXQgdGhlIGdlbmVyaWMgYXJndW1lbnRzCisgICAgICogQHBhcmFtIHR5cGVBcmd1bWVudHMgVGhlIGxpc3Qgb2YgdHlwZXMgb2YgdGhlIGdlbmVyaWNzCisgICAgICovCisgICAgVCBzZXRUeXBlQXJndW1lbnRzKExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3VtZW50cyk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgYXJndW1lbnRzIGxvb2sgbGlrZSAmbHQ7Pi4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNVc2luZ0RpYW1vbmRPcGVyYXRvcigpIHsKKyAgICAgICAgaWYoZ2V0VHlwZUFyZ3VtZW50cygpPT1udWxsKXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0VHlwZUFyZ3VtZW50cygpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0eXBlIGFyZ3VtZW50cyB0byAmbHQ+LgorICAgICAqLworICAgIGRlZmF1bHQgVCBzZXREaWFtb25kT3BlcmF0b3IoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8VHlwZTw/Pj4gZW1wdHkgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIHNldFR5cGVBcmd1bWVudHMoZW1wdHkpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdHlwZSBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgJmx0Oz4uCisgICAgICovCisgICAgZGVmYXVsdCBUIHJlbW92ZVR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIHNldFR5cGVBcmd1bWVudHMoKExpc3Q8VHlwZTw/Pj4pIG51bGwpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgZGVmYXVsdCBUIHNldFR5cGVBcmd1bWVudHMoVHlwZTw/Pi4uLiB0eXBlQXJndW1lbnRzKSB7CisgICAgICAgIHNldFR5cGVBcmd1bWVudHMoYXJyYXlUb0xpc3QodHlwZUFyZ3VtZW50cykpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhWYXJpYWJsZXMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVmFyaWFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2NzAyYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoVmFyaWFibGVzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIG5vZGUgd2hpY2ggaGFzIGEgbGlzdCBvZiB2YXJpYWJsZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm9kZVdpdGhWYXJpYWJsZXM8VD4geworICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiBnZXRWYXJpYWJsZXMoKTsKKworICAgIFQgc2V0VmFyaWFibGVzKExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Fzc2VydFN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMzRhOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnRTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBjaGVjazsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBtc2c7CisKKwlwdWJsaWMgQXNzZXJ0U3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgQXNzZXJ0U3RtdChmaW5hbCBFeHByZXNzaW9uIGNoZWNrKSB7CisJCXNldENoZWNrKGNoZWNrKTsKKwl9CisKKwlwdWJsaWMgQXNzZXJ0U3RtdChmaW5hbCBFeHByZXNzaW9uIGNoZWNrLCBmaW5hbCBFeHByZXNzaW9uIG1zZykgeworCQlzZXRDaGVjayhjaGVjayk7CisJCXNldE1lc3NhZ2UobXNnKTsKKwl9CisKKwlwdWJsaWMgQXNzZXJ0U3RtdChmaW5hbCBSYW5nZSByYW5nZSwgZmluYWwgRXhwcmVzc2lvbiBjaGVjaywgZmluYWwgRXhwcmVzc2lvbiBtc2cpIHsKKwkJc3VwZXIocmFuZ2UpOworCQkKKwkJc2V0Q2hlY2soY2hlY2spOworCQlzZXRNZXNzYWdlKG1zZyk7CisJCQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldENoZWNrKCkgeworCQlyZXR1cm4gY2hlY2s7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0TWVzc2FnZSgpIHsKKwkJcmV0dXJuIG1zZzsKKwl9CisKKwlwdWJsaWMgQXNzZXJ0U3RtdCBzZXRDaGVjayhmaW5hbCBFeHByZXNzaW9uIGNoZWNrKSB7CisJCXRoaXMuY2hlY2sgPSBjaGVjazsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jaGVjayk7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBBc3NlcnRTdG10IHNldE1lc3NhZ2UoZmluYWwgRXhwcmVzc2lvbiBtc2cpIHsKKwkJdGhpcy5tc2cgPSBtc2c7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMubXNnKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Jsb2NrU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Jsb2NrU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2JmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQmxvY2tTdG10LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsb2NrU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoU3RhdGVtZW50czxCbG9ja1N0bXQ+IHsKKworICAgIHByaXZhdGUgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzOworCisgICAgcHVibGljIEJsb2NrU3RtdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvY2tTdG10KGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdG10cykgeworICAgICAgICBzZXRTdG10cyhzdG10cyk7CisgICAgfQorCisgICAgcHVibGljIEJsb2NrU3RtdChmaW5hbCBSYW5nZSByYW5nZSwgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0U3RtdHMoc3RtdHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTdGF0ZW1lbnQ+IGdldFN0bXRzKCkgeworICAgICAgICBzdG10cyA9IGVuc3VyZU5vdE51bGwoc3RtdHMpOworICAgICAgICByZXR1cm4gc3RtdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJsb2NrU3RtdCBzZXRTdG10cyhmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMpIHsKKyAgICAgICAgdGhpcy5zdG10cyA9IHN0bXRzOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLnN0bXRzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0JyZWFrU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0JyZWFrU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzM5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQnJlYWtTdG10LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCcmVha1N0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwlwdWJsaWMgQnJlYWtTdG10KCkgeworCX0KKworCXB1YmxpYyBCcmVha1N0bXQoZmluYWwgU3RyaW5nIGlkKSB7CisJCXRoaXMuaWQgPSBpZDsKKwl9CisKKwlwdWJsaWMgQnJlYWtTdG10KGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBTdHJpbmcgaWQpIHsKKwkJc3VwZXIocmFuZ2UpOworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCXB1YmxpYyBCcmVha1N0bXQgc2V0SWQoZmluYWwgU3RyaW5nIGlkKSB7CisJCXRoaXMuaWQgPSBpZDsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NhdGNoQ2xhdXNlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQ2F0Y2hDbGF1c2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYzMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NhdGNoQ2xhdXNlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2F0Y2hDbGF1c2UgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgTm9kZVdpdGhCbG9ja1N0bXQ8Q2F0Y2hDbGF1c2U+IHsKKworICAgIHByaXZhdGUgUGFyYW1ldGVyIHBhcmFtOworCisgICAgcHJpdmF0ZSBCbG9ja1N0bXQgY2F0Y2hCbG9jazsKKworICAgIHB1YmxpYyBDYXRjaENsYXVzZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2UoZmluYWwgUGFyYW1ldGVyIHBhcmFtLCBmaW5hbCBCbG9ja1N0bXQgY2F0Y2hCbG9jaykgeworICAgICAgICBzZXRQYXJhbShwYXJhbSk7CisgICAgICAgIHNldEJvZHkoY2F0Y2hCbG9jayk7CisgICAgfQorCisgICAgcHVibGljIENhdGNoQ2xhdXNlKGZpbmFsIFJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBleGNlcHRNb2RpZmllciwgCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGV4Y2VwdEFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGV4Y2VwdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIGV4Y2VwdElkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQmxvY2tTdG10IGNhdGNoQmxvY2spIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRQYXJhbShuZXcgUGFyYW1ldGVyKHJhbmdlLCBleGNlcHRNb2RpZmllciwgZXhjZXB0QW5ub3RhdGlvbnMsIGV4Y2VwdFR5cGUsIG51bGwsIGZhbHNlLCBleGNlcHRJZCkpOworICAgICAgICBzZXRCb2R5KGNhdGNoQmxvY2spOworICAgIH0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworICAgIC8qKgorICAgICAqIFVzZSB7QGxpbmsgI2dldEJvZHkoKX0gaW5zdGVhZAorICAgICAqLworICAgIEBEZXByZWNhdGVkCisJcHVibGljIEJsb2NrU3RtdCBnZXRDYXRjaEJsb2NrKCkgeworCQlyZXR1cm4gY2F0Y2hCbG9jazsKKwl9CisKKwkvKioKKwkgKiBOb3RlIHRoYXQgdGhlIHR5cGUgb2YgdGhlIFBhcmFtZXRlciBjYW4gYmUgYSBVbmlvblR5cGUuIEluIHRoaXMgY2FzZSwgYW55IGFubm90YXRpb25zIGZvdW5kIGF0IHRoZSBzdGFydCBvZiB0aGUgY2F0Y2goQFggQSBhIHwuLi4pCisJICogYXJlIGZvdW5kIGRpcmVjdGx5IGluIHRoZSBQYXJhbWV0ZXIuIEFubm90YXRpb25zIHRoYXQgYXJlIG9uIHRoZSBzZWNvbmQgb3IgbGF0ZXIgdHlwZSAtIGNhdGNoKEEgYSB8IEBYIEIgYiAuLi4pIGFyZSBmb3VuZCBvbiB0aG9zZSB0eXBlcy4KKwkgKi8KKwlwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtKCkgeworCQlyZXR1cm4gcGFyYW07CisJfQorCisgICAgLyoqCisgICAgICogVXNlIHtAbGluayAjc2V0Qm9keShCbG9ja1N0bXQpfSBpbnN0ZWFkCisgICAgICogCisgICAgICogQHBhcmFtIGNhdGNoQmxvY2sKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorCXB1YmxpYyBDYXRjaENsYXVzZSBzZXRDYXRjaEJsb2NrKGZpbmFsIEJsb2NrU3RtdCBjYXRjaEJsb2NrKSB7CisJCXRoaXMuY2F0Y2hCbG9jayA9IGNhdGNoQmxvY2s7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2F0Y2hCbG9jayk7CisgICAgICAgIHJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBDYXRjaENsYXVzZSBzZXRQYXJhbShmaW5hbCBQYXJhbWV0ZXIgcGFyYW0pIHsKKwkJdGhpcy5wYXJhbSA9IHBhcmFtOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnBhcmFtKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJsb2NrU3RtdCBnZXRCb2R5KCkgeworICAgICAgICByZXR1cm4gY2F0Y2hCbG9jazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2Ugc2V0Qm9keShCbG9ja1N0bXQgYmxvY2spIHsKKyAgICAgICAgdGhpcy5jYXRjaEJsb2NrID0gYmxvY2s7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2F0Y2hCbG9jayk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Db250aW51ZVN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Db250aW51ZVN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmE3ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NvbnRpbnVlU3RtdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29udGludWVTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgU3RyaW5nIGlkOworCisJcHVibGljIENvbnRpbnVlU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgQ29udGludWVTdG10KGZpbmFsIFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJcHVibGljIENvbnRpbnVlU3RtdChSYW5nZSByYW5nZSwgZmluYWwgU3RyaW5nIGlkKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwlwdWJsaWMgQ29udGludWVTdG10IHNldElkKGZpbmFsIFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Eb1N0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Eb1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI5M2VjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0RvU3RtdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJvZHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERvU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoQm9keTxEb1N0bXQ+IHsKKworCXByaXZhdGUgU3RhdGVtZW50IGJvZHk7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gY29uZGl0aW9uOworCisJcHVibGljIERvU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgRG9TdG10KGZpbmFsIFN0YXRlbWVudCBib2R5LCBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbikgeworCQlzZXRCb2R5KGJvZHkpOworCQlzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwl9CisKKwlwdWJsaWMgRG9TdG10KFJhbmdlIHJhbmdlLCBmaW5hbCBTdGF0ZW1lbnQgYm9keSwgZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRCb2R5KGJvZHkpOworCQlzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldEJvZHkoKSB7CisJCXJldHVybiBib2R5OworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRG9TdG10IHNldEJvZHkoZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJdGhpcy5ib2R5ID0gYm9keTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIERvU3RtdCBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKwkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0VtcHR5U3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0VtcHR5U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzA5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRW1wdHlTdG10LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eVN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHVibGljIEVtcHR5U3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgRW1wdHlTdG10KFJhbmdlIHJhbmdlKSB7CisJCXN1cGVyKHJhbmdlKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5MjA1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmVuc3VyZU5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aFR5cGVBcmd1bWVudHM8RXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10PiB7CisKKyAgICBwcml2YXRlIExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3VtZW50czsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RoaXM7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcjsKKworCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBhcmdzOworCisJcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KGZpbmFsIGJvb2xlYW4gaXNUaGlzLAorCQkJZmluYWwgRXhwcmVzc2lvbiBleHByLCBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKwkJc2V0VGhpcyhpc1RoaXMpOworCQlzZXRFeHByKGV4cHIpOworCQlzZXRBcmdzKGFyZ3MpOworCX0KKworCXB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoUmFuZ2UgcmFuZ2UsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHMsIGZpbmFsIGJvb2xlYW4gaXNUaGlzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBleHByLCBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpOworCQlzZXRUaGlzKGlzVGhpcyk7CisJCXNldEV4cHIoZXhwcik7CisJCXNldEFyZ3MoYXJncyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBMaXN0PEV4cHJlc3Npb24+IGdldEFyZ3MoKSB7CisgICAgICAgIGFyZ3MgPSBlbnN1cmVOb3ROdWxsKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1RoaXMoKSB7CisJCXJldHVybiBpc1RoaXM7CisJfQorCisJcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBzZXRBcmdzKGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncykgeworCQl0aGlzLmFyZ3MgPSBhcmdzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFyZ3MpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IHNldEV4cHIoZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXRoaXMuZXhwciA9IGV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcik7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgc2V0VGhpcyhmaW5hbCBib29sZWFuIGlzVGhpcykgeworCQl0aGlzLmlzVGhpcyA9IGlzVGhpczsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VHlwZTw/Pj4gZ2V0VHlwZUFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVBcmd1bWVudHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZXMpIHsKKyAgICAgICAgdGhpcy50eXBlQXJndW1lbnRzID0gdHlwZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHByZXNzaW9uU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cHJlc3Npb25TdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkOGEyZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHByZXNzaW9uU3RtdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXhwcmVzc2lvblN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHI7CisKKwlwdWJsaWMgRXhwcmVzc2lvblN0bXQoKSB7CisJfQorCisJcHVibGljIEV4cHJlc3Npb25TdG10KGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQlzZXRFeHByZXNzaW9uKGV4cHIpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uU3RtdChSYW5nZSByYW5nZSwKKwkgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0RXhwcmVzc2lvbihleHByKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvblN0bXQgc2V0RXhwcmVzc2lvbihmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJdGhpcy5leHByID0gZXhwcjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvclN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Gb3JTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiYWRkYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Gb3JTdG10LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJvZHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRm9yU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoQm9keTxGb3JTdG10PiB7CisKKwlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gaW5pdDsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBjb21wYXJlOworCisJcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZTsKKworCXByaXZhdGUgU3RhdGVtZW50IGJvZHk7CisKKwlwdWJsaWMgRm9yU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgRm9yU3RtdChmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGluaXQsIGZpbmFsIEV4cHJlc3Npb24gY29tcGFyZSwKKwkJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlLCBmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQlzZXRDb21wYXJlKGNvbXBhcmUpOworCQlzZXRJbml0KGluaXQpOworCQlzZXRVcGRhdGUodXBkYXRlKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKwlwdWJsaWMgRm9yU3RtdChSYW5nZSByYW5nZSwKKwkgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGluaXQsIGZpbmFsIEV4cHJlc3Npb24gY29tcGFyZSwKKwkgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSwgZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRDb21wYXJlKGNvbXBhcmUpOworCQlzZXRJbml0KGluaXQpOworCQlzZXRVcGRhdGUodXBkYXRlKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworCQlyZXR1cm4gYm9keTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb21wYXJlKCkgeworCQlyZXR1cm4gY29tcGFyZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxFeHByZXNzaW9uPiBnZXRJbml0KCkgeworICAgICAgICBpbml0ID0gZW5zdXJlTm90TnVsbChpbml0KTsKKyAgICAgICAgcmV0dXJuIGluaXQ7CisJfQorCisJcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0VXBkYXRlKCkgeworICAgICAgICB1cGRhdGUgPSBlbnN1cmVOb3ROdWxsKHVwZGF0ZSk7CisgICAgICAgIHJldHVybiB1cGRhdGU7CisJfQorCisJQE92ZXJyaWRlCisgICAgcHVibGljIEZvclN0bXQgc2V0Qm9keShmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQl0aGlzLmJvZHkgPSBib2R5OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJvZHkpOworICAgICAgICByZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgRm9yU3RtdCBzZXRDb21wYXJlKGZpbmFsIEV4cHJlc3Npb24gY29tcGFyZSkgeworCQl0aGlzLmNvbXBhcmUgPSBjb21wYXJlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbXBhcmUpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgRm9yU3RtdCBzZXRJbml0KGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gaW5pdCkgeworCQl0aGlzLmluaXQgPSBpbml0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluaXQpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgRm9yU3RtdCBzZXRVcGRhdGUoZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUpIHsKKwkJdGhpcy51cGRhdGUgPSB1cGRhdGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudXBkYXRlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvcmVhY2hTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yZWFjaFN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTk0NTcyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvcmVhY2hTdG10LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQm9keTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRm9yZWFjaFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aEJvZHk8Rm9yZWFjaFN0bXQ+IHsKKworCXByaXZhdGUgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyOworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGl0ZXJhYmxlOworCisJcHJpdmF0ZSBTdGF0ZW1lbnQgYm9keTsKKworCXB1YmxpYyBGb3JlYWNoU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgRm9yZWFjaFN0bXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyLAorCQkJZmluYWwgRXhwcmVzc2lvbiBpdGVyYWJsZSwgZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJc2V0VmFyaWFibGUodmFyKTsKKwkJc2V0SXRlcmFibGUoaXRlcmFibGUpOworCQlzZXRCb2R5KGJvZHkpOworCX0KKworCXB1YmxpYyBGb3JlYWNoU3RtdChSYW5nZSByYW5nZSwKKwkgICAgICAgICAgICAgICAgICAgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyLCBmaW5hbCBFeHByZXNzaW9uIGl0ZXJhYmxlLAorCSAgICAgICAgICAgICAgICAgICBmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQlzdXBlcihyYW5nZSk7CisJCXNldFZhcmlhYmxlKHZhcik7CisJCXNldEl0ZXJhYmxlKGl0ZXJhYmxlKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBXaWxsIGNyZWF0ZSBhIHtAbGluayBOYW1lRXhwcn0gd2l0aCB0aGUgaXRlcmFibGUgcGFyYW0KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFyCisgICAgICogQHBhcmFtIGl0ZXJhYmxlCisgICAgICogQHBhcmFtIGJvZHkKKyAgICAgKi8KKyAgICBwdWJsaWMgRm9yZWFjaFN0bXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyLCBTdHJpbmcgaXRlcmFibGUsIEJsb2NrU3RtdCBib2R5KSB7CisgICAgICAgIHNldFZhcmlhYmxlKHZhcik7CisgICAgICAgIHNldEl0ZXJhYmxlKG5ldyBOYW1lRXhwcihpdGVyYWJsZSkpOworICAgICAgICBzZXRCb2R5KGJvZHkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorCXB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldEJvZHkoKSB7CisJCXJldHVybiBib2R5OworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldEl0ZXJhYmxlKCkgeworCQlyZXR1cm4gaXRlcmFibGU7CisJfQorCisJcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGdldFZhcmlhYmxlKCkgeworCQlyZXR1cm4gdmFyOworCX0KKworCUBPdmVycmlkZQorICAgIHB1YmxpYyBGb3JlYWNoU3RtdCBzZXRCb2R5KGZpbmFsIFN0YXRlbWVudCBib2R5KSB7CisJCXRoaXMuYm9keSA9IGJvZHk7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSk7CisgICAgICAgIHJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBGb3JlYWNoU3RtdCBzZXRJdGVyYWJsZShmaW5hbCBFeHByZXNzaW9uIGl0ZXJhYmxlKSB7CisJCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pdGVyYWJsZSk7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBGb3JlYWNoU3RtdCBzZXRWYXJpYWJsZShmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2YXIpIHsKKwkJdGhpcy52YXIgPSB2YXI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFyKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0lmU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0lmU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTNlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZTdG10LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJZlN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGNvbmRpdGlvbjsKKworCXByaXZhdGUgU3RhdGVtZW50IHRoZW5TdG10OworCisJcHJpdmF0ZSBTdGF0ZW1lbnQgZWxzZVN0bXQ7CisKKwlwdWJsaWMgSWZTdG10KCkgeworCX0KKworCXB1YmxpYyBJZlN0bXQoZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24sIGZpbmFsIFN0YXRlbWVudCB0aGVuU3RtdCwgZmluYWwgU3RhdGVtZW50IGVsc2VTdG10KSB7CisJCXNldENvbmRpdGlvbihjb25kaXRpb24pOworCQlzZXRUaGVuU3RtdCh0aGVuU3RtdCk7CisJCXNldEVsc2VTdG10KGVsc2VTdG10KTsKKwl9CisKKwlwdWJsaWMgSWZTdG10KFJhbmdlIHJhbmdlLAorCSAgICAgICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24sIGZpbmFsIFN0YXRlbWVudCB0aGVuU3RtdCwgZmluYWwgU3RhdGVtZW50IGVsc2VTdG10KSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisJCXNldFRoZW5TdG10KHRoZW5TdG10KTsKKwkJc2V0RWxzZVN0bXQoZWxzZVN0bXQpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbjsKKwl9CisKKwlwdWJsaWMgU3RhdGVtZW50IGdldEVsc2VTdG10KCkgeworCQlyZXR1cm4gZWxzZVN0bXQ7CisJfQorCisJcHVibGljIFN0YXRlbWVudCBnZXRUaGVuU3RtdCgpIHsKKwkJcmV0dXJuIHRoZW5TdG10OworCX0KKworCXB1YmxpYyBJZlN0bXQgc2V0Q29uZGl0aW9uKGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CisJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbmRpdGlvbik7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBJZlN0bXQgc2V0RWxzZVN0bXQoZmluYWwgU3RhdGVtZW50IGVsc2VTdG10KSB7CisJCXRoaXMuZWxzZVN0bXQgPSBlbHNlU3RtdDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5lbHNlU3RtdCk7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBJZlN0bXQgc2V0VGhlblN0bXQoZmluYWwgU3RhdGVtZW50IHRoZW5TdG10KSB7CisJCXRoaXMudGhlblN0bXQgPSB0aGVuU3RtdDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50aGVuU3RtdCk7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9MYWJlbGVkU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0xhYmVsZWRTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkMWFkOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9MYWJlbGVkU3RtdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBTdHJpbmcgbGFiZWw7CisKKwlwcml2YXRlIFN0YXRlbWVudCBzdG10OworCisJcHVibGljIExhYmVsZWRTdG10KCkgeworCX0KKworCXB1YmxpYyBMYWJlbGVkU3RtdChmaW5hbCBTdHJpbmcgbGFiZWwsIGZpbmFsIFN0YXRlbWVudCBzdG10KSB7CisJCXNldExhYmVsKGxhYmVsKTsKKwkJc2V0U3RtdChzdG10KTsKKwl9CisKKwlwdWJsaWMgTGFiZWxlZFN0bXQoUmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyBsYWJlbCwgZmluYWwgU3RhdGVtZW50IHN0bXQpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRMYWJlbChsYWJlbCk7CisJCXNldFN0bXQoc3RtdCk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0U3RtdCgpIHsKKwkJcmV0dXJuIHN0bXQ7CisJfQorCisJcHVibGljIExhYmVsZWRTdG10IHNldExhYmVsKGZpbmFsIFN0cmluZyBsYWJlbCkgeworCQl0aGlzLmxhYmVsID0gbGFiZWw7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBMYWJlbGVkU3RtdCBzZXRTdG10KGZpbmFsIFN0YXRlbWVudCBzdG10KSB7CisJCXRoaXMuc3RtdCA9IHN0bXQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc3RtdCk7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9SZXR1cm5TdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvUmV0dXJuU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTMxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvUmV0dXJuU3RtdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJldHVyblN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHI7CisKKwlwdWJsaWMgUmV0dXJuU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgUmV0dXJuU3RtdChmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJc2V0RXhwcihleHByKTsKKwl9CisKKwlwdWJsaWMgUmV0dXJuU3RtdChSYW5nZSByYW5nZSwgZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0RXhwcihleHByKTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBXaWxsIGNyZWF0ZSBhIE5hbWVFeHByIHdpdGggdGhlIHN0cmluZyBwYXJhbQorICAgICAqIAorICAgICAqIEBwYXJhbSBleHByCisgICAgICovCisgICAgcHVibGljIFJldHVyblN0bXQoU3RyaW5nIGV4cHIpIHsKKyAgICAgICAgc2V0RXhwcihuZXcgTmFtZUV4cHIoZXhwcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcigpIHsKKwkJcmV0dXJuIGV4cHI7CisJfQorCisJcHVibGljIFJldHVyblN0bXQgc2V0RXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJdGhpcy5leHByID0gZXhwcjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHByKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N0YXRlbWVudC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudCBleHRlbmRzIE5vZGUgeworCisJcHVibGljIFN0YXRlbWVudCgpIHsKKwl9CisKKwlwdWJsaWMgU3RhdGVtZW50KGZpbmFsIFJhbmdlIHJhbmdlKSB7CisJCXN1cGVyKHJhbmdlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hFbnRyeVN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hFbnRyeVN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdlMjBlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaEVudHJ5U3RtdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFN0YXRlbWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3dpdGNoRW50cnlTdG10IGV4dGVuZHMgU3RhdGVtZW50IGltcGxlbWVudHMgTm9kZVdpdGhTdGF0ZW1lbnRzPFN3aXRjaEVudHJ5U3RtdD4geworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGxhYmVsOworCisJcHJpdmF0ZSBMaXN0PFN0YXRlbWVudD4gc3RtdHM7CisKKwlwdWJsaWMgU3dpdGNoRW50cnlTdG10KCkgeworCX0KKworCXB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQoZmluYWwgRXhwcmVzc2lvbiBsYWJlbCwgZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzKSB7CisJCXNldExhYmVsKGxhYmVsKTsKKwkJc2V0U3RtdHMoc3RtdHMpOworCX0KKworCXB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQoUmFuZ2UgcmFuZ2UsIGZpbmFsIEV4cHJlc3Npb24gbGFiZWwsCisJICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRMYWJlbChsYWJlbCk7CisJCXNldFN0bXRzKHN0bXRzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0TGFiZWwoKSB7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTdGF0ZW1lbnQ+IGdldFN0bXRzKCkgeworICAgICAgICBzdG10cyA9IGVuc3VyZU5vdE51bGwoc3RtdHMpOworICAgICAgICByZXR1cm4gc3RtdHM7CisJfQorCisJcHVibGljIFN3aXRjaEVudHJ5U3RtdCBzZXRMYWJlbChmaW5hbCBFeHByZXNzaW9uIGxhYmVsKSB7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5sYWJlbCk7CisJCXJldHVybiB0aGlzOworCX0KKworCUBPdmVycmlkZQorICAgIHB1YmxpYyBTd2l0Y2hFbnRyeVN0bXQgc2V0U3RtdHMoZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzKSB7CisJCXRoaXMuc3RtdHMgPSBzdG10czsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zdG10cyk7CisgICAgICAgIHJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3dpdGNoU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDkzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3dpdGNoU3RtdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLio7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTd2l0Y2hTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBzZWxlY3RvcjsKKworCXByaXZhdGUgTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXM7CisKKwlwdWJsaWMgU3dpdGNoU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgU3dpdGNoU3RtdChmaW5hbCBFeHByZXNzaW9uIHNlbGVjdG9yLAorCQkJZmluYWwgTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMpIHsKKwkJc2V0U2VsZWN0b3Ioc2VsZWN0b3IpOworCQlzZXRFbnRyaWVzKGVudHJpZXMpOworCX0KKworCXB1YmxpYyBTd2l0Y2hTdG10KFJhbmdlIHJhbmdlLCBmaW5hbCBFeHByZXNzaW9uIHNlbGVjdG9yLAorCSAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzKSB7CisJCXN1cGVyKHJhbmdlKTsKKwkJc2V0U2VsZWN0b3Ioc2VsZWN0b3IpOworCQlzZXRFbnRyaWVzKGVudHJpZXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGdldEVudHJpZXMoKSB7CisgICAgICAgIGVudHJpZXMgPSBlbnN1cmVOb3ROdWxsKGVudHJpZXMpOworICAgICAgICByZXR1cm4gZW50cmllczsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRTZWxlY3RvcigpIHsKKwkJcmV0dXJuIHNlbGVjdG9yOworCX0KKworCXB1YmxpYyBTd2l0Y2hTdG10IHNldEVudHJpZXMoZmluYWwgTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMpIHsKKwkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5lbnRyaWVzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFN3aXRjaFN0bXQgc2V0U2VsZWN0b3IoZmluYWwgRXhwcmVzc2lvbiBzZWxlY3RvcikgeworCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2VsZWN0b3IpOworCQlyZXR1cm4gdGhpczsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3luY2hyb25pemVkU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N5bmNocm9uaXplZFN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTlkMmRiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N5bmNocm9uaXplZFN0bXQuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhCbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN5bmNocm9uaXplZFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgaW1wbGVtZW50cyBOb2RlV2l0aEJsb2NrU3RtdDxTeW5jaHJvbml6ZWRTdG10PiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcjsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IGJsb2NrOworCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXQoKSB7CisgICAgfQorCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXQoZmluYWwgRXhwcmVzc2lvbiBleHByLCBmaW5hbCBCbG9ja1N0bXQgYmxvY2spIHsKKyAgICAgICAgc2V0RXhwcihleHByKTsKKyAgICAgICAgc2V0QmxvY2soYmxvY2spOworICAgIH0KKworICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdG10KFJhbmdlIHJhbmdlLCBmaW5hbCBFeHByZXNzaW9uIGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0RXhwcihleHByKTsKKyAgICAgICAgc2V0QmxvY2soYmxvY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRCb2R5KCl9CisgICAgICogQHJldHVybgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEJsb2NrU3RtdCBnZXRCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHIoKSB7CisgICAgICAgIHJldHVybiBleHByOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldEJvZHkoQmxvY2tTdG10KX0gaW5zdGVhZAorICAgICAqIEBwYXJhbSBibG9jaworICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIFN5bmNocm9uaXplZFN0bXQgc2V0QmxvY2soZmluYWwgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jazsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ibG9jayk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdG10IHNldEV4cHIoZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisgICAgICAgIHRoaXMuZXhwciA9IGV4cHI7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCbG9ja1N0bXQgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdG10IHNldEJvZHkoQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jazsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ibG9jayk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UaHJvd1N0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UaHJvd1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBmZGQwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1Rocm93U3RtdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhyb3dTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBleHByOworCisJcHVibGljIFRocm93U3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgVGhyb3dTdG10KGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQlzZXRFeHByKGV4cHIpOworCX0KKworCXB1YmxpYyBUaHJvd1N0bXQoUmFuZ2UgcmFuZ2UsIGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQlzdXBlcihyYW5nZSk7CisJCXNldEV4cHIoZXhwcik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcigpIHsKKwkJcmV0dXJuIGV4cHI7CisJfQorCisJcHVibGljIFRocm93U3RtdCBzZXRFeHByKGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQl0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworCQlyZXR1cm4gdGhpczsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHJ5U3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1RyeVN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg4NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1RyeVN0bXQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLio7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUcnlTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKwkKKwlwcml2YXRlIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IHJlc291cmNlczsKKworCXByaXZhdGUgQmxvY2tTdG10IHRyeUJsb2NrOworCisJcHJpdmF0ZSBMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaHM7CisKKwlwcml2YXRlIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2s7CisKKwlwdWJsaWMgVHJ5U3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgVHJ5U3RtdChmaW5hbCBCbG9ja1N0bXQgdHJ5QmxvY2ssIGZpbmFsIExpc3Q8Q2F0Y2hDbGF1c2U+IGNhdGNocywKKwkJCWZpbmFsIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2spIHsKKwkJc2V0VHJ5QmxvY2sodHJ5QmxvY2spOworCQlzZXRDYXRjaHMoY2F0Y2hzKTsKKwkJc2V0RmluYWxseUJsb2NrKGZpbmFsbHlCbG9jayk7CisJfQorCisJcHVibGljIFRyeVN0bXQoUmFuZ2UgcmFuZ2UsIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IHJlc291cmNlcywKKwkgICAgICAgICAgICAgICBmaW5hbCBCbG9ja1N0bXQgdHJ5QmxvY2ssIGZpbmFsIExpc3Q8Q2F0Y2hDbGF1c2U+IGNhdGNocywgZmluYWwgQmxvY2tTdG10IGZpbmFsbHlCbG9jaykgeworCQlzdXBlcihyYW5nZSk7CisJCXNldFJlc291cmNlcyhyZXNvdXJjZXMpOworCQlzZXRUcnlCbG9jayh0cnlCbG9jayk7CisJCXNldENhdGNocyhjYXRjaHMpOworCQlzZXRGaW5hbGx5QmxvY2soZmluYWxseUJsb2NrKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIExpc3Q8Q2F0Y2hDbGF1c2U+IGdldENhdGNocygpIHsKKyAgICAgICAgY2F0Y2hzID0gZW5zdXJlTm90TnVsbChjYXRjaHMpOworICAgICAgICByZXR1cm4gY2F0Y2hzOworCX0KKworCXB1YmxpYyBCbG9ja1N0bXQgZ2V0RmluYWxseUJsb2NrKCkgeworCQlyZXR1cm4gZmluYWxseUJsb2NrOworCX0KKworCXB1YmxpYyBCbG9ja1N0bXQgZ2V0VHJ5QmxvY2soKSB7CisJCXJldHVybiB0cnlCbG9jazsKKwl9CisJCisJcHVibGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IGdldFJlc291cmNlcygpIHsKKyAgICAgICAgcmVzb3VyY2VzID0gZW5zdXJlTm90TnVsbChyZXNvdXJjZXMpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyBUcnlTdG10IHNldENhdGNocyhmaW5hbCBMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaHMpIHsKKwkJdGhpcy5jYXRjaHMgPSBjYXRjaHM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2F0Y2hzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFRyeVN0bXQgc2V0RmluYWxseUJsb2NrKGZpbmFsIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2spIHsKKwkJdGhpcy5maW5hbGx5QmxvY2sgPSBmaW5hbGx5QmxvY2s7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZmluYWxseUJsb2NrKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFRyeVN0bXQgc2V0VHJ5QmxvY2soZmluYWwgQmxvY2tTdG10IHRyeUJsb2NrKSB7CisJCXRoaXMudHJ5QmxvY2sgPSB0cnlCbG9jazsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50cnlCbG9jayk7CisJCXJldHVybiB0aGlzOworCX0KKwkKKwlwdWJsaWMgVHJ5U3RtdCBzZXRSZXNvdXJjZXMoTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gcmVzb3VyY2VzKSB7CisJCXRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnJlc291cmNlcyk7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UeXBlRGVjbGFyYXRpb25TdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHlwZURlY2xhcmF0aW9uU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjgzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHlwZURlY2xhcmF0aW9uU3RtdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUeXBlRGVjbGFyYXRpb25TdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsOworCisJcHVibGljIFR5cGVEZWNsYXJhdGlvblN0bXQoKSB7CisJfQorCisJcHVibGljIFR5cGVEZWNsYXJhdGlvblN0bXQoZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJCXNldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbCk7CisJfQorCisJcHVibGljIFR5cGVEZWNsYXJhdGlvblN0bXQoUmFuZ2UgcmFuZ2UsIGZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCkgeworCQlzdXBlcihyYW5nZSk7CisJCXNldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbCk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oKSB7CisJCXJldHVybiB0eXBlRGVjbDsKKwl9CisKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uU3RtdCBzZXRUeXBlRGVjbGFyYXRpb24oZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsKSB7CisJCXRoaXMudHlwZURlY2wgPSB0eXBlRGVjbDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlRGVjbCk7CisJCXJldHVybiB0aGlzOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9XaGlsZVN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9XaGlsZVN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQzNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1doaWxlU3RtdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEJvZHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdoaWxlU3RtdCBleHRlbmRzIFN0YXRlbWVudCBpbXBsZW1lbnRzIE5vZGVXaXRoQm9keTxXaGlsZVN0bXQ+IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBjb25kaXRpb247CisKKwlwcml2YXRlIFN0YXRlbWVudCBib2R5OworCisJcHVibGljIFdoaWxlU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgV2hpbGVTdG10KGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uLCBmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQlzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKwlwdWJsaWMgV2hpbGVTdG10KFJhbmdlIHJhbmdlLCBmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldEJvZHkoKSB7CisJCXJldHVybiBib2R5OworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbjsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgV2hpbGVTdG10IHNldEJvZHkoZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJdGhpcy5ib2R5ID0gYm9keTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFdoaWxlU3RtdCBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKwkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0FycmF5VHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0FycmF5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmYyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvQXJyYXlUeXBlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BcnJheUJyYWNrZXRQYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVG8gaW5kaWNhdGUgdGhhdCBhIHR5cGUgaXMgYW4gYXJyYXksIGl0IGdldHMgd3JhcHBlZCBpbiBhbiBBcnJheVR5cGUgZm9yIGV2ZXJ5IGFycmF5IGxldmVsIGl0IGhhcy4KKyAqIFNvLCBpbnRbXVtdIGJlY29tZXMgQXJyYXlUeXBlKEFycmF5VHlwZShpbnQpKS4KKyAqLworcHVibGljIGNsYXNzIEFycmF5VHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGU8QXJyYXlUeXBlPiBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8QXJyYXlUeXBlPiB7CisgICAgcHJpdmF0ZSBUeXBlIGNvbXBvbmVudFR5cGU7CisKKyAgICBwdWJsaWMgQXJyYXlUeXBlKFR5cGUgY29tcG9uZW50VHlwZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc2V0Q29tcG9uZW50VHlwZShjb21wb25lbnRUeXBlKTsKKyAgICAgICAgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheVR5cGUoUmFuZ2UgcmFuZ2UsIFR5cGUgY29tcG9uZW50VHlwZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGUpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGU7CisgICAgfQorCisgICAgcHVibGljIEFycmF5VHlwZSBzZXRDb21wb25lbnRUeXBlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSB0eXBlOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbXBvbmVudFR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBsaXN0cyBvZiBhcnJheUJyYWNrZXRQYWlycywgYXNzdW1lcyB0aGUgbGlzdHMgYXJlIG9yZGVyZWQgbGVmdCB0byByaWdodCBhbmQgdGhlIHBhaXJzIGFyZSBvcmRlcmVkIGxlZnQgdG8gcmlnaHQsIG1pcnJvcmluZyB0aGUgYWN0dWFsIGNvZGUuCisgICAgICogVGhlIHR5cGUgZ2V0cyB3cmFwcGVkIGluIEFycmF5VHlwZXMgc28gdGhhdCB0aGUgb3V0ZXJtb3N0IEFycmF5VHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcmlnaHRtb3N0IEFycmF5QnJhY2tldFBhaXIuCisgICAgICovCisgICAgQFNhZmVWYXJhcmdzCisgICAgcHVibGljIHN0YXRpYyBUeXBlIHdyYXBJbkFycmF5VHlwZXMoVHlwZSB0eXBlLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+Li4uIGFycmF5QnJhY2tldFBhaXJMaXN0cykgeworICAgICAgICBmb3IgKGludCBpID0gYXJyYXlCcmFja2V0UGFpckxpc3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJMaXN0ID0gYXJyYXlCcmFja2V0UGFpckxpc3RzW2ldOworICAgICAgICAgICAgaWYgKGFycmF5QnJhY2tldFBhaXJMaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gYXJyYXlCcmFja2V0UGFpckxpc3Quc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVR5cGUodHlwZSwgYXJyYXlCcmFja2V0UGFpckxpc3QuZ2V0KGopLmdldEFubm90YXRpb25zKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhIHR5cGUgdGhhdCBtYXkgYmUgYW4gQXJyYXlUeXBlLiBVbndyYXBzIEFycmF5VHlwZXMgdW50aWwgdGhlIGVsZW1lbnQgdHlwZSBpcyBmb3VuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBwYWlyIG9mIHRoZSBlbGVtZW50IHR5cGUsIGFuZCB0aGUgdW53cmFwcGVkIEFycmF5VHlwZXMsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8VHlwZSwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPj4gdW53cmFwQXJyYXlUeXBlcyhUeXBlIHR5cGUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB3aGlsZSAodHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSkgeworICAgICAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICBhcnJheUJyYWNrZXRQYWlycy5hZGQobmV3IEFycmF5QnJhY2tldFBhaXIoUmFuZ2UuVU5LTk9XTiwgYXJyYXlUeXBlLmdldEFubm90YXRpb25zKCkpKTsKKyAgICAgICAgICAgIHR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KHR5cGUsIGFycmF5QnJhY2tldFBhaXJzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBBcnJheVR5cGUgYXJyYXlPZihUeXBlIHR5cGUsIEFubm90YXRpb25FeHByLi4uIGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKHR5cGUsIEFycmF5cy5hc0xpc3QoYW5ub3RhdGlvbnMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvQ2xhc3NPckludGVyZmFjZVR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9DbGFzc09ySW50ZXJmYWNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzA4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvQ2xhc3NPckludGVyZmFjZVR5cGUuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhUeXBlQXJndW1lbnRzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuZW5zdXJlTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzT3JJbnRlcmZhY2VUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZTxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50cyAKKyAgICAgICAgTm9kZVdpdGhOYW1lPENsYXNzT3JJbnRlcmZhY2VUeXBlPiwgCisgICAgICAgIE5vZGVXaXRoQW5ub3RhdGlvbnM8Q2xhc3NPckludGVyZmFjZVR5cGU+LAorICAgICAgICBOb2RlV2l0aFR5cGVBcmd1bWVudHM8Q2xhc3NPckludGVyZmFjZVR5cGU+IHsKKworICAgIHByaXZhdGUgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHM7CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoKSB7CisgICAgfQorCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIHNjb3BlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRTY29wZShzY29wZSk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlKGZpbmFsIFJhbmdlIHJhbmdlLCBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3VtZW50cykgeworICAgICAgICBzdXBlcihyYW5nZSk7CisgICAgICAgIHNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0VHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIHNjb3BlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQm94ZWRUeXBlKCkgeworICAgICAgICByZXR1cm4gUHJpbWl0aXZlVHlwZS51bmJveE1hcC5jb250YWluc0tleShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJpbWl0aXZlVHlwZSB0b1VuYm94ZWRUeXBlKCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc0JveGVkVHlwZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24obmFtZSArICIgaXNuJ3QgYSBib3hlZCB0eXBlLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnVuYm94TWFwLmdldChuYW1lKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIHNldFNjb3BlKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFR5cGU8Pz4+IGdldFR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiB0eXBlQXJndW1lbnRzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBzZXRUeXBlQXJndW1lbnRzKGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZXMpIHsKKyAgICAgICAgdGhpcy50eXBlQXJndW1lbnRzID0gdHlwZXM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9JbnRlcnNlY3Rpb25UeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvSW50ZXJzZWN0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvSW50ZXJzZWN0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzZXQgb2YgdHlwZXMuIEEgZ2l2ZW4gdmFsdWUgb2YgdGhpcyB0eXBlIGhhcyB0byBiZSBhc3NpZ25hYmxlIHRvIGF0IGFsbCBvZiB0aGUgZWxlbWVudCB0eXBlcy4KKyAqIEFzIG9mIEphdmEgOCBpdCBpcyB1c2VkIGluIGNhc3RzIG9yIHdoaWxlIGV4cHJlc3NpbmcgYm91bmRzIGZvciBnZW5lcmljIHR5cGVzLgorICoKKyAqIEZvciBleGFtcGxlOgorICogcHVibGljIGNsYXNzIEEmZ3Q7VCBleHRlbmRzIFNlcmlhbGl6YWJsZSAmYW1wOyBDbG9uZWFibGUmbHQ7IHsgfQorICoKKyAqIE9yOgorICogdm9pZCBmb28oKFNlcmlhbGl6YWJsZSAmYW1wOyBDbG9uZWFibGUpbXlPYmplY3QpOworICoKKyAqIEBzaW5jZSAzLjAuMAorICovCitwdWJsaWMgY2xhc3MgSW50ZXJzZWN0aW9uVHlwZSBleHRlbmRzIFR5cGU8SW50ZXJzZWN0aW9uVHlwZT4gaW1wbGVtZW50cyBOb2RlV2l0aEFubm90YXRpb25zPEludGVyc2VjdGlvblR5cGU+IHsKKworICAgIHByaXZhdGUgTGlzdDxSZWZlcmVuY2VUeXBlPiBlbGVtZW50czsKKworICAgIHB1YmxpYyBJbnRlcnNlY3Rpb25UeXBlKFJhbmdlIHJhbmdlLCBMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0RWxlbWVudHMoZWxlbWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlcnNlY3Rpb25UeXBlKExpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0RWxlbWVudHMoZWxlbWVudHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZWZlcmVuY2VUeXBlPiBnZXRFbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlcnNlY3Rpb25UeXBlIHNldEVsZW1lbnRzKExpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBlbGVtZW50cyl7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5lbGVtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9QcmltaXRpdmVUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUHJpbWl0aXZlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Mjk5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUHJpbWl0aXZlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcmltaXRpdmVUeXBlIGV4dGVuZHMgVHlwZTxQcmltaXRpdmVUeXBlPiBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8UHJpbWl0aXZlVHlwZT4geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmltaXRpdmVUeXBlIEJZVEVfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5CeXRlKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBTSE9SVF9UWVBFID0gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLlNob3J0KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBJTlRfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5JbnQpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmltaXRpdmVUeXBlIExPTkdfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5Mb25nKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBGTE9BVF9UWVBFID0gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkZsb2F0KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBET1VCTEVfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5Eb3VibGUpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmltaXRpdmVUeXBlIEJPT0xFQU5fVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5Cb29sZWFuKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBDSEFSX1RZUEUgPSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuQ2hhcik7CisKKwlwdWJsaWMgZW51bSBQcmltaXRpdmUgeworCQlCb29sZWFuICgiQm9vbGVhbiIpLAorCQlDaGFyICAgICgiQ2hhcmFjdGVyIiksCisJCUJ5dGUgICAgKCJCeXRlIiksCisJCVNob3J0ICAgKCJTaG9ydCIpLAorCQlJbnQgICAgICgiSW50ZWdlciIpLAorCQlMb25nICAgICgiTG9uZyIpLAorCQlGbG9hdCAgICgiRmxvYXQiKSwKKwkJRG91YmxlICAoIkRvdWJsZSIpOworCisJCWZpbmFsIFN0cmluZyBuYW1lT2ZCb3hlZFR5cGU7CisKKwkJcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIHRvQm94ZWRUeXBlKCkgeworCQkJcmV0dXJuIG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShuYW1lT2ZCb3hlZFR5cGUpOworCQl9CisKKwkJUHJpbWl0aXZlKFN0cmluZyBuYW1lT2ZCb3hlZFR5cGUpIHsKKwkJCXRoaXMubmFtZU9mQm94ZWRUeXBlID0gbmFtZU9mQm94ZWRUeXBlOworCQl9CisJfQorCisJc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmU+IHVuYm94TWFwID0gbmV3IEhhc2hNYXA8PigpOworCXN0YXRpYyB7CisJCWZvcihQcmltaXRpdmUgdW5ib3hlZFR5cGUgOiBQcmltaXRpdmUudmFsdWVzKCkpIHsKKwkJCXVuYm94TWFwLnB1dCh1bmJveGVkVHlwZS5uYW1lT2ZCb3hlZFR5cGUsIHVuYm94ZWRUeXBlKTsKKwkJfQorCX0KKworCXByaXZhdGUgUHJpbWl0aXZlIHR5cGU7CisKKwlwdWJsaWMgUHJpbWl0aXZlVHlwZSgpIHsKKwl9CisKKwlwdWJsaWMgUHJpbWl0aXZlVHlwZShmaW5hbCBQcmltaXRpdmUgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBQcmltaXRpdmVUeXBlKFJhbmdlIHJhbmdlLCBmaW5hbCBQcmltaXRpdmUgdHlwZSkgeworCQlzdXBlcihyYW5nZSk7CisJCXNldFR5cGUodHlwZSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFByaW1pdGl2ZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgdG9Cb3hlZFR5cGUoKSB7CisJCXJldHVybiB0eXBlLnRvQm94ZWRUeXBlKCk7CisJfQorCisJcHVibGljIFByaW1pdGl2ZVR5cGUgc2V0VHlwZShmaW5hbCBQcmltaXRpdmUgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9SZWZlcmVuY2VUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDY2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZVR5cGU8VCBleHRlbmRzIFJlZmVyZW5jZVR5cGU+IGV4dGVuZHMgVHlwZTxUPiB7CisKKyAgICBwdWJsaWMgUmVmZXJlbmNlVHlwZSgpIHsKKwl9CisKKwlwdWJsaWMgUmVmZXJlbmNlVHlwZShmaW5hbCBSYW5nZSByYW5nZSkgeworCQlzdXBlcihyYW5nZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNDM1NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9UeXBlLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy4qOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZTxUIGV4dGVuZHMgVHlwZT4gZXh0ZW5kcyBOb2RlIHsKKworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKyAgICBwdWJsaWMgVHlwZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZShMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uKXsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb247CisgICAgfQorCisgICAgcHVibGljIFR5cGUoUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVHlwZShSYW5nZSByYW5nZSwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc3VwZXIocmFuZ2UpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICBhbm5vdGF0aW9ucyA9IGVuc3VyZU5vdE51bGwoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIFQgc2V0QW5ub3RhdGlvbnMoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoYW5ub3RhdGlvbnMpOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9UeXBlUGFyYW1ldGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVHlwZVBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWM5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVHlwZVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aE5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5lbnN1cmVOb3ROdWxsOworCisvKioKKyAqIDxwPgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGdlbmVyaWNzIGFyZ3VtZW50LgorICogPC9wPgorICogVGhlIFR5cGVQYXJhbWV0ZXIgaXMgY29uc3RydWN0ZWQgZm9sbG93aW5nIHRoZSBzeW50YXg6PGJyPgorICogPHByZT4KKyAqIHtAY29kZQorICogVHlwZVBhcmFtZXRlciA6Oj0gPElERU5USUZJRVI+ICggImV4dGVuZHMiIH17QGxpbmsgQ2xhc3NPckludGVyZmFjZVR5cGV9e0Bjb2RlICggIiYiIH17QGxpbmsgQ2xhc3NPckludGVyZmFjZVR5cGV9e0Bjb2RlICkqICk/CisgKiB9CisgKiA8L3ByZT4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHlwZVBhcmFtZXRlciBleHRlbmRzIFJlZmVyZW5jZVR5cGU8VHlwZVBhcmFtZXRlcj4gaW1wbGVtZW50cyBOb2RlV2l0aE5hbWU8VHlwZVBhcmFtZXRlcj4geworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKwlwcml2YXRlIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZDsKKworCXB1YmxpYyBUeXBlUGFyYW1ldGVyKCkgeworCX0KKworCXB1YmxpYyBUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCk7CisJfQorCisJcHVibGljIFR5cGVQYXJhbWV0ZXIoUmFuZ2UgcmFuZ2UsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXROYW1lKG5hbWUpOworCQlzZXRUeXBlQm91bmQodHlwZUJvdW5kKTsKKwl9CisKKwlwdWJsaWMgVHlwZVBhcmFtZXRlcihSYW5nZSByYW5nZSwgU3RyaW5nIG5hbWUsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKwkJdGhpcyhyYW5nZSwgbmFtZSwgdHlwZUJvdW5kKTsKKwkJc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCk7CisJCXNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhcmFtZW50ZXIuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFyYW1lbnRlcgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBsaXN0IG9mIHtAbGluayBDbGFzc09ySW50ZXJmYWNlVHlwZX0gdGhhdCB0aGlzIHBhcmFtZXRlcgorCSAqIGV4dGVuZHMuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBudWxsIGlmIHRoZXJlIGFyZSBubyB0eXBlLgorCSAqIAorCSAqIEByZXR1cm4gbGlzdCBvZiB0eXBlcyB0aGF0IHRoaXMgcGFyYW1lbnRlIGV4dGVuZHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0VHlwZUJvdW5kKCkgeworICAgICAgICB0eXBlQm91bmQgPSBlbnN1cmVOb3ROdWxsKHR5cGVCb3VuZCk7CisgICAgICAgIHJldHVybiB0eXBlQm91bmQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIHR5cGUgcGFyYW1ldGVyLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKwkgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZVBhcmFtZXRlciBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGxpc3QgbyB0eXBlcy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZUJvdW5kCisJICogICAgICAgICAgICB0aGUgdHlwZUJvdW5kIHRvIHNldAorCSAqLworCXB1YmxpYyBUeXBlUGFyYW1ldGVyIHNldFR5cGVCb3VuZChmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKwkJdGhpcy50eXBlQm91bmQgPSB0eXBlQm91bmQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHR5cGVCb3VuZCk7CisJCXJldHVybiB0aGlzOworCX0KKworICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgYW5ub3RhdGlvbnMgPSBlbnN1cmVOb3ROdWxsKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlUGFyYW1ldGVyIHNldEFubm90YXRpb25zKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKwkgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucyk7CisJCXJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9VbmlvblR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9VbmlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDg5NGFmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1VuaW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzZXQgb2YgdHlwZXMuIEEgZ2l2ZW4gdmFsdWUgb2YgdGhpcyB0eXBlIGhhcyB0byBiZSBhc3NpZ25hYmxlIHRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZWxlbWVudCB0eXBlcy4KKyAqIEFzIG9mIEphdmEgOCBpdCBpcyBvbmx5IHVzZWQgaW4gY2F0Y2ggY2xhdXNlcy4KKyAqLworcHVibGljIGNsYXNzIFVuaW9uVHlwZSBleHRlbmRzIFR5cGU8VW5pb25UeXBlPiBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8VW5pb25UeXBlPiB7CisKKyAgICBwcml2YXRlIExpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHM7CisKKyAgICBwdWJsaWMgVW5pb25UeXBlKFJhbmdlIHJhbmdlLCBMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzKSB7CisgICAgICAgIHN1cGVyKHJhbmdlKTsKKyAgICAgICAgc2V0RWxlbWVudHMoZWxlbWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBVbmlvblR5cGUoTGlzdDxSZWZlcmVuY2VUeXBlPiBlbGVtZW50cykgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRFbGVtZW50cyhlbGVtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UmVmZXJlbmNlVHlwZT4gZ2V0RWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5pb25UeXBlIHNldEVsZW1lbnRzKExpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMpIHsKKyAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBlbGVtZW50cyl7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRQYXJlbnROb2RlKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5lbGVtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5rbm93blR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Vbmtub3duVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NmM1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5rbm93blR5cGUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIHVua25vd24gcGFyYW1ldGVyIHR5cGUgb2JqZWN0LiBJdCBwbGF5cyB0aGUgcm9sZSBvZiBhIG51bGwgb2JqZWN0IGZvcgorICogbGFtYmRhIHBhcmFtZXRlcnMgdGhhdCBoYXZlIG5vIGV4cGxpY2l0IHR5cGUgZGVjbGFyZWQuIEFzIHN1Y2gsIGl0IGhhcyBubworICogbGV4aWNhbCByZXByZXNlbnRhdGlvbiBhbmQgaGVuY2UgZ2V0cyBubyBjb21tZW50IGF0dHJpYnV0ZWQuCisgKgorICogQGF1dGhvciBEaWRpZXIgVmlsbGV2YWxvaXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVua25vd25UeXBlIGV4dGVuZHMgVHlwZTxVbmtub3duVHlwZT4geworCisgICAgcHVibGljIFVua25vd25UeXBlKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZmVycmVkIGxhbWJkYSB0eXBlcyBjYW5ub3QgYmUgYW5ub3RhdGVkLiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVbmtub3duVHlwZSBzZXRBbm5vdGF0aW9ucyhMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmZlcnJlZCBsYW1iZGEgdHlwZXMgY2Fubm90IGJlIGFubm90YXRlZC4iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Wb2lkVHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1ZvaWRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmNzI3MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Wb2lkVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aEFubm90YXRpb25zOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWb2lkVHlwZSBleHRlbmRzIFR5cGU8Vm9pZFR5cGU+IGltcGxlbWVudHMgTm9kZVdpdGhBbm5vdGF0aW9uczxWb2lkVHlwZT4geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBWb2lkVHlwZSBWT0lEX1RZUEUgPSBuZXcgVm9pZFR5cGUoKTsKKworCXB1YmxpYyBWb2lkVHlwZSgpIHsKKwl9CisKKwlwdWJsaWMgVm9pZFR5cGUoUmFuZ2UgcmFuZ2UpIHsKKwkJc3VwZXIocmFuZ2UpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1dpbGRjYXJkVHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1dpbGRjYXJkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTQ5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvV2lsZGNhcmRUeXBlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdpbGRjYXJkVHlwZSBleHRlbmRzIFR5cGU8V2lsZGNhcmRUeXBlPiBpbXBsZW1lbnRzIE5vZGVXaXRoQW5ub3RhdGlvbnM8V2lsZGNhcmRUeXBlPiB7CisKKwlwcml2YXRlIFJlZmVyZW5jZVR5cGUgZXh0OworCisJcHJpdmF0ZSBSZWZlcmVuY2VUeXBlIHN1cDsKKworCXB1YmxpYyBXaWxkY2FyZFR5cGUoKSB7CisJfQorCisJcHVibGljIFdpbGRjYXJkVHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dCkgeworCQlzZXRFeHRlbmRzKGV4dCk7CisJfQorCisJcHVibGljIFdpbGRjYXJkVHlwZShmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dCwgZmluYWwgUmVmZXJlbmNlVHlwZSBzdXApIHsKKwkJc2V0RXh0ZW5kcyhleHQpOworCQlzZXRTdXBlcihzdXApOworCX0KKworCXB1YmxpYyBXaWxkY2FyZFR5cGUoZmluYWwgUmFuZ2UgcmFuZ2UsCisJCQlmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dCwgZmluYWwgUmVmZXJlbmNlVHlwZSBzdXApIHsKKwkJc3VwZXIocmFuZ2UpOworCQlzZXRFeHRlbmRzKGV4dCk7CisJCXNldFN1cGVyKHN1cCk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFJlZmVyZW5jZVR5cGUgZ2V0RXh0ZW5kcygpIHsKKwkJcmV0dXJuIGV4dDsKKwl9CisKKwlwdWJsaWMgUmVmZXJlbmNlVHlwZSBnZXRTdXBlcigpIHsKKwkJcmV0dXJuIHN1cDsKKwl9CisKKwlwdWJsaWMgV2lsZGNhcmRUeXBlIHNldEV4dGVuZHMoZmluYWwgUmVmZXJlbmNlVHlwZSBleHQpIHsKKwkJdGhpcy5leHQgPSBleHQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXh0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFdpbGRjYXJkVHlwZSBzZXRTdXBlcihmaW5hbCBSZWZlcmVuY2VUeXBlIHN1cCkgeworCQl0aGlzLnN1cCA9IHN1cDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zdXApOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9DbG9uZVZpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9DbG9uZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NhMGUwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0Nsb25lVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2hhckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRG91YmxlTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbE1pblZhbHVlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTnVsbExpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJyZWFrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKK3B1YmxpYyBjbGFzcyBDbG9uZVZpc2l0b3IgaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxOb2RlLCBPYmplY3Q+IHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VfID0gY2xvbmVOb2Rlcyhfbi5nZXRQYWNrYWdlKCksIF9hcmcpOworCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdmlzaXQoX24uZ2V0SW1wb3J0cygpLCBfYXJnKTsKKyAgICAgICAgTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzID0gdmlzaXQoX24uZ2V0VHlwZXMoKSwgX2FyZyk7CisKKwkJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlwYWNrYWdlXywgaW1wb3J0cywgdHlwZXMKKwkJKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCU5hbWVFeHByIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlQYWNrYWdlRGVjbGFyYXRpb24gciA9IG5ldyBQYWNrYWdlRGVjbGFyYXRpb24oCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlhbm5vdGF0aW9ucywgbmFtZQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlOYW1lRXhwciBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJSW1wb3J0RGVjbGFyYXRpb24gciA9IG5ldyBJbXBvcnREZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCW5hbWUsIF9uLmlzU3RhdGljKCksIF9uLmlzQXN0ZXJpc2soKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFR5cGVQYXJhbWV0ZXIgX24sIE9iamVjdCBfYXJnKSB7CisgICAgICAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCA9IHZpc2l0KF9uLmdldFR5cGVCb3VuZCgpLCBfYXJnKTsKKworICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworICAgICAgICBUeXBlUGFyYW1ldGVyIHIgPSBuZXcgVHlwZVBhcmFtZXRlcihfbi5nZXRSYW5nZSgpLAorICAgICAgICAgICAgICAgIF9uLmdldE5hbWUoKSwgdHlwZUJvdW5kLCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KExpbmVDb21tZW50IF9uLCBPYmplY3QgX2FyZykgeworCQlyZXR1cm4gbmV3IExpbmVDb21tZW50KF9uLmdldFJhbmdlKCksIF9uLmdldENvbnRlbnQoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQmxvY2tDb21tZW50IF9uLCBPYmplY3QgX2FyZykgeworCQlyZXR1cm4gbmV3IEJsb2NrQ29tbWVudChfbi5nZXRSYW5nZSgpLCBfbi5nZXRDb250ZW50KCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFR5cGVQYXJhbWV0ZXJzKCksIF9hcmcpOworCQlMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBleHRlbmRzTGlzdCA9IHZpc2l0KF9uLmdldEV4dGVuZHMoKSwgX2FyZyk7CisJCUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0ID0gdmlzaXQoX24uZ2V0SW1wbGVtZW50cygpLCBfYXJnKTsKKyAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSB2aXNpdChfbi5nZXRNZW1iZXJzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHIgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCBfbi5pc0ludGVyZmFjZSgpLCBfbi5nZXROYW1lKCksIHR5cGVQYXJhbWV0ZXJzLCBleHRlbmRzTGlzdCwgaW1wbGVtZW50c0xpc3QsIG1lbWJlcnMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChFbnVtRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0ID0gdmlzaXQoX24uZ2V0SW1wbGVtZW50cygpLCBfYXJnKTsKKwkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcyA9IHZpc2l0KF9uLmdldEVudHJpZXMoKSwgX2FyZyk7CisgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzID0gdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUVudW1EZWNsYXJhdGlvbiByID0gbmV3IEVudW1EZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCSBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIF9uLmdldE5hbWUoKSwgaW1wbGVtZW50c0xpc3QsIGVudHJpZXMsIG1lbWJlcnMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChFbXB0eVR5cGVEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUVtcHR5VHlwZURlY2xhcmF0aW9uIHIgPSBuZXcgRW1wdHlUeXBlRGVjbGFyYXRpb24oCisJCQkJX24uZ2V0UmFuZ2UoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEVudW1Db25zdGFudERlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworCQlMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSB2aXNpdChfbi5nZXRBcmdzKCksIF9hcmcpOworICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gY2xhc3NCb2R5ID0gdmlzaXQoX24uZ2V0Q2xhc3NCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRW51bUNvbnN0YW50RGVjbGFyYXRpb24gciA9IG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCSBhbm5vdGF0aW9ucywgX24uZ2V0TmFtZSgpLCBhcmdzLCBjbGFzc0JvZHkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBbm5vdGF0aW9uRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzID0gdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFubm90YXRpb25EZWNsYXJhdGlvbiByID0gbmV3IEFubm90YXRpb25EZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCSBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIF9uLmdldE5hbWUoKSwgbWVtYmVycworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJVHlwZTw/PiB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUgPSBjbG9uZU5vZGVzKF9uLmdldERlZmF1bHRWYWx1ZSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiByID0gbmV3IEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCSBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCBfbi5nZXROYW1lKCksIGRlZmF1bHRWYWx1ZQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zXyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworCQlUeXBlPD8+IGVsZW1lbnRUeXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0RWxlbWVudFR5cGUoKSwgX2FyZyk7CisJCUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXNfID0gdmlzaXQoX24uZ2V0VmFyaWFibGVzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisgICAgICAgIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGVfID0gdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIF9hcmcpOworCisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gciA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJIF9uLmdldE1vZGlmaWVycygpLCAKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc18sIAorICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlXywgCisgICAgICAgICAgICAgICAgdmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZV8KKyAgICAgICAgICAgICAgICAKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3IgX24sIE9iamVjdCBfYXJnKSB7CisJCVZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gY2xvbmVOb2Rlcyhfbi5nZXRJZCgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBpbml0ID0gY2xvbmVOb2Rlcyhfbi5nZXRJbml0KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVmFyaWFibGVEZWNsYXJhdG9yIHIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdG9yKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJaWQsIGluaXQKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3JJZCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCQlMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJJZF8gPSB2aXNpdChfbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKSwgX2FyZyk7CisKKwkJVmFyaWFibGVEZWNsYXJhdG9ySWQgciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZCgKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCV9uLmdldE5hbWUoKSwKKwkJCQlhcnJheUJyYWNrZXRQYWlyc0FmdGVySWRfCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFR5cGVQYXJhbWV0ZXJzKCksIF9hcmcpOworCQlMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFBhcmFtZXRlcnMoKSwgX2FyZyk7CisJCUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXyA9IHZpc2l0KF9uLmdldFRocm93cygpLCBfYXJnKTsKKwkJQmxvY2tTdG10IGJsb2NrID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ29uc3RydWN0b3JEZWNsYXJhdGlvbiByID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24oCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQkgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCB0eXBlUGFyYW1ldGVycywgX24uZ2V0TmFtZSgpLCBwYXJhbWV0ZXJzLCB0aHJvd3NfLCBibG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uc18gPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyc18gPSB2aXNpdChfbi5nZXRUeXBlUGFyYW1ldGVycygpLCBfYXJnKTsKKwkJVHlwZTw/PiB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0RWxlbWVudFR5cGUoKSwgX2FyZyk7CisgICAgICAgIE5hbWVFeHByIG5hbWVFeHByXyA9IGNsb25lTm9kZXMoX24uZ2V0TmFtZUV4cHIoKSwgX2FyZyk7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzXyA9IHZpc2l0KF9uLmdldFBhcmFtZXRlcnMoKSwgX2FyZyk7CisJCUxpc3Q8UmVmZXJlbmNlVHlwZT4gdGhyb3dzXyA9IHZpc2l0KF9uLmdldFRocm93cygpLCBfYXJnKTsKKwkJQmxvY2tTdG10IGJsb2NrXyA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCQlMaXN0PEFycmF5QnJhY2tldFBhaXI+IGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZV8gPSB2aXNpdChfbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSwgX2FyZyk7CisJCUxpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3RfID0gdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3QoKSwgX2FyZyk7CisKKwkJTWV0aG9kRGVjbGFyYXRpb24gciA9IG5ldyBNZXRob2REZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCSBfbi5nZXRNb2RpZmllcnMoKSwgCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNfLCAKKyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyc18sIAorICAgICAgICAgICAgICAgIHR5cGVfLAorICAgICAgICAgICAgICAgIGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZV8sCisgICAgICAgICAgICAgICAgbmFtZUV4cHJfLCAKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXywgCisgICAgICAgICAgICAgICAgYXJyYXlCcmFja2V0UGFpcnNBZnRlclBhcmFtZXRlckxpc3RfLCAKKyAgICAgICAgICAgICAgICB0aHJvd3NfLCAKKyAgICAgICAgICAgICAgICBibG9ja18KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChQYXJhbWV0ZXIgX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCVR5cGU8Pz4gdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldEVsZW1lbnRUeXBlKCksIF9hcmcpOworCQlWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCA9IGNsb25lTm9kZXMoX24uZ2V0SWQoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKyAgICAgICAgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZV8gPSB2aXNpdChfbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSwgX2FyZyk7CisKKyAgICAgICAgUGFyYW1ldGVyIHIgPSBuZXcgUGFyYW1ldGVyKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0TW9kaWZpZXJzKCksIAorICAgICAgICAgICAgICAgIGFubm90YXRpb25zLCAKKyAgICAgICAgICAgICAgICB0eXBlXywKKyAgICAgICAgICAgICAgICBhcnJheUJyYWNrZXRQYWlyc0FmdGVyVHlwZV8sCisgICAgICAgICAgICAgICAgX24uaXNWYXJBcmdzKCksIAorICAgICAgICAgICAgICAgIGlkCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUVtcHR5TWVtYmVyRGVjbGFyYXRpb24gciA9IG5ldyBFbXB0eU1lbWJlckRlY2xhcmF0aW9uKAorCQkJCV9uLmdldFJhbmdlKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChJbml0aWFsaXplckRlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlCbG9ja1N0bXQgYmxvY2sgPSBjbG9uZU5vZGVzKF9uLmdldEJsb2NrKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiByID0gbmV3IEluaXRpYWxpemVyRGVjbGFyYXRpb24oCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQkgX24uaXNTdGF0aWMoKSwgYmxvY2sKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChKYXZhZG9jQ29tbWVudCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCQlKYXZhZG9jQ29tbWVudCByID0gbmV3IEphdmFkb2NDb21tZW50KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0Q29udGVudCgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ2xhc3NPckludGVyZmFjZVR5cGUgX24sIE9iamVjdCBfYXJnKSB7CisJCUNsYXNzT3JJbnRlcmZhY2VUeXBlIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzXyA9IHZpc2l0KF9uLmdldFR5cGVBcmd1bWVudHMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDbGFzc09ySW50ZXJmYWNlVHlwZSByID0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJc2NvcGUsCisJCQkJX24uZ2V0TmFtZSgpLAorCQkJCV9uLmdldFR5cGVBcmd1bWVudHMoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFByaW1pdGl2ZVR5cGUgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKworCQlQcmltaXRpdmVUeXBlIHIgPSBuZXcgUHJpbWl0aXZlVHlwZSgKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCV9uLmdldFR5cGUoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBcnJheVR5cGUgX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubiA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworCQlUeXBlPD8+IHR5cGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21wb25lbnRUeXBlKCksIF9hcmcpOworCisJCUFycmF5VHlwZSByID0gbmV3IEFycmF5VHlwZShfbi5nZXRSYW5nZSgpLCB0eXBlXywgYW5uKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFycmF5Q3JlYXRpb25MZXZlbCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5uID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCUV4cHJlc3Npb24gZGltZW5zaW9uXyA9IGNsb25lTm9kZXMoX24uZ2V0RGltZW5zaW9uKCksIF9hcmcpOworCisJCUFycmF5Q3JlYXRpb25MZXZlbCByID0gbmV3IEFycmF5Q3JlYXRpb25MZXZlbChfbi5nZXRSYW5nZSgpLCBkaW1lbnNpb25fLCBhbm4pOworCisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTm9kZSB2aXNpdChJbnRlcnNlY3Rpb25UeXBlIF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworICAgICAgICBMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzID0gdmlzaXQoX24uZ2V0RWxlbWVudHMoKSwgX2FyZyk7CisKKyAgICAgICAgSW50ZXJzZWN0aW9uVHlwZSByID0gbmV3IEludGVyc2VjdGlvblR5cGUoX24uZ2V0UmFuZ2UoKSwgZWxlbWVudHMpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOb2RlIHZpc2l0KFVuaW9uVHlwZSBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKyAgICAgICAgTGlzdDxSZWZlcmVuY2VUeXBlPiBlbGVtZW50cyA9IHZpc2l0KF9uLmdldEVsZW1lbnRzKCksIF9hcmcpOworCisgICAgICAgIFVuaW9uVHlwZSByID0gbmV3IFVuaW9uVHlwZShfbi5nZXRSYW5nZSgpLAorICAgICAgICAgICAgICAgIGVsZW1lbnRzKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisJCXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChWb2lkVHlwZSBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVZvaWRUeXBlIHIgPSBuZXcgVm9pZFR5cGUoX24uZ2V0UmFuZ2UoKSk7CisJCXIuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFdpbGRjYXJkVHlwZSBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJUmVmZXJlbmNlVHlwZSBleHQgPSBjbG9uZU5vZGVzKF9uLmdldEV4dGVuZHMoKSwgX2FyZyk7CisJCVJlZmVyZW5jZVR5cGUgc3VwID0gY2xvbmVOb2Rlcyhfbi5nZXRTdXBlcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVdpbGRjYXJkVHlwZSByID0gbmV3IFdpbGRjYXJkVHlwZSgKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCWV4dCwgc3VwCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJci5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFVua25vd25UeXBlIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVW5rbm93blR5cGUgciA9IG5ldyBVbmtub3duVHlwZSgpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFycmF5QWNjZXNzRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpOworCQlFeHByZXNzaW9uIGluZGV4ID0gY2xvbmVOb2Rlcyhfbi5nZXRJbmRleCgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFycmF5QWNjZXNzRXhwciByID0gbmV3IEFycmF5QWNjZXNzRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCW5hbWUsIGluZGV4CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQXJyYXlDcmVhdGlvbkV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCVR5cGU8Pz4gdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZyk7CisJCUxpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiBsZXZlbHNfID0gdmlzaXQoX24uZ2V0TGV2ZWxzKCksIF9hcmcpOworCQlBcnJheUluaXRpYWxpemVyRXhwciBpbml0aWFsaXplcl8gPSBjbG9uZU5vZGVzKF9uLmdldEluaXRpYWxpemVyKCksIF9hcmcpOworCisJCUFycmF5Q3JlYXRpb25FeHByIHIgPSBuZXcgQXJyYXlDcmVhdGlvbkV4cHIoX24uZ2V0UmFuZ2UoKSwgdHlwZV8sIGxldmVsc18sIGluaXRpYWxpemVyXyk7CisKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXJFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEV4cHJlc3Npb24+IHZhbHVlcyA9IHZpc2l0KF9uLmdldFZhbHVlcygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFycmF5SW5pdGlhbGl6ZXJFeHByIHIgPSBuZXcgQXJyYXlJbml0aWFsaXplckV4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQl2YWx1ZXMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBc3NpZ25FeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIHRhcmdldCA9IGNsb25lTm9kZXMoX24uZ2V0VGFyZ2V0KCksIF9hcmcpOworCQlFeHByZXNzaW9uIHZhbHVlID0gY2xvbmVOb2Rlcyhfbi5nZXRWYWx1ZSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFzc2lnbkV4cHIgciA9IG5ldyBBc3NpZ25FeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJdGFyZ2V0LCB2YWx1ZSwgX24uZ2V0T3BlcmF0b3IoKSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQmluYXJ5RXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBsZWZ0ID0gY2xvbmVOb2Rlcyhfbi5nZXRMZWZ0KCksIF9hcmcpOworCQlFeHByZXNzaW9uIHJpZ2h0ID0gY2xvbmVOb2Rlcyhfbi5nZXRSaWdodCgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUJpbmFyeUV4cHIgciA9IG5ldyBCaW5hcnlFeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJbGVmdCwgcmlnaHQsIF9uLmdldE9wZXJhdG9yKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChDYXN0RXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJVHlwZTw/PiB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ2FzdEV4cHIgciA9IG5ldyBDYXN0RXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCXR5cGVfLCBleHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ2xhc3NFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlUeXBlPD8+IHR5cGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ2xhc3NFeHByIHIgPSBuZXcgQ2xhc3NFeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJdHlwZV8KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChDb25kaXRpb25hbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZyk7CisJCUV4cHJlc3Npb24gdGhlbkV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldFRoZW5FeHByKCksIF9hcmcpOworCQlFeHByZXNzaW9uIGVsc2VFeHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFbHNlRXhwcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUNvbmRpdGlvbmFsRXhwciByID0gbmV3IENvbmRpdGlvbmFsRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCWNvbmRpdGlvbiwgdGhlbkV4cHIsIGVsc2VFeHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRW5jbG9zZWRFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGlubmVyID0gY2xvbmVOb2Rlcyhfbi5nZXRJbm5lcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUVuY2xvc2VkRXhwciByID0gbmV3IEVuY2xvc2VkRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCWlubmVyCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRmllbGRBY2Nlc3NFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIHNjb3BlXyA9IGNsb25lTm9kZXMoX24uZ2V0U2NvcGUoKSwgX2FyZyk7CisJCUxpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3VtZW50c18gPSB2aXNpdChfbi5nZXRUeXBlQXJndW1lbnRzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRmllbGRBY2Nlc3NFeHByIHIgPSBuZXcgRmllbGRBY2Nlc3NFeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJc2NvcGVfLCAKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzXywgCisgICAgICAgICAgICAgICAgX24uZ2V0RmllbGQoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEluc3RhbmNlT2ZFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZyk7CisJCVR5cGU8Pz4gdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlJbnN0YW5jZU9mRXhwciByID0gbmV3IEluc3RhbmNlT2ZFeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJZXhwciwgdHlwZV8KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChTdHJpbmdMaXRlcmFsRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCQlTdHJpbmdMaXRlcmFsRXhwciByID0gbmV3IFN0cmluZ0xpdGVyYWxFeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0VmFsdWUoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEludGVnZXJMaXRlcmFsRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUludGVnZXJMaXRlcmFsRXhwciByID0gbmV3IEludGVnZXJMaXRlcmFsRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCV9uLmdldFZhbHVlKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChMb25nTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlMb25nTGl0ZXJhbEV4cHIgciA9IG5ldyBMb25nTGl0ZXJhbEV4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlfbi5nZXRWYWx1ZSgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciByID0gbmV3IEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByKF9uLmdldFJhbmdlKCkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KExvbmdMaXRlcmFsTWluVmFsdWVFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgciA9IG5ldyBMb25nTGl0ZXJhbE1pblZhbHVlRXhwcihfbi5nZXRSYW5nZSgpKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChDaGFyTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDaGFyTGl0ZXJhbEV4cHIgciA9IG5ldyBDaGFyTGl0ZXJhbEV4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlfbi5nZXRWYWx1ZSgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRG91YmxlTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlEb3VibGVMaXRlcmFsRXhwciByID0gbmV3IERvdWJsZUxpdGVyYWxFeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0VmFsdWUoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEJvb2xlYW5MaXRlcmFsRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUJvb2xlYW5MaXRlcmFsRXhwciByID0gbmV3IEJvb2xlYW5MaXRlcmFsRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCV9uLmdldFZhbHVlKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChOdWxsTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlOdWxsTGl0ZXJhbEV4cHIgciA9IG5ldyBOdWxsTGl0ZXJhbEV4cHIoX24uZ2V0UmFuZ2UoKSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoTWV0aG9kQ2FsbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gc2NvcGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzXyA9IHZpc2l0KF9uLmdldFR5cGVBcmd1bWVudHMoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gYXJnc18gPSB2aXNpdChfbi5nZXRBcmdzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTWV0aG9kQ2FsbEV4cHIgciA9IG5ldyBNZXRob2RDYWxsRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCXNjb3BlXywgCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50c18sIAorICAgICAgICAgICAgICAgIF9uLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgYXJnc18KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChOYW1lRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCU5hbWVFeHByIHIgPSBuZXcgTmFtZUV4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlfbi5nZXROYW1lKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChPYmplY3RDcmVhdGlvbkV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gc2NvcGUgPSBjbG9uZU5vZGVzKF9uLmdldFNjb3BlKCksIF9hcmcpOworCQlDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPD8+PiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmd1bWVudHMoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZyk7CisgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBhbm9ueW1vdXNCb2R5ID0gdmlzaXQoX24uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJT2JqZWN0Q3JlYXRpb25FeHByIHIgPSBuZXcgT2JqZWN0Q3JlYXRpb25FeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJc2NvcGUsIHR5cGVfLCB0eXBlQXJncywgYXJncywgYW5vbnltb3VzQm9keQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFF1YWxpZmllZE5hbWVFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlOYW1lRXhwciBzY29wZSA9IGNsb25lTm9kZXMoX24uZ2V0UXVhbGlmaWVyKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJUXVhbGlmaWVkTmFtZUV4cHIgciA9IG5ldyBRdWFsaWZpZWROYW1lRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCXNjb3BlLCBfbi5nZXROYW1lKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChUaGlzRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBjbGFzc0V4cHIgPSBjbG9uZU5vZGVzKF9uLmdldENsYXNzRXhwcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVRoaXNFeHByIHIgPSBuZXcgVGhpc0V4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQljbGFzc0V4cHIKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChTdXBlckV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gY2xhc3NFeHByID0gY2xvbmVOb2Rlcyhfbi5nZXRDbGFzc0V4cHIoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlTdXBlckV4cHIgciA9IG5ldyBTdXBlckV4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQljbGFzc0V4cHIKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChVbmFyeUV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVVuYXJ5RXhwciByID0gbmV3IFVuYXJ5RXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCWV4cHIsIF9uLmdldE9wZXJhdG9yKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJVHlwZTw/PiB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0RWxlbWVudFR5cGUoKSwgX2FyZyk7CisJCUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJzID0gdmlzaXQoX24uZ2V0VmFyaWFibGVzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisgICAgICAgIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnNBZnRlclR5cGVfID0gdmlzaXQoX24uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCksIF9hcmcpOworCisJCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlfbi5nZXRNb2RpZmllcnMoKSwgCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsIAorICAgICAgICAgICAgICAgIHR5cGVfLCAKKyAgICAgICAgICAgICAgICB2YXJzLAorICAgICAgICAgICAgICAgIGFycmF5QnJhY2tldFBhaXJzQWZ0ZXJUeXBlXworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1hcmtlckFubm90YXRpb25FeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlOYW1lRXhwciBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTWFya2VyQW5ub3RhdGlvbkV4cHIgciA9IG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcigKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCW5hbWUKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTmFtZUV4cHIgbmFtZSA9IGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSA9IGNsb25lTm9kZXMoX24uZ2V0TWVtYmVyVmFsdWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciByID0gbmV3IFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJbmFtZSwgbWVtYmVyVmFsdWUKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChOb3JtYWxBbm5vdGF0aW9uRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTmFtZUV4cHIgbmFtZSA9IGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKTsKKwkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzID0gdmlzaXQoX24uZ2V0UGFpcnMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlOb3JtYWxBbm5vdGF0aW9uRXhwciByID0gbmV3IE5vcm1hbEFubm90YXRpb25FeHByKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJbmFtZSwgcGFpcnMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gdmFsdWUgPSBjbG9uZU5vZGVzKF9uLmdldFZhbHVlKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTWVtYmVyVmFsdWVQYWlyIHIgPSBuZXcgTWVtYmVyVmFsdWVQYWlyKAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0TmFtZSgpLCB2YWx1ZQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzXyA9IHZpc2l0KF9uLmdldFR5cGVBcmd1bWVudHMoKSwgX2FyZyk7CisJCUV4cHJlc3Npb24gZXhwcl8gPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gYXJnc18gPSB2aXNpdChfbi5nZXRBcmdzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IHIgPSBuZXcgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJdHlwZUFyZ3VtZW50c18sIAorICAgICAgICAgICAgICAgIF9uLmlzVGhpcygpLCAKKyAgICAgICAgICAgICAgICBleHByXywgCisgICAgICAgICAgICAgICAgYXJnc18KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChUeXBlRGVjbGFyYXRpb25TdG10IF9uLCBPYmplY3QgX2FyZykgeworICAgICAgICBUeXBlRGVjbGFyYXRpb248Pz4gdHlwZURlY2wgPSBjbG9uZU5vZGVzKF9uLmdldFR5cGVEZWNsYXJhdGlvbigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVR5cGVEZWNsYXJhdGlvblN0bXQgciA9IG5ldyBUeXBlRGVjbGFyYXRpb25TdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJdHlwZURlY2wKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBc3NlcnRTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGNoZWNrID0gY2xvbmVOb2Rlcyhfbi5nZXRDaGVjaygpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBtZXNzYWdlID0gY2xvbmVOb2Rlcyhfbi5nZXRNZXNzYWdlKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQXNzZXJ0U3RtdCByID0gbmV3IEFzc2VydFN0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQljaGVjaywgbWVzc2FnZQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEJsb2NrU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gdmlzaXQoX24uZ2V0U3RtdHMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlCbG9ja1N0bXQgciA9IG5ldyBCbG9ja1N0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlzdG10cworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KExhYmVsZWRTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlTdGF0ZW1lbnQgc3RtdCA9IGNsb25lTm9kZXMoX24uZ2V0U3RtdCgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUxhYmVsZWRTdG10IHIgPSBuZXcgTGFiZWxlZFN0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlfbi5nZXRMYWJlbCgpLCBzdG10CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRW1wdHlTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRW1wdHlTdG10IHIgPSBuZXcgRW1wdHlTdG10KF9uLmdldFJhbmdlKCkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEV4cHJlc3Npb25TdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHJlc3Npb24oKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlFeHByZXNzaW9uU3RtdCByID0gbmV3IEV4cHJlc3Npb25TdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJZXhwcgorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFN3aXRjaFN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gc2VsZWN0b3IgPSBjbG9uZU5vZGVzKF9uLmdldFNlbGVjdG9yKCksIF9hcmcpOworCQlMaXN0PFN3aXRjaEVudHJ5U3RtdD4gZW50cmllcyA9IHZpc2l0KF9uLmdldEVudHJpZXMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlTd2l0Y2hTdG10IHIgPSBuZXcgU3dpdGNoU3RtdCgKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCXNlbGVjdG9yLCBlbnRyaWVzCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoU3dpdGNoRW50cnlTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGxhYmVsID0gY2xvbmVOb2Rlcyhfbi5nZXRMYWJlbCgpLCBfYXJnKTsKKwkJTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gdmlzaXQoX24uZ2V0U3RtdHMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlTd2l0Y2hFbnRyeVN0bXQgciA9IG5ldyBTd2l0Y2hFbnRyeVN0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlsYWJlbCwgc3RtdHMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChCcmVha1N0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlCcmVha1N0bXQgciA9IG5ldyBCcmVha1N0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlfbi5nZXRJZCgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoUmV0dXJuU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJUmV0dXJuU3RtdCByID0gbmV3IFJldHVyblN0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlleHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoSWZTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpOworCQlTdGF0ZW1lbnQgdGhlblN0bXQgPSBjbG9uZU5vZGVzKF9uLmdldFRoZW5TdG10KCksIF9hcmcpOworCQlTdGF0ZW1lbnQgZWxzZVN0bXQgPSBjbG9uZU5vZGVzKF9uLmdldEVsc2VTdG10KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJSWZTdG10IHIgPSBuZXcgSWZTdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJY29uZGl0aW9uLCB0aGVuU3RtdCwgZWxzZVN0bXQKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChXaGlsZVN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZyk7CisJCVN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJV2hpbGVTdG10IHIgPSBuZXcgV2hpbGVTdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJY29uZGl0aW9uLCBib2R5CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ29udGludWVTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ29udGludWVTdG10IHIgPSBuZXcgQ29udGludWVTdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJX24uZ2V0SWQoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KERvU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJU3RhdGVtZW50IGJvZHkgPSBjbG9uZU5vZGVzKF9uLmdldEJvZHkoKSwgX2FyZyk7CisJCUV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlEb1N0bXQgciA9IG5ldyBEb1N0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlib2R5LCBjb25kaXRpb24KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChGb3JlYWNoU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyID0gY2xvbmVOb2Rlcyhfbi5nZXRWYXJpYWJsZSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBpdGVyYWJsZSA9IGNsb25lTm9kZXMoX24uZ2V0SXRlcmFibGUoKSwgX2FyZyk7CisJCVN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRm9yZWFjaFN0bXQgciA9IG5ldyBGb3JlYWNoU3RtdCgKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCXZhciwgaXRlcmFibGUsIGJvZHkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChGb3JTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEV4cHJlc3Npb24+IGluaXQgPSB2aXNpdChfbi5nZXRJbml0KCksIF9hcmcpOworCQlFeHByZXNzaW9uIGNvbXBhcmUgPSBjbG9uZU5vZGVzKF9uLmdldENvbXBhcmUoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlID0gdmlzaXQoX24uZ2V0VXBkYXRlKCksIF9hcmcpOworCQlTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUZvclN0bXQgciA9IG5ldyBGb3JTdG10KAorCQkJCV9uLmdldFJhbmdlKCksCisJCQkJaW5pdCwgY29tcGFyZSwgdXBkYXRlLCBib2R5CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoVGhyb3dTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlUaHJvd1N0bXQgciA9IG5ldyBUaHJvd1N0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlleHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoU3luY2hyb25pemVkU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpOworCQlCbG9ja1N0bXQgYmxvY2sgPSBjbG9uZU5vZGVzKF9uLmdldEJvZHkoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlTeW5jaHJvbml6ZWRTdG10IHIgPSBuZXcgU3luY2hyb25pemVkU3RtdCgKKwkJCQlfbi5nZXRSYW5nZSgpLAorCQkJCWV4cHIsIGJsb2NrCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoVHJ5U3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gcmVzb3VyY2VzID0gdmlzaXQoX24uZ2V0UmVzb3VyY2VzKCksX2FyZyk7CisJCUJsb2NrU3RtdCB0cnlCbG9jayA9IGNsb25lTm9kZXMoX24uZ2V0VHJ5QmxvY2soKSwgX2FyZyk7CisJCUxpc3Q8Q2F0Y2hDbGF1c2U+IGNhdGNocyA9IHZpc2l0KF9uLmdldENhdGNocygpLCBfYXJnKTsKKwkJQmxvY2tTdG10IGZpbmFsbHlCbG9jayA9IGNsb25lTm9kZXMoX24uZ2V0RmluYWxseUJsb2NrKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVHJ5U3RtdCByID0gbmV3IFRyeVN0bXQoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlyZXNvdXJjZXMsIHRyeUJsb2NrLCBjYXRjaHMsIGZpbmFsbHlCbG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENhdGNoQ2xhdXNlIF9uLCBPYmplY3QgX2FyZykgeworCQlQYXJhbWV0ZXIgcGFyYW0gPSBjbG9uZU5vZGVzKF9uLmdldFBhcmFtKCksIF9hcmcpOworCQlCbG9ja1N0bXQgY2F0Y2hCbG9jayA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUNhdGNoQ2xhdXNlIHIgPSBuZXcgQ2F0Y2hDbGF1c2UoCisJCQkJX24uZ2V0UmFuZ2UoKSwKKwkJCQlwYXJhbS5nZXRNb2RpZmllcnMoKSwgcGFyYW0uZ2V0QW5ub3RhdGlvbnMoKSwgcGFyYW0uZ2V0RWxlbWVudFR5cGUoKSwgcGFyYW0uZ2V0SWQoKSwgY2F0Y2hCbG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KExhbWJkYUV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisKKwkJTGlzdDxQYXJhbWV0ZXI+IGxhbWJkYVBhcmFtZXRlcnMgPSB2aXNpdChfbi5nZXRQYXJhbWV0ZXJzKCksIF9hcmcpOworCisJCVN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCisJCXJldHVybiBuZXcgTGFtYmRhRXhwcihfbi5nZXRSYW5nZSgpLCBsYW1iZGFQYXJhbWV0ZXJzLCBib2R5LAorCQkJCV9uLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgX24sIE9iamVjdCBhcmcpIHsKKworCQlFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBhcmcpOworCisJCXJldHVybiBuZXcgTWV0aG9kUmVmZXJlbmNlRXhwcihfbi5nZXRSYW5nZSgpLCBzY29wZSwKKwkJCQlfbi5nZXRUeXBlQXJndW1lbnRzKCksIF9uLmdldElkZW50aWZpZXIoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoVHlwZUV4cHIgbiwgT2JqZWN0IGFyZykgeworCisJCVR5cGU8Pz4gdCA9IGNsb25lTm9kZXMobi5nZXRUeXBlKCksIGFyZyk7CisKKwkJcmV0dXJuIG5ldyBUeXBlRXhwcihuLmdldFJhbmdlKCksIHQpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFycmF5QnJhY2tldFBhaXIgX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisKKwkJcmV0dXJuIG5ldyBBcnJheUJyYWNrZXRQYWlyKF9uLmdldFJhbmdlKCksIGFubm90YXRpb25zKTsKKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBOb2RlPiBMaXN0PFQ+IHZpc2l0KExpc3Q8VD4gX25vZGVzLCBPYmplY3QgX2FyZykgeworICAgICAgICBpZiAoX25vZGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgTGlzdDxUPiByID0gbmV3IEFycmF5TGlzdDw+KF9ub2Rlcy5zaXplKCkpOworICAgICAgICBmb3IgKFQgbiA6IF9ub2RlcykgeworICAgICAgICAgICAgVCByTiA9IGNsb25lTm9kZXMobiwgX2FyZyk7CisgICAgICAgICAgICBpZiAock4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByLmFkZChyTik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgTm9kZT4gVCBjbG9uZU5vZGVzKFQgX25vZGUsIE9iamVjdCBfYXJnKSB7CisgICAgICAgIGlmIChfbm9kZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIE5vZGUgciA9IF9ub2RlLmFjY2VwdCh0aGlzLCBfYXJnKTsKKyAgICAgICAgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKFQpIHI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0R1bXBWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvRHVtcFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjlmMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0R1bXBWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxNjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmlzTnVsbE9yRW1wdHk7CisKKy8qKgorICogRHVtcHMgdGhlIEFTVCB0byBmb3JtYXR0ZWQgSmF2YSBzb3VyY2UgY29kZS4KKyAqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGNsYXNzIER1bXBWaXNpdG9yIGltcGxlbWVudHMgVm9pZFZpc2l0b3I8T2JqZWN0PiB7CisKKwlwcml2YXRlIGJvb2xlYW4gcHJpbnRDb21tZW50czsKKworCXB1YmxpYyBEdW1wVmlzaXRvcigpIHsKKwkJdGhpcyh0cnVlKTsKKwl9CisKKwlwdWJsaWMgRHVtcFZpc2l0b3IoYm9vbGVhbiBwcmludENvbW1lbnRzKSB7CisJCXRoaXMucHJpbnRDb21tZW50cyA9IHByaW50Q29tbWVudHM7CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBTb3VyY2VQcmludGVyIHsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBpbmRlbnRhdGlvbjsKKworCQlwdWJsaWMgU291cmNlUHJpbnRlcihmaW5hbCBTdHJpbmcgaW5kZW50YXRpb24pIHsKKwkJCXRoaXMuaW5kZW50YXRpb24gPSBpbmRlbnRhdGlvbjsKKwkJfQorCisJCXByaXZhdGUgaW50IGxldmVsID0gMDsKKworCQlwcml2YXRlIGJvb2xlYW4gaW5kZW50ZWQgPSBmYWxzZTsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQlwdWJsaWMgdm9pZCBpbmRlbnQoKSB7CisJCQlsZXZlbCsrOworCQl9CisKKwkJcHVibGljIHZvaWQgdW5pbmRlbnQoKSB7CisJCQlsZXZlbC0tOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIG1ha2VJbmRlbnQoKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKKwkJCQlidWYuYXBwZW5kKGluZGVudGF0aW9uKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIHByaW50KGZpbmFsIFN0cmluZyBhcmcpIHsKKwkJCWlmICghaW5kZW50ZWQpIHsKKwkJCQltYWtlSW5kZW50KCk7CisJCQkJaW5kZW50ZWQgPSB0cnVlOworCQkJfQorCQkJYnVmLmFwcGVuZChhcmcpOworCQl9CisKKwkJcHVibGljIHZvaWQgcHJpbnRMbihmaW5hbCBTdHJpbmcgYXJnKSB7CisJCQlwcmludChhcmcpOworCQkJcHJpbnRMbigpOworCQl9CisKKwkJcHVibGljIHZvaWQgcHJpbnRMbigpIHsKKwkJCWJ1Zi5hcHBlbmQoRU9MKTsKKwkJCWluZGVudGVkID0gZmFsc2U7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKKwkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIGdldFNvdXJjZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTb3VyY2VQcmludGVyIHByaW50ZXIgPSBjcmVhdGVTb3VyY2VQcmludGVyKCk7CisKKwlwcm90ZWN0ZWQgU291cmNlUHJpbnRlciBjcmVhdGVTb3VyY2VQcmludGVyKCkgeworCQlyZXR1cm4gbmV3IFNvdXJjZVByaW50ZXIoIiAgICAiKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKKwkJcmV0dXJuIHByaW50ZXIuZ2V0U291cmNlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50TW9kaWZpZXJzKGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycykgeworCQlpZiAobW9kaWZpZXJzLnNpemUoKSA+IDApCisJCQlwcmludGVyLnByaW50KG1vZGlmaWVycy5zdHJlYW0oKS5tYXAoTW9kaWZpZXI6OmdldExpYikuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiAiKSkgKyAiICIpOworCX0KKworCXByaXZhdGUgdm9pZCBwcmludE1lbWJlcnMoZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMsIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbWVtYmVycykgeworCQkJcHJpbnRlci5wcmludExuKCk7CisJCQltZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50TG4oKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmludE1lbWJlckFubm90YXRpb25zKGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCWlmICghaXNOdWxsT3JFbXB0eShhbm5vdGF0aW9ucykpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IGFubm90YXRpb25zKSB7CisJCQkJYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmludEFubm90YXRpb25zKGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBib29sZWFuIHByZWZpeFdpdGhBU3BhY2UsIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJaWYgKCFpc051bGxPckVtcHR5KGFubm90YXRpb25zKSkgeworCQkJaWYocHJlZml4V2l0aEFTcGFjZSl7CisJCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJfQorCQkJZm9yIChBbm5vdGF0aW9uRXhwciBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKwkJCQlhbm5vdGF0aW9uLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmludFR5cGVBcmdzKGZpbmFsIE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/PiBub2RlV2l0aFR5cGVBcmd1bWVudHMsIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzID0gbm9kZVdpdGhUeXBlQXJndW1lbnRzLmdldFR5cGVBcmd1bWVudHMoKTsKKwkJaWYgKCFpc051bGxPckVtcHR5KHR5cGVBcmd1bWVudHMpKSB7CisJCQlwcmludGVyLnByaW50KCI8Iik7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGU8Pz4+IGkgPSB0eXBlQXJndW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCQlmaW5hbCBUeXBlPD8+IHQgPSBpLm5leHQoKTsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJCXByaW50ZXIucHJpbnQoIj4iKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmludFR5cGVQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gYXJncywgZmluYWwgT2JqZWN0IGFyZykgeworCQlpZiAoIWlzTnVsbE9yRW1wdHkoYXJncykpIHsKKwkJCXByaW50ZXIucHJpbnQoIjwiKTsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8VHlwZVBhcmFtZXRlcj4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJCWZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9IGkubmV4dCgpOworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQkJcHJpbnRlci5wcmludCgiPiIpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50QXJndW1lbnRzKGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncywgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludGVyLnByaW50KCIoIik7CisJCWlmICghaXNOdWxsT3JFbXB0eShhcmdzKSkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gYXJncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJZmluYWwgRXhwcmVzc2lvbiBlID0gaS5uZXh0KCk7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpbnRlci5wcmludCgiKSIpOworCX0KKworCXByaXZhdGUgdm9pZCBwcmludEphdmFDb21tZW50KGZpbmFsIENvbW1lbnQgamF2YWNvbW1lbnQsIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJaWYgKGphdmFjb21tZW50ICE9IG51bGwpIHsKKwkJCWphdmFjb21tZW50LmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKworCQlpZiAobi5nZXRQYWNrYWdlKCkgIT0gbnVsbCkgeworCQkJbi5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKworCQlpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRJbXBvcnRzKCkpKSB7CisJCQlmb3IgKGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIGkgOiBuLmdldEltcG9ydHMoKSkgeworCQkJCWkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCQlwcmludGVyLnByaW50TG4oKTsKKwkJfQorCisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVzKCkpKSB7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGVEZWNsYXJhdGlvbjw/Pj4gaSA9IG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJaS5uZXh0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJcHJpbnRlci5wcmludExuKCk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworCQlwcmludGVyLnByaW50KCJwYWNrYWdlICIpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludExuKCI7Iik7CisJCXByaW50ZXIucHJpbnRMbigpOworCisJCXByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKworCQlwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFF1YWxpZmllZE5hbWVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiLiIpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKworCQlwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKCFuLmlzRW1wdHlJbXBvcnREZWNsYXJhdGlvbigpKSB7CisJCQlwcmludGVyLnByaW50KCJpbXBvcnQgIik7CisJCQlpZiAobi5pc1N0YXRpYygpKSB7CisJCQkJcHJpbnRlci5wcmludCgic3RhdGljICIpOworCQkJfQorCQkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAobi5pc0FzdGVyaXNrKCkpIHsKKwkJCQlwcmludGVyLnByaW50KCIuKiIpOworCQkJfQorCQl9CisJCXByaW50ZXIucHJpbnRMbigiOyIpOworCisJCXByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisJCXByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisJCWlmIChuLmlzSW50ZXJmYWNlKCkpIHsKKwkJCXByaW50ZXIucHJpbnQoImludGVyZmFjZSAiKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZXIucHJpbnQoImNsYXNzICIpOworCQl9CisKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisKKwkJcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisKKwkJaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0RXh0ZW5kcygpKSkgeworCQkJcHJpbnRlci5wcmludCgiIGV4dGVuZHMgIik7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpID0gbi5nZXRFeHRlbmRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJCWZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldEltcGxlbWVudHMoKSkpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBpbXBsZW1lbnRzICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCQlmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID0gaS5uZXh0KCk7CisJCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwcmludGVyLnByaW50TG4oIiB7Iik7CisJCXByaW50ZXIuaW5kZW50KCk7CisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldE1lbWJlcnMoKSkpIHsKKwkJCXByaW50TWVtYmVycyhuLmdldE1lbWJlcnMoKSwgYXJnKTsKKwkJfQorCisJCXByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisKKwkJcHJpbnRlci51bmluZGVudCgpOworCQlwcmludGVyLnByaW50KCJ9Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW1wdHlUeXBlRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisKKwkJcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50ZXIucHJpbnQoIi8qKiIpOworCQlwcmludGVyLnByaW50KG4uZ2V0Q29udGVudCgpKTsKKwkJcHJpbnRlci5wcmludExuKCIqLyIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCXByaW50ZXIucHJpbnQoIi4iKTsKKwkJfQorCQlmb3IgKEFubm90YXRpb25FeHByIGFlIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQlhZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJfQorCisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCisJCWlmIChuLmlzVXNpbmdEaWFtb25kT3BlcmF0b3IoKSkgeworCQkJcHJpbnRlci5wcmludCgiPD4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50VHlwZUFyZ3MobiwgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlmb3IgKEFubm90YXRpb25FeHByIGFubiA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJYW5uLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJcHJpbnRlci5wcmludCgiICIpOworCQl9CisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCQlpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUeXBlQm91bmQoKSkpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0VHlwZUJvdW5kKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJCWZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIgJiAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisJCXN3aXRjaCAobi5nZXRUeXBlKCkpIHsKKwkJCWNhc2UgQm9vbGVhbjoKKwkJCQlwcmludGVyLnByaW50KCJib29sZWFuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEJ5dGU6CisJCQkJcHJpbnRlci5wcmludCgiYnl0ZSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBDaGFyOgorCQkJCXByaW50ZXIucHJpbnQoImNoYXIiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRG91YmxlOgorCQkJCXByaW50ZXIucHJpbnQoImRvdWJsZSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBGbG9hdDoKKwkJCQlwcmludGVyLnByaW50KCJmbG9hdCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJbnQ6CisJCQkJcHJpbnRlci5wcmludCgiaW50Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIExvbmc6CisJCQkJcHJpbnRlci5wcmludCgibG9uZyIpOworCQkJCWJyZWFrOworCQkJY2FzZSBTaG9ydDoKKwkJCQlwcmludGVyLnByaW50KCJzaG9ydCIpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBcnJheVR5cGU+IGFycmF5VHlwZUJ1ZmZlciA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgVHlwZSB0eXBlID0gbjsKKyAgICAgICAgd2hpbGUgKHR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOworICAgICAgICAgICAgYXJyYXlUeXBlQnVmZmVyLmFkZChhcnJheVR5cGUpOworICAgICAgICAgICAgdHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBmb3IgKEFycmF5VHlwZSBhcnJheVR5cGUgOiBhcnJheVR5cGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHByaW50QW5ub3RhdGlvbnMoYXJyYXlUeXBlLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJbXSIpOworICAgICAgICB9CisgICAgfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIlsiKTsKKwkJaWYgKG4uZ2V0RGltZW5zaW9uKCkgIT0gbnVsbCkgeworCQkJbi5nZXREaW1lbnNpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlwcmludGVyLnByaW50KCJdIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKwkJYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKwkJZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKwkJCWVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAoaXNGaXJzdCkgeworCQkJCWlzRmlyc3QgPSBmYWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRlci5wcmludCgiICYgIik7CisJCQl9CisJCX0KKwl9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5pb25UeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisgICAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoUmVmZXJlbmNlVHlwZSBlbGVtZW50IDogbi5nZXRFbGVtZW50cygpKSB7CisgICAgICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIHwgIik7CisgICAgICAgICAgICB9CisJICAgICAgICBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIj8iKTsKKwkJaWYgKG4uZ2V0RXh0ZW5kcygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworCQkJbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0U3VwZXIoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgc3VwZXIgIik7CisJCQluLmdldFN1cGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCS8vIE5vdGhpbmcgdG8gZHVtcAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKTsKKworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKwkJcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisJCW4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJZm9yKEFycmF5QnJhY2tldFBhaXIgcGFpcjogbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSl7CisJCQlwYWlyLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisKKwkJcHJpbnRlci5wcmludCgiICIpOworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRvcj4gaSA9IG4uZ2V0VmFyaWFibGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHZhciA9IGkubmV4dCgpOworCQkJdmFyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCX0KKwkJfQorCisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldEluaXQoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgPSAiKTsKKwkJCW4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9ySWQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKwkJZm9yKEFycmF5QnJhY2tldFBhaXIgcGFpcjogbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKSl7CisJCQlwYWlyLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJ7Iik7CisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldFZhbHVlcygpKSkgeworCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJZmluYWwgRXhwcmVzc2lvbiBleHByID0gaS5uZXh0KCk7CisJCQkJZXhwci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCX0KKwkJcHJpbnRlci5wcmludCgifSIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworCQlwcmludGVyLnByaW50KCJ2b2lkIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIlsiKTsKKwkJbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCJdIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJuZXcgIik7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmb3IgKEFycmF5Q3JlYXRpb25MZXZlbCBsZXZlbCA6IG4uZ2V0TGV2ZWxzKCkpIHsKKwkJCWxldmVsLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJbi5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJc3dpdGNoIChuLmdldE9wZXJhdG9yKCkpIHsKKwkJCWNhc2UgYXNzaWduOgorCQkJCXByaW50ZXIucHJpbnQoIj0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgYW5kOgorCQkJCXByaW50ZXIucHJpbnQoIiY9Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9yOgorCQkJCXByaW50ZXIucHJpbnQoInw9Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIHhvcjoKKwkJCQlwcmludGVyLnByaW50KCJePSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBwbHVzOgorCQkJCXByaW50ZXIucHJpbnQoIis9Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIG1pbnVzOgorCQkJCXByaW50ZXIucHJpbnQoIi09Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIHJlbToKKwkJCQlwcmludGVyLnByaW50KCIlPSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBzbGFzaDoKKwkJCQlwcmludGVyLnByaW50KCIvPSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBzdGFyOgorCQkJCXByaW50ZXIucHJpbnQoIio9Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIGxTaGlmdDoKKwkJCQlwcmludGVyLnByaW50KCI8PD0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgclNpZ25lZFNoaWZ0OgorCQkJCXByaW50ZXIucHJpbnQoIj4+PSIpOworCQkJCWJyZWFrOworCQkJY2FzZSByVW5zaWduZWRTaGlmdDoKKwkJCQlwcmludGVyLnByaW50KCI+Pj49Iik7CisJCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRlci5wcmludCgiICIpOworCQluLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgIik7CisJCXN3aXRjaCAobi5nZXRPcGVyYXRvcigpKSB7CisJCQljYXNlIG9yOgorCQkJCXByaW50ZXIucHJpbnQoInx8Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIGFuZDoKKwkJCQlwcmludGVyLnByaW50KCImJiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBiaW5PcjoKKwkJCQlwcmludGVyLnByaW50KCJ8Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIGJpbkFuZDoKKwkJCQlwcmludGVyLnByaW50KCImIik7CisJCQkJYnJlYWs7CisJCQljYXNlIHhvcjoKKwkJCQlwcmludGVyLnByaW50KCJeIik7CisJCQkJYnJlYWs7CisJCQljYXNlIGVxdWFsczoKKwkJCQlwcmludGVyLnByaW50KCI9PSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBub3RFcXVhbHM6CisJCQkJcHJpbnRlci5wcmludCgiIT0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgbGVzczoKKwkJCQlwcmludGVyLnByaW50KCI8Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIGdyZWF0ZXI6CisJCQkJcHJpbnRlci5wcmludCgiPiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBsZXNzRXF1YWxzOgorCQkJCXByaW50ZXIucHJpbnQoIjw9Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIGdyZWF0ZXJFcXVhbHM6CisJCQkJcHJpbnRlci5wcmludCgiPj0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgbFNoaWZ0OgorCQkJCXByaW50ZXIucHJpbnQoIjw8Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIHJTaWduZWRTaGlmdDoKKwkJCQlwcmludGVyLnByaW50KCI+PiIpOworCQkJCWJyZWFrOworCQkJY2FzZSByVW5zaWduZWRTaGlmdDoKKwkJCQlwcmludGVyLnByaW50KCI+Pj4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgcGx1czoKKwkJCQlwcmludGVyLnByaW50KCIrIik7CisJCQkJYnJlYWs7CisJCQljYXNlIG1pbnVzOgorCQkJCXByaW50ZXIucHJpbnQoIi0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgdGltZXM6CisJCQkJcHJpbnRlci5wcmludCgiKiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBkaXZpZGU6CisJCQkJcHJpbnRlci5wcmludCgiLyIpOworCQkJCWJyZWFrOworCQkJY2FzZSByZW1haW5kZXI6CisJCQkJcHJpbnRlci5wcmludCgiJSIpOworCQkJCWJyZWFrOworCQl9CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKCIpOworCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKSAiKTsKKwkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIi5jbGFzcyIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiA/ICIpOworCQluLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiA6ICIpOworCQluLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW5jbG9zZWRFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKCIpOworCQlpZiAobi5nZXRJbm5lcigpICE9IG51bGwpIHsKKwkJCW4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlwcmludGVyLnByaW50KCIpIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRmllbGRBY2Nlc3NFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIuIik7CisJCXByaW50ZXIucHJpbnQobi5nZXRGaWVsZCgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgaW5zdGFuY2VvZiAiKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiJyIpOworCQlwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisJCXByaW50ZXIucHJpbnQoIiciKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiXCIiKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCQlwcmludGVyLnByaW50KCJcIiIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoU3RyaW5nLnZhbHVlT2Yobi5nZXRWYWx1ZSgpKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgibnVsbCIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCkgeworCQkJbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCXByaW50ZXIucHJpbnQoIi4iKTsKKwkJfQorCQlwcmludGVyLnByaW50KCJ0aGlzIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3VwZXJFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCkgeworCQkJbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCXByaW50ZXIucHJpbnQoIi4iKTsKKwkJfQorCQlwcmludGVyLnByaW50KCJzdXBlciIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCIuIik7CisJCX0KKwkJcHJpbnRUeXBlQXJncyhuLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKwkJcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCIuIik7CisJCX0KKworCQlwcmludGVyLnByaW50KCJuZXcgIik7CisKKwkJcHJpbnRUeXBlQXJncyhuLCBhcmcpOworCQlpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUeXBlQXJndW1lbnRzKCkpKSB7CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCX0KKworCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworCQlwcmludEFyZ3VtZW50cyhuLmdldEFyZ3MoKSwgYXJnKTsKKworCQlpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50TG4oIiB7Iik7CisJCQlwcmludGVyLmluZGVudCgpOworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCksIGFyZyk7CisJCQlwcmludGVyLnVuaW5kZW50KCk7CisJCQlwcmludGVyLnByaW50KCJ9Iik7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlzd2l0Y2ggKG4uZ2V0T3BlcmF0b3IoKSkgeworCQkJY2FzZSBwb3NpdGl2ZToKKwkJCQlwcmludGVyLnByaW50KCIrIik7CisJCQkJYnJlYWs7CisJCQljYXNlIG5lZ2F0aXZlOgorCQkJCXByaW50ZXIucHJpbnQoIi0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgaW52ZXJzZToKKwkJCQlwcmludGVyLnByaW50KCJ+Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIG5vdDoKKwkJCQlwcmludGVyLnByaW50KCIhIik7CisJCQkJYnJlYWs7CisJCQljYXNlIHByZUluY3JlbWVudDoKKwkJCQlwcmludGVyLnByaW50KCIrKyIpOworCQkJCWJyZWFrOworCQkJY2FzZSBwcmVEZWNyZW1lbnQ6CisJCQkJcHJpbnRlci5wcmludCgiLS0iKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCX0KKworCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKworCQlzd2l0Y2ggKG4uZ2V0T3BlcmF0b3IoKSkgeworCQkJY2FzZSBwb3NJbmNyZW1lbnQ6CisJCQkJcHJpbnRlci5wcmludCgiKysiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgcG9zRGVjcmVtZW50OgorCQkJCXByaW50ZXIucHJpbnQoIi0tIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworCQlwcmludFR5cGVQYXJhbWV0ZXJzKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKwkJaWYgKCFuLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKSB7CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCX0KKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisKKwkJcHJpbnRlci5wcmludCgiKCIpOworCQlpZiAoIW4uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJZmluYWwgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKwkJCQlwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGVyLnByaW50KCIpIik7CisKKwkJaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0VGhyb3dzKCkpKSB7CisJCQlwcmludGVyLnByaW50KCIgdGhyb3dzICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxSZWZlcmVuY2VUeXBlPiBpID0gbi5nZXRUaHJvd3MoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJZmluYWwgUmVmZXJlbmNlVHlwZSBuYW1lID0gaS5uZXh0KCk7CisJCQkJbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpbnRlci5wcmludCgiICIpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pOworCisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKwkJaWYgKG4uaXNEZWZhdWx0KCkpIHsKKwkJCXByaW50ZXIucHJpbnQoImRlZmF1bHQgIik7CisJCX0KKwkJcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVQYXJhbWV0ZXJzKCkpKSB7CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCX0KKworCQluLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWZvcihBcnJheUJyYWNrZXRQYWlyIHBhaXI6IG4uZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkpeworCQkJcGFpci5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlwcmludGVyLnByaW50KCIgIik7CisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCisJCXByaW50ZXIucHJpbnQoIigiKTsKKwkJaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0UGFyYW1ldGVycygpKSkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJZmluYWwgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKwkJCQlwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGVyLnByaW50KCIpIik7CisKKwkJZm9yKEFycmF5QnJhY2tldFBhaXIgcGFpcjogbi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyUGFyYW1ldGVyTGlzdCgpKXsKKwkJCXBhaXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKworCQlpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUaHJvd3MoKSkpIHsKKwkJCXByaW50ZXIucHJpbnQoIiB0aHJvd3MgIik7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFJlZmVyZW5jZVR5cGU+IGkgPSBuLmdldFRocm93cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCQlmaW5hbCBSZWZlcmVuY2VUeXBlIG5hbWUgPSBpLm5leHQoKTsKKwkJCQluYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRCb2R5KCkgPT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiOyIpOworCQl9IGVsc2UgeworCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQYXJhbWV0ZXIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisJCXByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCQlpZiAobi5nZXRFbGVtZW50VHlwZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlmb3IoQXJyYXlCcmFja2V0UGFpciBwYWlyOiBuLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpKXsKKwkJCXBhaXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uaXNWYXJBcmdzKCkpIHsKKwkJCXByaW50ZXIucHJpbnQoIi4uLiIpOworCQl9CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmlzVGhpcygpKSB7CisJCQlwcmludFR5cGVBcmdzKG4sIGFyZyk7CisJCQlwcmludGVyLnByaW50KCJ0aGlzIik7CisJCX0gZWxzZSB7CisJCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnQoIi4iKTsKKwkJCX0KKwkJCXByaW50VHlwZUFyZ3MobiwgYXJnKTsKKwkJCXByaW50ZXIucHJpbnQoInN1cGVyIik7CisJCX0KKwkJcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKwkJcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKwkJbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmb3IoQXJyYXlCcmFja2V0UGFpciBwYWlyOiBuLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpKXsKKwkJCXBhaXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJcHJpbnRlci5wcmludCgiICIpOworCisJCWZvciAoZmluYWwgSXRlcmF0b3I8VmFyaWFibGVEZWNsYXJhdG9yPiBpID0gbi5nZXRWYXJpYWJsZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdiA9IGkubmV4dCgpOworCQkJdi5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUeXBlRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiYXNzZXJ0ICIpOworCQluLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgOiAiKTsKKwkJCW4uZ2V0TWVzc2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKTsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludExuKCJ7Iik7CisJCWlmIChuLmdldFN0bXRzKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5pbmRlbnQoKTsKKwkJCWZvciAoZmluYWwgU3RhdGVtZW50IHMgOiBuLmdldFN0bXRzKCkpIHsKKwkJCQlzLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJfQorCQkJcHJpbnRlci51bmluZGVudCgpOworCQl9CisJCXByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJCXByaW50ZXIucHJpbnQoIn0iKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldExhYmVsKCkpOworCQlwcmludGVyLnByaW50KCI6ICIpOworCQluLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKTsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgic3dpdGNoKCIpOworCQluLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnRMbigiKSB7Iik7CisJCWlmIChuLmdldEVudHJpZXMoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLmluZGVudCgpOworCQkJZm9yIChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgZSA6IG4uZ2V0RW50cmllcygpKSB7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJCXByaW50ZXIudW5pbmRlbnQoKTsKKwkJfQorCQlwcmludGVyLnByaW50KCJ9Iik7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRMYWJlbCgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoImNhc2UgIik7CisJCQluLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCI6Iik7CisJCX0gZWxzZSB7CisJCQlwcmludGVyLnByaW50KCJkZWZhdWx0OiIpOworCQl9CisJCXByaW50ZXIucHJpbnRMbigpOworCQlwcmludGVyLmluZGVudCgpOworCQlpZiAobi5nZXRTdG10cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgU3RhdGVtZW50IHMgOiBuLmdldFN0bXRzKCkpIHsKKwkJCQlzLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJfQorCQl9CisJCXByaW50ZXIudW5pbmRlbnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJicmVhayIpOworCQlpZiAobi5nZXRJZCgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCXByaW50ZXIucHJpbnQobi5nZXRJZCgpKTsKKwkJfQorCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoInJldHVybiIpOworCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJcHJpbnRlci5wcmludCgiOyIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworCQlwcmludGVyLnByaW50KCJlbnVtICIpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKworCQlpZiAoIW4uZ2V0SW1wbGVtZW50cygpLmlzRW1wdHkoKSkgeworCQkJcHJpbnRlci5wcmludCgiIGltcGxlbWVudHMgIik7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpID0gbi5nZXRJbXBsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJCWZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXByaW50ZXIucHJpbnRMbigiIHsiKTsKKwkJcHJpbnRlci5pbmRlbnQoKTsKKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnRMbigpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gaSA9IG4uZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCQlmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlID0gaS5uZXh0KCk7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFuLmdldE1lbWJlcnMoKS5pc0VtcHR5KCkpIHsKKwkJCXByaW50ZXIucHJpbnRMbigiOyIpOworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpOworCQl9IGVsc2UgeworCQkJaWYgKCFuLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKKwkJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCX0KKwkJfQorCQlwcmludGVyLnVuaW5kZW50KCk7CisJCXByaW50ZXIucHJpbnQoIn0iKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKworCQlpZiAoIW4uZ2V0QXJncygpLmlzRW1wdHkoKSkgeworCQkJcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZyk7CisJCX0KKworCQlpZiAoIW4uZ2V0Q2xhc3NCb2R5KCkuaXNFbXB0eSgpKSB7CisJCQlwcmludGVyLnByaW50TG4oIiB7Iik7CisJCQlwcmludGVyLmluZGVudCgpOworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0Q2xhc3NCb2R5KCksIGFyZyk7CisJCQlwcmludGVyLnVuaW5kZW50KCk7CisJCQlwcmludGVyLnByaW50TG4oIn0iKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5TWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmlzU3RhdGljKCkpIHsKKwkJCXByaW50ZXIucHJpbnQoInN0YXRpYyAiKTsKKwkJfQorCQluLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSWZTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiaWYgKCIpOworCQluLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmaW5hbCBib29sZWFuIHRoZW5CbG9jayA9IG4uZ2V0VGhlblN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdDsKKwkJaWYgKHRoZW5CbG9jaykgLy8gYmxvY2sgc3RhdGVtZW50IHNob3VsZCBzdGFydCBvbiB0aGUgc2FtZSBsaW5lCisJCQlwcmludGVyLnByaW50KCIpICIpOworCQllbHNlIHsKKwkJCXByaW50ZXIucHJpbnRMbigiKSIpOworCQkJcHJpbnRlci5pbmRlbnQoKTsKKwkJfQorCQluLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmICghdGhlbkJsb2NrKQorCQkJcHJpbnRlci51bmluZGVudCgpOworCQlpZiAobi5nZXRFbHNlU3RtdCgpICE9IG51bGwpIHsKKwkJCWlmICh0aGVuQmxvY2spCisJCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJZWxzZQorCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJZmluYWwgYm9vbGVhbiBlbHNlSWYgPSBuLmdldEVsc2VTdG10KCkgaW5zdGFuY2VvZiBJZlN0bXQ7CisJCQlmaW5hbCBib29sZWFuIGVsc2VCbG9jayA9IG4uZ2V0RWxzZVN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdDsKKwkJCWlmIChlbHNlSWYgfHwgZWxzZUJsb2NrKSAvLyBwdXQgY2hhaW5lZCBpZiBhbmQgc3RhcnQgb2YgYmxvY2sgc3RhdGVtZW50IG9uIGEgc2FtZSBsZXZlbAorCQkJCXByaW50ZXIucHJpbnQoImVsc2UgIik7CisJCQllbHNlIHsKKwkJCQlwcmludGVyLnByaW50TG4oImVsc2UiKTsKKwkJCQlwcmludGVyLmluZGVudCgpOworCQkJfQorCQkJbi5nZXRFbHNlU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKCEoZWxzZUlmIHx8IGVsc2VCbG9jaykpCisJCQkJcHJpbnRlci51bmluZGVudCgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgid2hpbGUgKCIpOworCQluLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpICIpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJjb250aW51ZSIpOworCQlpZiAobi5nZXRJZCgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCXByaW50ZXIucHJpbnQobi5nZXRJZCgpKTsKKwkJfQorCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiZG8gIik7CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgd2hpbGUgKCIpOworCQluLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpOyIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiZm9yICgiKTsKKwkJbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgOiAiKTsKKwkJbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpICIpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiZm9yICgiKTsKKwkJaWYgKG4uZ2V0SW5pdCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IG4uZ2V0SW5pdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCQlmaW5hbCBFeHByZXNzaW9uIGUgPSBpLm5leHQoKTsKKwkJCQllLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGVyLnByaW50KCI7ICIpOworCQlpZiAobi5nZXRDb21wYXJlKCkgIT0gbnVsbCkgeworCQkJbi5nZXRDb21wYXJlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJcHJpbnRlci5wcmludCgiOyAiKTsKKwkJaWYgKG4uZ2V0VXBkYXRlKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRVcGRhdGUoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisJCQkJZmluYWwgRXhwcmVzc2lvbiBlID0gaS5uZXh0KCk7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpbnRlci5wcmludCgiKSAiKTsKKwkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhyb3dTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgidGhyb3cgIik7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoInN5bmNocm9uaXplZCAoIik7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpICIpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgidHJ5ICIpOworCQlpZiAoIW4uZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisJCQlwcmludGVyLnByaW50KCIoIik7CisJCQlJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gcmVzb3VyY2VzID0gbi5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOworCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCQl3aGlsZSAocmVzb3VyY2VzLmhhc05leHQoKSkgeworCQkJCXZpc2l0KHJlc291cmNlcy5uZXh0KCksIGFyZyk7CisJCQkJaWYgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiOyIpOworCQkJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCQkJaWYgKGZpcnN0KSB7CisJCQkJCQlwcmludGVyLmluZGVudCgpOworCQkJCQl9CisJCQkJfQorCQkJCWZpcnN0ID0gZmFsc2U7CisJCQl9CisJCQlpZiAobi5nZXRSZXNvdXJjZXMoKS5zaXplKCkgPiAxKSB7CisJCQkJcHJpbnRlci51bmluZGVudCgpOworCQkJfQorCQkJcHJpbnRlci5wcmludCgiKSAiKTsKKwkJfQorCQluLmdldFRyeUJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldENhdGNocygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2F0Y2hDbGF1c2UgYyA6IG4uZ2V0Q2F0Y2hzKCkpIHsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldEZpbmFsbHlCbG9jaygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBmaW5hbGx5ICIpOworCQkJbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiIGNhdGNoICgiKTsKKwkJbi5nZXRQYXJhbSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpICIpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworCQlwcmludGVyLnByaW50KCJAaW50ZXJmYWNlICIpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKwkJcHJpbnRlci5wcmludExuKCIgeyIpOworCQlwcmludGVyLmluZGVudCgpOworCQlpZiAobi5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpOworCQl9CisJCXByaW50ZXIudW5pbmRlbnQoKTsKKwkJcHJpbnRlci5wcmludCgifSIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiICIpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKwkJcHJpbnRlci5wcmludCgiKCkiKTsKKwkJaWYgKG4uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiIGRlZmF1bHQgIik7CisJCQluLmdldERlZmF1bHRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIkAiKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJAIik7CisJCW4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIoIik7CisJCW4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKSIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiQCIpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKCIpOworCQlpZiAobi5nZXRQYWlycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8TWVtYmVyVmFsdWVQYWlyPiBpID0gbi5nZXRQYWlycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCQlmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbSA9IGkubmV4dCgpOworCQkJCW0uYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQl9CisJCXByaW50ZXIucHJpbnQoIikiKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKwkJcHJpbnRlci5wcmludCgiID0gIik7CisJCW4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCWlmICghdGhpcy5wcmludENvbW1lbnRzKSB7CisJCQlyZXR1cm47CisJCX0KKwkJcHJpbnRlci5wcmludCgiLy8iKTsKKwkJU3RyaW5nIHRtcCA9IG4uZ2V0Q29udGVudCgpOworCQl0bXAgPSB0bXAucmVwbGFjZSgnXHInLCAnICcpOworCQl0bXAgPSB0bXAucmVwbGFjZSgnXG4nLCAnICcpOworCQlwcmludGVyLnByaW50TG4odG1wKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlpZiAoIXRoaXMucHJpbnRDb21tZW50cykgeworCQkJcmV0dXJuOworCQl9CisJCXByaW50ZXIucHJpbnQoIi8qIik7CisJCXByaW50ZXIucHJpbnQobi5nZXRDb250ZW50KCkpOworCQlwcmludGVyLnByaW50TG4oIiovIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisKKwkJZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuLmdldFBhcmFtZXRlcnMoKTsKKwkJZmluYWwgYm9vbGVhbiBwcmludFBhciA9IG4uaXNQYXJhbWV0ZXJzRW5jbG9zZWQoKTsKKworCQlpZiAocHJpbnRQYXIpIHsKKwkJCXByaW50ZXIucHJpbnQoIigiKTsKKwkJfQorCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IHBhcmFtZXRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJCVBhcmFtZXRlciBwID0gaS5uZXh0KCk7CisJCQkJcC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHByaW50UGFyKSB7CisJCQlwcmludGVyLnByaW50KCIpIik7CisJCX0KKworCQlwcmludGVyLnByaW50KCIgLT4gIik7CisJCWZpbmFsIFN0YXRlbWVudCBib2R5ID0gbi5nZXRCb2R5KCk7CisJCWlmIChib2R5IGluc3RhbmNlb2YgRXhwcmVzc2lvblN0bXQpIHsKKwkJCS8vIFByaW50IHRoZSBleHByZXNzaW9uIGRpcmVjdGx5CisJCQkoKEV4cHJlc3Npb25TdG10KSBib2R5KS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0gZWxzZSB7CisJCQlib2R5LmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJRXhwcmVzc2lvbiBzY29wZSA9IG4uZ2V0U2NvcGUoKTsKKwkJU3RyaW5nIGlkZW50aWZpZXIgPSBuLmdldElkZW50aWZpZXIoKTsKKwkJaWYgKHNjb3BlICE9IG51bGwpIHsKKwkJCW4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCisJCXByaW50ZXIucHJpbnQoIjo6Iik7CisJCXByaW50VHlwZUFyZ3MobiwgYXJnKTsKKwkJaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludChpZGVudGlmaWVyKTsKKwkJfQorCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoVHlwZUV4cHIgbiwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRUeXBlKCkgIT0gbnVsbCkgeworCQkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChBcnJheUJyYWNrZXRQYWlyIGFycmF5QnJhY2tldFBhaXIsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRBbm5vdGF0aW9ucyhhcnJheUJyYWNrZXRQYWlyLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIltdIik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKGZpbmFsIE5vZGUgbm9kZSkgeworCQlpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHJldHVybjsKKworCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOworCQlpZiAocGFyZW50ID09IG51bGwpIHJldHVybjsKKwkJTGlzdDxOb2RlPiBldmVyeXRoaW5nID0gbmV3IExpbmtlZExpc3Q8PigpOworCQlldmVyeXRoaW5nLmFkZEFsbChwYXJlbnQuZ2V0Q2hpbGRyZW5Ob2RlcygpKTsKKwkJc29ydEJ5QmVnaW5Qb3NpdGlvbihldmVyeXRoaW5nKTsKKwkJaW50IHBvc2l0aW9uT2ZUaGVDaGlsZCA9IC0xOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZXJ5dGhpbmcuc2l6ZSgpOyBpKyspIHsKKwkJCWlmIChldmVyeXRoaW5nLmdldChpKSA9PSBub2RlKSBwb3NpdGlvbk9mVGhlQ2hpbGQgPSBpOworCQl9CisJCWlmIChwb3NpdGlvbk9mVGhlQ2hpbGQgPT0gLTEpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNeSBpbmRleCBub3QgZm91bmQhISEgIiArIG5vZGUpOworCQlpbnQgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgPSAtMTsKKwkJZm9yIChpbnQgaSA9IHBvc2l0aW9uT2ZUaGVDaGlsZCAtIDE7IGkgPj0gMCAmJiBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCA9PSAtMTsgaS0tKSB7CisJCQlpZiAoIShldmVyeXRoaW5nLmdldChpKSBpbnN0YW5jZW9mIENvbW1lbnQpKSBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCA9IGk7CisJCX0KKwkJZm9yIChpbnQgaSA9IHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkICsgMTsgaSA8IHBvc2l0aW9uT2ZUaGVDaGlsZDsgaSsrKSB7CisJCQlOb2RlIG5vZGVUb1ByaW50ID0gZXZlcnl0aGluZy5nZXQoaSk7CisJCQlpZiAoIShub2RlVG9QcmludCBpbnN0YW5jZW9mIENvbW1lbnQpKQorCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBjb21tZW50LCBpbnN0ZWFkICIgKyBub2RlVG9QcmludC5nZXRDbGFzcygpICsgIi4gUG9zaXRpb24gb2YgcHJldmlvdXMgY2hpbGQ6ICIgKyBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCArICIsIHBvc2l0aW9uIG9mIGNoaWxkICIgKyBwb3NpdGlvbk9mVGhlQ2hpbGQpOworCQkJbm9kZVRvUHJpbnQuYWNjZXB0KHRoaXMsIG51bGwpOworCQl9CisJfQorCisKKwlwcml2YXRlIHZvaWQgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhmaW5hbCBOb2RlIG5vZGUpIHsKKwkJTGlzdDxOb2RlPiBldmVyeXRoaW5nID0gbmV3IExpbmtlZExpc3Q8PigpOworCQlldmVyeXRoaW5nLmFkZEFsbChub2RlLmdldENoaWxkcmVuTm9kZXMoKSk7CisJCXNvcnRCeUJlZ2luUG9zaXRpb24oZXZlcnl0aGluZyk7CisJCWlmIChldmVyeXRoaW5nLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaW50IGNvbW1lbnRzQXRFbmQgPSAwOworCQlib29sZWFuIGZpbmRpbmdDb21tZW50cyA9IHRydWU7CisJCXdoaWxlIChmaW5kaW5nQ29tbWVudHMgJiYgY29tbWVudHNBdEVuZCA8IGV2ZXJ5dGhpbmcuc2l6ZSgpKSB7CisJCQlOb2RlIGxhc3QgPSBldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKSAtIDEgLSBjb21tZW50c0F0RW5kKTsKKwkJCWZpbmRpbmdDb21tZW50cyA9IChsYXN0IGluc3RhbmNlb2YgQ29tbWVudCk7CisJCQlpZiAoZmluZGluZ0NvbW1lbnRzKSB7CisJCQkJY29tbWVudHNBdEVuZCsrOworCQkJfQorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWVudHNBdEVuZDsgaSsrKSB7CisJCQlldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKSAtIGNvbW1lbnRzQXRFbmQgKyBpKS5hY2NlcHQodGhpcywgbnVsbCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvRXF1YWxzVmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0VxdWFsc1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAxODRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0VxdWFsc1Zpc2l0b3IuamF2YQpAQCAtMCwwICsxLDE1MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxvbmdMaXRlcmFsTWluVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OdWxsTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBjbGFzcyBFcXVhbHNWaXNpdG9yIGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8Qm9vbGVhbiwgTm9kZT4geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXF1YWxzVmlzaXRvciBTSU5HTEVUT04gPSBuZXcgRXF1YWxzVmlzaXRvcigpOworCisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhmaW5hbCBOb2RlIG4xLCBmaW5hbCBOb2RlIG4yKSB7CisJCXJldHVybiBTSU5HTEVUT04ubm9kZUVxdWFscyhuMSwgbjIpOworCX0KKworCXByaXZhdGUgRXF1YWxzVmlzaXRvcigpIHsKKwkJLy8gaGlkZSBjb25zdHJ1Y3RvcgorCX0KKworICAgIC8qKgorICAgICAqIENoZWNrIGZvciBlcXVhbGl0eSB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGVhY2gga2luZCBvZiBub2RlLAorICAgICAqIHRvIG5vdCByZXBlYXQgaXQgaW4gZXZlcnkgbWV0aG9kIHdlIHN0b3JlIHRoYXQgaGVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29tbW9uTm9kZUVxdWFsaXR5KE5vZGUgbjEsIE5vZGUgbjIpIHsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4xLmdldENvbW1lbnQoKSwgbjIuZ2V0Q29tbWVudCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisJCXJldHVybiBub2Rlc0VxdWFscyhuMS5nZXRPcnBoYW5Db21tZW50cygpLCBuMi5nZXRPcnBoYW5Db21tZW50cygpKTsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2Rlc0VxdWFscyhmaW5hbCBMaXN0PFQ+IG5vZGVzMSwgZmluYWwgTGlzdDxUPiBub2RlczIpIHsKKwkJaWYgKG5vZGVzMSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbm9kZXMyID09IG51bGw7CisJCX0gZWxzZSBpZiAobm9kZXMyID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAobm9kZXMxLnNpemUoKSAhPSBub2RlczIuc2l6ZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlczEuc2l6ZSgpOyBpKyspIHsKKwkJCWlmICghbm9kZUVxdWFscyhub2RlczEuZ2V0KGkpLCBub2RlczIuZ2V0KGkpKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2RlRXF1YWxzKGZpbmFsIFQgbjEsIGZpbmFsIFQgbjIpIHsKKwkJaWYgKG4xID09IG4yKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAobjEgPT0gbnVsbCB8fCBuMiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKG4xLmdldENsYXNzKCkgIT0gbjIuZ2V0Q2xhc3MoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisgICAgICAgIGlmICghY29tbW9uTm9kZUVxdWFsaXR5KG4xLCBuMikpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisJCXJldHVybiBuMS5hY2NlcHQodGhpcywgbjIpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBvYmpFcXVhbHMoZmluYWwgT2JqZWN0IG4xLCBmaW5hbCBPYmplY3QgbjIpIHsKKwkJaWYgKG4xID09IG4yKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAobjEgPT0gbnVsbCB8fCBuMiA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIG4xLmVxdWFscyhuMik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQ29tcGlsYXRpb25Vbml0IG4yID0gKENvbXBpbGF0aW9uVW5pdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRQYWNrYWdlKCksIG4yLmdldFBhY2thZ2UoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0SW1wb3J0cygpLCBuMi5nZXRJbXBvcnRzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVzKCksIG4yLmdldFR5cGVzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldENvbW1lbnRzKCksIG4yLmdldENvbW1lbnRzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbjIgPSAoUGFja2FnZURlY2xhcmF0aW9uKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuMiA9IChJbXBvcnREZWNsYXJhdGlvbikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBUeXBlUGFyYW1ldGVyIG4yID0gKFR5cGVQYXJhbWV0ZXIpIGFyZzsKKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUJvdW5kKCksIG4yLmdldFR5cGVCb3VuZCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIExpbmVDb21tZW50IG4yID0gKExpbmVDb21tZW50KSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0Q29udGVudCgpLCBuMi5nZXRDb250ZW50KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworICAgICAgICBpZiAoIW9iakVxdWFscyhuMS5nZXRCZWdpbigpLmxpbmUsIG4yLmdldEJlZ2luKCkubGluZSkpIHsKKyAgICAgIAkJcmV0dXJuIGZhbHNlOworICAgICAgCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBCbG9ja0NvbW1lbnQgbjIgPSAoQmxvY2tDb21tZW50KSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0Q29udGVudCgpLCBuMi5nZXRDb250ZW50KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworICAgICAgICBpZiAoIW9iakVxdWFscyhuMS5nZXRCZWdpbigpLmxpbmUsIG4yLmdldEJlZ2luKCkubGluZSkpIHsKKyAgICAgIAkJCXJldHVybiBmYWxzZTsKKyAgICAgIAl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4yID0gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgYXJnOworCisJCS8vIGphdmFkb2MgYXJlIGNoZWNrZWQgYXQgQ29tcGlsYXRpb25Vbml0CisKKyAgICAgICAgaWYgKCFuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAobjEuaXNJbnRlcmZhY2UoKSAhPSBuMi5pc0ludGVyZmFjZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0RXh0ZW5kcygpLCBuMi5nZXRFeHRlbmRzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEltcGxlbWVudHMoKSwgbjIuZ2V0SW1wbGVtZW50cygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRNZW1iZXJzKCksIG4yLmdldE1lbWJlcnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEVudW1EZWNsYXJhdGlvbiBuMiA9IChFbnVtRGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisgICAgICAgIGlmICghbjEuZ2V0TW9kaWZpZXJzKCkuZXF1YWxzKG4yLmdldE1vZGlmaWVycygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEltcGxlbWVudHMoKSwgbjIuZ2V0SW1wbGVtZW50cygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRFbnRyaWVzKCksIG4yLmdldEVudHJpZXMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW1wdHlUeXBlRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbjIgPSAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBcmdzKCksIG4yLmdldEFyZ3MoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0Q2xhc3NCb2R5KCksIG4yLmdldENsYXNzQm9keSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4yID0gKEFubm90YXRpb25EZWNsYXJhdGlvbikgYXJnOworCisJCS8vIGphdmFkb2MgYXJlIGNoZWNrZWQgYXQgQ29tcGlsYXRpb25Vbml0CisKKyAgICAgICAgaWYgKCFuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbjIgPSAoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKSBhcmc7CisKKwkJLy8gamF2YWRvYyBhcmUgY2hlY2tlZCBhdCBDb21waWxhdGlvblVuaXQKKworICAgICAgICBpZiAoIW4xLmdldE1vZGlmaWVycygpLmVxdWFscyhuMi5nZXRNb2RpZmllcnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldERlZmF1bHRWYWx1ZSgpLCBuMi5nZXREZWZhdWx0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4yID0gKEZpZWxkRGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisgICAgICAgIGlmICghbjEuZ2V0TW9kaWZpZXJzKCkuZXF1YWxzKG4yLmdldE1vZGlmaWVycygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEVsZW1lbnRUeXBlKCksIG4yLmdldEVsZW1lbnRUeXBlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFZhcmlhYmxlcygpLCBuMi5nZXRWYXJpYWJsZXMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmKCFub2Rlc0VxdWFscyhuMS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSwgbjIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlckVsZW1lbnRUeXBlKCkpKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4yID0gKFZhcmlhYmxlRGVjbGFyYXRvcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRJZCgpLCBuMi5nZXRJZCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEluaXQoKSwgbjIuZ2V0SW5pdCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3JJZCBuMiA9IChWYXJpYWJsZURlY2xhcmF0b3JJZCkgYXJnOworCisJCWlmKCFub2Rlc0VxdWFscyhuMS5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVySWQoKSwgbjIuZ2V0QXJyYXlCcmFja2V0UGFpcnNBZnRlcklkKCkpKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbjIgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYXJnOworCisJCS8vIGphdmFkb2MgYXJlIGNoZWNrZWQgYXQgQ29tcGlsYXRpb25Vbml0CisKKyAgICAgICAgaWYgKCFuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0UGFyYW1ldGVycygpLCBuMi5nZXRQYXJhbWV0ZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFRocm93cygpLCBuMi5nZXRUaHJvd3MoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbjIgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisgICAgICAgIGlmICghbjEuZ2V0TW9kaWZpZXJzKCkuZXF1YWxzKG4yLmdldE1vZGlmaWVycygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYoIW5vZGVzRXF1YWxzKG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLCBuMi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSkpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYoIW5vZGVzRXF1YWxzKG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCksIG4yLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJQYXJhbWV0ZXJMaXN0KCkpKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEVsZW1lbnRUeXBlKCksIG4yLmdldEVsZW1lbnRUeXBlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUaHJvd3MoKSwgbjIuZ2V0VGhyb3dzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYobjEuaXNEZWZhdWx0KCkgIT0gbjIuaXNEZWZhdWx0KCkpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBQYXJhbWV0ZXIgbjIgPSAoUGFyYW1ldGVyKSBhcmc7CisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFbGVtZW50VHlwZSgpLCBuMi5nZXRFbGVtZW50VHlwZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYoIW5vZGVzRXF1YWxzKG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLCBuMi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSkpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0SWQoKSwgbjIuZ2V0SWQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKwkKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbjIgPSAoSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCbG9jaygpLCBuMi5nZXRCbG9jaygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBKYXZhZG9jQ29tbWVudCBuMiA9IChKYXZhZG9jQ29tbWVudCkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuMiA9IChDbGFzc09ySW50ZXJmYWNlVHlwZSkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFByaW1pdGl2ZVR5cGUgbjIgPSAoUHJpbWl0aXZlVHlwZSkgYXJnOworCisJCWlmIChuMS5nZXRUeXBlKCkgIT0gbjIuZ2V0VHlwZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIHZpc2l0KEFycmF5VHlwZSBuMSwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQXJyYXlUeXBlIG4yID0gKEFycmF5VHlwZSkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDb21wb25lbnRUeXBlKCksIG4yLmdldENvbXBvbmVudFR5cGUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbkxldmVsIG4xLCBOb2RlIGFyZykgeworCQlmaW5hbCBBcnJheUNyZWF0aW9uTGV2ZWwgbjIgPSAoQXJyYXlDcmVhdGlvbkxldmVsKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldERpbWVuc2lvbigpLCBuMi5nZXREaW1lbnNpb24oKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisgICAgICAgIGZpbmFsIEludGVyc2VjdGlvblR5cGUgbjIgPSAoSW50ZXJzZWN0aW9uVHlwZSkgYXJnOworCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisgICAgICAgIExpc3Q8UmVmZXJlbmNlVHlwZT4gbjFFbGVtZW50cyA9IG4xLmdldEVsZW1lbnRzKCk7CisgICAgICAgIExpc3Q8UmVmZXJlbmNlVHlwZT4gbjJFbGVtZW50cyA9IG4yLmdldEVsZW1lbnRzKCk7CisKKyAgICAgICAgaWYgKG4xRWxlbWVudHMgIT1udWxsICYmIG4yRWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYobjFFbGVtZW50cy5zaXplKCkgIT0gbjJFbGVtZW50cy5zaXplKCkpeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIGZvcihSZWZlcmVuY2VUeXBlIGF1eDogbjFFbGVtZW50cyl7CisgICAgICAgICAgICAgICAgICAgIGlmKGF1eC5hY2NlcHQodGhpcywgbjJFbGVtZW50cy5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgZWxzZSBpZiAobjFFbGVtZW50cyAhPSBuMkVsZW1lbnRzKXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5pb25UeXBlIG4xLCBmaW5hbCBOb2RlIGFyZykgeworICAgICAgICBmaW5hbCBVbmlvblR5cGUgbjIgPSAoVW5pb25UeXBlKSBhcmc7CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKyAgICAgICAgTGlzdDxSZWZlcmVuY2VUeXBlPiBuMUVsZW1lbnRzID0gbjEuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgTGlzdDxSZWZlcmVuY2VUeXBlPiBuMkVsZW1lbnRzID0gbjIuZ2V0RWxlbWVudHMoKTsKKworICAgICAgICBpZiAobjFFbGVtZW50cyAhPW51bGwgJiYgbjJFbGVtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZihuMUVsZW1lbnRzLnNpemUoKSAhPSBuMkVsZW1lbnRzLnNpemUoKSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKFJlZmVyZW5jZVR5cGUgYXV4OiBuMUVsZW1lbnRzKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoYXV4LmFjY2VwdCh0aGlzLCBuMkVsZW1lbnRzLmdldChpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICBlbHNlIGlmIChuMUVsZW1lbnRzICE9IG4yRWxlbWVudHMpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIHZpc2l0KFZvaWRUeXBlIG4xLCBOb2RlIGFyZykgeworCQlWb2lkVHlwZSBuMiA9IChWb2lkVHlwZSkgYXJnOworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgV2lsZGNhcmRUeXBlIG4yID0gKFdpbGRjYXJkVHlwZSkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeHRlbmRzKCksIG4yLmdldEV4dGVuZHMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRTdXBlcigpLCBuMi5nZXRTdXBlcigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEFycmF5QWNjZXNzRXhwciBuMiA9IChBcnJheUFjY2Vzc0V4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0SW5kZXgoKSwgbjIuZ2V0SW5kZXgoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbjIgPSAoQXJyYXlDcmVhdGlvbkV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldExldmVscygpLCBuMi5nZXRMZXZlbHMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRJbml0aWFsaXplcigpLCBuMi5nZXRJbml0aWFsaXplcigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuMiA9IChBcnJheUluaXRpYWxpemVyRXhwcikgYXJnOworCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VmFsdWVzKCksIG4yLmdldFZhbHVlcygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFzc2lnbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEFzc2lnbkV4cHIgbjIgPSAoQXNzaWduRXhwcikgYXJnOworCisJCWlmIChuMS5nZXRPcGVyYXRvcigpICE9IG4yLmdldE9wZXJhdG9yKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUYXJnZXQoKSwgbjIuZ2V0VGFyZ2V0KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBCaW5hcnlFeHByIG4yID0gKEJpbmFyeUV4cHIpIGFyZzsKKworCQlpZiAobjEuZ2V0T3BlcmF0b3IoKSAhPSBuMi5nZXRPcGVyYXRvcigpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0TGVmdCgpLCBuMi5nZXRMZWZ0KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0UmlnaHQoKSwgbjIuZ2V0UmlnaHQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDYXN0RXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQ2FzdEV4cHIgbjIgPSAoQ2FzdEV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDbGFzc0V4cHIgbjIgPSAoQ2xhc3NFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQ29uZGl0aW9uYWxFeHByIG4yID0gKENvbmRpdGlvbmFsRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VGhlbkV4cHIoKSwgbjIuZ2V0VGhlbkV4cHIoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFbHNlRXhwcigpLCBuMi5nZXRFbHNlRXhwcigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRW5jbG9zZWRFeHByIG4yID0gKEVuY2xvc2VkRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRJbm5lcigpLCBuMi5nZXRJbm5lcigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRmllbGRBY2Nlc3NFeHByIG4yID0gKEZpZWxkQWNjZXNzRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0RmllbGQoKSwgbjIuZ2V0RmllbGQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEluc3RhbmNlT2ZFeHByIG4yID0gKEluc3RhbmNlT2ZFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuMiA9IChTdHJpbmdMaXRlcmFsRXhwcikgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbjIgPSAoSW50ZWdlckxpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIExvbmdMaXRlcmFsRXhwciBuMiA9IChMb25nTGl0ZXJhbEV4cHIpIGFyZzsKKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuMiA9IChJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcikgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4yID0gKExvbmdMaXRlcmFsTWluVmFsdWVFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIENoYXJMaXRlcmFsRXhwciBuMiA9IChDaGFyTGl0ZXJhbEV4cHIpIGFyZzsKKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuMiA9IChEb3VibGVMaXRlcmFsRXhwcikgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldFZhbHVlKCksIG4yLmdldFZhbHVlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbjIgPSAoQm9vbGVhbkxpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKG4xLmdldFZhbHVlKCkgIT0gbjIuZ2V0VmFsdWUoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBNZXRob2RDYWxsRXhwciBuMiA9IChNZXRob2RDYWxsRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFyZ3MoKSwgbjIuZ2V0QXJncygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBOYW1lRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgTmFtZUV4cHIgbjIgPSAoTmFtZUV4cHIpIGFyZzsKKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuMiA9IChPYmplY3RDcmVhdGlvbkV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCksIG4yLmdldEFub255bW91c0NsYXNzQm9keSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBcmdzKCksIG4yLmdldEFyZ3MoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUFyZ3VtZW50cygpLCBuMi5nZXRUeXBlQXJndW1lbnRzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUXVhbGlmaWVkTmFtZUV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFF1YWxpZmllZE5hbWVFeHByIG4yID0gKFF1YWxpZmllZE5hbWVFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFF1YWxpZmllcigpLCBuMi5nZXRRdWFsaWZpZXIoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBUaGlzRXhwciBuMiA9IChUaGlzRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDbGFzc0V4cHIoKSwgbjIuZ2V0Q2xhc3NFeHByKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3VwZXJFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBTdXBlckV4cHIgbjIgPSAoU3VwZXJFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldENsYXNzRXhwcigpLCBuMi5nZXRDbGFzc0V4cHIoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFVuYXJ5RXhwciBuMiA9IChVbmFyeUV4cHIpIGFyZzsKKworCQlpZiAobjEuZ2V0T3BlcmF0b3IoKSAhPSBuMi5nZXRPcGVyYXRvcigpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4yID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSBhcmc7CisKKyAgICAgICAgaWYgKCFuMS5nZXRNb2RpZmllcnMoKS5lcXVhbHMobjIuZ2V0TW9kaWZpZXJzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RWxlbWVudFR5cGUoKSwgbjIuZ2V0RWxlbWVudFR5cGUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VmFyaWFibGVzKCksIG4yLmdldFZhcmlhYmxlcygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYoIW5vZGVzRXF1YWxzKG4xLmdldEFycmF5QnJhY2tldFBhaXJzQWZ0ZXJFbGVtZW50VHlwZSgpLCBuMi5nZXRBcnJheUJyYWNrZXRQYWlyc0FmdGVyRWxlbWVudFR5cGUoKSkpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4yID0gKE1hcmtlckFubm90YXRpb25FeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuMiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRNZW1iZXJWYWx1ZSgpLCBuMi5nZXRNZW1iZXJWYWx1ZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuMiA9IChOb3JtYWxBbm5vdGF0aW9uRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0UGFpcnMoKSwgbjIuZ2V0UGFpcnMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIE1lbWJlclZhbHVlUGFpciBuMiA9IChNZW1iZXJWYWx1ZVBhaXIpIGFyZzsKKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRWYWx1ZSgpLCBuMi5nZXRWYWx1ZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4yID0gKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmd1bWVudHMoKSwgbjIuZ2V0VHlwZUFyZ3VtZW50cygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbjIgPSAoVHlwZURlY2xhcmF0aW9uU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbjIuZ2V0VHlwZURlY2xhcmF0aW9uKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQXNzZXJ0U3RtdCBuMiA9IChBc3NlcnRTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldENoZWNrKCksIG4yLmdldENoZWNrKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0TWVzc2FnZSgpLCBuMi5nZXRNZXNzYWdlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQmxvY2tTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBCbG9ja1N0bXQgbjIgPSAoQmxvY2tTdG10KSBhcmc7CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRTdG10cygpLCBuMi5nZXRTdG10cygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBMYWJlbGVkU3RtdCBuMiA9IChMYWJlbGVkU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRTdG10KCksIG4yLmdldFN0bXQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRXhwcmVzc2lvblN0bXQgbjIgPSAoRXhwcmVzc2lvblN0bXQpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RXhwcmVzc2lvbigpLCBuMi5nZXRFeHByZXNzaW9uKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgU3dpdGNoU3RtdCBuMiA9IChTd2l0Y2hTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFNlbGVjdG9yKCksIG4yLmdldFNlbGVjdG9yKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEVudHJpZXMoKSwgbjIuZ2V0RW50cmllcygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgU3dpdGNoRW50cnlTdG10IG4yID0gKFN3aXRjaEVudHJ5U3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRTdG10cygpLCBuMi5nZXRTdG10cygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQnJlYWtTdG10IG4yID0gKEJyZWFrU3RtdCkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldElkKCksIG4yLmdldElkKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgUmV0dXJuU3RtdCBuMiA9IChSZXR1cm5TdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIElmU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgSWZTdG10IG4yID0gKElmU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VGhlblN0bXQoKSwgbjIuZ2V0VGhlblN0bXQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFbHNlU3RtdCgpLCBuMi5nZXRFbHNlU3RtdCgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFdoaWxlU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgV2hpbGVTdG10IG4yID0gKFdoaWxlU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDb25kaXRpb24oKSwgbjIuZ2V0Q29uZGl0aW9uKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDb250aW51ZVN0bXQgbjIgPSAoQ29udGludWVTdG10KSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0SWQoKSwgbjIuZ2V0SWQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBEb1N0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIERvU3RtdCBuMiA9IChEb1N0bXQpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBGb3JlYWNoU3RtdCBuMiA9IChGb3JlYWNoU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRWYXJpYWJsZSgpLCBuMi5nZXRWYXJpYWJsZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEl0ZXJhYmxlKCksIG4yLmdldEl0ZXJhYmxlKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRm9yU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRm9yU3RtdCBuMiA9IChGb3JTdG10KSBhcmc7CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRJbml0KCksIG4yLmdldEluaXQoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDb21wYXJlKCksIG4yLmdldENvbXBhcmUoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VXBkYXRlKCksIG4yLmdldFVwZGF0ZSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEJvZHkoKSwgbjIuZ2V0Qm9keSgpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgVGhyb3dTdG10IG4yID0gKFRocm93U3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4yID0gKFN5bmNocm9uaXplZFN0bXQpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVHJ5U3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgVHJ5U3RtdCBuMiA9IChUcnlTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFRyeUJsb2NrKCksIG4yLmdldFRyeUJsb2NrKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldENhdGNocygpLCBuMi5nZXRDYXRjaHMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJaWYoIW5vZGVzRXF1YWxzKG4xLmdldFJlc291cmNlcygpLCBuMi5nZXRSZXNvdXJjZXMoKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRGaW5hbGx5QmxvY2soKSwgbjIuZ2V0RmluYWxseUJsb2NrKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIENhdGNoQ2xhdXNlIG4yID0gKENhdGNoQ2xhdXNlKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFBhcmFtKCksIG4yLmdldFBhcmFtKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChMYW1iZGFFeHByIG4xLCBOb2RlIGFyZykgeworICAgICAgICBMYW1iZGFFeHByIG4yID0gKExhbWJkYUV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRQYXJhbWV0ZXJzKCksIG4yLmdldFBhcmFtZXRlcnMoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZihuMS5pc1BhcmFtZXRlcnNFbmNsb3NlZCgpICE9IG4yLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuMS5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4xLCBOb2RlIGFyZykgeworICAgICAgICBNZXRob2RSZWZlcmVuY2VFeHByIG4yID0gKE1ldGhvZFJlZmVyZW5jZUV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwkgICAgaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJndW1lbnRzKCksIG4yLmdldFR5cGVBcmd1bWVudHMoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iakVxdWFscyhuMS5nZXRJZGVudGlmaWVyKCksIG4yLmdldElkZW50aWZpZXIoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChUeXBlRXhwciBuLCBOb2RlIGFyZykgeworICAgICAgICBUeXBlRXhwciBuMiA9IChUeXBlRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiB2aXNpdChBcnJheUJyYWNrZXRQYWlyIG4xLCBOb2RlIGFyZykgeworCQlBcnJheUJyYWNrZXRQYWlyIG4yID0gKEFycmF5QnJhY2tldFBhaXIpIGFyZzsKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjRlOWJjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJyZWFrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworCisvKioKKyAqIEEgdmlzaXRvciB0aGF0IGhhcyBhIHJldHVybiB2YWx1ZS4KKyAqIAorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2VuZXJpY1Zpc2l0b3I8UiwgQT4geworCisJLy8tIENvbXBpbGF0aW9uIFVuaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUiB2aXNpdChDb21waWxhdGlvblVuaXQgbiwgQSBhcmcpOworCisJUiB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJUiB2aXNpdChJbXBvcnREZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KFR5cGVQYXJhbWV0ZXIgbiwgQSBhcmcpOworCisJUiB2aXNpdChMaW5lQ29tbWVudCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEJsb2NrQ29tbWVudCBuLCBBIGFyZyk7CisKKwkvLy0gQm9keSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlSIHZpc2l0KENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEVudW1EZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEVtcHR5VHlwZURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJUiB2aXNpdChBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJUiB2aXNpdChBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJUiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9yIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9ySWQgbiwgQSBhcmcpOworCisJUiB2aXNpdChDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJUiB2aXNpdChQYXJhbWV0ZXIgbiwgQSBhcmcpOworCQorCVIgdmlzaXQoRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJUiB2aXNpdChKYXZhZG9jQ29tbWVudCBuLCBBIGFyZyk7CisKKwkvLy0gVHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlSIHZpc2l0KENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoUHJpbWl0aXZlVHlwZSBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEFycmF5VHlwZSBuLCBBIGFyZyk7CisJCisJUiB2aXNpdChBcnJheUNyZWF0aW9uTGV2ZWwgbiwgQSBhcmcpOworCisgICAgUiB2aXNpdChJbnRlcnNlY3Rpb25UeXBlIG4sIEEgYXJnKTsKKworICAgIFIgdmlzaXQoVW5pb25UeXBlIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoVm9pZFR5cGUgbiwgQSBhcmcpOworCisJUiB2aXNpdChXaWxkY2FyZFR5cGUgbiwgQSBhcmcpOworCisJUiB2aXNpdChVbmtub3duVHlwZSBuLCBBIGFyZyk7CisKKwkvLy0gRXhwcmVzc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlSIHZpc2l0KEFycmF5QWNjZXNzRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEFycmF5Q3JlYXRpb25FeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQXJyYXlJbml0aWFsaXplckV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChBc3NpZ25FeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQmluYXJ5RXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KENhc3RFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQ2xhc3NFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQ29uZGl0aW9uYWxFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoRW5jbG9zZWRFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoRmllbGRBY2Nlc3NFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoSW5zdGFuY2VPZkV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChTdHJpbmdMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEludGVnZXJMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KExvbmdMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChDaGFyTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChEb3VibGVMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEJvb2xlYW5MaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KE51bGxMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KE1ldGhvZENhbGxFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoTmFtZUV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChPYmplY3RDcmVhdGlvbkV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChRdWFsaWZpZWROYW1lRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KFRoaXNFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoU3VwZXJFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoVW5hcnlFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgQSBhcmcpOworCisJUiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbiwgQSBhcmcpOworCisJLy8tIFN0YXRlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUiB2aXNpdChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgQSBhcmcpOworCisJUiB2aXNpdChUeXBlRGVjbGFyYXRpb25TdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQXNzZXJ0U3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEJsb2NrU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KExhYmVsZWRTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoRW1wdHlTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoRXhwcmVzc2lvblN0bXQgbiwgQSBhcmcpOworCisJUiB2aXNpdChTd2l0Y2hTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoU3dpdGNoRW50cnlTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQnJlYWtTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoUmV0dXJuU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KElmU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KFdoaWxlU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KENvbnRpbnVlU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KERvU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KEZvcmVhY2hTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoRm9yU3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KFRocm93U3RtdCBuLCBBIGFyZyk7CisKKwlSIHZpc2l0KFN5bmNocm9uaXplZFN0bXQgbiwgQSBhcmcpOworCisJUiB2aXNpdChUcnlTdG10IG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQ2F0Y2hDbGF1c2UgbiwgQSBhcmcpOworCisgICAgUiB2aXNpdChMYW1iZGFFeHByIG4sIEEgYXJnKTsKKworICAgIFIgdmlzaXQoTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBBIGFyZyk7CisKKyAgICBSIHZpc2l0KFR5cGVFeHByIG4sIEEgYXJnKTsKKworCVIgdmlzaXQoQXJyYXlCcmFja2V0UGFpciBhcnJheUJyYWNrZXRQYWlyLCBBIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwMWZkZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE2NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljVmlzaXRvckFkYXB0ZXI8UiwgQT4gaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxSLCBBPiB7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbi5nZXRNZW1iZXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0SW5kZXgoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWZvcihBcnJheUNyZWF0aW9uTGV2ZWwgbGV2ZWw6IG4uZ2V0TGV2ZWxzKCkpeworCQkJUiByZXN1bHQgPSBsZXZlbC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0SW5pdGlhbGl6ZXIoKSAhPSBudWxsKSB7CisJCQlSIHJlc3VsdCA9IG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldFZhbHVlcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRXhwcmVzc2lvbiBleHByIDogbi5nZXRWYWx1ZXMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBleHByLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0U3RtdHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFN0YXRlbWVudCBzIDogbi5nZXRTdG10cygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRQYXJhbSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVHlwZVBhcmFtZXRlciB0IDogbi5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRFeHRlbmRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjIDogbi5nZXRFeHRlbmRzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG4uZ2V0SW1wbGVtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA6IG4uZ2V0SW1wbGVtZW50cygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbi5nZXRNZW1iZXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoVHlwZTw/PiB0eXBlIDogbi5nZXRUeXBlQXJndW1lbnRzKCkpIHsKKwkJCQlSIHJlc3VsdCA9IHR5cGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0UGFja2FnZSgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0UGFja2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRJbXBvcnRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBpIDogbi5nZXRJbXBvcnRzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gaS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBUeXBlRGVjbGFyYXRpb248Pz4gdHlwZURlY2xhcmF0aW9uIDogbi5nZXRUeXBlcygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHR5cGVEZWNsYXJhdGlvbi5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVHlwZVBhcmFtZXRlciB0IDogbi5nZXRUeXBlUGFyYW1ldGVycygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBQYXJhbWV0ZXIgcCA6IG4uZ2V0UGFyYW1ldGVycygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHAuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUaHJvd3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFJlZmVyZW5jZVR5cGUgbmFtZSA6IG4uZ2V0VGhyb3dzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbXB0eU1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEVtcHR5VHlwZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBuLmdldENsYXNzQm9keSgpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IG1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEltcGxlbWVudHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldEltcGxlbWVudHMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBjLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZSA6IG4uZ2V0RW50cmllcygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbi5nZXRNZW1iZXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAoIW4uaXNUaGlzKCkgJiYgbi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVBcmd1bWVudHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKFR5cGU8Pz4gdHlwZSA6IG4uZ2V0VHlwZUFyZ3VtZW50cygpKSB7CisJCQkJUiByZXN1bHQgPSB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuLmdldFR5cGVBcmd1bWVudHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChUeXBlPD8+IHR5cGUgOiBuLmdldFR5cGVBcmd1bWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBSIHJlc3VsdCA9IHR5cGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHZhciA6IG4uZ2V0VmFyaWFibGVzKCkpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IHZhci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRm9yU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0SW5pdCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRXhwcmVzc2lvbiBlIDogbi5nZXRJbml0KCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldENvbXBhcmUoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VXBkYXRlKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldFVwZGF0ZSgpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWlmIChuLmdldEVsc2VTdG10KCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRFbHNlU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEluc3RhbmNlT2ZFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoVHlwZTw/PiB0eXBlIDogbi5nZXRUeXBlQXJndW1lbnRzKCkpIHsKKwkJCQlSIHJlc3VsdCA9IHR5cGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlUGFyYW1ldGVyIHQgOiBuLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBQYXJhbWV0ZXIgcCA6IG4uZ2V0UGFyYW1ldGVycygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHAuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUaHJvd3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFJlZmVyZW5jZVR5cGUgbmFtZSA6IG4uZ2V0VGhyb3dzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRQYWlycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG0gOiBuLmdldFBhaXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoVHlwZTw/PiB0eXBlIDogbi5nZXRUeXBlQXJndW1lbnRzKCkpIHsKKwkJCQlSIHJlc3VsdCA9IHR5cGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBuLmdldEFub255bW91c0NsYXNzQm9keSgpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IG1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFByaW1pdGl2ZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBRdWFsaWZpZWROYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChBcnJheVR5cGUgbiwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Q29tcG9uZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChBcnJheUNyZWF0aW9uTGV2ZWwgbiwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlpZihuLmdldERpbWVuc2lvbigpIT1udWxsKSB7CisJCQkJUiByZXN1bHQgPSBuLmdldERpbWVuc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUiB2aXNpdChmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBSIHJlc3VsdCA9IGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlVHlwZSBlbGVtZW50IDogbi5nZXRFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgUiByZXN1bHQgPSBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRMYWJlbCgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0U3RtdHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFN0YXRlbWVudCBzIDogbi5nZXRTdG10cygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgU3dpdGNoRW50cnlTdG10IGUgOiBuLmdldEVudHJpZXMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJICAgIFIgcmVzdWx0ID0gbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJICAgIHJldHVybiByZXN1bHQ7CisJCQkgICAgfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldFJlc291cmNlcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdiA6IG4uZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gdi5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRDYXRjaHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENhdGNoQ2xhdXNlIGMgOiBuLmdldENhdGNocygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRGaW5hbGx5QmxvY2soKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBUeXBlRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFR5cGVQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldFR5cGVCb3VuZCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA6IG4uZ2V0VHlwZUJvdW5kKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHYgOiBuLmdldFZhcmlhYmxlcygpKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSB2LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRJbml0KCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFdoaWxlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRFeHRlbmRzKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFN1cGVyKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUiB2aXNpdChMYW1iZGFFeHByIG4sIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBQYXJhbWV0ZXIgYSA6IG4uZ2V0UGFyYW1ldGVycygpKSB7CisJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworCQkJUiByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFIgdmlzaXQoTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBBIGFyZykgeworICAgICAgICB2aXNpdENvbW1lbnQobiwgYXJnKTsKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFR5cGU8Pz4gdHlwZSA6IG4uZ2V0VHlwZUFyZ3VtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFIgcmVzdWx0ID0gdHlwZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuLmdldFNjb3BlKCkgIT0gbnVsbCkgeworCQkJUiByZXN1bHQgPSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSIHZpc2l0KFR5cGVFeHByIG4sIEEgYXJnKXsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldFR5cGUoKSAhPSBudWxsKSB7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKyAgICB9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChBcnJheUJyYWNrZXRQYWlyIG4sIEEgYXJnKSB7CisJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCB2aXNpdENvbW1lbnQoTm9kZSBuLCBBIGFyZykgeworCQlpZihuLmdldENvbW1lbnQoKSE9bnVsbCl7CisJCQlDb21tZW50IHJlc3VsdCA9IChDb21tZW50KSBuLmdldENvbW1lbnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmKHJlc3VsdCE9bnVsbCl7CisJCQkJbi5zZXRDb21tZW50KHJlc3VsdCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL01vZGlmaWVyVmlzaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIwZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL01vZGlmaWVyVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDExNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5TWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5VHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxvbmdMaXRlcmFsTWluVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OdWxsTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhBbm5vdGF0aW9uczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRW1wdHlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10OworCisvKioKKyAqIFRoaXMgdmlzaXRvciBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIHNhdmUgdGltZSB3aGVuIHNvbWUgc3BlY2lmaWMgbm9kZXMgbmVlZHMKKyAqIHRvIGJlIGNoYW5nZWQuIFRvIGRvIHRoYXQganVzdCBleHRlbmQgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgdGhlIG1ldGhvZHMKKyAqIGZyb20gdGhlIG5vZGVzIHdobyBuZWVkcyB0byBiZSBjaGFuZ2VkLCByZXR1cm5pbmcgdGhlIGNoYW5nZWQgbm9kZS4KKyAqIAorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RpZmllclZpc2l0b3JBZGFwdGVyPEE+IGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8Tm9kZSwgQT4geworCisJcHJpdmF0ZSB2b2lkIHJlbW92ZU51bGxzKGZpbmFsIExpc3Q8Pz4gbGlzdCkgeworCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKGxpc3QuZ2V0KGkpID09IG51bGwpIHsKKwkJCQlsaXN0LnJlbW92ZShpKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKyAgICAgICAgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnMgPSBuLmdldE1lbWJlcnMoKTsKKwkJaWYgKG1lbWJlcnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWVtYmVycy5zZXQoaSwgKEJvZHlEZWNsYXJhdGlvbjw/PikgbWVtYmVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMobWVtYmVycyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJcHJpdmF0ZSB2b2lkIHZpc2l0QW5ub3RhdGlvbnMoTm9kZVdpdGhBbm5vdGF0aW9uczw/PiBuLCBBIGFyZykgeworCQlmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQluLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJaWYgKG4uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJbi5zZXREZWZhdWx0VmFsdWUoKEV4cHJlc3Npb24pIG4uZ2V0RGVmYXVsdFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0TmFtZSgoRXhwcmVzc2lvbikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldEluZGV4KChFeHByZXNzaW9uKSBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCisJCWZpbmFsIExpc3Q8QXJyYXlDcmVhdGlvbkxldmVsPiB2YWx1ZXMgPSBuLmdldExldmVscygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykgeworCQkJdmFsdWVzLnNldChpLCAoQXJyYXlDcmVhdGlvbkxldmVsKSB2YWx1ZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZW1vdmVOdWxscyh2YWx1ZXMpOworCisJCWlmIChuLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCkgeworCQkJbi5zZXRJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplckV4cHIpIG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRWYWx1ZXMoKSAhPSBudWxsKSB7CisJCQlmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHZhbHVlcyA9IG4uZ2V0VmFsdWVzKCk7CisJCQlpZiAodmFsdWVzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykgeworCQkJCQl2YWx1ZXMuc2V0KGksIChFeHByZXNzaW9uKSB2YWx1ZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCQl9CisJCQkJcmVtb3ZlTnVsbHModmFsdWVzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRDaGVjaygoRXhwcmVzc2lvbikgbi5nZXRDaGVjaygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJaWYgKG4uZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKwkJCW4uc2V0TWVzc2FnZSgoRXhwcmVzc2lvbikgbi5nZXRNZXNzYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBFeHByZXNzaW9uIHRhcmdldCA9IChFeHByZXNzaW9uKSBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisgICAgICAgIG4uc2V0VGFyZ2V0KHRhcmdldCk7CisKKwkJZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSA9IChFeHByZXNzaW9uKSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQluLnNldFZhbHVlKHZhbHVlKTsKKworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgRXhwcmVzc2lvbiBsZWZ0ID0gKEV4cHJlc3Npb24pIG4uZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmaW5hbCBFeHByZXNzaW9uIHJpZ2h0ID0gKEV4cHJlc3Npb24pIG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKGxlZnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIHJpZ2h0OworCQl9CisJCWlmIChyaWdodCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbGVmdDsKKwkJfQorCQluLnNldExlZnQobGVmdCk7CisJCW4uc2V0UmlnaHQocmlnaHQpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMgPSBuLmdldFN0bXRzKCk7CisJCWlmIChzdG10cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0bXRzLnNpemUoKTsgaSsrKSB7CisJCQkJc3RtdHMuc2V0KGksIChTdGF0ZW1lbnQpIHN0bXRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhzdG10cyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBUeXBlIHR5cGUgPSAoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWZpbmFsIEV4cHJlc3Npb24gZXhwciA9IChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGV4cHI7CisJCX0KKwkJaWYgKGV4cHIgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbi5zZXRUeXBlKHR5cGUpOworCQluLnNldEV4cHIoZXhwcik7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBDYXRjaENsYXVzZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRQYXJhbSgoUGFyYW1ldGVyKW4uZ2V0UGFyYW0oKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0Qm9keSgoQmxvY2tTdG10KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKwkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQl0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlUGFyYW1ldGVycyk7CisJCX0KKwkJZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5keiA9IG4uZ2V0RXh0ZW5kcygpOworCQlpZiAoZXh0ZW5keiAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZHouc2l6ZSgpOyBpKyspIHsKKwkJCQlleHRlbmR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGV4dGVuZHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGV4dGVuZHopOworCQl9CisJCWZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHogPSBuLmdldEltcGxlbWVudHMoKTsKKwkJaWYgKGltcGxlbWVudHogIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnR6LnNpemUoKTsgaSsrKSB7CisJCQkJaW1wbGVtZW50ei5zZXQoaSwgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBpbXBsZW1lbnR6LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhpbXBsZW1lbnR6KTsKKwkJfQorICAgICAgICBmaW5hbCBMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycyA9IG4uZ2V0TWVtYmVycygpOworCQlpZiAobWVtYmVycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJzLnNldChpLCAoQm9keURlY2xhcmF0aW9uPD8+KSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhtZW1iZXJzKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLnNldFNjb3BlKChDbGFzc09ySW50ZXJmYWNlVHlwZSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHMgPSBuLmdldFR5cGVBcmd1bWVudHMoKTsKKwkJaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisJCQkJdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGU8Pz4pIHR5cGVBcmd1bWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVBcmd1bWVudHMpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldFBhY2thZ2UoKSAhPSBudWxsKSB7CisJCQluLnNldFBhY2thZ2UoKFBhY2thZ2VEZWNsYXJhdGlvbikgbi5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCWZpbmFsIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMgPSBuLmdldEltcG9ydHMoKTsKKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLnNpemUoKTsgaSsrKSB7CisJCQkJaW1wb3J0cy5zZXQoaSwgKEltcG9ydERlY2xhcmF0aW9uKSBpbXBvcnRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhpbXBvcnRzKTsKKwkJfQorICAgICAgICBmaW5hbCBMaXN0PFR5cGVEZWNsYXJhdGlvbjw/Pj4gdHlwZXMgPSBuLmdldFR5cGVzKCk7CisJCWlmICh0eXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHlwZXMuc2V0KGksIChUeXBlRGVjbGFyYXRpb248Pz4pIHR5cGVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlcyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRDb25kaXRpb24oKEV4cHJlc3Npb24pIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldFRoZW5FeHByKChFeHByZXNzaW9uKSBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldEVsc2VFeHByKChFeHByZXNzaW9uKSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gbi5nZXRUeXBlUGFyYW1ldGVycygpOworCQlpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5zaXplKCk7IGkrKykgeworCQkJCXR5cGVQYXJhbWV0ZXJzLnNldChpLCAoVHlwZVBhcmFtZXRlcikgdHlwZVBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVQYXJhbWV0ZXJzKTsKKwkJfQorCQlmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG4uZ2V0UGFyYW1ldGVycygpOworCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlwYXJhbWV0ZXJzLnNldChpLCAoUGFyYW1ldGVyKSBwYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhwYXJhbWV0ZXJzKTsKKwkJfQorCQlmaW5hbCBMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93eiA9IG4uZ2V0VGhyb3dzKCk7CisJCWlmICh0aHJvd3ogIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd3ouc2l6ZSgpOyBpKyspIHsKKwkJCQl0aHJvd3ouc2V0KGksIChSZWZlcmVuY2VUeXBlKSB0aHJvd3ouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHRocm93eik7CisJCX0KKwkJbi5zZXRCb2R5KChCbG9ja1N0bXQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgU3RhdGVtZW50IGJvZHkgPSAoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKGJvZHkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbi5zZXRCb2R5KGJvZHkpOworCisJCWZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uID0gKEV4cHJlc3Npb24pIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChjb25kaXRpb24gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbi5zZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBFbXB0eU1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRW1wdHlUeXBlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0SW5uZXIoKEV4cHJlc3Npb24pIG4uZ2V0SW5uZXIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQlmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBuLmdldEFyZ3MoKTsKKwkJaWYgKGFyZ3MgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisJCQkJYXJncy5zZXQoaSwgKEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFyZ3MpOworCQl9CisgICAgICAgIGZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBjbGFzc0JvZHkgPSBuLmdldENsYXNzQm9keSgpOworCQlpZiAoY2xhc3NCb2R5ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NCb2R5LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2xhc3NCb2R5LnNldChpLCAoQm9keURlY2xhcmF0aW9uPD8+KSBjbGFzc0JvZHkuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGNsYXNzQm9keSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQlmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnR6ID0gbi5nZXRJbXBsZW1lbnRzKCk7CisJCWlmIChpbXBsZW1lbnR6ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wbGVtZW50ei5zaXplKCk7IGkrKykgeworCQkJCWltcGxlbWVudHouc2V0KGksIChDbGFzc09ySW50ZXJmYWNlVHlwZSkgaW1wbGVtZW50ei5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoaW1wbGVtZW50eik7CisJCX0KKwkJZmluYWwgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcyA9IG4uZ2V0RW50cmllcygpOworCQlpZiAoZW50cmllcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQllbnRyaWVzLnNldChpLCAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIGVudHJpZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGVudHJpZXMpOworCQl9CisgICAgICAgIGZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzID0gbi5nZXRNZW1iZXJzKCk7CisJCWlmIChtZW1iZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1lbWJlcnMuc2V0KGksIChCb2R5RGVjbGFyYXRpb248Pz4pIG1lbWJlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKG1lbWJlcnMpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmICghbi5pc1RoaXMoKSAmJiBuLmdldEV4cHIoKSAhPSBudWxsKSB7CisJCQluLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorICAgICAgICBmaW5hbCBMaXN0PFR5cGU8Pz4+IHR5cGVBcmd1bWVudHMgPSBuLmdldFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5zZXQoaSwgKFR5cGU8Pz4pIHR5cGVBcmd1bWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZU51bGxzKHR5cGVBcmd1bWVudHMpOworICAgICAgICB9CisJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpOworCQlpZiAoYXJncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCQlhcmdzLnNldChpLCAoRXhwcmVzc2lvbikgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYXJncyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBFeHByZXNzaW9uIGV4cHIgPSAoRXhwcmVzc2lvbikgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChleHByID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCW4uc2V0RXhwcmVzc2lvbihleHByKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEZpZWxkQWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgRXhwcmVzc2lvbiBzY29wZSA9IChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChzY29wZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQluLnNldFNjb3BlKHNjb3BlKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpOworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCWFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhhbm5vdGF0aW9ucyk7CisJCX0KKwkJbi5zZXRFbGVtZW50VHlwZSgoVHlwZSkgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IG4uZ2V0VmFyaWFibGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLnNpemUoKTsgaSsrKSB7CisJCQl2YXJpYWJsZXMuc2V0KGksIChWYXJpYWJsZURlY2xhcmF0b3IpIHZhcmlhYmxlcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJlbW92ZU51bGxzKHZhcmlhYmxlcyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRWYXJpYWJsZSgoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIG4uZ2V0VmFyaWFibGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0SXRlcmFibGUoKEV4cHJlc3Npb24pIG4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0Qm9keSgoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGluaXQgPSBuLmdldEluaXQoKTsKKwkJaWYgKGluaXQgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0LnNpemUoKTsgaSsrKSB7CisJCQkJaW5pdC5zZXQoaSwgKEV4cHJlc3Npb24pIGluaXQuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGluaXQpOworCQl9CisJCWlmIChuLmdldENvbXBhcmUoKSAhPSBudWxsKSB7CisJCQluLnNldENvbXBhcmUoKEV4cHJlc3Npb24pIG4uZ2V0Q29tcGFyZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSA9IG4uZ2V0VXBkYXRlKCk7CisJCWlmICh1cGRhdGUgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cGRhdGUuc2l6ZSgpOyBpKyspIHsKKwkJCQl1cGRhdGUuc2V0KGksIChFeHByZXNzaW9uKSB1cGRhdGUuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHVwZGF0ZSk7CisJCX0KKwkJbi5zZXRCb2R5KChTdGF0ZW1lbnQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24gPSAoRXhwcmVzc2lvbikKKwkJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChjb25kaXRpb24gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbi5zZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwkJZmluYWwgU3RhdGVtZW50IHRoZW5TdG10ID0gKFN0YXRlbWVudCkgbi5nZXRUaGVuU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAodGhlblN0bXQgPT0gbnVsbCkgeworCQkJLy8gUmVtb3ZlIHRoZSBlbnRpcmUgc3RhdGVtZW50IGlmIHRoZSB0aGVuLWNsYXVzZSB3YXMgcmVtb3ZlZC4KKwkJCS8vIER1bXBWaXNpdG9yLCB1c2VkIGZvciB0b1N0cmluZywgaGFzIG5vIG51bGwgY2hlY2sgZm9yIHRoZQorCQkJLy8gdGhlbi1jbGF1c2UuCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQluLnNldFRoZW5TdG10KHRoZW5TdG10KTsKKwkJaWYgKG4uZ2V0RWxzZVN0bXQoKSAhPSBudWxsKSB7CisJCQluLnNldEVsc2VTdG10KChTdGF0ZW1lbnQpIG4uZ2V0RWxzZVN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldEJsb2NrKChCbG9ja1N0bXQpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0U3RtdCgoU3RhdGVtZW50KSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0VmFsdWUoKEV4cHJlc3Npb24pIG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLnNldFNjb3BlKChFeHByZXNzaW9uKSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisgICAgICAgIGZpbmFsIExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3VtZW50cyA9IG4uZ2V0VHlwZUFyZ3VtZW50cygpOworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnNldChpLCAoVHlwZTw/PikgdHlwZUFyZ3VtZW50cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlTnVsbHModHlwZUFyZ3VtZW50cyk7CisgICAgICAgIH0KKwkJZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhcmdzID0gbi5nZXRBcmdzKCk7CisJCWlmIChhcmdzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgeworCQkJCWFyZ3Muc2V0KGksIChFeHByZXNzaW9uKSBhcmdzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhhcmdzKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpOworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCWFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhhbm5vdGF0aW9ucyk7CisJCX0KKwkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKwkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQl0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlUGFyYW1ldGVycyk7CisJCX0KKwkJbi5zZXRFbGVtZW50VHlwZSgoVHlwZSkgbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuLmdldFBhcmFtZXRlcnMoKTsKKwkJaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgaSsrKSB7CisJCQkJcGFyYW1ldGVycy5zZXQoaSwgKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMocGFyYW1ldGVycyk7CisJCX0KKwkJZmluYWwgTGlzdDxSZWZlcmVuY2VUeXBlPiB0aHJvd3ogPSBuLmdldFRocm93cygpOworCQlpZiAodGhyb3d6ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3d6LnNpemUoKTsgaSsrKSB7CisJCQkJdGhyb3d6LnNldChpLCAoUmVmZXJlbmNlVHlwZSkgdGhyb3d6LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0aHJvd3opOworCQl9CisJCWlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisJCQluLnNldEJvZHkoKEJsb2NrU3RtdCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWZpbmFsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycyA9IG4uZ2V0UGFpcnMoKTsKKwkJaWYgKHBhaXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFpcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlwYWlycy5zZXQoaSwgKE1lbWJlclZhbHVlUGFpcikgcGFpcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHBhaXJzKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCW4uc2V0U2NvcGUoKEV4cHJlc3Npb24pIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKyAgICAgICAgZmluYWwgTGlzdDxUeXBlPD8+PiB0eXBlQXJndW1lbnRzID0gbi5nZXRUeXBlQXJndW1lbnRzKCk7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMuc2V0KGksIChUeXBlPD8+KSB0eXBlQXJndW1lbnRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW1vdmVOdWxscyh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgfQorCQluLnNldFR5cGUoKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpOworCQlpZiAoYXJncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCQlhcmdzLnNldChpLCAoRXhwcmVzc2lvbikgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYXJncyk7CisJCX0KKyAgICAgICAgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IGFub255bW91c0NsYXNzQm9keSA9IG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCk7CisJCWlmIChhbm9ueW1vdXNDbGFzc0JvZHkgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9ueW1vdXNDbGFzc0JvZHkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbm9ueW1vdXNDbGFzc0JvZHkuc2V0KGksIChCb2R5RGVjbGFyYXRpb248Pz4pIGFub255bW91c0NsYXNzQm9keS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5vbnltb3VzQ2xhc3NCb2R5KTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpOworCQl9CisJCW4uc2V0TmFtZSgoTmFtZUV4cHIpIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCQorCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJbi5zZXRJZCgoVmFyaWFibGVEZWNsYXJhdG9ySWQpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0RWxlbWVudFR5cGUoKFR5cGUpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKwkKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgUHJpbWl0aXZlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgUXVhbGlmaWVkTmFtZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0UXVhbGlmaWVyKChOYW1lRXhwcikgbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFycmF5VHlwZSBuLCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQluLnNldENvbXBvbmVudFR5cGUoKFR5cGUpIG4uZ2V0Q29tcG9uZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQXJyYXlDcmVhdGlvbkxldmVsIG4sIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCWlmKG4uZ2V0RGltZW5zaW9uKCkhPW51bGwpIHsKKwkJCW4uc2V0RGltZW5zaW9uKChFeHByZXNzaW9uKSBuLmdldERpbWVuc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisgICAgICAgIGZpbmFsIExpc3Q8UmVmZXJlbmNlVHlwZT4gZWxlbWVudHMgPSBuLmdldEVsZW1lbnRzKCk7CisgICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMuc2V0KGksIChSZWZlcmVuY2VUeXBlKSBlbGVtZW50cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlTnVsbHMoZWxlbWVudHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlmaW5hbCBMaXN0PFJlZmVyZW5jZVR5cGU+IGVsZW1lbnRzID0gbi5nZXRFbGVtZW50cygpOworICAgICAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNldChpLCAoUmVmZXJlbmNlVHlwZSkgZWxlbWVudHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZU51bGxzKGVsZW1lbnRzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgUmV0dXJuU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJaWYgKG4uZ2V0RXhwcigpICE9IG51bGwpIHsKKwkJCW4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXROYW1lKChOYW1lRXhwcikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldE1lbWJlclZhbHVlKChFeHByZXNzaW9uKSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldENsYXNzRXhwcigpICE9IG51bGwpIHsKKwkJCW4uc2V0Q2xhc3NFeHByKChFeHByZXNzaW9uKSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRMYWJlbCgpICE9IG51bGwpIHsKKwkJCW4uc2V0TGFiZWwoKEV4cHJlc3Npb24pIG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gbi5nZXRTdG10cygpOworCQlpZiAoc3RtdHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdG10cy5zaXplKCk7IGkrKykgeworCQkJCXN0bXRzLnNldChpLCAoU3RhdGVtZW50KSBzdG10cy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoc3RtdHMpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldFNlbGVjdG9yKChFeHByZXNzaW9uKSBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlmaW5hbCBMaXN0PFN3aXRjaEVudHJ5U3RtdD4gZW50cmllcyA9IG4uZ2V0RW50cmllcygpOworCQlpZiAoZW50cmllcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQllbnRyaWVzLnNldChpLCAoU3dpdGNoRW50cnlTdG10KSBlbnRyaWVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhlbnRyaWVzKTsKKwkJfQorCQlyZXR1cm4gbjsKKworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJbi5zZXRCb2R5KChCbG9ja1N0bXQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQluLnNldENsYXNzRXhwcigoRXhwcmVzc2lvbikgbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiB0eXBlcyA9IG4uZ2V0UmVzb3VyY2VzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyBpKyspIHsKKwkJCW4uZ2V0UmVzb3VyY2VzKCkuc2V0KGksCisJCQkJCShWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgbi5nZXRSZXNvdXJjZXMoKS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCW4uc2V0VHJ5QmxvY2soKEJsb2NrU3RtdCkgbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzID0gbi5nZXRDYXRjaHMoKTsKKwkJaWYgKGNhdGNocyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGNocy5zaXplKCk7IGkrKykgeworCQkJCWNhdGNocy5zZXQoaSwgKENhdGNoQ2xhdXNlKSBjYXRjaHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGNhdGNocyk7CisJCX0KKwkJaWYgKG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCkgeworCQkJbi5zZXRGaW5hbGx5QmxvY2soKEJsb2NrU3RtdCkgbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCW4uc2V0VHlwZURlY2xhcmF0aW9uKChUeXBlRGVjbGFyYXRpb248Pz4pIG4uZ2V0VHlwZURlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdHlwZUJvdW5kID0gbi5nZXRUeXBlQm91bmQoKTsKKwkJaWYgKHR5cGVCb3VuZCAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVCb3VuZC5zaXplKCk7IGkrKykgeworCQkJCXR5cGVCb3VuZC5zZXQoaSwgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSB0eXBlQm91bmQuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVCb3VuZCk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpOworCQl9CisKKwkJZmluYWwgVHlwZSB0eXBlID0gKFR5cGUpIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbi5zZXRFbGVtZW50VHlwZSh0eXBlKTsKKworCQlmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFycyA9IG4uZ2V0VmFyaWFibGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFycy5zaXplKCk7KSB7CisJCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgZGVjbCA9IChWYXJpYWJsZURlY2xhcmF0b3IpCisJCQkJdmFycy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAoZGVjbCA9PSBudWxsKSB7CisJCQkJdmFycy5yZW1vdmUoaSk7CisJCQl9IGVsc2UgeworCQkJCXZhcnMuc2V0KGkrKywgZGVjbCk7CisJCQl9CisJCX0KKwkJaWYgKHZhcnMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gKFZhcmlhYmxlRGVjbGFyYXRvcklkKQorCQkJbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAoaWQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbi5zZXRJZChpZCk7CisJCWlmIChuLmdldEluaXQoKSAhPSBudWxsKSB7CisJCQluLnNldEluaXQoKEV4cHJlc3Npb24pIG4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9ySWQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQluLnNldENvbmRpdGlvbigoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0Qm9keSgoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJaWYgKG4uZ2V0RXh0ZW5kcygpICE9IG51bGwpIHsKKwkJCW4uc2V0RXh0ZW5kcygoUmVmZXJlbmNlVHlwZSkgbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCWlmIChuLmdldFN1cGVyKCkgIT0gbnVsbCkgeworCQkJbi5zZXRTdXBlcigoUmVmZXJlbmNlVHlwZSkgbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBMYW1iZGFFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLCBhcmcpOworCQlmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG4uZ2V0UGFyYW1ldGVycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCXBhcmFtZXRlcnMuc2V0KGksIChQYXJhbWV0ZXIpIHBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZW1vdmVOdWxscyhwYXJhbWV0ZXJzKTsKKwkJaWYgKG4uZ2V0Qm9keSgpICE9IG51bGwpIHsKKwkJCW4uc2V0Qm9keSgoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoZmluYWwgTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobiwgYXJnKTsKKwkJZmluYWwgTGlzdDxUeXBlPD8+PiB0eXBlcyA9IG4uZ2V0VHlwZUFyZ3VtZW50cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7CisJCQluLmdldFR5cGVBcmd1bWVudHMoKS5zZXQoaSwKKwkJCQkJKFR5cGU8Pz4pIG4uZ2V0VHlwZUFyZ3VtZW50cygpLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLnNldFNjb3BlKChFeHByZXNzaW9uKW4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4sIGFyZyk7CisJCWlmIChuLmdldFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuLnNldFR5cGUoKFR5cGU8Pz4pIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBcnJheUJyYWNrZXRQYWlyIG4sIEEgYXJnKSB7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCXByaXZhdGUgdm9pZCB2aXNpdENvbW1lbnQoTm9kZSBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobiAhPSBudWxsICYmIG4uZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKwkJCW4uc2V0Q29tbWVudCgoQ29tbWVudCkgbi5nZXRDb21tZW50KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1RyZWVWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVHJlZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWI3ZWFlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1RyZWVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgbm9kZXMgaW4gKGEgcGFydCBvZikgdGhlIEFTVC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVWaXNpdG9yIHsKKworCS8qKgorCSAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RlcHRoLWZpcnN0X3NlYXJjaAorCSAqCisJICogQHBhcmFtIG5vZGUgdGhlIHN0YXJ0IG5vZGUsIGFuZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgcGFzc2VkIHRvIHByb2Nlc3Mobm9kZSkuCisJICovCisJcHVibGljIHZvaWQgdmlzaXREZXB0aEZpcnN0KE5vZGUgbm9kZSkgeworCQlwcm9jZXNzKG5vZGUpOworCQlmb3IgKE5vZGUgY2hpbGQgOiBub2RlLmdldENoaWxkcmVuTm9kZXMoKSkgeworCQkJdmlzaXREZXB0aEZpcnN0KGNoaWxkKTsKKwkJfQorCX0KKworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3MoTm9kZSBub2RlKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxZDBmNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlNZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRW1wdHlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKKworLyoqCisgKiBBIHZpc2l0b3IgdGhhdCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIFZvaWRWaXNpdG9yPEE+IHsKKworCS8vLSBDb21waWxhdGlvbiBVbml0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgdmlzaXQoQ29tcGlsYXRpb25Vbml0IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoSW1wb3J0RGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChUeXBlUGFyYW1ldGVyIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoTGluZUNvbW1lbnQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChCbG9ja0NvbW1lbnQgbiwgQSBhcmcpOworCisJLy8tIEJvZHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCB2aXNpdChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChFbnVtRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChFbXB0eVR5cGVEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoRmllbGREZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRvciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRvcklkIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoUGFyYW1ldGVyIG4sIEEgYXJnKTsKKwkKKwl2b2lkIHZpc2l0KEVtcHR5TWVtYmVyRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoSmF2YWRvY0NvbW1lbnQgbiwgQSBhcmcpOworCisJLy8tIFR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCB2aXNpdChDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFByaW1pdGl2ZVR5cGUgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChBcnJheVR5cGUgbiwgQSBhcmcpOworCQorCXZvaWQgdmlzaXQoQXJyYXlDcmVhdGlvbkxldmVsIG4sIEEgYXJnKTsKKworICAgIHZvaWQgdmlzaXQoSW50ZXJzZWN0aW9uVHlwZSBuLCBBIGFyZyk7CisKKyAgICB2b2lkIHZpc2l0KFVuaW9uVHlwZSBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFZvaWRUeXBlIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoV2lsZGNhcmRUeXBlIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVW5rbm93blR5cGUgbiwgQSBhcmcpOworCisJLy8tIEV4cHJlc3Npb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCB2aXNpdChBcnJheUFjY2Vzc0V4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChBcnJheUNyZWF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQXNzaWduRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEJpbmFyeUV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChDYXN0RXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENsYXNzRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENvbmRpdGlvbmFsRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEVuY2xvc2VkRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEZpZWxkQWNjZXNzRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEluc3RhbmNlT2ZFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoU3RyaW5nTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChMb25nTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQ2hhckxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoRG91YmxlTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChCb29sZWFuTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChOdWxsTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChNZXRob2RDYWxsRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KE5hbWVFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoT2JqZWN0Q3JlYXRpb25FeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoUXVhbGlmaWVkTmFtZUV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChUaGlzRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFN1cGVyRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFVuYXJ5RXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KE5vcm1hbEFubm90YXRpb25FeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoTWVtYmVyVmFsdWVQYWlyIG4sIEEgYXJnKTsKKworCS8vLSBTdGF0ZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgdmlzaXQoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFzc2VydFN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChCbG9ja1N0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChMYWJlbGVkU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEVtcHR5U3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEV4cHJlc3Npb25TdG10IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoU3dpdGNoU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFN3aXRjaEVudHJ5U3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEJyZWFrU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFJldHVyblN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJZlN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChXaGlsZVN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChDb250aW51ZVN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChEb1N0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChGb3JlYWNoU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEZvclN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChUaHJvd1N0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChTeW5jaHJvbml6ZWRTdG10IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVHJ5U3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENhdGNoQ2xhdXNlIG4sIEEgYXJnKTsKKworICAgIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBBIGFyZyk7CisKKyAgICB2b2lkIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgQSBhcmcpOworCisgICAgdm9pZCB2aXNpdChUeXBlRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFycmF5QnJhY2tldFBhaXIgYXJyYXlCcmFja2V0UGFpciwgQSBhcmcpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yQWRhcHRlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjNlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3JBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUluaXRpYWxpemVyRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXNzaWduRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQmluYXJ5RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQm9vbGVhbkxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2hhckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DbGFzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNvbmRpdGlvbmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRG91YmxlTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkVuY2xvc2VkRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRmllbGRBY2Nlc3NFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnN0YW5jZU9mRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTGFtYmRhRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTG9uZ0xpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbE1pblZhbHVlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1lbWJlclZhbHVlUGFpcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZFJlZmVyZW5jZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Ob3JtYWxBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTnVsbExpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5PYmplY3RDcmVhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlF1YWxpZmllZE5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3RyaW5nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlN1cGVyRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVGhpc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlR5cGVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5VbmFyeUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWb2lkVmlzaXRvckFkYXB0ZXI8QT4gaW1wbGVtZW50cyBWb2lkVmlzaXRvcjxBPiB7CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQluLmdldE5hbWVFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBuLmdldE1lbWJlcnMoKSkgeworCQkJCW1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7CisJCQluLmdldERlZmF1bHRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWZvciAoQXJyYXlDcmVhdGlvbkxldmVsIGxldmVsIDogbi5nZXRMZXZlbHMoKSkgeworCQkJbGV2ZWwuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0SW5pdGlhbGl6ZXIoKSAhPSBudWxsKSB7CisJCQluLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRWYWx1ZXMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZXhwciA6IG4uZ2V0VmFsdWVzKCkpIHsKKwkJCQlleHByLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQluLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldFN0bXRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RtdHMoKSkgeworCQkJCXMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRQYXJhbSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJbi5nZXROYW1lRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmb3IgKGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA6IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworCQkJdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldEV4dGVuZHMoKSkgeworCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldEltcGxlbWVudHMoKSkgeworCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBuLmdldE1lbWJlcnMoKSkgeworCQkJbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlpZiAobi5nZXRUeXBlQXJndW1lbnRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlIHQgOiBuLmdldFR5cGVBcmd1bWVudHMoKSkgeworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0UGFja2FnZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0UGFja2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldEltcG9ydHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIGkgOiBuLmdldEltcG9ydHMoKSkgeworCQkJCWkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFR5cGVEZWNsYXJhdGlvbjw/PiB0eXBlRGVjbGFyYXRpb24gOiBuLmdldFR5cGVzKCkpIHsKKwkJCQl0eXBlRGVjbGFyYXRpb24uYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uZGl0aW9uYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCWlmIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlUGFyYW1ldGVyIHQgOiBuLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0TmFtZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0UGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgUGFyYW1ldGVyIHAgOiBuLmdldFBhcmFtZXRlcnMoKSkgeworCQkJCXAuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VGhyb3dzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBSZWZlcmVuY2VUeXBlIG5hbWUgOiBuLmdldFRocm93cygpKSB7CisJCQkJbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5VHlwZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXROYW1lRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Q2xhc3NCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbi5nZXRDbGFzc0JvZHkoKSkgeworCQkJCW1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCW4uZ2V0TmFtZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0SW1wbGVtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA6IG4uZ2V0SW1wbGVtZW50cygpKSB7CisJCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRFbnRyaWVzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlIDogbi5nZXRFbnRyaWVzKCkpIHsKKwkJCQllLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBuLmdldE1lbWJlcnMoKSkgeworCQkJCW1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAoIW4uaXNUaGlzKCkgJiYgbi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0VHlwZUFyZ3VtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVHlwZSB0IDogbi5nZXRUeXBlQXJndW1lbnRzKCkpIHsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0RmllbGRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCW4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJZm9yIChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyIDogbi5nZXRWYXJpYWJsZXMoKSkgeworCQkJdmFyLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZvcmVhY2hTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0SW5pdCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRXhwcmVzc2lvbiBlIDogbi5nZXRJbml0KCkpIHsKKwkJCQllLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldENvbXBhcmUoKSAhPSBudWxsKSB7CisJCQluLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlpZiAobi5nZXRVcGRhdGUoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0VXBkYXRlKCkpIHsKKwkJCQllLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldEVsc2VTdG10KCkgIT0gbnVsbCkgeworCQkJbi5nZXRFbHNlU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluc3RhbmNlT2ZFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRTdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldFNjb3BlKCkgIT0gbnVsbCkgeworCQkJbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldFR5cGVBcmd1bWVudHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGUgdCA6IG4uZ2V0VHlwZUFyZ3VtZW50cygpKSB7CisJCQkJdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQluLmdldE5hbWVFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJaWYgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA6IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldE5hbWVFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFBhcmFtZXRlciBwIDogbi5nZXRQYXJhbWV0ZXJzKCkpIHsKKwkJCQlwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldFRocm93cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgUmVmZXJlbmNlVHlwZSBuYW1lIDogbi5nZXRUaHJvd3MoKSkgeworCQkJCW5hbWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Qm9keSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0UGFpcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIE1lbWJlclZhbHVlUGFpciBtIDogbi5nZXRQYWlycygpKSB7CisJCQkJbS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOdWxsTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlpZiAobi5nZXRUeXBlQXJndW1lbnRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlIHQgOiBuLmdldFR5cGVBcmd1bWVudHMoKSkgeworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBuLmdldEFub255bW91c0NsYXNzQm9keSgpKSB7CisJCQkJbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJbi5nZXRFbGVtZW50VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCQorCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBRdWFsaWZpZWROYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoQXJyYXlUeXBlIG4sIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQluLmdldENvbXBvbmVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2aXNpdChBcnJheUNyZWF0aW9uTGV2ZWwgbiwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCWlmKG4uZ2V0RGltZW5zaW9uKCkhPW51bGwpIHsKKwkJCW4uZ2V0RGltZW5zaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZXJzZWN0aW9uVHlwZSBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICB2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKwkJZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5pb25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlmb3IgKFJlZmVyZW5jZVR5cGUgZWxlbWVudCA6IG4uZ2V0RWxlbWVudHMoKSkgeworICAgICAgICAgICAgZWxlbWVudC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0RXhwcigpICE9IG51bGwpIHsKKwkJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQluLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldExhYmVsKCkgIT0gbnVsbCkgeworCQkJbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldFN0bXRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RtdHMoKSkgeworCQkJCXMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgU3dpdGNoRW50cnlTdG10IGUgOiBuLmdldEVudHJpZXMoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQluLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0UmVzb3VyY2VzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2IDogbi5nZXRSZXNvdXJjZXMoKSkgeworCQkJCXYuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXRDYXRjaHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENhdGNoQ2xhdXNlIGMgOiBuLmdldENhdGNocygpKSB7CisJCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRGaW5hbGx5QmxvY2soKSAhPSBudWxsKSB7CisJCQluLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0VHlwZUJvdW5kKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjIDogbi5nZXRUeXBlQm91bmQoKSkgeworCQkJCWMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJCW4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJZm9yIChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdiA6IG4uZ2V0VmFyaWFibGVzKCkpIHsKKwkJCXYuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXRJbml0KCkgIT0gbnVsbCkgeworCQkJbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9ySWQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXZpc2l0QW5ub3RhdGlvbnMobiwgYXJnKTsKKworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJdmlzaXRBbm5vdGF0aW9ucyhuLCBhcmcpOworCQlpZiAobi5nZXRFeHRlbmRzKCkgIT0gbnVsbCkgeworCQkJbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0U3VwZXIoKSAhPSBudWxsKSB7CisJCQluLmdldFN1cGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChMYW1iZGFFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0UGFyYW1ldGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgUGFyYW1ldGVyIGEgOiBuLmdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgIGEuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0Qm9keSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTWV0aG9kUmVmZXJlbmNlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldFR5cGVBcmd1bWVudHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGUgdCA6IG4uZ2V0VHlwZUFyZ3VtZW50cygpKSB7CisJCQkJdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorICAgICAgICBpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoQXJyYXlCcmFja2V0UGFpciBuLCBBIGFyZykgeworCQl2aXNpdEFubm90YXRpb25zKG4sIGFyZyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZpc2l0Q29tbWVudChmaW5hbCBDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuICE9IG51bGwpIHsKKwkJCW4uYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdmlzaXRBbm5vdGF0aW9ucyhOb2RlV2l0aEFubm90YXRpb25zPD8+IG4sIEEgYXJnKSB7CisJCWZvciAoQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvbiA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJYW5ub3RhdGlvbi5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9DbGFzc1V0aWxzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ2xhc3NVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Njk4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ2xhc3NVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIENsYXNzVXRpbHMgeworICAgIC8qKgorICAgICAqIE1hcHMgcHJpbWl0aXZlIHtAY29kZSBDbGFzc31lcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHdyYXBwZXIge0Bjb2RlIENsYXNzfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8Pz4sIENsYXNzPD8+PiBwcmltaXRpdmVXcmFwcGVyTWFwID0gbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sIENsYXNzPD8+PigpOworICAgIHN0YXRpYyB7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEJvb2xlYW4uVFlQRSwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEJ5dGUuVFlQRSwgQnl0ZS5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KENoYXJhY3Rlci5UWVBFLCBDaGFyYWN0ZXIuY2xhc3MpOworICAgICAgICBwcmltaXRpdmVXcmFwcGVyTWFwLnB1dChTaG9ydC5UWVBFLCBTaG9ydC5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KEludGVnZXIuVFlQRSwgSW50ZWdlci5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KExvbmcuVFlQRSwgTG9uZy5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KERvdWJsZS5UWVBFLCBEb3VibGUuY2xhc3MpOworICAgICAgICBwcmltaXRpdmVXcmFwcGVyTWFwLnB1dChGbG9hdC5UWVBFLCBGbG9hdC5jbGFzcyk7CisgICAgICAgIHByaW1pdGl2ZVdyYXBwZXJNYXAucHV0KFZvaWQuVFlQRSwgVm9pZC5UWVBFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHdyYXBwZXIge0Bjb2RlIENsYXNzfWVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJpbWl0aXZlIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+IHdyYXBwZXJQcmltaXRpdmVNYXAgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+KCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBwcmltaXRpdmVDbGFzcyA6IHByaW1pdGl2ZVdyYXBwZXJNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHdyYXBwZXJDbGFzcyA9IHByaW1pdGl2ZVdyYXBwZXJNYXAuZ2V0KHByaW1pdGl2ZUNsYXNzKTsKKyAgICAgICAgICAgIGlmICghcHJpbWl0aXZlQ2xhc3MuZXF1YWxzKHdyYXBwZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyUHJpbWl0aXZlTWFwLnB1dCh3cmFwcGVyQ2xhc3MsIHByaW1pdGl2ZUNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4ge0Bjb2RlIHR5cGV9IGlzIGEgcHJpbWl0aXZlIG9yIHByaW1pdGl2ZSB3cmFwcGVyICh7QGxpbmsgQm9vbGVhbn0sIHtAbGluayBCeXRlfSwKKyAgICAgKiB7QGxpbmsgQ2hhcmFjdGVyfSwKKyAgICAgKiB7QGxpbmsgU2hvcnR9LCB7QGxpbmsgSW50ZWdlcn0sIHtAbGluayBMb25nfSwge0BsaW5rIERvdWJsZX0sIHtAbGluayBGbG9hdH0pLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzcyB0byBxdWVyeSBvciBudWxsLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4ge0Bjb2RlIHR5cGV9IGlzIGEgcHJpbWl0aXZlIG9yIHByaW1pdGl2ZSB3cmFwcGVyICh7QGxpbmsgQm9vbGVhbn0sIHtAbGluayBCeXRlfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBDaGFyYWN0ZXJ9LAorICAgICAqICAgICAgICAge0BsaW5rIFNob3J0fSwge0BsaW5rIEludGVnZXJ9LCB7QGxpbmsgTG9uZ30sIHtAbGluayBEb3VibGV9LCB7QGxpbmsgRmxvYXR9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVPcldyYXBwZXIoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGUuaXNQcmltaXRpdmUoKSB8fCBpc1ByaW1pdGl2ZVdyYXBwZXIodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB7QGNvZGUgdHlwZX0gaXMgYSBwcmltaXRpdmUgd3JhcHBlciAoe0BsaW5rIEJvb2xlYW59LCB7QGxpbmsgQnl0ZX0sIHtAbGluayBDaGFyYWN0ZXJ9LAorICAgICAqIHtAbGluayBTaG9ydH0sCisgICAgICoge0BsaW5rIEludGVnZXJ9LCB7QGxpbmsgTG9uZ30sIHtAbGluayBEb3VibGV9LCB7QGxpbmsgRmxvYXR9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICBUaGUgY2xhc3MgdG8gcXVlcnkgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHtAY29kZSB0eXBlfSBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyICh7QGxpbmsgQm9vbGVhbn0sIHtAbGluayBCeXRlfSwge0BsaW5rIENoYXJhY3Rlcn0sCisgICAgICogICAgICAgICB7QGxpbmsgU2hvcnR9LAorICAgICAqICAgICAgICAge0BsaW5rIEludGVnZXJ9LCB7QGxpbmsgTG9uZ30sIHtAbGluayBEb3VibGV9LCB7QGxpbmsgRmxvYXR9KS4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcihmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVyUHJpbWl0aXZlTWFwLmNvbnRhaW5zS2V5KHR5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9QYWlyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvUGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2U4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvUGFpci5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCisvKioKKyAqIFNpbXBseSBhIHBhaXIgb2Ygb2JqZWN0cy4KKyAqIEBwYXJhbSA8QT4gdHlwZSBvZiBvYmplY3QgYS4KKyAqIEBwYXJhbSA8Qj4gdHlwZSBvZiBvYmplY3QgYi4KKyAqLworcHVibGljIGNsYXNzIFBhaXI8QSwgQj4geworCXB1YmxpYyBmaW5hbCBBIGE7CisJcHVibGljIGZpbmFsIEIgYjsKKworCXB1YmxpYyBQYWlyKEEgYSwgQiBiKSB7CisJCXRoaXMuYSA9IGE7CisJCXRoaXMuYiA9IGI7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWNvcmUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Bvc2l0aW9uVXRpbHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Qb3NpdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlY2YxOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Qb3NpdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlci5zaWdudW07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoQW5ub3RhdGlvbnM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhFbGVtZW50VHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBQb3NpdGlvblV0aWxzIHsKKworICAgIHByaXZhdGUgUG9zaXRpb25VdGlscygpIHsKKyAgICAgICAgLy8gcHJldmVudCBpbnN0YW50aWF0aW9uCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5vZGU+IHZvaWQgc29ydEJ5QmVnaW5Qb3NpdGlvbihMaXN0PFQ+IG5vZGVzKXsKKyAgICAgICAgc29ydEJ5QmVnaW5Qb3NpdGlvbihub2RlcywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBOb2RlPiB2b2lkIHNvcnRCeUJlZ2luUG9zaXRpb24oTGlzdDxUPiBub2RlcywgZmluYWwgYm9vbGVhbiBpZ25vcmluZ0Fubm90YXRpb25zKXsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub2RlcywgKG8xLCBvMikgLT4gUG9zaXRpb25VdGlscy5jb21wYXJlKG8xLCBvMiwgaWdub3JpbmdBbm5vdGF0aW9ucykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVJbk9yZGVyKE5vZGUgYSwgTm9kZSBiKXsKKyAgICAgICAgcmV0dXJuIGFyZUluT3JkZXIoYSwgYiwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVJbk9yZGVyKE5vZGUgYSwgTm9kZSBiLCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpeworICAgICAgICByZXR1cm4gY29tcGFyZShhLCBiLCBpZ25vcmluZ0Fubm90YXRpb25zKSA8PSAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKE5vZGUgYSwgTm9kZSBiLCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgaWYgKGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGludCBzaWduTGluZSA9IHNpZ251bShiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihiKSk7CisgICAgICAgICAgICBpZiAoc2lnbkxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzaWdudW0oYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25MaW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHNpZ25MaW5lID0gc2lnbnVtKCBhLmdldEJlZ2luKCkubGluZSAtIGIuZ2V0QmVnaW4oKS5saW5lICk7CisgICAgICAgIGlmIChzaWduTGluZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2lnbnVtKGEuZ2V0QmVnaW4oKS5jb2x1bW4gLSBiLmdldEJlZ2luKCkuY29sdW1uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzaWduTGluZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkV4cHIgZ2V0TGFzdEFubm90YXRpb24oTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTm9kZVdpdGhBbm5vdGF0aW9ucyl7CisgICAgICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIGFubm90YXRpb25zLmFkZEFsbCgoKE5vZGVXaXRoQW5ub3RhdGlvbnM8Pz4pIG5vZGUpLmdldEFubm90YXRpb25zKCkpOworICAgICAgICAgICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkoKSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9ucy5nZXQoYW5ub3RhdGlvbnMuc2l6ZSgpLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKG5vZGUpLmdldEJlZ2luKCkubGluZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGludCBiZWdpbkNvbHVtbldpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBiZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhub2RlKS5nZXRCZWdpbigpLmNvbHVtbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGJlZ2luTm9kZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb25zKE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uIHx8IG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBOb2RlV2l0aEVsZW1lbnRUeXBlPD8+IGNhc3RlZCA9IChOb2RlV2l0aEVsZW1lbnRUeXBlPD8+KSBub2RlOworICAgICAgICAgICAgcmV0dXJuIGNhc3RlZC5nZXRFbGVtZW50VHlwZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjYXN0ZWQgPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBub2RlOworICAgICAgICAgICAgcmV0dXJuIGNhc3RlZC5nZXROYW1lRXhwcigpOworICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5vZGVDb250YWlucyhOb2RlIGNvbnRhaW5lciwgTm9kZSBjb250YWluZWQsIGJvb2xlYW4gaWdub3JpbmdBbm5vdGF0aW9ucyl7CisgICAgICAgIGlmICghaWdub3JpbmdBbm5vdGF0aW9ucyB8fCBQb3NpdGlvblV0aWxzLmdldExhc3RBbm5vdGF0aW9uKGNvbnRhaW5lcik9PW51bGwpeworICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jb250YWlucyhjb250YWluZWQpOworICAgICAgICB9CisgICAgICAgIGlmICghY29udGFpbmVyLmNvbnRhaW5zKGNvbnRhaW5lZCkpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHRoZSBub2RlIGlzIGNvbnRhaW5lZCwgYnV0IGl0IGNvbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBhbm5vdGF0aW9ucywKKyAgICAgICAgLy8gbGV0J3Mgbm90IGNvbnNpZGVyIGl0IGNvbnRhaW5lZAorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTm9kZVdpdGhBbm5vdGF0aW9ucyl7CisgICAgICAgICAgICBpbnQgYmwgPSBiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGNvbnRhaW5lcik7CisgICAgICAgICAgICBpbnQgYmMgPSBiZWdpbkNvbHVtbldpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oY29udGFpbmVyKTsKKyAgICAgICAgICAgIGlmIChibD5jb250YWluZWQuZ2V0QmVnaW4oKS5saW5lKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoYmw9PWNvbnRhaW5lZC5nZXRCZWdpbigpLmxpbmUgJiYgYmM+Y29udGFpbmVkLmdldEJlZ2luKCkuY29sdW1uKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldEVuZCgpLmxpbmU8Y29udGFpbmVkLmdldEVuZCgpLmxpbmUpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vIFRPRE8gPCBvciA8PSA/CisgICAgICAgICAgICByZXR1cm4gIShjb250YWluZXIuZ2V0RW5kKCkubGluZSA9PSBjb250YWluZWQuZ2V0RW5kKCkubGluZSAmJiBjb250YWluZXIuZ2V0RW5kKCkuY29sdW1uIDwgY29udGFpbmVkLmdldEVuZCgpLmNvbHVtbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVXRpbHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1jb3JlL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzIwODUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItY29yZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVXRpbHMuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBbnkga2luZCBvZiB1dGlsaXR5LgorICoKKyAqIEBhdXRob3IgRmVkZXJpY28gVG9tYXNzZXR0aQorICovCitwdWJsaWMgY2xhc3MgVXRpbHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKwlwdWJsaWMgc3RhdGljIDxUPiBMaXN0PFQ+IGVuc3VyZU5vdE51bGwoTGlzdDxUPiBsaXN0KSB7CisJCXJldHVybiBsaXN0ID09IG51bGwgPyBuZXcgQXJyYXlMaXN0PFQ+KCkgOiBsaXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gaXNOdWxsT3JFbXB0eShDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKKwkJcmV0dXJuIGNvbGxlY3Rpb24gPT0gbnVsbCB8fCBjb2xsZWN0aW9uLmlzRW1wdHkoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIDxUPiBUIGFzc2VydE5vdE51bGwoVCBvKSB7CisJCWlmIChvID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQXNzZXJ0aW9uIGZhaWxlZC4iKTsKKwkJfQorCQlyZXR1cm4gbzsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHN0cmluZyB3aXRoIEFTQ0lJIGNoYXJhY3RlcnMgMTAgYW5kIDEzIHJlcGxhY2VkIGJ5IHRoZSB0ZXh0ICJcbiIgYW5kICJcciIuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlRW5kT2ZMaW5lcyhTdHJpbmcgc3RyaW5nKSB7CisJCVN0cmluZ0J1aWxkZXIgZXNjYXBlZFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoY2hhciBjIDogc3RyaW5nLnRvQ2hhckFycmF5KCkpIHsKKwkJCXN3aXRjaCAoYykgeworCQkJCWNhc2UgJ1xuJzoKKwkJCQkJZXNjYXBlZFN0cmluZy5hcHBlbmQoIlxcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdccic6CisJCQkJCWVzY2FwZWRTdHJpbmcuYXBwZW5kKCJcXHIiKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZXNjYXBlZFN0cmluZy5hcHBlbmQoYyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVzY2FwZWRTdHJpbmcudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkZXJUb1N0cmluZyhSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZpbmFsIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcls4ICogMTAyNF07CisJCWludCBudW1DaGFyczsKKworCQl3aGlsZSAoKG51bUNoYXJzID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgPiAwKSB7CisJCQlyZXN1bHQuYXBwZW5kKGJ1ZmZlciwgMCwgbnVtQ2hhcnMpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3ZpZGVyVG9TdHJpbmcoUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZpbmFsIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZmluYWwgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzggKiAxMDI0XTsKKwkJaW50IG51bUNoYXJzOworCisJCXdoaWxlICgobnVtQ2hhcnMgPSBwcm92aWRlci5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpICE9IC0xKSB7CisJCQlyZXN1bHQuYXBwZW5kKGJ1ZmZlciwgMCwgbnVtQ2hhcnMpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIFB1dHMgdmFyYXJncyBpbiBhIG11dGFibGUgbGlzdC4KKyAgICAgKiBUaGlzIGRvZXMgbm90IGhhdmUgdGhlIGRpc2FkdmFudGFnZSBvZiBBcnJheXMjYXNMaXN0IHRoYXQgaXQgaGFzIGEgc3RhdGljIHNpemUuIAorCSAqLworCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gYXJyYXlUb0xpc3QoVFtdIGFycmF5KXsKKwkJTGlzdDxUPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworCQlDb2xsZWN0aW9ucy5hZGRBbGwobGlzdCwgYXJyYXkpOworCQlyZXR1cm4gbGlzdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWQ4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsOTMxOCBAQAorLyogQVNUUGFyc2VyLmphdmEgKi8KKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyc2VyLmphdmEgKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5BU1RQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLio7CisKKy8qKgorICogPHA+VGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgamF2YWNjLCBkbyBub3QgZWRpdC48L3A+CisgKi8KK2ZpbmFsIGNsYXNzIEFTVFBhcnNlciBpbXBsZW1lbnRzIEFTVFBhcnNlckNvbnN0YW50cyB7CisKKyAgICBwcml2YXRlIGZpbmFsIFBvc2l0aW9uIElOVkFMSUQgPSBwb3MoLTEsIDApOworICAgIExpc3Q8UHJvYmxlbT4gcHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0PFByb2JsZW0+KCk7CisKKyAgICB2b2lkIHJlc2V0KElucHV0U3RyZWFtIGluLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlSW5pdChuZXcgU3RyZWFtUHJvdmlkZXIoaW4sIGVuY29kaW5nKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gTGlzdDxUPiBhZGQoTGlzdDxUPiBsaXN0LCBUIG9iaikgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5hZGQob2JqKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gTGlzdDxUPiBhZGQoaW50IHBvcywgTGlzdDxUPiBsaXN0LCBUIG9iaikgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5hZGQocG9zLCBvYmopOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBNb2RpZmllckhvbGRlciB7CisgICAgICAgICAgICAgICAgZmluYWwgRW51bVNldDxNb2RpZmllcj4gbW9kaWZpZXJzOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworICAgICAgICAgICAgICAgIGZpbmFsIFBvc2l0aW9uIGJlZ2luOworCisgICAgICAgICAgICAgICAgcHVibGljIE1vZGlmaWVySG9sZGVyKFBvc2l0aW9uIGJlZ2luLCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luID0gYmVnaW47CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1vZGlmaWVyKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgTW9kaWZpZXIgbW9kKSB7CisgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMobW9kKSkgeworICAgICAgICAgICAgYWRkUHJvYmxlbSgiRHVwbGljYXRlZCBtb2RpZmllciIpOworICAgICAgICB9CisgICAgICAgIG1vZGlmaWVycy5hZGQobW9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRNdWx0aXBsZU1vZGlmaWVyKEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycywgRW51bVNldDxNb2RpZmllcj4gbW9kcykgeworICAgICAgICBpZihtb2RzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGZvcihNb2RpZmllciBtIDogbW9kcykKKyAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMobSkpCisgICAgICAgICAgICAgICAgYWRkUHJvYmxlbSgiRHVwbGljYXRlZCBtb2RpZmllciIpOworICAgICAgICBmb3IoTW9kaWZpZXIgbSA6IG1vZHMpCisgICAgICAgICAgICBtb2RpZmllcnMuYWRkKG0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiB0b2tlbnMgdGhhdCBoYXZlIGJlZW4gZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyBjb2RlIHVzaW5nCisgICAgICogdGhpcyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0b2tlbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUb2tlbj4gZ2V0VG9rZW5zKCkgeworICAgICAgICByZXR1cm4gdG9rZW5fc291cmNlLmdldFRva2VucygpOworICAgIH0KKworICAgIHB1YmxpYyBDb21tZW50c0NvbGxlY3Rpb24gZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdG9rZW5fc291cmNlLmdldENvbW1lbnRzQ29sbGVjdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRQcm9ibGVtKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHByb2JsZW1zLmFkZChuZXcgUHJvYmxlbShtZXNzYWdlICsgIjogXCIiICsgdG9rZW4uaW1hZ2UsIE9wdGlvbmFsLm9mKHRva2VuUmFuZ2UoKSksIE9wdGlvbmFsLmVtcHR5KCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZ2VuZXJhdGVMYW1iZGEoRXhwcmVzc2lvbiByZXQsIFN0YXRlbWVudCBsYW1iZGFCb2R5KSB7CisgICAgICAgICAgICBpZiAocmV0IGluc3RhbmNlb2YgRW5jbG9zZWRFeHByKSB7CisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBpbm5lciA9ICgoRW5jbG9zZWRFeHByKSByZXQpLmdldElubmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGlubmVyICE9IG51bGwgJiYgaW5uZXIgaW5zdGFuY2VvZiBOYW1lRXhwcikgeworICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChpbm5lci5nZXRSYW5nZSgpLCAoKE5hbWVFeHByKWlubmVyKS5nZXROYW1lKCksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcGFyYW1zID0gYWRkKG51bGwsIG5ldyBQYXJhbWV0ZXIocmV0LmdldFJhbmdlKCksIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbnVsbCwgbmV3IFVua25vd25UeXBlKCksIG51bGwsIGZhbHNlLCBpZCkpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgTGFtYmRhRXhwcihyYW5nZShyZXQuZ2V0QmVnaW4oKSwgbGFtYmRhQm9keS5nZXRFbmQoKSksIHBhcmFtcywgbGFtYmRhQm9keSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IExhbWJkYUV4cHIocmFuZ2UocmV0LmdldEJlZ2luKCksIGxhbWJkYUJvZHkuZ2V0RW5kKCkpLCBudWxsLCBsYW1iZGFCb2R5LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCBpbnN0YW5jZW9mIE5hbWVFeHByKSB7CisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKHJldC5nZXRSYW5nZSgpLCAoKE5hbWVFeHByKXJldCkuZ2V0TmFtZSgpLCBudWxsKTsKKyAgICAgICAgICAgICAgICBMaXN0PFBhcmFtZXRlcj4gcGFyYW1zID0gYWRkKG51bGwsIG5ldyBQYXJhbWV0ZXIocmV0LmdldFJhbmdlKCksIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbnVsbCwgbmV3IFVua25vd25UeXBlKCksIG51bGwsIGZhbHNlLCBpZCkpOworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBMYW1iZGFFeHByKHJldC5nZXRSYW5nZSgpLCBwYXJhbXMsIGxhbWJkYUJvZHksIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTGFtYmRhRXhwcikgeworICAgICAgICAgICAgICAgICgoTGFtYmRhRXhwcikgcmV0KS5zZXRCb2R5KGxhbWJkYUJvZHkpOworICAgICAgICAgICAgICAgIHJldC5zZXRFbmQobGFtYmRhQm9keS5nZXRFbmQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgQ2FzdEV4cHIpIHsKKyAgICAgICAgICAgIENhc3RFeHByIGNhc3RFeHByID0gKENhc3RFeHByKXJldDsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gaW5uZXIgPSBnZW5lcmF0ZUxhbWJkYShjYXN0RXhwci5nZXRFeHByKCksIGxhbWJkYUJvZHkpOworICAgICAgICAgICAgY2FzdEV4cHIuc2V0RXhwcihpbm5lcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZFByb2JsZW0oIkZhaWxlZCB0byBwYXJzZSBsYW1iZGEgZXhwcmVzc2lvbiEgUGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3VlcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcml2YXRlIEFycmF5Q3JlYXRpb25FeHByIGp1Z2dsZUFycmF5Q3JlYXRpb24oUmFuZ2UgcmFuZ2UsIFR5cGUgdHlwZSwgTGlzdDxFeHByZXNzaW9uPiBkaW1lbnNpb25zLCBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBhcnJheUFubm90YXRpb25zLCBBcnJheUluaXRpYWxpemVyRXhwciBhcnJheUluaXRpYWxpemVyRXhwcikgeworICAgICAgICBMaXN0PEFycmF5Q3JlYXRpb25MZXZlbD4gbGV2ZWxzID0gbmV3IEFycmF5TGlzdDxBcnJheUNyZWF0aW9uTGV2ZWw+KCk7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGFycmF5QW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspeworICAgICAgICAgICAgbGV2ZWxzLmFkZChuZXcgQXJyYXlDcmVhdGlvbkxldmVsKHJhbmdlLCBkaW1lbnNpb25zLmdldChpKSwgYXJyYXlBbm5vdGF0aW9ucy5nZXQoaSkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEFycmF5Q3JlYXRpb25FeHByKHJhbmdlLCB0eXBlLCBsZXZlbHMsIGFycmF5SW5pdGlhbGl6ZXJFeHByKTsKKyAgICB9CisKKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBHVFRva2VuIGV4dGVuZHMgVG9rZW4geworICAgICAgICBpbnQgcmVhbEtpbmQgPSBBU1RQYXJzZXJDb25zdGFudHMuR1Q7CisKKyAgICAgICAgR1RUb2tlbihpbnQga2luZCwgU3RyaW5nIGltYWdlKSB7CisgICAgICAgICAgICB0aGlzLmtpbmQgPSBraW5kOworICAgICAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdUb2tlbihpbnQga2luZCwgU3RyaW5nIGltYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdUVG9rZW4oa2luZCwgaW1hZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmFuZ2VkTGlzdDxUPiB7CisgICAgICAgIFJhbmdlIHJhbmdlID0gUmFuZ2UuVU5LTk9XTjsKKyAgICAgICAgTGlzdDxUPiBsaXN0OworICAgICAgICBSYW5nZWRMaXN0KExpc3Q8VD4gbGlzdCkgeworICAgICAgICAgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGJlZ2luQXQoUG9zaXRpb24gYmVnaW4pIHsKKyAgICAgICAgICAgIHJhbmdlPXJhbmdlLndpdGhCZWdpbihiZWdpbik7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlbmRBdChQb3NpdGlvbiBlbmQpIHsKKyAgICAgICAgICAgIHJhbmdlPXJhbmdlLndpdGhFbmQoZW5kKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGFkZChUIHQpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuYWRkKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQb3NpdGlvbiB0b2tlbkJlZ2luKCkgeworICAgICAgICByZXR1cm4gcG9zKHRva2VuLmJlZ2luTGluZSx0b2tlbi5iZWdpbkNvbHVtbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBQb3NpdGlvbiB0b2tlbkVuZCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcyh0b2tlbi5lbmRMaW5lLHRva2VuLmVuZENvbHVtbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBSYW5nZSB0b2tlblJhbmdlKCkgeworICAgICAgICByZXR1cm4gdG9rZW5SYW5nZSh0b2tlbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYW5nZSB0b2tlblJhbmdlKFRva2VuIHRva2VuKSB7CisgICAgICAgIHJldHVybiByYW5nZSh0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pOworICAgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUSEUgSkFWQSBMQU5HVUFHRSBHUkFNTUFSIFNUQVJUUyBIRVJFICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFByb2dyYW0gc3RydWN0dXJpbmcgc3ludGF4IGZvbGxvd3MuCisgKi8KKyAgZmluYWwgcHVibGljIAorQ29tcGlsYXRpb25Vbml0IENvbXBpbGF0aW9uVW5pdCgpIHtQYWNrYWdlRGVjbGFyYXRpb24gcGFrYWdlID0gbnVsbDsKKyAgICAgICAgTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IG51bGw7CisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGluID0gbnVsbDsKKyAgICAgICAgTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVzID0gbnVsbDsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uIHRuID0gbnVsbDsKKyAgICAgICAgUG9zaXRpb24gYmVnaW4gPSBJTlZBTElEOworICAgIGlmIChqal8yXzEoMjE0NzQ4MzY0NykpIHsKKyAgICAgIHBha2FnZSA9IFBhY2thZ2VEZWNsYXJhdGlvbigpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZChwYWthZ2UuZ2V0QmVnaW4oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgbGFiZWxfMToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgSU1QT1JUOgorICAgICAgY2FzZSBTRU1JQ09MT046eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE7CisgICAgICB9CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBJTVBPUlQ6eworICAgICAgICBpbiA9IEltcG9ydERlY2xhcmF0aW9uKCk7CitiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKGluLmdldEJlZ2luKCkpOyBpbXBvcnRzID0gYWRkKGltcG9ydHMsIGluKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgU0VNSUNPTE9OOnsKKyAgICAgICAgaW4gPSBFbXB0eUltcG9ydERlY2xhcmF0aW9uKCk7CitiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKGluLmdldEJlZ2luKCkpOyBpbXBvcnRzID0gYWRkKGltcG9ydHMsIGluKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0KKyAgICBsYWJlbF8yOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgIGNhc2UgQ0xBU1M6CisgICAgICBjYXNlIEVOVU06CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgICBjYXNlIE5BVElWRToKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgIGNhc2UgU1RSSUNURlA6CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgY2FzZSBWT0xBVElMRToKKyAgICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgY2FzZSBBVDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsyXSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMjsKKyAgICAgIH0KKyAgICAgIHRuID0gVHlwZURlY2xhcmF0aW9uKCk7CitiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKHRuLmdldEJlZ2luKCkpOyB0eXBlcyA9IGFkZCh0eXBlcywgdG4pOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgMDp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKDApOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxNTY6eworICAgICAgampfY29uc3VtZV90b2tlbigxNTYpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVszXSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQoYmVnaW4uaW52YWxpZCgpID8gUmFuZ2UuVU5LTk9XTiA6IHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgcGFrYWdlLCBpbXBvcnRzLCB0eXBlcyk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24gRW1wdHlJbXBvcnREZWNsYXJhdGlvbigpIHtQb3NpdGlvbiBiZWdpbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CitiZWdpbiA9IHRva2VuQmVnaW4oKTsKK3JldHVybiBJbXBvcnREZWNsYXJhdGlvbi5jcmVhdGVFbXB0eURlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIFBhY2thZ2VEZWNsYXJhdGlvbigpIHtMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFBBQ0tBR0UpOworYmVnaW4gPSB0b2tlbkJlZ2luKCk7CisgICAgbmFtZSA9IE5hbWUoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXR1cm4gbmV3IFBhY2thZ2VEZWNsYXJhdGlvbihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIGFubm90YXRpb25zLCBuYW1lKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbiBJbXBvcnREZWNsYXJhdGlvbigpIHtOYW1lRXhwciBuYW1lOworICAgICAgICBib29sZWFuIGlzU3RhdGljID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gaXNBc3RlcmlzayA9IGZhbHNlOworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKElNUE9SVCk7CitiZWdpbiA9IHRva2VuQmVnaW4oKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgU1RBVElDOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RBVElDKTsKK2lzU3RhdGljID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIG5hbWUgPSBOYW1lKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIERPVDp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVIpOworaXNBc3RlcmlzayA9IHRydWU7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzVdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXR1cm4gbmV3IEltcG9ydERlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxuYW1lLCBpc1N0YXRpYywgaXNBc3Rlcmlzayk7CisgIH0KKworLyoKKyAqIE1vZGlmaWVycy4gV2UgbWF0Y2ggYWxsIG1vZGlmaWVycyBpbiBhIHNpbmdsZSBydWxlIHRvIHJlZHVjZSB0aGUgY2hhbmNlcyBvZgorICogc3ludGF4IGVycm9ycyBmb3Igc2ltcGxlIG1vZGlmaWVyIG1pc3Rha2VzLiBJdCB3aWxsIGFsc28gZW5hYmxlIHVzIHRvIGdpdmUKKyAqIGJldHRlciBlcnJvciBtZXNzYWdlcy4KKyAqLworICBmaW5hbCBwdWJsaWMgCitNb2RpZmllckhvbGRlciBNb2RpZmllcnMoKSB7UG9zaXRpb24gYmVnaW4gPSBJTlZBTElEOworICAgIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKTsKKyAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgQW5ub3RhdGlvbkV4cHIgYW5uOworICAgIGxhYmVsXzM6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzIoMikpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFBVQkxJQzp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFVCTElDKTsKK2FkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXIuUFVCTElDKTsgYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBTVEFUSUM6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVRJQyk7CithZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLlNUQVRJQyk7IGJlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodG9rZW5CZWdpbigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgUFJPVEVDVEVEOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihQUk9URUNURUQpOworYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5QUk9URUNURUQpOyBiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKHRva2VuQmVnaW4oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFBSSVZBVEU6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBSSVZBVEUpOworYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5QUklWQVRFKTsgYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBGSU5BTDp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRklOQUwpOworYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5GSU5BTCk7IGJlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodG9rZW5CZWdpbigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgQUJTVFJBQ1Q6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFCU1RSQUNUKTsKK2FkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXIuQUJTVFJBQ1QpOyBiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKHRva2VuQmVnaW4oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1lOQ0hST05JWkVEKTsKK2FkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXIuU1lOQ0hST05JWkVEKTsgYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBOQVRJVkU6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5BVElWRSk7CithZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLk5BVElWRSk7IGJlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodG9rZW5CZWdpbigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgVFJBTlNJRU5UOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihUUkFOU0lFTlQpOworYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5UUkFOU0lFTlQpOyBiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKHRva2VuQmVnaW4oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFZPTEFUSUxFOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihWT0xBVElMRSk7CithZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyLlZPTEFUSUxFKTsgYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBTVFJJQ1RGUDp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RSSUNURlApOworYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllci5TVFJJQ1RGUCk7ICBiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKHRva2VuQmVnaW4oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIEFUOnsKKyAgICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubik7IGJlZ2luID0gYmVnaW4ub3JJZkludmFsaWQoYW5uLmdldEJlZ2luKCkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzZdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorcmV0dXJuIG5ldyBNb2RpZmllckhvbGRlcihiZWdpbiwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucyk7CisgIH0KKworLyoKKyAqIERlY2xhcmF0aW9uIHN5bnRheCBmb2xsb3dzLgorICovCisgIGZpbmFsIHB1YmxpYyBUeXBlRGVjbGFyYXRpb24gVHlwZURlY2xhcmF0aW9uKCkge01vZGlmaWVySG9sZGVyIG1vZGlmaWVyOworICAgVHlwZURlY2xhcmF0aW9uIHJldDsKKworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBTRU1JQ09MT046eworICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworcmV0ID0gbmV3IEVtcHR5VHlwZURlY2xhcmF0aW9uKHRva2VuUmFuZ2UoKSk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEFCU1RSQUNUOgorICAgIGNhc2UgQ0xBU1M6CisgICAgY2FzZSBFTlVNOgorICAgIGNhc2UgRklOQUw6CisgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgY2FzZSBOQVRJVkU6CisgICAgY2FzZSBQUklWQVRFOgorICAgIGNhc2UgUFJPVEVDVEVEOgorICAgIGNhc2UgUFVCTElDOgorICAgIGNhc2UgU1RBVElDOgorICAgIGNhc2UgU1RSSUNURlA6CisgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgY2FzZSBWT0xBVElMRToKKyAgICBjYXNlIEFUOnsKKyAgICAgIG1vZGlmaWVyID0gTW9kaWZpZXJzKCk7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDTEFTUzoKKyAgICAgIGNhc2UgSU5URVJGQUNFOnsKKyAgICAgICAgcmV0ID0gQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgRU5VTTp7CisgICAgICAgIHJldCA9IEVudW1EZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIEFUOnsKKyAgICAgICAgcmV0ID0gQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbN10gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbOF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihNb2RpZmllckhvbGRlciBtb2RpZmllcikge2Jvb2xlYW4gaXNJbnRlcmZhY2UgPSBmYWxzZTsKKyAgICBOYW1lRXhwciBuYW1lOworICAgIFJhbmdlZExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhciA9IG5ldyBSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+KG51bGwpOworICAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dExpc3QgPSBudWxsOworICAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcExpc3QgPSBudWxsOworICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzOworICAgIFBvc2l0aW9uIGJlZ2luID0gbW9kaWZpZXIuYmVnaW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIENMQVNTOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0xBU1MpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBJTlRFUkZBQ0U6eworICAgICAgampfY29uc3VtZV90b2tlbihJTlRFUkZBQ0UpOworaXNJbnRlcmZhY2UgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs5XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgIG5hbWUgPSBOYW1lKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIExUOnsKKyAgICAgIHR5cGVQYXIgPSBUeXBlUGFyYW1ldGVycygpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBFWFRFTkRTOnsKKyAgICAgIGV4dExpc3QgPSBFeHRlbmRzTGlzdChpc0ludGVyZmFjZSk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzExXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIElNUExFTUVOVFM6eworICAgICAgaW1wTGlzdCA9IEltcGxlbWVudHNMaXN0KGlzSW50ZXJmYWNlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTJdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBtZW1iZXJzID0gQ2xhc3NPckludGVyZmFjZUJvZHkoaXNJbnRlcmZhY2UpOworQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHRtcCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCBpc0ludGVyZmFjZSwgbnVsbCwgdHlwZVBhci5saXN0LCBleHRMaXN0LCBpbXBMaXN0LCBtZW1iZXJzKTsKKyAgICB0bXAuc2V0TmFtZUV4cHIobmFtZSk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBFeHRlbmRzTGlzdChib29sZWFuIGlzSW50ZXJmYWNlKSB7Ym9vbGVhbiBleHRlbmRzTW9yZVRoYW5PbmUgPSBmYWxzZTsKKyAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHJldCA9IG5ldyBMaW5rZWRMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPigpOworICAgQ2xhc3NPckludGVyZmFjZVR5cGUgY2l0OworICAgIGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EUyk7CisgICAgY2l0ID0gQW5ub3RhdGVkQ2xhc3NPckludGVyZmFjZVR5cGUoKTsKK3JldC5hZGQoY2l0KTsKKyAgICBsYWJlbF80OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxM10gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzQ7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGNpdCA9IEFubm90YXRlZENsYXNzT3JJbnRlcmZhY2VUeXBlKCk7CityZXQuYWRkKGNpdCk7IGV4dGVuZHNNb3JlVGhhbk9uZSA9IHRydWU7CisgICAgfQoraWYgKGV4dGVuZHNNb3JlVGhhbk9uZSAmJiAhaXNJbnRlcmZhY2UpCisgICAgICAgICBhZGRQcm9ibGVtKCJBIGNsYXNzIGNhbm5vdCBleHRlbmQgbW9yZSB0aGFuIG9uZSBvdGhlciBjbGFzcyIpOworcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBJbXBsZW1lbnRzTGlzdChib29sZWFuIGlzSW50ZXJmYWNlKSB7TGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gcmV0ID0gbmV3IExpbmtlZExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+KCk7CisgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBjaXQ7CisgICAgampfY29uc3VtZV90b2tlbihJTVBMRU1FTlRTKTsKKyAgICBjaXQgPSBBbm5vdGF0ZWRDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworcmV0LmFkZChjaXQpOworICAgIGxhYmVsXzU6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzE0XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfNTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgY2l0ID0gQW5ub3RhdGVkQ2xhc3NPckludGVyZmFjZVR5cGUoKTsKK3JldC5hZGQoY2l0KTsKKyAgICB9CitpZiAoaXNJbnRlcmZhY2UpCisgICAgICAgICBhZGRQcm9ibGVtKCJBbiBpbnRlcmZhY2UgY2Fubm90IGltcGxlbWVudCBvdGhlciBpbnRlcmZhY2VzIik7CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEVudW1EZWNsYXJhdGlvbiBFbnVtRGVjbGFyYXRpb24oTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXIpIHtOYW1lRXhwciBuYW1lOworICAgICAgICBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBMaXN0ID0gbnVsbDsKKyAgICAgICAgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW50cnk7CisgICAgICAgIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXMgPSBudWxsOworICAgICAgICBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyOworICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycyA9IG51bGw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luID0gbW9kaWZpZXIuYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihFTlVNKTsKK2JlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodG9rZW5CZWdpbigpKTsKKyAgICBuYW1lID0gTmFtZSgpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBJTVBMRU1FTlRTOnsKKyAgICAgIGltcExpc3QgPSBJbXBsZW1lbnRzTGlzdChmYWxzZSk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgQVQ6eworZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPigpOworICAgICAgZW50cnkgPSBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpOworZW50cmllcy5hZGQoZW50cnkpOworICAgICAgbGFiZWxfNjoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChqal8yXzMoMikpIHsKKyAgICAgICAgICA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWsgbGFiZWxfNjsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgICAgZW50cnkgPSBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpOworZW50cmllcy5hZGQoZW50cnkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNl0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBDT01NQTp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTddID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgU0VNSUNPTE9OOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICAgIGxhYmVsXzc6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIEFCU1RSQUNUOgorICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICBjYXNlIENMQVNTOgorICAgICAgICBjYXNlIF9ERUZBVUxUOgorICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgY2FzZSBFTlVNOgorICAgICAgICBjYXNlIEZJTkFMOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgY2FzZSBOQVRJVkU6CisgICAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICAgIGNhc2UgUFVCTElDOgorICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgY2FzZSBTVFJJQ1RGUDoKKyAgICAgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgIGNhc2UgVk9MQVRJTEU6CisgICAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgY2FzZSBMQlJBQ0U6CisgICAgICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgICBjYXNlIEFUOgorICAgICAgICBjYXNlIExUOnsKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxOF0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfNzsKKyAgICAgICAgfQorICAgICAgICBtZW1iZXIgPSBDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGZhbHNlKTsKK21lbWJlcnMgPSBhZGQobWVtYmVycywgbWVtYmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTldID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CitFbnVtRGVjbGFyYXRpb24gdG1wID0gbmV3IEVudW1EZWNsYXJhdGlvbihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIG51bGwsIGltcExpc3QsIGVudHJpZXMsIG1lbWJlcnMpOworICAgICAgdG1wLnNldE5hbWVFeHByKG5hbWUpOworICAgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpIHtMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG51bGw7CisgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBjbGFzc0JvZHkgPSBudWxsOworICAgICAgICBQb3NpdGlvbiBiZWdpbiA9IElOVkFMSUQ7CisKKyAgICBsYWJlbF84OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBBVDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsyMF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzg7CisgICAgICB9CisgICAgICBhbm4gPSBBbm5vdGF0aW9uKCk7Cithbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsgYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZChhbm4uZ2V0QmVnaW4oKSk7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CituYW1lID0gdG9rZW4uaW1hZ2U7IGJlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodG9rZW5CZWdpbigpKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgTFBBUkVOOnsKKyAgICAgIGFyZ3MgPSBBcmd1bWVudHMoKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMjFdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgTEJSQUNFOnsKKyAgICAgIGNsYXNzQm9keSA9IENsYXNzT3JJbnRlcmZhY2VCb2R5KGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMjJdID0gampfZ2VuOworICAgICAgOworICAgIH0KK3JldHVybiBuZXcgRW51bUNvbnN0YW50RGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCBhbm5vdGF0aW9ucywgbmFtZSwgYXJncywgY2xhc3NCb2R5KTsKKyAgfQorCisvKioKKyAqIElmIHRoZSBsaXN0IGluc2lkZSB0aGUgcmV0dXJuZWQgUmFuZ2VkTGlzdCBpcyBudWxsLCB0aGVyZSBhcmUgbm8gYnJhY2tldHMuCisgKiBJZiBpdCBpcyBlbXB0eSwgdGhlcmUgYXJlIGJyYWNrZXRzLCBidXQgbm90aGluZyBpcyBpbiB0aGVtIDw+LgorICogVGhlIG5vcm1hbCBjYXNlIGlzIHRoYXQgaXQgY29udGFpbnMgVHlwZVBhcmFtZXRlcnMsIGxpa2UgPEEsIEIsIEM+LgorICovCisgIGZpbmFsIHB1YmxpYyBSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+IFR5cGVQYXJhbWV0ZXJzKCkge1JhbmdlZExpc3Q8VHlwZVBhcmFtZXRlcj4gcmV0ID0gbmV3IFJhbmdlZExpc3Q8VHlwZVBhcmFtZXRlcj4obmV3IExpbmtlZExpc3Q8VHlwZVBhcmFtZXRlcj4oKSk7CisgICAgICAgIFR5cGVQYXJhbWV0ZXIgdHA7CisgICAgICAgIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbnVsbDsKKyAgICBqal9jb25zdW1lX3Rva2VuKExUKTsKK3JldC5iZWdpbkF0KHRva2VuQmVnaW4oKSk7CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgIHRwID0gVHlwZVBhcmFtZXRlcigpOworcmV0LmFkZCh0cCk7IHRwLnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsgYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGxhYmVsXzk6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzIzXSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfOTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgICAgdHAgPSBUeXBlUGFyYW1ldGVyKCk7CityZXQuYWRkKHRwKTsgdHAuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOyBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworcmV0LmVuZEF0KHRva2VuRW5kKCkpOworcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlUGFyYW1ldGVyIFR5cGVQYXJhbWV0ZXIoKSB7U3RyaW5nIG5hbWU7CisgICAgICAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCA9IG51bGw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CituYW1lID0gdG9rZW4uaW1hZ2U7IGJlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgRVhURU5EUzp7CisgICAgICB0eXBlQm91bmQgPSBUeXBlQm91bmQoKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMjRdID0gampfZ2VuOworICAgICAgOworICAgIH0KK3JldHVybiBuZXcgVHlwZVBhcmFtZXRlcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksbmFtZSwgdHlwZUJvdW5kKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBUeXBlQm91bmQoKSB7TGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gcmV0ID0gbmV3IExpbmtlZExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+KCk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIGNpdDsKKyAgICBqal9jb25zdW1lX3Rva2VuKEVYVEVORFMpOworICAgIGNpdCA9IEFubm90YXRlZENsYXNzT3JJbnRlcmZhY2VUeXBlKCk7CityZXQuYWRkKGNpdCk7CisgICAgbGFiZWxfMTA6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEJJVF9BTkQ6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMjVdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8xMDsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX0FORCk7CisgICAgICBjaXQgPSBBbm5vdGF0ZWRDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworcmV0LmFkZChjaXQpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IENsYXNzT3JJbnRlcmZhY2VCb2R5KGJvb2xlYW4gaXNJbnRlcmZhY2UpIHtMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gcmV0ID0gbmV3IExpbmtlZExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PigpOworICAgICAgICBCb2R5RGVjbGFyYXRpb24gbWVtYmVyOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKKyAgICBsYWJlbF8xMToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIENMQVNTOgorICAgICAgY2FzZSBfREVGQVVMVDoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBFTlVNOgorICAgICAgY2FzZSBGSU5BTDoKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIFBSSVZBVEU6CisgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgIGNhc2UgUFVCTElDOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1RBVElDOgorICAgICAgY2FzZSBTVFJJQ1RGUDoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMQlJBQ0U6CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgIGNhc2UgQVQ6CisgICAgICBjYXNlIExUOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzI2XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTE7CisgICAgICB9CisgICAgICBtZW1iZXIgPSBDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGlzSW50ZXJmYWNlKTsKK3JldC5hZGQobWVtYmVyKTsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOworcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBCb2R5RGVjbGFyYXRpb248Pz4gQ2xhc3NPckludGVyZmFjZUJvZHlEZWNsYXJhdGlvbihib29sZWFuIGlzSW50ZXJmYWNlKSB7TW9kaWZpZXJIb2xkZXIgbW9kaWZpZXI7CisgICBNb2RpZmllckhvbGRlciBtb2RpZmllcjIgPSBudWxsOworICAgRW51bVNldDxNb2RpZmllcj4gYXV4ID0gbnVsbDsKKyAgIEJvZHlEZWNsYXJhdGlvbjw/PiByZXQ7CisgICBib29sZWFuIGlzRGVmYXVsdCA9IGZhbHNlOworCisgICAgaWYgKGpqXzJfNigyKSkgeworICAgICAgcmV0ID0gSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbigpOworaWYgKGlzSW50ZXJmYWNlKQorICAgICAgICAgICAgICAgIGFkZFByb2JsZW0oIkFuIGludGVyZmFjZSBjYW5ub3QgaGF2ZSBpbml0aWFsaXplcnMiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIENMQVNTOgorICAgICAgY2FzZSBfREVGQVVMVDoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBFTlVNOgorICAgICAgY2FzZSBGSU5BTDoKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIFBSSVZBVEU6CisgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgIGNhc2UgUFVCTElDOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1RBVElDOgorICAgICAgY2FzZSBTVFJJQ1RGUDoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBBVDoKKyAgICAgIGNhc2UgTFQ6eworICAgICAgICBtb2RpZmllciA9IE1vZGlmaWVycygpOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIF9ERUZBVUxUOnsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKF9ERUZBVUxUKTsKKyAgICAgICAgICBtb2RpZmllcjIgPSBNb2RpZmllcnMoKTsKK2lmKCFpc0ludGVyZmFjZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWRkUHJvYmxlbSgiQSBjbGFzcyBjYW5ub3QgaGF2ZSBkZWZhdWx0IG1lbWJlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzRGVmYXVsdCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsyN10gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQ0xBU1M6CisgICAgICAgIGNhc2UgSU5URVJGQUNFOnsKKyAgICAgICAgICByZXQgPSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBFTlVNOnsKKyAgICAgICAgICByZXQgPSBFbnVtRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVDp7CisgICAgICAgICAgcmV0ID0gQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsyOF0gPSBqal9nZW47CisgICAgICAgICAgaWYgKGpqXzJfNCgyMTQ3NDgzNjQ3KSkgeworICAgICAgICAgICAgcmV0ID0gQ29uc3RydWN0b3JEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgfSBlbHNlIGlmIChqal8yXzUoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgICAgIHJldCA9IEZpZWxkRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICBjYXNlIExPTkc6CisgICAgICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgICAgICAgY2FzZSBMVDp7CisgICAgICAgICAgICAgIHJldCA9IE1ldGhvZERlY2xhcmF0aW9uKG1vZGlmaWVyKTsKK2lmKGlzRGVmYXVsdCAmJiByZXQhPSBudWxsICYmICgoTWV0aG9kRGVjbGFyYXRpb24pcmV0KS5nZXRCb2R5KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBhZGRQcm9ibGVtKCJcImRlZmF1bHRcIiBtZXRob2RzIG11c3QgaGF2ZSBhIGJvZHkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChNZXRob2REZWNsYXJhdGlvbilyZXQpLnNldERlZmF1bHQoaXNEZWZhdWx0KTsKKyAgICAgICAgICAgICAgICBpZihtb2RpZmllcjIhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGF1eCA9IG1vZGlmaWVyMi5tb2RpZmllcnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZE11bHRpcGxlTW9kaWZpZXIobW9kaWZpZXIubW9kaWZpZXJzLCBhdXgpOworICAgICAgICAgICAgICAgICgoTWV0aG9kRGVjbGFyYXRpb24pcmV0KS5zZXRNb2RpZmllcnMobW9kaWZpZXIubW9kaWZpZXJzKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGpqX2xhMVsyOV0gPSBqal9nZW47CisgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KK2lmKGlzRGVmYXVsdCAmJiAhIChyZXQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFkZFByb2JsZW0oIk9ubHkgbWV0aG9kcyBjYW4gaGF2ZSB0aGUga2V5d29yZCBcImRlZmF1bHRcIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgU0VNSUNPTE9OOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworcmV0ID0gbmV3IEVtcHR5TWVtYmVyRGVjbGFyYXRpb24odG9rZW5SYW5nZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVszMF0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEZpZWxkRGVjbGFyYXRpb24gRmllbGREZWNsYXJhdGlvbihNb2RpZmllckhvbGRlciBtb2RpZmllcikge1R5cGUgdHlwZTsKKyAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IG5ldyBMaW5rZWRMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4oKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhbDsKKyAgICAvLyBNb2RpZmllcnMgYXJlIGFscmVhZHkgbWF0Y2hlZCBpbiB0aGUgY2FsbGVyCisgICAgICB0eXBlID0gVHlwZSgpOworICAgIHZhbCA9IFZhcmlhYmxlRGVjbGFyYXRvcigpOwordmFyaWFibGVzLmFkZCh2YWwpOworICAgIGxhYmVsXzEyOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVszMV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzEyOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICB2YWwgPSBWYXJpYWJsZURlY2xhcmF0b3IoKTsKK3ZhcmlhYmxlcy5hZGQodmFsKTsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworUG9zaXRpb24gYmVnaW4gPSBtb2RpZmllci5iZWdpbi5vcklmSW52YWxpZCh0eXBlLmdldEJlZ2luKCkpOworICAgICAgICBQYWlyPFR5cGUsIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4+IHR5cGVMaXN0UGFpciA9IHVud3JhcEFycmF5VHlwZXModHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgRmllbGREZWNsYXJhdGlvbihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIHR5cGVMaXN0UGFpci5hLCB2YXJpYWJsZXMsIHR5cGVMaXN0UGFpci5iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3IgVmFyaWFibGVEZWNsYXJhdG9yKCkge1ZhcmlhYmxlRGVjbGFyYXRvcklkIGlkOworICAgICAgICBFeHByZXNzaW9uIGluaXQgPSBudWxsOworICAgIGlkID0gVmFyaWFibGVEZWNsYXJhdG9ySWQoKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQVNTSUdOOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKKyAgICAgIGluaXQgPSBWYXJpYWJsZUluaXRpYWxpemVyKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzMyXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CityZXR1cm4gbmV3ICBWYXJpYWJsZURlY2xhcmF0b3IocmFuZ2UoaWQuZ2V0QmVnaW4oKSwgdG9rZW5FbmQoKSksIGlkLCBpbml0KTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZCBWYXJpYWJsZURlY2xhcmF0b3JJZCgpIHtTdHJpbmcgbmFtZTsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgICAgIEFycmF5QnJhY2tldFBhaXIgYXJyYXlCcmFja2V0UGFpcjsKKyAgICAgICAgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlycyA9IG51bGw7CisgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKK25hbWUgPSB0b2tlbi5pbWFnZTsgYmVnaW49dG9rZW5CZWdpbigpOworICAgIGxhYmVsXzEzOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgIGNhc2UgQVQ6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMzNdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8xMzsKKyAgICAgIH0KKyAgICAgIGFycmF5QnJhY2tldFBhaXIgPSBBcnJheUJyYWNrZXRQYWlyKCk7CithcnJheUJyYWNrZXRQYWlycz1hZGQoYXJyYXlCcmFja2V0UGFpcnMsIGFycmF5QnJhY2tldFBhaXIpOworICAgIH0KK3JldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLG5hbWUsIGFycmF5QnJhY2tldFBhaXJzKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFZhcmlhYmxlSW5pdGlhbGl6ZXIoKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIExCUkFDRTp7CisgICAgICByZXQgPSBBcnJheUluaXRpYWxpemVyKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZBTFNFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkVXOgorICAgIGNhc2UgTlVMTDoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1VQRVI6CisgICAgY2FzZSBUSElTOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIFZPSUQ6CisgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBMUEFSRU46CisgICAgY2FzZSBCQU5HOgorICAgIGNhc2UgVElMREU6CisgICAgY2FzZSBJTkNSOgorICAgIGNhc2UgREVDUjoKKyAgICBjYXNlIFBMVVM6CisgICAgY2FzZSBNSU5VUzp7CisgICAgICByZXQgPSBFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzM0XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwciBBcnJheUluaXRpYWxpemVyKCkge0xpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzID0gbnVsbDsKKyAgICAgICAgRXhwcmVzc2lvbiB2YWw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBORVc6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBTVVBFUjoKKyAgICBjYXNlIFRISVM6CisgICAgY2FzZSBUUlVFOgorICAgIGNhc2UgVk9JRDoKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIExQQVJFTjoKKyAgICBjYXNlIExCUkFDRToKKyAgICBjYXNlIEJBTkc6CisgICAgY2FzZSBUSUxERToKKyAgICBjYXNlIElOQ1I6CisgICAgY2FzZSBERUNSOgorICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOnsKKyAgICAgIHZhbCA9IFZhcmlhYmxlSW5pdGlhbGl6ZXIoKTsKK3ZhbHVlcyA9IGFkZCh2YWx1ZXMsIHZhbCk7CisgICAgICBsYWJlbF8xNDoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChqal8yXzcoMikpIHsKKyAgICAgICAgICA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTQ7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICAgIHZhbCA9IFZhcmlhYmxlSW5pdGlhbGl6ZXIoKTsKK3ZhbHVlcyA9IGFkZCh2YWx1ZXMsIHZhbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzM1XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIENPTU1BOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVszNl0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKK3JldHVybiBuZXcgQXJyYXlJbml0aWFsaXplckV4cHIocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCB2YWx1ZXMpOworICB9CisKKyAgZmluYWwgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIE1ldGhvZERlY2xhcmF0aW9uKE1vZGlmaWVySG9sZGVyIG1vZGlmaWVyKSB7UmFuZ2VkTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG5ldyBSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+KG51bGwpOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzOworICAgICAgICBBcnJheUJyYWNrZXRQYWlyIGFycmF5QnJhY2tldFBhaXI7CisgICAgICAgIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4gYXJyYXlCcmFja2V0UGFpcnMgPSBudWxsOworICAgICAgICBMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93c18gPSBudWxsOworICAgICAgICBCbG9ja1N0bXQgYmxvY2sgPSBudWxsOworICAgICAgICBQb3NpdGlvbiBiZWdpbiA9IG1vZGlmaWVyLmJlZ2luOworICAgICAgICBSZWZlcmVuY2VUeXBlIHRocm93VHlwZTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgTFQ6eworICAgICAgdHlwZVBhcmFtZXRlcnMgPSBUeXBlUGFyYW1ldGVycygpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0eXBlUGFyYW1ldGVycy5yYW5nZS5iZWdpbik7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzM3XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgdHlwZSA9IFJlc3VsdFR5cGUoKTsKK2JlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodHlwZS5nZXRCZWdpbigpKTsKKyAgICBuYW1lID0gTmFtZSgpOworICAgIHBhcmFtZXRlcnMgPSBGb3JtYWxQYXJhbWV0ZXJzKCk7CisgICAgbGFiZWxfMTU6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgY2FzZSBBVDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVszOF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE1OworICAgICAgfQorICAgICAgYXJyYXlCcmFja2V0UGFpciA9IEFycmF5QnJhY2tldFBhaXIoKTsKK2FycmF5QnJhY2tldFBhaXJzPWFkZChhcnJheUJyYWNrZXRQYWlycywgYXJyYXlCcmFja2V0UGFpcik7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBUSFJPV1M6eworICAgICAgampfY29uc3VtZV90b2tlbihUSFJPV1MpOworICAgICAgdGhyb3dUeXBlID0gUmVmZXJlbmNlVHlwZVdpdGhBbm5vdGF0aW9ucygpOwordGhyb3dzXyA9IGFkZCh0aHJvd3NfLCB0aHJvd1R5cGUpOworICAgICAgbGFiZWxfMTY6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIENPTU1BOnsKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVszOV0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTY7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICAgIHRocm93VHlwZSA9IFJlZmVyZW5jZVR5cGVXaXRoQW5ub3RhdGlvbnMoKTsKK3Rocm93c18gPSBhZGQodGhyb3dzXywgdGhyb3dUeXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNDBdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgTEJSQUNFOnsKKyAgICAgIGJsb2NrID0gQmxvY2soKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgU0VNSUNPTE9OOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNDFdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CitQYWlyPFR5cGUsIExpc3Q8QXJyYXlCcmFja2V0UGFpcj4+IHR5cGVMaXN0UGFpciA9IHVud3JhcEFycmF5VHlwZXModHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgTWV0aG9kRGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHBvcyh0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMubGlzdCwgdHlwZUxpc3RQYWlyLmEsIHR5cGVMaXN0UGFpci5iLCBuYW1lLCBwYXJhbWV0ZXJzLCBhcnJheUJyYWNrZXRQYWlycywgdGhyb3dzXywgYmxvY2spOworICB9CisKKyAgZmluYWwgcHVibGljIFJlZmVyZW5jZVR5cGUgUmVmZXJlbmNlVHlwZVdpdGhBbm5vdGF0aW9ucygpIHtMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9uczsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSB0eXBlOworICAgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKTsKKyAgICB0eXBlID0gUmVmZXJlbmNlVHlwZSgpOworaWYoYW5ub3RhdGlvbnMgIT0gbnVsbCl7CisgICAgICAgICAgICBpZiAodHlwZS5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0eXBlLmdldEFubm90YXRpb25zKCkuYWRkQWxsKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IEZvcm1hbFBhcmFtZXRlcnMoKSB7TGlzdDxQYXJhbWV0ZXI+IHJldCA9IG51bGw7CisgICAgICAgIFBhcmFtZXRlciBwYXI7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBBQlNUUkFDVDoKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZJTkFMOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkFUSVZFOgorICAgIGNhc2UgUFJJVkFURToKKyAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICBjYXNlIFBVQkxJQzoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1RBVElDOgorICAgIGNhc2UgU1RSSUNURlA6CisgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgY2FzZSBWT0xBVElMRToKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBBVDp7CisgICAgICBwYXIgPSBGb3JtYWxQYXJhbWV0ZXIoKTsKK3JldCA9IGFkZChyZXQsIHBhcik7CisgICAgICBsYWJlbF8xNzoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQ09NTUE6eworICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzQyXSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8xNzsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgICAgcGFyID0gRm9ybWFsUGFyYW1ldGVyKCk7CityZXQgPSBhZGQocmV0LCBwYXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs0M10gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IEZvcm1hbExhbWJkYVBhcmFtZXRlcnMoKSB7TGlzdDxQYXJhbWV0ZXI+IHJldCA9IG51bGw7CisgIFBhcmFtZXRlciBwYXI7CisgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgcGFyID0gRm9ybWFsUGFyYW1ldGVyKCk7CityZXQgPSBhZGQocmV0LCBwYXIpOworICAgIGxhYmVsXzE4OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs0NF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE4OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBwYXIgPSBGb3JtYWxQYXJhbWV0ZXIoKTsKK3JldCA9IGFkZChyZXQsIHBhcik7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gSW5mZXJyZWRMYW1iZGFQYXJhbWV0ZXJzKCkge0xpc3Q8UGFyYW1ldGVyPiByZXQgPSBudWxsOworICBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZDsKKyAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICBpZCA9IFZhcmlhYmxlRGVjbGFyYXRvcklkKCk7CityZXQgPSBhZGQocmV0LCBuZXcgUGFyYW1ldGVyKHJhbmdlKGlkLmdldEJlZ2luKCksIGlkLmdldEVuZCgpKSwgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBudWxsLCBuZXcgVW5rbm93blR5cGUoKSwgbnVsbCwgZmFsc2UsIGlkKSk7CisgICAgbGFiZWxfMTk6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzQ1XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTk7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGlkID0gVmFyaWFibGVEZWNsYXJhdG9ySWQoKTsKK3JldCA9IGFkZChyZXQsIG5ldyBQYXJhbWV0ZXIocmFuZ2UoaWQuZ2V0QmVnaW4oKSwgaWQuZ2V0RW5kKCkpLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIG51bGwsIG5ldyBVbmtub3duVHlwZSgpLCBudWxsLCBmYWxzZSwgaWQpKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIFBhcmFtZXRlciBGb3JtYWxQYXJhbWV0ZXIoKSB7TW9kaWZpZXJIb2xkZXIgbW9kaWZpZXI7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgYm9vbGVhbiBpc1ZhckFyZyA9IGZhbHNlOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZDsKKyAgICBtb2RpZmllciA9IE1vZGlmaWVycygpOworICAgIHR5cGUgPSBUeXBlKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIEVMTElQU0lTOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxMSVBTSVMpOworaXNWYXJBcmcgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs0Nl0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGlkID0gVmFyaWFibGVEZWNsYXJhdG9ySWQoKTsKK1Bvc2l0aW9uIGJlZ2luID0gbW9kaWZpZXIuYmVnaW4ub3JJZkludmFsaWQodHlwZS5nZXRCZWdpbigpKTsKKyAgICAgICAgUGFpcjxUeXBlLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+PiB0eXBlTGlzdFBhaXIgPSB1bndyYXBBcnJheVR5cGVzKHR5cGUpOworICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIHR5cGVMaXN0UGFpci5hLCB0eXBlTGlzdFBhaXIuYiwgaXNWYXJBcmcsIGlkKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oTW9kaWZpZXJIb2xkZXIgbW9kaWZpZXIpIHtSYW5nZWRMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gbmV3IFJhbmdlZExpc3Q8VHlwZVBhcmFtZXRlcj4obnVsbCk7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzOworICAgICAgICBMaXN0PFJlZmVyZW5jZVR5cGU+IHRocm93c18gPSBudWxsOworICAgICAgICBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgZXhDb25zSW52ID0gbnVsbDsKKyAgICAgICAgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzOworICAgIFBvc2l0aW9uIGJlZ2luID0gbW9kaWZpZXIuYmVnaW47CisgICAgICAgIFBvc2l0aW9uIGJsb2NrQmVnaW4gPSBJTlZBTElEOworICAgICAgICBSZWZlcmVuY2VUeXBlIHRocm93VHlwZTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgTFQ6eworICAgICAgdHlwZVBhcmFtZXRlcnMgPSBUeXBlUGFyYW1ldGVycygpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0eXBlUGFyYW1ldGVycy5yYW5nZS5iZWdpbik7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzQ3XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgLy8gTW9kaWZpZXJzIG1hdGNoZWQgaW4gdGhlIGNhbGxlcgorICAgICAgbmFtZSA9IFNpbXBsZU5hbWUoKTsKK2JlZ2luID0gYmVnaW4ub3JJZkludmFsaWQodHlwZVBhcmFtZXRlcnMucmFuZ2UuYmVnaW4pOworICAgIHBhcmFtZXRlcnMgPSBGb3JtYWxQYXJhbWV0ZXJzKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIFRIUk9XUzp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFRIUk9XUyk7CisgICAgICB0aHJvd1R5cGUgPSBSZWZlcmVuY2VUeXBlV2l0aEFubm90YXRpb25zKCk7Cit0aHJvd3NfID0gYWRkKHRocm93c18sIHRocm93VHlwZSk7CisgICAgICBsYWJlbF8yMDoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQ09NTUE6eworICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzQ4XSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8yMDsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgICAgdGhyb3dUeXBlID0gUmVmZXJlbmNlVHlwZVdpdGhBbm5vdGF0aW9ucygpOwordGhyb3dzXyA9IGFkZCh0aHJvd3NfLCB0aHJvd1R5cGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs0OV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKK2Jsb2NrQmVnaW49dG9rZW5CZWdpbigpOworICAgIGlmIChqal8yXzgoMjE0NzQ4MzY0NykpIHsKKyAgICAgIGV4Q29uc0ludiA9IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgc3RtdHMgPSBTdGF0ZW1lbnRzKCk7CisgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOworaWYgKGV4Q29uc0ludiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RtdHMgPSBhZGQoMCwgc3RtdHMsIGV4Q29uc0ludik7CisgICAgICAgIH0KKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB0bXAgPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihyYW5nZShiZWdpbiwgcG9zKHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbikpLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCB0eXBlUGFyYW1ldGVycy5saXN0LCBudWxsLCBwYXJhbWV0ZXJzLCB0aHJvd3NfLCBuZXcgQmxvY2tTdG10KHJhbmdlKGJsb2NrQmVnaW4sIHRva2VuRW5kKCkpLCBzdG10cykpOworICAgIHRtcC5zZXROYW1lRXhwcihuYW1lKTsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigpIHtib29sZWFuIGlzVGhpcyA9IGZhbHNlOworICAgICAgICBMaXN0PEV4cHJlc3Npb24+IGFyZ3M7CisgICAgICAgIEV4cHJlc3Npb24gZXhwciA9IG51bGw7CisgICAgICAgIFJhbmdlZExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPD8+PihudWxsKTsKKyAgICAgICAgUG9zaXRpb24gYmVnaW4gPSBJTlZBTElEOworICAgIGlmIChqal8yXzEwKDIxNDc0ODM2NDcpKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBMVDp7CisgICAgICAgIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpOworYmVnaW49dHlwZUFyZ3MucmFuZ2UuYmVnaW47CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNTBdID0gampfZ2VuOworICAgICAgICA7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKFRISVMpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOyBpc1RoaXMgPSB0cnVlOworICAgICAgYXJncyA9IEFyZ3VtZW50cygpOworICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEZBTFNFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBORVc6CisgICAgICBjYXNlIE5VTEw6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgVEhJUzoKKyAgICAgIGNhc2UgVFJVRToKKyAgICAgIGNhc2UgVk9JRDoKKyAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgY2FzZSBMVDp7CisgICAgICAgIGlmIChqal8yXzkoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgICBleHByID0gUHJpbWFyeUV4cHJlc3Npb25XaXRob3V0U3VwZXJTdWZmaXgoKTsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CitiZWdpbj1leHByLmdldEJlZ2luKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgTFQ6eworICAgICAgICAgIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0eXBlQXJncy5yYW5nZS5iZWdpbik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVs1MV0gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgICAgICBhcmdzID0gQXJndW1lbnRzKCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs1Ml0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CityZXR1cm4gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksdHlwZUFyZ3MubGlzdCwgaXNUaGlzLCBleHByLCBhcmdzKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PFN0YXRlbWVudD4gU3RhdGVtZW50cygpIHtMaXN0PFN0YXRlbWVudD4gcmV0ID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0bXQ7CisgICAgbGFiZWxfMjE6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEFCU1RSQUNUOgorICAgICAgY2FzZSBBU1NFUlQ6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJSRUFLOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBDTEFTUzoKKyAgICAgIGNhc2UgQ09OVElOVUU6CisgICAgICBjYXNlIERPOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEZBTFNFOgorICAgICAgY2FzZSBGSU5BTDoKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIEZPUjoKKyAgICAgIGNhc2UgSUY6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFJFVFVSTjoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgIGNhc2UgU1RSSUNURlA6CisgICAgICBjYXNlIFNVUEVSOgorICAgICAgY2FzZSBTV0lUQ0g6CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgIGNhc2UgVEhJUzoKKyAgICAgIGNhc2UgVEhST1c6CisgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgIGNhc2UgVFJVRToKKyAgICAgIGNhc2UgVFJZOgorICAgICAgY2FzZSBWT0lEOgorICAgICAgY2FzZSBWT0xBVElMRToKKyAgICAgIGNhc2UgV0hJTEU6CisgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICBjYXNlIExQQVJFTjoKKyAgICAgIGNhc2UgTEJSQUNFOgorICAgICAgY2FzZSBTRU1JQ09MT046CisgICAgICBjYXNlIEFUOgorICAgICAgY2FzZSBJTkNSOgorICAgICAgY2FzZSBERUNSOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzUzXSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMjE7CisgICAgICB9CisgICAgICBzdG10ID0gQmxvY2tTdGF0ZW1lbnQoKTsKK3JldCA9IGFkZChyZXQsIHN0bXQpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBJbml0aWFsaXplckRlY2xhcmF0aW9uKCkge0Jsb2NrU3RtdCBibG9jazsKKyAgICAgICAgUG9zaXRpb24gYmVnaW4gPSBJTlZBTElEOworICAgICAgICBib29sZWFuIGlzU3RhdGljID0gZmFsc2U7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIFNUQVRJQzp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVRJQyk7Citpc1N0YXRpYyA9IHRydWU7IGJlZ2luPXRva2VuQmVnaW4oKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNTRdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBibG9jayA9IEJsb2NrKCk7CitiZWdpbiA9IGJlZ2luLm9ySWZJbnZhbGlkKGJsb2NrLmdldEJlZ2luKCkpOworcmV0dXJuIG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgaXNTdGF0aWMsIGJsb2NrKTsKKyAgfQorCisvKgorICogVHlwZSwgbmFtZSBhbmQgZXhwcmVzc2lvbiBzeW50YXggZm9sbG93cy4KKyAqLworICBmaW5hbCBwdWJsaWMgCitUeXBlIFR5cGUoKSB7VHlwZSByZXQ7CisgICAgaWYgKGpqXzJfMTEoMikpIHsKKyAgICAgIHJldCA9IFJlZmVyZW5jZVR5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBTSE9SVDp7CisgICAgICAgIHJldCA9IFByaW1pdGl2ZVR5cGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs1NV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIFJlZmVyZW5jZVR5cGUgUmVmZXJlbmNlVHlwZSgpIHtUeXBlIHR5cGU7CisgICAgICAgIEFycmF5QnJhY2tldFBhaXIgYXJyYXlCcmFja2V0UGFpcjsKKyAgICAgICAgTGlzdDxBcnJheUJyYWNrZXRQYWlyPiBhcnJheUJyYWNrZXRQYWlycyA9IG51bGw7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIFNIT1JUOnsKKyAgICAgIHR5cGUgPSBQcmltaXRpdmVUeXBlKCk7CisgICAgICBsYWJlbF8yMjoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGFycmF5QnJhY2tldFBhaXIgPSBBcnJheUJyYWNrZXRQYWlyKCk7CithcnJheUJyYWNrZXRQYWlycz1hZGQoYXJyYXlCcmFja2V0UGFpcnMsIGFycmF5QnJhY2tldFBhaXIpOworICAgICAgICBpZiAoampfMl8xMigyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF8yMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBJREVOVElGSUVSOnsKKyAgICAgIHR5cGUgPSBDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgbGFiZWxfMjM6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoampfMl8xMygyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF8yMzsKKyAgICAgICAgfQorICAgICAgICBhcnJheUJyYWNrZXRQYWlyID0gQXJyYXlCcmFja2V0UGFpcigpOworYXJyYXlCcmFja2V0UGFpcnM9YWRkKGFycmF5QnJhY2tldFBhaXJzLCBhcnJheUJyYWNrZXRQYWlyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNTZdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CityZXR1cm4gKFJlZmVyZW5jZVR5cGUpd3JhcEluQXJyYXlUeXBlcyh0eXBlLCBhcnJheUJyYWNrZXRQYWlycyk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQXJyYXlCcmFja2V0UGFpciBBcnJheUJyYWNrZXRQYWlyKCkge0xpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbnVsbDsKKyAgICBQb3NpdGlvbiBiZWdpbiA9IElOVkFMSUQ7CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOworYmVnaW4gPSBiZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOworcmV0dXJuIG5ldyBBcnJheUJyYWNrZXRQYWlyKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgYW5ub3RhdGlvbnMpOworICB9CisKKyAgZmluYWwgcHVibGljIEludGVyc2VjdGlvblR5cGUgSW50ZXJzZWN0aW9uVHlwZSgpIHtQb3NpdGlvbiBiZWdpbjsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBlbGVtZW50VHlwZTsKKyAgICAgICAgTGlzdDxSZWZlcmVuY2VUeXBlPiBlbGVtZW50cyA9IG51bGw7CisgICAgZWxlbWVudFR5cGUgPSBSZWZlcmVuY2VUeXBlKCk7CitiZWdpbj1lbGVtZW50VHlwZS5nZXRCZWdpbigpOyBlbGVtZW50cyA9IGFkZChlbGVtZW50cywgZWxlbWVudFR5cGUpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX0FORCk7CisgICAgbGFiZWxfMjQ6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGVsZW1lbnRUeXBlID0gUmVmZXJlbmNlVHlwZSgpOworZWxlbWVudHMgPSBhZGQoZWxlbWVudHMsIGVsZW1lbnRUeXBlKTsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIElERU5USUZJRVI6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNTddID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8yNDsKKyAgICAgIH0KKyAgICB9CityZXR1cm4gbmV3IEludGVyc2VjdGlvblR5cGUocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCBlbGVtZW50cyk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgQW5ub3RhdGVkQ2xhc3NPckludGVyZmFjZVR5cGUoKSB7TGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIGNpdDsKKyAgICBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCk7CisgICAgY2l0ID0gQ2xhc3NPckludGVyZmFjZVR5cGUoKTsKK2lmIChjaXQuZ2V0U2NvcGUoKSE9bnVsbCkgeworICAgICAgICAgICAgY2l0LmdldFNjb3BlKCkuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2l0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2l0OworICB9CisKKyAgZmluYWwgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIENsYXNzT3JJbnRlcmZhY2VUeXBlKCkge0NsYXNzT3JJbnRlcmZhY2VUeXBlIHJldDsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIFJhbmdlZExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPD8+PihudWxsKTsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgICAgIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbnVsbDsKKyAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworYmVnaW49dG9rZW5CZWdpbigpOworbmFtZSA9IHRva2VuLmltYWdlOworICAgIGlmIChqal8yXzE0KDIpKSB7CisgICAgICB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KK3JldCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksbnVsbCwgbmFtZSwgdHlwZUFyZ3MubGlzdCk7CisgICAgbGFiZWxfMjU6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzE1KDIpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzI1OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihET1QpOworICAgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKK25hbWUgPSB0b2tlbi5pbWFnZTsKKyAgICAgIGlmIChqal8yXzE2KDIpKSB7CisgICAgICAgIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgOworICAgICAgfQorcmV0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxyZXQsIG5hbWUsIHR5cGVBcmdzLmxpc3QpOworICAgICAgICAgICAgcmV0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIGFubm90YXRpb25zID0gbnVsbDsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIFJhbmdlZExpc3Q8VHlwZTw/Pj4gVHlwZUFyZ3VtZW50cygpIHtSYW5nZWRMaXN0PFR5cGU8Pz4+IHJldCA9IG5ldyBSYW5nZWRMaXN0PFR5cGU8Pz4+KG5ldyBMaW5rZWRMaXN0PFR5cGU8Pz4+KCkpOworICAgICAgICBUeXBlIHR5cGU7CisgICAgampfY29uc3VtZV90b2tlbihMVCk7CityZXQuYmVnaW5BdCh0b2tlbkJlZ2luKCkpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBBVDoKKyAgICBjYXNlIEhPT0s6eworICAgICAgdHlwZSA9IFR5cGVBcmd1bWVudCgpOworcmV0LmFkZCh0eXBlKTsKKyAgICAgIGxhYmVsXzI2OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNThdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzI2OworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgICB0eXBlID0gVHlwZUFyZ3VtZW50KCk7CityZXQuYWRkKHR5cGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs1OV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworcmV0LmVuZEF0KHRva2VuRW5kKCkpOworcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlIFR5cGVBcmd1bWVudCgpIHtUeXBlIHJldDsKKyAgICAgICAgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBJREVOVElGSUVSOnsKKyAgICAgIHJldCA9IFJlZmVyZW5jZVR5cGUoKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgSE9PSzp7CisgICAgICByZXQgPSBXaWxkY2FyZCgpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs2MF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KK3JldC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgV2lsZGNhcmRUeXBlIFdpbGRjYXJkKCkge1JlZmVyZW5jZVR5cGUgZXh0ID0gbnVsbDsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBzdXAgPSBudWxsOworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICAgICAgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIEVYVEVORFM6CisgICAgY2FzZSBTVVBFUjp7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBFWFRFTkRTOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihFWFRFTkRTKTsKKyAgICAgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgICAgICBleHQgPSBSZWZlcmVuY2VUeXBlKCk7CitleHQuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBTVVBFUjp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOworICAgICAgICBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCk7CisgICAgICAgIHN1cCA9IFJlZmVyZW5jZVR5cGUoKTsKK3N1cC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNjFdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzYyXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CityZXR1cm4gbmV3IFdpbGRjYXJkVHlwZShyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksZXh0LCBzdXApOworICB9CisKKyAgZmluYWwgcHVibGljIFByaW1pdGl2ZVR5cGUgUHJpbWl0aXZlVHlwZSgpIHtQcmltaXRpdmVUeXBlIHJldDsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKEJPT0xFQU4pOworcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5Cb29sZWFuKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgQ0hBUjp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKENIQVIpOworcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5DaGFyKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgQllURTp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKEJZVEUpOworcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5CeXRlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgU0hPUlQ6eworICAgICAgampfY29uc3VtZV90b2tlbihTSE9SVCk7CityZXQgPSBuZXcgUHJpbWl0aXZlVHlwZSh0b2tlblJhbmdlKCksIFByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLlNob3J0KTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgSU5UOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5UKTsKK3JldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuUmFuZ2UoKSwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuSW50KTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTE9ORzp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKExPTkcpOworcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW5SYW5nZSgpLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5Mb25nKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgRkxPQVQ6eworICAgICAgampfY29uc3VtZV90b2tlbihGTE9BVCk7CityZXQgPSBuZXcgUHJpbWl0aXZlVHlwZSh0b2tlblJhbmdlKCksIFByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLkZsb2F0KTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgRE9VQkxFOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9VQkxFKTsKK3JldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuUmFuZ2UoKSwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuRG91YmxlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNjNdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIFR5cGUgUmVzdWx0VHlwZSgpIHtUeXBlIHJldDsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgVk9JRDp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFZPSUQpOworcmV0ID0gbmV3IFZvaWRUeXBlKHRva2VuUmFuZ2UoKSk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgSURFTlRJRklFUjp7CisgICAgICByZXQgPSBUeXBlKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzY0XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBOYW1lRXhwciBOYW1lKCkge05hbWVFeHByIHJldDsKKyAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworcmV0ID0gbmV3IE5hbWVFeHByKHRva2VuUmFuZ2UoKSwgdG9rZW4uaW1hZ2UpOworICAgIGxhYmVsXzI3OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8xNygyKSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF8yNzsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9UKTsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CityZXQgPSBuZXcgUXVhbGlmaWVkTmFtZUV4cHIocmFuZ2UocmV0LmdldEJlZ2luKCksIHBvcyh0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pKSwgcmV0LCB0b2tlbi5pbWFnZSk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBOYW1lRXhwciBTaW1wbGVOYW1lKCkge05hbWVFeHByIHJldDsKKyAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworcmV0ID0gbmV3IE5hbWVFeHByKHRva2VuUmFuZ2UoKSwgdG9rZW4uaW1hZ2UpOworcmV0dXJuIHJldDsKKyAgfQorCisvKgorICogRXhwcmVzc2lvbiBzeW50YXggZm9sbG93cy4KKyAqLworICBmaW5hbCBwdWJsaWMgCitFeHByZXNzaW9uIEV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEFzc2lnbkV4cHIuT3BlcmF0b3Igb3A7CisgICAgICAgIEV4cHJlc3Npb24gdmFsdWU7CisgICAgICAgIFN0YXRlbWVudCBsYW1iZGFCb2R5ID0gbnVsbDsKKyAgICAgICAgUmFuZ2VkTGlzdDxUeXBlPD8+PiB0eXBlQXJncyA9IG5ldyBSYW5nZWRMaXN0PFR5cGU8Pz4+KG51bGwpOworICAgIHJldCA9IENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBBU1NJR046CisgICAgY2FzZSBQTFVTQVNTSUdOOgorICAgIGNhc2UgTUlOVVNBU1NJR046CisgICAgY2FzZSBTVEFSQVNTSUdOOgorICAgIGNhc2UgU0xBU0hBU1NJR046CisgICAgY2FzZSBBTkRBU1NJR046CisgICAgY2FzZSBPUkFTU0lHTjoKKyAgICBjYXNlIFhPUkFTU0lHTjoKKyAgICBjYXNlIFJFTUFTU0lHTjoKKyAgICBjYXNlIExTSElGVEFTU0lHTjoKKyAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKKyAgICBjYXNlIFJVTlNJR05FRFNISUZUQVNTSUdOOgorICAgIGNhc2UgQVJST1c6CisgICAgY2FzZSBET1VCTEVDT0xPTjp7CisgICAgICBpZiAoampfMl8xOCgyKSkgeworICAgICAgICBvcCA9IEFzc2lnbm1lbnRPcGVyYXRvcigpOworICAgICAgICB2YWx1ZSA9IEV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBBc3NpZ25FeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgdmFsdWUsIG9wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQVJST1c6eworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVJST1cpOworICAgICAgICAgIGxhbWJkYUJvZHkgPSBMYW1iZGFCb2R5KCk7CitpZiAocmV0IGluc3RhbmNlb2YgQ2FzdEV4cHIpCisgICAgIHsKKyAgICAgICByZXQgPSBnZW5lcmF0ZUxhbWJkYShyZXQsIGxhbWJkYUJvZHkpOworICAgICB9CisgICAgIGVsc2UgaWYgKHJldCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcil7CisgICAgICAgICBDb25kaXRpb25hbEV4cHIgY2UgPSAoQ29uZGl0aW9uYWxFeHByKSByZXQ7CisgICAgICAgICBpZihjZS5nZXRFbHNlRXhwcigpICE9IG51bGwpeworICAgICAgICAgICAgY2Uuc2V0RWxzZUV4cHIoZ2VuZXJhdGVMYW1iZGEoY2UuZ2V0RWxzZUV4cHIoKSwgbGFtYmRhQm9keSkpOworICAgICAgICAgfQorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgIHJldCA9IGdlbmVyYXRlTGFtYmRhKHJldCwgbGFtYmRhQm9keSk7CisgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgRE9VQkxFQ09MT046eworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9VQkxFQ09MT04pOworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBMVDp7CisgICAgICAgICAgICB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbNjVdID0gampfZ2VuOworICAgICAgICAgICAgOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICAgIGNhc2UgSURFTlRJRklFUjp7CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBORVc6eworICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihORVcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGpqX2xhMVs2Nl0gPSBqal9nZW47CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICAgIH0KK3JldCA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgdHlwZUFyZ3MubGlzdCwgdG9rZW4uaW1hZ2UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNjddID0gampfZ2VuOworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzY4XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEFzc2lnbkV4cHIuT3BlcmF0b3IgQXNzaWdubWVudE9wZXJhdG9yKCkge0Fzc2lnbkV4cHIuT3BlcmF0b3IgcmV0OworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihBU1NJR04pOworcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5hc3NpZ247CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFNUQVJBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihTVEFSQVNTSUdOKTsKK3JldCA9IEFzc2lnbkV4cHIuT3BlcmF0b3Iuc3RhcjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgU0xBU0hBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihTTEFTSEFTU0lHTik7CityZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnNsYXNoOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBSRU1BU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihSRU1BU1NJR04pOworcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5yZW07CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFBMVVNBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihQTFVTQVNTSUdOKTsKK3JldCA9IEFzc2lnbkV4cHIuT3BlcmF0b3IucGx1czsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTUlOVVNBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihNSU5VU0FTU0lHTik7CityZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLm1pbnVzOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBMU0hJRlRBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihMU0hJRlRBU1NJR04pOworcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5sU2hpZnQ7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFJTSUdORURTSElGVEFTU0lHTik7CityZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnJTaWduZWRTaGlmdDsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgUlVOU0lHTkVEU0hJRlRBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihSVU5TSUdORURTSElGVEFTU0lHTik7CityZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnJVbnNpZ25lZFNoaWZ0OworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBBTkRBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihBTkRBU1NJR04pOworcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5hbmQ7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFhPUkFTU0lHTjp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFhPUkFTU0lHTik7CityZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnhvcjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgT1JBU1NJR046eworICAgICAgampfY29uc3VtZV90b2tlbihPUkFTU0lHTik7CityZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLm9yOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs2OV0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gbGVmdDsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodDsKKyAgICByZXQgPSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbigpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBIT09LOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7CisgICAgICBsZWZ0ID0gRXhwcmVzc2lvbigpOworICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7CisgICAgICByaWdodCA9IENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOworcmV0ID0gbmV3IENvbmRpdGlvbmFsRXhwcihyYW5nZShyZXQuZ2V0QmVnaW4oKSwgcG9zKHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbikpLCByZXQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNzBdID0gampfZ2VuOworICAgICAgOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDb25kaXRpb25hbE9yRXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodDsKKyAgICByZXQgPSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF8yODoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgU0NfT1I6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNzFdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8yODsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0NfT1IpOworICAgICAgcmlnaHQgPSBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgcmlnaHQsIEJpbmFyeUV4cHIuT3BlcmF0b3Iub3IpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgcmV0ID0gSW5jbHVzaXZlT3JFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfMjk6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFNDX0FORDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs3Ml0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzI5OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihTQ19BTkQpOworICAgICAgcmlnaHQgPSBJbmNsdXNpdmVPckV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgcmlnaHQsIEJpbmFyeUV4cHIuT3BlcmF0b3IuYW5kKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gSW5jbHVzaXZlT3JFeHByZXNzaW9uKCkge0V4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgIHJldCA9IEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbigpOworICAgIGxhYmVsXzMwOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBCSVRfT1I6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNzNdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8zMDsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX09SKTsKKyAgICAgIHJpZ2h0ID0gRXhjbHVzaXZlT3JFeHByZXNzaW9uKCk7CityZXQgPSBuZXcgQmluYXJ5RXhwcihyYW5nZShyZXQuZ2V0QmVnaW4oKSwgcG9zKHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbikpLCByZXQsIHJpZ2h0LCBCaW5hcnlFeHByLk9wZXJhdG9yLmJpbk9yKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gRXhjbHVzaXZlT3JFeHByZXNzaW9uKCkge0V4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgIHJldCA9IEFuZEV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF8zMToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgWE9SOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzc0XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzE7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKFhPUik7CisgICAgICByaWdodCA9IEFuZEV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgcmlnaHQsIEJpbmFyeUV4cHIuT3BlcmF0b3IueG9yKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gQW5kRXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodDsKKyAgICByZXQgPSBFcXVhbGl0eUV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF8zMjoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQklUX0FORDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs3NV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzMyOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihCSVRfQU5EKTsKKyAgICAgIHJpZ2h0ID0gRXF1YWxpdHlFeHByZXNzaW9uKCk7CityZXQgPSBuZXcgQmluYXJ5RXhwcihyYW5nZShyZXQuZ2V0QmVnaW4oKSwgcG9zKHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbikpLCByZXQsIHJpZ2h0LCBCaW5hcnlFeHByLk9wZXJhdG9yLmJpbkFuZCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIEVxdWFsaXR5RXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodDsKKyAgICAgICAgQmluYXJ5RXhwci5PcGVyYXRvciBvcDsKKyAgICByZXQgPSBJbnN0YW5jZU9mRXhwcmVzc2lvbigpOworICAgIGxhYmVsXzMzOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBFUToKKyAgICAgIGNhc2UgTkU6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNzZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8zMzsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEVROnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihFUSk7CitvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuZXF1YWxzOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBORTp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkUpOworb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLm5vdEVxdWFsczsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs3N10gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJpZ2h0ID0gSW5zdGFuY2VPZkV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgcmlnaHQsIG9wKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gSW5zdGFuY2VPZkV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICByZXQgPSBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBJTlNUQU5DRU9GOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5TVEFOQ0VPRik7CisgICAgICB0eXBlID0gVHlwZSgpOworcmV0ID0gbmV3IEluc3RhbmNlT2ZFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgdHlwZSk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzc4XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gUmVsYXRpb25hbEV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgICAgIEJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7CisgICAgcmV0ID0gU2hpZnRFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfMzQ6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIExUOgorICAgICAgY2FzZSBMRToKKyAgICAgIGNhc2UgR0U6CisgICAgICBjYXNlIEdUOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzc5XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzQ7CisgICAgICB9CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBMVDp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFQpOworb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLmxlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIEdUOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihHVCk7CitvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuZ3JlYXRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgTEU6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKExFKTsKK29wID0gQmluYXJ5RXhwci5PcGVyYXRvci5sZXNzRXF1YWxzOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBHRTp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oR0UpOworb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLmdyZWF0ZXJFcXVhbHM7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbODBdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICByaWdodCA9IFNoaWZ0RXhwcmVzc2lvbigpOworcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LmdldEJlZ2luKCksIHBvcyh0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pKSwgcmV0LCByaWdodCwgb3ApOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBTaGlmdEV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgICAgIEJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7CisgICAgcmV0ID0gQWRkaXRpdmVFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfMzU6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzE5KDEpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzM1OworICAgICAgfQorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTFNISUZUOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihMU0hJRlQpOworb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLmxTaGlmdDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs4MV0gPSBqal9nZW47CisgICAgICAgIGlmIChqal8yXzIwKDEpKSB7CisgICAgICAgICAgUlNJR05FRFNISUZUKCk7CitvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuclNpZ25lZFNoaWZ0OworICAgICAgICB9IGVsc2UgaWYgKGpqXzJfMjEoMSkpIHsKKyAgICAgICAgICBSVU5TSUdORURTSElGVCgpOworb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLnJVbnNpZ25lZFNoaWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICB9CisgICAgICByaWdodCA9IEFkZGl0aXZlRXhwcmVzc2lvbigpOworcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LmdldEJlZ2luKCksIHBvcyh0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pKSwgcmV0LCByaWdodCwgb3ApOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBBZGRpdGl2ZUV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgICAgIEJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7CisgICAgcmV0ID0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfMzY6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFBMVVM6CisgICAgICBjYXNlIE1JTlVTOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzgyXSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzY7CisgICAgICB9CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBQTFVTOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihQTFVTKTsKK29wID0gQmluYXJ5RXhwci5PcGVyYXRvci5wbHVzOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBNSU5VUzp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOworb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLm1pbnVzOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzgzXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgcmlnaHQgPSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBCaW5hcnlFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgcmlnaHQsIG9wKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkge0V4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgICAgICBCaW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpOworICAgIGxhYmVsXzM3OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBTVEFSOgorICAgICAgY2FzZSBTTEFTSDoKKyAgICAgIGNhc2UgUkVNOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzg0XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzc7CisgICAgICB9CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBTVEFSOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihTVEFSKTsKK29wID0gQmluYXJ5RXhwci5PcGVyYXRvci50aW1lczsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgU0xBU0g6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNMQVNIKTsKK29wID0gQmluYXJ5RXhwci5PcGVyYXRvci5kaXZpZGU7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFJFTTp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkVNKTsKK29wID0gQmluYXJ5RXhwci5PcGVyYXRvci5yZW1haW5kZXI7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbODVdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICByaWdodCA9IFVuYXJ5RXhwcmVzc2lvbigpOworcmV0ID0gbmV3IEJpbmFyeUV4cHIocmFuZ2UocmV0LmdldEJlZ2luKCksIHRva2VuRW5kKCkpLCByZXQsIHJpZ2h0LCBvcCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgICAgICBQb3NpdGlvbiBiZWdpbiA9IElOVkFMSUQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIElOQ1I6eworICAgICAgcmV0ID0gUHJlSW5jcmVtZW50RXhwcmVzc2lvbigpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBERUNSOnsKKyAgICAgIHJldCA9IFByZURlY3JlbWVudEV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOnsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFBMVVM6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBMVVMpOworb3AgPSBVbmFyeUV4cHIuT3BlcmF0b3IucG9zaXRpdmU7IGJlZ2luPXRva2VuQmVnaW4oKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgTUlOVVM6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKK29wID0gVW5hcnlFeHByLk9wZXJhdG9yLm5lZ2F0aXZlOyBiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbODZdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICByZXQgPSBVbmFyeUV4cHJlc3Npb24oKTsKK2lmKG9wID09IFVuYXJ5RXhwci5PcGVyYXRvci5uZWdhdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIEludGVnZXJMaXRlcmFsRXhwciAmJiAoKEludGVnZXJMaXRlcmFsRXhwcilyZXQpLmlzTWluVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTG9uZ0xpdGVyYWxFeHByICYmICgoTG9uZ0xpdGVyYWxFeHByKXJldCkuaXNNaW5WYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBMb25nTGl0ZXJhbE1pblZhbHVlRXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIHJldCwgb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIHJldCwgb3ApOworICAgICAgICAgICAgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZBTFNFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkVXOgorICAgIGNhc2UgTlVMTDoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1VQRVI6CisgICAgY2FzZSBUSElTOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIFZPSUQ6CisgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBMUEFSRU46CisgICAgY2FzZSBCQU5HOgorICAgIGNhc2UgVElMREU6eworICAgICAgcmV0ID0gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzg3XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByZUluY3JlbWVudEV4cHJlc3Npb24oKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luID0gSU5WQUxJRDsKKyAgICBqal9jb25zdW1lX3Rva2VuKElOQ1IpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpOworcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIHJldCwgVW5hcnlFeHByLk9wZXJhdG9yLnByZUluY3JlbWVudCk7CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gUHJlRGVjcmVtZW50RXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihERUNSKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICByZXQgPSBVbmFyeUV4cHJlc3Npb24oKTsKK3JldCA9IG5ldyBVbmFyeUV4cHIocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCByZXQsIFVuYXJ5RXhwci5PcGVyYXRvci5wcmVEZWNyZW1lbnQpOworcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cygpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgICAgICBQb3NpdGlvbiBiZWdpbiA9IElOVkFMSUQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIEJBTkc6CisgICAgY2FzZSBUSUxERTp7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBUSUxERTp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVElMREUpOworb3AgPSBVbmFyeUV4cHIuT3BlcmF0b3IuaW52ZXJzZTsgYmVnaW49dG9rZW5CZWdpbigpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBCQU5HOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihCQU5HKTsKK29wID0gVW5hcnlFeHByLk9wZXJhdG9yLm5vdDsgICAgIGJlZ2luPXRva2VuQmVnaW4oKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs4OF0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpOworcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIHJldCwgb3ApOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs4OV0gPSBqal9nZW47CisgICAgICBpZiAoampfMl8yMigyMTQ3NDgzNjQ3KSkgeworICAgICAgICByZXQgPSBDYXN0RXhwcmVzc2lvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgIGNhc2UgRkFMU0U6CisgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgIGNhc2UgSU5UOgorICAgICAgICBjYXNlIExPTkc6CisgICAgICAgIGNhc2UgTkVXOgorICAgICAgICBjYXNlIE5VTEw6CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1VQRVI6CisgICAgICAgIGNhc2UgVEhJUzoKKyAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgIGNhc2UgTFBBUkVOOnsKKyAgICAgICAgICByZXQgPSBQb3N0Zml4RXhwcmVzc2lvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbOTBdID0gampfZ2VuOworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFBvc3RmaXhFeHByZXNzaW9uKCkge0V4cHJlc3Npb24gcmV0OworICAgICAgICBVbmFyeUV4cHIuT3BlcmF0b3Igb3A7CisgICAgcmV0ID0gUHJpbWFyeUV4cHJlc3Npb24oKTsKKyAgICBpZiAoampfMl8yMygyKSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgSU5DUjp7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5DUik7CitvcCA9IFVuYXJ5RXhwci5PcGVyYXRvci5wb3NJbmNyZW1lbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIERFQ1I6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKERFQ1IpOworb3AgPSBVbmFyeUV4cHIuT3BlcmF0b3IucG9zRGVjcmVtZW50OworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzkxXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorcmV0ID0gbmV3IFVuYXJ5RXhwcihyYW5nZShyZXQuZ2V0QmVnaW4oKSwgcG9zKHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbikpLCByZXQsIG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDYXN0RXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSByZWZlcmVuY2VUeXBlOworICAgICAgICBQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGU7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luID0gSU5WQUxJRDsKKyAgICAgICAgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBudWxsOworICAgICAgICBMaXN0PFJlZmVyZW5jZVR5cGU+IHR5cGVzT2ZNdWx0aUNhc3QgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25zKCk7CisgICAgaWYgKGpqXzJfMjQoMikpIHsKKyAgICAgIHByaW1pdGl2ZVR5cGUgPSBQcmltaXRpdmVUeXBlKCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgICByZXQgPSBVbmFyeUV4cHJlc3Npb24oKTsKK3ByaW1pdGl2ZVR5cGUuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOyByZXQgPSBuZXcgQ2FzdEV4cHIocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCBwcmltaXRpdmVUeXBlLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBJREVOVElGSUVSOnsKKyAgICAgICAgcmVmZXJlbmNlVHlwZSA9IFJlZmVyZW5jZVR5cGUoKTsKK3R5cGVzT2ZNdWx0aUNhc3QgPSBhZGQodHlwZXNPZk11bHRpQ2FzdCwgcmVmZXJlbmNlVHlwZSk7IHJlZmVyZW5jZVR5cGUuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBsYWJlbF8zODoKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICAgIGNhc2UgQklUX0FORDp7CisgICAgICAgICAgICA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzkyXSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGJyZWFrIGxhYmVsXzM4OworICAgICAgICAgIH0KKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEJJVF9BTkQpOworICAgICAgICAgIHJlZmVyZW5jZVR5cGUgPSBSZWZlcmVuY2VUeXBlKCk7Cit0eXBlc09mTXVsdGlDYXN0ID0gYWRkKHR5cGVzT2ZNdWx0aUNhc3QsIHJlZmVyZW5jZVR5cGUpOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICAgICAgcmV0ID0gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKCk7CitpZiAodHlwZXNPZk11bHRpQ2FzdC5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IENhc3RFeHByKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgbmV3IEludGVyc2VjdGlvblR5cGUocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCB0eXBlc09mTXVsdGlDYXN0KSwgcmV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IG5ldyBDYXN0RXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIHJlZmVyZW5jZVR5cGUsIHJldCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOTNdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByaW1hcnlFeHByZXNzaW9uKCkge0V4cHJlc3Npb24gcmV0OworICAgIHJldCA9IFByaW1hcnlQcmVmaXgoKTsKKyAgICBsYWJlbF8zOToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMjUoMikpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzk7CisgICAgICB9CisgICAgICByZXQgPSBQcmltYXJ5U3VmZml4KHJldCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByaW1hcnlFeHByZXNzaW9uV2l0aG91dFN1cGVyU3VmZml4KCkge0V4cHJlc3Npb24gcmV0OworICAgIHJldCA9IFByaW1hcnlQcmVmaXgoKTsKKyAgICBsYWJlbF80MDoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMjYoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNDA7CisgICAgICB9CisgICAgICByZXQgPSBQcmltYXJ5U3VmZml4V2l0aG91dFN1cGVyKHJldCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByaW1hcnlQcmVmaXgoKSB7RXhwcmVzc2lvbiByZXQgPSBudWxsOworICAgICAgICBOYW1lRXhwciBuYW1lOworICAgICAgICBSYW5nZWRMaXN0PFR5cGU8Pz4+IHR5cGVBcmdzID0gbmV3IFJhbmdlZExpc3Q8VHlwZTw/Pj4obnVsbCk7CisgICAgICAgIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG51bGw7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbXMgPSBudWxsOworICAgICAgICBib29sZWFuIGhhc0FyZ3MgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBpc0xhbWJkYSA9IGZhbHNlOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgICAgICBQYXJhbWV0ZXIgcCA9IG51bGw7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gbnVsbDsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOnsKKyAgICAgIHJldCA9IExpdGVyYWwoKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVEhJUzp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFRISVMpOworcmV0ID0gbmV3IFRoaXNFeHByKHRva2VuUmFuZ2UoKSwgbnVsbCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFNVUEVSOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOworcmV0ID0gbmV3IFN1cGVyRXhwcih0b2tlblJhbmdlKCksIG51bGwpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgRE9UOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihET1QpOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIExUOnsKKyAgICAgICAgICB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzk0XSA9IGpqX2dlbjsKKyAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IFNpbXBsZU5hbWUoKTsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBMUEFSRU46eworICAgICAgICAgIGFyZ3MgPSBBcmd1bWVudHMoKTsKK2hhc0FyZ3M9dHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzk1XSA9IGpqX2dlbjsKKyAgICAgICAgICA7CisgICAgICAgIH0KK2lmIChoYXNBcmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIG0gPSBuZXcgTWV0aG9kQ2FsbEV4cHIocmFuZ2UocmV0LmdldEJlZ2luKCksIHBvcyh0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pKSwgcmV0LCB0eXBlQXJncy5saXN0LCBudWxsLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5zZXROYW1lRXhwcihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkQWNjZXNzRXhwciBmID0gbmV3IEZpZWxkQWNjZXNzRXhwcihyYW5nZShyZXQuZ2V0QmVnaW4oKSwgcG9zKHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbikpLCByZXQsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnNldEZpZWxkRXhwcihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgRE9VQkxFQ09MT046eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVUJMRUNPTE9OKTsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBMVDp7CisgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVs5Nl0gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgSURFTlRJRklFUjp7CisgICAgICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgTkVXOnsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5FVyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVs5N10gPSBqal9nZW47CisgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KK3JldCA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKHJhbmdlKHJldC5nZXRCZWdpbigpLCBwb3ModG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSksIHJldCwgdHlwZUFyZ3MubGlzdCwgdG9rZW4uaW1hZ2UpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzk4XSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBMUEFSRU46eworICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworYmVnaW49dG9rZW5CZWdpbigpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVEFUSUM6CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIEFUOgorICAgICAgY2FzZSBCQU5HOgorICAgICAgY2FzZSBUSUxERToKKyAgICAgIGNhc2UgSU5DUjoKKyAgICAgIGNhc2UgREVDUjoKKyAgICAgIGNhc2UgUExVUzoKKyAgICAgIGNhc2UgTUlOVVM6eworICAgICAgICBpZiAoampfMl8yNygyMTQ3NDgzNjQ3KSkgeworICAgICAgICAgIHAgPSBGb3JtYWxQYXJhbWV0ZXIoKTsKK2lzTGFtYmRhID0gdHJ1ZTsKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICAgIGNhc2UgQ09NTUE6eworICAgICAgICAgICAgcGFyYW1zID0gRm9ybWFsTGFtYmRhUGFyYW1ldGVycygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGpqX2xhMVs5OV0gPSBqal9nZW47CisgICAgICAgICAgICA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgICBjYXNlIENIQVI6CisgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgY2FzZSBGQUxTRToKKyAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICBjYXNlIE5FVzoKKyAgICAgICAgICBjYXNlIE5VTEw6CisgICAgICAgICAgY2FzZSBTSE9SVDoKKyAgICAgICAgICBjYXNlIFNVUEVSOgorICAgICAgICAgIGNhc2UgVEhJUzoKKyAgICAgICAgICBjYXNlIFRSVUU6CisgICAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgIGNhc2UgQkFORzoKKyAgICAgICAgICBjYXNlIFRJTERFOgorICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgIGNhc2UgTUlOVVM6eworICAgICAgICAgICAgcmV0ID0gRXhwcmVzc2lvbigpOworICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgICAgIGNhc2UgQ09NTUE6eworICAgICAgICAgICAgICBwYXJhbXMgPSBJbmZlcnJlZExhbWJkYVBhcmFtZXRlcnMoKTsKK2lzTGFtYmRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGpqX2xhMVsxMDBdID0gampfZ2VuOworICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzEwMV0gPSBqal9nZW47CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEwMl0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKK2lmKCFpc0xhbWJkYSkgeyByZXQgPSBuZXcgRW5jbG9zZWRFeHByKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgcmV0KTt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldCAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldCBpbnN0YW5jZW9mIE5hbWVFeHByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChyYW5nZShyZXQuZ2V0QmVnaW4oKSwgcmV0LmdldEVuZCgpKSwgKChOYW1lRXhwcilyZXQpLmdldE5hbWUoKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgUGFyYW1ldGVyKHJhbmdlKHJldC5nZXRCZWdpbigpLCByZXQuZ2V0RW5kKCkpLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIG51bGwsIG5ldyBVbmtub3duVHlwZSgpLCBudWxsLCBmYWxzZSwgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFkZCgwLCBwYXJhbXMsIHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcCBtYXkgYmUgbnVsbCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IExhbWJkYUV4cHIocmFuZ2UocC5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgcGFyYW1zLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBORVc6eworICAgICAgcmV0ID0gQWxsb2NhdGlvbkV4cHJlc3Npb24obnVsbCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEwNl0gPSBqal9nZW47CisgICAgICBpZiAoampfMl8yOCgyMTQ3NDgzNjQ3KSkgeworICAgICAgICB0eXBlID0gUmVzdWx0VHlwZSgpOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0xBU1MpOworcmV0ID0gbmV3IENsYXNzRXhwcihyYW5nZSh0eXBlLmdldEJlZ2luKCksIHRva2VuRW5kKCkpLCB0eXBlKTsKKyAgICAgIH0gZWxzZSBpZiAoampfMl8yOSgyMTQ3NDgzNjQ3KSkgeworICAgICAgICB0eXBlID0gUmVzdWx0VHlwZSgpOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVUJMRUNPTE9OKTsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBMVDp7CisgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMDNdID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIElERU5USUZJRVI6eworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIE5FVzp7CisgICAgICAgICAgampfY29uc3VtZV90b2tlbihORVcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTA0XSA9IGpqX2dlbjsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorcmV0ID0gbmV3IFR5cGVFeHByKHR5cGUuZ2V0UmFuZ2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgTWV0aG9kUmVmZXJlbmNlRXhwcihyZXQuZ2V0UmFuZ2UoKSwgcmV0LCB0eXBlQXJncy5saXN0LCB0b2tlbi5pbWFnZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIElERU5USUZJRVI6eworICAgICAgICAgIG5hbWUgPSBTaW1wbGVOYW1lKCk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIExQQVJFTjp7CisgICAgICAgICAgICBhcmdzID0gQXJndW1lbnRzKCk7CitoYXNBcmdzPXRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzEwNV0gPSBqal9nZW47CisgICAgICAgICAgICA7CisgICAgICAgICAgfQoraWYgKGhhc0FyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbSA9IG5ldyBNZXRob2RDYWxsRXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIG51bGwsIG51bGwsIG51bGwsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldE5hbWVFeHByKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzEwN10gPSBqal9nZW47CisgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gUHJpbWFyeVN1ZmZpeChFeHByZXNzaW9uIHNjb3BlKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgaWYgKGpqXzJfMzAoMikpIHsKKyAgICAgIHJldCA9IFByaW1hcnlTdWZmaXhXaXRob3V0U3VwZXIoc2NvcGUpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBET1Q6eworICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOworcmV0ID0gbmV3IFN1cGVyRXhwcihyYW5nZShzY29wZS5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgc2NvcGUpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEwOF0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gUHJpbWFyeVN1ZmZpeFdpdGhvdXRTdXBlcihFeHByZXNzaW9uIHNjb3BlKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgICAgIFJhbmdlZExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPD8+PihudWxsKTsKKyAgICAgICAgTGlzdDxFeHByZXNzaW9uPiBhcmdzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBoYXNBcmdzID0gZmFsc2U7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIERPVDp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBUSElTOnsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihUSElTKTsKK3JldCA9IG5ldyBUaGlzRXhwcihyYW5nZShzY29wZS5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgc2NvcGUpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBORVc6eworICAgICAgICByZXQgPSBBbGxvY2F0aW9uRXhwcmVzc2lvbihzY29wZSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTExXSA9IGpqX2dlbjsKKyAgICAgICAgaWYgKGpqXzJfMzEoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICAgIGNhc2UgTFQ6eworICAgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzEwOV0gPSBqal9nZW47CisgICAgICAgICAgICA7CisgICAgICAgICAgfQorICAgICAgICAgIG5hbWUgPSBTaW1wbGVOYW1lKCk7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIExQQVJFTjp7CisgICAgICAgICAgICBhcmdzID0gQXJndW1lbnRzKCk7CitoYXNBcmdzPXRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzExMF0gPSBqal9nZW47CisgICAgICAgICAgICA7CisgICAgICAgICAgfQoraWYgKGhhc0FyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbSA9IG5ldyBNZXRob2RDYWxsRXhwcihyYW5nZShzY29wZS5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgc2NvcGUsIHR5cGVBcmdzLmxpc3QsIG51bGwsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldE5hbWVFeHByKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRBY2Nlc3NFeHByIGYgPSAgbmV3IEZpZWxkQWNjZXNzRXhwcihyYW5nZShzY29wZS5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgc2NvcGUsIHR5cGVBcmdzLmxpc3QsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnNldEZpZWxkRXhwcihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBMQlJBQ0tFVDp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKKyAgICAgIHJldCA9IEV4cHJlc3Npb24oKTsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOworcmV0ID0gbmV3IEFycmF5QWNjZXNzRXhwcihyYW5nZShzY29wZS5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgc2NvcGUsIHJldCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzExMl0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBMaXRlcmFsKCkge0V4cHJlc3Npb24gcmV0OworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6eworICAgICAgampfY29uc3VtZV90b2tlbihJTlRFR0VSX0xJVEVSQUwpOworcmV0ID0gbmV3IEludGVnZXJMaXRlcmFsRXhwcih0b2tlblJhbmdlKCksIHRva2VuLmltYWdlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTE9OR19MSVRFUkFMOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTE9OR19MSVRFUkFMKTsKK3JldCA9IG5ldyBMb25nTGl0ZXJhbEV4cHIodG9rZW5SYW5nZSgpLCB0b2tlbi5pbWFnZSk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6eworICAgICAgampfY29uc3VtZV90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKTsKK3JldCA9IG5ldyBEb3VibGVMaXRlcmFsRXhwcih0b2tlblJhbmdlKCksIHRva2VuLmltYWdlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6eworICAgICAgampfY29uc3VtZV90b2tlbihDSEFSQUNURVJfTElURVJBTCk7CityZXQgPSBuZXcgQ2hhckxpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSwgdG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDEsIHRva2VuLmltYWdlLmxlbmd0aCgpLTEpKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6eworICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7CityZXQgPSBuZXcgU3RyaW5nTGl0ZXJhbEV4cHIodG9rZW5SYW5nZSgpLCB0b2tlbi5pbWFnZS5zdWJzdHJpbmcoMSwgdG9rZW4uaW1hZ2UubGVuZ3RoKCktMSkpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBGQUxTRToKKyAgICBjYXNlIFRSVUU6eworICAgICAgcmV0ID0gQm9vbGVhbkxpdGVyYWwoKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTlVMTDp7CisgICAgICByZXQgPSBOdWxsTGl0ZXJhbCgpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMTNdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gQm9vbGVhbkxpdGVyYWwoKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIFRSVUU6eworICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKK3JldCA9IG5ldyBCb29sZWFuTGl0ZXJhbEV4cHIodG9rZW5SYW5nZSgpLCB0cnVlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgRkFMU0U6eworICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7CityZXQgPSBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSwgZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMTRdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gTnVsbExpdGVyYWwoKSB7CisgICAgampfY29uc3VtZV90b2tlbihOVUxMKTsKK3JldHVybiBuZXcgTnVsbExpdGVyYWxFeHByKHRva2VuUmFuZ2UoKSk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdDxFeHByZXNzaW9uPiBBcmd1bWVudHMoKSB7TGlzdDxFeHByZXNzaW9uPiByZXQgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBORVc6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBTVVBFUjoKKyAgICBjYXNlIFRISVM6CisgICAgY2FzZSBUUlVFOgorICAgIGNhc2UgVk9JRDoKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIExQQVJFTjoKKyAgICBjYXNlIEJBTkc6CisgICAgY2FzZSBUSUxERToKKyAgICBjYXNlIElOQ1I6CisgICAgY2FzZSBERUNSOgorICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOnsKKyAgICAgIHJldCA9IEFyZ3VtZW50TGlzdCgpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMTVdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gQXJndW1lbnRMaXN0KCkge0xpc3Q8RXhwcmVzc2lvbj4gcmV0ID0gbmV3IExpbmtlZExpc3Q8RXhwcmVzc2lvbj4oKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByOworICAgIGV4cHIgPSBFeHByZXNzaW9uKCk7CityZXQuYWRkKGV4cHIpOworICAgIGxhYmVsXzQxOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMTZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80MTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKK3JldC5hZGQoZXhwcik7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIEFsbG9jYXRpb25FeHByZXNzaW9uKEV4cHJlc3Npb24gc2NvcGUpIHtFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVHlwZSB0eXBlOworICAgICAgICBSYW5nZWRMaXN0PFR5cGU8Pz4+IHR5cGVBcmdzID0gbmV3IFJhbmdlZExpc3Q8VHlwZTw/Pj4obnVsbCk7CisgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBhbm9ueW1vdXNCb2R5ID0gbnVsbDsKKyAgICAgICAgTGlzdDxFeHByZXNzaW9uPiBhcmdzOworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICAgICAgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTkVXKTsKK2lmKHNjb3BlPT1udWxsKSB7YmVnaW49dG9rZW5CZWdpbigpO30gZWxzZSB7YmVnaW49c2NvcGUuZ2V0QmVnaW4oKTt9CisgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBTSE9SVDp7CisgICAgICB0eXBlID0gUHJpbWl0aXZlVHlwZSgpOwordHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICByZXQgPSBBcnJheUNyZWF0aW9uKGJlZ2luLCB0eXBlKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIEFUOgorICAgIGNhc2UgTFQ6eworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTFQ6eworICAgICAgICB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucygpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzExN10gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBBbm5vdGF0ZWRDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICBjYXNlIEFUOnsKKyAgICAgICAgcmV0ID0gQXJyYXlDcmVhdGlvbihiZWdpbiwgdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIExQQVJFTjp7CisgICAgICAgIGFyZ3MgPSBBcmd1bWVudHMoKTsKKyAgICAgICAgaWYgKGpqXzJfMzIoMikpIHsKKyAgICAgICAgICBhbm9ueW1vdXNCb2R5ID0gQ2xhc3NPckludGVyZmFjZUJvZHkoZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIDsKKyAgICAgICAgfQorcmV0ID0gbmV3IE9iamVjdENyZWF0aW9uRXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksIHNjb3BlLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHR5cGUsIHR5cGVBcmdzLmxpc3QsIGFyZ3MsIGFub255bW91c0JvZHkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzExOF0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTE5XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisvKgorICogVGhlIHRoaXJkIExPT0tBSEVBRCBzcGVjaWZpY2F0aW9uIGJlbG93IGlzIHRvIHBhcnNlIHRvIFByaW1hcnlTdWZmaXgKKyAqIGlmIHRoZXJlIGlzIGFuIGV4cHJlc3Npb24gYmV0d2VlbiB0aGUgIlsuLi5dIi4KKyAqLworICBmaW5hbCBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIgQXJyYXlDcmVhdGlvbihQb3NpdGlvbiBiZWdpbiwgVHlwZSB0eXBlKSB7RXhwcmVzc2lvbiBleHByID0gbnVsbDsKKyAgICAgICAgQXJyYXlJbml0aWFsaXplckV4cHIgYXJyYXlJbml0aWFsaXplckV4cHIgPSBudWxsOworICAgICAgICBMaXN0PEV4cHJlc3Npb24+IGluaXRzID0gbnVsbDsKKyAgICAgICAgTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gYWNjdW0gPSBudWxsOworICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgbGFiZWxfNDI6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGFubm90YXRpb25zID0gQW5ub3RhdGlvbnMoKTsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBGQUxTRToKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgTkVXOgorICAgICAgY2FzZSBOVUxMOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1VQRVI6CisgICAgICBjYXNlIFRISVM6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICBjYXNlIExQQVJFTjoKKyAgICAgIGNhc2UgQkFORzoKKyAgICAgIGNhc2UgVElMREU6CisgICAgICBjYXNlIElOQ1I6CisgICAgICBjYXNlIERFQ1I6CisgICAgICBjYXNlIFBMVVM6CisgICAgICBjYXNlIE1JTlVTOnsKKyAgICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMjBdID0gampfZ2VuOworICAgICAgICA7CisgICAgICB9CithY2N1bSA9IGFkZChhY2N1bSwgYW5ub3RhdGlvbnMpOyBpbml0cyA9IGFkZChpbml0cywgZXhwcik7IGFubm90YXRpb25zPW51bGw7IGV4cHI9bnVsbDsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICBjYXNlIEFUOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEyMV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzQyOworICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgTEJSQUNFOnsKKyAgICAgIGFycmF5SW5pdGlhbGl6ZXJFeHByID0gQXJyYXlJbml0aWFsaXplcigpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMjJdID0gampfZ2VuOworICAgICAgOworICAgIH0KK3JldHVybiBqdWdnbGVBcnJheUNyZWF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgdHlwZSwgaW5pdHMsIGFjY3VtLCBhcnJheUluaXRpYWxpemVyRXhwcik7CisgIH0KKworLyoKKyAqIFN0YXRlbWVudCBzeW50YXggZm9sbG93cy4KKyAqLworICBmaW5hbCBwdWJsaWMgCitTdGF0ZW1lbnQgU3RhdGVtZW50KCkge1N0YXRlbWVudCByZXQ7CisgICAgaWYgKGpqXzJfMzMoMikpIHsKKyAgICAgIHJldCA9IExhYmVsZWRTdGF0ZW1lbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVNTRVJUOnsKKyAgICAgICAgcmV0ID0gQXNzZXJ0U3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIExCUkFDRTp7CisgICAgICAgIHJldCA9IEJsb2NrKCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFNFTUlDT0xPTjp7CisgICAgICAgIHJldCA9IEVtcHR5U3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNVUEVSOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUlVFOgorICAgICAgY2FzZSBWT0lEOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIElOQ1I6CisgICAgICBjYXNlIERFQ1I6eworICAgICAgICByZXQgPSBTdGF0ZW1lbnRFeHByZXNzaW9uKCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFNXSVRDSDp7CisgICAgICAgIHJldCA9IFN3aXRjaFN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBJRjp7CisgICAgICAgIHJldCA9IElmU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFdISUxFOnsKKyAgICAgICAgcmV0ID0gV2hpbGVTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgRE86eworICAgICAgICByZXQgPSBEb1N0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBGT1I6eworICAgICAgICByZXQgPSBGb3JTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGNhc2UgQlJFQUs6eworICAgICAgICByZXQgPSBCcmVha1N0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBDT05USU5VRTp7CisgICAgICAgIHJldCA9IENvbnRpbnVlU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFJFVFVSTjp7CisgICAgICAgIHJldCA9IFJldHVyblN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBUSFJPVzp7CisgICAgICAgIHJldCA9IFRocm93U3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDp7CisgICAgICAgIHJldCA9IFN5bmNocm9uaXplZFN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBUUlk6eworICAgICAgICByZXQgPSBUcnlTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMjNdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBc3NlcnRTdG10IEFzc2VydFN0YXRlbWVudCgpIHtFeHByZXNzaW9uIGNoZWNrOworICAgICAgICBFeHByZXNzaW9uIG1zZyA9IG51bGw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTRVJUKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBjaGVjayA9IEV4cHJlc3Npb24oKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQ09MT046eworICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7CisgICAgICBtc2cgPSBFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEyNF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKK3JldHVybiBuZXcgQXNzZXJ0U3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksY2hlY2ssIG1zZyk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGFiZWxlZFN0bXQgTGFiZWxlZFN0YXRlbWVudCgpIHtTdHJpbmcgbGFiZWw7CisgICAgICAgIFN0YXRlbWVudCBzdG10OworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworYmVnaW49dG9rZW5CZWdpbigpOworbGFiZWwgPSB0b2tlbi5pbWFnZTsKKyAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKKyAgICBzdG10ID0gU3RhdGVtZW50KCk7CityZXR1cm4gbmV3IExhYmVsZWRTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxsYWJlbCwgc3RtdCk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQmxvY2tTdG10IEJsb2NrKCkge0xpc3Q8U3RhdGVtZW50PiBzdG10czsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIHN0bXRzID0gU3RhdGVtZW50cygpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKK3JldHVybiBuZXcgQmxvY2tTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgc3RtdHMpOworICB9CisKKy8qCisgKiBDbGFzc2VzIGluc2lkZSBibG9jayBzdGFtZXRlbnRzIGNhbiBvbmx5IGJlIGFic3RyYWN0IG9yIGZpbmFsLiBUaGUgc2VtYW50aWMgbXVzdCBjaGVjayBpdC4KKyAqLworICBmaW5hbCBwdWJsaWMgU3RhdGVtZW50IEJsb2NrU3RhdGVtZW50KCkge1N0YXRlbWVudCByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcjsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHR5cGVEZWNsOworICAgICAgICBNb2RpZmllckhvbGRlciBtb2RpZmllcjsKKyAgICBpZiAoampfMl8zNCgyMTQ3NDgzNjQ3KSkgeworCisgICAgICBtb2RpZmllciA9IE1vZGlmaWVycygpOworICAgICAgdHlwZURlY2wgPSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24obW9kaWZpZXIpOworcmV0ID0gbmV3IFR5cGVEZWNsYXJhdGlvblN0bXQocmFuZ2UodHlwZURlY2wuZ2V0QmVnaW4oKS5saW5lLCB0eXBlRGVjbC5nZXRCZWdpbigpLmNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKSwgdHlwZURlY2wpOworICAgIH0gZWxzZSBpZiAoampfMl8zNSgyMTQ3NDgzNjQ3KSkgeworICAgICAgZXhwciA9IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXQgPSBuZXcgRXhwcmVzc2lvblN0bXQocmFuZ2UoZXhwci5nZXRCZWdpbigpLmxpbmUsIGV4cHIuZ2V0QmVnaW4oKS5jb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiksIGV4cHIpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBBU1NFUlQ6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJSRUFLOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBDT05USU5VRToKKyAgICAgIGNhc2UgRE86CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBGT1I6CisgICAgICBjYXNlIElGOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgUkVUVVJOOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1VQRVI6CisgICAgICBjYXNlIFNXSVRDSDoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUSFJPVzoKKyAgICAgIGNhc2UgVFJVRToKKyAgICAgIGNhc2UgVFJZOgorICAgICAgY2FzZSBWT0lEOgorICAgICAgY2FzZSBXSElMRToKKyAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgY2FzZSBMQlJBQ0U6CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgIGNhc2UgSU5DUjoKKyAgICAgIGNhc2UgREVDUjp7CisgICAgICAgIHJldCA9IFN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEyNV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCkge01vZGlmaWVySG9sZGVyIG1vZGlmaWVyOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMgPSBuZXcgTGlua2VkTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXI7CisgICAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKTsKKyAgICB0eXBlID0gVHlwZSgpOworICAgIHZhciA9IFZhcmlhYmxlRGVjbGFyYXRvcigpOwordmFyaWFibGVzLmFkZCh2YXIpOworICAgIGxhYmVsXzQzOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMjZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80MzsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgdmFyID0gVmFyaWFibGVEZWNsYXJhdG9yKCk7Cit2YXJpYWJsZXMuYWRkKHZhcik7CisgICAgfQorUG9zaXRpb24gYmVnaW49bW9kaWZpZXIuYmVnaW4ub3JJZkludmFsaWQodHlwZS5nZXRCZWdpbigpKTsKKyAgICAgICAgUGFpcjxUeXBlLCBMaXN0PEFycmF5QnJhY2tldFBhaXI+PiB0eXBlTGlzdFBhaXIgPSB1bndyYXBBcnJheVR5cGVzKHR5cGUpOworICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZUxpc3RQYWlyLmEsIHZhcmlhYmxlcywgdHlwZUxpc3RQYWlyLmIpOworICB9CisKKyAgZmluYWwgcHVibGljIEVtcHR5U3RtdCBFbXB0eVN0YXRlbWVudCgpIHsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXR1cm4gbmV3IEVtcHR5U3RtdCh0b2tlblJhbmdlKCkpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0YXRlbWVudCBMYW1iZGFCb2R5KCkge0V4cHJlc3Npb24gZXhwcjsKKyAgU3RhdGVtZW50IG4gPSBudWxsOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGQUxTRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5FVzoKKyAgICBjYXNlIE5VTEw6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNVUEVSOgorICAgIGNhc2UgVEhJUzoKKyAgICBjYXNlIFRSVUU6CisgICAgY2FzZSBWT0lEOgorICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgTFBBUkVOOgorICAgIGNhc2UgQkFORzoKKyAgICBjYXNlIFRJTERFOgorICAgIGNhc2UgSU5DUjoKKyAgICBjYXNlIERFQ1I6CisgICAgY2FzZSBQTFVTOgorICAgIGNhc2UgTUlOVVM6eworICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKK24gPSBuZXcgRXhwcmVzc2lvblN0bXQocmFuZ2UoZXhwci5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgZXhwcik7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIExCUkFDRTp7CisgICAgICBuID0gQmxvY2soKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTI3XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorcmV0dXJuIG47CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvblN0bXQgU3RhdGVtZW50RXhwcmVzc2lvbigpIHtFeHByZXNzaW9uIGV4cHI7CisgICAgICAgIEFzc2lnbkV4cHIuT3BlcmF0b3Igb3A7CisgICAgICAgIEV4cHJlc3Npb24gdmFsdWU7CisgICAgICAgIFJhbmdlZExpc3Q8VHlwZTw/Pj4gdHlwZUFyZ3MgPSBuZXcgUmFuZ2VkTGlzdDxUeXBlPD8+PihudWxsKTsKKyAgICAgICAgU3RhdGVtZW50IGxhbWJkYUJvZHk7CisgICAgaWYgKGpqXzJfMzYoMikpIHsKKyAgICAgIGV4cHIgPSBQcmVJbmNyZW1lbnRFeHByZXNzaW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIERFQ1I6eworICAgICAgICBleHByID0gUHJlRGVjcmVtZW50RXhwcmVzc2lvbigpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEZBTFNFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBORVc6CisgICAgICBjYXNlIE5VTEw6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgVEhJUzoKKyAgICAgIGNhc2UgVFJVRToKKyAgICAgIGNhc2UgVk9JRDoKKyAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgTFBBUkVOOnsKKyAgICAgICAgZXhwciA9IFByaW1hcnlFeHByZXNzaW9uKCk7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgY2FzZSBQTFVTQVNTSUdOOgorICAgICAgICBjYXNlIE1JTlVTQVNTSUdOOgorICAgICAgICBjYXNlIFNUQVJBU1NJR046CisgICAgICAgIGNhc2UgU0xBU0hBU1NJR046CisgICAgICAgIGNhc2UgQU5EQVNTSUdOOgorICAgICAgICBjYXNlIE9SQVNTSUdOOgorICAgICAgICBjYXNlIFhPUkFTU0lHTjoKKyAgICAgICAgY2FzZSBSRU1BU1NJR046CisgICAgICAgIGNhc2UgTFNISUZUQVNTSUdOOgorICAgICAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKKyAgICAgICAgY2FzZSBSVU5TSUdORURTSElGVEFTU0lHTjoKKyAgICAgICAgY2FzZSBBUlJPVzoKKyAgICAgICAgY2FzZSBET1VCTEVDT0xPTjp7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIElOQ1I6eworICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihJTkNSKTsKK2V4cHIgPSBuZXcgVW5hcnlFeHByKHJhbmdlKGV4cHIuZ2V0QmVnaW4oKSwgdG9rZW5FbmQoKSksIGV4cHIsIFVuYXJ5RXhwci5PcGVyYXRvci5wb3NJbmNyZW1lbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBERUNSOnsKKyAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVDUik7CitleHByID0gbmV3IFVuYXJ5RXhwcihyYW5nZShleHByLmdldEJlZ2luKCksIHRva2VuRW5kKCkpLCBleHByLCBVbmFyeUV4cHIuT3BlcmF0b3IucG9zRGVjcmVtZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgIGNhc2UgUExVU0FTU0lHTjoKKyAgICAgICAgICBjYXNlIE1JTlVTQVNTSUdOOgorICAgICAgICAgIGNhc2UgU1RBUkFTU0lHTjoKKyAgICAgICAgICBjYXNlIFNMQVNIQVNTSUdOOgorICAgICAgICAgIGNhc2UgQU5EQVNTSUdOOgorICAgICAgICAgIGNhc2UgT1JBU1NJR046CisgICAgICAgICAgY2FzZSBYT1JBU1NJR046CisgICAgICAgICAgY2FzZSBSRU1BU1NJR046CisgICAgICAgICAgY2FzZSBMU0hJRlRBU1NJR046CisgICAgICAgICAgY2FzZSBSU0lHTkVEU0hJRlRBU1NJR046CisgICAgICAgICAgY2FzZSBSVU5TSUdORURTSElGVEFTU0lHTjp7CisgICAgICAgICAgICBvcCA9IEFzc2lnbm1lbnRPcGVyYXRvcigpOworICAgICAgICAgICAgdmFsdWUgPSBFeHByZXNzaW9uKCk7CitleHByID0gbmV3IEFzc2lnbkV4cHIocmFuZ2UoZXhwci5nZXRCZWdpbigpLCB0b2tlbkVuZCgpKSwgZXhwciwgdmFsdWUsIG9wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRE9VQkxFQ09MT046eworICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihET1VCTEVDT0xPTik7CisgICAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICAgICAgY2FzZSBMVDp7CisgICAgICAgICAgICAgIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgampfbGExWzEyOF0gPSBqal9nZW47CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6eworICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBORVc6eworICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5FVyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBqal9sYTFbMTI5XSA9IGpqX2dlbjsKKyAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorZXhwciA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKHJhbmdlKGV4cHIuZ2V0QmVnaW4oKSwgdG9rZW5FbmQoKSksIGV4cHIsIHR5cGVBcmdzLmxpc3QsIHRva2VuLmltYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQVJST1c6eworICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihBUlJPVyk7CisgICAgICAgICAgICBsYW1iZGFCb2R5ID0gTGFtYmRhQm9keSgpOworZXhwciA9IGdlbmVyYXRlTGFtYmRhKGV4cHIsIGxhbWJkYUJvZHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGpqX2xhMVsxMzBdID0gampfZ2VuOworICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMzFdID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEzMl0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RtdChyYW5nZShleHByLmdldEJlZ2luKCksIHRva2VuRW5kKCkpLCBleHByKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTd2l0Y2hTdG10IFN3aXRjaFN0YXRlbWVudCgpIHtFeHByZXNzaW9uIHNlbGVjdG9yOworICAgICAgICBTd2l0Y2hFbnRyeVN0bXQgZW50cnk7CisgICAgICAgIExpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzID0gbnVsbDsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihTV0lUQ0gpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICBzZWxlY3RvciA9IEV4cHJlc3Npb24oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOworICAgIGxhYmVsXzQ0OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDQVNFOgorICAgICAgY2FzZSBfREVGQVVMVDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMzNdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80NDsKKyAgICAgIH0KKyAgICAgIGVudHJ5ID0gU3dpdGNoRW50cnkoKTsKK2VudHJpZXMgPSBhZGQoZW50cmllcywgZW50cnkpOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CityZXR1cm4gbmV3IFN3aXRjaFN0bXQocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCBzZWxlY3RvciwgZW50cmllcyk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU3dpdGNoRW50cnlTdG10IFN3aXRjaEVudHJ5KCkge0V4cHJlc3Npb24gbGFiZWwgPSBudWxsOworICAgICAgICBMaXN0PFN0YXRlbWVudD4gc3RtdHM7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBDQVNFOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0FTRSk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgICBsYWJlbCA9IEV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgX0RFRkFVTFQ6eworICAgICAgampfY29uc3VtZV90b2tlbihfREVGQVVMVCk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEzNF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKKyAgICBzdG10cyA9IFN0YXRlbWVudHMoKTsKK3JldHVybiBuZXcgU3dpdGNoRW50cnlTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxsYWJlbCwgc3RtdHMpOworICB9CisKKyAgZmluYWwgcHVibGljIElmU3RtdCBJZlN0YXRlbWVudCgpIHtFeHByZXNzaW9uIGNvbmRpdGlvbjsKKyAgICAgICAgU3RhdGVtZW50IHRoZW5TdG10OworICAgICAgICBTdGF0ZW1lbnQgZWxzZVN0bXQgPSBudWxsOworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICBDb21tZW50IHRoZW5DbW10ID0gbnVsbDsKKyAgICBDb21tZW50IGVsc2VDbW10ID0gbnVsbDsKKyAgICBqal9jb25zdW1lX3Rva2VuKElGKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgY29uZGl0aW9uID0gRXhwcmVzc2lvbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKworICAgIHRoZW5TdG10ID0gU3RhdGVtZW50KCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIEVMU0U6eworICAgICAgampfY29uc3VtZV90b2tlbihFTFNFKTsKKworICAgICAgZWxzZVN0bXQgPSBTdGF0ZW1lbnQoKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTM1XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CitJZlN0bXQgdG1wID0gbmV3IElmU3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksY29uZGl0aW9uLCB0aGVuU3RtdCwgZWxzZVN0bXQpOworCisgICAgICAvLyBUT0RPIGNvbW1lbnQgaXMgYWx3YXlzIG51bGwKKyAgICAgIHRoZW5TdG10LnNldENvbW1lbnQodGhlbkNtbXQpOworICAgICAgaWYgKGVsc2VTdG10ICE9IG51bGwpCisgICAgICAgICAgLy8gVE9ETyBjb21tZW50IGlzIGFsd2F5cyBudWxsCisgICAgICAgICAgZWxzZVN0bXQuc2V0Q29tbWVudChlbHNlQ21tdCk7CisgICAgICByZXR1cm4gdG1wOworICB9CisKKyAgZmluYWwgcHVibGljIFdoaWxlU3RtdCBXaGlsZVN0YXRlbWVudCgpIHtFeHByZXNzaW9uIGNvbmRpdGlvbjsKKyAgICAgICAgU3RhdGVtZW50IGJvZHk7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oV0hJTEUpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICBjb25kaXRpb24gPSBFeHByZXNzaW9uKCk7CisgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgIGJvZHkgPSBTdGF0ZW1lbnQoKTsKK3JldHVybiBuZXcgV2hpbGVTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxjb25kaXRpb24sIGJvZHkpOworICB9CisKKyAgZmluYWwgcHVibGljIERvU3RtdCBEb1N0YXRlbWVudCgpIHtFeHByZXNzaW9uIGNvbmRpdGlvbjsKKyAgICAgICAgU3RhdGVtZW50IGJvZHk7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oRE8pOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIGJvZHkgPSBTdGF0ZW1lbnQoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFdISUxFKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgY29uZGl0aW9uID0gRXhwcmVzc2lvbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXR1cm4gbmV3IERvU3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksYm9keSwgY29uZGl0aW9uKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTdGF0ZW1lbnQgRm9yU3RhdGVtZW50KCkge1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhckV4cHIgPSBudWxsOworICAgICAgICBFeHByZXNzaW9uIGV4cHIgPSBudWxsOworICAgICAgICBMaXN0PEV4cHJlc3Npb24+IGluaXQgPSBudWxsOworICAgICAgICBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBib2R5OworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKEZPUik7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGlmIChqal8yXzM3KDIxNDc0ODM2NDcpKSB7CisgICAgICB2YXJFeHByID0gVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKTsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOworICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVEFUSUM6CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgIGNhc2UgQVQ6CisgICAgICBjYXNlIEJBTkc6CisgICAgICBjYXNlIFRJTERFOgorICAgICAgY2FzZSBJTkNSOgorICAgICAgY2FzZSBERUNSOgorICAgICAgY2FzZSBQTFVTOgorICAgICAgY2FzZSBNSU5VUzp7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIENIQVI6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICBjYXNlIEZBTFNFOgorICAgICAgICBjYXNlIEZJTkFMOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICBjYXNlIE5BVElWRToKKyAgICAgICAgY2FzZSBORVc6CisgICAgICAgIGNhc2UgTlVMTDoKKyAgICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgICAgY2FzZSBQVUJMSUM6CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgICBjYXNlIFNVUEVSOgorICAgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgICAgY2FzZSBUSElTOgorICAgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgIGNhc2UgVk9MQVRJTEU6CisgICAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICBjYXNlIEFUOgorICAgICAgICBjYXNlIEJBTkc6CisgICAgICAgIGNhc2UgVElMREU6CisgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgY2FzZSBERUNSOgorICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgIGNhc2UgTUlOVVM6eworICAgICAgICAgIGluaXQgPSBGb3JJbml0KCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMzZdID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIENIQVI6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICBjYXNlIEZBTFNFOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICBjYXNlIE5FVzoKKyAgICAgICAgY2FzZSBOVUxMOgorICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIFNVUEVSOgorICAgICAgICBjYXNlIFRISVM6CisgICAgICAgIGNhc2UgVFJVRToKKyAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgY2FzZSBCQU5HOgorICAgICAgICBjYXNlIFRJTERFOgorICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICBjYXNlIE1JTlVTOnsKKyAgICAgICAgICBleHByID0gRXhwcmVzc2lvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTM3XSA9IGpqX2dlbjsKKyAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgY2FzZSBGQUxTRToKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgY2FzZSBORVc6CisgICAgICAgIGNhc2UgTlVMTDoKKyAgICAgICAgY2FzZSBTSE9SVDoKKyAgICAgICAgY2FzZSBTVVBFUjoKKyAgICAgICAgY2FzZSBUSElTOgorICAgICAgICBjYXNlIFRSVUU6CisgICAgICAgIGNhc2UgVk9JRDoKKyAgICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIGNhc2UgQkFORzoKKyAgICAgICAgY2FzZSBUSUxERToKKyAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgY2FzZSBNSU5VUzp7CisgICAgICAgICAgdXBkYXRlID0gRm9yVXBkYXRlKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMzhdID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEzOV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgIGJvZHkgPSBTdGF0ZW1lbnQoKTsKK2lmICh2YXJFeHByICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcmVhY2hTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSx2YXJFeHByLCBleHByLCBib2R5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEZvclN0bXQocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLGluaXQsIGV4cHIsIHVwZGF0ZSwgYm9keSk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdDxFeHByZXNzaW9uPiBGb3JJbml0KCkge0xpc3Q8RXhwcmVzc2lvbj4gcmV0OworICAgICAgICBFeHByZXNzaW9uIGV4cHI7CisgICAgaWYgKGpqXzJfMzgoMjE0NzQ4MzY0NykpIHsKKyAgICAgIGV4cHIgPSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpOworcmV0ID0gbmV3IExpbmtlZExpc3Q8RXhwcmVzc2lvbj4oKTsgcmV0LmFkZChleHByKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBGQUxTRToKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgTkVXOgorICAgICAgY2FzZSBOVUxMOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1VQRVI6CisgICAgICBjYXNlIFRISVM6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICBjYXNlIExQQVJFTjoKKyAgICAgIGNhc2UgQkFORzoKKyAgICAgIGNhc2UgVElMREU6CisgICAgICBjYXNlIElOQ1I6CisgICAgICBjYXNlIERFQ1I6CisgICAgICBjYXNlIFBMVVM6CisgICAgICBjYXNlIE1JTlVTOnsKKyAgICAgICAgcmV0ID0gRXhwcmVzc2lvbkxpc3QoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDBdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PEV4cHJlc3Npb24+IEV4cHJlc3Npb25MaXN0KCkge0xpc3Q8RXhwcmVzc2lvbj4gcmV0ID0gbmV3IExpbmtlZExpc3Q8RXhwcmVzc2lvbj4oKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByOworICAgIGV4cHIgPSBFeHByZXNzaW9uKCk7CityZXQuYWRkKGV4cHIpOworICAgIGxhYmVsXzQ1OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQTp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDFdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80NTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKK3JldC5hZGQoZXhwcik7CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PEV4cHJlc3Npb24+IEZvclVwZGF0ZSgpIHtMaXN0PEV4cHJlc3Npb24+IHJldDsKKyAgICByZXQgPSBFeHByZXNzaW9uTGlzdCgpOworcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBCcmVha1N0bXQgQnJlYWtTdGF0ZW1lbnQoKSB7U3RyaW5nIGlkID0gbnVsbDsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihCUkVBSyk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIElERU5USUZJRVI6eworICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKK2lkID0gdG9rZW4uaW1hZ2U7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE0Ml0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKK3JldHVybiBuZXcgQnJlYWtTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxpZCk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ29udGludWVTdG10IENvbnRpbnVlU3RhdGVtZW50KCkge1N0cmluZyBpZCA9IG51bGw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09OVElOVUUpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBJREVOVElGSUVSOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CitpZCA9IHRva2VuLmltYWdlOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNDNdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXR1cm4gbmV3IENvbnRpbnVlU3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksaWQpOworICB9CisKKyAgZmluYWwgcHVibGljIFJldHVyblN0bXQgUmV0dXJuU3RhdGVtZW50KCkge0V4cHJlc3Npb24gZXhwciA9IG51bGw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUkVUVVJOKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBORVc6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBTVVBFUjoKKyAgICBjYXNlIFRISVM6CisgICAgY2FzZSBUUlVFOgorICAgIGNhc2UgVk9JRDoKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIExQQVJFTjoKKyAgICBjYXNlIEJBTkc6CisgICAgY2FzZSBUSUxERToKKyAgICBjYXNlIElOQ1I6CisgICAgY2FzZSBERUNSOgorICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOnsKKyAgICAgIGV4cHIgPSBFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE0NF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKK3JldHVybiBuZXcgUmV0dXJuU3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksZXhwcik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgVGhyb3dTdG10IFRocm93U3RhdGVtZW50KCkge0V4cHJlc3Npb24gZXhwcjsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihUSFJPVyk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXR1cm4gbmV3IFRocm93U3RtdChyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksZXhwcik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU3luY2hyb25pemVkU3RtdCBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKSB7RXhwcmVzc2lvbiBleHByOworICAgICAgICBCbG9ja1N0bXQgYmxvY2s7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oU1lOQ0hST05JWkVEKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgYmxvY2sgPSBCbG9jaygpOworcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxleHByLCBibG9jayk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgVHJ5U3RtdCBUcnlTdGF0ZW1lbnQoKSB7TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gcmVzb3VyY2VzID0gbnVsbDsKKyAgICAgICAgQmxvY2tTdG10IHRyeUJsb2NrOworICAgICAgICBCbG9ja1N0bXQgZmluYWxseUJsb2NrID0gbnVsbDsKKyAgICAgICAgTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzID0gbnVsbDsKKyAgICAgICAgQmxvY2tTdG10IGNhdGNoQmxvY2s7CisgICAgICAgIE1vZGlmaWVySG9sZGVyIGV4Y2VwdE1vZGlmaWVyOworICAgICAgICBSZWZlcmVuY2VUeXBlIGV4Y2VwdGlvblR5cGU7CisgICAgICAgIExpc3Q8UmVmZXJlbmNlVHlwZT4gZXhjZXB0aW9uVHlwZXMgPSBuZXcgTGlua2VkTGlzdDxSZWZlcmVuY2VUeXBlPigpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3JJZCBleGNlcHRJZDsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgICAgIFBvc2l0aW9uIGNhdGNoQmVnaW47CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFRSWSk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIExQQVJFTjp7CisgICAgICByZXNvdXJjZXMgPSBSZXNvdXJjZVNwZWNpZmljYXRpb24oKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTQ1XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgdHJ5QmxvY2sgPSBCbG9jaygpOworICAgIGxhYmVsXzQ2OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBDQVRDSDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80NjsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0FUQ0gpOworY2F0Y2hCZWdpbj10b2tlbkJlZ2luKCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgICBleGNlcHRNb2RpZmllciA9IE1vZGlmaWVycygpOworICAgICAgZXhjZXB0aW9uVHlwZSA9IFJlZmVyZW5jZVR5cGUoKTsKK2V4Y2VwdGlvblR5cGVzLmFkZChleGNlcHRpb25UeXBlKTsKKyAgICAgIGxhYmVsXzQ3OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBCSVRfT1I6eworICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzE0N10gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfNDc7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihCSVRfT1IpOworICAgICAgICBleGNlcHRpb25UeXBlID0gUmVmZXJlbmNlVHlwZVdpdGhBbm5vdGF0aW9ucygpOworZXhjZXB0aW9uVHlwZXMuYWRkKGV4Y2VwdGlvblR5cGUpOworICAgICAgfQorICAgICAgZXhjZXB0SWQgPSBWYXJpYWJsZURlY2xhcmF0b3JJZCgpOworICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgICAgY2F0Y2hCbG9jayA9IEJsb2NrKCk7CitpZiAoZXhjZXB0aW9uVHlwZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gbmV3IFVuaW9uVHlwZShleGNlcHRpb25UeXBlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gKFR5cGUpZXhjZXB0aW9uVHlwZXMuZ2V0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hzID0gYWRkKGNhdGNocywgbmV3IENhdGNoQ2xhdXNlKHJhbmdlKGNhdGNoQmVnaW4sIHRva2VuRW5kKCkpLCBleGNlcHRNb2RpZmllci5tb2RpZmllcnMsIGV4Y2VwdE1vZGlmaWVyLmFubm90YXRpb25zLCB0eXBlLCBleGNlcHRJZCwgY2F0Y2hCbG9jaykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uVHlwZXMgPSBuZXcgTGlua2VkTGlzdDxSZWZlcmVuY2VUeXBlPigpOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgRklOQUxMWTp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKEZJTkFMTFkpOworICAgICAgZmluYWxseUJsb2NrID0gQmxvY2soKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTQ4XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CitpZiAoZmluYWxseUJsb2NrPT1udWxsICYmIGNhdGNocz09bnVsbCAmJiByZXNvdXJjZXM9PW51bGwpIHsKKyAgICAgIGFkZFByb2JsZW0oIlRyeSBoYXMgbm8gZmluYWxseSwgbm8gY2F0Y2gsIGFuZCBubyByZXNvdXJjZXMiKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBUcnlTdG10KHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgcmVzb3VyY2VzLCB0cnlCbG9jaywgY2F0Y2hzLCBmaW5hbGx5QmxvY2spOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IFJlc291cmNlU3BlY2lmaWNhdGlvbigpIHtMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiB2YXJpYWJsZXM7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIHZhcmlhYmxlcyA9IFJlc291cmNlcygpOworICAgIGlmIChqal8yXzM5KDIpKSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworcmV0dXJuIHZhcmlhYmxlczsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiBSZXNvdXJjZXMoKSB7TGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gdmFyaWFibGVzID0gbmV3IExpbmtlZExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+KCk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhcjsKKyAgICAvKnRoaXMgaXMgYSBiaXQgbW9yZSBsZW5pZW50IHRoYW4gd2UgbmVlZCB0byBiZSwgZWcgYWxsb3dpbmcgYWNjZXNzIG1vZGlmaWVycyBsaWtlIHByaXZhdGUqLworICAgICAgdmFyID0gVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKTsKK3ZhcmlhYmxlcy5hZGQodmFyKTsKKyAgICBsYWJlbF80ODoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfNDAoMikpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNDg7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgICB2YXIgPSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpOwordmFyaWFibGVzLmFkZCh2YXIpOworICAgIH0KK3JldHVybiB2YXJpYWJsZXM7CisgIH0KKworLyogV2UgdXNlIHByb2R1Y3Rpb25zIHRvIG1hdGNoID4+PiwgPj4gYW5kID4gc28gdGhhdCB3ZSBjYW4ga2VlcCB0aGUKKyAqIHR5cGUgZGVjbGFyYXRpb24gc3ludGF4IHdpdGggZ2VuZXJpY3MgY2xlYW4KKyAqLworICBmaW5hbCBwdWJsaWMgCit2b2lkIFJVTlNJR05FRFNISUZUKCkgeworICAgIGlmIChnZXRUb2tlbigxKS5raW5kID09IEdUICYmCisgICAgICAgICAgICAgICAgICAgICgoR1RUb2tlbilnZXRUb2tlbigxKSkucmVhbEtpbmQgPT0gUlVOU0lHTkVEU0hJRlQpIHsKKworICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKEdUKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKEdUKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKEdUKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyB2b2lkIFJTSUdORURTSElGVCgpIHsKKyAgICBpZiAoZ2V0VG9rZW4oMSkua2luZCA9PSBHVCAmJgorICAgICAgICAgICAgICAgICAgICAoKEdUVG9rZW4pZ2V0VG9rZW4oMSkpLnJlYWxLaW5kID09IFJTSUdORURTSElGVCkgeworCisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICB9CisKKy8qIEFubm90YXRpb24gc3ludGF4IGZvbGxvd3MuICovCisgIGZpbmFsIHB1YmxpYyAKK0xpc3Q8QW5ub3RhdGlvbkV4cHI+IEFubm90YXRpb25zKCkge0xpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbnVsbDsKKyAgICAgICAgQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvbjsKKyAgICBsYWJlbF80OToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVQ6eworICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTQ5XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfNDk7CisgICAgICB9CisgICAgICBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbigpOworYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubm90YXRpb24pOworICAgIH0KK3JldHVybiBhbm5vdGF0aW9uczsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBbm5vdGF0aW9uRXhwciBBbm5vdGF0aW9uKCkge0Fubm90YXRpb25FeHByIHJldDsKKyAgICBpZiAoampfMl80MSgyMTQ3NDgzNjQ3KSkgeworICAgICAgcmV0ID0gTm9ybWFsQW5ub3RhdGlvbigpOworICAgIH0gZWxzZSBpZiAoampfMl80MigyMTQ3NDgzNjQ3KSkgeworICAgICAgcmV0ID0gU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBBVDp7CisgICAgICAgIHJldCA9IE1hcmtlckFubm90YXRpb24oKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNTBdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorcmV0dXJuIHJldDsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwciBOb3JtYWxBbm5vdGF0aW9uKCkge05hbWVFeHByIG5hbWU7CisgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycyA9IG51bGw7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQVQpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIG5hbWUgPSBOYW1lKCk7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBJREVOVElGSUVSOnsKKyAgICAgIHBhaXJzID0gTWVtYmVyVmFsdWVQYWlycygpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNTFdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CityZXR1cm4gbmV3IE5vcm1hbEFubm90YXRpb25FeHByKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxuYW1lLCBwYWlycyk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIgTWFya2VyQW5ub3RhdGlvbigpIHtOYW1lRXhwciBuYW1lOworICAgICAgICBQb3NpdGlvbiBiZWdpbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKEFUKTsKK2JlZ2luPXRva2VuQmVnaW4oKTsKKyAgICBuYW1lID0gTmFtZSgpOworcmV0dXJuIG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksbmFtZSk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHtOYW1lRXhwciBuYW1lOworICAgICAgICBFeHByZXNzaW9uIG1lbWJlclZhbDsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihBVCk7CitiZWdpbj10b2tlbkJlZ2luKCk7CisgICAgbmFtZSA9IE5hbWUoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgbWVtYmVyVmFsID0gTWVtYmVyVmFsdWUoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CityZXR1cm4gbmV3IFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxuYW1lLCBtZW1iZXJWYWwpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBNZW1iZXJWYWx1ZVBhaXJzKCkge0xpc3Q8TWVtYmVyVmFsdWVQYWlyPiByZXQgPSBuZXcgTGlua2VkTGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7CisgICAgICAgIE1lbWJlclZhbHVlUGFpciBwYWlyOworICAgIHBhaXIgPSBNZW1iZXJWYWx1ZVBhaXIoKTsKK3JldC5hZGQocGFpcik7CisgICAgbGFiZWxfNTA6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOnsKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzE1Ml0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzUwOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBwYWlyID0gTWVtYmVyVmFsdWVQYWlyKCk7CityZXQuYWRkKHBhaXIpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTWVtYmVyVmFsdWVQYWlyIE1lbWJlclZhbHVlUGFpcigpIHtTdHJpbmcgbmFtZTsKKyAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZTsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKK25hbWUgPSB0b2tlbi5pbWFnZTsgYmVnaW49dG9rZW5CZWdpbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKKyAgICB2YWx1ZSA9IE1lbWJlclZhbHVlKCk7CityZXR1cm4gbmV3IE1lbWJlclZhbHVlUGFpcihyYW5nZShiZWdpbiwgdG9rZW5FbmQoKSksbmFtZSwgdmFsdWUpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gTWVtYmVyVmFsdWUoKSB7RXhwcmVzc2lvbiByZXQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIEFUOnsKKyAgICAgIHJldCA9IEFubm90YXRpb24oKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgTEJSQUNFOnsKKyAgICAgIHJldCA9IE1lbWJlclZhbHVlQXJyYXlJbml0aWFsaXplcigpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGQUxTRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5FVzoKKyAgICBjYXNlIE5VTEw6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNVUEVSOgorICAgIGNhc2UgVEhJUzoKKyAgICBjYXNlIFRSVUU6CisgICAgY2FzZSBWT0lEOgorICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgTFBBUkVOOgorICAgIGNhc2UgQkFORzoKKyAgICBjYXNlIFRJTERFOgorICAgIGNhc2UgSU5DUjoKKyAgICBjYXNlIERFQ1I6CisgICAgY2FzZSBQTFVTOgorICAgIGNhc2UgTUlOVVM6eworICAgICAgcmV0ID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE1M10gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKSB7TGlzdDxFeHByZXNzaW9uPiByZXQgPSBuZXcgTGlua2VkTGlzdDxFeHByZXNzaW9uPigpOworICAgICAgICBFeHByZXNzaW9uIG1lbWJlcjsKKyAgICAgICAgUG9zaXRpb24gYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOworYmVnaW49dG9rZW5CZWdpbigpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250a19mKCk6ampfbnRrKSB7CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGQUxTRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5FVzoKKyAgICBjYXNlIE5VTEw6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNVUEVSOgorICAgIGNhc2UgVEhJUzoKKyAgICBjYXNlIFRSVUU6CisgICAgY2FzZSBWT0lEOgorICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgTFBBUkVOOgorICAgIGNhc2UgTEJSQUNFOgorICAgIGNhc2UgQVQ6CisgICAgY2FzZSBCQU5HOgorICAgIGNhc2UgVElMREU6CisgICAgY2FzZSBJTkNSOgorICAgIGNhc2UgREVDUjoKKyAgICBjYXNlIFBMVVM6CisgICAgY2FzZSBNSU5VUzp7CisgICAgICBtZW1iZXIgPSBNZW1iZXJWYWx1ZSgpOworcmV0LmFkZChtZW1iZXIpOworICAgICAgbGFiZWxfNTE6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoampfMl80MygyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF81MTsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgICAgbWVtYmVyID0gTWVtYmVyVmFsdWUoKTsKK3JldC5hZGQobWVtYmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTU0XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIENPTU1BOnsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNTVdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CityZXR1cm4gbmV3IEFycmF5SW5pdGlhbGl6ZXJFeHByKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSxyZXQpOworICB9CisKKy8qIEFubm90YXRpb24gVHlwZXMuICovCisgIGZpbmFsIHB1YmxpYyAKK0Fubm90YXRpb25EZWNsYXJhdGlvbiBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKE1vZGlmaWVySG9sZGVyIG1vZGlmaWVyKSB7TmFtZUV4cHIgbmFtZTsKKyAgICAgICAgTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IG1lbWJlcnM7CisgICAgICAgIFBvc2l0aW9uIGJlZ2luID0gbW9kaWZpZXIuYmVnaW47CisgICAgampfY29uc3VtZV90b2tlbihBVCk7CitiZWdpbj1iZWdpbi5vcklmSW52YWxpZCh0b2tlbkJlZ2luKCkpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5URVJGQUNFKTsKKyAgICBuYW1lID0gTmFtZSgpOworICAgIG1lbWJlcnMgPSBBbm5vdGF0aW9uVHlwZUJvZHkoKTsKK0Fubm90YXRpb25EZWNsYXJhdGlvbiB0bXAgPSBuZXcgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKHJhbmdlKGJlZ2luLCB0b2tlbkVuZCgpKSwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgbnVsbCwgbWVtYmVycyk7CisgICAgICB0bXAuc2V0TmFtZUV4cHIobmFtZSk7CisgICAgICByZXR1cm4gdG1wOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBBbm5vdGF0aW9uVHlwZUJvZHkoKSB7TGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IHJldCA9IG51bGw7CisgICAgICAgIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXI7CisgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOworICAgIGxhYmVsXzUyOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgQ0xBU1M6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgIGNhc2UgRklOQUw6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIElOVEVSRkFDRToKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgTkFUSVZFOgorICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgIGNhc2UgU1RSSUNURlA6CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgY2FzZSBWT0xBVElMRToKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgY2FzZSBBVDp7CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNTZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF81MjsKKyAgICAgIH0KKyAgICAgIG1lbWJlciA9IEFubm90YXRpb25Cb2R5RGVjbGFyYXRpb24oKTsKK3JldCA9IGFkZChyZXQsIG1lbWJlcik7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKK3JldHVybiByZXQ7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQm9keURlY2xhcmF0aW9uPD8+IEFubm90YXRpb25Cb2R5RGVjbGFyYXRpb24oKSB7TW9kaWZpZXJIb2xkZXIgbW9kaWZpZXI7CisgICBCb2R5RGVjbGFyYXRpb24gcmV0OworCisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICBjYXNlIFNFTUlDT0xPTjp7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CityZXQgPSBuZXcgRW1wdHlUeXBlRGVjbGFyYXRpb24odG9rZW5SYW5nZSgpKTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBDTEFTUzoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEVOVU06CisgICAgY2FzZSBGSU5BTDoKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgSU5URVJGQUNFOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5BVElWRToKKyAgICBjYXNlIFBSSVZBVEU6CisgICAgY2FzZSBQUk9URUNURUQ6CisgICAgY2FzZSBQVUJMSUM6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNUQVRJQzoKKyAgICBjYXNlIFNUUklDVEZQOgorICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgIGNhc2UgVFJBTlNJRU5UOgorICAgIGNhc2UgVk9MQVRJTEU6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgQVQ6eworICAgICAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKTsKKyAgICAgIGlmIChqal8yXzQ0KDIxNDc0ODM2NDcpKSB7CisgICAgICAgIHJldCA9IEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrX2YoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBDTEFTUzoKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0U6eworICAgICAgICAgIHJldCA9IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIEVOVU06eworICAgICAgICAgIHJldCA9IEVudW1EZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIEFUOnsKKyAgICAgICAgICByZXQgPSBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIENIQVI6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIElERU5USUZJRVI6eworICAgICAgICAgIHJldCA9IEZpZWxkRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTU3XSA9IGpqX2dlbjsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNThdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CityZXR1cm4gcmV0OworICB9CisKKyAgZmluYWwgcHVibGljIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uKE1vZGlmaWVySG9sZGVyIG1vZGlmaWVyKSB7VHlwZSB0eXBlOworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgRXhwcmVzc2lvbiBkZWZhdWx0VmFsID0gbnVsbDsKKyAgICB0eXBlID0gVHlwZSgpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CituYW1lID0gdG9rZW4uaW1hZ2U7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGtfZigpOmpqX250aykgeworICAgIGNhc2UgX0RFRkFVTFQ6eworICAgICAgZGVmYXVsdFZhbCA9IERlZmF1bHRWYWx1ZSgpOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNTldID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CitQb3NpdGlvbiBiZWdpbiA9IG1vZGlmaWVyLmJlZ2luLm9ySWZJbnZhbGlkKHRva2VuQmVnaW4oKSk7CisgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24ocmFuZ2UoYmVnaW4sIHRva2VuRW5kKCkpLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCB0eXBlLCBuYW1lLCBkZWZhdWx0VmFsKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIERlZmF1bHRWYWx1ZSgpIHtFeHByZXNzaW9uIHJldDsKKyAgICBqal9jb25zdW1lX3Rva2VuKF9ERUZBVUxUKTsKKyAgICByZXQgPSBNZW1iZXJWYWx1ZSgpOworcmV0dXJuIHJldDsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzEoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMyhpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzQoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl81KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNihpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDUsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzcoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl84KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM184KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNywgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfOShpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfOSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDgsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzEwKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDksIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzExKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDEwLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8xMihpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxMSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTMoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTIsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzE0KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xNCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDEzLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8xNShpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTUoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxNCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTYoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTUsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzE3KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xNygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE2LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8xOChpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTgoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxNywgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTkoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE5KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTgsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzIwKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE5LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yMShpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyMCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjIoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzIyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjEsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzIzKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yMygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIyLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yNChpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyMywgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjUoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI1KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjQsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzI2KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yNigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI1LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yNyhpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyNiwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjgoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI4KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjcsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzI5KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yOSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI4LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zMChpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzAoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyOSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzEoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMxKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzAsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzMyKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zMigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDMxLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zMyhpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzMiwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzQoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM0KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzMsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzM1KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zNSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM0LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zNihpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzNSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzcoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM3KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzYsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzM4KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zOCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM3LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zOShpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzOCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDAoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzksIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzQxKGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180MSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQwLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl80MihpbnQgeGxhKQorIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0MSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDMoaW50IHhsYSkKKyB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDIsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ0KGludCB4bGEpCisgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180NCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQzLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zOCgpCisgeworICAgIGlmIChqal8zUl85NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNjgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNDEoKQorIHsKKyAgICBpZiAoampfM1JfMzQ1KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNzMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzg1KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxTRSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3NygpCisgeworICAgIGlmIChqal8zUl85MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI3KCkKKyB7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl80MjkoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU5KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE1OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yMSgpCisgeworICAgIGlmIChqal8zUl84MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yMCgpCisgeworICAgIGlmIChqal8zUl84MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI2KCkKKyB7CisgICAgaWYgKGpqXzNSXzQyNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODEoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMU0hJRlQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAyKCkKKyB7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl83OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTU4KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8xNTkoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihHVCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzE5KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzgxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzIwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzIxKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzM0MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI1KCkKKyB7CisgICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNDIoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlNUQU5DRU9GKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzY4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzkoKQorIHsKKyAgICBpZiAoampfM1JfMzQxKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzE5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxOSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MjUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQyNigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2NCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEdFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2MygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2MigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2MSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3NigpCisgeworICAgIGlmIChqal8zUl8xNjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0NigpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNjEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzM2MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzYzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zNjQoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzMzOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zNygpCisgeworICAgIGlmIChqal8zUl85NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDIoKQorIHsKKyAgICBpZiAoampfM1JfMTAxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNjcoKQorIHsKKyAgICBpZiAoampfM1JfMTgzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NigpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8xMDIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzc2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzc3KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwMSgpCisgeworICAgIGlmIChqal8zUl80MTkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4NygpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzM3KCkKKyB7CisgICAgaWYgKGpqXzNSXzMzOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzQ2KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4NigpCisgeworICAgIGlmIChqal8zUl85NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM2NygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzgoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfQU5EKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMxNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI1KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRk9SKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM4NigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzg3KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjc3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzIoKQorIHsKKyAgICBpZiAoampfM1JfMzM3KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNDIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUxKCkKKyB7CisgICAgaWYgKGpqXzNSXzY2KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQ0KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTkUpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQzKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVEpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM0MygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzQ0KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfM1JfMzMyKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihYT1IpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjg1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihETykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNzcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oV0hJTEUpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfODAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1MCgpCisgeworICAgIGlmIChqal8zUl8zNjYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEJJVF9PUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNCgpCisgeworICAgIGlmIChqal8zUl8zMzIoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM0MCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzEoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihFTlVNKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNTAoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNTEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDExMykpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzUyKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFdISUxFKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNDX0FORCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yMzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NSgpCisgeworICAgIGlmIChqal8zUl8zMTQoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzMzOCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjcoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTQ19PUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yMDcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3NSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI1MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzY2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU1QTEVNRU5UUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNTEoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM3NSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjUoKQorIHsKKyAgICBpZiAoampfM1JfMjg1KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zMzMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUYpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfODAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI3NygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzg1KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzNygpCisgeworICAgIGlmIChqal8zUl8yNjUoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzMxNSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNzQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNTEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2NSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFMpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjUxKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNzQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA3KCkKKyB7CisgICAgaWYgKGpqXzNSXzIzNygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjg2KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxOCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKF9ERUZBVUxUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxNygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENBU0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfODAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4OSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVSRkFDRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNDkoKQorIHsKKyAgICBpZiAoampfM1JfMzY2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzYoKQorIHsKKyAgICBpZiAoampfM1JfMjA3KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8yNjcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQ4KCkKKyB7CisgICAgaWYgKGpqXzNSXzM2NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQxNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDE4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNjAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0NygpCisgeworICAgIGlmIChqal8zUl8xMDMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3MCgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDQ1KSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI4OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM0NygpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM0OCgpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM0OSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl85MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUwKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTQ5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDEoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEyOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzg0KCkKKyB7CisgICAgaWYgKGpqXzNSXzQwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI5KCkKKyB7CisgICAgaWYgKGpqXzNSXzE3NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjQxKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNXSVRDSCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzg0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyOCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE9SQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyNCgpCisgeworICAgIGlmIChqal8zUl83NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI3KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oWE9SQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyNigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFOREFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjUoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSVU5TSUdORURTSElGVEFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSU0lHTkVEU0hJRlRBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIzKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFNISUZUQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxNigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFSUk9XKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI2OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVNBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIxKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUExVU0FTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTUoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1VCTEVDT0xPTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MjQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMykpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDY4KSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjAoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSRU1BU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDE0KCkKKyB7CisgICAgaWYgKGpqXzNSXzc5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE5KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0xBU0hBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE4KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RBUkFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihERUNSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTIoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTkNSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5OSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MTIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQxMygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDE0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80MTUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQxNigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc5KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzExNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTE4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMTkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEyMCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTIxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMjIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEyMygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTI0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMjUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEyNigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTI3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMjgoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzM2KCkKKyB7CisgICAgaWYgKGpqXzNSXzI2NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzk5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMzNSgpCisgeworICAgIGlmIChqal8zUl8yMTYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2OSgpCisgeworICAgIGlmIChqal8zUl83NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zNigpCisgeworICAgIGlmIChqal8zUl85NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQzKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9VQkxFQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjY5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfc2Nhbl90b2tlbigxMDMpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbig2OCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMzNSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzM2KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzY1KCkKKyB7CisgICAgaWYgKGpqXzNSXzEwMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNjQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVFJJQ1RGUCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFZPTEFUSUxFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVFJBTlNJRU5UKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYxKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTkFUSVZFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYwKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1lOQ0hST05JWkVEKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4OCgpCisgeworICAgIGlmIChqal8zUl8xMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU5KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQUJTVFJBQ1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNTgoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihGSU5BTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzE4KCkKKyB7CisgICAgaWYgKGpqXzNSXzc5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVJST1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjY4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBSSVZBVEUpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNTYoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihQUk9URUNURUQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEzKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI0MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjQzKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4NygpCisgeworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNTUoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVEFUSUMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNTQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihQVUJMSUMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODAoKQorIHsKKyAgICBpZiAoampfM1JfMTI5KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMTMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzU0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl81NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNTYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzU3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl81OCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNTkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzYwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl82MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNjIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzYzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl82NCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNjUoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY4KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI4NygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjg4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfOTUoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18yKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxOSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzM1KCkKKyB7CisgICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NigpCisgeworICAgIGlmIChqal8zUl85NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNjgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE0OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTUwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zNCgpCisgeworICAgIGlmIChqal8zUl85NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfc2Nhbl90b2tlbig0NSkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDY1KSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTUoKQorIHsKKyAgICBpZiAoampfM1JfMjc3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zODMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18xNygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU0KCkKKyB7CisgICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85OCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xNygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MygpCisgeworICAgIGlmIChqal8zUl83OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihQQUNLQUdFKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTMoKQorIHsKKyAgICBpZiAoampfM1JfOTUoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI3MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ3KCkKKyB7CisgICAgaWYgKGpqXzNSXzY4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDYoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihWT0lEKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMCgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNTMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI1NCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjU1KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMSgpCisgeworICAgIGlmIChqal8zUl81MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfOTEoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTQ2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNDcoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDAoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1VCTEUpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE2MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM5KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRkxPQVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM4KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTE9ORykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzcoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0hPUlQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM1KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQllURSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzNCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENIQVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMzKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQk9PTEVBTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVVBFUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl83OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzg3KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzEzMygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTM0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMzUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEzNigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTM3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMzgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEzOSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTQwKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA0KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTc1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTIoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihFWFRFTkRTKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzc4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl83NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg0KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzMxMigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzEzKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE4KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTRVJUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA4KCkKKyB7CisgICAgaWYgKGpqXzNSXzMzMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA3KCkKKyB7CisgICAgaWYgKGpqXzNSXzMzMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA2KCkKKyB7CisgICAgaWYgKGpqXzNSXzMyOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA1KCkKKyB7CisgICAgaWYgKGpqXzNSXzMyOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA0KCkKKyB7CisgICAgaWYgKGpqXzNSXzMyNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAzKCkKKyB7CisgICAgaWYgKGpqXzNSXzMyNigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSE9PSykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yODQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAyKCkKKyB7CisgICAgaWYgKGpqXzNSXzMyNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAxKCkKKyB7CisgICAgaWYgKGpqXzNSXzMyNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAwKCkKKyB7CisgICAgaWYgKGpqXzNSXzMyMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk5KCkKKyB7CisgICAgaWYgKGpqXzNSXzMyMigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk4KCkKKyB7CisgICAgaWYgKGpqXzNSXzMyMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk3KCkKKyB7CisgICAgaWYgKGpqXzNSXzMyMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA2KCkKKyB7CisgICAgaWYgKGpqXzNSXzIzNigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk2KCkKKyB7CisgICAgaWYgKGpqXzNSXzMxOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA1KCkKKyB7CisgICAgaWYgKGpqXzNSXzc1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTUoKQorIHsKKyAgICBpZiAoampfM1JfMTA2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTQoKQorIHsKKyAgICBpZiAoampfM1JfMzE4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzUoKQorIHsKKyAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIwNSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjA2KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zMygpCisgeworICAgIGlmIChqal8zUl85NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE1KCkKKyB7CisgICAgaWYgKGpqXzNSXzE3NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjA0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NygpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzMzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yOTQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI5NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjk2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yOTcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI5OCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjk5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMDAoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMwMSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzAyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMDMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMwNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzA1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMDYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMwNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzA4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83NygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzExNSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTYoKQorIHsKKyAgICBpZiAoampfM1JfNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzIoKQorIHsKKyAgICBpZiAoampfM1JfOTMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTUoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1QpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzE2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMSgpCisgeworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgzKCkKKyB7CisgICAgaWYgKGpqXzNSXzE2MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgyKCkKKyB7CisgICAgaWYgKGpqXzNSXzc4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzMxMSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICBpZiAoampfM1JfMjgyKCkpIHJldHVybiB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzI4MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI4MygpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzE0KCkKKyB7CisgICAgaWYgKGpqXzNSXzc3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzE1KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjQoKQorIHsKKyAgICBpZiAoampfM1JfMTYzKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzMyKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MygpCisgeworICAgIGlmIChqal8zUl8yNjEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MigpCisgeworICAgIGlmIChqal8zUl83NygpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzNSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNjIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjUxKCkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI2MygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjY0KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM0KCkKKyB7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yNjEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MSgpCisgeworICAgIGlmIChqal8zUl83OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTc0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzEzKCkKKyB7CisgICAgaWYgKGpqXzNSXzc2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MjgoKQorIHsKKyAgICBpZiAoampfM1JfNDMwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDAoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihORVcpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIzNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjM1KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18xMigpCisgeworICAgIGlmIChqal8zUl83NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzU1KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVEhST1dTKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzM3MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzcxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc2KCkKKyB7CisgICAgaWYgKGpqXzNSXzc4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIxKCkKKyB7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8yNTYoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk1KCkKKyB7CisgICAgaWYgKGpqXzNSXzIyMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE0KCkKKyB7CisgICAgaWYgKGpqXzNSXzE3NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTk1KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMygpCisgeworICAgIGlmIChqal8zUl84NygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgaWYgKGpqXzNfMTIoKSkgcmV0dXJuIHRydWU7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83NSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMTMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzExNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1OCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE5VTEwpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjc5KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRkFMU0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjc4KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVFJVRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDQoKQorIHsKKyAgICBpZiAoampfM1JfODcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTEoKQorIHsKKyAgICBpZiAoampfM1JfNzUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzY4KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEwNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NygpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNzgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI3OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzMCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKF9ERUZBVUxUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI4KCkKKyB7CisgICAgaWYgKGpqXzNSXzI1OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI3KCkKKyB7CisgICAgaWYgKGpqXzNSXzI1NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSU5HX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA1KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RBVElDKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENIQVJBQ1RFUl9MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyMygpCisgeworICAgIGlmIChqal8zUl82OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQyOCgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83MCgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMDUoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTA2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NCgpCisgeworICAgIGlmIChqal8zUl8yMjAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDQoKQorIHsKKyAgICBpZiAoampfM1JfNjgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTEoKQorIHsKKyAgICBpZiAoampfM1JfMjc0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjAoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTk0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxMCgpCisgeworICAgIGlmIChqal8zUl8yNzIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExPTkdfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzkoKQorIHsKKyAgICBpZiAoampfM1JfNzMoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwOSgpCisgeworICAgIGlmIChqal8zUl8yNzEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwOCgpCisgeworICAgIGlmIChqal8zUl8yNzAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVHRVJfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MDcoKQorIHsKKyAgICBpZiAoampfM1JfNDIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83NCgpCisgeworICAgIGlmIChqal8zUl83NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY1KCkKKyB7CisgICAgaWYgKGpqXzNSXzc3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzEwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzc0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVEhJUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjQoKQorIHsKKyAgICBpZiAoampfM1JfNzMoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkyKCkKKyB7CisgICAgaWYgKGpqXzNSXzc3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTYoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjIyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMjMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIyNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjI1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMjYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIyNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjI4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOTQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE2NCgpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE2NSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNVUEVSKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE2MygpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQzKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfODAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zMSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl85MigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzk1KCkKKyB7CisgICAgaWYgKGpqXzNSXzk1KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQwOCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDA5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80MTAoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQxMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2MigpCisgeworICAgIGlmIChqal8zUl83NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA5KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE2MigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFRISVMpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTYzKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTIoKQorIHsKKyAgICBpZiAoampfM1JfMTYzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNzgoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzk0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zOTUoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTEoKQorIHsKKyAgICBpZiAoampfM1JfNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4MSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMTEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjAyKCkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIxMigpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNjgoKQorIHsKKyAgICBpZiAoampfM1JfMzc4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODAoKQorIHsKKyAgICBpZiAoampfM1JfMjAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83MigpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMDkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzExMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3OSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRISVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUzKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM2OCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTkoKQorIHsKKyAgICBpZiAoampfM1JfMjgwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzgoKQorIHsKKyAgICBpZiAoampfM1JfNzIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVMTElQU0lTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0MigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xNzkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE4MCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTgxKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwOSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzkwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl84OSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xNDIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE0MygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1NigpCisgeworICAgIGlmIChqal8zUl83MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlRFUkZBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfOTgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzM1MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcxKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzcwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTcoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8zMTYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5MCgpCisgeworICAgIGlmIChqal8zUl8xMDMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0MSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNVUEVSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3MygpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yOTAoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjAyKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8zNTQoKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzU1KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzU2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE2MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzM0KCkKKyB7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM180MygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzMwKCkKKyB7CisgICAgaWYgKGpqXzNSXzg5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDEoKQorIHsKKyAgICBpZiAoampfM1JfNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3OSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzkwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl84OCgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzMwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODkoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzM0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfc2Nhbl90b2tlbigxMTMpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDMoKQorIHsKKyAgICBpZiAoampfM1JfMTYzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTQoKQorIHsKKyAgICBpZiAoampfM1JfMTI5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTMoKQorIHsKKyAgICBpZiAoampfM1JfMTg5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzMoKQorIHsKKyAgICBpZiAoampfM1JfMjAyKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMDMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUyKCkKKyB7CisgICAgaWYgKGpqXzNSXzEwMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yOSgpCisgeworICAgIGlmIChqal8zUl85MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1VCTEVDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzI4KCkKKyB7CisgICAgaWYgKGpqXzNSXzkxKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKENMQVNTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkwKCkKKyB7CisgICAgaWYgKGpqXzNSXzk1KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl82OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTQ0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE0NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE1MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTUzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNTQoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM183KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2MCgpCisgeworICAgIGlmIChqal8zUl8yODEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3MigpCisgeworICAgIGlmIChqal8zUl85MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1VCTEVDT0xPTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMDEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDEwMykpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDY4KSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzYoKQorIHsKKyAgICBpZiAoampfM1JfMjkzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzEoKQorIHsKKyAgICBpZiAoampfM1JfOTEoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0xBU1MpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE0NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcwKCkKKyB7CisgICAgaWYgKGpqXzNSXzIwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgxKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTQ1KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zMTAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yNygpCisgeworICAgIGlmIChqal8zUl85MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkzKCkKKyB7CisgICAgaWYgKGpqXzNSXzMxNigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzE3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1OCgpCisgeworICAgIGlmIChqal8zUl83NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMzKCkKKyB7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNjAoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgwKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfOTAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzMwOSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzIoKQorIHsKKyAgICBpZiAoampfM1JfOTAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI1OSgpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTkoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjMyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMzMoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzEoKQorIHsKKyAgICBpZiAoampfM1JfNzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2OSgpCisgeworICAgIGlmIChqal8zUl85MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzc5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk5KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjkoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTk5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5OCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVUJMRUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIzMSgpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oMTAzKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oNjgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1NCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNjkoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfOTgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDIoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl85OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM180MSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl85OSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbigxMDcpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMCgpCisgeworICAgIGlmIChqal8zUl8xNjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNzYoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcwKCkKKyB7CisgICAgaWYgKGpqXzNSXzc4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl83NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk3KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIyOSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMDIoKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjMwKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyOSgpCisgeworICAgIGlmIChqal8zUl83NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM180MCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl85NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yNigpCisgeworICAgIGlmIChqal8zUl84OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU3KCkKKyB7CisgICAgaWYgKGpqXzNSXzE5MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgyKCkKKyB7CisgICAgaWYgKGpqXzNSXzc2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjgoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVVBFUikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xOTcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE5OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NigpCisgeworICAgIGlmIChqal8zUl8xOTEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2NygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRISVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU1KCkKKyB7CisgICAgaWYgKGpqXzNSXzE5MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY2KCkKKyB7CisgICAgaWYgKGpqXzNSXzE5NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkyKCkKKyB7CisgICAgaWYgKGpqXzNSXzcxKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcyKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzcwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNjAoKQorIHsKKyAgICBpZiAoampfM1JfMTA2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTIoKQorIHsKKyAgICBpZiAoampfM1JfODkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1OSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRIUk9XUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8zNzAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM3MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTEoKQorIHsKKyAgICBpZiAoampfM1JfMTAzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTEoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTY2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNjcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE2OCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTY5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNzAoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE3MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTcyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNzMoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDEoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTU1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNTYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE1NygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzUoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjkxKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzkxKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl85OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzU0KCkpIHJldHVybiB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM1OCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM1OSgpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM2MCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbigxMTIpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjUoKQorIHsKKyAgICBpZiAoampfM1JfODgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNigpCisgeworICAgIGlmIChqal8zUl8xMDEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc4KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzExNigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzAoKQorIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNzMoKQorIHsKKyAgICBpZiAoampfM1JfMTExKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8xMTIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMxKCkKKyB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2MSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yOTIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDExMykpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgyKCkKKyB7CisgICAgampfbG9va2luZ0FoZWFkID0gdHJ1ZTsKKyAgICBqal9zZW1MQSA9IGdldFRva2VuKDEpLmtpbmQgPT0gR1QgJiYKKyAgICAgICAgICAgICAgICAoKEdUVG9rZW4pZ2V0VG9rZW4oMSkpLnJlYWxLaW5kID09IFJTSUdORURTSElGVDsKKyAgICBqal9sb29raW5nQWhlYWQgPSBmYWxzZTsKKyAgICBpZiAoIWpqX3NlbUxBIHx8IGpqXzNSXzEzMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihHVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwOCgpCisgeworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA3KCkKKyB7CisgICAgaWYgKGpqXzNSXzE2MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg0KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzcxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjYoKQorIHsKKyAgICBpZiAoampfM1JfMTExKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzI1KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgzKCkKKyB7CisgICAgampfbG9va2luZ0FoZWFkID0gdHJ1ZTsKKyAgICBqal9zZW1MQSA9IGdldFRva2VuKDEpLmtpbmQgPT0gR1QgJiYKKyAgICAgICAgICAgICAgICAoKEdUVG9rZW4pZ2V0VG9rZW4oMSkpLnJlYWxLaW5kID09IFJVTlNJR05FRFNISUZUOworICAgIGpqX2xvb2tpbmdBaGVhZCA9IGZhbHNlOworICAgIGlmICghampfc2VtTEEgfHwgampfM1JfMTMxKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oR1QpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihHVCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83MSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMDcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEwOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEJJVF9BTkQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMigpCisgeworICAgIGlmIChqal8zUl83NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTc3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE3OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIxKCkKKyB7CisgICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzQwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTgyKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjQoKQorIHsKKyAgICBpZiAoampfM1JfODcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE1MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODQoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMjQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEzMigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzkoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ5KCkKKyB7CisgICAgaWYgKGpqXzNSXzE0NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTg0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwNCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl80MjEoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzkoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDA2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRklOQUxMWSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5MygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEZJTkFMTFkpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTA2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MjIoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfT1IpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzcwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl82OSgpCisgeworICAgIGlmIChqal8zUl83NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODYoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihERUNSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjMoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfODUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzg2KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODUoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTkNSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1NygpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE0OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yMigpCisgeworICAgIGlmIChqal8zUl84NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDA1KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0FUQ0gpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfOTUoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzc1KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl80MjIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfM1JfMTQ1KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NCgpCisgeworICAgIGlmIChqal8zUl82OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTQ5KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNTcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQwKCkKKyB7CisgICAgaWYgKGpqXzNSXzI2NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18yMygpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTUoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA5KCkKKyB7CisgICAgaWYgKGpqXzNSXzg0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTAoKQorIHsKKyAgICBpZiAoampfM1JfMjQwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzkoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCQU5HKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzOCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRJTERFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwOCgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMzgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIzOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGpqXzNSXzE1MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM181KCkKKyB7CisgICAgaWYgKGpqXzNSXzY4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNjkoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDExMykpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDExNikpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDExMikpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5MigpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl80MDUoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDYoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNjcoKQorIHsKKyAgICBpZiAoampfM1JfMTAzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzQoKQorIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNjcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3OCgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMDgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIwOSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjEwKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MCgpCisgeworICAgIGlmIChqal8zUl8yNzUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5MSgpCisgeworICAgIGlmIChqal8zUl80MDQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMzMSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRSWSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zOTEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTA2KCkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM5MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzkzKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQ0KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oX0RFRkFVTFQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfOTUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0OSgpCisgeworICAgIGlmIChqal8zUl8yNzQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0OCgpCisgeworICAgIGlmIChqal8zUl8yNzMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NygpCisgeworICAgIGlmIChqal8zUl8yNzIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERFQ1IpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTUxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDYoKQorIHsKKyAgICBpZiAoampfM1JfMjcxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDUoKQorIHsKKyAgICBpZiAoampfM1JfMjcwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOTAoKQorIHsKKyAgICBpZiAoampfM1JfODAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MygpCisgeworICAgIGlmIChqal8zUl8yMTkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk3KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5DUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNTEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4OCgpCisgeworICAgIGlmIChqal8zUl8xNzgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4OSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMwKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1lOQ0hST05JWkVEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNCgpCisgeworICAgIGlmIChqal8zUl85NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjQ0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjQ1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNDYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI0NygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjQ4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNDkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI1MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzYoKQorIHsKKyAgICBpZiAoampfM1JfNzAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4OCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE4KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE3KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUExVUykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjkoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUSFJPVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg3KCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIxNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjE4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfM1JfMTUxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODYoKQorIHsKKyAgICBpZiAoampfM1JfMjE2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODUoKQorIHsKKyAgICBpZiAoampfM1JfOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4MygpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIxNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjE1KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyOSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjgoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSRVRVUk4pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzkwKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0OCgpCisgeworICAgIGlmIChqal8zUl8xODMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MSgpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xODUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE4NigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTg3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xODgoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5OCgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFJFTSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOTcoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTTEFTSCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjcoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT05USU5VRSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODkoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfOTMoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTQ4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5NigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNUQVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgwKCkKKyB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM5NigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzk3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zOTgoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICBpZiAoampfM1JfMTUxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MDMoKQorIHsKKyAgICBpZiAoampfM1JfNDIwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTIoKQorIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfQU5EKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI1MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI2KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQlJFQUspKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzg4KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxOSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFMpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjUxKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8yNTIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQ1KCkKKyB7CisgICAgaWYgKGpqXzNSXzE1MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzgwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4MigpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE1JTlVTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4MSgpCisgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBMVVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zKCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNjYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3MygpCisgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzM4MigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGpqXzNSXzM0NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU4KCkKKyB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xOTMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIwKCkKKyB7CisgICAgaWYgKGpqXzNSXzQyNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKiogR2VuZXJhdGVkIFRva2VuIE1hbmFnZXIuICovCisgIHB1YmxpYyBBU1RQYXJzZXJUb2tlbk1hbmFnZXIgdG9rZW5fc291cmNlOworICBKYXZhQ2hhclN0cmVhbSBqal9pbnB1dF9zdHJlYW07CisgIC8qKiBDdXJyZW50IHRva2VuLiAqLworICBwdWJsaWMgVG9rZW4gdG9rZW47CisgIC8qKiBOZXh0IHRva2VuLiAqLworICBwdWJsaWMgVG9rZW4gampfbnQ7CisgIHByaXZhdGUgaW50IGpqX250azsKKyAgcHJpdmF0ZSBUb2tlbiBqal9zY2FucG9zLCBqal9sYXN0cG9zOworICBwcml2YXRlIGludCBqal9sYTsKKyAgLyoqIFdoZXRoZXIgd2UgYXJlIGxvb2tpbmcgYWhlYWQuICovCisgIHByaXZhdGUgYm9vbGVhbiBqal9sb29raW5nQWhlYWQgPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIGpqX3NlbUxBOworICBwcml2YXRlIGludCBqal9nZW47CisgIGZpbmFsIHByaXZhdGUgaW50W10gampfbGExID0gbmV3IGludFsxNjBdOworICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMDsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzE7CisgIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8yOworICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMzsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzQ7CisgIHN0YXRpYyB7CisgICAgICBqal9sYTFfaW5pdF8wKCk7CisgICAgICBqal9sYTFfaW5pdF8xKCk7CisgICAgICBqal9sYTFfaW5pdF8yKCk7CisgICAgICBqal9sYTFfaW5pdF8zKCk7CisgICAgICBqal9sYTFfaW5pdF80KCk7CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV9pbml0XzAoKSB7CisgICAgICBqal9sYTFfMCA9IG5ldyBpbnRbXSB7MHgwLDB4MCwweDAsMHgxLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLH07CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV9pbml0XzEoKSB7CisgICAgICBqal9sYTFfMSA9IG5ldyBpbnRbXSB7MHg0MDAwMDAwMCwweDQwMDAwMDAwLDB4OTAyMDIwLDB4MCwweDAsMHgwLDB4ODAwMDIwLDB4MTAyMDAwLDB4OTAyMDIwLDB4MjAwMCwweDAsMHgyMDAwMDAsMHgyMDAwMDAwMCwweDAsMHgwLDB4MjAwMDAwMDAsMHgwLDB4MCwweDI5NTMyYTAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDIwMDAwMCwweDAsMHgyOTUzMmEwLDB4MTAwMDAsMHgxMDIwMDAsMHgyMDQxMjgwLDB4Mjk1MzJhMCwweDAsMHgwLDB4MCwweDI0NDEyODAsMHgyNDQxMjgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDI4NDEyYTAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDI0NDEyODAsMHgxNmM2YjNlMCwweDAsMHgyMDQxMjgwLDB4MjA0MTI4MCwweDIwNDEyODAsMHgwLDB4MjA0MTI4MCwweDIwNDEyODAsMHgyMDAwMDAsMHgyMDAwMDAsMHgyMDQxMjgwLDB4MjA0MTI4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg4MDAwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MjQ0MTI4MCwweDAsMHgwLDB4MjQ0MTI4MCwweDAsMHgwLDB4MjA0MTI4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgyNDQxMjgwLDB4MmM0MTJhMCwweDAsMHgwLDB4MCwweDQwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDQwMDAwMCwweDQwMDAwMCwweDI0NDEyODAsMHgwLDB4MCwweDAsMHgyMDQxMjgwLDB4MjQ0MTI4MCwweDAsMHgwLDB4MTY0NjkzYzAsMHgwLDB4MTY0NjkzYzAsMHgwLDB4MjQ0MTI4MCwweDAsMHgwLDB4MCwweDAsMHgyNDQxMjgwLDB4MTA0MDAsMHgxMDQwMCwweDgwMDAwLDB4MmM0MTJhMCwweDI0NDEyODAsMHgyNDQxMjgwLDB4MmM0MTJhMCwweDI0NDEyODAsMHgwLDB4MCwweDAsMHgyNDQxMjgwLDB4MCwweDgwMCwweDAsMHgxMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDI0NDEyODAsMHgyNDQxMjgwLDB4MCwweDI5NDMyYTAsMHgyMTQzMjgwLDB4Mjk0MzJhMCwweDEwMDAwLH07CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV9pbml0XzIoKSB7CisgICAgICBqal9sYTFfMiA9IG5ldyBpbnRbXSB7MHgwLDB4MCwweDExMTMzOGEsMHgwLDB4MTAwMCwweDAsMHgxMTEzMzg4LDB4MiwweDExMTMzOGEsMHgyLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxOTEzYjhmLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDE5MTNiOGYsMHgwLDB4MiwweDgwMDgwNSwweDE5MTNiOGYsMHgwLDB4MCwweDAsMHhjYTI0ODM1LDB4Y2EyNDgzNSwweDAsMHgwLDB4MCwweDAsMHg4MDAwMCwweDAsMHgwLDB4MTExM2I4ZCwweDAsMHgwLDB4MCwweDAsMHgwLDB4ODAwMDAsMHgwLDB4MCwweGNhMjQ4MzUsMHhmZjdmZmJmLDB4MTAwMCwweDgwNSwweDgwNSwweDgwNSwweDAsMHg4MDUsMHg4MDUsMHg0MDAwLDB4NDAwMCwweDgwNSwweDgwMDgwNSwweDAsMHgxMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4Y2EyNDgzNSwweDAsMHgwLDB4Y2EyNDgzNSwweDAsMHgwLDB4ODA1LDB4MCwweDAsMHgwLDB4MTAsMHgwLDB4MCwweDAsMHhjYTI0ODM1LDB4ZGIzN2JiZCwweDAsMHgxMCwweDAsMHhjMjI0MDMwLDB4MCwweDAsMHgwLDB4MCwweDIwMDEwLDB4MCwweGMyMDAwMjAsMHgyMDAwMDAsMHhjYTI0ODM1LDB4MCwweDAsMHgwLDB4ODA1LDB4Y2EyNDgzNSwweDAsMHgwLDB4ZWU3Y2MzNSwweDAsMHhlZTdjYzM1LDB4MCwweGNhMjQ4MzUsMHgwLDB4MTAsMHgwLDB4MCwweGNhMjQ4MzUsMHgwLDB4MCwweDAsMHhkYjM3YmJkLDB4Y2EyNDgzNSwweGNhMjQ4MzUsMHhkYjM3YmJkLDB4Y2EyNDgzNSwweDAsMHgwLDB4MCwweGNhMjQ4MzUsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweGNhMjQ4MzUsMHhjYTI0ODM1LDB4MCwweDExMTNiOGYsMHg4MDcsMHgxMTEzYjhmLDB4MCx9OworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfaW5pdF8zKCkgeworICAgICAgampfbGExXzMgPSBuZXcgaW50W10gezB4MTAwMDAsMHgxMDAwMCwweDkwMDAwLDB4MCwweDAsMHg0MDAwMCwweDgwMDAwLDB4ODAwMDAsMHg5MDAwMCwweDAsMHgyMDAwMDAsMHgwLDB4MCwweDIwMDAwLDB4MjAwMDAsMHgwLDB4ODAwODAsMHgyMDAwMCwweDI5MTA4MCwweDEwMDAwLDB4ODAwMDAsMHg0MDAsMHgxMDAwLDB4MjAwMDAsMHgwLDB4MCwweDI5MTA4MCwweDAsMHg4MDAwMCwweDIwMDA4MCwweDI5MDA4MCwweDIwMDAwLDB4MTAwMDAwLDB4ODQwMDAsMHhjMDE0ZTEsMHhjMDE0ZTEsMHgyMDAwMCwweDIwMDAwMCwweDg0MDAwLDB4MjAwMDAsMHgwLDB4MTEwMDAsMHgyMDAwMCwweDgwMDgwLDB4MjAwMDAsMHgyMDAwMCwweDAsMHgyMDAwMDAsMHgyMDAwMCwweDAsMHgyMDAwMDAsMHgyMDAwMDAsMHgyMDA0ZTEsMHg5MTRlMSwweDAsMHgwLDB4ODAsMHg4MCwweDIwMDAwLDB4MTA4MDA4MCwweDEwMDAwODAsMHgwLDB4MCwweDAsMHg4MCwweDIwMDAwMCwweDgwLDB4MCwweDEwMDAwMCwweDEwMDAwMCwweDEwMDAwMDAsMHg0MDAwMDAwMCwweDgwMDAwMDAwLDB4MCwweDAsMHgwLDB4MjQwMDAwMDAsMHgyNDAwMDAwMCwweDAsMHgxODIwMDAwMCwweDE4MjAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4YzAwNGUxLDB4YzAwMDAwLDB4YzAwMDAwLDB4NGUxLDB4MCwweDAsMHg4MCwweDIwMDAwMCwweDQwMCwweDIwMDAwMCwweDgwLDB4NDAwMDAsMHgyMDAwMCwweDIwMDAwLDB4YzAwNGUxLDB4YzgwNGUxLDB4MjAwMDAwLDB4ODAsMHg0MDAsMHg0NjEsMHg4MCwweDQwMDAwLDB4MjAwMDAwLDB4NDAwLDB4MCwweDQ0MDAwLDB4NjEsMHgwLDB4YzAwNGUxLDB4MjAwMDAsMHgyMDAwMDAsMHg4NDQwMCwweDI4MDA4MCwweGMwMDRlMSwweDg0MDAwLDB4MTAwMCwweDExNGUxLDB4MjAwMDAwMCwweDExNGUxLDB4MjAwMDAsMHhjMDE0ZTEsMHgyMDAwMDAsMHg4MCwweDEwMDAwMCwweDEwMDAwMCwweDRlMSwweDAsMHgwLDB4MCwweGM4MDRlMSwweGMwMDRlMSwweGMwMDRlMSwweGM5MDRlMSwweGMwMDRlMSwweDIwMDAwLDB4ODAsMHg4MCwweGMwMDRlMSwweDQwMCwweDAsMHgwLDB4MCwweDgwMDAwLDB4ODAwMDAsMHg4MCwweDIwMDAwLDB4YzgxNGUxLDB4YzgxNGUxLDB4MjAwMDAsMHg5MDA4MCwweDgwMDgwLDB4OTAwODAsMHgwLH07CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV9pbml0XzQoKSB7CisgICAgICBqal9sYTFfNCA9IG5ldyBpbnRbXSB7MHgwLDB4MCwweDAsMHgxMDAwMDAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDQwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHhmLDB4ZiwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MDAwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgzLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDE4MDAwMDAsMHgxYmZmODAwLDB4M2ZmODAwLDB4MCwweDAsMHgwLDB4ODAsMHgxMDAsMHg0MCwweDAsMHgwLDB4MCwweDgwMDAwMDAsMHg4MDAwMDAwLDB4NDAwLDB4YywweGMsMHgyMzAsMHgyMzAsMHhjLDB4ZiwweDAsMHgwLDB4MCwweDMsMHg0MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTAwMDAwMCwweDAsMHgwLDB4ZiwweGYsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHhmLDB4MCwweDAsMHgwLDB4MCwweGYsMHgwLDB4MCwweDMsMHgwLDB4MywweDAsMHhmLDB4MCwweDAsMHgxYmZmODAzLDB4MWJmZjgwMywweDIsMHgwLDB4MCwweDAsMHhmLDB4ZiwweGYsMHhmLDB4ZiwweDAsMHgwLDB4MCwweGYsMHgwLDB4MCwweDgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHhmLDB4ZiwweDAsMHgwLDB4MCwweDAsMHgwLH07CisgICB9CisgIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzQ0XTsKKyAgcHJpdmF0ZSBib29sZWFuIGpqX3Jlc2NhbiA9IGZhbHNlOworICBwcml2YXRlIGludCBqal9nYyA9IDA7CisKKyAgLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgQVNUUGFyc2VyKFByb3ZpZGVyIHN0cmVhbSkgeworICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBKYXZhQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOworICAgIHRva2VuX3NvdXJjZSA9IG5ldyBBU1RQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjA7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICAvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBBU1RQYXJzZXIoU3RyaW5nIGRzbCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBUb2tlbk1nckV4Y2VwdGlvbiB7CisgICAgICB0aGlzKG5ldyBTdHJpbmdQcm92aWRlcihkc2wpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChTdHJpbmcgcykgeworICAgICBSZUluaXQobmV3IFN0cmluZ1Byb3ZpZGVyKHMpKTsKKyAgfQorICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoUHJvdmlkZXIgc3RyZWFtKSB7CisJaWYgKGpqX2lucHV0X3N0cmVhbSA9PSBudWxsKSB7CisgICAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgSmF2YUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKKyAgIH0gZWxzZSB7CisgICAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7CisgICB9CisgICBpZiAodG9rZW5fc291cmNlID09IG51bGwpIHsKKyAgICAgIHRva2VuX3NvdXJjZSA9IG5ldyBBU1RQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKKyAgIH0KKworICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjA7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICAvKiogQ29uc3RydWN0b3Igd2l0aCBnZW5lcmF0ZWQgVG9rZW4gTWFuYWdlci4gKi8KKyAgcHVibGljIEFTVFBhcnNlcihBU1RQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjA7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoQVNUUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7CisgICAgdG9rZW5fc291cmNlID0gdG07CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTYwOyBpKyspIGpqX2xhMVtpXSA9IC0xOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOworICB9CisKKyAgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB7CisgICAgVG9rZW4gb2xkVG9rZW47CisgICAgaWYgKChvbGRUb2tlbiA9IHRva2VuKS5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKKyAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBpZiAodG9rZW4ua2luZCA9PSBraW5kKSB7CisgICAgICBqal9nZW4rKzsKKyAgICAgIGlmICgrK2pqX2djID4gMTAwKSB7CisgICAgICAgIGpqX2djID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBKSkNhbGxzIGMgPSBqal8yX3J0bnNbaV07CisgICAgICAgICAgd2hpbGUgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGMuZ2VuIDwgampfZ2VuKSBjLmZpcnN0ID0gbnVsbDsKKyAgICAgICAgICAgIGMgPSBjLm5leHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorICAgIHRva2VuID0gb2xkVG9rZW47CisgICAgampfa2luZCA9IGtpbmQ7CisgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB7IH0KKyAgZmluYWwgcHJpdmF0ZSBMb29rYWhlYWRTdWNjZXNzIGpqX2xzID0gbmV3IExvb2thaGVhZFN1Y2Nlc3MoKTsKKyAgcHJpdmF0ZSBib29sZWFuIGpqX3NjYW5fdG9rZW4oaW50IGtpbmQpIHsKKyAgICBpZiAoampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB7CisgICAgICBqal9sYS0tOworICAgICAgaWYgKGpqX3NjYW5wb3MubmV4dCA9PSBudWxsKSB7CisgICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7CisgICAgfQorICAgIGlmIChqal9yZXNjYW4pIHsKKyAgICAgIGludCBpID0gMDsgVG9rZW4gdG9rID0gdG9rZW47CisgICAgICB3aGlsZSAodG9rICE9IG51bGwgJiYgdG9rICE9IGpqX3NjYW5wb3MpIHsgaSsrOyB0b2sgPSB0b2submV4dDsgfQorICAgICAgaWYgKHRvayAhPSBudWxsKSBqal9hZGRfZXJyb3JfdG9rZW4oa2luZCwgaSk7CisgICAgfQorICAgIGlmIChqal9zY2FucG9zLmtpbmQgIT0ga2luZCkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX2xhID09IDAgJiYgampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB0aHJvdyBqal9sczsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworCisvKiogR2V0IHRoZSBuZXh0IFRva2VuLiAqLworICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgeworICAgIGlmICh0b2tlbi5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKKyAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4rKzsKKyAgICByZXR1cm4gdG9rZW47CisgIH0KKworLyoqIEdldCB0aGUgc3BlY2lmaWMgVG9rZW4uICovCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKKyAgICBUb2tlbiB0ID0gampfbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OworICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIHByaXZhdGUgaW50IGpqX250a19mKCkgeworICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKKyAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOworICB9CisKKyAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxpbnRbXT4gampfZXhwZW50cmllcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGludFtdPigpOworICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OworICBwcml2YXRlIGludCBqal9raW5kID0gLTE7CisgIHByaXZhdGUgaW50W10gampfbGFzdHRva2VucyA9IG5ldyBpbnRbMTAwXTsKKyAgcHJpdmF0ZSBpbnQgampfZW5kcG9zOworCisgIHByaXZhdGUgdm9pZCBqal9hZGRfZXJyb3JfdG9rZW4oaW50IGtpbmQsIGludCBwb3MpIHsKKyAgICBpZiAocG9zID49IDEwMCkgeworICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG9zID09IGpqX2VuZHBvcyArIDEpIHsKKyAgICAgIGpqX2xhc3R0b2tlbnNbampfZW5kcG9zKytdID0ga2luZDsKKyAgICB9IGVsc2UgaWYgKGpqX2VuZHBvcyAhPSAwKSB7CisgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbampfZW5kcG9zXTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9lbmRwb3M7IGkrKykgeworICAgICAgICBqal9leHBlbnRyeVtpXSA9IGpqX2xhc3R0b2tlbnNbaV07CisgICAgICB9CisKKyAgICAgIGZvciAoaW50W10gb2xkZW50cnkgOiBqal9leHBlbnRyaWVzKSB7CisgICAgICAgIGlmIChvbGRlbnRyeS5sZW5ndGggPT0gampfZXhwZW50cnkubGVuZ3RoKSB7CisgICAgICAgICAgYm9vbGVhbiBpc01hdGNoZWQgPSB0cnVlOworCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyeS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG9sZGVudHJ5W2ldICE9IGpqX2V4cGVudHJ5W2ldKSB7CisgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaXNNYXRjaGVkKSB7CisgICAgICAgICAgICBqal9leHBlbnRyaWVzLmFkZChqal9leHBlbnRyeSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHBvcyAhPSAwKSB7CisgICAgICAgIGpqX2xhc3R0b2tlbnNbKGpqX2VuZHBvcyA9IHBvcykgLSAxXSA9IGtpbmQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIEdlbmVyYXRlIFBhcnNlRXhjZXB0aW9uLiAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBqal9leHBlbnRyaWVzLmNsZWFyKCk7CisgICAgYm9vbGVhbltdIGxhMXRva2VucyA9IG5ldyBib29sZWFuWzE1N107CisgICAgaWYgKGpqX2tpbmQgPj0gMCkgeworICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKKyAgICAgIGpqX2tpbmQgPSAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjA7IGkrKykgeworICAgICAgaWYgKGpqX2xhMVtpXSA9PSBqal9nZW4pIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgaisrKSB7CisgICAgICAgICAgaWYgKChqal9sYTFfMFtpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zW2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChqal9sYTFfMVtpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zWzMyK2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChqal9sYTFfMltpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zWzY0K2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChqal9sYTFfM1tpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zWzk2K2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChqal9sYTFfNFtpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zWzEyOCtqXSA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU3OyBpKyspIHsKKyAgICAgIGlmIChsYTF0b2tlbnNbaV0pIHsKKyAgICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50WzFdOworICAgICAgICBqal9leHBlbnRyeVswXSA9IGk7CisgICAgICAgIGpqX2V4cGVudHJpZXMuYWRkKGpqX2V4cGVudHJ5KTsKKyAgICAgIH0KKyAgICB9CisgICAgampfZW5kcG9zID0gMDsKKyAgICBqal9yZXNjYW5fdG9rZW4oKTsKKyAgICBqal9hZGRfZXJyb3JfdG9rZW4oMCwgMCk7CisgICAgaW50W11bXSBleHB0b2tzZXEgPSBuZXcgaW50W2pqX2V4cGVudHJpZXMuc2l6ZSgpXVtdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cmllcy5zaXplKCk7IGkrKykgeworICAgICAgZXhwdG9rc2VxW2ldID0gampfZXhwZW50cmllcy5nZXQoaSk7CisgICAgfQorICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24odG9rZW4sIGV4cHRva3NlcSwgdG9rZW5JbWFnZSwgdG9rZW5fc291cmNlID09IG51bGwgPyBudWxsIDogQVNUUGFyc2VyVG9rZW5NYW5hZ2VyLmxleFN0YXRlTmFtZXNbdG9rZW5fc291cmNlLmN1ckxleFN0YXRlXSk7CisgIH0KKworICAvKiogRW5hYmxlIHRyYWNpbmcuICovCisgIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgeworICB9CisKKyAgLyoqIERpc2FibGUgdHJhY2luZy4gKi8KKyAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgeworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGpqX3Jlc2Nhbl90b2tlbigpIHsKKyAgICBqal9yZXNjYW4gPSB0cnVlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDQ7IGkrKykgeworICAgICAgdHJ5IHsKKyAgICAgICAgSkpDYWxscyBwID0gampfMl9ydG5zW2ldOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAocC5nZW4gPiBqal9nZW4pIHsKKyAgICAgICAgICAgIGpqX2xhID0gcC5hcmc7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gcC5maXJzdDsKKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICBjYXNlIDA6IGpqXzNfMSgpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOiBqal8zXzIoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjogampfM18zKCk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDM6IGpqXzNfNCgpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA0OiBqal8zXzUoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNTogampfM182KCk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDY6IGpqXzNfNygpOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA3OiBqal8zXzgoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgODogampfM185KCk7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDk6IGpqXzNfMTAoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTA6IGpqXzNfMTEoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTE6IGpqXzNfMTIoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTI6IGpqXzNfMTMoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTM6IGpqXzNfMTQoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTQ6IGpqXzNfMTUoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTU6IGpqXzNfMTYoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTY6IGpqXzNfMTcoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTc6IGpqXzNfMTgoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTg6IGpqXzNfMTkoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTk6IGpqXzNfMjAoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjA6IGpqXzNfMjEoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjE6IGpqXzNfMjIoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjI6IGpqXzNfMjMoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjM6IGpqXzNfMjQoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjQ6IGpqXzNfMjUoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjU6IGpqXzNfMjYoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjY6IGpqXzNfMjcoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjc6IGpqXzNfMjgoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjg6IGpqXzNfMjkoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjk6IGpqXzNfMzAoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzA6IGpqXzNfMzEoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzE6IGpqXzNfMzIoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzI6IGpqXzNfMzMoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzM6IGpqXzNfMzQoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzQ6IGpqXzNfMzUoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzU6IGpqXzNfMzYoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzY6IGpqXzNfMzcoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzc6IGpqXzNfMzgoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzg6IGpqXzNfMzkoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMzk6IGpqXzNfNDAoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDA6IGpqXzNfNDEoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDE6IGpqXzNfNDIoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDI6IGpqXzNfNDMoKTsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNDM6IGpqXzNfNDQoKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHAgPSBwLm5leHQ7CisgICAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7CisKKyAgICAgICAgfSBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IH0KKyAgICB9CisgICAgampfcmVzY2FuID0gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHZvaWQgampfc2F2ZShpbnQgaW5kZXgsIGludCB4bGEpIHsKKyAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaW5kZXhdOworICAgIHdoaWxlIChwLmdlbiA+IGpqX2dlbikgeworICAgICAgaWYgKHAubmV4dCA9PSBudWxsKSB7IHAgPSBwLm5leHQgPSBuZXcgSkpDYWxscygpOyBicmVhazsgfQorICAgICAgcCA9IHAubmV4dDsKKyAgICB9CisKKyAgICBwLmdlbiA9IGpqX2dlbiArIHhsYSAtIGpqX2xhOyAKKyAgICBwLmZpcnN0ID0gdG9rZW47CisgICAgcC5hcmcgPSB4bGE7CisgIH0KKworICBzdGF0aWMgZmluYWwgY2xhc3MgSkpDYWxscyB7CisgICAgaW50IGdlbjsKKyAgICBUb2tlbiBmaXJzdDsKKyAgICBpbnQgYXJnOworICAgIEpKQ2FsbHMgbmV4dDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlckNvbnN0YW50cy5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9BU1RQYXJzZXJDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU2ODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9BU1RQYXJzZXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYXJzZXJDb25zdGFudHMuamF2YSAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKKworLyoqCisgKiBUb2tlbiBsaXRlcmFsIHZhbHVlcyBhbmQgY29uc3RhbnRzLgorICogR2VuZXJhdGVkIGJ5IG9yZy5qYXZhY2MucGFyc2VyLk90aGVyRmlsZXNHZW4jc3RhcnQoKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFTVFBhcnNlckNvbnN0YW50cyB7CisKKyAgLyoqIEVuZCBvZiBGaWxlLiAqLworICBpbnQgRU9GID0gMDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IDMxOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBKQVZBX0RPQ19DT01NRU5UID0gMzQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE1VTFRJX0xJTkVfQ09NTUVOVCA9IDM1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBBQlNUUkFDVCA9IDM3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBBU1NFUlQgPSAzODsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQk9PTEVBTiA9IDM5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCUkVBSyA9IDQwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCWVRFID0gNDE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IENBU0UgPSA0MjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQ0FUQ0ggPSA0MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQ0hBUiA9IDQ0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDTEFTUyA9IDQ1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDT05TVCA9IDQ2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDT05USU5VRSA9IDQ3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBfREVGQVVMVCA9IDQ4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBETyA9IDQ5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBET1VCTEUgPSA1MDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRUxTRSA9IDUxOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBFTlVNID0gNTI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEVYVEVORFMgPSA1MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRkFMU0UgPSA1NDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRklOQUwgPSA1NTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRklOQUxMWSA9IDU2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBGTE9BVCA9IDU3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBGT1IgPSA1ODsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgR09UTyA9IDU5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBJRiA9IDYwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBJTVBMRU1FTlRTID0gNjE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElNUE9SVCA9IDYyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBJTlNUQU5DRU9GID0gNjM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElOVCA9IDY0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBJTlRFUkZBQ0UgPSA2NTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTE9ORyA9IDY2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBOQVRJVkUgPSA2NzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTkVXID0gNjg7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE5VTEwgPSA2OTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUEFDS0FHRSA9IDcwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBQUklWQVRFID0gNzE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFBST1RFQ1RFRCA9IDcyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBQVUJMSUMgPSA3MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUkVUVVJOID0gNzQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNIT1JUID0gNzU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNUQVRJQyA9IDc2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTVFJJQ1RGUCA9IDc3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTVVBFUiA9IDc4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTV0lUQ0ggPSA3OTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU1lOQ0hST05JWkVEID0gODA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFRISVMgPSA4MTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVEhST1cgPSA4MjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVEhST1dTID0gODM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFRSQU5TSUVOVCA9IDg0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBUUlVFID0gODU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFRSWSA9IDg2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBWT0lEID0gODc7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFZPTEFUSUxFID0gODg7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFdISUxFID0gODk7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExPTkdfTElURVJBTCA9IDkwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBJTlRFR0VSX0xJVEVSQUwgPSA5MTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgREVDSU1BTF9MSVRFUkFMID0gOTI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEhFWF9MSVRFUkFMID0gOTM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE9DVEFMX0xJVEVSQUwgPSA5NDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQklOQVJZX0xJVEVSQUwgPSA5NTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRkxPQVRJTkdfUE9JTlRfTElURVJBTCA9IDk2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBERUNJTUFMX0ZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSA5NzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgREVDSU1BTF9FWFBPTkVOVCA9IDk4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBIRVhBREVDSU1BTF9GTE9BVElOR19QT0lOVF9MSVRFUkFMID0gOTk7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEhFWEFERUNJTUFMX0VYUE9ORU5UID0gMTAwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDSEFSQUNURVJfTElURVJBTCA9IDEwMTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU1RSSU5HX0xJVEVSQUwgPSAxMDI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElERU5USUZJRVIgPSAxMDM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExFVFRFUiA9IDEwNDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUEFSVF9MRVRURVIgPSAxMDU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExQQVJFTiA9IDEwNjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUlBBUkVOID0gMTA3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMQlJBQ0UgPSAxMDg7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJCUkFDRSA9IDEwOTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTEJSQUNLRVQgPSAxMTA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJCUkFDS0VUID0gMTExOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTRU1JQ09MT04gPSAxMTI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IENPTU1BID0gMTEzOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBET1QgPSAxMTQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEFUID0gMTE1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBBU1NJR04gPSAxMTY7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExUID0gMTE3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCQU5HID0gMTE4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBUSUxERSA9IDExOTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSE9PSyA9IDEyMDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQ09MT04gPSAxMjE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEVRID0gMTIyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMRSA9IDEyMzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgR0UgPSAxMjQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE5FID0gMTI1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTQ19PUiA9IDEyNjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU0NfQU5EID0gMTI3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBJTkNSID0gMTI4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBERUNSID0gMTI5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBQTFVTID0gMTMwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBNSU5VUyA9IDEzMTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU1RBUiA9IDEzMjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU0xBU0ggPSAxMzM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEJJVF9BTkQgPSAxMzQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEJJVF9PUiA9IDEzNTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgWE9SID0gMTM2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBSRU0gPSAxMzc7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExTSElGVCA9IDEzODsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUExVU0FTU0lHTiA9IDEzOTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTUlOVVNBU1NJR04gPSAxNDA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNUQVJBU1NJR04gPSAxNDE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNMQVNIQVNTSUdOID0gMTQyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBBTkRBU1NJR04gPSAxNDM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE9SQVNTSUdOID0gMTQ0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBYT1JBU1NJR04gPSAxNDU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJFTUFTU0lHTiA9IDE0NjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTFNISUZUQVNTSUdOID0gMTQ3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBSU0lHTkVEU0hJRlRBU1NJR04gPSAxNDg7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJVTlNJR05FRFNISUZUQVNTSUdOID0gMTQ5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBFTExJUFNJUyA9IDE1MDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQVJST1cgPSAxNTE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IERPVUJMRUNPTE9OID0gMTUyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBSVU5TSUdORURTSElGVCA9IDE1MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUlNJR05FRFNISUZUID0gMTU0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBHVCA9IDE1NTsKKworICAvKiogTGV4aWNhbCBzdGF0ZS4gKi8KKyAgaW50IERFRkFVTFQgPSAwOworICAvKiogTGV4aWNhbCBzdGF0ZS4gKi8KKyAgaW50IElOX0pBVkFfRE9DX0NPTU1FTlQgPSAxOworICAvKiogTGV4aWNhbCBzdGF0ZS4gKi8KKyAgaW50IElOX01VTFRJX0xJTkVfQ09NTUVOVCA9IDI7CisKKyAgLyoqIExpdGVyYWwgdG9rZW4gdmFsdWVzLiAqLworICBTdHJpbmdbXSB0b2tlbkltYWdlID0geworICAgICI8RU9GPiIsCisgICAgIlwiIFwiIiwKKyAgICAiXCJcXHRcIiIsCisgICAgIlwiXFxuXCIiLAorICAgICJcIlxcclwiIiwKKyAgICAiXCJcXGZcIiIsCisgICAgIlwiXFx1MDA4NVwiIiwKKyAgICAiXCJcXHUwMGEwXCIiLAorICAgICJcIlxcdTE2ODBcIiIsCisgICAgIlwiXFx1MTgwZVwiIiwKKyAgICAiXCJcXHUyMDAwXCIiLAorICAgICJcIlxcdTIwMDFcIiIsCisgICAgIlwiXFx1MjAwMlwiIiwKKyAgICAiXCJcXHUyMDAzXCIiLAorICAgICJcIlxcdTIwMDRcIiIsCisgICAgIlwiXFx1MjAwNVwiIiwKKyAgICAiXCJcXHUyMDA2XCIiLAorICAgICJcIlxcdTIwMDdcIiIsCisgICAgIlwiXFx1MjAwOFwiIiwKKyAgICAiXCJcXHUyMDA5XCIiLAorICAgICJcIlxcdTIwMGFcIiIsCisgICAgIlwiXFx1MjAwYlwiIiwKKyAgICAiXCJcXHUyMDBjXCIiLAorICAgICJcIlxcdTIwMGRcIiIsCisgICAgIlwiXFx1MjAyOFwiIiwKKyAgICAiXCJcXHUyMDI5XCIiLAorICAgICJcIlxcdTIwMmZcIiIsCisgICAgIlwiXFx1MjA1ZlwiIiwKKyAgICAiXCJcXHUyMDYwXCIiLAorICAgICJcIlxcdTMwMDBcIiIsCisgICAgIlwiXFx1ZmVmZlwiIiwKKyAgICAiPFNJTkdMRV9MSU5FX0NPTU1FTlQ+IiwKKyAgICAiPHRva2VuIG9mIGtpbmQgMzI+IiwKKyAgICAiXCIvKlwiIiwKKyAgICAiXCIqL1wiIiwKKyAgICAiXCIqL1wiIiwKKyAgICAiPHRva2VuIG9mIGtpbmQgMzY+IiwKKyAgICAiXCJhYnN0cmFjdFwiIiwKKyAgICAiXCJhc3NlcnRcIiIsCisgICAgIlwiYm9vbGVhblwiIiwKKyAgICAiXCJicmVha1wiIiwKKyAgICAiXCJieXRlXCIiLAorICAgICJcImNhc2VcIiIsCisgICAgIlwiY2F0Y2hcIiIsCisgICAgIlwiY2hhclwiIiwKKyAgICAiXCJjbGFzc1wiIiwKKyAgICAiXCJjb25zdFwiIiwKKyAgICAiXCJjb250aW51ZVwiIiwKKyAgICAiXCJkZWZhdWx0XCIiLAorICAgICJcImRvXCIiLAorICAgICJcImRvdWJsZVwiIiwKKyAgICAiXCJlbHNlXCIiLAorICAgICJcImVudW1cIiIsCisgICAgIlwiZXh0ZW5kc1wiIiwKKyAgICAiXCJmYWxzZVwiIiwKKyAgICAiXCJmaW5hbFwiIiwKKyAgICAiXCJmaW5hbGx5XCIiLAorICAgICJcImZsb2F0XCIiLAorICAgICJcImZvclwiIiwKKyAgICAiXCJnb3RvXCIiLAorICAgICJcImlmXCIiLAorICAgICJcImltcGxlbWVudHNcIiIsCisgICAgIlwiaW1wb3J0XCIiLAorICAgICJcImluc3RhbmNlb2ZcIiIsCisgICAgIlwiaW50XCIiLAorICAgICJcImludGVyZmFjZVwiIiwKKyAgICAiXCJsb25nXCIiLAorICAgICJcIm5hdGl2ZVwiIiwKKyAgICAiXCJuZXdcIiIsCisgICAgIlwibnVsbFwiIiwKKyAgICAiXCJwYWNrYWdlXCIiLAorICAgICJcInByaXZhdGVcIiIsCisgICAgIlwicHJvdGVjdGVkXCIiLAorICAgICJcInB1YmxpY1wiIiwKKyAgICAiXCJyZXR1cm5cIiIsCisgICAgIlwic2hvcnRcIiIsCisgICAgIlwic3RhdGljXCIiLAorICAgICJcInN0cmljdGZwXCIiLAorICAgICJcInN1cGVyXCIiLAorICAgICJcInN3aXRjaFwiIiwKKyAgICAiXCJzeW5jaHJvbml6ZWRcIiIsCisgICAgIlwidGhpc1wiIiwKKyAgICAiXCJ0aHJvd1wiIiwKKyAgICAiXCJ0aHJvd3NcIiIsCisgICAgIlwidHJhbnNpZW50XCIiLAorICAgICJcInRydWVcIiIsCisgICAgIlwidHJ5XCIiLAorICAgICJcInZvaWRcIiIsCisgICAgIlwidm9sYXRpbGVcIiIsCisgICAgIlwid2hpbGVcIiIsCisgICAgIjxMT05HX0xJVEVSQUw+IiwKKyAgICAiPElOVEVHRVJfTElURVJBTD4iLAorICAgICI8REVDSU1BTF9MSVRFUkFMPiIsCisgICAgIjxIRVhfTElURVJBTD4iLAorICAgICI8T0NUQUxfTElURVJBTD4iLAorICAgICI8QklOQVJZX0xJVEVSQUw+IiwKKyAgICAiPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKKyAgICAiPERFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTD4iLAorICAgICI8REVDSU1BTF9FWFBPTkVOVD4iLAorICAgICI8SEVYQURFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTD4iLAorICAgICI8SEVYQURFQ0lNQUxfRVhQT05FTlQ+IiwKKyAgICAiPENIQVJBQ1RFUl9MSVRFUkFMPiIsCisgICAgIjxTVFJJTkdfTElURVJBTD4iLAorICAgICI8SURFTlRJRklFUj4iLAorICAgICI8TEVUVEVSPiIsCisgICAgIjxQQVJUX0xFVFRFUj4iLAorICAgICJcIihcIiIsCisgICAgIlwiKVwiIiwKKyAgICAiXCJ7XCIiLAorICAgICJcIn1cIiIsCisgICAgIlwiW1wiIiwKKyAgICAiXCJdXCIiLAorICAgICJcIjtcIiIsCisgICAgIlwiLFwiIiwKKyAgICAiXCIuXCIiLAorICAgICJcIkBcIiIsCisgICAgIlwiPVwiIiwKKyAgICAiXCI8XCIiLAorICAgICJcIiFcIiIsCisgICAgIlwiflwiIiwKKyAgICAiXCI/XCIiLAorICAgICJcIjpcIiIsCisgICAgIlwiPT1cIiIsCisgICAgIlwiPD1cIiIsCisgICAgIlwiPj1cIiIsCisgICAgIlwiIT1cIiIsCisgICAgIlwifHxcIiIsCisgICAgIlwiJiZcIiIsCisgICAgIlwiKytcIiIsCisgICAgIlwiLS1cIiIsCisgICAgIlwiK1wiIiwKKyAgICAiXCItXCIiLAorICAgICJcIipcIiIsCisgICAgIlwiL1wiIiwKKyAgICAiXCImXCIiLAorICAgICJcInxcIiIsCisgICAgIlwiXlwiIiwKKyAgICAiXCIlXCIiLAorICAgICJcIjw8XCIiLAorICAgICJcIis9XCIiLAorICAgICJcIi09XCIiLAorICAgICJcIio9XCIiLAorICAgICJcIi89XCIiLAorICAgICJcIiY9XCIiLAorICAgICJcInw9XCIiLAorICAgICJcIl49XCIiLAorICAgICJcIiU9XCIiLAorICAgICJcIjw8PVwiIiwKKyAgICAiXCI+Pj1cIiIsCisgICAgIlwiPj4+PVwiIiwKKyAgICAiXCIuLi5cIiIsCisgICAgIlwiLT5cIiIsCisgICAgIlwiOjpcIiIsCisgICAgIlwiPj4+XCIiLAorICAgICJcIj4+XCIiLAorICAgICJcIj5cIiIsCisgICAgIlwiXFx1MDAxYVwiIiwKKyAgfTsKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9BU1RQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2YzBjNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNjQzIEBACisvKiBBU1RQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLworLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5BU1RQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qb3NpdGlvbi4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlLio7CisKKy8qKiBUb2tlbiBNYW5hZ2VyLiAqLworQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpcHVibGljIGNsYXNzIEFTVFBhcnNlclRva2VuTWFuYWdlciBpbXBsZW1lbnRzIEFTVFBhcnNlckNvbnN0YW50cyB7CisgICAgcHJpdmF0ZSBMaXN0PFRva2VuPiB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PFRva2VuPigpOworICAgIHByaXZhdGUgQ29tbWVudHNDb2xsZWN0aW9uIGNvbW1lbnRzQ29sbGVjdGlvbiA9IG5ldyBDb21tZW50c0NvbGxlY3Rpb24oKTsKKworICAgIExpc3Q8VG9rZW4+IGdldFRva2VucygpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICB9CisKKyAgICBDb21tZW50c0NvbGxlY3Rpb24gZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gY29tbWVudHNDb2xsZWN0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBDb21tb25Ub2tlbkFjdGlvbihUb2tlbiB0b2tlbikgeworICAgICAgICB0b2tlbnMuYWRkKHRva2VuKTsKKworICAgICAgICB3aGlsZSAodG9rZW4uc3BlY2lhbFRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3BlY2lhbFRva2VuOworICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnRUZXh0ID0gdG9rZW4uaW1hZ2U7CisgICAgICAgICAgICBpZiAoY29tbWVudFRleHQuc3RhcnRzV2l0aCgiLyoqIikpIHsKKyAgICAgICAgICAgICAgICBKYXZhZG9jQ29tbWVudCBjb21tZW50ID0gbmV3IEphdmFkb2NDb21tZW50KHRva2VuUmFuZ2UodG9rZW4pLCBjb21tZW50VGV4dC5zdWJzdHJpbmcoMywgY29tbWVudFRleHQubGVuZ3RoKCkgLSAyKSk7CisgICAgICAgICAgICAgICAgY29tbWVudHNDb2xsZWN0aW9uLmFkZENvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1lbnRUZXh0LnN0YXJ0c1dpdGgoIi8qIikpIHsKKyAgICAgICAgICAgICAgICBCbG9ja0NvbW1lbnQgY29tbWVudCA9IG5ldyBCbG9ja0NvbW1lbnQodG9rZW5SYW5nZSh0b2tlbiksIGNvbW1lbnRUZXh0LnN1YnN0cmluZygyLCBjb21tZW50VGV4dC5sZW5ndGgoKSAtIDIpKTsKKyAgICAgICAgICAgICAgICBjb21tZW50c0NvbGxlY3Rpb24uYWRkQ29tbWVudChjb21tZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWVudFRleHQuc3RhcnRzV2l0aCgiLy8iKSkgeworICAgICAgICAgICAgICAgIC8vIGxpbmUgY29tbWVudHMgaGF2ZSB0aGVpciBlbmQgb2YgbGluZSBjaGFyYWN0ZXIocykgaW5jbHVkZWQsIGFuZCB3ZSBkb24ndCB3YW50IHRoYXQuCisgICAgICAgICAgICAgICAgUmFuZ2UgcmFuZ2UgPSB0b2tlblJhbmdlKHRva2VuKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY29tbWVudFRleHQuZW5kc1dpdGgoIlxyIikgfHwgY29tbWVudFRleHQuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudFRleHQgPSBjb21tZW50VGV4dC5zdWJzdHJpbmcoMCwgY29tbWVudFRleHQubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZS53aXRoRW5kKHBvcyhyYW5nZS5iZWdpbi5saW5lLCByYW5nZS5iZWdpbi5jb2x1bW4gKyBjb21tZW50VGV4dC5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIExpbmVDb21tZW50IGNvbW1lbnQgPSBuZXcgTGluZUNvbW1lbnQodG9rZW5SYW5nZSh0b2tlbiksIGNvbW1lbnRUZXh0LnN1YnN0cmluZygyKSk7CisgICAgICAgICAgICAgICAgY29tbWVudHNDb2xsZWN0aW9uLmFkZENvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRGlkbid0IGV4cGVjdCB0byBnZXQgaGVyZS4gUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LiBbIiArIGNvbW1lbnRUZXh0ICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvKiogRGVidWcgb3V0cHV0LiAqLworICBwdWJsaWMgIGphdmEuaW8uUHJpbnRTdHJlYW0gZGVidWdTdHJlYW0gPSBTeXN0ZW0ub3V0OworICAvKiogU2V0IGRlYnVnIG91dHB1dC4gKi8KKyAgcHVibGljICB2b2lkIHNldERlYnVnU3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0gZHMpIHsgZGVidWdTdHJlYW0gPSBkczsgfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpeworICAgc3dpdGNoIChwb3MpCisgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZmZmZmZmUwMDAwMDAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4M2ZmZmZmZkwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMzsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTIgJiAweDQwMjBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0NTsKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUyICYgMHg0MDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhlZmY5ZmZlMDAwMDAwMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDNmZmZmZmZMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgIT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDM7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDA2MDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDUwOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4NDAwMDEzTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGViZmRmZmUwMDAwMDAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4M2JmZmZlY0wpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMzsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDM6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGUzZTVlOWUwMDAwMDAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MzFkZmZjYUwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMzsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgxODE2MDAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHhhMjAwMjRMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZTAyNTgwZTAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxMTFiN2NhTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTAzOworICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4M2MwNjkwMDAwMDAwMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDIwYzQ4MDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwNDAwNDAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHg4OTYwOEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhhMTIxODBhMDAwMDAwMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDExMTIxYzJMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDM7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA1OworICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMjEwMDgwMDAwMDAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4YzBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YTAwMDgwMjAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxMTEyMTAyTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTAzOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNjsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxMTAxMDJMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDM7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA3OworICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDIwMDAwMDAwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MTAwMjAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA4OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgxMDAxMDJMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMzsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDg7CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDk6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MTAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDM7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA5OworICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MTAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDM7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMDsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIC0xOworICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpeworICAgcmV0dXJuIGpqTW92ZU5mYV8wKGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChwb3MsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpLCBwb3MgKyAxKTsKK30KK3ByaXZhdGUgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQoreworICAgamptYXRjaGVkS2luZCA9IGtpbmQ7CisgICBqam1hdGNoZWRQb3MgPSBwb3M7CisgICByZXR1cm4gcG9zICsgMTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKXsKKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAyNjoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxNTYpOworICAgICAgY2FzZSAzMzoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTg7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDIwMDAwMDAwMDAwMDAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMzc6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTM3OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgwTCwgMHg0MDAwMEwpOworICAgICAgY2FzZSAzODoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMzQ7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDAwMDAwMDAwMDAwMDBMLCAweDgwMDBMKTsKKyAgICAgIGNhc2UgNDA6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTA2KTsKKyAgICAgIGNhc2UgNDE6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTA3KTsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTMyOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgwTCwgMHgyMDAwTCk7CisgICAgICBjYXNlIDQzOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzMDsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MEwsIDB4ODAxTCk7CisgICAgICBjYXNlIDQ0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDExMyk7CisgICAgICBjYXNlIDQ1OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzMTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MEwsIDB4ODAxMDAyTCk7CisgICAgICBjYXNlIDQ2OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDExNDsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MEwsIDB4NDAwMDAwTCk7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzMzsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDAwTCwgMHgwTCwgMHg0MDAwTCk7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyMTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MEwsIDB4MTAwMDAwMEwpOworICAgICAgY2FzZSA1OToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxMTIpOworICAgICAgY2FzZSA2MDoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTc7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDgwMDAwMDAwMDAwMDAwMEwsIDB4ODA0MDBMKTsKKyAgICAgIGNhc2UgNjE6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE2OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDAwMDAwMDAwMDAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTU1OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxMDAwMDAwMDAwMDAwMDAwTCwgMHg2MzAwMDAwTCk7CisgICAgICBjYXNlIDYzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDEyMCk7CisgICAgICBjYXNlIDY0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDExNSk7CisgICAgICBjYXNlIDkxOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDExMCk7CisgICAgICBjYXNlIDkzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDExMSk7CisgICAgICBjYXNlIDk0OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzNjsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MEwsIDB4MjAwMDBMKTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDYwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgOTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDM4MDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhmYzAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg3MDAwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MzgwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg3YzAwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTAzOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhmMDAwMDAwMDAwMDAwMDAwTCwgMHgzTCwgMHgwTCk7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NEwsIDB4MEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDM4TCwgMHgwTCk7CisgICAgICBjYXNlIDExMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4M2MwTCwgMHgwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MWY4MDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg3ZTAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTE4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxODAwMDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDExOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MjAwMDAwMEwsIDB4MEwpOworICAgICAgY2FzZSAxMjM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTA4KTsKKyAgICAgIGNhc2UgMTI0OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEzNTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NDAwMDAwMDAwMDAwMDAwMEwsIDB4MTAwMDBMKTsKKyAgICAgIGNhc2UgMTI1OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDEwOSk7CisgICAgICBjYXNlIDEyNjoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxMTkpOworICAgICAgY2FzZSAxMzM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNik7CisgICAgICBjYXNlIDE2MDoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA3KTsKKyAgICAgIGNhc2UgNTc2MDoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4KTsKKyAgICAgIGNhc2UgNjE1ODoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA5KTsKKyAgICAgIGNhc2UgODE5MjoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxMCk7CisgICAgICBjYXNlIDgxOTM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTEpOworICAgICAgY2FzZSA4MTk0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDEyKTsKKyAgICAgIGNhc2UgODE5NToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxMyk7CisgICAgICBjYXNlIDgxOTY6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTQpOworICAgICAgY2FzZSA4MTk3OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDE1KTsKKyAgICAgIGNhc2UgODE5ODoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxNik7CisgICAgICBjYXNlIDgxOTk6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMTcpOworICAgICAgY2FzZSA4MjAwOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDE4KTsKKyAgICAgIGNhc2UgODIwMToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAxOSk7CisgICAgICBjYXNlIDgyMDI6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjApOworICAgICAgY2FzZSA4MjAzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDIxKTsKKyAgICAgIGNhc2UgODIwNDoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyMik7CisgICAgICBjYXNlIDgyMDU6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjMpOworICAgICAgY2FzZSA4MjMyOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI0KTsKKyAgICAgIGNhc2UgODIzMzoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyNSk7CisgICAgICBjYXNlIDgyMzk6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjYpOworICAgICAgY2FzZSA4Mjg3OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI3KTsKKyAgICAgIGNhc2UgODI4ODoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyOCk7CisgICAgICBjYXNlIDEyMjg4OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI5KTsKKyAgICAgIGNhc2UgNjUyNzk6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzApOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMCwgMCk7CisgICB9Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpeworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgwLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDM4OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTI3KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAzMywgNTApOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQzOgorICAgICAgICAgaWYgKChhY3RpdmUyICYgMHgxTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTI4KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0NToKKyAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4MkwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyOSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4NDAwMDAwTCk7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgaWYgKChhY3RpdmUyICYgMHgxMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTUyKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2MDoKKyAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4NDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTM4OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMHg4MDAwMEwpOworICAgICAgY2FzZSA2MToKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTIyKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjQpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjUpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTIgJiAweDgwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEzOSk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MTAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE0MCk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MjAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE0MSk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4NDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE0Mik7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MTAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxNDQpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTIgJiAweDIwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTQ1KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHg0MDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE0Nik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBpZiAoKGFjdGl2ZTIgJiAweDgwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE1MSk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4NDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE1NDsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4MjMwMDAwMEwpOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAwYzAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDQ4TCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSA5ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4NDEwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDI6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDYwLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDIwZTA4MDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTgwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDgyMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDYwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwMTAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDNMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ5OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4YzA0YzA4MDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxODAwMDA0TCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHg3MDAxODBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDMwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDQyMjBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDgwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEyMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxMDAwMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTI0OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpeworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpIHwgKGFjdGl2ZTIgJj0gb2xkMikpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBvbGQwLCBvbGQxLCBvbGQyKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7CisgICAgICByZXR1cm4gMjsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0NjoKKyAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4NDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTUwKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2MToKKyAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4ODAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygyLCAxNDcpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTIgJiAweDEwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDE0OCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBpZiAoKGFjdGl2ZTIgJiAweDIwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNTM7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAweDIwMDAwMEwpOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MzAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxMDEwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MjAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDQwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MjgyODA4MEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4MTAwMDAyMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxODBjMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDEwMDA0TCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAwODAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4OTAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDYwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDQwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA1OCwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4YzIwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwODA0NjAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDY0OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODIwMGEwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHg0MGFMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTQwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDIwMDAwMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTE5OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgxMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgNjgsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgODYsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpeworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpIHwgKGFjdGl2ZTIgJj0gb2xkMikpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBvbGQwLCBvbGQxLCBvbGQyKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMiwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7CisgICAgICByZXR1cm4gMzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA2MToKKyAgICAgICAgIGlmICgoYWN0aXZlMiAmIDB4MjAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMywgMTQ5KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MzgxMDEwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxMDAwMDAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSA5ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4MTAwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA4NywgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDQxLCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDQyLCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNTEsIDQzKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgyMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDg1LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDA0MDAwMDAwMDAwTCwgYWN0aXZlMSwgMHg0MDAyTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDM6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDRMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDY2LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MjAwOEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTA3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4NDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MjBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDY5LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDAwMDgwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDIwMDAyMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDUyLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MTAwMDAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNTksIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4YzAwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA0NCwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4ODAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA4MSwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg0MDYwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDgwMjAwMDAwMDAwMEwsIGFjdGl2ZTEsIDB4OTEwMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTE3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4NDAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg4MEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDIsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCwgbG9uZyBvbGQxLCBsb25nIGFjdGl2ZTEsIGxvbmcgb2xkMiwgbG9uZyBhY3RpdmUyKXsKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSB8IChhY3RpdmUyICY9IG9sZDIpKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgb2xkMCwgb2xkMSwgb2xkMik7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDMsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIHJldHVybiA0OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHhjMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweGEwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNTQsIDQzKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgyMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA4OSwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwMDA4MDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxMDBMKTsKKyAgICAgIGNhc2UgMTA0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNDMsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDEwMDAwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxMjAwTCk7CisgICAgICBjYXNlIDEwNzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDQwLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDU1OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTA0MDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDc4LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDAwMDYwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDQwMkwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNDUsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDEwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNDYsIDQzKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDU3LCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4ODAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA3NSwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MTAwMDAwMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDExODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDhMKTsKKyAgICAgIGNhc2UgMTE5OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDgyOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDgwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSl7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBvbGQwLCBvbGQxLCAwTCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDQsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIHJldHVybiA1OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHhhMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MjAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA3MywgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDc2LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgxMDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA1MCwgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDhMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDY3LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MkwpOworICAgICAgY2FzZSAxMDM6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg0MEwpOworICAgICAgY2FzZSAxMDQ6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDgwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDc5LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MTEwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMTAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTA5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNzQsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwMDgwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MTAwMDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgODMsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDM4LCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNjIsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDIwODBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDQsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKXsKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDQsIG9sZDAsIG9sZDEsIDBMKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNSwgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOworICAgICAgcmV0dXJuIDY7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgyTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg4MDAwMDAyMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCA3MCwgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDgwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCA3MSwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MjAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgxMDAwMDAwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMzksIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgxMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCA1MywgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgNDgsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDEwMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTIxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDU2LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDUsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKXsKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDUsIG9sZDAsIG9sZDEsIDBMKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNiwgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOworICAgICAgcmV0dXJuIDc7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgyTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCA0NywgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDg4LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDEwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDExMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDIwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDc3LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAzNywgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSl7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBvbGQwLCBvbGQxLCAwTCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDcsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIHJldHVybiA4OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MTAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA3MiwgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MkwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgNjUsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgxMDAwMEwpOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MTAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA4NCwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCwgbG9uZyBvbGQxLCBsb25nIGFjdGl2ZTEpeworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgb2xkMCwgb2xkMSwgMEwpOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg4LCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7CisgICAgICByZXR1cm4gOTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAxMDI6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDksIDYzLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg5LCA2MSwgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgxMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoOCwgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTEwXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKXsKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDgsIG9sZDAsIG9sZDEsIDBMKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoOSwgMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIHJldHVybiAxMDsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAoYWN0aXZlMSwgMHgxMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoOSwgMEwsIGFjdGl2ZTEsIDBMKTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMV8wKGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKXsKKyAgIGlmICgoKGFjdGl2ZTEgJj0gb2xkMSkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCAwTCwgb2xkMSwgMEwpOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxMCwgMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIHJldHVybiAxMTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAxMDA6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxMSwgODAsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMTAsIDBMLCBhY3RpdmUxLCAwTCk7Cit9Citwcml2YXRlIGludCBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKGludCBwb3MsIGludCBraW5kLCBpbnQgc3RhdGUpCit7CisgICBqam1hdGNoZWRLaW5kID0ga2luZDsKKyAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBwb3MgKyAxOyB9CisgICByZXR1cm4gampNb3ZlTmZhXzAoc3RhdGUsIHBvcyArIDEpOworfQorc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzAgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzIgPSB7CisgICAweDBMLCAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzMgPSB7CisgICAweGZmZjAwMDAwMDAyMDAwMDJMLCAweGZmZmZmZmZmZmZmZmRmZmZMLCAweGZmZmZmMDBmN2ZmZmZmZmZMLCAweDEyMDAwMDAwMDA3ZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQgPSB7CisgICAweDBMLCAweDBMLCAweDQyMDA0M2MwMDAwMDAwMEwsIDB4ZmY3ZmZmZmZmZjdmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNSA9IHsKKyAgIDB4N2ZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZjAwMDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDQwMWYwMDAzZmZjM0wKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNiA9IHsKKyAgIDB4MEwsIDB4NDAwMDAwMDAwMDAwMDAwTCwgMHhmZmZmZmZmYmZmZmZkNzQwTCwgMHhmYmZmZmZmZmZmZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzcgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZjMDNMLCAweDMzZmZmZmZmZmZmN2ZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjOCA9IHsKKyAgIDB4ZmZmZTAwMDAwMDAwZmZmZkwsIDB4ZmZmZmZmZmUwMjdmZmZmZkwsIDB4ZmZMLCAweDcwN2ZmZmZmZjAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzkgPSB7CisgICAweDdmZmZmZmUwMDAwMDAwMEwsIDB4ZmZmZWMwMDAwMDAwMDdmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4OWMwMGMwNjAwMDJmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTAgPSB7CisgICAweGZmZmZmZmZkMDAwMEwsIDB4ZTAwMEwsIDB4MjAwM2ZmZmZmZmZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTEgPSB7CisgICAweDIzZmZmZmZmZmZmZmZmZjBMLCAweDNmZjAxMDAwMEwsIDB4MjNjNWZkZmZmZmY5OWZlMEwsIDB4ZjAwMDNiMDAwMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTIgPSB7CisgICAweDM2ZGZkZmZmZmY5ODdlMEwsIDB4MWMwMDAwNWUwMDAwMDBMLCAweDIzZWRmZGZmZmZmYmJmZTBMLCAweDIwMDAzMDAwMTAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzEzID0geworICAgMHgyM2VkZmRmZmZmZjk5ZmUwTCwgMHgyMDAwM2IwMDAwMDAwTCwgMHgzYmZjNzE4ZDYzZGM3ZThMLCAweDIwMDAwMDAwMDAwMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTQgPSB7CisgICAweDNlZmZkZmZmZmZkZGZlMEwsIDB4MzAwMDAwMDAwTCwgMHgyM2VmZmRmZmZmZmRkZmUwTCwgMHgzNDAwMDAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE1ID0geworICAgMHgzZmZmZGZmZmZmZGRmZTBMLCAweDMwMDAwMDAwMEwsIDB4MmZmYmZmZmZmYzdmZmZlMEwsIDB4N2ZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE2ID0geworICAgMHg4MDBkZmZmZmZmZmZmZmZlTCwgMHg3ZkwsIDB4MjAwZGVjYWVmZWYwMjU5NkwsIDB4MzAwMDAwNWZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE3ID0geworICAgMHgxTCwgMHg3ZmZmZmZmZmVmZkwsIDB4ZjAwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxOCA9IHsKKyAgIDB4NmZiZmZmZmZmZmZMLCAweDNmMDAwMEwsIDB4ZmZmZmZmZmYwMDAwMDAwMEwsIDB4MWZmZmZmZmZmZmYwMDNmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxOSA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmY4M2ZmZmZmZkwsIDB4ZmZmZmZmMDdmZmZmZmZmZkwsIDB4M2ZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyMCA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmY3ZkwsIDB4ZmZmZmZmZmYzZDdmM2Q3ZkwsIDB4N2YzZDdmZmZmZmZmM2Q3ZkwsIDB4ZmZmZjdmZmZmZjdmN2YzZEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjEgPSB7CisgICAweGZmZmZmZmZmN2YzZDdmZmZMLCAweDdmZmZmN2ZMLCAweGZmZmZmZmZmMDAwMDAwMDBMLCAweDFmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyMiA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4N2Y5ZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmMDdmZmZmZmVMLCAweDFjN2ZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzIzID0geworICAgMHgzZmZmZjAwMDNkZmZmTCwgMHgxZGZmZjAwMDNmZmZmTCwgMHhmZmZmZmZmZmZmZmZmTCwgMHgxODgwMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjQgPSB7CisgICAweGZmZmZmZmZmMDAwMDAwMDBMLCAweGZmZmZmZmZmZmZmZmZmTCwgMHgxZmZmZmZmZmZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjUgPSB7CisgICAweDFmZmZmZmZmTCwgMHgxZjNmZmZmZmZmMDAwMEwsIDB4MEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjYgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmTCwgMHgwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyNyA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmYwZmZmZmZmZkwsIDB4M2ZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyOCA9IHsKKyAgIDB4ZmZmZmZmZmYzZjNmZmZmZkwsIDB4M2ZmZmZmZmZhYWZmM2YzZkwsIDB4NWZkZmZmZmZmZmZmZmZmZkwsIDB4MWZkYzFmZmYwZmNmMWZkY0wKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjkgPSB7CisgICAweDgwMDAwMDAwMDAwMDAwMDBMLCAweDgwMDIwMDAwMDAxMDAwMDFMLCAweDNmZmZmMDAwMDAwMDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzMwID0geworICAgMHhlM2ZiYmQ1MDNlMmZmYzg0TCwgMHhmZmZmZmZmZjAwMDAwM2UwTCwgMHhmTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzMSA9IHsKKyAgIDB4MWYzZTAzZmUwMDAwMDBlMEwsIDB4ZmZmZmZmZmZmZmZmZmZmZUwsIDB4ZmZmZmZmZmVlMDdmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzIgPSB7CisgICAweGZmZmUxZmZmZmZmZmZmZTBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZjAwMDA3ZmZmTCwgMHhmZmZmMDAwMDAwMDAwMDAwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzMyA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmZmZmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzM0ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHgzZmZmZmZmZmZmTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzNSA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4MWZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzYgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzcgPSB7CisgICAweDZMLCAweDBMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzM4ID0geworICAgMHhmZmZmM2ZmZmZmZmZmZmZmTCwgMHg3ZmZmZmZmZmZmZkwsIDB4MEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzkgPSB7CisgICAweDVmN2ZmZGZmYTBmODAwN2ZMLCAweGZmZmZmZmZmZmZmZmZmZGJMLCAweDNmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmODAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQwID0geworICAgMHgzZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmYwMDAwTCwgMHhmZmZmZmZmZmZmZmNmZmZmTCwgMHgxZmZmMDAwMDAwMDAwMGZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0MSA9IHsKKyAgIDB4MTgwMDAwMDAwMDAwMDBMLCAweGZmZGYwMjAwMDAwMGUwMDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDFmZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQyID0geworICAgMHg4N2ZmZmZmZTAwMDAwMDEwTCwgMHhmZmZmZmZlMDA3ZmZmZmZlTCwgMHg3ZmZmZmZmZmZmZmZmZmZmTCwgMHg2MzFjZmNmY2ZjTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0MyA9IHsKKyAgIDB4MEwsIDB4MEwsIDB4NDIwMjQzY2ZmZmZmZmZmTCwgMHhmZjdmZmZmZmZmN2ZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0NCA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4NDAwZmZmZmUwZmZmZmZmTCwgMHhmZmZmZmZmYmZmZmZkNzQwTCwgMHhmYmZmZmZmZmZmZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQ1ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmYzdiTCwgMHgzM2ZmZmZmZmZmZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQ2ID0geworICAgMHhmZmZlMDAwMDAwMDBmZmZmTCwgMHhmZmZmZmZmZTAyN2ZmZmZmTCwgMHhiYmZmZmZmYmZmZmUwMGZmTCwgMHg3MDdmZmZmZmYwMDE2TAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0NyA9IHsKKyAgIDB4N2ZmZmZmZTAwM2YwMDBmTCwgMHhmZmZmYzNmZjAxZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHg5ZmZmZmRmZmJmZWZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0OCA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmODAwMEwsIDB4ZTdmZkwsIDB4M2ZmZmZmZmZmZmZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNDkgPSB7CisgICAweGYzZmZmZmZmZmZmZmZmZmVMLCAweGZmY2ZmZjFmM2ZmZkwsIDB4ZjNjNWZkZmZmZmY5OWZlZUwsIDB4ZmZmY2ZiMDgwMzk5ZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTAgPSB7CisgICAweGQzNmRmZGZmZmZmOTg3ZWVMLCAweDFmZmZjMDVlMDAzOTg3TCwgMHhmM2VkZmRmZmZmZmJiZmVlTCwgMHgyZmZjZjAwMDEzYmJmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1MSA9IHsKKyAgIDB4ZjNlZGZkZmZmZmY5OWZlZUwsIDB4MmZmYzNiMGMwMzk4ZkwsIDB4YzNiZmM3MThkNjNkYzdlY0wsIDB4MjAwZmY4MDAwODAzZGM3TAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1MiA9IHsKKyAgIDB4YzNlZmZkZmZmZmZkZGZlZUwsIDB4ZmZjMzAwNjAzZGRmTCwgMHhmM2VmZmRmZmZmZmRkZmVjTCwgMHhmZmMzNDA2MDNkZGZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzUzID0geworICAgMHhjM2ZmZmRmZmZmZmRkZmVjTCwgMHhmZmMzMDA4MDNkY2ZMLCAweDJmZmJmZmZmZmM3ZmZmZWNMLCAweGMwMDAwZmY1Zjg0N2ZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzU0ID0geworICAgMHg4N2ZmZmZmZmZmZmZmZmZlTCwgMHgzZmY3ZmZmTCwgMHgzYmZmZWNhZWZlZjAyNTk2TCwgMHgzM2ZmM2Y1ZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTUgPSB7CisgICAweGMyYTAwM2ZmMDMwMDAwMDFMLCAweGZmZmUwN2ZmZmZmZmZlZmZMLCAweDFmZmZmZmZmZmVmZjBmZGZMLCAweDQwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1NiA9IHsKKyAgIDB4M2M3ZjZmYmZmZmZmZmZmTCwgMHgzZmYwM2ZmTCwgMHhmZmZmZmZmZjAwMDAwMDAwTCwgMHgxZmZmZmZmZmZmZjAwM2ZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzU3ID0geworICAgMHhmZmZmZmZmZjdmM2Q3ZmZmTCwgMHgzZmUwMDA3ZmZmZjdmTCwgMHhmZmZmZmZmZjAwMDAwMDAwTCwgMHgxZmZmZmZmZmZmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTggPSB7CisgICAweDFmZmZmZjAwMWZkZmZmTCwgMHhkZGZmZjAwMGZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHgzZmYzODhmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTkgPSB7CisgICAweGZmZmZmZmZmMDNmZjM4MDBMLCAweGZmZmZmZmZmZmZmZmZmTCwgMHgzZmZmZmZmZmZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNjAgPSB7CisgICAweGZmZjBmZmYxZmZmZmZmZkwsIDB4MWYzZmZmZmZmZmZmYzBMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYxID0geworICAgMHg4MDAwN2MwMDAwMDBmMDAwTCwgMHg4MDAyZmMwZjAwMTAwMDAxTCwgMHgzZmZmZjAwMDAwMDAwTCwgMHg3ZTIxZmZmMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNjIgPSB7CisgICAweDFmM2VmZmZlMDAwMDAwZTBMLCAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZlZTY3ZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYzID0geworICAgMHgxMDAwMDAwMDAwMDAwNkwsIDB4MEwsIDB4MEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNjQgPSB7CisgICAweDNMLCAweDBMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzY1ID0geworICAgMHgwTCwgMHg4MDAwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzY2ID0geworICAgMHg1ZjdmZmRmZmUwZjgwMDdmTCwgMHhmZmZmZmZmZmZmZmZmZmRiTCwgMHgzZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZjgwMDAwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2NyA9IHsKKyAgIDB4MTgwMDBmMDAwMGZmZmZMLCAweGZmZGYwMjAwMDAwMGUwMDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDlmZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzY4ID0geworICAgMHg4N2ZmZmZmZTAzZmYwMDEwTCwgMHhmZmZmZmZlMDA3ZmZmZmZlTCwgMHg3ZmZmZmZmZmZmZmZmZmZmTCwgMHhlMDAwMDYzMWNmY2ZjZmNMCit9OworcHJpdmF0ZSBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpCit7CisgICBpbnQgc3RhcnRzQXQgPSAwOworICAgampuZXdTdGF0ZUNudCA9IDEzMDsKKyAgIGludCBpID0gMTsKKyAgIGpqc3RhdGVTZXRbMF0gPSBzdGFydFN0YXRlOworICAgaW50IGtpbmQgPSAweDdmZmZmZmZmOworICAgZm9yICg7OykKKyAgIHsKKyAgICAgIGlmICgrK2pqcm91bmQgPT0gMHg3ZmZmZmZmZikKKyAgICAgICAgIFJlSW5pdFJvdW5kcygpOworICAgICAgaWYgKGN1ckNoYXIgPCA2NCkKKyAgICAgIHsKKyAgICAgICAgIGxvbmcgbCA9IDFMIDw8IGN1ckNoYXI7CisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0MikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDUwOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMzEpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMzE7CisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDIpOyB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDkxKQorICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDkxOworICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygzLCAxNyk7IH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDcpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE4LCAxOSk7IH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzYpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDEwMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMDM7CisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkKDQzKTsgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzNCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzOSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMjQsIDI2KTsgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NikKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMSk7IH0KKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ4KQorICAgICAgICAgICAgICAgICAgICAgeyBqakFkZFN0YXRlcygyNywgMzQpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gOTYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTY7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzOCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoMiwgMyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA5NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5NjsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMzksIDQxKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCg2KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDcsIDgpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gOTYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTY7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDYsIDkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg0NSwgNDgpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMjQsIDI2KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmRiZmZMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkKDE0KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDEwMSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMDE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMTQpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE4LCAxNCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMTQpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCgxOCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkKDE0KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDIwLCAyMyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZkYmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygyMCwgMjMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQgJiYga2luZCA+IDEwMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxMDI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDU0LCA1OCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA0MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMzkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzNikKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMDMpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTAzOworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCg0Myk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDEwMGZmZmMxZmZMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTAzKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDEwMzsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNDMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTgsIDE5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZmZmZmRiZmZMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMzE7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDIpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gMzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMzE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMCAmJiBraW5kID4gMzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMzE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQ4OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDUwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDIpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmN2ZmZmZmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiAzMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAzMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQyKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDkxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDkxOworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygzLCAxNyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDU0LCA1NSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NToKKyAgICAgICAgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCg1Nik7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDU3LCA1OCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgICAgIGNhc2UgMTA5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gOTEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcyg1OSwgNjApOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg1OSwgNjEpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg2MiwgNjUpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCg2NCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDY2LCA2OCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDY1LCA2Nik7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDY0LCA5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoNjksIDcyKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoNzMsIDc3KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoNjksIDcwKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDcwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoNzEsIDcyKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDcxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoNzgsIDgwKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDczOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNzQpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg4MSwgODMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcyg3NSwgNzYpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcyg3NCwgOSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gOTYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTY7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDg0LCA4Nyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3ODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDg4LCA5MSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3OToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDc5LCA4MCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDgxLCA4Mik7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDkyLCA5NCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ2KQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg5NSwgOTcpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcyg5OCwgMTAxKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoODQsIDg1KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA5NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5NjsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoOTUsIDk3KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoODgpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygxMDIsIDEwNCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4OToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDg5LCA5MCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gOTYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTY7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDg4LCA5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDkxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA5NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5NjsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMTA1LCAxMDgpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDk2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk2OworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygxMDksIDExMyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDExNCwgMTE3KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDgpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDI3LCAzNCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5NjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDExOCwgMTIwKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoOTcsIDk4KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygxMjEsIDEyMyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwMCwgMTAxKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNTYpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTAzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDMwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDEyNCwgMTI2KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwNDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcygxMDQsIDEwNSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MzAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNTYpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA5MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5MTsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoMTA4LCAxMDkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoMTA4LCAxMDkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTEwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDkxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDkxOworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcygxMTEsIDExMik7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExMSwgMTEyKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gOTEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDMwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gOTEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTE7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExNSwgMTE2KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcygxMTUsIDExNik7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MzAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gOTEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTI3LCAxMjgpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDYpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkKDEyMCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFR3b1N0YXRlcygxMjAsIDEyMSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCgxMjMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTIzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA5NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5NjsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoMTIzLCA5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDEyOSwgMTMxKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ2KQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCgxMjcpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMTI5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gOTYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gOTY7CisgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEyOSwgOSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCisgICAgICB7CisgICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7CisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTAzKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDEwMzsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNDMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgeyBqakFkZFN0YXRlcygxMzIsIDEzMyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDEzNCwgMTM1KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTM2LCAxMzcpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg1MDAwMDAwMDUwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5NjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCgxNCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQorICAgICAgICAgICAgICAgICAgICAgeyBqakFkZFN0YXRlcygxMzgsIDE0MCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxNDQwNDQxMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMTQpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCgxNCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE0MSwgMTQzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDEwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygyMCwgMjMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygyMCwgMjMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTAzKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDEwMzsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNDMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDY6CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDMxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDMxOworICAgICAgICAgICAgICAgICAgeyBqakFkZFN0YXRlcygwLCAyKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAzMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAzMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgeyBqakFkZFN0YXRlcygxNDQsIDE0NSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDkwKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDkwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE0NiwgMTQ3KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE0OCwgMTQ5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDYyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE1MCwgMTUxKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE1MiwgMTUzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE1NCwgMTU1KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDcyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE1NiwgMTU3KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE1OCwgMTU5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE2MCwgMTYxKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE2MiwgMTYzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE2NCwgMTY1KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDE2NiwgMTY3KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDk2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkU3RhdGVzKDExOCwgMTIwKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlODAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDk3LCA5OCk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5ODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCg1Nik7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTY4LCAxNjkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTAyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDQwMDAwMDAwNEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDQ6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTcwLCAxNzEpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA5MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5MTsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoMTA4LCAxMDkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlODAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwOCwgMTA5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTcyLCAxNzMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTEzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDQwMDAwMDAwNEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTc0LCAxNzUpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGRUd29TdGF0ZXMoMTE4LCAxMTkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICB7IGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExOCwgMTE5KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakFkZFN0YXRlcygxNzYsIDE3Nyk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTc4LCAxNzkpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTI0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoMTI1KTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZFN0YXRlcygxMjksIDEzMSk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMTgwLCAxODEpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpbnQgaGlCeXRlID0gKGN1ckNoYXIgPj4gOCk7CisgICAgICAgICBpbnQgaTEgPSBoaUJ5dGUgPj4gNjsKKyAgICAgICAgIGxvbmcgbDEgPSAxTCA8PCAoaGlCeXRlICYgMDc3KTsKKyAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKKyAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7CisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmICghampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMTAzKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDEwMzsKKyAgICAgICAgICAgICAgICAgIHsgampDaGVja05BZGQoNDMpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIHsgampBZGRTdGF0ZXMoMjAsIDIzKTsgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMihoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxMDMpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTAzOworICAgICAgICAgICAgICAgICAgeyBqakNoZWNrTkFkZCg0Myk7IH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgIGlmICghampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMzE7CisgICAgICAgICAgICAgICAgICB7IGpqQWRkU3RhdGVzKDAsIDIpOyB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikgJiYga2luZCA+IDMyKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDMyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogaWYgKGkxID09IDAgfHwgbDEgPT0gMCB8fCBpMiA9PSAwIHx8ICBsMiA9PSAwKSBicmVhazsgZWxzZSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBpZiAoa2luZCAhPSAweDdmZmZmZmZmKQorICAgICAgeworICAgICAgICAgamptYXRjaGVkS2luZCA9IGtpbmQ7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSBjdXJQb3M7CisgICAgICAgICBraW5kID0gMHg3ZmZmZmZmZjsKKyAgICAgIH0KKyAgICAgICsrY3VyUG9zOworICAgICAgaWYgKChpID0gampuZXdTdGF0ZUNudCkgPT0gKHN0YXJ0c0F0ID0gMTMwIC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQorICAgICAgICAgcmV0dXJuIGN1clBvczsKKyAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KKyAgIH0KK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzIoKXsKKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8yKDB4ODAwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiAxOworICAgfQorfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMihsb25nIGFjdGl2ZTApeworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAzNSk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIDI7CisgICB9CisgICByZXR1cm4gMjsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzEoKXsKKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8xKDB4NDAwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiAxOworICAgfQorfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMShsb25nIGFjdGl2ZTApeworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAzNCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIDI7CisgICB9CisgICByZXR1cm4gMjsKK30KK3N0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7CisgICA0NiwgNDcsIDQ5LCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MiwgOSwgNjksIDcyLCA3OSwgODIsIDkzLCAKKyAgIDc4LCA2OCwgNDUsIDUyLCAyOCwgMjksIDM2LCAzNywgMTMsIDE1LCAyNiwgOTUsIDk5LCAxMDIsIDEwNiwgMTEwLCAKKyAgIDExMywgMTE3LCAxMjQsIDIsIDQsIDksIDExLCAxLCA0LCA5LCA3LCA5LCAxMCwgNiwgNywgOSwgCisgICAxMCwgMSwgMiwgNCwgOSwgMTEsIDI4LCAyOSwgMzksIDM2LCAzNywgNjEsIDYyLCA5LCA1OSwgNjIsIAorICAgOSwgNjgsIDY1LCA5LCA2NywgNjQsIDY1LCA5LCA2NywgNjEsIDU5LCA2MiwgOSwgNjgsIDY5LCA3MiwgCisgICA3OCwgNzUsIDksIDc3LCA3NCwgNzUsIDksIDc3LCA3MSwgNjksIDcyLCA3OCwgNzksIDgyLCA5MywgODMsIAorICAgODYsIDksIDg0LCA4NiwgOSwgOTIsIDg5LCA5LCA5MSwgODgsIDg5LCA5LCA5MSwgODMsIDg0LCA4NiwgCisgICA5LCA5MiwgODEsIDc5LCA4MiwgOTMsIDk3LCA5OCwgNTYsIDEwMCwgMTAxLCA1NiwgMTA0LCAxMDUsIDU2LCAxMTgsIAorICAgMTE5LCAxMjUsIDEyNiwgMTI3LCAyLCAzLCA1LCA2LCA3LCA4LCAxNiwgMTcsIDE5LCAzMCwgMzgsIDQwLCAKKyAgIDU0LCA1NSwgNTcsIDU4LCA1OSwgNjAsIDYzLCA2NCwgNjUsIDY2LCA2OSwgNzAsIDczLCA3NCwgNzUsIDc2LCAKKyAgIDc5LCA4MCwgODQsIDg1LCA4NywgODgsIDg5LCA5MCwgMTAwLCAxMDEsIDEwNCwgMTA1LCAxMTEsIDExMiwgMTE1LCAxMTYsIAorICAgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjgsIDEyOSwgCit9OworcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqakNhbk1vdmVfMChpbnQgaGlCeXRlLCBpbnQgaTEsIGludCBpMiwgbG9uZyBsMSwgbG9uZyBsMikKK3sKKyAgIHN3aXRjaChoaUJ5dGUpCisgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgaWYgKChqamJpdFZlYzBbaTFdICYgbDEpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9Citwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8xKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQoreworICAgc3dpdGNoKGhpQnl0ZSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDM6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjN1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDY6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgOToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTFbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzEyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDExOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxM1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxNltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE3OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxOVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxODoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTk6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzIxW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzI0W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyNVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyOToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzI3W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMxOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzM6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzMwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDQ4OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzMVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0OToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNzc6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzMzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE1OToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTY0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzNVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyMTU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIxNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjUwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM5W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1MzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjU0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0MVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzQyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGlmICgoampiaXRWZWMzW2kxXSAmIGwxKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqakNhbk1vdmVfMihpbnQgaGlCeXRlLCBpbnQgaTEsIGludCBpMiwgbG9uZyBsMSwgbG9uZyBsMikKK3sKKyAgIHN3aXRjaChoaUJ5dGUpCisgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzQzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDhbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgOToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzUwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDExOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1MVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzUzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1NFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzU2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE3OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxOVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxODoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTk6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzU3W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNThbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzU5W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2MFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyOToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzI3W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMxOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNjFbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzM6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzMwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDQ4OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2MltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0OToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNzc6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzMzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE1OToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTY0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzNVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyMTU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIxNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNjNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjIwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2NFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyMjE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzY1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1MDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzhbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjUxOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2NltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTM6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzQwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1NDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNjdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjU1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2OFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBpZiAoKGpqYml0VmVjM1tpMV0gJiBsMSkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworLyoqIFRva2VuIGxpdGVyYWwgdmFsdWVzLiAqLworcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBqanN0ckxpdGVyYWxJbWFnZXMgPSB7CisiIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgCitudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKK251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAorIlwxNDFcMTQyXDE2M1wxNjRcMTYyXDE0MVwxNDNcMTY0IiwgIlwxNDFcMTYzXDE2M1wxNDVcMTYyXDE2NCIsICJcMTQyXDE1N1wxNTdcMTU0XDE0NVwxNDFcMTU2IiwgCisiXDE0MlwxNjJcMTQ1XDE0MVwxNTMiLCAiXDE0MlwxNzFcMTY0XDE0NSIsICJcMTQzXDE0MVwxNjNcMTQ1IiwgIlwxNDNcMTQxXDE2NFwxNDNcMTUwIiwgCisiXDE0M1wxNTBcMTQxXDE2MiIsICJcMTQzXDE1NFwxNDFcMTYzXDE2MyIsICJcMTQzXDE1N1wxNTZcMTYzXDE2NCIsIAorIlwxNDNcMTU3XDE1NlwxNjRcMTUxXDE1NlwxNjVcMTQ1IiwgIlwxNDRcMTQ1XDE0NlwxNDFcMTY1XDE1NFwxNjQiLCAiXDE0NFwxNTciLCAiXDE0NFwxNTdcMTY1XDE0MlwxNTRcMTQ1IiwgCisiXDE0NVwxNTRcMTYzXDE0NSIsICJcMTQ1XDE1NlwxNjVcMTU1IiwgIlwxNDVcMTcwXDE2NFwxNDVcMTU2XDE0NFwxNjMiLCAiXDE0NlwxNDFcMTU0XDE2M1wxNDUiLCAKKyJcMTQ2XDE1MVwxNTZcMTQxXDE1NCIsICJcMTQ2XDE1MVwxNTZcMTQxXDE1NFwxNTRcMTcxIiwgIlwxNDZcMTU0XDE1N1wxNDFcMTY0IiwgIlwxNDZcMTU3XDE2MiIsIAorIlwxNDdcMTU3XDE2NFwxNTciLCAiXDE1MVwxNDYiLCAiXDE1MVwxNTVcMTYwXDE1NFwxNDVcMTU1XDE0NVwxNTZcMTY0XDE2MyIsIAorIlwxNTFcMTU1XDE2MFwxNTdcMTYyXDE2NCIsICJcMTUxXDE1NlwxNjNcMTY0XDE0MVwxNTZcMTQzXDE0NVwxNTdcMTQ2IiwgIlwxNTFcMTU2XDE2NCIsIAorIlwxNTFcMTU2XDE2NFwxNDVcMTYyXDE0NlwxNDFcMTQzXDE0NSIsICJcMTU0XDE1N1wxNTZcMTQ3IiwgIlwxNTZcMTQxXDE2NFwxNTFcMTY2XDE0NSIsICJcMTU2XDE0NVwxNjciLCAKKyJcMTU2XDE2NVwxNTRcMTU0IiwgIlwxNjBcMTQxXDE0M1wxNTNcMTQxXDE0N1wxNDUiLCAiXDE2MFwxNjJcMTUxXDE2NlwxNDFcMTY0XDE0NSIsIAorIlwxNjBcMTYyXDE1N1wxNjRcMTQ1XDE0M1wxNjRcMTQ1XDE0NCIsICJcMTYwXDE2NVwxNDJcMTU0XDE1MVwxNDMiLCAiXDE2MlwxNDVcMTY0XDE2NVwxNjJcMTU2IiwgCisiXDE2M1wxNTBcMTU3XDE2MlwxNjQiLCAiXDE2M1wxNjRcMTQxXDE2NFwxNTFcMTQzIiwgIlwxNjNcMTY0XDE2MlwxNTFcMTQzXDE2NFwxNDZcMTYwIiwgCisiXDE2M1wxNjVcMTYwXDE0NVwxNjIiLCAiXDE2M1wxNjdcMTUxXDE2NFwxNDNcMTUwIiwgCisiXDE2M1wxNzFcMTU2XDE0M1wxNTBcMTYyXDE1N1wxNTZcMTUxXDE3MlwxNDVcMTQ0IiwgIlwxNjRcMTUwXDE1MVwxNjMiLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjciLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjdcMTYzIiwgCisiXDE2NFwxNjJcMTQxXDE1NlwxNjNcMTUxXDE0NVwxNTZcMTY0IiwgIlwxNjRcMTYyXDE2NVwxNDUiLCAiXDE2NFwxNjJcMTcxIiwgIlwxNjZcMTU3XDE1MVwxNDQiLCAKKyJcMTY2XDE1N1wxNTRcMTQxXDE2NFwxNTFcMTU0XDE0NSIsICJcMTY3XDE1MFwxNTFcMTU0XDE0NSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAorbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlw1MCIsICJcNTEiLCAiXDE3MyIsICJcMTc1IiwgIlwxMzMiLCAKKyJcMTM1IiwgIlw3MyIsICJcNTQiLCAiXDU2IiwgIlwxMDAiLCAiXDc1IiwgIlw3NCIsICJcNDEiLCAiXDE3NiIsICJcNzciLCAiXDcyIiwgCisiXDc1XDc1IiwgIlw3NFw3NSIsICJcNzZcNzUiLCAiXDQxXDc1IiwgIlwxNzRcMTc0IiwgIlw0Nlw0NiIsICJcNTNcNTMiLCAiXDU1XDU1IiwgIlw1MyIsIAorIlw1NSIsICJcNTIiLCAiXDU3IiwgIlw0NiIsICJcMTc0IiwgIlwxMzYiLCAiXDQ1IiwgIlw3NFw3NCIsICJcNTNcNzUiLCAiXDU1XDc1IiwgCisiXDUyXDc1IiwgIlw1N1w3NSIsICJcNDZcNzUiLCAiXDE3NFw3NSIsICJcMTM2XDc1IiwgIlw0NVw3NSIsICJcNzRcNzRcNzUiLCAiXDc2XDc2XDc1IiwgCisiXDc2XDc2XDc2XDc1IiwgIlw1Nlw1Nlw1NiIsICJcNTVcNzYiLCAiXDcyXDcyIiwgIlw3Nlw3Nlw3NiIsICJcNzZcNzYiLCAiXDc2IiwgIlwzMiIsIH07Citwcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKQoreworICAgZmluYWwgVG9rZW4gdDsKKyAgIGZpbmFsIFN0cmluZyBjdXJUb2tlbkltYWdlOworICAgZmluYWwgaW50IGJlZ2luTGluZTsKKyAgIGZpbmFsIGludCBlbmRMaW5lOworICAgZmluYWwgaW50IGJlZ2luQ29sdW1uOworICAgZmluYWwgaW50IGVuZENvbHVtbjsKKyAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKKyAgIGN1clRva2VuSW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOworICAgYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOworICAgYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKKyAgIGVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOworICAgZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOworICAgdCA9IEFTVFBhcnNlci5HVFRva2VuLm5ld1Rva2VuKGpqbWF0Y2hlZEtpbmQsIGN1clRva2VuSW1hZ2UpOworCisgICB0LmJlZ2luTGluZSA9IGJlZ2luTGluZTsKKyAgIHQuZW5kTGluZSA9IGVuZExpbmU7CisgICB0LmJlZ2luQ29sdW1uID0gYmVnaW5Db2x1bW47CisgICB0LmVuZENvbHVtbiA9IGVuZENvbHVtbjsKKworICAgcmV0dXJuIHQ7Cit9CisKK2ludCBjdXJMZXhTdGF0ZSA9IDA7CitpbnQgZGVmYXVsdExleFN0YXRlID0gMDsKK2ludCBqam5ld1N0YXRlQ250OworaW50IGpqcm91bmQ7CitpbnQgamptYXRjaGVkUG9zOworaW50IGpqbWF0Y2hlZEtpbmQ7CisKKy8qKiBHZXQgdGhlIG5leHQgVG9rZW4uICovCitwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgCit7CisgIFRva2VuIHNwZWNpYWxUb2tlbiA9IG51bGw7CisgIFRva2VuIG1hdGNoZWRUb2tlbjsKKyAgaW50IGN1clBvcyA9IDA7CisKKyAgRU9GTG9vcCA6CisgIGZvciAoOzspCisgIHsKKyAgIHRyeQorICAgeworICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7CisgICB9CisgICBjYXRjaChFeGNlcHRpb24gZSkKKyAgIHsKKyAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOworICAgICAgamptYXRjaGVkUG9zID0gLTE7CisgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOworICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKKyAgICAgIENvbW1vblRva2VuQWN0aW9uKG1hdGNoZWRUb2tlbik7CisgICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOworICAgfQorICAgaW1hZ2UgPSBqamltYWdlOworICAgaW1hZ2Uuc2V0TGVuZ3RoKDApOworICAgamppbWFnZUxlbiA9IDA7CisKKyAgIGZvciAoOzspCisgICB7CisgICAgIHN3aXRjaChjdXJMZXhTdGF0ZSkKKyAgICAgeworICAgICAgIGNhc2UgMDoKKyAgICAgICAgIHRyeSB7IGlucHV0X3N0cmVhbS5iYWNrdXAoMCk7CisgICAgICAgICAgICB3aGlsZSAoY3VyQ2hhciA8PSAzMiAmJiAoMHgxMDAwMDM2MDBMICYgKDFMIDw8IGN1ckNoYXIpKSAhPSAwTCkKKyAgICAgICAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOworICAgICAgICAgfQorICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgY29udGludWUgRU9GTG9vcDsgfQorICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOworICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOworICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAxOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOworICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpOworICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA9PSAwICYmIGpqbWF0Y2hlZEtpbmQgPiAzNikKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzNjsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgMjoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKKyAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzIoKTsKKyAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPT0gMCAmJiBqam1hdGNoZWRLaW5kID4gMzYpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMzY7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgfQorICAgICBpZiAoamptYXRjaGVkS2luZCAhPSAweDdmZmZmZmZmKQorICAgICB7CisgICAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQorICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGN1clBvcyAtIGpqbWF0Y2hlZFBvcyAtIDEpOworICAgICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQorICAgICAgICB7CisgICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7CisgICAgICAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47CisgICAgICAgICAgIFRva2VuTGV4aWNhbEFjdGlvbnMobWF0Y2hlZFRva2VuKTsKKyAgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKKyAgICAgICAgIGN1ckxleFN0YXRlID0gampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXTsKKyAgICAgICAgICAgQ29tbW9uVG9rZW5BY3Rpb24obWF0Y2hlZFRva2VuKTsKKyAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoamp0b1NraXBbamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKKyAgICAgICAgeworICAgICAgICAgICBpZiAoKGpqdG9TcGVjaWFsW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKKyAgICAgICAgICAgICAgaWYgKHNwZWNpYWxUb2tlbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBtYXRjaGVkVG9rZW47CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOworICAgICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSAoc3BlY2lhbFRva2VuLm5leHQgPSBtYXRjaGVkVG9rZW4pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFNraXBMZXhpY2FsQWN0aW9ucyhtYXRjaGVkVG9rZW4pOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgU2tpcExleGljYWxBY3Rpb25zKG51bGwpOworICAgICAgICAgaWYgKGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF0gIT0gLTEpCisgICAgICAgICAgIGN1ckxleFN0YXRlID0gampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXTsKKyAgICAgICAgICAgY29udGludWUgRU9GTG9vcDsKKyAgICAgICAgfQorICAgICAgICBNb3JlTGV4aWNhbEFjdGlvbnMoKTsKKyAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQorICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07CisgICAgICAgIGN1clBvcyA9IDA7CisgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICB0cnkgeworICAgICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IH0KKyAgICAgfQorICAgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisgICAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7CisgICAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOworICAgICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQorICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICBFT0ZTZWVuID0gdHJ1ZTsKKyAgICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7CisgICAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7CisgICAgICAgICAgIGVycm9yX2xpbmUrKzsKKyAgICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgIGVycm9yX2NvbHVtbisrOworICAgICB9CisgICAgIGlmICghRU9GU2VlbikgeworICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKKyAgICAgfQorICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFeGNlcHRpb24oRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXhjZXB0aW9uLkxFWElDQUxfRVJST1IpOworICAgfQorICB9Cit9CisKK3ZvaWQgU2tpcExleGljYWxBY3Rpb25zKFRva2VuIG1hdGNoZWRUb2tlbikKK3sKKyAgIHN3aXRjaChqam1hdGNoZWRLaW5kKQorICAgeworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KK30KK3ZvaWQgTW9yZUxleGljYWxBY3Rpb25zKCkKK3sKKyAgIGpqaW1hZ2VMZW4gKz0gKGxlbmd0aE9mTWF0Y2ggPSBqam1hdGNoZWRQb3MgKyAxKTsKKyAgIHN3aXRjaChqam1hdGNoZWRLaW5kKQorICAgeworICAgICAgY2FzZSAzMiA6CisgICAgICAgICBpbWFnZS5hcHBlbmQoaW5wdXRfc3RyZWFtLkdldFN1ZmZpeChqamltYWdlTGVuKSk7CisgICAgICAgICBqamltYWdlTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorfQordm9pZCBUb2tlbkxleGljYWxBY3Rpb25zKFRva2VuIG1hdGNoZWRUb2tlbikKK3sKKyAgIHN3aXRjaChqam1hdGNoZWRLaW5kKQorICAgeworICAgICAgY2FzZSAxNTMgOgorICAgICAgICBpbWFnZS5hcHBlbmQoampzdHJMaXRlcmFsSW1hZ2VzWzE1M10pOworICAgICAgICBsZW5ndGhPZk1hdGNoID0gampzdHJMaXRlcmFsSW1hZ2VzWzE1M10ubGVuZ3RoKCk7CisgICAgIG1hdGNoZWRUb2tlbi5raW5kID0gR1Q7CisgICAgICgoQVNUUGFyc2VyLkdUVG9rZW4pbWF0Y2hlZFRva2VuKS5yZWFsS2luZCA9IFJVTlNJR05FRFNISUZUOworICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDIpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE1NCA6CisgICAgICAgIGltYWdlLmFwcGVuZChqanN0ckxpdGVyYWxJbWFnZXNbMTU0XSk7CisgICAgICAgIGxlbmd0aE9mTWF0Y2ggPSBqanN0ckxpdGVyYWxJbWFnZXNbMTU0XS5sZW5ndGgoKTsKKyAgICAgbWF0Y2hlZFRva2VuLmtpbmQgPSBHVDsKKyAgICAgKChBU1RQYXJzZXIuR1RUb2tlbiltYXRjaGVkVG9rZW4pLnJlYWxLaW5kID0gUlNJR05FRFNISUZUOworICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorfQorcHJpdmF0ZSB2b2lkIGpqQ2hlY2tOQWRkKGludCBzdGF0ZSkKK3sKKyAgIGlmIChqanJvdW5kc1tzdGF0ZV0gIT0gampyb3VuZCkKKyAgIHsKKyAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IHN0YXRlOworICAgICAgampyb3VuZHNbc3RhdGVdID0gampyb3VuZDsKKyAgIH0KK30KK3ByaXZhdGUgdm9pZCBqakFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICBkbyB7CisgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBqam5leHRTdGF0ZXNbc3RhcnRdOworICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOworfQorcHJpdmF0ZSB2b2lkIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKGludCBzdGF0ZTEsIGludCBzdGF0ZTIpCit7CisgICBqakNoZWNrTkFkZChzdGF0ZTEpOworICAgampDaGVja05BZGQoc3RhdGUyKTsKK30KKworcHJpdmF0ZSB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKK3sKKyAgIGRvIHsKKyAgICAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOworICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOworfQorCisgICAgLyoqIENvbnN0cnVjdG9yLiAqLworICAgIHB1YmxpYyBBU1RQYXJzZXJUb2tlbk1hbmFnZXIoSmF2YUNoYXJTdHJlYW0gc3RyZWFtKXsKKworICAgICAgaWYgKEphdmFDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOworCisgICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgQVNUUGFyc2VyVG9rZW5NYW5hZ2VyIChKYXZhQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSl7CisgICAgUmVJbml0KHN0cmVhbSk7CisgICAgU3dpdGNoVG8obGV4U3RhdGUpOworICB9CisKKyAgLyoqIFJlaW5pdGlhbGlzZSBwYXJzZXIuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChKYXZhQ2hhclN0cmVhbSBzdHJlYW0pCisgIHsKKwkKKyAgICBqam1hdGNoZWRQb3MgPSBqam5ld1N0YXRlQ250ID0gMDsKKyAgICBjdXJMZXhTdGF0ZSA9IGRlZmF1bHRMZXhTdGF0ZTsKKyAgICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07CisgICAgUmVJbml0Um91bmRzKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgUmVJbml0Um91bmRzKCkKKyAgeworICAgIGludCBpOworICAgIGpqcm91bmQgPSAweDgwMDAwMDAxOworICAgIGZvciAoaSA9IDEzMDsgaS0tID4gMDspCisgICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7CisgIH0KKworICAvKiogUmVpbml0aWFsaXNlIHBhcnNlci4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KCBKYXZhQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKKyAgeworICAKKyAgICBSZUluaXQoIHN0cmVhbSk7CisgICAgU3dpdGNoVG8obGV4U3RhdGUpOworICB9CisKKyAgLyoqIFN3aXRjaCB0byBzcGVjaWZpZWQgbGV4IHN0YXRlLiAqLworICBwdWJsaWMgdm9pZCBTd2l0Y2hUbyhpbnQgbGV4U3RhdGUpCisgIHsKKyAgICBpZiAobGV4U3RhdGUgPj0gMyB8fCBsZXhTdGF0ZSA8IDApCisgICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFeGNlcHRpb24oIkVycm9yOiBJZ25vcmluZyBpbnZhbGlkIGxleGljYWwgc3RhdGUgOiAiICsgbGV4U3RhdGUgKyAiLiBTdGF0ZSB1bmNoYW5nZWQuIiwgVG9rZW5NZ3JFeGNlcHRpb24uSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKKyAgICBlbHNlCisgICAgICBjdXJMZXhTdGF0ZSA9IGxleFN0YXRlOworICB9CisKKy8qKiBMZXhlciBzdGF0ZSBuYW1lcy4gKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV4U3RhdGVOYW1lcyA9IHsKKyAgICJERUZBVUxUIiwKKyAgICJJTl9KQVZBX0RPQ19DT01NRU5UIiwKKyAgICJJTl9NVUxUSV9MSU5FX0NPTU1FTlQiLAorfTsKKworLyoqIExleCBTdGF0ZSBhcnJheS4gKi8KK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gampuZXdMZXhTdGF0ZSA9IHsKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxLCAyLCAwLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1Rva2VuID0geworICAgMHhmZmZmZmZlMDAwMDAwMDAxTCwgMHhmZmZmZmNlMTBmZmZmZmZmTCwgMHgxZmZmZmZmZkwsIAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7CisgICAweGNmZmZmZmZmZUwsIDB4MEwsIDB4MEwsIAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1NwZWNpYWwgPSB7CisgICAweGM4MDAwMDAwMEwsIDB4MEwsIDB4MEwsIAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b01vcmUgPSB7CisgICAweDEzMDAwMDAwMDBMLCAweDBMLCAweDBMLCAKK307CisgICAgcHJvdGVjdGVkIEphdmFDaGFyU3RyZWFtICBpbnB1dF9zdHJlYW07CisKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIGpqcm91bmRzID0gbmV3IGludFsxMzBdOworICAgIHByaXZhdGUgZmluYWwgaW50W10gampzdGF0ZVNldCA9IG5ldyBpbnRbMiAqIDEzMF07CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgamppbWFnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIGltYWdlID0gamppbWFnZTsKKyAgICBwcml2YXRlIGludCBqamltYWdlTGVuOworICAgIHByaXZhdGUgaW50IGxlbmd0aE9mTWF0Y2g7CisgICAgCisgICAgcHJvdGVjdGVkIGludCBjdXJDaGFyOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhQ2hhclN0cmVhbS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhQ2hhclN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTI0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFDaGFyU3RyZWFtLmphdmEKQEAgLTAsMCArMSw1NjAgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSmF2YUNoYXJTdHJlYW0uamF2YSBWZXJzaW9uIDYuMSAqLworLyogSmF2YUNDT3B0aW9uczpTVEFUSUM9ZmFsc2UsU1VQUE9SVF9DTEFTU19WSVNJQklMSVRZX1BVQkxJQz10cnVlICovCisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuCisgKgorICogSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgQ2hhclN0cmVhbSwgd2hlcmUgdGhlIHN0cmVhbSBpcyBhc3N1bWVkIHRvCisgKiBjb250YWluIG9ubHkgQVNDSUkgY2hhcmFjdGVycyAod2l0aCBqYXZhLWxpa2UgdW5pY29kZSBlc2NhcGUgcHJvY2Vzc2luZykuCisgKi8KKyAKKworcHVibGljCitjbGFzcyBKYXZhQ2hhclN0cmVhbQoreworICAvKiogV2hldGhlciBwYXJzZXIgaXMgc3RhdGljLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOworCisKKyAgc3RhdGljIGZpbmFsIGludCBoZXh2YWwoY2hhciBjKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoKGMpCisgICAgeworICAgICAgIGNhc2UgJzAnIDoKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICBjYXNlICcxJyA6CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgY2FzZSAnMicgOgorICAgICAgICAgIHJldHVybiAyOworICAgICAgIGNhc2UgJzMnIDoKKyAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICBjYXNlICc0JyA6CisgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgY2FzZSAnNScgOgorICAgICAgICAgIHJldHVybiA1OworICAgICAgIGNhc2UgJzYnIDoKKyAgICAgICAgICByZXR1cm4gNjsKKyAgICAgICBjYXNlICc3JyA6CisgICAgICAgICAgcmV0dXJuIDc7CisgICAgICAgY2FzZSAnOCcgOgorICAgICAgICAgIHJldHVybiA4OworICAgICAgIGNhc2UgJzknIDoKKyAgICAgICAgICByZXR1cm4gOTsKKworICAgICAgIGNhc2UgJ2EnIDoKKyAgICAgICBjYXNlICdBJyA6CisgICAgICAgICAgcmV0dXJuIDEwOworICAgICAgIGNhc2UgJ2InIDoKKyAgICAgICBjYXNlICdCJyA6CisgICAgICAgICAgcmV0dXJuIDExOworICAgICAgIGNhc2UgJ2MnIDoKKyAgICAgICBjYXNlICdDJyA6CisgICAgICAgICAgcmV0dXJuIDEyOworICAgICAgIGNhc2UgJ2QnIDoKKyAgICAgICBjYXNlICdEJyA6CisgICAgICAgICAgcmV0dXJuIDEzOworICAgICAgIGNhc2UgJ2UnIDoKKyAgICAgICBjYXNlICdFJyA6CisgICAgICAgICAgcmV0dXJuIDE0OworICAgICAgIGNhc2UgJ2YnIDoKKyAgICAgICBjYXNlICdGJyA6CisgICAgICAgICAgcmV0dXJuIDE1OworICAgIH0KKworICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7IC8vIFNob3VsZCBuZXZlciBjb21lIGhlcmUKKyAgfQorCisvKiogUG9zaXRpb24gaW4gYnVmZmVyLiAqLworICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOworICBpbnQgYnVmc2l6ZTsKKyAgaW50IGF2YWlsYWJsZTsKKyAgaW50IHRva2VuQmVnaW47CisgIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOworICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOworCisgIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKKyAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7CisKKyAgcHJvdGVjdGVkIFByb3ZpZGVyIGlucHV0U3RyZWFtOworCisgIHByb3RlY3RlZCBjaGFyW10gbmV4dENoYXJCdWY7CisgIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOworICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKKyAgcHJvdGVjdGVkIGludCBuZXh0Q2hhckluZCA9IC0xOworICBwcm90ZWN0ZWQgaW50IGluQnVmID0gMDsKKyAgcHJvdGVjdGVkIGludCB0YWJTaXplID0gMTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gdHJhY2tMaW5lQ29sdW1uID0gdHJ1ZTsKKworICBwdWJsaWMgdm9pZCBzZXRUYWJTaXplKGludCBpKSB7IHRhYlNpemUgPSBpOyB9CisgIHB1YmxpYyBpbnQgZ2V0VGFiU2l6ZShpbnQgaSkgeyByZXR1cm4gdGFiU2l6ZTsgfQorCisgIHByb3RlY3RlZCB2b2lkIEV4cGFuZEJ1ZmYoYm9vbGVhbiB3cmFwQXJvdW5kKQorICB7CisgICAgY2hhcltdIG5ld2J1ZmZlciA9IG5ldyBjaGFyW2J1ZnNpemUgKyAyMDQ4XTsKKyAgICBpbnQgbmV3YnVmbGluZVtdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisgICAgaW50IG5ld2J1ZmNvbHVtbltdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisKKyAgICB0cnkKKyAgICB7CisgICAgICBpZiAod3JhcEFyb3VuZCkKKyAgICAgIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3YnVmZmVyLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIDAsIG5ld2J1ZmxpbmUsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOworICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOworICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47CisKKyAgICAgICAgYnVmcG9zICs9IChidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKKworICAgICAgICBidWZwb3MgLT0gdG9rZW5CZWdpbjsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiB0KQorICAgIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBhdmFpbGFibGUgPSAoYnVmc2l6ZSArPSAyMDQ4KTsKKyAgICB0b2tlbkJlZ2luID0gMDsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIEZpbGxCdWZmKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgIGludCBpOworICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSA0MDk2KQorICAgICAgbWF4TmV4dENoYXJJbmQgPSBuZXh0Q2hhckluZCA9IDA7CisKKyAgICB0cnkgeworICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChuZXh0Q2hhckJ1ZiwgbWF4TmV4dENoYXJJbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2IC0gbWF4TmV4dENoYXJJbmQpKSA9PSAtMSkKKyAgICAgIHsKKyAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgaWYgKGJ1ZnBvcyAhPSAwKQorICAgICAgeworICAgICAgICAtLWJ1ZnBvczsKKyAgICAgICAgYmFja3VwKDApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBidWZsaW5lW2J1ZnBvc10gPSBsaW5lOworICAgICAgICBidWZjb2x1bW5bYnVmcG9zXSA9IGNvbHVtbjsKKyAgICAgIH0KKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGNoYXIgUmVhZEJ5dGUoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgaWYgKCsrbmV4dENoYXJJbmQgPj0gbWF4TmV4dENoYXJJbmQpCisgICAgICBGaWxsQnVmZigpOworCisgICAgcmV0dXJuIG5leHRDaGFyQnVmW25leHRDaGFySW5kXTsKKyAgfQorCisvKiogQHJldHVybiBzdGFydGluZyBjaGFyYWN0ZXIgZm9yIHRva2VuLiAqLworICBwdWJsaWMgY2hhciBCZWdpblRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgIGlmIChpbkJ1ZiA+IDApCisgICAgeworICAgICAgLS1pbkJ1ZjsKKworICAgICAgaWYgKCsrYnVmcG9zID09IGJ1ZnNpemUpCisgICAgICAgIGJ1ZnBvcyA9IDA7CisKKyAgICAgIHRva2VuQmVnaW4gPSBidWZwb3M7CisgICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107CisgICAgfQorCisgICAgdG9rZW5CZWdpbiA9IDA7CisgICAgYnVmcG9zID0gLTE7CisKKyAgICByZXR1cm4gcmVhZENoYXIoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIEFkanVzdEJ1ZmZTaXplKCkKKyAgeworICAgIGlmIChhdmFpbGFibGUgPT0gYnVmc2l6ZSkKKyAgICB7CisgICAgICBpZiAodG9rZW5CZWdpbiA+IDIwNDgpCisgICAgICB7CisgICAgICAgIGJ1ZnBvcyA9IDA7CisgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIEV4cGFuZEJ1ZmYoZmFsc2UpOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQorICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKKyAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQorICAgICAgRXhwYW5kQnVmZih0cnVlKTsKKyAgICBlbHNlCisgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpCisgIHsKKyAgICBjb2x1bW4rKzsKKworICAgIGlmIChwcmV2Q2hhcklzTEYpCisgICAgeworICAgICAgcHJldkNoYXJJc0xGID0gZmFsc2U7CisgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAocHJldkNoYXJJc0NSKQorICAgIHsKKyAgICAgIHByZXZDaGFySXNDUiA9IGZhbHNlOworICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgIHsKKyAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7CisgICAgfQorCisgICAgc3dpdGNoIChjKQorICAgIHsKKyAgICAgIGNhc2UgJ1xyJyA6CisgICAgICAgIHByZXZDaGFySXNDUiA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXG4nIDoKKyAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdCcgOgorICAgICAgICBjb2x1bW4tLTsKKyAgICAgICAgY29sdW1uICs9ICh0YWJTaXplIC0gKGNvbHVtbiAlIHRhYlNpemUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKKyAgICBidWZjb2x1bW5bYnVmcG9zXSA9IGNvbHVtbjsKKyAgfQorCisvKiogUmVhZCBhIGNoYXJhY3Rlci4gKi8KKyAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgaWYgKGluQnVmID4gMCkKKyAgICB7CisgICAgICAtLWluQnVmOworCisgICAgICBpZiAoKytidWZwb3MgPT0gYnVmc2l6ZSkKKyAgICAgICAgYnVmcG9zID0gMDsKKworICAgICAgcmV0dXJuIGJ1ZmZlcltidWZwb3NdOworICAgIH0KKworICAgIGNoYXIgYzsKKworICAgIGlmICgrK2J1ZnBvcyA9PSBhdmFpbGFibGUpCisgICAgICBBZGp1c3RCdWZmU2l6ZSgpOworCisgICAgaWYgKChidWZmZXJbYnVmcG9zXSA9IGMgPSBSZWFkQnl0ZSgpKSA9PSAnXFwnKQorICAgIHsKKyAgICAgIFVwZGF0ZUxpbmVDb2x1bW4oYyk7CisKKyAgICAgIGludCBiYWNrU2xhc2hDbnQgPSAxOworCisgICAgICBmb3IgKDs7KSAvLyBSZWFkIGFsbCB0aGUgYmFja3NsYXNoZXMKKyAgICAgIHsKKyAgICAgICAgaWYgKCsrYnVmcG9zID09IGF2YWlsYWJsZSkKKyAgICAgICAgICBBZGp1c3RCdWZmU2l6ZSgpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgaWYgKChidWZmZXJbYnVmcG9zXSA9IGMgPSBSZWFkQnl0ZSgpKSAhPSAnXFwnKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFVwZGF0ZUxpbmVDb2x1bW4oYyk7CisgICAgICAgICAgICAvLyBmb3VuZCBhIG5vbi1iYWNrc2xhc2ggY2hhci4KKyAgICAgICAgICAgIGlmICgoYyA9PSAndScpICYmICgoYmFja1NsYXNoQ250ICYgMSkgPT0gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgtLWJ1ZnBvcyA8IDApCisgICAgICAgICAgICAgICAgYnVmcG9zID0gYnVmc2l6ZSAtIDE7CisKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJhY2t1cChiYWNrU2xhc2hDbnQpOworICAgICAgICAgICAgcmV0dXJuICdcXCc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworCSAgLy8gV2UgYXJlIHJldHVybmluZyBvbmUgYmFja3NsYXNoIHNvIHdlIHNob3VsZCBvbmx5IGJhY2t1cCAoY291bnQtMSkKKyAgICAgICAgICBpZiAoYmFja1NsYXNoQ250ID4gMSkKKyAgICAgICAgICAgIGJhY2t1cChiYWNrU2xhc2hDbnQtMSk7CisKKyAgICAgICAgICByZXR1cm4gJ1xcJzsKKyAgICAgICAgfQorCisgICAgICAgIFVwZGF0ZUxpbmVDb2x1bW4oYyk7CisgICAgICAgIGJhY2tTbGFzaENudCsrOworICAgICAgfQorCisgICAgICAvLyBIZXJlLCB3ZSBoYXZlIHNlZW4gYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2gncyBmb2xsb3dlZCBieSBhICd1JworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIHdoaWxlICgoYyA9IFJlYWRCeXRlKCkpID09ICd1JykKKyAgICAgICAgICArK2NvbHVtbjsKKworICAgICAgICBidWZmZXJbYnVmcG9zXSA9IGMgPSAoY2hhcikoaGV4dmFsKGMpIDw8IDEyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleHZhbChSZWFkQnl0ZSgpKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleHZhbChSZWFkQnl0ZSgpKSA8PCA0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleHZhbChSZWFkQnl0ZSgpKSk7CisKKyAgICAgICAgY29sdW1uICs9IDQ7CisgICAgICB9CisgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCisgICAgICB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGVzY2FwZSBjaGFyYWN0ZXIgYXQgbGluZSAiICsgbGluZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY29sdW1uICIgKyBjb2x1bW4gKyAiLiIpOworICAgICAgfQorCisgICAgICBpZiAoYmFja1NsYXNoQ250ID09IDEpCisgICAgICAgIHJldHVybiBjOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBiYWNrdXAoYmFja1NsYXNoQ250IC0gMSk7CisgICAgICAgIHJldHVybiAnXFwnOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVXBkYXRlTGluZUNvbHVtbihjKTsKKyAgICAgIHJldHVybiBjOworICAgIH0KKyAgfQorCisgIEBEZXByZWNhdGVkCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZAorICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgeworICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKKyAgfQorCisgIEBEZXByZWNhdGVkCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZAorICAgKiBAc2VlICNnZXRFbmRMaW5lCisgICAqLworICBwdWJsaWMgaW50IGdldExpbmUoKSB7CisgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKKyAgfQorCisvKiogR2V0IGVuZCBjb2x1bW4uICovCisgIHB1YmxpYyBpbnQgZ2V0RW5kQ29sdW1uKCkgeworICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKKyAgfQorCisvKiogR2V0IGVuZCBsaW5lLiAqLworICBwdWJsaWMgaW50IGdldEVuZExpbmUoKSB7CisgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKKyAgfQorCisvKiogQHJldHVybiBjb2x1bW4gb2YgdG9rZW4gc3RhcnQgKi8KKyAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKKyAgICByZXR1cm4gYnVmY29sdW1uW3Rva2VuQmVnaW5dOworICB9CisKKy8qKiBAcmV0dXJuIGxpbmUgbnVtYmVyIG9mIHRva2VuIHN0YXJ0ICovCisgIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgeworICAgIHJldHVybiBidWZsaW5lW3Rva2VuQmVnaW5dOworICB9CisKKy8qKiBSZXRyZWF0LiAqLworICBwdWJsaWMgdm9pZCBiYWNrdXAoaW50IGFtb3VudCkgeworCisgICAgaW5CdWYgKz0gYW1vdW50OworICAgIGlmICgoYnVmcG9zIC09IGFtb3VudCkgPCAwKQorICAgICAgYnVmcG9zICs9IGJ1ZnNpemU7CisgIH0KKworLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgSmF2YUNoYXJTdHJlYW0oUHJvdmlkZXIgZHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKKyAgICBsaW5lID0gc3RhcnRsaW5lOworICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKKworICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOworICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOworICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgbmV4dENoYXJCdWYgPSBuZXcgY2hhcls0MDk2XTsKKyAgfQorCisvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBKYXZhQ2hhclN0cmVhbShQcm92aWRlciBkc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGxpbmUsIGludCBzdGFydGNvbHVtbikKKyAgeworICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgSmF2YUNoYXJTdHJlYW0oUHJvdmlkZXIgZHN0cmVhbSkKKyAgeworICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKy8qKiBSZWluaXRpYWxpc2UuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChQcm92aWRlciBkc3RyZWFtLAorICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOworICAgIGxpbmUgPSBzdGFydGxpbmU7CisgICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOworCisgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlcnNpemUgIT0gYnVmZmVyLmxlbmd0aCkKKyAgICB7CisgICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKKyAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOworICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgICAgbmV4dENoYXJCdWYgPSBuZXcgY2hhcls0MDk2XTsKKyAgICB9CisgICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7CisgICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOworICAgIG5leHRDaGFySW5kID0gYnVmcG9zID0gLTE7CisgIH0KKworLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KFByb3ZpZGVyIGRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uKQorICB7CisgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKy8qKiBSZWluaXRpYWxpc2UuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChQcm92aWRlciBkc3RyZWFtKQorICB7CisgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisKKworCisgIC8qKiBAcmV0dXJuIHRva2VuIGltYWdlIGFzIFN0cmluZyAqLworICBwdWJsaWMgU3RyaW5nIEdldEltYWdlKCkKKyAgeworICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmcG9zIC0gdG9rZW5CZWdpbiArIDEpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHN1ZmZpeCAqLworICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQorICB7CisgICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07CisKKyAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qKiBTZXQgYnVmZmVycyBiYWNrIHRvIG51bGwgd2hlbiBmaW5pc2hlZC4gKi8KKyAgcHVibGljIHZvaWQgRG9uZSgpCisgIHsKKyAgICBuZXh0Q2hhckJ1ZiA9IG51bGw7CisgICAgYnVmZmVyID0gbnVsbDsKKyAgICBidWZsaW5lID0gbnVsbDsKKyAgICBidWZjb2x1bW4gPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBhZGp1c3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgZm9yIHRoZSBzdGFydCBvZiBhIHRva2VuLgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRqdXN0QmVnaW5MaW5lQ29sdW1uKGludCBuZXdMaW5lLCBpbnQgbmV3Q29sKQorICB7CisgICAgaW50IHN0YXJ0ID0gdG9rZW5CZWdpbjsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQorICAgIHsKKyAgICAgIGxlbiA9IGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyBpbkJ1ZiArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBidWZzaXplIC0gdG9rZW5CZWdpbiArIGJ1ZnBvcyArIDEgKyBpbkJ1ZjsKKyAgICB9CisKKyAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKKyAgICBpbnQgbmV4dENvbERpZmYgPSAwLCBjb2x1bW5EaWZmID0gMDsKKworICAgIHdoaWxlIChpIDwgbGVuICYmIGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gPT0gYnVmbGluZVtrID0gKytzdGFydCAlIGJ1ZnNpemVdKQorICAgIHsKKyAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOworICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKyAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpZiAoaSA8IGxlbikKKyAgICB7CisgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOworICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKworICAgICAgd2hpbGUgKGkrKyA8IGxlbikKKyAgICAgIHsKKyAgICAgICAgaWYgKGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gIT0gYnVmbGluZVsrK3N0YXJ0ICUgYnVmc2l6ZV0pCisgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgfQorICAgIH0KKworICAgIGxpbmUgPSBidWZsaW5lW2pdOworICAgIGNvbHVtbiA9IGJ1ZmNvbHVtbltqXTsKKyAgfQorICBib29sZWFuIGdldFRyYWNrTGluZUNvbHVtbigpIHsgcmV0dXJuIHRyYWNrTGluZUNvbHVtbjsgfQorICB2b2lkIHNldFRyYWNrTGluZUNvbHVtbihib29sZWFuIHRsYykgeyB0cmFja0xpbmVDb2x1bW4gPSB0bGM7IH0KKworfQorLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT05YWIwMTM2ZmQ0YjFlMmE0NWEyNTFmNDExODFhNWJkOCAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjgzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDYuMSAqLworLyogSmF2YUNDT3B0aW9uczpLRUVQX0xJTkVfQ09MVU1OPXRydWUgKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCisgKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQorICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAorICogcGFyc2VyLgorICoKKyAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCisgKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAvKioKKyAgICogVGhlIHZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhpcyBTZXJpYWxpemFibGUgY2xhc3MuCisgICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZQorICAgKiBjbGFzcyBjaGFuZ2VzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICIgICAgIjsKKyAgCisgIC8qKgorICAgKiBUaGUgZW5kIG9mIGxpbmUgc3RyaW5nICh3ZSBkbyBub3QgdXNlIFN5c3RlbS5nZXRQcm9wZXJ0eSgiIikgc28gdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoIEFuZHJvaWQvR1dUKTsKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVPTCA9ICJcbiI7CisKKyAgCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAorICAgICAgICAgIFN0cmluZ1tdIHRva2VuSW1hZ2VWYWwKKyAgICAgICAgICkKKwl7CisJICB0aGlzIChjdXJyZW50VG9rZW5WYWwsIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsIHRva2VuSW1hZ2VWYWwsIG51bGwpOworCX0KKyAgCisgIAorICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4KKyAgICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxleGljYWxTdGF0ZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgKQorICB7CisgICAgc3VwZXIoaW5pdGlhbGlzZShjdXJyZW50VG9rZW5WYWwsIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsIHRva2VuSW1hZ2VWYWwsIGxleGljYWxTdGF0ZU5hbWUpKTsKKyAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7CisgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7CisgICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgorICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCisgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgorICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCisgICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KKyAgICovCisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCk7CisgIH0KKworICAvKiogQ29uc3RydWN0b3Igd2l0aCBtZXNzYWdlLiAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisKKyAgLyoqCisgICAqIFRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBzdWNjZXNzZnVsbHkuICBJZgorICAgKiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGR1ZSB0byBhIHBhcnNlIGVycm9yLCB0aGUgdG9rZW4KKyAgICogZm9sbG93bmcgdGhpcyB0b2tlbiB3aWxsICh0aGVyZWZvcmUpIGJlIHRoZSBmaXJzdCBlcnJvciB0b2tlbi4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBjdXJyZW50VG9rZW47CisKKyAgLyoqCisgICAqIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEVhY2ggYXJyYXkKKyAgICogb2YgaW50ZWdlcnMgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRva2VucyAoYnkgdGhlaXIgb3JkaW5hbAorICAgKiB2YWx1ZXMpIHRoYXQgaXMgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgcGFyc2UuCisgICAqLworICBwdWJsaWMgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzOworCisgIC8qKgorICAgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAidG9rZW5JbWFnZSIgYXJyYXkgb2YgdGhlIGdlbmVyYXRlZAorICAgKiBwYXJzZXIgd2l0aGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gIFRoaXMgYXJyYXkgaXMKKyAgICogZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIC4uLkNvbnN0YW50cyBpbnRlcmZhY2UuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gdG9rZW5JbWFnZTsKKworICAvKioKKyAgICogSXQgdXNlcyAiY3VycmVudFRva2VuIiBhbmQgImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiIHRvIGdlbmVyYXRlIGEgcGFyc2UKKyAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gIElmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKKyAgICogZHVlIHRvIGEgcGFyc2UgZXJyb3IsIGFuZCB5b3UgZG8gbm90IGNhdGNoIGl0IChpdCBnZXRzIHRocm93bgorICAgKiBmcm9tIHRoZSBwYXJzZXIpIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UKKyAgICogZ2V0cyBkaXNwbGF5ZWQuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW5pdGlhbGlzZShUb2tlbiBjdXJyZW50VG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxleGljYWxTdGF0ZU5hbWUpIHsKKwlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgCisgICAgaW50IG1heFNpemUgPSAwOworICAgIGphdmEudXRpbC5UcmVlU2V0PFN0cmluZz4gc29ydGVkT3B0aW9ucyA9IG5ldyBqYXZhLnV0aWwuVHJlZVNldDxTdHJpbmc+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7CisgICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgeworICAgIAkgIHNvcnRlZE9wdGlvbnMuYWRkKHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0pOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICBmb3IgKFN0cmluZyBvcHRpb24gOiBzb3J0ZWRPcHRpb25zKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZChJTkRFTlQpLmFwcGVuZChvcHRpb24pLmFwcGVuZChFT0wpOworICAgICAgfQorICAgIAorICAgIHNiLmFwcGVuZCgiRW5jb3VudGVyZWQgdW5leHBlY3RlZCB0b2tlbjoiKTsKKyAgICAKKyAgICBUb2tlbiB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgeworICAgICAgU3RyaW5nIHRva2VuVGV4dCA9IHRvay5pbWFnZTsKKyAgCSAgU3RyaW5nIGVzY2FwZWRUb2tlblRleHQgPSBhZGRfZXNjYXBlcyh0b2tlblRleHQpOworICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgCXNiLmFwcGVuZCgiICIpOworICAgICAgfQorICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgIAlzYi5hcHBlbmQodG9rZW5JbWFnZVswXSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2IuYXBwZW5kKCIgXCIiKTsKKwkgIHNiLmFwcGVuZChlc2NhcGVkVG9rZW5UZXh0KTsKKyAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgIHNiLmFwcGVuZCgiICIgKyB0b2tlbkltYWdlW3Rvay5raW5kXSk7CisgICAgICB0b2sgPSB0b2submV4dDsKKyAgICB9CisJc2IuYXBwZW5kKEVPTCkuYXBwZW5kKElOREVOVCkuYXBwZW5kKCJhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uKTsKKwlzYi5hcHBlbmQoIi4iKS5hcHBlbmQoRU9MKTsKKyAgICAKKyAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGFkZCBoZXJlCisgICAgfSBlbHNlIHsKKyAgICAJaW50IG51bUV4cGVjdGVkVG9rZW5zID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7CisgICAgCXNiLmFwcGVuZChFT0wpLmFwcGVuZCgiV2FzIGV4cGVjdGluZyIrIChudW1FeHBlY3RlZFRva2VucyA9PSAxID8gIjoiIDogIiBvbmUgb2Y6IikgKyBFT0wgKyBFT0wpOworICAgIAlzYi5hcHBlbmQoZXhwZWN0ZWQudG9TdHJpbmcoKSk7CisgICAgfQorICAgIC8vIDIwMTMvMDcvMzAgLS0+IFNlZW1zIHRvIGJlIGluYWNjdXJhdGUgYXMgcmVwcmVzZW50cyB0aGUgcmVhZGFoZWFkIHN0YXRlLCBub3QgdGhlIGxleGljYWwgc3RhdGUgQkVGT1JFIHRoZSB1bmtub3duIHRva2VuCisvLyAgICBpZiAobGV4aWNhbFN0YXRlTmFtZSAhPSBudWxsKSB7CisvLyAgICAJc2IuYXBwZW5kKEVPTCkuYXBwZW5kKCIqKiBMZXhpY2FsIFN0YXRlIDogIikuYXBwZW5kKGxleGljYWxTdGF0ZU5hbWUpLmFwcGVuZChFT0wpLmFwcGVuZChFT0wpOworLy8gICAgfQorICAgIAorICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKworICAvKioKKyAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgorICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKKyAgICogc3RyaW5nIGxpdGVyYWwuCisgICAqLworICBzdGF0aWMgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBjaGFyIGNoOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgICB9CisKK30KKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09YzBkYTZhODZhYzBkMGVjOGI2MzNhZWFmYTQzZTZlMzcgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvdmlkZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmQ5ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUHJvdmlkZXIuamF2YSBWZXJzaW9uIDYuMSAqLworLyogSmF2YUNDT3B0aW9uczpLRUVQX0xJTkVfQ09MVU1OPXRydWUgKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFByb3ZpZGVyIHsKKyAgICAvKioKKyAgICAgKiBSZWFkcyBjaGFyYWN0ZXJzIGludG8gYW4gYXJyYXkKKyAgICAgKiBAcGFyYW0gYnVmZmVyICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gb2Zmc2V0ICAgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBsZW5ndGggICBUaGUgbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCwgb3IgLTEgaWYgYWxsIHJlYWQKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyIGJ1ZmZlcltdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gYW5kIHJlbGVhc2VzIGFueSBzeXN0ZW0gcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGl0LgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCit9CisvKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPTg5Njg0ZDRlM2RiODJhYTVlNDgwZDA5NWMxNzBiMzUyIChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1N0cmVhbVByb3ZpZGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1N0cmVhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzMGUxNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvU3RyZWFtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFN0cmVhbVByb3ZpZGVyLmphdmEgVmVyc2lvbiA2LjEgKi8KKy8qIEphdmFDQ09wdGlvbnM6S0VFUF9MSU5FX0NPTFVNTj10cnVlICovCisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuCisgKgorICogSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworLyoqCisgKiBOT1RFIDogVGhpcyBnZW5lcmF0ZWQgY2xhc3MgY2FuIGJlIHNhZmVseSBkZWxldGVkIGlmIGluc3RhbGxpbmcgaW4gYSBHV1QgaW5zdGFsbGF0aW9uICh1c2UgU3RyaW5nUHJvdmlkZXIgaW5zdGVhZCkKKyAqLworcHVibGljIGNsYXNzIFN0cmVhbVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXIgeworCisJUmVhZGVyIF9yZWFkZXI7CisKKwlwdWJsaWMgU3RyZWFtUHJvdmlkZXIoUmVhZGVyIHJlYWRlcikgeworCQlfcmVhZGVyID0gcmVhZGVyOworCX0KKwkKKwlwdWJsaWMgU3RyZWFtUHJvdmlkZXIoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlfcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKKwl9CisJCisJcHVibGljIFN0cmVhbVByb3ZpZGVyKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGNoYXJzZXROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlfcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIGNoYXJzZXROYW1lKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCByZWFkKGNoYXJbXSBidWZmZXIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJICAgaW50IHJlc3VsdCA9IF9yZWFkZXIucmVhZChidWZmZXIsIG9mZiwgbGVuKTsKKworCSAgIC8qIENCQSAtLSBBZGRlZCAyMDE0LzAzLzI5IC0tIAorCSAgICAgICAgICAgICBUaGlzIGxvZ2ljIGFsbG93cyB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZSB0byBiZSBlYXNpbHkgdHJhbnNsYXRlZCB0byBDIyAodmlhIHNoYXJwZW4pIC0KKwkgICAgICAgICAgICAgYXMgaW4gQyMgMCByZXByZXNlbnRzIGVuZCBvZiBmaWxlLCBhbmQgaW4gSmF2YSwgLTEgcmVwcmVzZW50cyBlbmQgb2YgZmlsZQorCSAgICAgICAgICAgICBTZWUgOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvOWtzdHc4MjQodj12cy4xMTApLmFzcHgKKwkgICAgICAgICAgICAgKiogVGVjaG5pY2FsbHksIHRoaXMgaXMgbm90IHJlcXVpcmVkIGZvciBqYXZhIGJ1dCB0aGUgb3ZlcmhlYWQgaXMgZXh0cmVtZWx5IGxvdyBjb21wYXJlZCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGJlbmVmaXRzLgorCSAgICovCisJICAgCisJICAgaWYgKHJlc3VsdCA9PSAwKSB7CisJICAgICAgaWYgKG9mZiA8IGJ1ZmZlci5sZW5ndGggJiYgbGVuID4gMCkgeworCSAgICAgICAgcmVzdWx0ID0gLTE7CisJICAgICAgfQorCSAgIH0KKwkgICAKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCV9yZWFkZXIuY2xvc2UoKTsKKwl9CisKK30KKworLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT1iODQ5ZTA3NDZiYmJmNDUyODE5N2NhOWQxMzA2NTBkNiAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9TdHJpbmdQcm92aWRlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9TdHJpbmdQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzM1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1N0cmluZ1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTdHJpbmdQcm92aWRlci5qYXZhIFZlcnNpb24gNi4xICovCisvKiBKYXZhQ0NPcHRpb25zOktFRVBfTElORV9DT0xVTU49dHJ1ZSAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKKwkKKwlpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwkKKwlwdWJsaWMgY2xhc3MgU3RyaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlciB7CisKKwkJU3RyaW5nIF9zdHJpbmc7CisJCWludCBfcG9zaXRpb24gPSAwOworCQlpbnQgX3NpemU7CisJCQorCQlwdWJsaWMgU3RyaW5nUHJvdmlkZXIoU3RyaW5nIHN0cmluZykgeworCQkJX3N0cmluZyA9IHN0cmluZzsKKwkJCV9zaXplID0gc3RyaW5nLmxlbmd0aCgpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJaW50IG51bUNoYXJzT3V0c3RhbmRpbmdJblN0cmluZyA9IF9zaXplIC0gX3Bvc2l0aW9uOworCQkJCisJCQlpZiAobnVtQ2hhcnNPdXRzdGFuZGluZ0luU3RyaW5nID09IDApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkKKwkJCWludCBudW1CeXRlc0luQnVmZmVyID0gY2J1Zi5sZW5ndGg7CisJCQlpbnQgbnVtQnl0ZXNUb1JlYWQgPSBudW1CeXRlc0luQnVmZmVyIC1vZmY7CisJCQludW1CeXRlc1RvUmVhZCA9IG51bUJ5dGVzVG9SZWFkID4gbGVuID8gbGVuIDogbnVtQnl0ZXNUb1JlYWQ7CisJCQkKKwkJCWlmIChudW1CeXRlc1RvUmVhZCA+IG51bUNoYXJzT3V0c3RhbmRpbmdJblN0cmluZykgeworCQkJCW51bUJ5dGVzVG9SZWFkID0gbnVtQ2hhcnNPdXRzdGFuZGluZ0luU3RyaW5nOworCQkJfQorCQkJCisJCQlfc3RyaW5nLmdldENoYXJzKF9wb3NpdGlvbiwgX3Bvc2l0aW9uICsgbnVtQnl0ZXNUb1JlYWQsIGNidWYsIG9mZik7CisJCQkKKwkJCV9wb3NpdGlvbiArPSBudW1CeXRlc1RvUmVhZDsKKwkJCQorCQkJcmV0dXJuIG51bUJ5dGVzVG9SZWFkOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCV9zdHJpbmcgPSBudWxsOworCQl9CisJCQorCX0KKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09OTg3M2U5MmNhZDg2NjY5ODBhNGM2ZDM5MmMwYzdhZDQgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW4uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzMxZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuLmphdmEgVmVyc2lvbiA2LjEgKi8KKy8qIEphdmFDQ09wdGlvbnM6VE9LRU5fRVhURU5EUz0sS0VFUF9MSU5FX0NPTFVNTj10cnVlLFNVUFBPUlRfQ0xBU1NfVklTSUJJTElUWV9QVUJMSUM9dHJ1ZSAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCisgKi8KKworcHVibGljIGNsYXNzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworCisgIC8qKgorICAgKiBUaGUgdmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIFNlcmlhbGl6YWJsZSBjbGFzcy4KKyAgICogSW5jcmVtZW50IG9ubHkgaWYgdGhlIDxpPnNlcmlhbGl6ZWQ8L2k+IGZvcm0gb2YgdGhlCisgICAqIGNsYXNzIGNoYW5nZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKioKKyAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKKyAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCisgICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KKyAgICovCisgIHB1YmxpYyBpbnQga2luZDsKKworICAvKiogVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyBUb2tlbi4gKi8KKyAgcHVibGljIGludCBiZWdpbkxpbmU7CisgIC8qKiBUaGUgY29sdW1uIG51bWJlciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgVG9rZW4uICovCisgIHB1YmxpYyBpbnQgYmVnaW5Db2x1bW47CisgIC8qKiBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgVG9rZW4uICovCisgIHB1YmxpYyBpbnQgZW5kTGluZTsKKyAgLyoqIFRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIFRva2VuLiAqLworICBwdWJsaWMgaW50IGVuZENvbHVtbjsKKworICAvKioKKyAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGltYWdlOworCisgIC8qKgorICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKKyAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQorICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCisgICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgorICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgorICAgKiB0aGlzIGZpZWxkLgorICAgKi8KKyAgcHVibGljIFRva2VuIG5leHQ7CisKKyAgLyoqCisgICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCisgICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCisgICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgorICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKKyAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0CisgICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KKyAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KKyAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKKyAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKKyAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgorICAgKi8KKyAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKKworICAvKioKKyAgICogQW4gb3B0aW9uYWwgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBUb2tlbi4KKyAgICogVG9rZW5zIHdoaWNoIGFyZSBub3QgdXNlZCBhcyBzeW50YWN0aWMgc3VnYXIgd2lsbCBvZnRlbiBjb250YWluCisgICAqIG1lYW5pbmdmdWwgdmFsdWVzIHRoYXQgd2lsbCBiZSB1c2VkIGxhdGVyIG9uIGJ5IHRoZSBjb21waWxlciBvcgorICAgKiBpbnRlcnByZXRlci4gVGhpcyBhdHRyaWJ1dGUgdmFsdWUgaXMgb2Z0ZW4gZGlmZmVyZW50IGZyb20gdGhlIGltYWdlLgorICAgKiBBbnkgc3ViY2xhc3Mgb2YgVG9rZW4gdGhhdCBhY3R1YWxseSB3YW50cyB0byByZXR1cm4gYSBub24tbnVsbCB2YWx1ZSBjYW4KKyAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgYXBwcm9wcmlhdGUuCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIE5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisgICAqLworICBwdWJsaWMgVG9rZW4oKSB7fQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRva2VuIGZvciB0aGUgc3BlY2lmaWVkIEltYWdlLgorICAgKi8KKyAgcHVibGljIFRva2VuKGludCBraW5kKQorICB7CisgICAgdGhpcyhraW5kLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRva2VuIGZvciB0aGUgc3BlY2lmaWVkIEltYWdlIGFuZCBLaW5kLgorICAgKi8KKyAgcHVibGljIFRva2VuKGludCBraW5kLCBTdHJpbmcgaW1hZ2UpCisgIHsKKyAgICB0aGlzLmtpbmQgPSBraW5kOworICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICB7CisgICAgcmV0dXJuIGltYWdlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91CisgICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCisgICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgorICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0CisgICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbXBseSBhZGQgc29tZXRoaW5nIGxpa2UgOgorICAgKgorICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKG9mS2luZCwgaW1hZ2UpOworICAgKgorICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgorICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIHNpdCBpbiB5b3VyIGxleGljYWwgYWN0aW9ucy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCwgU3RyaW5nIGltYWdlKQorICB7CisgICAgc3dpdGNoKG9mS2luZCkKKyAgICB7CisgICAgICBkZWZhdWx0IDogcmV0dXJuIG5ldyBUb2tlbihvZktpbmQsIGltYWdlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCisgIHsKKyAgICByZXR1cm4gbmV3VG9rZW4ob2ZLaW5kLCBudWxsKTsKKyAgfQorCit9CisvKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPWZkNDMwNTFkYjY1ZmNkYzIyZGYzOWE2MWQ4MWJmN2E0IChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX25ld19zcmMvamF2YXBhcnNlci1nZW5lcmF0ZWQtc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTk3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiA1LjAgKi8KKy8qIEphdmFDQ09wdGlvbnM6ICovCisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuCisgKgorICogSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworLyoqIFRva2VuIE1hbmFnZXIgRXJyb3IuICovCitwdWJsaWMgY2xhc3MgVG9rZW5NZ3JFcnJvciBleHRlbmRzIEVycm9yCit7CisKKyAgLyoqCisgICAqIFRoZSB2ZXJzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgU2VyaWFsaXphYmxlIGNsYXNzLgorICAgKiBJbmNyZW1lbnQgb25seSBpZiB0aGUgPGk+c2VyaWFsaXplZDwvaT4gZm9ybSBvZiB0aGUKKyAgICogY2xhc3MgY2hhbmdlcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qCisgICAqIE9yZGluYWxzIGZvciB2YXJpb3VzIHJlYXNvbnMgd2h5IGFuIEVycm9yIG9mIHRoaXMgdHlwZSBjYW4gYmUgdGhyb3duLgorICAgKi8KKworICAvKioKKyAgICogTGV4aWNhbCBlcnJvciBvY2N1cnJlZC4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgTEVYSUNBTF9FUlJPUiA9IDA7CisKKyAgLyoqCisgICAqIEFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gY3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIGEgc3RhdGljIHRva2VuIG1hbmFnZXIuCisgICAqLworICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7CisKKyAgLyoqCisgICAqIFRyaWVkIHRvIGNoYW5nZSB0byBhbiBpbnZhbGlkIGxleGljYWwgc3RhdGUuCisgICAqLworICBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTEVYSUNBTF9TVEFURSA9IDI7CisKKyAgLyoqCisgICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7CisKKyAgLyoqCisgICAqIEluZGljYXRlcyB0aGUgcmVhc29uIHdoeSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gSXQgd2lsbCBoYXZlCisgICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCisgICAqLworICBpbnQgZXJyb3JDb2RlOworCisgIC8qKgorICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzY2FwZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKKyAgICogZXF1aXZhbGVudHMgaW4gdGhlIGdpdmVuIHN0cmluZworICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBjaGFyIGNoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAwIDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBkZXRhaWxlZCBtZXNzYWdlIGZvciB0aGUgRXJyb3Igd2hlbiBpdCBpcyB0aHJvd24gYnkgdGhlCisgICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgorICAgKiBQYXJhbWV0ZXJzIDoKKyAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNhbCBlcnJvcgorICAgKiAgICBjdXJMZXhTdGF0ZSA6IGxleGljYWwgc3RhdGUgaW4gd2hpY2ggdGhpcyBlcnJvciBvY2N1cnJlZAorICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkCisgICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZAorICAgKiAgICBlcnJvckFmdGVyICA6IHByZWZpeCB0aGF0IHdhcyBzZWVuIGJlZm9yZSB0aGlzIGVycm9yIG9jY3VycmVkCisgICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKKyAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikgeworICAgIHJldHVybigiTGV4aWNhbCBlcnJvciBhdCBsaW5lICIgKworICAgICAgICAgIGVycm9yTGluZSArICIsIGNvbHVtbiAiICsKKyAgICAgICAgICBlcnJvckNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArCisgICAgICAgICAgKEVPRlNlZW4gPyAiPEVPRj4gIiA6ICgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyKSkgKyAiXCIiKSArICIgKCIgKyAoaW50KWN1ckNoYXIgKyAiKSwgIikgKworICAgICAgICAgICJhZnRlciA6IFwiIiArIGFkZEVzY2FwZXMoZXJyb3JBZnRlcikgKyAiXCIiKTsKKyAgfQorCisgIC8qKgorICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIG1lc3NhZ2VzLgorICAgKiBGb3IgZXhhbXBsZSwgY2FzZXMgbGlrZSBMT09QX0RFVEVDVEVEIGFuZCBJTlZBTElEX0xFWElDQUxfU1RBVEUgYXJlIG5vdAorICAgKiBvZiBlbmQtdXNlcnMgY29uY2Vybiwgc28geW91IGNhbiByZXR1cm4gc29tZXRoaW5nIGxpa2UgOgorICAgKgorICAgKiAgICAgIkludGVybmFsIEVycm9yIDogUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IC4uLi4gIgorICAgKgorICAgKiBmcm9tIHRoaXMgbWV0aG9kIGZvciBzdWNoIGNhc2VzIGluIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBwYXJzZXIuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgfQorCisgIC8qCisgICAqIENvbnN0cnVjdG9ycyBvZiB2YXJpb3VzIGZsYXZvcnMgZm9sbG93LgorICAgKi8KKworICAvKiogTm8gYXJnIGNvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgVG9rZW5NZ3JFcnJvcigpIHsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3RvciB3aXRoIG1lc3NhZ2UgYW5kIHJlYXNvbi4gKi8KKyAgcHVibGljIFRva2VuTWdyRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCByZWFzb24pIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBlcnJvckNvZGUgPSByZWFzb247CisgIH0KKworICAvKiogRnVsbCBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwgaW50IHJlYXNvbikgeworICAgIHRoaXMoTGV4aWNhbEVycm9yKEVPRlNlZW4sIGxleFN0YXRlLCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBlcnJvckFmdGVyLCBjdXJDaGFyKSwgcmVhc29uKTsKKyAgfQorfQorLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT1mMDZjN2U5NjRiNWMxM2E3MzIzMzdjMmYzZmI0ZjgzNiAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlbk1nckV4Y2VwdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfbmV3X3NyYy9qYXZhcGFyc2VyLWdlbmVyYXRlZC1zb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlbk1nckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTA0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9uZXdfc3JjL2phdmFwYXJzZXItZ2VuZXJhdGVkLXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuTWdyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW5NZ3JFeGNlcHRpb24uamF2YSBWZXJzaW9uIDYuMSAqLworLyogSmF2YUNDT3B0aW9uczogKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisvKiogVG9rZW4gTWFuYWdlciBFcnJvci4gKi8KK3B1YmxpYyBjbGFzcyBUb2tlbk1nckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKworICAvKioKKyAgICogVGhlIHZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhpcyBTZXJpYWxpemFibGUgY2xhc3MuCisgICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZQorICAgKiBjbGFzcyBjaGFuZ2VzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgLyoKKyAgICogT3JkaW5hbHMgZm9yIHZhcmlvdXMgcmVhc29ucyB3aHkgYW4gRXJyb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSB0aHJvd24uCisgICAqLworCisgIC8qKgorICAgKiBMZXhpY2FsIGVycm9yIG9jY3VycmVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVYSUNBTF9FUlJPUiA9IDA7CisKKyAgLyoqCisgICAqIEFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gY3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIGEgc3RhdGljIHRva2VuIG1hbmFnZXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOworCisgIC8qKgorICAgKiBUcmllZCB0byBjaGFuZ2UgdG8gYW4gaW52YWxpZCBsZXhpY2FsIHN0YXRlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKKworICAvKioKKyAgICogRGV0ZWN0ZWQgKGFuZCBiYWlsZWQgb3V0IG9mKSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSB0b2tlbiBtYW5hZ2VyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7CisKKyAgLyoqCisgICAqIEluZGljYXRlcyB0aGUgcmVhc29uIHdoeSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gSXQgd2lsbCBoYXZlCisgICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCisgICAqLworICBpbnQgZXJyb3JDb2RlOworCisgIC8qKgorICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzY2FwZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKKyAgICogZXF1aXZhbGVudHMgaW4gdGhlIGdpdmVuIHN0cmluZworICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBjaGFyIGNoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBkZXRhaWxlZCBtZXNzYWdlIGZvciB0aGUgRXJyb3Igd2hlbiBpdCBpcyB0aHJvd24gYnkgdGhlCisgICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgorICAgKiBQYXJhbWV0ZXJzIDoKKyAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNhbCBlcnJvcgorICAgKiAgICBjdXJMZXhTdGF0ZSA6IGxleGljYWwgc3RhdGUgaW4gd2hpY2ggdGhpcyBlcnJvciBvY2N1cnJlZAorICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkCisgICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZAorICAgKiAgICBlcnJvckFmdGVyICA6IHByZWZpeCB0aGF0IHdhcyBzZWVuIGJlZm9yZSB0aGlzIGVycm9yIG9jY3VycmVkCisgICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKKyAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBpbnQgY3VyQ2hhcikgeworICAgIGNoYXIgY3VyQ2hhcjEgPSAoY2hhciljdXJDaGFyOworICAgIHJldHVybigiTGV4aWNhbCBlcnJvciBhdCBsaW5lICIgKworICAgICAgICAgIGVycm9yTGluZSArICIsIGNvbHVtbiAiICsKKyAgICAgICAgICBlcnJvckNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArCisgICAgICAgICAgKEVPRlNlZW4gPyAiPEVPRj4gIiA6ICgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyMSkpICsgIlwiIikgKyAiICgiICsgKGludCljdXJDaGFyICsgIiksICIpICsKKyAgICAgICAgICAiYWZ0ZXIgOiBcIiIgKyBhZGRFc2NhcGVzKGVycm9yQWZ0ZXIpICsgIlwiIik7CisgIH0KKworICAvKioKKyAgICogWW91IGNhbiBhbHNvIG1vZGlmeSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgeW91ciBlcnJvciBtZXNzYWdlcy4KKyAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKKyAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDoKKyAgICoKKyAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKKyAgICoKKyAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgIH0KKworICAvKgorICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KKyAgICovCisKKyAgLyoqIE5vIGFyZyBjb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIFRva2VuTWdyRXhjZXB0aW9uKCkgeworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yIHdpdGggbWVzc2FnZSBhbmQgcmVhc29uLiAqLworICBwdWJsaWMgVG9rZW5NZ3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCByZWFzb24pIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBlcnJvckNvZGUgPSByZWFzb247CisgIH0KKworICAvKiogRnVsbCBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIFRva2VuTWdyRXhjZXB0aW9uKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBpbnQgY3VyQ2hhciwgaW50IHJlYXNvbikgeworICAgIHRoaXMoTGV4aWNhbEVycihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwgY3VyQ2hhciksIHJlYXNvbik7CisgIH0KK30KKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09ZDJkNDAxMjVkNTFhZjVmZTViYzdlMmFiODdkMDYyYWQgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxY2ZmMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsOTE0OCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYXJzZXIuamF2YSAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKKworLyoqCisgKiA8cD5UaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBqYXZhY2MsIGRvIG5vdCBlZGl0LjwvcD4KKyAqLworZmluYWwgY2xhc3MgQVNUUGFyc2VyIGltcGxlbWVudHMgQVNUUGFyc2VyQ29uc3RhbnRzIHsKKworICAgIHZvaWQgcmVzZXQoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBSZUluaXQoaW4sIGVuY29kaW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgYWRkKExpc3QgbGlzdCwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5hZGQob2JqKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IGFkZChpbnQgcG9zLCBMaXN0IGxpc3QsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICB9CisgICAgICAgIGxpc3QuYWRkKHBvcywgb2JqKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgTW9kaWZpZXIgeworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vZGlmaWVyczsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGFubm90YXRpb25zOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBiZWdpbkxpbmU7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGJlZ2luQ29sdW1uOworCisgICAgICAgICAgICAgICAgcHVibGljIE1vZGlmaWVyKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IG1vZGlmaWVycywgTGlzdCBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbkxpbmUgPSBiZWdpbkxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luQ29sdW1uID0gYmVnaW5Db2x1bW47CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkTW9kaWZpZXIoaW50IG1vZGlmaWVycywgaW50IG1vZCwgVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgaWYgKChNb2RpZmllclNldC5oYXNNb2RpZmllcihtb2RpZmllcnMsIG1vZCkpKSB7CisgICAgICAgICAgICB0aHJvd1BhcnNlRXhjZXB0aW9uKHRva2VuLCAiRHVwbGljYXRlZCBtb2RpZmllciIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNb2RpZmllclNldC5hZGRNb2RpZmllcihtb2RpZmllcnMsIG1vZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRocm93UGFyc2VFeGNlcHRpb24oVG9rZW4gdG9rZW4sIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiOiBcIiIpOworICAgICAgICBidWYuYXBwZW5kKHRva2VuLmltYWdlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiXCIgYXQgbGluZSAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0b2tlbi5iZWdpbkxpbmUpOworICAgICAgICBidWYuYXBwZW5kKCIsIGNvbHVtbiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0b2tlbi5iZWdpbkNvbHVtbik7CisgICAgICAgIFBhcnNlRXhjZXB0aW9uIGUgPSBuZXcgUGFyc2VFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBlLmN1cnJlbnRUb2tlbiA9IHRva2VuOworICAgICAgICB0aHJvdyBlOworICAgIH0KKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBnZW5lcmF0ZUxhbWJkYShFeHByZXNzaW9uIHJldCwgU3RhdGVtZW50IGxhbWJkYUJvZHkpIHsKKyAgICAgICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBFbmNsb3NlZEV4cHIpIHsKKyAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGlubmVyID0gKChFbmNsb3NlZEV4cHIpIHJldCkuZ2V0SW5uZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbCAmJiBpbm5lciBpbnN0YW5jZW9mIE5hbWVFeHByKSB7CisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKGlubmVyLmdldEJlZ2luTGluZSgpLCBpbm5lci5nZXRCZWdpbkNvbHVtbigpLCBpbm5lci5nZXRFbmRMaW5lKCksIGlubmVyLmdldEVuZENvbHVtbigpLCAoKE5hbWVFeHByKWlubmVyKS5nZXROYW1lKCksIDApOworICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcmFtcyA9IGFkZChudWxsLCBuZXcgUGFyYW1ldGVyKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHJldC5nZXRFbmRMaW5lKCksIHJldC5nZXRFbmRDb2x1bW4oKSwgMCwgbnVsbCwgbmV3IFVua25vd25UeXBlKCksIGZhbHNlLCBpZCkpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgTGFtYmRhRXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCBsYW1iZGFCb2R5LmdldEVuZExpbmUoKSwgbGFtYmRhQm9keS5nZXRFbmRDb2x1bW4oKSwgcGFyYW1zLCBsYW1iZGFCb2R5LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgTGFtYmRhRXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCBsYW1iZGFCb2R5LmdldEVuZExpbmUoKSwgbGFtYmRhQm9keS5nZXRFbmRDb2x1bW4oKSwgbnVsbCwgbGFtYmRhQm9keSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgaW5zdGFuY2VvZiBOYW1lRXhwcikgeworICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCByZXQuZ2V0RW5kTGluZSgpLCByZXQuZ2V0RW5kQ29sdW1uKCksICgoTmFtZUV4cHIpcmV0KS5nZXROYW1lKCksIDApOworICAgICAgICAgICAgICAgIExpc3QgcGFyYW1zID0gYWRkKG51bGwsIG5ldyBQYXJhbWV0ZXIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgcmV0LmdldEVuZExpbmUoKSwgcmV0LmdldEVuZENvbHVtbigpLCAwLCBudWxsLCBuZXcgVW5rbm93blR5cGUoKSwgZmFsc2UsIGlkKSk7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IExhbWJkYUV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgcmV0LmdldEVuZExpbmUoKSwgcmV0LmdldEVuZENvbHVtbigpLCBwYXJhbXMsIGxhbWJkYUJvZHksIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTGFtYmRhRXhwcikgeworICAgICAgICAgICAgICAgICgoTGFtYmRhRXhwcikgcmV0KS5zZXRCb2R5KGxhbWJkYUJvZHkpOworICAgICAgICAgICAgICAgIHJldC5zZXRFbmRMaW5lKGxhbWJkYUJvZHkuZ2V0RW5kTGluZSgpKTsKKyAgICAgICAgICAgICAgICByZXQuc2V0RW5kQ29sdW1uKGxhbWJkYUJvZHkuZ2V0RW5kQ29sdW1uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBsYW1iZGEgZXhwcmVzc2lvbiEgUGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3VlcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgR1RUb2tlbiBleHRlbmRzIFRva2VuIHsKKworICAgICAgICBpbnQgcmVhbEtpbmQgPSBBU1RQYXJzZXJDb25zdGFudHMuR1Q7CisKKyAgICAgICAgR1RUb2tlbihpbnQga2luZCwgU3RyaW5nIGltYWdlKSB7CisgICAgICAgICAgICB0aGlzLmtpbmQgPSBraW5kOworICAgICAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdUb2tlbihpbnQga2luZCwgU3RyaW5nIGltYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdUVG9rZW4oa2luZCwgaW1hZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUb2tlbiBsYXN0X3NwZWNpYWxfdG9rZW4gPSBudWxsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRIRSBKQVZBIExBTkdVQUdFIEdSQU1NQVIgU1RBUlRTIEhFUkUgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUHJvZ3JhbSBzdHJ1Y3R1cmluZyBzeW50YXggZm9sbG93cy4KKyAqLworICBmaW5hbCBwdWJsaWMgQ29tcGlsYXRpb25Vbml0IENvbXBpbGF0aW9uVW5pdCgpIHsKKyAgICAgICAgUGFja2FnZURlY2xhcmF0aW9uIHBha2FnZSA9IG51bGw7CisgICAgICAgIExpc3QgaW1wb3J0cyA9IG51bGw7CisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGluID0gbnVsbDsKKyAgICAgICAgTGlzdCB0eXBlcyA9IG51bGw7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0biA9IG51bGw7CisgICAgICAgIGludCBsaW5lID0gLTE7CisgICAgICAgIGludCBjb2x1bW4gPSAwOworICAgIGlmIChqal8yXzEoMjE0NzQ4MzY0NykpIHsKKyAgICAgIHBha2FnZSA9IFBhY2thZ2VEZWNsYXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwYWthZ2UuZ2V0QmVnaW5MaW5lKCk7IGNvbHVtbiA9IHBha2FnZS5nZXRCZWdpbkNvbHVtbigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIGxhYmVsXzE6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBJTVBPUlQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE7CisgICAgICB9CisgICAgICBpbiA9IEltcG9ydERlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluZT09LTEpe2xpbmUgPSBpbi5nZXRCZWdpbkxpbmUoKTsgY29sdW1uID0gaW4uZ2V0QmVnaW5Db2x1bW4oKTt9IGltcG9ydHMgPSBhZGQoaW1wb3J0cywgaW4pOworICAgIH0KKyAgICBsYWJlbF8yOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIENMQVNTOgorICAgICAgY2FzZSBFTlVNOgorICAgICAgY2FzZSBGSU5BTDoKKyAgICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIFBSSVZBVEU6CisgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgIGNhc2UgUFVCTElDOgorICAgICAgY2FzZSBTVEFUSUM6CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgIGNhc2UgVk9MQVRJTEU6CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgIGNhc2UgQVQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzI7CisgICAgICB9CisgICAgICB0biA9IFR5cGVEZWNsYXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lPT0tMSl7bGluZSA9IHRuLmdldEJlZ2luTGluZSgpOyBjb2x1bW4gPSB0bi5nZXRCZWdpbkNvbHVtbigpO30gdHlwZXMgPSBhZGQodHlwZXMsIHRuKTsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSAwOgorICAgICAgampfY29uc3VtZV90b2tlbigwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTMxOgorICAgICAgampfY29uc3VtZV90b2tlbigxMzEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsyXSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQobGluZSA9PSAtMSA/IDAgOiBsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixwYWthZ2UsIGltcG9ydHMsIHR5cGVzKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gUGFja2FnZURlY2xhcmF0aW9uKCkgeworICAgICAgICBMaXN0IGFubm90YXRpb25zID0gbnVsbDsKKyAgICAgICAgQW5ub3RhdGlvbkV4cHIgYW5uOworICAgICAgICBOYW1lRXhwciBuYW1lOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBsYWJlbF8zOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbM10gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzM7CisgICAgICB9CisgICAgICBhbm4gPSBBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFBBQ0tBR0UpOworICAgICAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgbmFtZSA9IE5hbWUoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFBhY2thZ2VEZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixhbm5vdGF0aW9ucywgbmFtZSk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgSW1wb3J0RGVjbGFyYXRpb24gSW1wb3J0RGVjbGFyYXRpb24oKSB7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBpc0FzdGVyaXNrID0gZmFsc2U7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QT1JUKTsKKyAgICAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBTVEFUSUM6CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVRJQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RhdGljID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIG5hbWUgPSBOYW1lKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBET1Q6CisgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXN0ZXJpc2sgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs1XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBJbXBvcnREZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixuYW1lLCBpc1N0YXRpYywgaXNBc3Rlcmlzayk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworLyoKKyAqIE1vZGlmaWVycy4gV2UgbWF0Y2ggYWxsIG1vZGlmaWVycyBpbiBhIHNpbmdsZSBydWxlIHRvIHJlZHVjZSB0aGUgY2hhbmNlcyBvZgorICogc3ludGF4IGVycm9ycyBmb3Igc2ltcGxlIG1vZGlmaWVyIG1pc3Rha2VzLiBJdCB3aWxsIGFsc28gZW5hYmxlIHVzIHRvIGdpdmUKKyAqIGJldHRlciBlcnJvciBtZXNzYWdlcy4KKyAqLworICBmaW5hbCBwdWJsaWMgTW9kaWZpZXIgTW9kaWZpZXJzKCkgeworICAgIGludCBiZWdpbkxpbmUgPSAtMTsKKyAgICBpbnQgYmVnaW5Db2x1bW4gPSAtMTsKKyAgICBpbnQgbW9kaWZpZXJzID0gMDsKKyAgICBMaXN0IGFubm90YXRpb25zID0gbnVsbDsKKyAgICBBbm5vdGF0aW9uRXhwciBhbm47CisgICAgbGFiZWxfNDoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMigyKSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF80OworICAgICAgfQorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihQVUJMSUMpOworICAgICAgICAgICAgICBtb2RpZmllcnMgPSBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyU2V0LlBVQkxJQywgdG9rZW4pOyBpZihiZWdpbkxpbmU9PS0xKSB7YmVnaW5MaW5lPXRva2VuLmJlZ2luTGluZTsgYmVnaW5Db2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVRJQyk7CisgICAgICAgICAgICAgIG1vZGlmaWVycyA9IGFkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXJTZXQuU1RBVElDLCB0b2tlbik7IGlmKGJlZ2luTGluZT09LTEpIHtiZWdpbkxpbmU9dG9rZW4uYmVnaW5MaW5lOyBiZWdpbkNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjt9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFJPVEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgbW9kaWZpZXJzID0gYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllclNldC5QUk9URUNURUQsIHRva2VuKTsgaWYoYmVnaW5MaW5lPT0tMSkge2JlZ2luTGluZT10b2tlbi5iZWdpbkxpbmU7IGJlZ2luQ29sdW1uPXRva2VuLmJlZ2luQ29sdW1uO30KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBSSVZBVEU6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFJJVkFURSk7CisgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyU2V0LlBSSVZBVEUsIHRva2VuKTsgaWYoYmVnaW5MaW5lPT0tMSkge2JlZ2luTGluZT10b2tlbi5iZWdpbkxpbmU7IGJlZ2luQ29sdW1uPXRva2VuLmJlZ2luQ29sdW1uO30KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZJTkFMKTsKKyAgICAgICAgICAgICBtb2RpZmllcnMgPSBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyU2V0LkZJTkFMLCB0b2tlbik7IGlmKGJlZ2luTGluZT09LTEpIHtiZWdpbkxpbmU9dG9rZW4uYmVnaW5MaW5lOyBiZWdpbkNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjt9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihBQlNUUkFDVCk7CisgICAgICAgICAgICAgICAgbW9kaWZpZXJzID0gYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllclNldC5BQlNUUkFDVCwgdG9rZW4pOyBpZihiZWdpbkxpbmU9PS0xKSB7YmVnaW5MaW5lPXRva2VuLmJlZ2luTGluZTsgYmVnaW5Db2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNZTkNIUk9OSVpFRCk7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IGFkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXJTZXQuU1lOQ0hST05JWkVELCB0b2tlbik7IGlmKGJlZ2luTGluZT09LTEpIHtiZWdpbkxpbmU9dG9rZW4uYmVnaW5MaW5lOyBiZWdpbkNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjt9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOQVRJVkU6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkFUSVZFKTsKKyAgICAgICAgICAgICAgbW9kaWZpZXJzID0gYWRkTW9kaWZpZXIobW9kaWZpZXJzLCBNb2RpZmllclNldC5OQVRJVkUsIHRva2VuKTsgaWYoYmVnaW5MaW5lPT0tMSkge2JlZ2luTGluZT10b2tlbi5iZWdpbkxpbmU7IGJlZ2luQ29sdW1uPXRva2VuLmJlZ2luQ29sdW1uO30KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihUUkFOU0lFTlQpOworICAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyU2V0LlRSQU5TSUVOVCwgdG9rZW4pOyBpZihiZWdpbkxpbmU9PS0xKSB7YmVnaW5MaW5lPXRva2VuLmJlZ2luTGluZTsgYmVnaW5Db2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVk9MQVRJTEU6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVk9MQVRJTEUpOworICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IGFkZE1vZGlmaWVyKG1vZGlmaWVycywgTW9kaWZpZXJTZXQuVk9MQVRJTEUsIHRva2VuKTsgaWYoYmVnaW5MaW5lPT0tMSkge2JlZ2luTGluZT10b2tlbi5iZWdpbkxpbmU7IGJlZ2luQ29sdW1uPXRva2VuLmJlZ2luQ29sdW1uO30KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklDVEZQKTsKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBhZGRNb2RpZmllcihtb2RpZmllcnMsIE1vZGlmaWVyU2V0LlNUUklDVEZQLCB0b2tlbik7ICBpZihiZWdpbkxpbmU9PS0xKSB7YmVnaW5MaW5lPXRva2VuLmJlZ2luTGluZTsgYmVnaW5Db2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVQ6CisgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOyBpZihiZWdpbkxpbmU9PS0xKSB7YmVnaW5MaW5lPWFubi5nZXRCZWdpbkxpbmUoKTsgYmVnaW5Db2x1bW49YW5uLmdldEJlZ2luQ29sdW1uKCk7fQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs2XSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucyk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworLyoKKyAqIERlY2xhcmF0aW9uIHN5bnRheCBmb2xsb3dzLgorICovCisgIGZpbmFsIHB1YmxpYyBUeXBlRGVjbGFyYXRpb24gVHlwZURlY2xhcmF0aW9uKCkgeworICAgTW9kaWZpZXIgbW9kaWZpZXI7CisgICBUeXBlRGVjbGFyYXRpb24gcmV0OworCisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBTRU1JQ09MT046CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgICAgICAgcmV0ID0gbmV3IEVtcHR5VHlwZURlY2xhcmF0aW9uKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFCU1RSQUNUOgorICAgIGNhc2UgQ0xBU1M6CisgICAgY2FzZSBFTlVNOgorICAgIGNhc2UgRklOQUw6CisgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgY2FzZSBOQVRJVkU6CisgICAgY2FzZSBQUklWQVRFOgorICAgIGNhc2UgUFJPVEVDVEVEOgorICAgIGNhc2UgUFVCTElDOgorICAgIGNhc2UgU1RBVElDOgorICAgIGNhc2UgU1RSSUNURlA6CisgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgY2FzZSBWT0xBVElMRToKKyAgICBjYXNlIEFUOgorICAgICAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKTsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBDTEFTUzoKKyAgICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgICByZXQgPSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgcmV0ID0gRW51bURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFUOgorICAgICAgICByZXQgPSBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbN10gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbOF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihNb2RpZmllciBtb2RpZmllcikgeworICAgYm9vbGVhbiBpc0ludGVyZmFjZSA9IGZhbHNlOworICAgTmFtZUV4cHIgbmFtZTsKKyAgIExpc3QgdHlwZVBhciA9IG51bGw7CisgICBMaXN0IGV4dExpc3QgPSBudWxsOworICAgTGlzdCBpbXBMaXN0ID0gbnVsbDsKKyAgIExpc3QgbWVtYmVyczsKKyAgIGludCBsaW5lID0gbW9kaWZpZXIuYmVnaW5MaW5lOworICAgaW50IGNvbHVtbiA9IG1vZGlmaWVyLmJlZ2luQ29sdW1uOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQ0xBU1M6CisgICAgICBqal9jb25zdW1lX3Rva2VuKENMQVNTKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgampfY29uc3VtZV90b2tlbihJTlRFUkZBQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJmYWNlID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbOV0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IC0xKSB7bGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjt9CisgICAgbmFtZSA9IE5hbWUoKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIExUOgorICAgICAgdHlwZVBhciA9IFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVQYXIucmVtb3ZlKDApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgRVhURU5EUzoKKyAgICAgIGV4dExpc3QgPSBFeHRlbmRzTGlzdChpc0ludGVyZmFjZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzExXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBJTVBMRU1FTlRTOgorICAgICAgaW1wTGlzdCA9IEltcGxlbWVudHNMaXN0KGlzSW50ZXJmYWNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTJdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBtZW1iZXJzID0gQ2xhc3NPckludGVyZmFjZUJvZHkoaXNJbnRlcmZhY2UpOworICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB0bXAgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCBpc0ludGVyZmFjZSwgbnVsbCwgdHlwZVBhciwgZXh0TGlzdCwgaW1wTGlzdCwgbWVtYmVycyk7CisgICAgdG1wLnNldE5hbWVFeHByKG5hbWUpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHRtcDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IEV4dGVuZHNMaXN0KGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKKyAgIGJvb2xlYW4gZXh0ZW5kc01vcmVUaGFuT25lID0gZmFsc2U7CisgICBMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICBDbGFzc09ySW50ZXJmYWNlVHlwZSBjaXQ7CisgICAgQW5ub3RhdGlvbkV4cHIgYW5uOworICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgampfY29uc3VtZV90b2tlbihFWFRFTkRTKTsKKyAgICBsYWJlbF81OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTNdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF81OworICAgICAgfQorICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgIH0KKyAgICBjaXQgPSBDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsgcmV0LmFkZChjaXQpOworICAgIGxhYmVsXzY6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzY7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGNpdCA9IENsYXNzT3JJbnRlcmZhY2VUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChjaXQpOyBleHRlbmRzTW9yZVRoYW5PbmUgPSB0cnVlOworICAgIH0KKyAgICAgIGlmIChleHRlbmRzTW9yZVRoYW5PbmUgJiYgIWlzSW50ZXJmYWNlKQorICAgICAgICAgdGhyb3dQYXJzZUV4Y2VwdGlvbih0b2tlbiwgIkEgY2xhc3MgY2Fubm90IGV4dGVuZCBtb3JlIHRoYW4gb25lIG90aGVyIGNsYXNzIik7CisgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IEltcGxlbWVudHNMaXN0KGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKKyAgIExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIGNpdDsKKyAgIEFubm90YXRpb25FeHByIGFubjsKKyAgIExpc3QgYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QTEVNRU5UUyk7CisgICAgbGFiZWxfNzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEFUOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfNzsKKyAgICAgIH0KKyAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICB9CisgICAgY2l0ID0gQ2xhc3NPckludGVyZmFjZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldC5hZGQoY2l0KTsKKyAgICBsYWJlbF84OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF84OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBjaXQgPSBDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQoY2l0KTsKKyAgICB9CisgICAgICBpZiAoaXNJbnRlcmZhY2UpCisgICAgICAgICB0aHJvd1BhcnNlRXhjZXB0aW9uKHRva2VuLCAiQW4gaW50ZXJmYWNlIGNhbm5vdCBpbXBsZW1lbnQgb3RoZXIgaW50ZXJmYWNlcyIpOworICAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRW51bURlY2xhcmF0aW9uIEVudW1EZWNsYXJhdGlvbihNb2RpZmllciBtb2RpZmllcikgeworICAgICAgICBOYW1lRXhwciBuYW1lOworICAgICAgICBMaXN0IGltcExpc3QgPSBudWxsOworICAgICAgICBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnRyeTsKKyAgICAgICAgTGlzdCBlbnRyaWVzID0gbnVsbDsKKyAgICAgICAgQm9keURlY2xhcmF0aW9uIG1lbWJlcjsKKyAgICAgICAgTGlzdCBtZW1iZXJzID0gbnVsbDsKKyAgICAgICAgaW50IGxpbmUgPSBtb2RpZmllci5iZWdpbkxpbmU7CisgICAgICAgIGludCBjb2x1bW4gPSBtb2RpZmllci5iZWdpbkNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKEVOVU0pOworICAgICAgICAgICBpZiAobGluZSA9PSAtMSkge2xpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgIG5hbWUgPSBOYW1lKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBJTVBMRU1FTlRTOgorICAgICAgaW1wTGlzdCA9IEltcGxlbWVudHNMaXN0KGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTddID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgQVQ6CisgICAgICAgICAgZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICBlbnRyeSA9IEVudW1Db25zdGFudERlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMuYWRkKGVudHJ5KTsKKyAgICAgIGxhYmVsXzk6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoampfMl8zKDIpKSB7CisgICAgICAgICAgOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrIGxhYmVsXzk7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICAgIGVudHJ5ID0gRW51bUNvbnN0YW50RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE4XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBDT01NQToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxOV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgbGFiZWxfMTA6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgY2FzZSBDTEFTUzoKKyAgICAgICAgY2FzZSBfREVGQVVMVDoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgY2FzZSBGSU5BTDoKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgIGNhc2UgSU5URVJGQUNFOgorICAgICAgICBjYXNlIExPTkc6CisgICAgICAgIGNhc2UgTkFUSVZFOgorICAgICAgICBjYXNlIFBSSVZBVEU6CisgICAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgICAgY2FzZSBTSE9SVDoKKyAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgIGNhc2UgU1RSSUNURlA6CisgICAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgIGNhc2UgTEJSQUNFOgorICAgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzIwXSA9IGpqX2dlbjsKKyAgICAgICAgICBicmVhayBsYWJlbF8xMDsKKyAgICAgICAgfQorICAgICAgICBtZW1iZXIgPSBDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycyA9IGFkZChtZW1iZXJzLCBtZW1iZXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsyMV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKKyAgICAgIEVudW1EZWNsYXJhdGlvbiB0bXAgPSBuZXcgRW51bURlY2xhcmF0aW9uKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBtb2RpZmllci5tb2RpZmllcnMsIG1vZGlmaWVyLmFubm90YXRpb25zLCBudWxsLCBpbXBMaXN0LCBlbnRyaWVzLCBtZW1iZXJzKTsKKyAgICAgIHRtcC5zZXROYW1lRXhwcihuYW1lKTsKKyAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHRtcDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpIHsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIExpc3QgYXJncyA9IG51bGw7CisgICAgICAgIExpc3QgY2xhc3NCb2R5ID0gbnVsbDsKKyAgICAgICAgaW50IGxpbmUgPSAtMTsKKyAgICAgICAgaW50IGNvbHVtbiA9IC0xOworCisgICAgbGFiZWxfMTE6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsyMl0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzExOworICAgICAgfQorICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOyBpZihsaW5lPT0tMSl7bGluZT1hbm4uZ2V0QmVnaW5MaW5lKCk7IGNvbHVtbj1hbm4uZ2V0QmVnaW5Db2x1bW4oKTt9CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlbi5pbWFnZTsgaWYobGluZT09LTEpe2xpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgTFBBUkVOOgorICAgICAgYXJncyA9IEFyZ3VtZW50cygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsyM10gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgTEJSQUNFOgorICAgICAgY2xhc3NCb2R5ID0gQ2xhc3NPckludGVyZmFjZUJvZHkoZmFsc2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsyNF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgICAgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gdG1wID0gbmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBhbm5vdGF0aW9ucywgbmFtZSwgYXJncywgY2xhc3NCb2R5KTsKKworICAgICAge2lmICh0cnVlKSByZXR1cm4gdG1wO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3QgVHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgVHlwZVBhcmFtZXRlciB0cDsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExUKTsKKyAgICAgICAgIHJldC5hZGQobmV3IGludFtde3Rva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW59KTsKKyAgICBsYWJlbF8xMjoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEFUOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzI1XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTI7CisgICAgICB9CisgICAgICBhbm4gPSBBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICB9CisgICAgdHAgPSBUeXBlUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQodHApOyB0cC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IGFubm90YXRpb25zID0gbnVsbDsKKyAgICBsYWJlbF8xMzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzI2XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTM7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGxhYmVsXzE0OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsyN10gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTQ7CisgICAgICAgIH0KKyAgICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubik7CisgICAgICB9CisgICAgICB0cCA9IFR5cGVQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQodHApOyB0cC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IGFubm90YXRpb25zID0gbnVsbDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihHVCk7CisgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlUGFyYW1ldGVyIFR5cGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBMaXN0IHR5cGVCb3VuZCA9IG51bGw7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW4uaW1hZ2U7IGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBFWFRFTkRTOgorICAgICAgdHlwZUJvdW5kID0gVHlwZUJvdW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzI4XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBUeXBlUGFyYW1ldGVyKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLG5hbWUsIHR5cGVCb3VuZCk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdCBUeXBlQm91bmQoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZVR5cGUgY2l0OworICAgICAgICBBbm5vdGF0aW9uRXhwciBhbm47CisgICAgICAgIExpc3QgYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EUyk7CisgICAgbGFiZWxfMTU6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsyOV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE1OworICAgICAgfQorICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgIH0KKyAgICBjaXQgPSBDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2l0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsgcmV0LmFkZChjaXQpOyBhbm5vdGF0aW9ucz1udWxsOworICAgIGxhYmVsXzE2OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQklUX0FORDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVszMF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE2OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihCSVRfQU5EKTsKKyAgICAgIGxhYmVsXzE3OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVszMV0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfMTc7CisgICAgICAgIH0KKyAgICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICAgIH0KKyAgICAgIGNpdCA9IENsYXNzT3JJbnRlcmZhY2VUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldC5hZGQoY2l0KTsgYW5ub3RhdGlvbnM9bnVsbDsKKyAgICB9CisgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IENsYXNzT3JJbnRlcmZhY2VCb2R5KGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKKyAgICAgICAgTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBCb2R5RGVjbGFyYXRpb24gbWVtYmVyOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKKyAgICBsYWJlbF8xODoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEFCU1RSQUNUOgorICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBDTEFTUzoKKyAgICAgIGNhc2UgX0RFRkFVTFQ6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgIGNhc2UgRklOQUw6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIElOVEVSRkFDRToKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgTkFUSVZFOgorICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgIGNhc2UgU1RSSUNURlA6CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgY2FzZSBWT0lEOgorICAgICAgY2FzZSBWT0xBVElMRToKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgTEJSQUNFOgorICAgICAgY2FzZSBTRU1JQ09MT046CisgICAgICBjYXNlIEFUOgorICAgICAgY2FzZSBMVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVszMl0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzE4OworICAgICAgfQorICAgICAgbWVtYmVyID0gQ2xhc3NPckludGVyZmFjZUJvZHlEZWNsYXJhdGlvbihpc0ludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChtZW1iZXIpOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEJvZHlEZWNsYXJhdGlvbiBDbGFzc09ySW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKGJvb2xlYW4gaXNJbnRlcmZhY2UpIHsKKyAgIGJvb2xlYW4gaXNOZXN0ZWRJbnRlcmZhY2UgPSBmYWxzZTsKKyAgIE1vZGlmaWVyIG1vZGlmaWVyOworICAgTW9kaWZpZXIgbW9kaWZpZXIyID0gbnVsbDsKKyAgIGludCBhdXggPSAwOworICAgQm9keURlY2xhcmF0aW9uIHJldDsKKyAgIGJvb2xlYW4gaXNEZWZhdWx0ID0gZmFsc2U7CisKKyAgICBpZiAoampfMl82KDIpKSB7CisgICAgICByZXQgPSBJbml0aWFsaXplckRlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgaWYgKGlzSW50ZXJmYWNlKQorICAgICAgICAgICAgICAgIHRocm93UGFyc2VFeGNlcHRpb24odG9rZW4sICJBbiBpbnRlcmZhY2UgY2Fubm90IGhhdmUgaW5pdGlhbGl6ZXJzIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgQ0xBU1M6CisgICAgICBjYXNlIF9ERUZBVUxUOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEVOVU06CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIE5BVElWRToKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVEFUSUM6CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgIGNhc2UgVk9JRDoKKyAgICAgIGNhc2UgVk9MQVRJTEU6CisgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICBjYXNlIEFUOgorICAgICAgY2FzZSBMVDoKKyAgICAgICAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKTsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgX0RFRkFVTFQ6CisgICAgICAgICAgampfY29uc3VtZV90b2tlbihfREVGQVVMVCk7CisgICAgICAgICAgbW9kaWZpZXIyID0gTW9kaWZpZXJzKCk7CisgICAgICAgICAgICBpZighaXNJbnRlcmZhY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93UGFyc2VFeGNlcHRpb24odG9rZW4sICJBbiBpbnRlcmZhY2UgY2Fubm90IGhhdmUgZGVmYXVsdCBtZW1iZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc0RlZmF1bHQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVszM10gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIENMQVNTOgorICAgICAgICBjYXNlIElOVEVSRkFDRToKKyAgICAgICAgICByZXQgPSBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgcmV0ID0gRW51bURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgICByZXQgPSBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMzRdID0gampfZ2VuOworICAgICAgICAgIGlmIChqal8yXzQoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgICAgIHJldCA9IENvbnN0cnVjdG9yRGVjbGFyYXRpb24obW9kaWZpZXIpOworICAgICAgICAgIH0gZWxzZSBpZiAoampfMl81KDIxNDc0ODM2NDcpKSB7CisgICAgICAgICAgICByZXQgPSBGaWVsZERlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgICAgICBjYXNlIENIQVI6CisgICAgICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgICBjYXNlIExUOgorICAgICAgICAgICAgICByZXQgPSBNZXRob2REZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgICAgICAgaWYoaXNEZWZhdWx0ICYmIHJldCE9IG51bGwgJiYgKChNZXRob2REZWNsYXJhdGlvbilyZXQpLmdldEJvZHkoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHRocm93UGFyc2VFeGNlcHRpb24odG9rZW4sICJcImRlZmF1bHRcIiBtZXRob2RzIG11c3QgaGF2ZSBhIGJvZHkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChNZXRob2REZWNsYXJhdGlvbilyZXQpLnNldERlZmF1bHQoaXNEZWZhdWx0KTsKKyAgICAgICAgICAgICAgICBpZihtb2RpZmllcjIhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGF1eCA9IG1vZGlmaWVyMi5tb2RpZmllcnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICgoTWV0aG9kRGVjbGFyYXRpb24pcmV0KS5zZXRNb2RpZmllcnMoYWRkTW9kaWZpZXIobW9kaWZpZXIubW9kaWZpZXJzLCBhdXgsIHRva2VuKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgampfbGExWzM1XSA9IGpqX2dlbjsKKyAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgaWYoaXNEZWZhdWx0ICYmICEgKHJldCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhyb3dQYXJzZUV4Y2VwdGlvbih0b2tlbiwgIkp1c3QgbWV0aG9kcyBjYW4gaGF2ZSB0aGUga2V5d29yZCBcImRlZmF1bHRcIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBFbXB0eU1lbWJlckRlY2xhcmF0aW9uKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzM2XSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRmllbGREZWNsYXJhdGlvbiBGaWVsZERlY2xhcmF0aW9uKE1vZGlmaWVyIG1vZGlmaWVyKSB7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgTGlzdCB2YXJpYWJsZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFsOworICAgIC8vIE1vZGlmaWVycyBhcmUgYWxyZWFkeSBtYXRjaGVkIGluIHRoZSBjYWxsZXIKKyAgICAgIHR5cGUgPSBUeXBlKCk7CisgICAgdmFsID0gVmFyaWFibGVEZWNsYXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLmFkZCh2YWwpOworICAgIGxhYmVsXzE5OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMzddID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8xOTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgdmFsID0gVmFyaWFibGVEZWNsYXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLmFkZCh2YWwpOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgICAgIGludCBsaW5lID0gbW9kaWZpZXIuYmVnaW5MaW5lOworICAgICAgICBpbnQgY29sdW1uID0gbW9kaWZpZXIuYmVnaW5Db2x1bW47CisgICAgICAgIGlmIChsaW5lID09IC0xKSB7IGxpbmU9dHlwZS5nZXRCZWdpbkxpbmUoKTsgY29sdW1uPXR5cGUuZ2V0QmVnaW5Db2x1bW4oKTsgfQorICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgRmllbGREZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZSwgdmFyaWFibGVzKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3IgVmFyaWFibGVEZWNsYXJhdG9yKCkgeworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZDsKKyAgICAgICAgRXhwcmVzc2lvbiBpbml0ID0gbnVsbDsKKyAgICBpZCA9IFZhcmlhYmxlRGVjbGFyYXRvcklkKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBBU1NJR046CisgICAgICBqal9jb25zdW1lX3Rva2VuKEFTU0lHTik7CisgICAgICBpbml0ID0gVmFyaWFibGVJbml0aWFsaXplcigpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVszOF0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyAgVmFyaWFibGVEZWNsYXJhdG9yKGlkLmdldEJlZ2luTGluZSgpLCBpZC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIGlkLCBpbml0KTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZCBWYXJpYWJsZURlY2xhcmF0b3JJZCgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIGludCBhcnJheUNvdW50ID0gMDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuLmltYWdlOyBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIGxhYmVsXzIwOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMzldID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8yMDsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOworICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUNvdW50Kys7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixuYW1lLCBhcnJheUNvdW50KTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFZhcmlhYmxlSW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgTEJSQUNFOgorICAgICAgcmV0ID0gQXJyYXlJbml0aWFsaXplcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGQUxTRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5FVzoKKyAgICBjYXNlIE5VTEw6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNVUEVSOgorICAgIGNhc2UgVEhJUzoKKyAgICBjYXNlIFRSVUU6CisgICAgY2FzZSBWT0lEOgorICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgTFBBUkVOOgorICAgIGNhc2UgQkFORzoKKyAgICBjYXNlIFRJTERFOgorICAgIGNhc2UgSU5DUjoKKyAgICBjYXNlIERFQ1I6CisgICAgY2FzZSBQTFVTOgorICAgIGNhc2UgTUlOVVM6CisgICAgICByZXQgPSBFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzQwXSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwciBBcnJheUluaXRpYWxpemVyKCkgeworICAgICAgICBMaXN0IHZhbHVlcyA9IG51bGw7CisgICAgICAgIEV4cHJlc3Npb24gdmFsOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7CisgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZBTFNFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkVXOgorICAgIGNhc2UgTlVMTDoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1VQRVI6CisgICAgY2FzZSBUSElTOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIFZPSUQ6CisgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBMUEFSRU46CisgICAgY2FzZSBMQlJBQ0U6CisgICAgY2FzZSBCQU5HOgorICAgIGNhc2UgVElMREU6CisgICAgY2FzZSBJTkNSOgorICAgIGNhc2UgREVDUjoKKyAgICBjYXNlIFBMVVM6CisgICAgY2FzZSBNSU5VUzoKKyAgICAgIHZhbCA9IFZhcmlhYmxlSW5pdGlhbGl6ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBhZGQodmFsdWVzLCB2YWwpOworICAgICAgbGFiZWxfMjE6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoampfMl83KDIpKSB7CisgICAgICAgICAgOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrIGxhYmVsXzIxOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgICB2YWwgPSBWYXJpYWJsZUluaXRpYWxpemVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYWRkKHZhbHVlcywgdmFsKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNDFdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIENPTU1BOgorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzQyXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBBcnJheUluaXRpYWxpemVyRXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbix2YWx1ZXMpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIE1ldGhvZERlY2xhcmF0aW9uKE1vZGlmaWVyIG1vZGlmaWVyKSB7CisgICAgICAgIExpc3QgdHlwZVBhcmFtZXRlcnMgPSBudWxsOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgICAgIExpc3QgcGFyYW1ldGVyczsKKyAgICAgICAgaW50IGFycmF5Q291bnQgPSAwOworICAgICAgICBMaXN0IHRocm93c18gPSBudWxsOworICAgICAgICBCbG9ja1N0bXQgYmxvY2sgPSBudWxsOworICAgICAgICBpbnQgbGluZSA9IG1vZGlmaWVyLmJlZ2luTGluZTsKKyAgICAgICAgaW50IGNvbHVtbiA9IG1vZGlmaWVyLmJlZ2luQ29sdW1uOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgTFQ6CisgICAgICB0eXBlUGFyYW1ldGVycyA9IFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gbGluZUNvbD0oaW50W10pdHlwZVBhcmFtZXRlcnMucmVtb3ZlKDApOyBpZihsaW5lPT0tMSl7IGxpbmU9bGluZUNvbFswXTsgY29sdW1uPWxpbmVDb2xbMV07fQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs0M10gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHR5cGUgPSBSZXN1bHRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lPT0tMSl7bGluZT10eXBlLmdldEJlZ2luTGluZSgpOyBjb2x1bW49dHlwZS5nZXRCZWdpbkNvbHVtbigpO30KKyAgICBuYW1lID0gTmFtZSgpOworICAgIHBhcmFtZXRlcnMgPSBGb3JtYWxQYXJhbWV0ZXJzKCk7CisgICAgbGFiZWxfMjI6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs0NF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzIyOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Q291bnQrKzsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBUSFJPV1M6CisgICAgICBqal9jb25zdW1lX3Rva2VuKFRIUk9XUyk7CisgICAgICB0aHJvd3NfID0gTmFtZUxpc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNDVdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIExCUkFDRToKKyAgICAgIGJsb2NrID0gQmxvY2soKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs0Nl0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICAgIE1ldGhvZERlY2xhcmF0aW9uIHRtcCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIHR5cGUsIG51bGwsIHBhcmFtZXRlcnMsIGFycmF5Q291bnQsIHRocm93c18sIGJsb2NrKTsKKyAgICAgIHRtcC5zZXROYW1lRXhwcihuYW1lKTsKKyAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHRtcDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IEZvcm1hbFBhcmFtZXRlcnMoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbnVsbDsKKyAgICAgICAgUGFyYW1ldGVyIHBhcjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBBQlNUUkFDVDoKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZJTkFMOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkFUSVZFOgorICAgIGNhc2UgUFJJVkFURToKKyAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICBjYXNlIFBVQkxJQzoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1RBVElDOgorICAgIGNhc2UgU1RSSUNURlA6CisgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgY2FzZSBWT0xBVElMRToKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBBVDoKKyAgICAgIHBhciA9IEZvcm1hbFBhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZChyZXQsIHBhcik7CisgICAgICBsYWJlbF8yMzoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNDddID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzIzOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgICBwYXIgPSBGb3JtYWxQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYWRkKHJldCwgcGFyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNDhdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3QgRm9ybWFsTGFtYmRhUGFyYW1ldGVycygpIHsKKyAgTGlzdCByZXQgPSBudWxsOworICBQYXJhbWV0ZXIgcGFyOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgIHBhciA9IEZvcm1hbFBhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBhZGQocmV0LCBwYXIpOworICAgIGxhYmVsXzI0OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNDldID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8yNDsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgcGFyID0gRm9ybWFsUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYWRkKHJldCwgcGFyKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3QgSW5mZXJyZWRMYW1iZGFQYXJhbWV0ZXJzKCkgeworICBMaXN0IHJldCA9IG51bGw7CisgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgIGlkID0gVmFyaWFibGVEZWNsYXJhdG9ySWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZChyZXQsIG5ldyBQYXJhbWV0ZXIoaWQuZ2V0QmVnaW5MaW5lKCksIGlkLmdldEJlZ2luQ29sdW1uKCksIGlkLmdldEVuZExpbmUoKSwgaWQuZ2V0RW5kQ29sdW1uKCksIDAsIG51bGwsIG5ldyBVbmtub3duVHlwZSgpLCBmYWxzZSwgaWQpKTsKKyAgICBsYWJlbF8yNToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzUwXSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMjU7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGlkID0gVmFyaWFibGVEZWNsYXJhdG9ySWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZChyZXQsIG5ldyBQYXJhbWV0ZXIoaWQuZ2V0QmVnaW5MaW5lKCksIGlkLmdldEJlZ2luQ29sdW1uKCksIGlkLmdldEVuZExpbmUoKSwgaWQuZ2V0RW5kQ29sdW1uKCksIDAsIG51bGwsIG5ldyBVbmtub3duVHlwZSgpLCBmYWxzZSwgaWQpKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFBhcmFtZXRlciBGb3JtYWxQYXJhbWV0ZXIoKSB7CisgICAgICAgIE1vZGlmaWVyIG1vZGlmaWVyOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIGJvb2xlYW4gaXNWYXJBcmcgPSBmYWxzZTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQ7CisgICAgbW9kaWZpZXIgPSBNb2RpZmllcnMoKTsKKyAgICB0eXBlID0gVHlwZSgpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgRUxMSVBTSVM6CisgICAgICBqal9jb25zdW1lX3Rva2VuKEVMTElQU0lTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZhckFyZyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzUxXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgaWQgPSBWYXJpYWJsZURlY2xhcmF0b3JJZCgpOworICAgIGludCBsaW5lID0gbW9kaWZpZXIuYmVnaW5MaW5lOworICAgIGludCBjb2x1bW4gPSBtb2RpZmllci5iZWdpbkNvbHVtbjsKKyAgICBpZihsaW5lPT0tMSl7IGxpbmU9dHlwZS5nZXRCZWdpbkxpbmUoKTsgY29sdW1uPXR5cGUuZ2V0QmVnaW5Db2x1bW4oKTsgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBQYXJhbWV0ZXIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIHR5cGUsIGlzVmFyQXJnLCBpZCk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKE1vZGlmaWVyIG1vZGlmaWVyKSB7CisgICAgICAgIExpc3QgdHlwZVBhcmFtZXRlcnMgPSBudWxsOworICAgICAgICBOYW1lRXhwciBuYW1lOworICAgICAgICBMaXN0IHBhcmFtZXRlcnM7CisgICAgICAgIExpc3QgdGhyb3dzXyA9IG51bGw7CisgICAgICAgIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBleENvbnNJbnYgPSBudWxsOworICAgICAgICBMaXN0IHN0bXRzOworICAgICAgICBpbnQgbGluZSA9IG1vZGlmaWVyLmJlZ2luTGluZTsKKyAgICAgICAgaW50IGNvbHVtbiA9IG1vZGlmaWVyLmJlZ2luQ29sdW1uOworICAgICAgICBpbnQgYmJMaW5lID0gMDsKKyAgICAgICAgaW50IGJiQ29sdW1uID0gMDsKKyAgICAgICAgaW50IGJlTGluZSA9IDA7CisgICAgICAgIGludCBiZUNvbHVtbiA9IDA7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBMVDoKKyAgICAgIHR5cGVQYXJhbWV0ZXJzID0gVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBsaW5lQ29sPShpbnRbXSl0eXBlUGFyYW1ldGVycy5yZW1vdmUoMCk7IGlmKGxpbmU9PS0xKXsgbGluZT1saW5lQ29sWzBdOyBjb2x1bW49bGluZUNvbFsxXTt9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzUyXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgLy8gTW9kaWZpZXJzIG1hdGNoZWQgaW4gdGhlIGNhbGxlcgorICAgICAgbmFtZSA9IFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmU9PS0xKXtsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uO30KKyAgICBwYXJhbWV0ZXJzID0gRm9ybWFsUGFyYW1ldGVycygpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgVEhST1dTOgorICAgICAgampfY29uc3VtZV90b2tlbihUSFJPV1MpOworICAgICAgdGhyb3dzXyA9IE5hbWVMaXN0KCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzUzXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOworICAgICAgICBiYkxpbmU9dG9rZW4uYmVnaW5MaW5lOyBiYkNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBpZiAoampfMl84KDIxNDc0ODM2NDcpKSB7CisgICAgICBleENvbnNJbnYgPSBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHN0bXRzID0gU3RhdGVtZW50cygpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKKyAgICAgICAgaWYgKGV4Q29uc0ludiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RtdHMgPSBhZGQoMCwgc3RtdHMsIGV4Q29uc0ludik7CisgICAgICAgIH0KKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB0bXAgPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZVBhcmFtZXRlcnMsIG51bGwsIHBhcmFtZXRlcnMsIHRocm93c18sIG5ldyBCbG9ja1N0bXQoYmJMaW5lLCBiYkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBzdG10cykpOworICAgIHRtcC5zZXROYW1lRXhwcihuYW1lKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiB0bXA7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkgeworICAgICAgICBib29sZWFuIGlzVGhpcyA9IGZhbHNlOworICAgICAgICBMaXN0IGFyZ3M7CisgICAgICAgIEV4cHJlc3Npb24gZXhwciA9IG51bGw7CisgICAgICAgIExpc3QgdHlwZUFyZ3MgPSBudWxsOworICAgICAgICBpbnQgbGluZSA9IC0xOworICAgICAgICBpbnQgY29sdW1uID0gMDsKKyAgICBpZiAoampfMl8xMCgyMTQ3NDgzNjQ3KSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIExUOgorICAgICAgY2FzZSAxMzI6CisgICAgICAgIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBsaW5lQ29sPShpbnRbXSl0eXBlQXJncy5yZW1vdmUoMCk7IGxpbmU9bGluZUNvbFswXTsgY29sdW1uPWxpbmVDb2xbMV07CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzU0XSA9IGpqX2dlbjsKKyAgICAgICAgOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihUSElTKTsKKyAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSAtMSkge2xpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fSBpc1RoaXMgPSB0cnVlOworICAgICAgYXJncyA9IEFyZ3VtZW50cygpOworICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBGQUxTRToKKyAgICAgIGNhc2UgRkxPQVQ6CisgICAgICBjYXNlIElOVDoKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgTkVXOgorICAgICAgY2FzZSBOVUxMOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1VQRVI6CisgICAgICBjYXNlIFRISVM6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICBjYXNlIExQQVJFTjoKKyAgICAgIGNhc2UgTFQ6CisgICAgICBjYXNlIDEzMjoKKyAgICAgICAgaWYgKGpqXzJfOSgyMTQ3NDgzNjQ3KSkgeworICAgICAgICAgIGV4cHIgPSBQcmltYXJ5RXhwcmVzc2lvbldpdGhvdXRTdXBlclN1ZmZpeCgpOworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9UKTsKKyAgICAgICAgICAgICAgICAgIGxpbmU9ZXhwci5nZXRCZWdpbkxpbmUoKTsgY29sdW1uPWV4cHIuZ2V0QmVnaW5Db2x1bW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgTFQ6CisgICAgICAgIGNhc2UgMTMyOgorICAgICAgICAgIHR5cGVBcmdzID0gVHlwZUFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGxpbmVDb2w9KGludFtdKXR5cGVBcmdzLnJlbW92ZSgwKTsgaWYgKGxpbmUgPT0gLTEpIHtsaW5lPWxpbmVDb2xbMF07IGNvbHVtbj1saW5lQ29sWzFdO30KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNTVdID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNVUEVSKTsKKyAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSAtMSkge2xpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fQorICAgICAgICBhcmdzID0gQXJndW1lbnRzKCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNTZdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sdHlwZUFyZ3MsIGlzVGhpcywgZXhwciwgYXJncyk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdCBTdGF0ZW1lbnRzKCkgeworICAgICAgICBMaXN0IHJldCA9IG51bGw7CisgICAgICAgIFN0YXRlbWVudCBzdG10OworICAgIGxhYmVsXzI2OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEFTU0VSVDoKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQlJFQUs6CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIENMQVNTOgorICAgICAgY2FzZSBDT05USU5VRToKKyAgICAgIGNhc2UgRE86CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgRk9SOgorICAgICAgY2FzZSBJRjoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIE5BVElWRToKKyAgICAgIGNhc2UgTkVXOgorICAgICAgY2FzZSBOVUxMOgorICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgIGNhc2UgUkVUVVJOOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgU1RBVElDOgorICAgICAgY2FzZSBTVFJJQ1RGUDoKKyAgICAgIGNhc2UgU1VQRVI6CisgICAgICBjYXNlIFNXSVRDSDoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUSFJPVzoKKyAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgY2FzZSBUUlVFOgorICAgICAgY2FzZSBUUlk6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBXSElMRToKKyAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgY2FzZSBMQlJBQ0U6CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgIGNhc2UgQVQ6CisgICAgICBjYXNlIElOQ1I6CisgICAgICBjYXNlIERFQ1I6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbNTddID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF8yNjsKKyAgICAgIH0KKyAgICAgIHN0bXQgPSBCbG9ja1N0YXRlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYWRkKHJldCwgc3RtdCk7CisgICAgfQorICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBJbml0aWFsaXplckRlY2xhcmF0aW9uIEluaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIEJsb2NrU3RtdCBibG9jazsKKyAgICAgICAgaW50IGxpbmUgPSAtMTsKKyAgICAgICAgaW50IGNvbHVtbiA9IDA7CisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIFNUQVRJQzoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RBVElDKTsKKyAgICAgICAgICAgICAgIGlzU3RhdGljID0gdHJ1ZTsgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbNThdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBibG9jayA9IEJsb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGluZT09LTEpe2xpbmU9YmxvY2suZ2V0QmVnaW5MaW5lKCk7IGNvbHVtbj1ibG9jay5nZXRCZWdpbkNvbHVtbigpO30KKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgaXNTdGF0aWMsIGJsb2NrKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisvKgorICogVHlwZSwgbmFtZSBhbmQgZXhwcmVzc2lvbiBzeW50YXggZm9sbG93cy4KKyAqLworICBmaW5hbCBwdWJsaWMgVHlwZSBUeXBlKCkgeworICAgICAgICBUeXBlIHJldDsKKyAgICBpZiAoampfMl8xMSgyKSkgeworICAgICAgcmV0ID0gUmVmZXJlbmNlVHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgICAgcmV0ID0gUHJpbWl0aXZlVHlwZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs1OV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUmVmZXJlbmNlVHlwZSBSZWZlcmVuY2VUeXBlKCkgeworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIGludCBhcnJheUNvdW50ID0gMDsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIExpc3QgYWNjdW09IG51bGw7CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIFNIT1JUOgorICAgICAgdHlwZSA9IFByaW1pdGl2ZVR5cGUoKTsKKyAgICAgIGxhYmVsXzI3OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgbGFiZWxfMjg6CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbNjBdID0gampfZ2VuOworICAgICAgICAgICAgYnJlYWsgbGFiZWxfMjg7CisgICAgICAgICAgfQorICAgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUNvdW50Kys7IGFjY3VtID0gYWRkKGFjY3VtLCBhbm5vdGF0aW9ucyk7IGFubm90YXRpb25zPSBudWxsOworICAgICAgICBpZiAoampfMl8xMigyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF8yNzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgdHlwZSA9IENsYXNzT3JJbnRlcmZhY2VUeXBlKCk7CisgICAgICBsYWJlbF8yOToKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChqal8yXzEzKDIpKSB7CisgICAgICAgICAgOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrIGxhYmVsXzI5OworICAgICAgICB9CisgICAgICAgIGxhYmVsXzMwOgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICAgIGNhc2UgQVQ6CisgICAgICAgICAgICA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzYxXSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGJyZWFrIGxhYmVsXzMwOworICAgICAgICAgIH0KKyAgICAgICAgICBhbm4gPSBBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubik7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUNvdW50Kys7IGFjY3VtID0gYWRkKGFjY3VtLCBhbm5vdGF0aW9ucyk7IGFubm90YXRpb25zPSBudWxsOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs2Ml0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZSh0eXBlLmdldEJlZ2luTGluZSgpLCB0eXBlLmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgdHlwZSwgYXJyYXlDb3VudCwgbnVsbCwgYWNjdW0pO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIENsYXNzT3JJbnRlcmZhY2VUeXBlKCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSByZXQ7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBMaXN0IHR5cGVBcmdzID0gbnVsbDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgICAgIExpc3QgYW5ub3RhdGlvbnMgPSBudWxsOworICAgICAgICBBbm5vdGF0aW9uRXhwciBhbm47CisgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlbi5pbWFnZTsKKyAgICBpZiAoampfMl8xNCgyKSkgeworICAgICAgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJncy5yZW1vdmUoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgcmV0ID0gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLG51bGwsIG5hbWUsIHR5cGVBcmdzKTsKKyAgICBsYWJlbF8zMToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMTUoMikpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzE7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICBsYWJlbF8zMjoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIEFUOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNjNdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzMyOworICAgICAgICB9CisgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuLmltYWdlOworICAgICAgaWYgKGpqXzJfMTYoMikpIHsKKyAgICAgICAgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBcmdzLnJlbW92ZSgwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZShsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixyZXQsIG5hbWUsIHR5cGVBcmdzKTsgcmV0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsgYW5ub3RhdGlvbnMgPSBudWxsOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdCBUeXBlQXJndW1lbnRzKCkgeworICAgICAgICBMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIExUOgorICAgICAgampfY29uc3VtZV90b2tlbihMVCk7CisgICAgICAgICAgIHJldC5hZGQobmV3IGludFtde3Rva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW59KTsKKyAgICAgIHR5cGUgPSBUeXBlQXJndW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZCh0eXBlKTsKKyAgICAgIGxhYmVsXzMzOgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVs2NF0gPSBqal9nZW47CisgICAgICAgICAgYnJlYWsgbGFiZWxfMzM7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICAgIHR5cGUgPSBUeXBlQXJndW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYWRkKHR5cGUpOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihHVCk7CisgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzMjoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMTMyKTsKKyAgICAgICAgICByZXQuYWRkKG51bGwpOworICAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs2NV0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFR5cGUgVHlwZUFyZ3VtZW50KCkgeworICAgICAgICBUeXBlIHJldDsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICBsYWJlbF8zNDoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEFUOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzY2XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzQ7CisgICAgICB9CisgICAgICBhbm4gPSBBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgIH0KKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIHJldCA9IFJlZmVyZW5jZVR5cGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSE9PSzoKKyAgICAgIHJldCA9IFdpbGRjYXJkKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzY3XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgcmV0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFdpbGRjYXJkVHlwZSBXaWxkY2FyZCgpIHsKKyAgICAgICAgUmVmZXJlbmNlVHlwZSBleHQgPSBudWxsOworICAgICAgICBSZWZlcmVuY2VUeXBlIHN1cCA9IG51bGw7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgICAgICBBbm5vdGF0aW9uRXhwciBhbm47CisgICAgICAgIExpc3QgYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7CisgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBFWFRFTkRTOgorICAgIGNhc2UgU1VQRVI6CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgRVhURU5EUzoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihFWFRFTkRTKTsKKyAgICAgICAgbGFiZWxfMzU6CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbNjhdID0gampfZ2VuOworICAgICAgICAgICAgYnJlYWsgbGFiZWxfMzU7CisgICAgICAgICAgfQorICAgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubik7CisgICAgICAgIH0KKyAgICAgICAgZXh0ID0gUmVmZXJlbmNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgZXh0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNVUEVSOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNVUEVSKTsKKyAgICAgICAgbGFiZWxfMzY6CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbNjldID0gampfZ2VuOworICAgICAgICAgICAgYnJlYWsgbGFiZWxfMzY7CisgICAgICAgICAgfQorICAgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgICAgICB9CisgICAgICAgIHN1cCA9IFJlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgIHN1cC5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzcwXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs3MV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgV2lsZGNhcmRUeXBlKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLGV4dCwgc3VwKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBQcmltaXRpdmVUeXBlIFByaW1pdGl2ZVR5cGUoKSB7CisgICAgICAgIFByaW1pdGl2ZVR5cGUgcmV0OworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQk9PTEVBTik7CisgICAgICAgICAgICAgIHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuQm9vbGVhbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIQVI6CisgICAgICBqal9jb25zdW1lX3Rva2VuKENIQVIpOworICAgICAgICAgICByZXQgPSBuZXcgUHJpbWl0aXZlVHlwZSh0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIFByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLkNoYXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCWVRFOgorICAgICAgampfY29uc3VtZV90b2tlbihCWVRFKTsKKyAgICAgICAgICAgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5CeXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hPUlQ6CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNIT1JUKTsKKyAgICAgICAgICAgIHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuU2hvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlQ6CisgICAgICBqal9jb25zdW1lX3Rva2VuKElOVCk7CisgICAgICAgICAgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5JbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMT05HOgorICAgICAgampfY29uc3VtZV90b2tlbihMT05HKTsKKyAgICAgICAgICAgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5Mb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkxPQVQ6CisgICAgICBqal9jb25zdW1lX3Rva2VuKEZMT0FUKTsKKyAgICAgICAgICAgIHJldCA9IG5ldyBQcmltaXRpdmVUeXBlKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuRmxvYXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBET1VCTEU6CisgICAgICBqal9jb25zdW1lX3Rva2VuKERPVUJMRSk7CisgICAgICAgICAgICAgcmV0ID0gbmV3IFByaW1pdGl2ZVR5cGUodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5Eb3VibGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs3Ml0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFR5cGUgUmVzdWx0VHlwZSgpIHsKKyAgICAgICAgVHlwZSByZXQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBWT0lEOgorICAgICAgampfY29uc3VtZV90b2tlbihWT0lEKTsKKyAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgVm9pZFR5cGUodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgcmV0ID0gVHlwZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs3M10gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTmFtZUV4cHIgTmFtZSgpIHsKKyAgICAgICAgTmFtZUV4cHIgcmV0OworICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBOYW1lRXhwcih0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHRva2VuLmltYWdlKTsKKyAgICBsYWJlbF8zNzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMTcoMikpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMzc7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFF1YWxpZmllZE5hbWVFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCB0b2tlbi5pbWFnZSk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IENsYXNzT3JJbnRlcmZhY2VUeXBlTGlzdCgpIHsKKyAgICAgICAgTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlOworICAgICAgICBMaXN0IGFubm90YXRpb25zPSBudWxsOworICAgICAgICBBbm5vdGF0aW9uRXhwciBhbm47CisgICAgbGFiZWxfMzg6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs3NF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzM4OworICAgICAgfQorICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICB9CisgICAgdHlwZSA9IENsYXNzT3JJbnRlcmZhY2VUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldC5hZGQodHlwZSk7IGFubm90YXRpb25zPW51bGw7CisgICAgbGFiZWxfMzk6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs3NV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzM5OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBsYWJlbF80MDoKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIEFUOgorICAgICAgICAgIDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbNzZdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzQwOworICAgICAgICB9CisgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldC5hZGQodHlwZSk7IGFubm90YXRpb25zPW51bGw7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBOYW1lRXhwciBTaW1wbGVOYW1lKCkgeworICAgIE5hbWVFeHByIHJldDsKKyAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworICAgICAgICAgICAgICAgICByZXQgPSBuZXcgTmFtZUV4cHIodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCB0b2tlbi5pbWFnZSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3QgTmFtZUxpc3QoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgTmFtZUV4cHIgbmFtZTsKKyAgICBuYW1lID0gTmFtZSgpOworICAgICAgICAgICAgICAgICAgcmV0LmFkZChuYW1lKTsKKyAgICBsYWJlbF80MToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzc3XSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfNDE7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIG5hbWUgPSBOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChuYW1lKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKy8qCisgKiBFeHByZXNzaW9uIHN5bnRheCBmb2xsb3dzLgorICovCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIEV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBBc3NpZ25FeHByLk9wZXJhdG9yIG9wOworICAgICAgICBFeHByZXNzaW9uIHZhbHVlOworICAgICAgICBTdGF0ZW1lbnQgbGFtYmRhQm9keSA9IG51bGw7CisgICAgICAgIExpc3QgcGFyYW1zID0gbnVsbDsKKyAgICAgICAgTGlzdCB0eXBlQXJncyA9IG51bGw7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gbnVsbDsKKyAgICAgICAgRXhwcmVzc2lvbiBpbm5lciA9IG51bGw7CisgICAgcmV0ID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBBU1NJR046CisgICAgY2FzZSBQTFVTQVNTSUdOOgorICAgIGNhc2UgTUlOVVNBU1NJR046CisgICAgY2FzZSBTVEFSQVNTSUdOOgorICAgIGNhc2UgU0xBU0hBU1NJR046CisgICAgY2FzZSBBTkRBU1NJR046CisgICAgY2FzZSBPUkFTU0lHTjoKKyAgICBjYXNlIFhPUkFTU0lHTjoKKyAgICBjYXNlIFJFTUFTU0lHTjoKKyAgICBjYXNlIExTSElGVEFTU0lHTjoKKyAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKKyAgICBjYXNlIFJVTlNJR05FRFNISUZUQVNTSUdOOgorICAgIGNhc2UgQVJST1c6CisgICAgY2FzZSBET1VCTEVDT0xPTjoKKyAgICAgIGlmIChqal8yXzE4KDIpKSB7CisgICAgICAgIG9wID0gQXNzaWdubWVudE9wZXJhdG9yKCk7CisgICAgICAgIHZhbHVlID0gRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgQXNzaWduRXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgdmFsdWUsIG9wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIEFSUk9XOgorICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVJST1cpOworICAgICAgICAgIGxhbWJkYUJvZHkgPSBMYW1iZGFCb2R5KCk7CisgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBDYXN0RXhwcikKKyAgICAgeworICAgICAgIGlubmVyID0gZ2VuZXJhdGVMYW1iZGEoKChDYXN0RXhwcilyZXQpLmdldEV4cHIoKSwgbGFtYmRhQm9keSk7CisgICAgICAgKChDYXN0RXhwcilyZXQpLnNldEV4cHIoaW5uZXIpOworICAgICB9CisgICAgIGVsc2UgaWYgKHJldCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcil7CisgICAgICAgICBDb25kaXRpb25hbEV4cHIgY2UgPSAoQ29uZGl0aW9uYWxFeHByKSByZXQ7CisgICAgICAgICBpZihjZS5nZXRFbHNlRXhwcigpICE9IG51bGwpeworICAgICAgICAgICAgY2Uuc2V0RWxzZUV4cHIoZ2VuZXJhdGVMYW1iZGEoY2UuZ2V0RWxzZUV4cHIoKSwgbGFtYmRhQm9keSkpOworICAgICAgICAgfQorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgIHJldCA9IGdlbmVyYXRlTGFtYmRhKHJldCwgbGFtYmRhQm9keSk7CisgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBET1VCTEVDT0xPTjoKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVUJMRUNPTE9OKTsKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIExUOgorICAgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlUGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBcmdzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbNzhdID0gampfZ2VuOworICAgICAgICAgICAgOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5FVyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzc5XSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgICAgfQorICAgcmV0ID0gbmV3IE1ldGhvZFJlZmVyZW5jZUV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIHR5cGVBcmdzLCB0b2tlbi5pbWFnZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzgwXSA9IGpqX2dlbjsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs4MV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBc3NpZ25FeHByLk9wZXJhdG9yIEFzc2lnbm1lbnRPcGVyYXRvcigpIHsKKyAgICAgICAgQXNzaWduRXhwci5PcGVyYXRvciByZXQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBBU1NJR046CisgICAgICBqal9jb25zdW1lX3Rva2VuKEFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLmFzc2lnbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBUkFTU0lHTjoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RBUkFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnN0YXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNMQVNIQVNTSUdOOgorICAgICAgampfY29uc3VtZV90b2tlbihTTEFTSEFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnNsYXNoOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRU1BU1NJR046CisgICAgICBqal9jb25zdW1lX3Rva2VuKFJFTUFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnJlbTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUExVU0FTU0lHTjoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUExVU0FTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnBsdXM7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JTlVTQVNTSUdOOgorICAgICAgampfY29uc3VtZV90b2tlbihNSU5VU0FTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLm1pbnVzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMU0hJRlRBU1NJR046CisgICAgICBqal9jb25zdW1lX3Rva2VuKExTSElGVEFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLmxTaGlmdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlNJR05FRFNISUZUQVNTSUdOOgorICAgICAgampfY29uc3VtZV90b2tlbihSU0lHTkVEU0hJRlRBU1NJR04pOworICAgICAgICAgICAgICAgcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci5yU2lnbmVkU2hpZnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJVTlNJR05FRFNISUZUQVNTSUdOOgorICAgICAgampfY29uc3VtZV90b2tlbihSVU5TSUdORURTSElGVEFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLnJVbnNpZ25lZFNoaWZ0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBBTkRBU1NJR046CisgICAgICBqal9jb25zdW1lX3Rva2VuKEFOREFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLmFuZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE9SQVNTSUdOOgorICAgICAgampfY29uc3VtZV90b2tlbihYT1JBU1NJR04pOworICAgICAgICAgICAgICAgcmV0ID0gQXNzaWduRXhwci5PcGVyYXRvci54b3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9SQVNTSUdOOgorICAgICAgampfY29uc3VtZV90b2tlbihPUkFTU0lHTik7CisgICAgICAgICAgICAgICByZXQgPSBBc3NpZ25FeHByLk9wZXJhdG9yLm9yOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVs4Ml0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIGxlZnQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgcmV0ID0gQ29uZGl0aW9uYWxPckV4cHJlc3Npb24oKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEhPT0s6CisgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOworICAgICAgbGVmdCA9IEV4cHJlc3Npb24oKTsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOworICAgICAgcmlnaHQgPSBDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBDb25kaXRpb25hbEV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIGxlZnQsIHJpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbODNdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDb25kaXRpb25hbE9yRXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgcmV0ID0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfNDI6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBTQ19PUjoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs4NF0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzQyOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihTQ19PUik7CisgICAgICByaWdodCA9IENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCaW5hcnlFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCByaWdodCwgQmluYXJ5RXhwci5PcGVyYXRvci5vcik7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgcmV0ID0gSW5jbHVzaXZlT3JFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfNDM6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBTQ19BTkQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbODVdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80MzsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0NfQU5EKTsKKyAgICAgIHJpZ2h0ID0gSW5jbHVzaXZlT3JFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIHJpZ2h0LCBCaW5hcnlFeHByLk9wZXJhdG9yLmFuZCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIEluY2x1c2l2ZU9yRXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgcmV0ID0gRXhjbHVzaXZlT3JFeHByZXNzaW9uKCk7CisgICAgbGFiZWxfNDQ6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBCSVRfT1I6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbODZdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80NDsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX09SKTsKKyAgICAgIHJpZ2h0ID0gRXhjbHVzaXZlT3JFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgQmluYXJ5RXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgcmlnaHQsIEJpbmFyeUV4cHIuT3BlcmF0b3IuYmluT3IpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBFeGNsdXNpdmVPckV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgIHJldCA9IEFuZEV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF80NToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFhPUjoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs4N10gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzQ1OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihYT1IpOworICAgICAgcmlnaHQgPSBBbmRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCaW5hcnlFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCByaWdodCwgQmluYXJ5RXhwci5PcGVyYXRvci54b3IpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBBbmRFeHByZXNzaW9uKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodDsKKyAgICByZXQgPSBFcXVhbGl0eUV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF80NjoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEJJVF9BTkQ6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbODhdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80NjsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX0FORCk7CisgICAgICByaWdodCA9IEVxdWFsaXR5RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIHJpZ2h0LCBCaW5hcnlFeHByLk9wZXJhdG9yLmJpbkFuZCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIEVxdWFsaXR5RXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQ7CisgICAgICAgIEJpbmFyeUV4cHIuT3BlcmF0b3Igb3A7CisgICAgcmV0ID0gSW5zdGFuY2VPZkV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF80NzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEVROgorICAgICAgY2FzZSBORToKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs4OV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzQ3OworICAgICAgfQorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEVROgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVRKTsKKyAgICAgICAgICAgICBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuZXF1YWxzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTkU6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkUpOworICAgICAgICAgICAgIG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5ub3RFcXVhbHM7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzkwXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgcmlnaHQgPSBJbnN0YW5jZU9mRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEJpbmFyeUV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIHJpZ2h0LCBvcCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIEluc3RhbmNlT2ZFeHByZXNzaW9uKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVHlwZSB0eXBlOworICAgIHJldCA9IFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBJTlNUQU5DRU9GOgorICAgICAgampfY29uc3VtZV90b2tlbihJTlNUQU5DRU9GKTsKKyAgICAgIHR5cGUgPSBUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBJbnN0YW5jZU9mRXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgdHlwZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzkxXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gUmVsYXRpb25hbEV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgICAgICBCaW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgIHJldCA9IFNoaWZ0RXhwcmVzc2lvbigpOworICAgIGxhYmVsXzQ4OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgTFQ6CisgICAgICBjYXNlIExFOgorICAgICAgY2FzZSBHRToKKyAgICAgIGNhc2UgR1Q6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOTJdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF80ODsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBMVDoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihMVCk7CisgICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5sZXNzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1Q6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuZ3JlYXRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExFOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKExFKTsKKyAgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLmxlc3NFcXVhbHM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRToKKyAgICAgICAgampfY29uc3VtZV90b2tlbihHRSk7CisgICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5ncmVhdGVyRXF1YWxzOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs5M10gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJpZ2h0ID0gU2hpZnRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCaW5hcnlFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCByaWdodCwgb3ApOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBTaGlmdEV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgICAgICBCaW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgIHJldCA9IEFkZGl0aXZlRXhwcmVzc2lvbigpOworICAgIGxhYmVsXzQ5OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8xOSgxKSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF80OTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBMU0hJRlQ6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFNISUZUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLmxTaGlmdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOTRdID0gampfZ2VuOworICAgICAgICBpZiAoampfMl8yMCgxKSkgeworICAgICAgICAgIFJTSUdORURTSElGVCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuclNpZ25lZFNoaWZ0OworICAgICAgICB9IGVsc2UgaWYgKGpqXzJfMjEoMSkpIHsKKyAgICAgICAgICBSVU5TSUdORURTSElGVCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuclVuc2lnbmVkU2hpZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJpZ2h0ID0gQWRkaXRpdmVFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCaW5hcnlFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCByaWdodCwgb3ApOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBBZGRpdGl2ZUV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0OworICAgICAgICBCaW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgIHJldCA9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworICAgIGxhYmVsXzUwOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgUExVUzoKKyAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOTVdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF81MDsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBQTFVTOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFBMVVMpOworICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5wbHVzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOworICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci5taW51czsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOTZdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICByaWdodCA9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgQmluYXJ5RXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgcmlnaHQsIG9wKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodDsKKyAgICAgICAgQmluYXJ5RXhwci5PcGVyYXRvciBvcDsKKyAgICByZXQgPSBVbmFyeUV4cHJlc3Npb24oKTsKKyAgICBsYWJlbF81MToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFNUQVI6CisgICAgICBjYXNlIFNMQVNIOgorICAgICAgY2FzZSBSRU06CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOTddID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF81MTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBTVEFSOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVIpOworICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5RXhwci5PcGVyYXRvci50aW1lczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNMQVNIOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNMQVNIKTsKKyAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeUV4cHIuT3BlcmF0b3IuZGl2aWRlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVNOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJFTSk7CisgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlFeHByLk9wZXJhdG9yLnJlbWFpbmRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbOThdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICByaWdodCA9IFVuYXJ5RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgQmluYXJ5RXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgcmlnaHQsIG9wKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIGludCBjb2x1bW4gPSAwOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgSU5DUjoKKyAgICAgIHJldCA9IFByZUluY3JlbWVudEV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgREVDUjoKKyAgICAgIHJldCA9IFByZURlY3JlbWVudEV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOgorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFBMVVM6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUExVUyk7CisgICAgICAgICAgICAgICAgICBvcCA9IFVuYXJ5RXhwci5PcGVyYXRvci5wb3NpdGl2ZTsgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1JTlVTOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKKyAgICAgICAgICAgICAgICAgIG9wID0gVW5hcnlFeHByLk9wZXJhdG9yLm5lZ2F0aXZlOyBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVs5OV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICBpZihvcCA9PSBVbmFyeUV4cHIuT3BlcmF0b3IubmVnYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBJbnRlZ2VyTGl0ZXJhbEV4cHIgJiYgKChJbnRlZ2VyTGl0ZXJhbEV4cHIpcmV0KS5pc01pblZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTG9uZ0xpdGVyYWxFeHByICYmICgoTG9uZ0xpdGVyYWxFeHByKXJldCkuaXNNaW5WYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBMb25nTGl0ZXJhbE1pblZhbHVlRXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgVW5hcnlFeHByKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLHJldCwgb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVuYXJ5RXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixyZXQsIG9wKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBET1VCTEU6CisgICAgY2FzZSBGQUxTRToKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5FVzoKKyAgICBjYXNlIE5VTEw6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNVUEVSOgorICAgIGNhc2UgVEhJUzoKKyAgICBjYXNlIFRSVUU6CisgICAgY2FzZSBWT0lEOgorICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgTFBBUkVOOgorICAgIGNhc2UgQkFORzoKKyAgICBjYXNlIFRJTERFOgorICAgICAgcmV0ID0gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEwMF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBQcmVJbmNyZW1lbnRFeHByZXNzaW9uKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihJTkNSKTsKKyAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICByZXQgPSBVbmFyeUV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVuYXJ5RXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixyZXQsIFVuYXJ5RXhwci5PcGVyYXRvci5wcmVJbmNyZW1lbnQpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByZURlY3JlbWVudEV4cHJlc3Npb24oKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKERFQ1IpOworICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgVW5hcnlFeHByKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLHJldCwgVW5hcnlFeHByLk9wZXJhdG9yLnByZURlY3JlbWVudCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIGludCBjb2x1bW4gPSAwOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQkFORzoKKyAgICBjYXNlIFRJTERFOgorICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFRJTERFOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRJTERFKTsKKyAgICAgICAgICAgICAgICAgIG9wID0gVW5hcnlFeHByLk9wZXJhdG9yLmludmVyc2U7IGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCQU5HOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKEJBTkcpOworICAgICAgICAgICAgICAgICAgb3AgPSBVbmFyeUV4cHIuT3BlcmF0b3Iubm90OyAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTAxXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgcmV0ID0gVW5hcnlFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVbmFyeUV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4scmV0LCBvcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEwMl0gPSBqal9nZW47CisgICAgICBpZiAoampfMl8yMigyMTQ3NDgzNjQ3KSkgeworICAgICAgICByZXQgPSBDYXN0RXhwcmVzc2lvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIENIQVI6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICBjYXNlIEZBTFNFOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICBjYXNlIE5FVzoKKyAgICAgICAgY2FzZSBOVUxMOgorICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIFNVUEVSOgorICAgICAgICBjYXNlIFRISVM6CisgICAgICAgIGNhc2UgVFJVRToKKyAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICByZXQgPSBQb3N0Zml4RXhwcmVzc2lvbigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMDNdID0gampfZ2VuOworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFBvc3RmaXhFeHByZXNzaW9uKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgVW5hcnlFeHByLk9wZXJhdG9yIG9wOworICAgIHJldCA9IFByaW1hcnlFeHByZXNzaW9uKCk7CisgICAgaWYgKGpqXzJfMjMoMikpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBJTkNSOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOQ1IpOworICAgICAgICAgICAgIG9wID0gVW5hcnlFeHByLk9wZXJhdG9yLnBvc0luY3JlbWVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERFQ1I6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVDUik7CisgICAgICAgICAgICAgb3AgPSBVbmFyeUV4cHIuT3BlcmF0b3IucG9zRGVjcmVtZW50OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMDRdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICAgIHJldCA9IG5ldyBVbmFyeUV4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBDYXN0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgbGFiZWxfNTI6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMDVdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF81MjsKKyAgICAgIH0KKyAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYWRkKGFubm90YXRpb25zLCBhbm4pOworICAgIH0KKyAgICBpZiAoampfMl8yNCgyKSkgeworICAgICAgdHlwZSA9IFByaW1pdGl2ZVR5cGUoKTsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICAgIHJldCA9IFVuYXJ5RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldCA9IG5ldyBDYXN0RXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbix0eXBlLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBTSE9SVDoKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgdHlwZSA9IFJlZmVyZW5jZVR5cGUoKTsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgICAgICByZXQgPSBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOyByZXQgPSBuZXcgQ2FzdEV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sdHlwZSwgcmV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTA2XSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBQcmltYXJ5RXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gaW5uZXI7CisgICAgcmV0ID0gUHJpbWFyeVByZWZpeCgpOworICAgIGxhYmVsXzUzOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8yNSgyKSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF81MzsKKyAgICAgIH0KKyAgICAgIHJldCA9IFByaW1hcnlTdWZmaXgocmV0KTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gUHJpbWFyeUV4cHJlc3Npb25XaXRob3V0U3VwZXJTdWZmaXgoKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgICAgICBFeHByZXNzaW9uIGlubmVyOworICAgIHJldCA9IFByaW1hcnlQcmVmaXgoKTsKKyAgICBsYWJlbF81NDoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMjYoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNTQ7CisgICAgICB9CisgICAgICByZXQgPSBQcmltYXJ5U3VmZml4V2l0aG91dFN1cGVyKHJldCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByaW1hcnlQcmVmaXgoKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbnVsbDsKKyAgICAgICAgTmFtZUV4cHIgbmFtZTsKKyAgICAgICAgTGlzdCB0eXBlQXJncyA9IG51bGw7CisgICAgICAgIExpc3QgYXJncyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaGFzQXJncyA9IGZhbHNlOworICAgICAgICBib29sZWFuIGlzTGFtYmRhID0gZmFsc2U7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgICAgIFBhcmFtZXRlciBwID0gbnVsbDsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBudWxsOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgcmV0ID0gTGl0ZXJhbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUSElTOgorICAgICAgampfY29uc3VtZV90b2tlbihUSElTKTsKKyAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgVGhpc0V4cHIodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBudWxsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1VQRVI6CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNVUEVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN1cGVyRXhwcih0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIG51bGwpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIERPVDoKKyAgICAgICAgampfY29uc3VtZV90b2tlbihET1QpOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgY2FzZSAxMzI6CisgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3MucmVtb3ZlKDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMDddID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gU2ltcGxlTmFtZSgpOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgYXJncyA9IEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBcmdzPXRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzEwOF0gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBtID0gbmV3IE1ldGhvZENhbGxFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCB0eXBlQXJncywgbnVsbCwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0TmFtZUV4cHIobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEFjY2Vzc0V4cHIgZiA9IG5ldyBGaWVsZEFjY2Vzc0V4cHIocmV0LmdldEJlZ2luTGluZSgpLCByZXQuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCByZXQsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnNldEZpZWxkRXhwcihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERPVUJMRUNPTE9OOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVUJMRUNPTE9OKTsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgTFQ6CisgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlUGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBcmdzLnJlbW92ZSgwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTA5XSA9IGpqX2dlbjsKKyAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FVzoKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5FVyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzExMF0gPSBqal9nZW47CisgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKHJldC5nZXRCZWdpbkxpbmUoKSwgcmV0LmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmV0LCB0eXBlQXJncywgdG9rZW4uaW1hZ2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICBhcmdzID0gQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgdHlwZUFyZ3MsIG51bGwsIGFyZ3MpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMTFdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIExQQVJFTjoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICAgICAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVEFUSUM6CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIEFUOgorICAgICAgY2FzZSBCQU5HOgorICAgICAgY2FzZSBUSUxERToKKyAgICAgIGNhc2UgSU5DUjoKKyAgICAgIGNhc2UgREVDUjoKKyAgICAgIGNhc2UgUExVUzoKKyAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgIGlmIChqal8yXzI3KDIxNDc0ODM2NDcpKSB7CisgICAgICAgICAgcCA9IEZvcm1hbFBhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xhbWJkYSA9IHRydWU7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIGFyZ3MgPSBGb3JtYWxMYW1iZGFQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzExMl0gPSBqal9nZW47CisgICAgICAgICAgICA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgIGNhc2UgRkFMU0U6CisgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICBjYXNlIExPTkc6CisgICAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgY2FzZSBOVUxMOgorICAgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgICAgY2FzZSBTVVBFUjoKKyAgICAgICAgICBjYXNlIFRISVM6CisgICAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICAgIGNhc2UgVk9JRDoKKyAgICAgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICBjYXNlIEJBTkc6CisgICAgICAgICAgY2FzZSBUSUxERToKKyAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgcmV0ID0gRXhwcmVzc2lvbigpOworICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICBhcmdzID0gSW5mZXJyZWRMYW1iZGFQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFtYmRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBqal9sYTFbMTEzXSA9IGpqX2dlbjsKKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGpqX2xhMVsxMTRdID0gampfZ2VuOworICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTE1XSA9IGpqX2dlbjsKKyAgICAgICAgOworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzTGFtYmRhKSB7IHJldCA9IG5ldyBFbmNsb3NlZEV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4scmV0KTt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldCAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldCBpbnN0YW5jZW9mIE5hbWVFeHByKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3JJZChyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCByZXQuZ2V0RW5kTGluZSgpLCByZXQuZ2V0RW5kQ29sdW1uKCksICgoTmFtZUV4cHIpcmV0KS5nZXROYW1lKCksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gbmV3IFBhcmFtZXRlcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCByZXQuZ2V0RW5kTGluZSgpLCByZXQuZ2V0RW5kQ29sdW1uKCksIDAsIG51bGwsIG5ldyBVbmtub3duVHlwZSgpLCBmYWxzZSwgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhZGQoMCwgYXJncywgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IExhbWJkYUV4cHIocC5nZXRCZWdpbkxpbmUoKSwgcC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIGFyZ3MsIG51bGwsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIE5FVzoKKyAgICAgIHJldCA9IEFsbG9jYXRpb25FeHByZXNzaW9uKG51bGwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMTldID0gampfZ2VuOworICAgICAgaWYgKGpqXzJfMjgoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgdHlwZSA9IFJlc3VsdFR5cGUoKTsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihET1QpOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKENMQVNTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBDbGFzc0V4cHIodHlwZS5nZXRCZWdpbkxpbmUoKSwgdHlwZS5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHR5cGUpOworICAgICAgfSBlbHNlIGlmIChqal8yXzI5KDIxNDc0ODM2NDcpKSB7CisgICAgICAgIHR5cGUgPSBSZXN1bHRUeXBlKCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9VQkxFQ09MT04pOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICB0eXBlQXJncyA9IFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJncy5yZW1vdmUoMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzExNl0gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgampfY29uc3VtZV90b2tlbihORVcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxMTddID0gampfZ2VuOworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgVHlwZUV4cHIodHlwZS5nZXRCZWdpbkxpbmUoKSwgdHlwZS5nZXRCZWdpbkNvbHVtbigpLCB0eXBlLmdldEVuZExpbmUoKSwgdHlwZS5nZXRFbmRDb2x1bW4oKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgTWV0aG9kUmVmZXJlbmNlRXhwcihyZXQuZ2V0QmVnaW5MaW5lKCksIHJldC5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHJldCwgdHlwZUFyZ3MsIHRva2VuLmltYWdlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgbmFtZSA9IFNpbXBsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgIGFyZ3MgPSBBcmd1bWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXJncz10cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGpqX2xhMVsxMThdID0gampfZ2VuOworICAgICAgICAgICAgOworICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBcmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZENhbGxFeHByIG0gPSBuZXcgTWV0aG9kQ2FsbEV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIG51bGwsIG51bGwsIG51bGwsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldE5hbWVFeHByKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTIwXSA9IGpqX2dlbjsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBQcmltYXJ5U3VmZml4KEV4cHJlc3Npb24gc2NvcGUpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgaWYgKGpqXzJfMzAoMikpIHsKKyAgICAgIHJldCA9IFByaW1hcnlTdWZmaXhXaXRob3V0U3VwZXIoc2NvcGUpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgRE9UOgorICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOworICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBTdXBlckV4cHIoc2NvcGUuZ2V0QmVnaW5MaW5lKCksIHNjb3BlLmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgc2NvcGUpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMjFdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIFByaW1hcnlTdWZmaXhXaXRob3V0U3VwZXIoRXhwcmVzc2lvbiBzY29wZSkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgTGlzdCB0eXBlQXJncyA9IG51bGw7CisgICAgICAgIExpc3QgYXJncyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaGFzQXJncyA9IGZhbHNlOworICAgICAgICBOYW1lRXhwciBuYW1lOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgRE9UOgorICAgICAgampfY29uc3VtZV90b2tlbihET1QpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIFRISVM6CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVEhJUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFRoaXNFeHByKHNjb3BlLmdldEJlZ2luTGluZSgpLCBzY29wZS5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHNjb3BlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5FVzoKKyAgICAgICAgcmV0ID0gQWxsb2NhdGlvbkV4cHJlc3Npb24oc2NvcGUpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMjRdID0gampfZ2VuOworICAgICAgICBpZiAoampfMl8zMSgyMTQ3NDgzNjQ3KSkgeworICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICAgIGNhc2UgTFQ6CisgICAgICAgICAgY2FzZSAxMzI6CisgICAgICAgICAgICB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJncy5yZW1vdmUoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgampfbGExWzEyMl0gPSBqal9nZW47CisgICAgICAgICAgICA7CisgICAgICAgICAgfQorICAgICAgICAgIG5hbWUgPSBTaW1wbGVOYW1lKCk7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICBhcmdzID0gQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FyZ3M9dHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbMTIzXSA9IGpqX2dlbjsKKyAgICAgICAgICAgIDsKKyAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RDYWxsRXhwciBtID0gbmV3IE1ldGhvZENhbGxFeHByKHNjb3BlLmdldEJlZ2luTGluZSgpLCBzY29wZS5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHNjb3BlLCB0eXBlQXJncywgbnVsbCwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0TmFtZUV4cHIobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEFjY2Vzc0V4cHIgZiA9ICBuZXcgRmllbGRBY2Nlc3NFeHByKHNjb3BlLmdldEJlZ2luTGluZSgpLCBzY29wZS5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHNjb3BlLCB0eXBlQXJncywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuc2V0RmllbGRFeHByKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIExCUkFDS0VUOgorICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7CisgICAgICByZXQgPSBFeHByZXNzaW9uKCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEFycmF5QWNjZXNzRXhwcihzY29wZS5nZXRCZWdpbkxpbmUoKSwgc2NvcGUuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBzY29wZSwgcmV0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTI1XSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIExpdGVyYWwoKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgampfY29uc3VtZV90b2tlbihJTlRFR0VSX0xJVEVSQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEludGVnZXJMaXRlcmFsRXhwcih0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHRva2VuLmltYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgampfY29uc3VtZV90b2tlbihMT05HX0xJVEVSQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IExvbmdMaXRlcmFsRXhwcih0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHRva2VuLmltYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgRG91YmxlTGl0ZXJhbEV4cHIodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCB0b2tlbi5pbWFnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgampfY29uc3VtZV90b2tlbihDSEFSQUNURVJfTElURVJBTCk7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IENoYXJMaXRlcmFsRXhwcih0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHRva2VuLmltYWdlLnN1YnN0cmluZygxLCB0b2tlbi5pbWFnZS5sZW5ndGgoKS0xKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN0cmluZ0xpdGVyYWxFeHByKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgdG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDEsIHRva2VuLmltYWdlLmxlbmd0aCgpLTEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBUUlVFOgorICAgICAgcmV0ID0gQm9vbGVhbkxpdGVyYWwoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTlVMTDoKKyAgICAgIHJldCA9IE51bGxMaXRlcmFsKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEyNl0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBCb29sZWFuTGl0ZXJhbCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBUUlVFOgorICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKKyAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKHRva2VuLmJlZ2luTGluZSwgdG9rZW4uYmVnaW5Db2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgdHJ1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZBTFNFOgorICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCb29sZWFuTGl0ZXJhbEV4cHIodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzEyN10gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBOdWxsTGl0ZXJhbCgpIHsKKyAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBOdWxsTGl0ZXJhbEV4cHIodG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IEFyZ3VtZW50cygpIHsKKyAgICAgICAgTGlzdCByZXQgPSBudWxsOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZBTFNFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkVXOgorICAgIGNhc2UgTlVMTDoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1VQRVI6CisgICAgY2FzZSBUSElTOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIFZPSUQ6CisgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBMUEFSRU46CisgICAgY2FzZSBCQU5HOgorICAgIGNhc2UgVElMREU6CisgICAgY2FzZSBJTkNSOgorICAgIGNhc2UgREVDUjoKKyAgICBjYXNlIFBMVVM6CisgICAgY2FzZSBNSU5VUzoKKyAgICAgIHJldCA9IEFyZ3VtZW50TGlzdCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMjhdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3QgQXJndW1lbnRMaXN0KCkgeworICAgICAgICBMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcjsKKyAgICBleHByID0gRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChleHByKTsKKyAgICBsYWJlbF81NToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEyOV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzU1OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBleHByID0gRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChleHByKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gQWxsb2NhdGlvbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBzY29wZSkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgQXJyYXlDcmVhdGlvbkV4cHIgYXJyYXlFeHByOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIE9iamVjdFtdIGFyciA9IG51bGw7CisgICAgICAgIExpc3QgdHlwZUFyZ3MgPSBudWxsOworICAgICAgICBMaXN0IGFub255bW91c0JvZHkgPSBudWxsOworICAgICAgICBMaXN0IGFyZ3M7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgICAgICBMaXN0IGFubm90YXRpb25zID0gbnVsbDsKKyAgICAgICAgQW5ub3RhdGlvbkV4cHIgYW5uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTkVXKTsKKyAgICAgICAgICBpZihzY29wZT09bnVsbCkge2xpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47fSBlbHNlIHtsaW5lPXNjb3BlLmdldEJlZ2luTGluZSgpOyBjb2x1bW49c2NvcGUuZ2V0QmVnaW5Db2x1bW4oKTt9CisgICAgbGFiZWxfNTY6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMzBdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF81NjsKKyAgICAgIH0KKyAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubik7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgU0hPUlQ6CisgICAgICB0eXBlID0gUHJpbWl0aXZlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgYXJyID0gQXJyYXlEaW1zQW5kSW5pdHMoKTsKKyAgICAgICAgICAgIGFycmF5RXhwciA9IG5ldyBBcnJheUNyZWF0aW9uRXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgdHlwZSwgbnVsbCwgMCk7CisgICAgICAgICAgICBhcnJheUV4cHIuc2V0QXJyYXlzQW5ub3RhdGlvbnMoKExpc3QpYXJyWzJdKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJyWzBdIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgICAgICAgICBhcnJheUV4cHIuc2V0QXJyYXlDb3VudCgoKEludGVnZXIpYXJyWzBdKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlFeHByLnNldEluaXRpYWxpemVyKChBcnJheUluaXRpYWxpemVyRXhwcilhcnJbMV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5RXhwci5zZXRBcnJheUNvdW50KCgoSW50ZWdlcilhcnJbMV0pLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBhcnJheUV4cHIuc2V0RGltZW5zaW9ucygoTGlzdClhcnJbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgPSBhcnJheUV4cHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBMVDoKKyAgICBjYXNlIDEzMjoKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBMVDoKKyAgICAgIGNhc2UgMTMyOgorICAgICAgICB0eXBlQXJncyA9IFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgbGFiZWxfNTc6CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbMTMxXSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGJyZWFrIGxhYmVsXzU3OworICAgICAgICAgIH0KKyAgICAgICAgICBhbm4gPSBBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJncy5yZW1vdmUoMCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEzMl0gPSBqal9nZW47CisgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBDbGFzc09ySW50ZXJmYWNlVHlwZSgpOworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgY2FzZSBBVDoKKyAgICAgICAgYXJyID0gQXJyYXlEaW1zQW5kSW5pdHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IGFycmF5RXhwciA9IG5ldyBBcnJheUNyZWF0aW9uRXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgdHlwZSwgbnVsbCwgMCk7CisgICAgICAgICAgICAgICAgICAgIGFycmF5RXhwci5zZXRBcnJheXNBbm5vdGF0aW9ucygoTGlzdClhcnJbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyclswXSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlFeHByLnNldEFycmF5Q291bnQoKChJbnRlZ2VyKWFyclswXSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlFeHByLnNldEluaXRpYWxpemVyKChBcnJheUluaXRpYWxpemVyRXhwcilhcnJbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlFeHByLnNldEFycmF5Q291bnQoKChJbnRlZ2VyKWFyclsxXSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlFeHByLnNldERpbWVuc2lvbnMoKExpc3QpYXJyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGFycmF5RXhwcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgYXJncyA9IEFyZ3VtZW50cygpOworICAgICAgICBpZiAoampfMl8zMigyKSkgeworICAgICAgICAgIGFub255bW91c0JvZHkgPSBDbGFzc09ySW50ZXJmYWNlQm9keShmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgICAgICAgICAgdHlwZS5zZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7IHJldCA9IG5ldyBPYmplY3RDcmVhdGlvbkV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHNjb3BlLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIHR5cGUsIHR5cGVBcmdzLCBhcmdzLCBhbm9ueW1vdXNCb2R5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTMzXSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxMzRdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKy8qCisgKiBUaGUgdGhpcmQgTE9PS0FIRUFEIHNwZWNpZmljYXRpb24gYmVsb3cgaXMgdG8gcGFyc2UgdG8gUHJpbWFyeVN1ZmZpeAorICogaWYgdGhlcmUgaXMgYW4gZXhwcmVzc2lvbiBiZXR3ZWVuIHRoZSAiWy4uLl0iLgorICovCisgIGZpbmFsIHB1YmxpYyBPYmplY3RbXSBBcnJheURpbXNBbmRJbml0cygpIHsKKyAgICAgICAgT2JqZWN0W10gcmV0ID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByOworICAgICAgICBMaXN0IGluaXRzID0gbnVsbDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBMaXN0IGFjY3VtID0gbnVsbDsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG51bGw7CisgICAgICAgIEFubm90YXRpb25FeHByIGFubjsKKyAgICBsYWJlbF81ODoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEFUOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEzNV0gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzU4OworICAgICAgfQorICAgICAgYW5uID0gQW5ub3RhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFkZChhbm5vdGF0aW9ucywgYW5uKTsKKyAgICB9CisgICAgaWYgKGpqXzJfMzUoMikpIHsKKyAgICAgIGxhYmVsXzU5OgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7CisgICAgICAgIGV4cHIgPSBFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSA9IGFkZChhY2N1bSwgYW5ub3RhdGlvbnMpOyBhbm5vdGF0aW9ucz1udWxsOyBpbml0cyA9IGFkZChpbml0cywgZXhwcik7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOworICAgICAgICBpZiAoampfMl8zMygyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF81OTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFiZWxfNjA6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoampfMl8zNCgyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF82MDsKKyAgICAgICAgfQorICAgICAgICBsYWJlbF82MToKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIEFUOgorICAgICAgICAgICAgOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGpqX2xhMVsxMzZdID0gampfZ2VuOworICAgICAgICAgICAgYnJlYWsgbGFiZWxfNjE7CisgICAgICAgICAgfQorICAgICAgICAgIGFubiA9IEFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhZGQoYW5ub3RhdGlvbnMsIGFubik7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtID0gYWRkKGFjY3VtLCBhbm5vdGF0aW9ucyk7IGFubm90YXRpb25zPW51bGw7IHJldFswXSA9IGluaXRzOyByZXRbMV0gPSBuZXcgSW50ZWdlcihpKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICBsYWJlbF82MjoKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKKyAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbMTM3XSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGJyZWFrIGxhYmVsXzYyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleHByID0gQXJyYXlJbml0aWFsaXplcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW0gPSBhZGQoYWNjdW0sIGFubm90YXRpb25zKTthbm5vdGF0aW9ucz1udWxsOyAgcmV0WzBdID0gbmV3IEludGVnZXIoaSk7IHJldFsxXSA9IGV4cHI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzEzOF0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0WzJdPWFjY3VtOyB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworLyoKKyAqIFN0YXRlbWVudCBzeW50YXggZm9sbG93cy4KKyAqLworICBmaW5hbCBwdWJsaWMgU3RhdGVtZW50IFN0YXRlbWVudCgpIHsKKyAgICAgICAgU3RhdGVtZW50IHJldDsKKyAgICBpZiAoampfMl8zNigyKSkgeworICAgICAgcmV0ID0gTGFiZWxlZFN0YXRlbWVudCgpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVNTRVJUOgorICAgICAgICByZXQgPSBBc3NlcnRTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExCUkFDRToKKyAgICAgICAgcmV0ID0gQmxvY2soKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgICAgcmV0ID0gRW1wdHlTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNVUEVSOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUlVFOgorICAgICAgY2FzZSBWT0lEOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIElOQ1I6CisgICAgICBjYXNlIERFQ1I6CisgICAgICAgIHJldCA9IFN0YXRlbWVudEV4cHJlc3Npb24oKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNXSVRDSDoKKyAgICAgICAgcmV0ID0gU3dpdGNoU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRjoKKyAgICAgICAgcmV0ID0gSWZTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdISUxFOgorICAgICAgICByZXQgPSBXaGlsZVN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRE86CisgICAgICAgIHJldCA9IERvU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1I6CisgICAgICAgIHJldCA9IEZvclN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQlJFQUs6CisgICAgICAgIHJldCA9IEJyZWFrU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDT05USU5VRToKKyAgICAgICAgcmV0ID0gQ29udGludWVTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJFVFVSTjoKKyAgICAgICAgcmV0ID0gUmV0dXJuU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUSFJPVzoKKyAgICAgICAgcmV0ID0gVGhyb3dTdGF0ZW1lbnQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgICAgcmV0ID0gU3luY2hyb25pemVkU3RhdGVtZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUUlk6CisgICAgICAgIHJldCA9IFRyeVN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxMzldID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBc3NlcnRTdG10IEFzc2VydFN0YXRlbWVudCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjaGVjazsKKyAgICAgICAgRXhwcmVzc2lvbiBtc2cgPSBudWxsOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKEFTU0VSVCk7CisgICAgICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIGNoZWNrID0gRXhwcmVzc2lvbigpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQ09MT046CisgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKKyAgICAgIG1zZyA9IEV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTQwXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBBc3NlcnRTdG10KGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLGNoZWNrLCBtc2cpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExhYmVsZWRTdG10IExhYmVsZWRTdGF0ZW1lbnQoKSB7CisgICAgICAgIFN0cmluZyBsYWJlbDsKKyAgICAgICAgU3RhdGVtZW50IHN0bXQ7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHRva2VuLmltYWdlOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOworICAgIHN0bXQgPSBTdGF0ZW1lbnQoKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTGFiZWxlZFN0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sbGFiZWwsIHN0bXQpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEJsb2NrU3RtdCBCbG9jaygpIHsKKyAgICAgICAgTGlzdCBzdG10czsKKyAgICAgICAgaW50IGJlZ2luTGluZTsKKyAgICAgICAgaW50IGJlZ2luQ29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKKyAgICAgICBiZWdpbkxpbmU9dG9rZW4uYmVnaW5MaW5lOyBiZWdpbkNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBzdG10cyA9IFN0YXRlbWVudHMoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IEJsb2NrU3RtdChiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIHN0bXRzKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisvKgorICogQ2xhc3NlcyBpbnNpZGUgYmxvY2sgc3RhbWV0ZW50cyBjYW4gb25seSBiZSBhYnN0cmFjdCBvciBmaW5hbC4gVGhlIHNlbWFudGljIG11c3QgY2hlY2sgaXQuCisgKi8KKyAgZmluYWwgcHVibGljIFN0YXRlbWVudCBCbG9ja1N0YXRlbWVudCgpIHsKKyAgICAgICAgU3RhdGVtZW50IHJldDsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gdHlwZURlY2w7CisgICAgICAgIE1vZGlmaWVyIG1vZGlmaWVyOworICAgIGlmIChqal8yXzM3KDIxNDc0ODM2NDcpKSB7CisKKyAgICAgIG1vZGlmaWVyID0gTW9kaWZpZXJzKCk7CisgICAgICB0eXBlRGVjbCA9IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFR5cGVEZWNsYXJhdGlvblN0bXQodHlwZURlY2wuZ2V0QmVnaW5MaW5lKCksIHR5cGVEZWNsLmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgdHlwZURlY2wpOworICAgIH0gZWxzZSBpZiAoampfMl8zOCgyMTQ3NDgzNjQ3KSkgeworICAgICAgZXhwciA9IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgICAgICAgICByZXQgPSBuZXcgRXhwcmVzc2lvblN0bXQoZXhwci5nZXRCZWdpbkxpbmUoKSwgZXhwci5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIGV4cHIpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVNTRVJUOgorICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgY2FzZSBCUkVBSzoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgQ09OVElOVUU6CisgICAgICBjYXNlIERPOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEZBTFNFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgRk9SOgorICAgICAgY2FzZSBJRjoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBORVc6CisgICAgICBjYXNlIE5VTEw6CisgICAgICBjYXNlIFJFVFVSTjoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNVUEVSOgorICAgICAgY2FzZSBTV0lUQ0g6CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgIGNhc2UgVEhJUzoKKyAgICAgIGNhc2UgVEhST1c6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFRSWToKKyAgICAgIGNhc2UgVk9JRDoKKyAgICAgIGNhc2UgV0hJTEU6CisgICAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgorICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6CisgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICBjYXNlIExQQVJFTjoKKyAgICAgIGNhc2UgTEJSQUNFOgorICAgICAgY2FzZSBTRU1JQ09MT046CisgICAgICBjYXNlIElOQ1I6CisgICAgICBjYXNlIERFQ1I6CisgICAgICAgIHJldCA9IFN0YXRlbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDFdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpIHsKKyAgICAgICAgTW9kaWZpZXIgbW9kaWZpZXI7CisgICAgICAgIFR5cGUgdHlwZTsKKyAgICAgICAgTGlzdCB2YXJzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcjsKKyAgICBtb2RpZmllciA9IE1vZGlmaWVycygpOworICAgIHR5cGUgPSBUeXBlKCk7CisgICAgdmFyID0gVmFyaWFibGVEZWNsYXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMuYWRkKHZhcik7CisgICAgbGFiZWxfNjM6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDJdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF82MzsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgdmFyID0gVmFyaWFibGVEZWNsYXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLmFkZCh2YXIpOworICAgIH0KKyAgICBpbnQgbGluZSA9IG1vZGlmaWVyLmJlZ2luTGluZTsKKyAgICBpbnQgY29sdW1uID0gbW9kaWZpZXIuYmVnaW5Db2x1bW47CisgICAgaWYobGluZT09LTEpIHtsaW5lPXR5cGUuZ2V0QmVnaW5MaW5lKCk7IGNvbHVtbj10eXBlLmdldEJlZ2luQ29sdW1uKCk7IH0KKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIG1vZGlmaWVyLm1vZGlmaWVycywgbW9kaWZpZXIuYW5ub3RhdGlvbnMsIHR5cGUsIHZhcnMpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEVtcHR5U3RtdCBFbXB0eVN0YXRlbWVudCgpIHsKKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IEVtcHR5U3RtdCh0b2tlbi5iZWdpbkxpbmUsIHRva2VuLmJlZ2luQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4pO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0YXRlbWVudCBMYW1iZGFCb2R5KCkgeworICBFeHByZXNzaW9uIGV4cHI7CisgIFN0YXRlbWVudCBuID0gbnVsbDsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEJPT0xFQU46CisgICAgY2FzZSBCWVRFOgorICAgIGNhc2UgQ0hBUjoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEZBTFNFOgorICAgIGNhc2UgRkxPQVQ6CisgICAgY2FzZSBJTlQ6CisgICAgY2FzZSBMT05HOgorICAgIGNhc2UgTkVXOgorICAgIGNhc2UgTlVMTDoKKyAgICBjYXNlIFNIT1JUOgorICAgIGNhc2UgU1VQRVI6CisgICAgY2FzZSBUSElTOgorICAgIGNhc2UgVFJVRToKKyAgICBjYXNlIFZPSUQ6CisgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICBjYXNlIElERU5USUZJRVI6CisgICAgY2FzZSBMUEFSRU46CisgICAgY2FzZSBCQU5HOgorICAgIGNhc2UgVElMREU6CisgICAgY2FzZSBJTkNSOgorICAgIGNhc2UgREVDUjoKKyAgICBjYXNlIFBMVVM6CisgICAgY2FzZSBNSU5VUzoKKyAgICAgIGV4cHIgPSBFeHByZXNzaW9uKCk7CisgICAgICAgICAgbiA9IG5ldyBFeHByZXNzaW9uU3RtdChleHByLmdldEJlZ2luTGluZSgpLCBleHByLmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgZXhwcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIExCUkFDRToKKyAgICAgIG4gPSBCbG9jaygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNDNdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG47fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvblN0bXQgU3RhdGVtZW50RXhwcmVzc2lvbigpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByOworICAgICAgICBBc3NpZ25FeHByLk9wZXJhdG9yIG9wOworICAgICAgICBFeHByZXNzaW9uIHZhbHVlOworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIExpc3QgdHlwZUFyZ3MgPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgbGFtYmRhQm9keSA9IG51bGw7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gbnVsbDsKKyAgICAgICAgTGlzdCBwYXJhbXMgPSBudWxsOworICAgICAgICBFeHByZXNzaW9uIGlubmVyID0gbnVsbDsKKyAgICBpZiAoampfMl8zOSgyKSkgeworICAgICAgZXhwciA9IFByZUluY3JlbWVudEV4cHJlc3Npb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIERFQ1I6CisgICAgICAgIGV4cHIgPSBQcmVEZWNyZW1lbnRFeHByZXNzaW9uKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgY2FzZSBCWVRFOgorICAgICAgY2FzZSBDSEFSOgorICAgICAgY2FzZSBET1VCTEU6CisgICAgICBjYXNlIEZBTFNFOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBORVc6CisgICAgICBjYXNlIE5VTEw6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgVEhJUzoKKyAgICAgIGNhc2UgVFJVRToKKyAgICAgIGNhc2UgVk9JRDoKKyAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6CisgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICBleHByID0gUHJpbWFyeUV4cHJlc3Npb24oKTsKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgY2FzZSBQTFVTQVNTSUdOOgorICAgICAgICBjYXNlIE1JTlVTQVNTSUdOOgorICAgICAgICBjYXNlIFNUQVJBU1NJR046CisgICAgICAgIGNhc2UgU0xBU0hBU1NJR046CisgICAgICAgIGNhc2UgQU5EQVNTSUdOOgorICAgICAgICBjYXNlIE9SQVNTSUdOOgorICAgICAgICBjYXNlIFhPUkFTU0lHTjoKKyAgICAgICAgY2FzZSBSRU1BU1NJR046CisgICAgICAgIGNhc2UgTFNISUZUQVNTSUdOOgorICAgICAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKKyAgICAgICAgY2FzZSBSVU5TSUdORURTSElGVEFTU0lHTjoKKyAgICAgICAgY2FzZSBBUlJPVzoKKyAgICAgICAgY2FzZSBET1VCTEVDT0xPTjoKKyAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOQ1IpOworICAgICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgVW5hcnlFeHByKGV4cHIuZ2V0QmVnaW5MaW5lKCksIGV4cHIuZ2V0QmVnaW5Db2x1bW4oKSwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLCBleHByLCBVbmFyeUV4cHIuT3BlcmF0b3IucG9zSW5jcmVtZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVDUik7CisgICAgICAgICAgICAgICAgICAgZXhwciA9IG5ldyBVbmFyeUV4cHIoZXhwci5nZXRCZWdpbkxpbmUoKSwgZXhwci5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIGV4cHIsIFVuYXJ5RXhwci5PcGVyYXRvci5wb3NEZWNyZW1lbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgICAgY2FzZSBQTFVTQVNTSUdOOgorICAgICAgICAgIGNhc2UgTUlOVVNBU1NJR046CisgICAgICAgICAgY2FzZSBTVEFSQVNTSUdOOgorICAgICAgICAgIGNhc2UgU0xBU0hBU1NJR046CisgICAgICAgICAgY2FzZSBBTkRBU1NJR046CisgICAgICAgICAgY2FzZSBPUkFTU0lHTjoKKyAgICAgICAgICBjYXNlIFhPUkFTU0lHTjoKKyAgICAgICAgICBjYXNlIFJFTUFTU0lHTjoKKyAgICAgICAgICBjYXNlIExTSElGVEFTU0lHTjoKKyAgICAgICAgICBjYXNlIFJTSUdORURTSElGVEFTU0lHTjoKKyAgICAgICAgICBjYXNlIFJVTlNJR05FRFNISUZUQVNTSUdOOgorICAgICAgICAgICAgb3AgPSBBc3NpZ25tZW50T3BlcmF0b3IoKTsKKyAgICAgICAgICAgIHZhbHVlID0gRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgQXNzaWduRXhwcihleHByLmdldEJlZ2luTGluZSgpLCBleHByLmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgZXhwciwgdmFsdWUsIG9wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRE9VQkxFQ09MT046CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVUJMRUNPTE9OKTsKKyAgICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICAgICAgdHlwZUFyZ3MgPSBUeXBlUGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBcmdzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBqal9sYTFbMTQ0XSA9IGpqX2dlbjsKKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkVXKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBqal9sYTFbMTQ1XSA9IGpqX2dlbjsKKyAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgTWV0aG9kUmVmZXJlbmNlRXhwcihleHByLmdldEJlZ2luTGluZSgpLCBleHByLmdldEJlZ2luQ29sdW1uKCksIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgZXhwciwgdHlwZUFyZ3MsIHRva2VuLmltYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQVJST1c6CisgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEFSUk9XKTsKKyAgICAgICAgICAgIGxhbWJkYUJvZHkgPSBMYW1iZGFCb2R5KCk7CisgICAgICAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBDYXN0RXhwcikKKyAgICAgICAgICAgICB7CisgICAgICAgICAgIGlubmVyID0gZ2VuZXJhdGVMYW1iZGEoKChDYXN0RXhwcilleHByKS5nZXRFeHByKCksIGxhbWJkYUJvZHkpOworICAgICAgICAgICAoKENhc3RFeHByKWV4cHIpLnNldEV4cHIoaW5uZXIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZXhwciA9IGdlbmVyYXRlTGFtYmRhKGV4cHIsIGxhbWJkYUJvZHkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBqal9sYTFbMTQ2XSA9IGpqX2dlbjsKKyAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxNDddID0gampfZ2VuOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDhdID0gampfZ2VuOworICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgRXhwcmVzc2lvblN0bXQoZXhwci5nZXRCZWdpbkxpbmUoKSwgZXhwci5nZXRCZWdpbkNvbHVtbigpLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIGV4cHIpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN3aXRjaFN0bXQgU3dpdGNoU3RhdGVtZW50KCkgeworICAgICAgICBFeHByZXNzaW9uIHNlbGVjdG9yOworICAgICAgICBTd2l0Y2hFbnRyeVN0bXQgZW50cnk7CisgICAgICAgIExpc3QgZW50cmllcyA9IG51bGw7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oU1dJVENIKTsKKyAgICAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIHNlbGVjdG9yID0gRXhwcmVzc2lvbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7CisgICAgbGFiZWxfNjQ6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBDQVNFOgorICAgICAgY2FzZSBfREVGQVVMVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNDldID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF82NDsKKyAgICAgIH0KKyAgICAgIGVudHJ5ID0gU3dpdGNoRW50cnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgPSBhZGQoZW50cmllcywgZW50cnkpOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFN3aXRjaFN0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sc2VsZWN0b3IsIGVudHJpZXMpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN3aXRjaEVudHJ5U3RtdCBTd2l0Y2hFbnRyeSgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBsYWJlbCA9IG51bGw7CisgICAgICAgIExpc3Qgc3RtdHM7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQ0FTRToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ0FTRSk7CisgICAgICAgICAgICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgICAgbGFiZWwgPSBFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9ERUZBVUxUOgorICAgICAgampfY29uc3VtZV90b2tlbihfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNTBdID0gampfZ2VuOworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7CisgICAgc3RtdHMgPSBTdGF0ZW1lbnRzKCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFN3aXRjaEVudHJ5U3RtdChsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixsYWJlbCwgc3RtdHMpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIElmU3RtdCBJZlN0YXRlbWVudCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb247CisgICAgICAgIFN0YXRlbWVudCB0aGVuU3RtdDsKKyAgICAgICAgU3RhdGVtZW50IGVsc2VTdG10ID0gbnVsbDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgQ29tbWVudCB0aGVuQ21tdCA9IG51bGw7CisgICAgQ29tbWVudCBlbHNlQ21tdCA9IG51bGw7CisgICAgampfY29uc3VtZV90b2tlbihJRik7CisgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGNvbmRpdGlvbiA9IEV4cHJlc3Npb24oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisKKyAgICB0aGVuU3RtdCA9IFN0YXRlbWVudCgpOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgRUxTRToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxTRSk7CisKKyAgICAgIGVsc2VTdG10ID0gU3RhdGVtZW50KCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE1MV0gPSBqal9nZW47CisgICAgICA7CisgICAgfQorICAgICAgSWZTdG10IHRtcCA9IG5ldyBJZlN0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sY29uZGl0aW9uLCB0aGVuU3RtdCwgZWxzZVN0bXQpOworCisgICAgICB0aGVuU3RtdC5zZXRDb21tZW50KHRoZW5DbW10KTsKKyAgICAgIGlmIChlbHNlU3RtdCAhPSBudWxsKQorICAgICAgICAgIGVsc2VTdG10LnNldENvbW1lbnQoZWxzZUNtbXQpOworICAgICAge2lmICh0cnVlKSByZXR1cm4gdG1wO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFdoaWxlU3RtdCBXaGlsZVN0YXRlbWVudCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb247CisgICAgICAgIFN0YXRlbWVudCBib2R5OworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKFdISUxFKTsKKyAgICAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgY29uZGl0aW9uID0gRXhwcmVzc2lvbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICBib2R5ID0gU3RhdGVtZW50KCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFdoaWxlU3RtdChsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixjb25kaXRpb24sIGJvZHkpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIERvU3RtdCBEb1N0YXRlbWVudCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb247CisgICAgICAgIFN0YXRlbWVudCBib2R5OworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKERPKTsKKyAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBib2R5ID0gU3RhdGVtZW50KCk7CisgICAgampfY29uc3VtZV90b2tlbihXSElMRSk7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGNvbmRpdGlvbiA9IEV4cHJlc3Npb24oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBEb1N0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sYm9keSwgY29uZGl0aW9uKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTdGF0ZW1lbnQgRm9yU3RhdGVtZW50KCkgeworICAgICAgICBTdHJpbmcgaWQgPSBudWxsOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2YXJFeHByID0gbnVsbDsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByID0gbnVsbDsKKyAgICAgICAgTGlzdCBpbml0ID0gbnVsbDsKKyAgICAgICAgTGlzdCB1cGRhdGUgPSBudWxsOworICAgICAgICBTdGF0ZW1lbnQgYm9keTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihGT1IpOworICAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgaWYgKGpqXzJfNDAoMjE0NzQ4MzY0NykpIHsKKyAgICAgIHZhckV4cHIgPSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpOworICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7CisgICAgICBleHByID0gRXhwcmVzc2lvbigpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZJTkFMOgorICAgICAgY2FzZSBGTE9BVDoKKyAgICAgIGNhc2UgSU5UOgorICAgICAgY2FzZSBMT05HOgorICAgICAgY2FzZSBOQVRJVkU6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgIGNhc2UgUFJPVEVDVEVEOgorICAgICAgY2FzZSBQVUJMSUM6CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBTVEFUSUM6CisgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgY2FzZSBTVVBFUjoKKyAgICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUkFOU0lFTlQ6CisgICAgICBjYXNlIFRSVUU6CisgICAgICBjYXNlIFZPSUQ6CisgICAgICBjYXNlIFZPTEFUSUxFOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgIGNhc2UgQVQ6CisgICAgICBjYXNlIEJBTkc6CisgICAgICBjYXNlIFRJTERFOgorICAgICAgY2FzZSBJTkNSOgorICAgICAgY2FzZSBERUNSOgorICAgICAgY2FzZSBQTFVTOgorICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIENIQVI6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICBjYXNlIEZBTFNFOgorICAgICAgICBjYXNlIEZJTkFMOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICBjYXNlIE5BVElWRToKKyAgICAgICAgY2FzZSBORVc6CisgICAgICAgIGNhc2UgTlVMTDoKKyAgICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgICAgY2FzZSBQVUJMSUM6CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICBjYXNlIFNUUklDVEZQOgorICAgICAgICBjYXNlIFNVUEVSOgorICAgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgICAgY2FzZSBUSElTOgorICAgICAgICBjYXNlIFRSQU5TSUVOVDoKKyAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgIGNhc2UgVk9MQVRJTEU6CisgICAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICBjYXNlIEFUOgorICAgICAgICBjYXNlIEJBTkc6CisgICAgICAgIGNhc2UgVElMREU6CisgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgY2FzZSBERUNSOgorICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgaW5pdCA9IEZvckluaXQoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTUyXSA9IGpqX2dlbjsKKyAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgIGNhc2UgRkFMU0U6CisgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgIGNhc2UgSU5UOgorICAgICAgICBjYXNlIExPTkc6CisgICAgICAgIGNhc2UgTkVXOgorICAgICAgICBjYXNlIE5VTEw6CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1VQRVI6CisgICAgICAgIGNhc2UgVEhJUzoKKyAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICBjYXNlIEJBTkc6CisgICAgICAgIGNhc2UgVElMREU6CisgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgY2FzZSBERUNSOgorICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBqal9sYTFbMTUzXSA9IGpqX2dlbjsKKyAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICBjYXNlIEJZVEU6CisgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgIGNhc2UgRkFMU0U6CisgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgIGNhc2UgSU5UOgorICAgICAgICBjYXNlIExPTkc6CisgICAgICAgIGNhc2UgTkVXOgorICAgICAgICBjYXNlIE5VTEw6CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1VQRVI6CisgICAgICAgIGNhc2UgVEhJUzoKKyAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICBjYXNlIFZPSUQ6CisgICAgICAgIGNhc2UgTE9OR19MSVRFUkFMOgorICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgorICAgICAgICBjYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICBjYXNlIEJBTkc6CisgICAgICAgIGNhc2UgVElMREU6CisgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgY2FzZSBERUNSOgorICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgdXBkYXRlID0gRm9yVXBkYXRlKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzE1NF0gPSBqal9nZW47CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzE1NV0gPSBqal9nZW47CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgIGJvZHkgPSBTdGF0ZW1lbnQoKTsKKyAgICAgICAgaWYgKHZhckV4cHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBGb3JlYWNoU3RtdChsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbix2YXJFeHByLCBleHByLCBib2R5KTt9CisgICAgICAgIH0KKyAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IEZvclN0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4saW5pdCwgZXhwciwgdXBkYXRlLCBib2R5KTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IEZvckluaXQoKSB7CisgICAgICAgIExpc3QgcmV0OworICAgICAgICBFeHByZXNzaW9uIGV4cHI7CisgICAgaWYgKGpqXzJfNDEoMjE0NzQ4MzY0NykpIHsKKyAgICAgIGV4cHIgPSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsgcmV0LmFkZChleHByKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIEJPT0xFQU46CisgICAgICBjYXNlIEJZVEU6CisgICAgICBjYXNlIENIQVI6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRkFMU0U6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIExPTkc6CisgICAgICBjYXNlIE5FVzoKKyAgICAgIGNhc2UgTlVMTDoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNVUEVSOgorICAgICAgY2FzZSBUSElTOgorICAgICAgY2FzZSBUUlVFOgorICAgICAgY2FzZSBWT0lEOgorICAgICAgY2FzZSBMT05HX0xJVEVSQUw6CisgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKKyAgICAgIGNhc2UgQ0hBUkFDVEVSX0xJVEVSQUw6CisgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgY2FzZSBMUEFSRU46CisgICAgICBjYXNlIEJBTkc6CisgICAgICBjYXNlIFRJTERFOgorICAgICAgY2FzZSBJTkNSOgorICAgICAgY2FzZSBERUNSOgorICAgICAgY2FzZSBQTFVTOgorICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgcmV0ID0gRXhwcmVzc2lvbkxpc3QoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTU2XSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdCBFeHByZXNzaW9uTGlzdCgpIHsKKyAgICAgICAgTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBFeHByZXNzaW9uIGV4cHI7CisgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQoZXhwcik7CisgICAgbGFiZWxfNjU6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNTddID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF82NTsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYWRkKGV4cHIpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdCBGb3JVcGRhdGUoKSB7CisgICAgICAgIExpc3QgcmV0OworICAgIHJldCA9IEV4cHJlc3Npb25MaXN0KCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEJyZWFrU3RtdCBCcmVha1N0YXRlbWVudCgpIHsKKyAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihCUkVBSyk7CisgICAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB0b2tlbi5pbWFnZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTU4XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBCcmVha1N0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4saWQpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENvbnRpbnVlU3RtdCBDb250aW51ZVN0YXRlbWVudCgpIHsKKyAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihDT05USU5VRSk7CisgICAgICAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB0b2tlbi5pbWFnZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTU5XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBDb250aW51ZVN0bXQobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4saWQpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFJldHVyblN0bXQgUmV0dXJuU3RhdGVtZW50KCkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHIgPSBudWxsOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJFVFVSTik7CisgICAgICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBORVc6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBTVVBFUjoKKyAgICBjYXNlIFRISVM6CisgICAgY2FzZSBUUlVFOgorICAgIGNhc2UgVk9JRDoKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIExQQVJFTjoKKyAgICBjYXNlIEJBTkc6CisgICAgY2FzZSBUSUxERToKKyAgICBjYXNlIElOQ1I6CisgICAgY2FzZSBERUNSOgorICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOgorICAgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTYwXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBSZXR1cm5TdG10KGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLGV4cHIpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFRocm93U3RtdCBUaHJvd1N0YXRlbWVudCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKFRIUk9XKTsKKyAgICAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBleHByID0gRXhwcmVzc2lvbigpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgVGhyb3dTdG10KGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLGV4cHIpO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN5bmNocm9uaXplZFN0bXQgU3luY2hyb25pemVkU3RhdGVtZW50KCkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHI7CisgICAgICAgIEJsb2NrU3RtdCBibG9jazsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihTWU5DSFJPTklaRUQpOworICAgICAgICAgICAgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgZXhwciA9IEV4cHJlc3Npb24oKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgYmxvY2sgPSBCbG9jaygpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRTdG10KGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLGV4cHIsIGJsb2NrKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUcnlTdG10IFRyeVN0YXRlbWVudCgpIHsKKyAgICAgICAgTGlzdCByZXNvdXJjZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBCbG9ja1N0bXQgdHJ5QmxvY2s7CisgICAgICAgIEJsb2NrU3RtdCBmaW5hbGx5QmxvY2sgPSBudWxsOworICAgICAgICBMaXN0IGNhdGNocyA9IG51bGw7CisgICAgICAgIFBhcmFtZXRlciBleGNlcHQ7CisgICAgICAgIEJsb2NrU3RtdCBjYXRjaEJsb2NrOworICAgICAgICBNb2RpZmllciBleGNlcHRNb2RpZmllcjsKKyAgICAgICAgVHlwZSBleGNlcHRUeXBlOworICAgICAgICBMaXN0IGV4Y2VwdFR5cGVzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9ySWQgZXhjZXB0SWQ7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgICAgICBpbnQgY0xpbmU7CisgICAgICAgIGludCBjQ29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJZKTsKKyAgICAgICAgIGxpbmU9dG9rZW4uYmVnaW5MaW5lOyBjb2x1bW49dG9rZW4uYmVnaW5Db2x1bW47CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBMUEFSRU46CisgICAgICByZXNvdXJjZXMgPSBSZXNvdXJjZVNwZWNpZmljYXRpb24oKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTYxXSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgdHJ5QmxvY2sgPSBCbG9jaygpOworICAgIGxhYmVsXzY2OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQ0FUQ0g6CisgICAgICAgIDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTYyXSA9IGpqX2dlbjsKKyAgICAgICAgYnJlYWsgbGFiZWxfNjY7CisgICAgICB9CisgICAgICBqal9jb25zdW1lX3Rva2VuKENBVENIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNMaW5lPXRva2VuLmJlZ2luTGluZTsgY0NvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICAgIGV4Y2VwdE1vZGlmaWVyID0gTW9kaWZpZXJzKCk7CisgICAgICBleGNlcHRUeXBlID0gVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0VHlwZXMuYWRkKGV4Y2VwdFR5cGUpOworICAgICAgbGFiZWxfNjc6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBCSVRfT1I6CisgICAgICAgICAgOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGpqX2xhMVsxNjNdID0gampfZ2VuOworICAgICAgICAgIGJyZWFrIGxhYmVsXzY3OworICAgICAgICB9CisgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX09SKTsKKyAgICAgICAgZXhjZXB0VHlwZSA9IFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRUeXBlcy5hZGQoZXhjZXB0VHlwZSk7CisgICAgICB9CisgICAgICBleGNlcHRJZCA9IFZhcmlhYmxlRGVjbGFyYXRvcklkKCk7CisgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgICBjYXRjaEJsb2NrID0gQmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hzID0gYWRkKGNhdGNocywgbmV3IENhdGNoQ2xhdXNlKGNMaW5lLCBjQ29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sIGV4Y2VwdE1vZGlmaWVyLm1vZGlmaWVycywgZXhjZXB0TW9kaWZpZXIuYW5ub3RhdGlvbnMsIGV4Y2VwdFR5cGVzLCBleGNlcHRJZCwgY2F0Y2hCbG9jaykpOyBleGNlcHRUeXBlcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgfQorICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgRklOQUxMWToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRklOQUxMWSk7CisgICAgICBmaW5hbGx5QmxvY2sgPSBCbG9jaygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNjRdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgVHJ5U3RtdChsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgcmVzb3VyY2VzLCB0cnlCbG9jaywgY2F0Y2hzLCBmaW5hbGx5QmxvY2spO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIExpc3QgUmVzb3VyY2VTcGVjaWZpY2F0aW9uKCkgeworTGlzdCB2YXJzOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICB2YXJzID0gUmVzb3VyY2VzKCk7CisgICAgaWYgKGpqXzJfNDIoMikpIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAge2lmICh0cnVlKSByZXR1cm4gdmFyczt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IFJlc291cmNlcygpIHsKKyAgICAgICAgTGlzdCB2YXJzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyOworICAgIC8qdGhpcyBpcyBhIGJpdCBtb3JlIGxlbmllbnQgdGhhbiB3ZSBuZWVkIHRvIGJlLCBlZyBhbGxvd2luZyBhY2Nlc3MgbW9kaWZpZXJzIGxpa2UgcHJpdmF0ZSovCisgICAgICB2YXIgPSBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLmFkZCh2YXIpOworICAgIGxhYmVsXzY4OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl80MygyKSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF82ODsKKyAgICAgIH0KKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKKyAgICAgIHZhciA9IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzLmFkZCh2YXIpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiB2YXJzO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKy8qIFdlIHVzZSBwcm9kdWN0aW9ucyB0byBtYXRjaCA+Pj4sID4+IGFuZCA+IHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlCisgKiB0eXBlIGRlY2xhcmF0aW9uIHN5bnRheCB3aXRoIGdlbmVyaWNzIGNsZWFuCisgKi8KKyAgZmluYWwgcHVibGljIHZvaWQgUlVOU0lHTkVEU0hJRlQoKSB7CisgICAgaWYgKGdldFRva2VuKDEpLmtpbmQgPT0gR1QgJiYKKyAgICAgICAgICAgICAgICAgICAgKChHVFRva2VuKWdldFRva2VuKDEpKS5yZWFsS2luZCA9PSBSVU5TSUdORURTSElGVCkgeworCisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICB9CisKKyAgZmluYWwgcHVibGljIHZvaWQgUlNJR05FRFNISUZUKCkgeworICAgIGlmIChnZXRUb2tlbigxKS5raW5kID09IEdUICYmCisgICAgICAgICAgICAgICAgICAgICgoR1RUb2tlbilnZXRUb2tlbigxKSkucmVhbEtpbmQgPT0gUlNJR05FRFNISUZUKSB7CisKKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihHVCk7CisgICAgampfY29uc3VtZV90b2tlbihHVCk7CisgIH0KKworLyogQW5ub3RhdGlvbiBzeW50YXggZm9sbG93cy4gKi8KKyAgZmluYWwgcHVibGljIEFubm90YXRpb25FeHByIEFubm90YXRpb24oKSB7CisgICAgICAgIEFubm90YXRpb25FeHByIHJldDsKKyAgICBpZiAoampfMl80NCgyMTQ3NDgzNjQ3KSkgeworICAgICAgcmV0ID0gTm9ybWFsQW5ub3RhdGlvbigpOworICAgIH0gZWxzZSBpZiAoampfMl80NSgyMTQ3NDgzNjQ3KSkgeworICAgICAgcmV0ID0gU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgIGNhc2UgQVQ6CisgICAgICAgIHJldCA9IE1hcmtlckFubm90YXRpb24oKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqal9sYTFbMTY1XSA9IGpqX2dlbjsKKyAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHIgTm9ybWFsQW5ub3RhdGlvbigpIHsKKyAgICAgICAgTmFtZUV4cHIgbmFtZTsKKyAgICAgICAgTGlzdCBwYWlycyA9IG51bGw7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQVQpOworICAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIG5hbWUgPSBOYW1lKCk7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIHBhaXJzID0gTWVtYmVyVmFsdWVQYWlycygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNjZdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBOb3JtYWxBbm5vdGF0aW9uRXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixuYW1lLCBwYWlycyk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIgTWFya2VyQW5ub3RhdGlvbigpIHsKKyAgICAgICAgTmFtZUV4cHIgbmFtZTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihBVCk7CisgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBuYW1lID0gTmFtZSgpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbixuYW1lKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgeworICAgICAgICBOYW1lRXhwciBuYW1lOworICAgICAgICBFeHByZXNzaW9uIG1lbWJlclZhbDsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjb2x1bW47CisgICAgampfY29uc3VtZV90b2tlbihBVCk7CisgICAgICAgbGluZT10b2tlbi5iZWdpbkxpbmU7IGNvbHVtbj10b2tlbi5iZWdpbkNvbHVtbjsKKyAgICBuYW1lID0gTmFtZSgpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKKyAgICBtZW1iZXJWYWwgPSBNZW1iZXJWYWx1ZSgpOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIobGluZSwgY29sdW1uLCB0b2tlbi5lbmRMaW5lLCB0b2tlbi5lbmRDb2x1bW4sbmFtZSwgbWVtYmVyVmFsKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBMaXN0IE1lbWJlclZhbHVlUGFpcnMoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhaXI7CisgICAgcGFpciA9IE1lbWJlclZhbHVlUGFpcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChwYWlyKTsKKyAgICBsYWJlbF82OToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgICBjYXNlIENPTU1BOgorICAgICAgICA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgampfbGExWzE2N10gPSBqal9nZW47CisgICAgICAgIGJyZWFrIGxhYmVsXzY5OworICAgICAgfQorICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBwYWlyID0gTWVtYmVyVmFsdWVQYWlyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQocGFpcik7CisgICAgfQorICAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTWVtYmVyVmFsdWVQYWlyIE1lbWJlclZhbHVlUGFpcigpIHsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIEV4cHJlc3Npb24gdmFsdWU7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7CisgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuLmltYWdlOyBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKKyAgICB2YWx1ZSA9IE1lbWJlclZhbHVlKCk7CisgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTWVtYmVyVmFsdWVQYWlyKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLG5hbWUsIHZhbHVlKTt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIE1lbWJlclZhbHVlKCkgeworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIEFUOgorICAgICAgcmV0ID0gQW5ub3RhdGlvbigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMQlJBQ0U6CisgICAgICByZXQgPSBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBORVc6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBTVVBFUjoKKyAgICBjYXNlIFRISVM6CisgICAgY2FzZSBUUlVFOgorICAgIGNhc2UgVk9JRDoKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIExQQVJFTjoKKyAgICBjYXNlIEJBTkc6CisgICAgY2FzZSBUSUxERToKKyAgICBjYXNlIElOQ1I6CisgICAgY2FzZSBERUNSOgorICAgIGNhc2UgUExVUzoKKyAgICBjYXNlIE1JTlVTOgorICAgICAgcmV0ID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgampfbGExWzE2OF0gPSBqal9nZW47CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB7aWYgKHRydWUpIHJldHVybiByZXQ7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBNZW1iZXJWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgRXhwcmVzc2lvbiBtZW1iZXI7CisgICAgICAgIGludCBsaW5lOworICAgICAgICBpbnQgY29sdW1uOworICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNFKTsKKyAgICAgICBsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uOworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgQk9PTEVBTjoKKyAgICBjYXNlIEJZVEU6CisgICAgY2FzZSBDSEFSOgorICAgIGNhc2UgRE9VQkxFOgorICAgIGNhc2UgRkFMU0U6CisgICAgY2FzZSBGTE9BVDoKKyAgICBjYXNlIElOVDoKKyAgICBjYXNlIExPTkc6CisgICAgY2FzZSBORVc6CisgICAgY2FzZSBOVUxMOgorICAgIGNhc2UgU0hPUlQ6CisgICAgY2FzZSBTVVBFUjoKKyAgICBjYXNlIFRISVM6CisgICAgY2FzZSBUUlVFOgorICAgIGNhc2UgVk9JRDoKKyAgICBjYXNlIExPTkdfTElURVJBTDoKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKKyAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6CisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICBjYXNlIExQQVJFTjoKKyAgICBjYXNlIExCUkFDRToKKyAgICBjYXNlIEFUOgorICAgIGNhc2UgQkFORzoKKyAgICBjYXNlIFRJTERFOgorICAgIGNhc2UgSU5DUjoKKyAgICBjYXNlIERFQ1I6CisgICAgY2FzZSBQTFVTOgorICAgIGNhc2UgTUlOVVM6CisgICAgICBtZW1iZXIgPSBNZW1iZXJWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChtZW1iZXIpOworICAgICAgbGFiZWxfNzA6CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoampfMl80NigyKSkgeworICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhayBsYWJlbF83MDsKKyAgICAgICAgfQorICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgICAgbWVtYmVyID0gTWVtYmVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQobWVtYmVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTY5XSA9IGpqX2dlbjsKKyAgICAgIDsKKyAgICB9CisgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7CisgICAgY2FzZSBDT01NQToKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNzBdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IEFycmF5SW5pdGlhbGl6ZXJFeHByKGxpbmUsIGNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uLHJldCk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworLyogQW5ub3RhdGlvbiBUeXBlcy4gKi8KKyAgZmluYWwgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbiBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKE1vZGlmaWVyIG1vZGlmaWVyKSB7CisgICAgICAgIE5hbWVFeHByIG5hbWU7CisgICAgICAgIExpc3QgbWVtYmVyczsKKyAgICAgICAgaW50IGxpbmUgPSBtb2RpZmllci5iZWdpbkxpbmU7CisgICAgICAgIGludCBjb2x1bW4gPSBtb2RpZmllci5iZWdpbkNvbHVtbjsKKyAgICBqal9jb25zdW1lX3Rva2VuKEFUKTsKKyAgICAgICAgaWYgKGxpbmUgPT0gLTEpIHtsaW5lPXRva2VuLmJlZ2luTGluZTsgY29sdW1uPXRva2VuLmJlZ2luQ29sdW1uO30KKyAgICBqal9jb25zdW1lX3Rva2VuKElOVEVSRkFDRSk7CisgICAgbmFtZSA9IE5hbWUoKTsKKyAgICBtZW1iZXJzID0gQW5ub3RhdGlvblR5cGVCb2R5KCk7CisgICAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb24gdG1wID0gbmV3IEFubm90YXRpb25EZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgbnVsbCwgbWVtYmVycyk7CisgICAgICB0bXAuc2V0TmFtZUV4cHIobmFtZSk7CisgICAgICB7aWYgKHRydWUpIHJldHVybiB0bXA7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTGlzdCBBbm5vdGF0aW9uVHlwZUJvZHkoKSB7CisgICAgICAgIExpc3QgcmV0ID0gbnVsbDsKKyAgICAgICAgQm9keURlY2xhcmF0aW9uIG1lbWJlcjsKKyAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7CisgICAgbGFiZWxfNzE6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgIGNhc2UgQllURToKKyAgICAgIGNhc2UgQ0hBUjoKKyAgICAgIGNhc2UgQ0xBU1M6CisgICAgICBjYXNlIERPVUJMRToKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgIGNhc2UgRklOQUw6CisgICAgICBjYXNlIEZMT0FUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICBjYXNlIElOVEVSRkFDRToKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgIGNhc2UgTkFUSVZFOgorICAgICAgY2FzZSBQUklWQVRFOgorICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgIGNhc2UgU0hPUlQ6CisgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgIGNhc2UgU1RSSUNURlA6CisgICAgICBjYXNlIFNZTkNIUk9OSVpFRDoKKyAgICAgIGNhc2UgVFJBTlNJRU5UOgorICAgICAgY2FzZSBWT0xBVElMRToKKyAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgY2FzZSBBVDoKKyAgICAgICAgOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGpqX2xhMVsxNzFdID0gampfZ2VuOworICAgICAgICBicmVhayBsYWJlbF83MTsKKyAgICAgIH0KKyAgICAgIG1lbWJlciA9IEFubm90YXRpb25Cb2R5RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYWRkKHJldCwgbWVtYmVyKTsKKyAgICB9CisgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0UpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBCb2R5RGVjbGFyYXRpb24gQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvbigpIHsKKyAgIE1vZGlmaWVyIG1vZGlmaWVyOworICAgQm9keURlY2xhcmF0aW9uIHJldDsKKworICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgeworICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOworICAgICAgICAgICAgICByZXQgPSBuZXcgRW1wdHlUeXBlRGVjbGFyYXRpb24odG9rZW4uYmVnaW5MaW5lLCB0b2tlbi5iZWdpbkNvbHVtbiwgdG9rZW4uZW5kTGluZSwgdG9rZW4uZW5kQ29sdW1uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgY2FzZSBCT09MRUFOOgorICAgIGNhc2UgQllURToKKyAgICBjYXNlIENIQVI6CisgICAgY2FzZSBDTEFTUzoKKyAgICBjYXNlIERPVUJMRToKKyAgICBjYXNlIEVOVU06CisgICAgY2FzZSBGSU5BTDoKKyAgICBjYXNlIEZMT0FUOgorICAgIGNhc2UgSU5UOgorICAgIGNhc2UgSU5URVJGQUNFOgorICAgIGNhc2UgTE9ORzoKKyAgICBjYXNlIE5BVElWRToKKyAgICBjYXNlIFBSSVZBVEU6CisgICAgY2FzZSBQUk9URUNURUQ6CisgICAgY2FzZSBQVUJMSUM6CisgICAgY2FzZSBTSE9SVDoKKyAgICBjYXNlIFNUQVRJQzoKKyAgICBjYXNlIFNUUklDVEZQOgorICAgIGNhc2UgU1lOQ0hST05JWkVEOgorICAgIGNhc2UgVFJBTlNJRU5UOgorICAgIGNhc2UgVk9MQVRJTEU6CisgICAgY2FzZSBJREVOVElGSUVSOgorICAgIGNhc2UgQVQ6CisgICAgICBtb2RpZmllciA9IE1vZGlmaWVycygpOworICAgICAgaWYgKGpqXzJfNDcoMjE0NzQ4MzY0NykpIHsKKyAgICAgICAgcmV0ID0gQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICAgICAgY2FzZSBDTEFTUzoKKyAgICAgICAgY2FzZSBJTlRFUkZBQ0U6CisgICAgICAgICAgcmV0ID0gQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKG1vZGlmaWVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTlVNOgorICAgICAgICAgIHJldCA9IEVudW1EZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgICAgcmV0ID0gQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQk9PTEVBTjoKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIENIQVI6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgcmV0ID0gRmllbGREZWNsYXJhdGlvbihtb2RpZmllcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgampfbGExWzE3Ml0gPSBqal9nZW47CisgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqal9sYTFbMTczXSA9IGpqX2dlbjsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbihNb2RpZmllciBtb2RpZmllcikgeworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBFeHByZXNzaW9uIGRlZmF1bHRWYWwgPSBudWxsOworICAgIHR5cGUgPSBUeXBlKCk7CisgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW4uaW1hZ2U7CisgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKKyAgICBjYXNlIF9ERUZBVUxUOgorICAgICAgZGVmYXVsdFZhbCA9IERlZmF1bHRWYWx1ZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGpqX2xhMVsxNzRdID0gampfZ2VuOworICAgICAgOworICAgIH0KKyAgICBqal9jb25zdW1lX3Rva2VuKFNFTUlDT0xPTik7CisgICAgaW50IGxpbmUgPSBtb2RpZmllci5iZWdpbkxpbmU7CisgICAgaW50IGNvbHVtbiA9IG1vZGlmaWVyLmJlZ2luQ29sdW1uOworICAgIHsgaWYgKGxpbmUgPT0gLTEpIHtsaW5lPXR5cGUuZ2V0QmVnaW5MaW5lKCk7IGNvbHVtbj10eXBlLmdldEJlZ2luQ29sdW1uKCk7fSB9CisgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbihsaW5lLCBjb2x1bW4sIHRva2VuLmVuZExpbmUsIHRva2VuLmVuZENvbHVtbiwgbW9kaWZpZXIubW9kaWZpZXJzLCBtb2RpZmllci5hbm5vdGF0aW9ucywgdHlwZSwgbmFtZSwgZGVmYXVsdFZhbCk7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBEZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0OworICAgIGpqX2NvbnN1bWVfdG9rZW4oX0RFRkFVTFQpOworICAgIHJldCA9IE1lbWJlclZhbHVlKCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0O30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMiwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl81KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl84KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfOCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDcsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM185KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoOCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDksIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzExKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxMCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDExLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8xMyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTIsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzE0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxMywgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xNSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE0LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8xNihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTUsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzE3KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxNiwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xOCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE3LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8xOShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE5KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTgsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzIwKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjAoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxOSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjEoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yMSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIwLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yMihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzIyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjEsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzIzKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyMiwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjQoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yNCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIzLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yNShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI1KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjQsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzI2KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyNSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjcoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yNygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI2LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8yOChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI4KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjcsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzI5KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyOCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI5LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zMShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMxKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzAsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzMyKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzMSwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zMygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDMyLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zNChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM0KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzMsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzM1KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzUoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzNCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zNigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM1LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl8zNyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM3KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzYsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzM4KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzgoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzNywgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zOSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM4LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl80MChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzksIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzQxKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0MCwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180MigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQxLCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl80MyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDIsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0MywgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180NSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQ0LCB4bGEpOyB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfMl80NihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQ2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDUsIHhsYSk7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ3KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0NiwgeGxhKTsgfQorICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3MigpIHsKKyAgICBpZiAoampfM1JfMTY4KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMDcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk0KCkgeworICAgIGlmIChqal8zUl8xMzMoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMjUoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIyKCkgeworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NSgpIHsKKyAgICBpZiAoampfM1JfOTQoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzIwMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI0KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl80MzcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MzgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yNCgpIHsKKyAgICBpZiAoampfM1JfMTA3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzg4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIzKCkgeworICAgIGlmIChqal8zUl80MzYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUUlkpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNDIzKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MjQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQyNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NCgpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDIoKSB7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzIoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM4OCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzE1NCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMjQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE1NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERFQ1IpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yMygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTA1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMDYoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5DUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzUoKSB7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfODgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDg4KSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oOTEpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbig4NykpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzg2KCkgeworICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjIoKSB7CisgICAgaWYgKGpqXzNSXzEwNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM180KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl84NigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE2KCkgeworICAgIGlmIChqal8zUl8yNDUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NygpIHsKKyAgICBpZiAoampfM1JfMjk0KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzIzKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NygpIHsKKyAgICBpZiAoampfM1JfMzAzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNjAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1lOQ0hST05JWkVEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTI4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oX0RFRkFVTFQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzYoKSB7CisgICAgaWYgKGpqXzNSXzMwMigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM1KCkgeworICAgIGlmIChqal8zUl8xMDQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzNigpIHsKKyAgICBpZiAoampfM1JfMjY3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjYoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQkFORykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzUoKSB7CisgICAgaWYgKGpqXzNSXzMwMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRJTERFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NCgpIHsKKyAgICBpZiAoampfM1JfMzAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzQoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI2NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjY2KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfM1JfMTc0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzMoKSB7CisgICAgaWYgKGpqXzNSXzI5OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcyKCkgeworICAgIGlmIChqal8zUl8yOTgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1OSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUSFJPVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjM0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMzUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIzNigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNTgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkVUVVJOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQyMigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NjEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDAoKSB7CisgICAgaWYgKGpqXzNSXzExNigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjcxKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjcyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNzMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI3NCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjc1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNzYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI3NygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oREVDUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1NygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT05USU5VRSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MjEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM182KCkgeworICAgIGlmIChqal8zUl84OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDE3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVMU0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzA2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5DUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzNSgpIHsKKyAgICBpZiAoampfM1JfNDUyKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTEoKSB7CisgICAgaWYgKGpqXzNSXzIwMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA2KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI0MCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjQxKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCUkVBSykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MjAoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTcxKCkgeworICAgIGlmIChqal8zUl8yMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1MigpIHsKKyAgICBpZiAoampfM1JfNDU5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzkoKSB7CisgICAgaWYgKGpqXzNSXzEyMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQ0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE1JTlVTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExMygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTcxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwNSgpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUExVUykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTAoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI0MygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjQ0KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfM1JfMTc0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDkoKSB7CisgICAgaWYgKGpqXzNSXzI0MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM180MSgpIHsKKyAgICBpZiAoampfM1JfMTE2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84NygpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwOCgpIHsKKyAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQklUX0FORCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zMDUoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfM1JfMTk4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NTkoKSB7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDYxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihFWFRFTkRTKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzI3OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal8zUl8xOTgoKSkgcmV0dXJuIHRydWU7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjgwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1OCgpIHsKKyAgICBpZiAoampfM1JfNDU5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MzQoKSB7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDU3KCkgeworICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjA4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMDkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIxMCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjExKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MzAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkVNKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNMQVNIKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4MigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIxNigpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MjgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RBUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NTEoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQ1NygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDU4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDEyKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MjgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQyOSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDMwKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzE3NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE3KCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwOCgpIHsKKyAgICBpZiAoampfM1JfMTEzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzQwKCkgeworICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzc2KCkgeworICAgIGlmIChqal8zUl8xNzQoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzQxMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjE3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzE4MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgxKCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzMygpIHsKKyAgICBpZiAoampfM1JfNDUxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDEzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBMVVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzE4MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal8zUl8xODIoKSkgcmV0dXJuIHRydWU7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTgzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oR1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDE5KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MzMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MzQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MzUoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAyKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MTMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQxNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGpqXzNSXzM3NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDE4KCkgeworICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNzIoKSB7CisgICAgaWYgKGpqXzNSXzM3NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDAyKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihGT1IpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNDE4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80MTkoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8zMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwNygpIHsKKyAgICBpZiAoampfM1JfMTg3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzIxKCkgeworICAgIGlmIChqal8zUl8xMDMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjAoKSB7CisgICAgaWYgKGpqXzNSXzEwMigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI0KCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwMSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMU0hJRlQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18xOSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTAxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzIwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzIxKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzM3MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODUoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzEyNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MDgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzk4KCkgeworICAgIGlmIChqal8zUl8yMDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlNUQU5DRU9GKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNTQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE8pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzA2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFdISUxFKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcwKCkgeworICAgIGlmIChqal8zUl8zNzIoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMTkoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zOTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzk1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEdFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5NCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOTMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oR1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3NygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzkyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zOTMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzM5NCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzk1KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIGlmIChqal8zUl8zNzAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihXSElMRSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMwNigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgyKCkgeworICAgIGlmIChqal8zUl84NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18zKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2OCgpIHsKKyAgICBpZiAoampfM1JfMzcwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNzcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgxKCkgeworICAgIGlmIChqal8zUl8zOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2OSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfQU5EKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzM0NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVOVU0pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDg4KSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODMoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzY0KCkgeworICAgIGlmIChqal8zUl8zNjgoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM3MygpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNTIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUYpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTAwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8zMDYoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQxNygpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MDUoKSB7CisgICAgaWYgKGpqXzNSXzEyMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzc1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE5FKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3NCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihFUSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNzEoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM3NCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzc1KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoampfM1JfMzY0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNjUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oWE9SKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMxNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQ2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEJJVF9PUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yOTMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwNigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xOTgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0NSgpIHsKKyAgICBpZiAoampfM1JfMzY0KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNzEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDUwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKF9ERUZBVUxUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ0OSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDQVNFKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzk3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElNUExFTUVOVFMpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDA1KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzE5OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl80MDYoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDAzKCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTQ19BTkQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjY0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTUoKSB7CisgICAgaWYgKGpqXzNSXzM0NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMzY5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzMigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNDQ5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80NTAoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE4NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNDX09SKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzIzMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDA0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE5OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzk2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFMpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDAzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzE5OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl80MDQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkzKCkgeworICAgIGlmIChqal8zUl8zMTUoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM2NSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTYoKSB7CisgICAgaWYgKGpqXzNSXzQzMigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNXSVRDSCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzQxNigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5URVJGQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2NCgpIHsKKyAgICBpZiAoampfM1JfMjkzKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNDYoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgwKCkgeworICAgIGlmIChqal8zUl8zOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3OSgpIHsKKyAgICBpZiAoampfM1JfMzk2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNzgoKSB7CisgICAgaWYgKGpqXzNSXzEyNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDU2KCkgeworICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMygpIHsKKyAgICBpZiAoampfM1JfMjY0KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zMTYoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk4KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDIwKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMxOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNzgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNzkoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zODAoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTEzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NDgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVJST1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjk2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NDcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9VQkxFQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNDU2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfc2Nhbl90b2tlbig3OCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDQzKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NDYoKSB7CisgICAgaWYgKGpqXzNSXzk5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ0NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihERUNSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMCgpIHsKKyAgICBpZiAoampfM1JfMjMzKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8yOTUoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDQ0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElOQ1IpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDMxKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80NDQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQ0NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDQ2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80NDcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQ0OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2NygpIHsKKyAgICBpZiAoampfM1JfMjk0KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80MzEoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzY2KCkgeworICAgIGlmIChqal8zUl8yNDIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihIT09LKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNTEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MSgpIHsKKyAgICBpZiAoampfM1JfMjAwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNjgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zOSgpIHsKKyAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNTAoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzM2NigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzY3KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1MCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihPUkFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oWE9SQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBTkRBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFJVTlNJR05FRFNISUZUQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSU0lHTkVEU0hJRlRBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExTSElGVEFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVNBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBMVVNBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFJFTUFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0xBU0hBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNUQVJBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTgoKSB7CisgICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfOTkoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzEzOSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTQwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNDEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE0MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTQzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNDQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE0NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTQ2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNDcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE0OCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTQ5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNTAoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODQoKSB7CisgICAgaWYgKGpqXzNSXzEyMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSUNURlApKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk3KCkgeworICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNygpIHsKKyAgICBpZiAoampfM1JfMTAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl84MigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihWT0xBVElMRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl84MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUUkFOU0lFTlQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE0KCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE5BVElWRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl83OSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTWU5DSFJPTklaRUQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVUJMRUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI5NygpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oNzgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbig0MykpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk2KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zMTcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMxOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFCU1RSQUNUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxNSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEZJTkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBSSVZBVEUpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNzUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUFJPVEVDVEVEKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNUQVRJQykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNDkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzQoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzExNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNzMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUFVCTElDKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNzMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzc0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl83NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNzYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzc3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl83OCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNzkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzgwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl84MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfODIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzgzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl84NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTYoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzE4KCkgeworICAgIGlmIChqal8zUl85OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVJST1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjk2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MTEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzkoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI2OSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjcwKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzgoKSB7CisgICAgaWYgKGpqXzNSXzExNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE3KCkgeworICAgIGlmIChqal8zUl8xMTYoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNzIoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzE3MygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDAoKSB7CisgICAgaWYgKGpqXzNSXzE1MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjM5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzcoKSB7CisgICAgaWYgKGpqXzNSXzExNigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfc2Nhbl90b2tlbigyMCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDQwKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODMoKSB7CisgICAgaWYgKGpqXzNSXzMwNigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgyKCkgeworICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4MSgpIHsKKyAgICBpZiAoampfM1JfMTE2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yOTgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjgxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yODIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI4MygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjIoKSB7CisgICAgaWYgKGpqXzNSXzEyMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNzIoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzEyMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKFBBQ0tBR0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzEoKSB7CisgICAgaWYgKGpqXzNSXzcyKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MDEoKSB7CisgICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDExKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyOCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTg0KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMwNigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQ4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0VSVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQxNSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzE3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xNygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzkoKSB7CisgICAgaWYgKGpqXzNSXzM2MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzM4KCkgeworICAgIGlmIChqal8zUl8zNjAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMzNygpIHsKKyAgICBpZiAoampfM1JfMzU5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzAoKSB7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzYoKSB7CisgICAgaWYgKGpqXzNSXzM1OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFZPSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzM1KCkgeworICAgIGlmIChqal8zUl8zNTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMzNCgpIHsKKyAgICBpZiAoampfM1JfMzU2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzMoKSB7CisgICAgaWYgKGpqXzNSXzM1NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMyKCkgeworICAgIGlmIChqal8zUl8zNTQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMzMSgpIHsKKyAgICBpZiAoampfM1JfMzUzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTEoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE2OSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTcwKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMwKCkgeworICAgIGlmIChqal8zUl8zNTIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyOSgpIHsKKyAgICBpZiAoampfM1JfMzUxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjgoKSB7CisgICAgaWYgKGpqXzNSXzM1MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI3KCkgeworICAgIGlmIChqal8zUl8zNDkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyNigpIHsKKyAgICBpZiAoampfM1JfMTI4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9VQkxFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyNSgpIHsKKyAgICBpZiAoampfM1JfMzQ4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRkxPQVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTYxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExPTkcpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zNigpIHsKKyAgICBpZiAoampfM1JfMTE1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5UKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM2MygpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0hPUlQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzYyKCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCWVRFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDSEFSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCT09MRUFOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwNigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18zNigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzI1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMjYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMyNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzI4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMjkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMzMCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzMxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMzIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMzMygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzM0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMzUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMzNigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMzM3KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8zMzgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMzOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQ0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNVUEVSKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM2MygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal8zUl85NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA3KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xNTYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE1NygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTU4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNTkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE2MCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTYxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNjIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE2MygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0MigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihFWFRFTkRTKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM2MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal8zUl85NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE0KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNDMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzM0NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgaWYgKGpqXzNSXzM0MigpKSByZXR1cm4gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNDIoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfM1JfMTg1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzMzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0tFVCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzMyKCkgeworICAgIGlmIChqal8zUl8xMTMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzUoKSB7CisgICAgVG9rZW4geHNwOworICAgIGlmIChqal8zXzMzKCkpIHJldHVybiB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMzMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzM0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyOSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xOTkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMSgpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODkoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzMxMSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMxMigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMygpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSE9PSykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zMTQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjkyKCkgeworICAgIGlmIChqal8zUl8xODcoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMyKCkgeworICAgIGlmIChqal8zUl8yNjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMSgpIHsKKyAgICBpZiAoampfM1JfOTQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ2MCgpIHsKKyAgICBpZiAoampfM1JfNDYyKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzAoKSB7CisgICAgaWYgKGpqXzNSXzEyMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk5KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8yMzAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMzEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIzMigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5MSgpIHsKKyAgICBpZiAoampfM1JfMjg5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NigpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85OCgpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTAoKSB7CisgICAgaWYgKGpqXzNSXzk3KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zMTMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKDEzMikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjIoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI5MCgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xOTgoKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjkxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yOTIoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NSgpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzEzKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl85NigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE5OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjI5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oR1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfOTcoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzEzNygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTM4KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18xNigpIHsKKyAgICBpZiAoampfM1JfOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzk4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTYoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYxKCkgeworICAgIGlmIChqal8zUl8xMDcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI4OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18xMigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfOTUoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUSFJPV1MpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNDAxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzE0KCkgeworICAgIGlmIChqal8zUl85NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYwKCkgeworICAgIGlmIChqal8zUl8xMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzE1KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihORVcpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjYwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjYxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNjIoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NjIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oX0RFRkFVTFQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTIxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzYoKSB7CisgICAgaWYgKGpqXzNSXzE5OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzUoKSB7CisgICAgaWYgKGpqXzNSXzEwNygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgaWYgKGpqXzNfMTIoKSkgcmV0dXJuIHRydWU7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xMigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85NCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTM1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMzYoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDcoKSB7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMjg0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1NSgpIHsKKyAgICBpZiAoampfM1JfODcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl80NjAoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE5KCkgeworICAgIGlmIChqal8zUl8yNDcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDcoKSB7CisgICAgaWYgKGpqXzNSXzg3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDQzKCkgeworICAgIGlmIChqal8zUl8zMDIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ0MigpIHsKKyAgICBpZiAoampfM1JfMzAwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIxOSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjYoKSB7CisgICAgaWYgKGpqXzNSXzEwNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDQxKCkgeworICAgIGlmIChqal8zUl8yOTkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTEoKSB7CisgICAgaWYgKGpqXzNSXzk0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NDAoKSB7CisgICAgaWYgKGpqXzNSXzI5OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfODcoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEyNigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzOSgpIHsKKyAgICBpZiAoampfM1JfNDU1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODYoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTlVMTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRkFMU0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRSVUUpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM180NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMjEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyNigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI3KCkgeworICAgIGlmIChqal8zUl8xMTYoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQzOSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDQwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80NDEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzQ0MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNDQzKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNUQVRJQykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl84OSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTI3KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg1KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zMDcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzMwOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwOSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfNDI2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl80MjcoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTQoKSB7CisgICAgaWYgKGpqXzNSXzI4NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE4KCkgeworICAgIGlmIChqal8zUl8yNDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MygpIHsKKyAgICBpZiAoampfM1JfMjg1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODQoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzIxOCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOTkoKSB7CisgICAgaWYgKGpqXzNSXzQwOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM185KCkgeworICAgIGlmIChqal8zUl85MigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjUyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNUUklOR19MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDSEFSQUNURVJfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zODQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM5OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl85MygpIHsKKyAgICBpZiAoampfM1JfOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4OSgpIHsKKyAgICBpZiAoampfM1JfOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTAoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzkzKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVEhJUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODgoKSB7CisgICAgaWYgKGpqXzNSXzkyKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTE9OR19MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTg4KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTg5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1VQRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTg3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODYoKSB7CisgICAgaWYgKGpqXzNSXzk3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5URUdFUl9MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTg2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVEhJUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xODcoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwMCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElOVEVSRkFDRSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzM4NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEyKCkgeworICAgIGlmIChqal8zUl85NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIwKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNDgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI0OSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjUwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNTEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzI1MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjUzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNTQoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkxKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMzEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEzMigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMDAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zMSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTEyKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNDcoKSB7CisgICAgaWYgKGpqXzNSXzEyMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM180NigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzgoKSB7CisgICAgaWYgKGpqXzNSXzE4NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM3KCkgeworICAgIGlmIChqal8zUl85NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjc4KCkgeworICAgIGlmIChqal8zUl8zMDQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfOCgpIHsKKyAgICBpZiAoampfM1JfOTEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwNCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjM3KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIyNygpKSByZXR1cm4gdHJ1ZTsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMzgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zNDcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDg4KSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM183KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzkwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDMoKSB7CisgICAgaWYgKGpqXzNSXzIyNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVMTElQU0lTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwMigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUSElTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NygpIHsKKyAgICBpZiAoampfM1JfMTUxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODcoKSB7CisgICAgaWYgKGpqXzNSXzMwOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTc2KCkgeworICAgIGlmIChqal8zUl8yMTIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NSgpIHsKKyAgICBpZiAoampfM1JfMTIzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zODcoKSB7CisgICAgaWYgKGpqXzNSXzkxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNDAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTEwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIwMigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjAzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMDQoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIwKCkgeworICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwMSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMzIwKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzIyNygpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzg1KCkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM4NigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM4NygpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xODQoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyMSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTc1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNzYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE3NygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDkoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE2NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTY2KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDEwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzExMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTIxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1VQRVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18zMCgpIHsKKyAgICBpZiAoampfM1JfMTA5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjYoKSB7CisgICAgaWYgKGpqXzNSXzEyNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzA0KCkgeworICAgIGlmIChqal8zUl8zMjMoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzMyNCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDgoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzAoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE2NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyOCgpIHsKKyAgICBpZiAoampfM1JfMTg3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTAoKSB7CisgICAgaWYgKGpqXzNSXzExNigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfODcoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzE2NygpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNjgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5NygpIHsKKyAgICBpZiAoampfM1JfMjI3KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yMjgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yOSgpIHsKKyAgICBpZiAoampfM1JfMTExKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVUJMRUNPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEyMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzg5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM18yOCgpIHsKKyAgICBpZiAoampfM1JfMTExKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKENMQVNTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM0MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xNjgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyMCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwNSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJCUkFDS0VUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4OCgpIHsKKyAgICBpZiAoampfM1JfMzEwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTY4KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8zNDEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk2KCkgeworICAgIGlmIChqal8zUl8xMTEoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9VQkxFQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjI2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfc2Nhbl90b2tlbig3OCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKDQzKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjIoKSB7CisgICAgaWYgKGpqXzNSXzkwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk1KCkgeworICAgIGlmIChqal8zUl8xMTEoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0xBU1MpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk0KCkgeworICAgIGlmIChqal8zUl8yMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjcoKSB7CisgICAgaWYgKGpqXzNSXzExMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM180NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwOSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMTAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM0MCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzQzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMjAoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oODIpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxMygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI3OCgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MDAoKSB7CisgICAgaWYgKGpqXzNSXzExMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDEwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4MCgpIHsKKyAgICBpZiAoampfM1JfMjE1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTkoKSB7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjg4KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1OCgpIHsKKyAgICBpZiAoampfM1JfMTEwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yODcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTc5KCkgeworICAgIGlmIChqal8zUl8yMTQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjU4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yNTkoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zODUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzQwMCgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzgoKSB7CisgICAgaWYgKGpqXzNSXzIxMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU3KCkgeworICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjI0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyMigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1VCTEVDT0xPTikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8yNTcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDc4KSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oNDMpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyMygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTc4KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xNzkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE4MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjMoKSB7CisgICAgaWYgKGpqXzNSXzE4NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUyKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOTEoKSB7CisgICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRIUk9XUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl80MDEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyMSgpIHsKKyAgICBpZiAoampfM1JfMTI1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDMoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzMyMSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xMTEoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzg1KCkpIHJldHVybiB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNSXzM4OSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM5MCgpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzM5MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbig4NykpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUzKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDIoKSB7CisgICAgampfbG9va2luZ0FoZWFkID0gdHJ1ZTsKKyAgICBqal9zZW1MQSA9IGdldFRva2VuKDEpLmtpbmQgPT0gR1QgJiYKKyAgICAgICAgICAgICAgICAoKEdUVG9rZW4pZ2V0VG9rZW4oMSkpLnJlYWxLaW5kID09IFJTSUdORURTSElGVDsKKyAgICBqal9sb29raW5nQWhlYWQgPSBmYWxzZTsKKyAgICBpZiAoIWpqX3NlbUxBIHx8IGpqXzNSXzE1MigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihHVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NigpIHsKKyAgICBpZiAoampfM1JfMTg3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzI1NSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMjcoKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMjU2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NSgpIHsKKyAgICBpZiAoampfM1JfOTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjYoKSB7CisgICAgaWYgKGpqXzNSXzEwOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNVUEVSKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNSXzIyMSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMjIyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8yMjMoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAzKCkgeworICAgIGpqX2xvb2tpbmdBaGVhZCA9IHRydWU7CisgICAgampfc2VtTEEgPSBnZXRUb2tlbigxKS5raW5kID09IEdUICYmCisgICAgICAgICAgICAgICAgKChHVFRva2VuKWdldFRva2VuKDEpKS5yZWFsS2luZCA9PSBSVU5TSUdORURTSElGVDsKKyAgICBqal9sb29raW5nQWhlYWQgPSBmYWxzZTsKKyAgICBpZiAoIWpqX3NlbUxBIHx8IGpqXzNSXzE1MygpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihHVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oR1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRISVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8zMjIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal9zY2FuX3Rva2VuKDg4KSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkwKCkgeworICAgIGlmIChqal8zUl8yMjAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzNCgpIHsKKyAgICBpZiAoampfM1JfMTA5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzAoKSB7CisgICAgaWYgKGpqXzNSXzEwMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI5KCkgeworICAgIGlmIChqal8zUl8xODUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwNygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfOTAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1MygpIHsKKyAgICBpZiAoampfM1JfMTE3KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzQzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM1JfMTkwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xOTEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE5MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTkzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xOTQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzE5NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfMTk2KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl8xOTcoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzI1KCkgeworICAgIGlmIChqal8zUl8xMDgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkwKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zUl8xMjkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzEzMCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1NCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCSVRfT1IpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfODcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzOCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihGSU5BTExZKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzEyOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfNDI1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEZJTkFMTFkpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTI4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zXzQyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUlDT0xPTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MzYoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzQ1MygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180MigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MzcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0FUQ0gpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTE2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl84NygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfNDU0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgaWYgKGpqXzNSXzE2OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTI4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zUl8yMDUoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gampfM1JfOTIoKSB7CisgICAgaWYgKGpqXzNSXzEzMygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM1JfMTM0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqIEdlbmVyYXRlZCBUb2tlbiBNYW5hZ2VyLiAqLworICBwdWJsaWMgQVNUUGFyc2VyVG9rZW5NYW5hZ2VyIHRva2VuX3NvdXJjZTsKKyAgSmF2YUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOworICAvKiogQ3VycmVudCB0b2tlbi4gKi8KKyAgcHVibGljIFRva2VuIHRva2VuOworICAvKiogTmV4dCB0b2tlbi4gKi8KKyAgcHVibGljIFRva2VuIGpqX250OworICBwcml2YXRlIGludCBqal9udGs7CisgIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKKyAgcHJpdmF0ZSBpbnQgampfbGE7CisgIC8qKiBXaGV0aGVyIHdlIGFyZSBsb29raW5nIGFoZWFkLiAqLworICBwcml2YXRlIGJvb2xlYW4gampfbG9va2luZ0FoZWFkID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBqal9zZW1MQTsKKyAgcHJpdmF0ZSBpbnQgampfZ2VuOworICBmaW5hbCBwcml2YXRlIGludFtdIGpqX2xhMSA9IG5ldyBpbnRbMTc1XTsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzA7CisgIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8xOworICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMjsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzM7CisgIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV80OworICBzdGF0aWMgeworICAgICAgampfbGExX2luaXRfMCgpOworICAgICAgampfbGExX2luaXRfMSgpOworICAgICAgampfbGExX2luaXRfMigpOworICAgICAgampfbGExX2luaXRfMygpOworICAgICAgampfbGExX2luaXRfNCgpOworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfaW5pdF8wKCkgeworICAgICAgampfbGExXzAgPSBuZXcgaW50W10gezB4MCwweDQ4MTAxMDAwLDB4MSwweDAsMHgwLDB4MCwweDQwMDAxMDAwLDB4ODEwMDAwMCwweDQ4MTAxMDAwLDB4MTAwMDAwLDB4MCwweDEwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0YTk5NTAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxMDAwMDAwMCwweDAsMHgwLDB4MCwweDRhOTk1MDAwLDB4ODAwMDAwLDB4ODEwMDAwMCwweDIwOTQwMDAsMHg0YTk5NTAwMCwweDAsMHgwLDB4MCwweDIyMDk0MDAwLDB4MjIwOTQwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MjA5NTAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgyMjA5NDAwMCwweDYzNTlmMDAwLDB4MCwweDIwOTQwMDAsMHgwLDB4MCwweDIwOTQwMDAsMHgwLDB4MCwweDAsMHgwLDB4MjA5NDAwMCwweDAsMHgwLDB4MTAwMDAwMDAsMHgxMDAwMDAwMCwweDIwOTQwMDAsMHgyMDk0MDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgyMjA5NDAwMCwweDAsMHgwLDB4MjIwOTQwMDAsMHgwLDB4MCwweDIwOTQwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MjIwOTQwMDAsMHg2MjA5NTAwMCwweDAsMHgwLDB4MCwweDIwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MjAwMDAwMDAsMHgyMDAwMDAwMCwweDIyMDk0MDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgyMDk0MDAwLDB4MCwweDAsMHgwLDB4MCwweDIzNDllMDAwLDB4MCwweDIzNDllMDAwLDB4MCwweDIyMDk0MDAwLDB4MCwweDAsMHgwLDB4MCwweDIyMDk0MDAwLDB4ODIwMDAwLDB4ODIwMDAwLDB4NDAwMDAwMCwweDYyMDk1MDAwLDB4MjIwOTQwMDAsMHgyMjA5NDAwMCwweDYyMDk1MDAwLDB4MjIwOTQwMDAsMHgwLDB4MCwweDAsMHgyMjA5NDAwMCwweDAsMHg0MDAwMCwweDAsMHg4MDAwMDAwMCwweDAsMHgwLDB4MCwweDIyMDk0MDAwLDB4MjIwOTQwMDAsMHgwLDB4NGExOTUwMDAsMHhhMTk0MDAwLDB4NGExOTUwMDAsMHg4MDAwMDAsfTsKKyAgIH0KKyAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExX2luaXRfMSgpIHsKKyAgICAgIGpqX2xhMV8xID0gbmV3IGludFtdIHsweDIwLDB4ODg5OWM1MDAsMHgwLDB4MCwweDgwMDAwLDB4MCwweDg4OTljNDAwLDB4MTAwLDB4ODg5OWM1MDAsMHgxMDAsMHgwLDB4MCwweDEwLDB4MCwweDAsMHgwLDB4MCwweDEwLDB4MCwweDAsMHhjODlkYzc4MSwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4Yzg5ZGM3ODEsMHgwLDB4MTAwLDB4NDAwNDAyODEsMHhjODlkYzc4MSwweDAsMHgwLDB4MCwweDUxMjQxYTgxLDB4NTEyNDFhODEsMHgwLDB4MCwweDAsMHg0MDAwMDAwLDB4MCwweDAsMHg4ODlkYzY4MSwweDAsMHgwLDB4MCwweDAsMHg0MDAwMDAwLDB4MCwweDAsMHg1MTI0MWE4MSwweGZiZmZkZjhiLDB4ODAwMDAsMHg0MDI4MSwweDAsMHgwLDB4NDAyODEsMHgwLDB4MCwweDAsMHgwLDB4NDAyODEsMHgwLDB4MCwweDIwMDAwMCwweDIwMDAwMCwweDQwMjgxLDB4NDAwNDAyODEsMHgwLDB4MCwweDAsMHgwLDB4MCwweDgwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDUxMjQxYTgxLDB4MCwweDAsMHg1MTI0MWE4MSwweDAsMHgwLDB4NDAyODEsMHgwLDB4MCwweDAsMHg4MDAsMHgwLDB4MCwweDAsMHg1MTI0MWE4MSwweGQ5YmRkZTgxLDB4MCwweDgwMCwweDAsMHgxMTIwMTgwMCwweDAsMHgwLDB4MCwweDAsMHgxMDAwODAwLDB4MCwweDEwMDAxMDAwLDB4MTAwMDAwMDAsMHg1MTI0MWE4MSwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDAyODEsMHgwLDB4MCwweDAsMHgwLDB4NzNlNjFhOGIsMHgwLDB4NzNlNjFhOGIsMHgwLDB4NTEyNDFhODEsMHgwLDB4ODAwLDB4MCwweDAsMHg1MTI0MWE4MSwweDAsMHgwLDB4MCwweGQ5YmRkZTgxLDB4NTEyNDFhODEsMHg1MTI0MWE4MSwweGQ5YmRkZTgxLDB4NTEyNDFhODEsMHgwLDB4MCwweDAsMHg1MTI0MWE4MSwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg1MTI0MWE4MSwweDUxMjQxYTgxLDB4MCwweDg4OWRjNzgxLDB4NDAzODEsMHg4ODlkYzc4MSwweDAsfTsKKyAgIH0KKyAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExX2luaXRfMigpIHsKKyAgICAgIGpqX2xhMV8yID0gbmV3IGludFtdIHsweDAsMHg0ODAwMDAwLDB4MCwweDQwMDAwMDAsMHgwLDB4MjAwMDAwMCwweDQwMDAwMDAsMHg0MDAwMDAwLDB4NDgwMDAwMCwweDAsMHgxMDAwMDAwMCwweDAsMHgwLDB4NDAwMDAwMCwweDEwMDAwMDAsMHg0MDAwMDAwLDB4MTAwMDAwMCwweDAsMHg0MDA0MDAwLDB4MTAwMDAwMCwweDE0ODg0MDAwLDB4ODAwMDAwLDB4NDAwMDAwMCwweDIwMDAwLDB4ODAwMDAsMHg0MDAwMDAwLDB4MTAwMDAwMCwweDQwMDAwMDAsMHgwLDB4NDAwMDAwMCwweDAsMHg0MDAwMDAwLDB4MTQ4ODQwMDAsMHgwLDB4NDAwMDAwMCwweDEwMDA0MDAwLDB4MTQ4MDQwMDAsMHgxMDAwMDAwLDB4ODAwMDAwMCwweDIwMDAwMCwweDYwMGE3MDg2LDB4NjAwYTcwODYsMHgxMDAwMDAwLDB4MTAwMDAwMDAsMHgyMDAwMDAsMHgwLDB4ODgwMDAwLDB4MTAwMDAwMCwweDQwMDQwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCwweDAsMHgxMDAwMDAwMCwweDAsMHgxMDAwMDAwMCwweDEwMDAwMDAwLDB4MTAwMjcwODYsMHg0OGE3MDg3LDB4MCwweDAsMHg0MDAwMDAwLDB4NDAwMDAwMCwweDQwMDAsMHg0MDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAwLDB4NDAwMDAwMCwweDgwMDA0MDAwLDB4NDAwMDAwMCwweDQwMDAwMDAsMHgwLDB4MCwweDAsMHg0MDAwLDB4NDAwMDAwMCwweDEwMDAwMDAsMHg0MDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAwLDB4NDAwMCwweDAsMHg4MDAwMDAwLDB4ODAwMDAwMCwweDgwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxMDAwMDAwMCwweDEwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NjAwMjcwODYsMHg2MDAwMDAwMCwweDYwMDAwMDAwLDB4MjcwODYsMHgwLDB4NDAwMDAwMCwweDQwMDAsMHgxMDAwMDAwMCwweDIwMDAwLDB4MTAwMDAwMDAsMHg0MDAwLDB4MjAyMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4NjAwMjcwODYsMHg2NDAyNzA4NiwweDEwMDAwMDAwLDB4NDAwMCwweDIwMDAwLDB4MjMwODYsMHg0MDAwLDB4MjAwMDAwMCwweDEwMDAwMDAwLDB4MjAwMDAsMHgwLDB4MjIwMDAwMCwweDMwODYsMHgwLDB4NjAwMjcwODYsMHgxMDAwMDAwLDB4NDAwMDAwMCwweDQwMDAwMDAsMHgxMDAwMDAwMCwweDQyMjAwMDAsMHgxMDAwNDAwMCwweDQwMDAwMDAsMHg0MDAwMDAwLDB4MjAwMDAwLDB4MjAwMDAwLDB4OGE3MDg3LDB4MCwweDhhNzA4NywweDEwMDAwMDAsMHg2MDBhNzA4NiwweDEwMDAwMDAwLDB4NDAwMCwweDgwMDAwMDAsMHg4MDAwMDAwLDB4MjcwODYsMHgwLDB4MCwweDAsMHg2NDAyNzA4NiwweDYwMDI3MDg2LDB4NjAwMjcwODYsMHg2NDgyNzA4NiwweDYwMDI3MDg2LDB4MTAwMDAwMCwweDQwMDAsMHg0MDAwLDB4NjAwMjcwODYsMHgyMDAwMCwweDAsMHgwLDB4MCwweDQwMDAwMDAsMHg0MDAwLDB4MTAwMDAwMCwweDY0MGE3MDg2LDB4NjQwYTcwODYsMHgxMDAwMDAwLDB4NDgwNDAwMCwweDQwMDQwMDAsMHg0ODA0MDAwLDB4MCx9OworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfaW5pdF8zKCkgeworICAgICAgampfbGExXzMgPSBuZXcgaW50W10gezB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MjAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDc4MCwweDc4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDIwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxODAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4YzAwMDAwMDAsMHhkZmZjMDAwMCwweDFmZmMwMDAwLDB4MCwweDIwLDB4NDAsMHg0MDAwLDB4ODAwMCwweDIwMDAsMHgxMiwweDEyLDB4MCwweGMsMHhjLDB4MjAwMDAsMHg2MDAsMHg2MDAsMHgxMTgwMCwweDExODAwLDB4NjAwLDB4NzgwLDB4MCwweDAsMHgwLDB4MTgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4ODAwMDAwMDAsMHgwLDB4MCwweDc4MCwweDc4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDc4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxODAsMHgxLDB4MTgwLDB4MCwweDc4MCwweDAsMHgwLDB4ZGZmYzAxODAsMHhkZmZjMDE4MCwweDEwMCwweDAsMHgwLDB4MCwweDc4MCwweDc4MCwweDc4MCwweDc4MCwweDc4MCwweDAsMHgwLDB4MCwweDc4MCwweDAsMHgwLDB4NDAwMCwweDAsMHgwLDB4MCwweDAsMHg3ODAsMHg3ODAsMHgwLDB4MCwweDAsMHgwLDB4MCx9OworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfaW5pdF80KCkgeworICAgICAgampfbGExXzQgPSBuZXcgaW50W10gezB4MCwweDAsMHg4LDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTAsMHgxMCwweDEwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NCwweDQsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDEwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTAsMHgwLDB4MTAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLH07CisgICB9CisgIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzQ3XTsKKyAgcHJpdmF0ZSBib29sZWFuIGpqX3Jlc2NhbiA9IGZhbHNlOworICBwcml2YXRlIGludCBqal9nYyA9IDA7CisKKyAgLyoqIENvbnN0cnVjdG9yIHdpdGggSW5wdXRTdHJlYW0uICovCisgIHB1YmxpYyBBU1RQYXJzZXIoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgdGhpcyhzdHJlYW0sIG51bGwpOworICB9CisgIC8qKiBDb25zdHJ1Y3RvciB3aXRoIElucHV0U3RyZWFtIGFuZCBzdXBwbGllZCBlbmNvZGluZyAqLworICBwdWJsaWMgQVNUUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICB0cnkgeyBqal9pbnB1dF9zdHJlYW0gPSBuZXcgSmF2YUNoYXJTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KKyAgICB0b2tlbl9zb3VyY2UgPSBuZXcgQVNUUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTc1OyBpKyspIGpqX2xhMVtpXSA9IC0xOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOworICB9CisKKyAgLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgIFJlSW5pdChzdHJlYW0sIG51bGwpOworICB9CisgIC8qKiBSZWluaXRpYWxpc2UuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIGVuY29kaW5nLCAxLCAxKTsgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgfQorICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNzU7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICAvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBBU1RQYXJzZXIoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7CisgICAgampfaW5wdXRfc3RyZWFtID0gbmV3IEphdmFDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7CisgICAgdG9rZW5fc291cmNlID0gbmV3IEFTVFBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE3NTsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIC8qKiBSZWluaXRpYWxpc2UuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKKyAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7CisgICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE3NTsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3RvciB3aXRoIGdlbmVyYXRlZCBUb2tlbiBNYW5hZ2VyLiAqLworICBwdWJsaWMgQVNUUGFyc2VyKEFTVFBhcnNlclRva2VuTWFuYWdlciB0bSkgeworICAgIHRva2VuX3NvdXJjZSA9IHRtOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE3NTsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIC8qKiBSZWluaXRpYWxpc2UuICovCisgIHB1YmxpYyB2b2lkIFJlSW5pdChBU1RQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNzU7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICBwcml2YXRlIFRva2VuIGpqX2NvbnN1bWVfdG9rZW4oaW50IGtpbmQpIHsKKyAgICBUb2tlbiBvbGRUb2tlbjsKKyAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKKyAgICAgIGpqX2dlbisrOworICAgICAgaWYgKCsrampfZ2MgPiAxMDApIHsKKyAgICAgICAgampfZ2MgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIEpKQ2FsbHMgYyA9IGpqXzJfcnRuc1tpXTsKKyAgICAgICAgICB3aGlsZSAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoYy5nZW4gPCBqal9nZW4pIGMuZmlyc3QgPSBudWxsOworICAgICAgICAgICAgYyA9IGMubmV4dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgdG9rZW4gPSBvbGRUb2tlbjsKKyAgICBqal9raW5kID0ga2luZDsKKyAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7CisgIH0KKworICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfQorICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOworICBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgeworICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKKyAgICAgIGpqX2xhLS07CisgICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKKyAgICB9CisgICAgaWYgKGpqX3Jlc2NhbikgeworICAgICAgaW50IGkgPSAwOyBUb2tlbiB0b2sgPSB0b2tlbjsKKyAgICAgIHdoaWxlICh0b2sgIT0gbnVsbCAmJiB0b2sgIT0gampfc2NhbnBvcykgeyBpKys7IHRvayA9IHRvay5uZXh0OyB9CisgICAgICBpZiAodG9rICE9IG51bGwpIGpqX2FkZF9lcnJvcl90b2tlbihraW5kLCBpKTsKKyAgICB9CisgICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisKKy8qKiBHZXQgdGhlIG5leHQgVG9rZW4uICovCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7CisgICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbisrOworICAgIHJldHVybiB0b2tlbjsKKyAgfQorCisvKiogR2V0IHRoZSBzcGVjaWZpYyBUb2tlbi4gKi8KKyAgZmluYWwgcHVibGljIFRva2VuIGdldFRva2VuKGludCBpbmRleCkgeworICAgIFRva2VuIHQgPSBqal9sb29raW5nQWhlYWQgPyBqal9zY2FucG9zIDogdG9rZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisgICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7CisgICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgfQorICAgIHJldHVybiB0OworICB9CisKKyAgcHJpdmF0ZSBpbnQgampfbnRrKCkgeworICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKKyAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOworICB9CisKKyAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxpbnRbXT4gampfZXhwZW50cmllcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGludFtdPigpOworICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OworICBwcml2YXRlIGludCBqal9raW5kID0gLTE7CisgIHByaXZhdGUgaW50W10gampfbGFzdHRva2VucyA9IG5ldyBpbnRbMTAwXTsKKyAgcHJpdmF0ZSBpbnQgampfZW5kcG9zOworCisgIHByaXZhdGUgdm9pZCBqal9hZGRfZXJyb3JfdG9rZW4oaW50IGtpbmQsIGludCBwb3MpIHsKKyAgICBpZiAocG9zID49IDEwMCkgcmV0dXJuOworICAgIGlmIChwb3MgPT0gampfZW5kcG9zICsgMSkgeworICAgICAgampfbGFzdHRva2Vuc1tqal9lbmRwb3MrK10gPSBraW5kOworICAgIH0gZWxzZSBpZiAoampfZW5kcG9zICE9IDApIHsKKyAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFtqal9lbmRwb3NdOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9lbmRwb3M7IGkrKykgeworICAgICAgICBqal9leHBlbnRyeVtpXSA9IGpqX2xhc3R0b2tlbnNbaV07CisgICAgICB9CisgICAgICBqal9lbnRyaWVzX2xvb3A6IGZvciAoamF2YS51dGlsLkl0ZXJhdG9yPD8+IGl0ID0gampfZXhwZW50cmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgIGludFtdIG9sZGVudHJ5ID0gKGludFtdKShpdC5uZXh0KCkpOworICAgICAgICBpZiAob2xkZW50cnkubGVuZ3RoID09IGpqX2V4cGVudHJ5Lmxlbmd0aCkgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cnkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChvbGRlbnRyeVtpXSAhPSBqal9leHBlbnRyeVtpXSkgeworICAgICAgICAgICAgICBjb250aW51ZSBqal9lbnRyaWVzX2xvb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGpqX2V4cGVudHJpZXMuYWRkKGpqX2V4cGVudHJ5KTsKKyAgICAgICAgICBicmVhayBqal9lbnRyaWVzX2xvb3A7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwb3MgIT0gMCkgampfbGFzdHRva2Vuc1soampfZW5kcG9zID0gcG9zKSAtIDFdID0ga2luZDsKKyAgICB9CisgIH0KKworICAvKiogR2VuZXJhdGUgUGFyc2VFeGNlcHRpb24uICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCkgeworICAgIGpqX2V4cGVudHJpZXMuY2xlYXIoKTsKKyAgICBib29sZWFuW10gbGExdG9rZW5zID0gbmV3IGJvb2xlYW5bMTMzXTsKKyAgICBpZiAoampfa2luZCA+PSAwKSB7CisgICAgICBsYTF0b2tlbnNbampfa2luZF0gPSB0cnVlOworICAgICAgampfa2luZCA9IC0xOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE3NTsgaSsrKSB7CisgICAgICBpZiAoampfbGExW2ldID09IGpqX2dlbikgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyBqKyspIHsKKyAgICAgICAgICBpZiAoKGpqX2xhMV8wW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbal0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGpqX2xhMV8xW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbMzIral0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGpqX2xhMV8yW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbNjQral0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGpqX2xhMV8zW2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbOTYral0gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGpqX2xhMV80W2ldICYgKDE8PGopKSAhPSAwKSB7CisgICAgICAgICAgICBsYTF0b2tlbnNbMTI4K2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzM7IGkrKykgeworICAgICAgaWYgKGxhMXRva2Vuc1tpXSkgeworICAgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbMV07CisgICAgICAgIGpqX2V4cGVudHJ5WzBdID0gaTsKKyAgICAgICAgampfZXhwZW50cmllcy5hZGQoampfZXhwZW50cnkpOworICAgICAgfQorICAgIH0KKyAgICBqal9lbmRwb3MgPSAwOworICAgIGpqX3Jlc2Nhbl90b2tlbigpOworICAgIGpqX2FkZF9lcnJvcl90b2tlbigwLCAwKTsKKyAgICBpbnRbXVtdIGV4cHRva3NlcSA9IG5ldyBpbnRbampfZXhwZW50cmllcy5zaXplKCldW107CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICBleHB0b2tzZXFbaV0gPSBqal9leHBlbnRyaWVzLmdldChpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbiwgZXhwdG9rc2VxLCB0b2tlbkltYWdlKTsKKyAgfQorCisgIC8qKiBFbmFibGUgdHJhY2luZy4gKi8KKyAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7CisgIH0KKworICAvKiogRGlzYWJsZSB0cmFjaW5nLiAqLworICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7CisgIH0KKworICBwcml2YXRlIHZvaWQgampfcmVzY2FuX3Rva2VuKCkgeworICAgIGpqX3Jlc2NhbiA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0NzsgaSsrKSB7CisgICAgdHJ5IHsKKyAgICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpXTsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKHAuZ2VuID4gampfZ2VuKSB7CisgICAgICAgICAgampfbGEgPSBwLmFyZzsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBwLmZpcnN0OworICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgY2FzZSAwOiBqal8zXzEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGpqXzNfMigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogampfM18zKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBqal8zXzQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IGpqXzNfNSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogampfM182KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OiBqal8zXzcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IGpqXzNfOCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODogampfM185KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OiBqal8zXzEwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDogampfM18xMSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE6IGpqXzNfMTIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOiBqal8zXzEzKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzogampfM18xNCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ6IGpqXzNfMTUoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OiBqal8zXzE2KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjogampfM18xNygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc6IGpqXzNfMTgoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4OiBqal8zXzE5KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTogampfM18yMCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA6IGpqXzNfMjEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxOiBqal8zXzIyKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjogampfM18yMygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM6IGpqXzNfMjQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiBqal8zXzI1KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTogampfM18yNigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjY6IGpqXzNfMjcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3OiBqal8zXzI4KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODogampfM18yOSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjk6IGpqXzNfMzAoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwOiBqal8zXzMxKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTogampfM18zMigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IGpqXzNfMzMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzOiBqal8zXzM0KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNDogampfM18zNSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzU6IGpqXzNfMzYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2OiBqal8zXzM3KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNzogampfM18zOCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzg6IGpqXzNfMzkoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM5OiBqal8zXzQwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MDogampfM180MSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDE6IGpqXzNfNDIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQyOiBqal8zXzQzKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MzogampfM180NCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDQ6IGpqXzNfNDUoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ1OiBqal8zXzQ2KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NjogampfM180NygpOyBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcCA9IHAubmV4dDsKKyAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7CisgICAgICB9IGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgfQorICAgIH0KKyAgICBqal9yZXNjYW4gPSBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBqal9zYXZlKGludCBpbmRleCwgaW50IHhsYSkgeworICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpbmRleF07CisgICAgd2hpbGUgKHAuZ2VuID4gampfZ2VuKSB7CisgICAgICBpZiAocC5uZXh0ID09IG51bGwpIHsgcCA9IHAubmV4dCA9IG5ldyBKSkNhbGxzKCk7IGJyZWFrOyB9CisgICAgICBwID0gcC5uZXh0OworICAgIH0KKyAgICBwLmdlbiA9IGpqX2dlbiArIHhsYSAtIGpqX2xhOyBwLmZpcnN0ID0gdG9rZW47IHAuYXJnID0geGxhOworICB9CisKKyAgc3RhdGljIGZpbmFsIGNsYXNzIEpKQ2FsbHMgeworICAgIGludCBnZW47CisgICAgVG9rZW4gZmlyc3Q7CisgICAgaW50IGFyZzsKKyAgICBKSkNhbGxzIG5leHQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvZ2VuZXJhdGVkL2NvbS9naXRodWIvamF2YXBhcnNlci9BU1RQYXJzZXJDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkyZGZjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw0MTQgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyc2VyQ29uc3RhbnRzLmphdmEgKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisKKy8qKgorICogVG9rZW4gbGl0ZXJhbCB2YWx1ZXMgYW5kIGNvbnN0YW50cy4KKyAqIEdlbmVyYXRlZCBieSBvcmcuamF2YWNjLnBhcnNlci5PdGhlckZpbGVzR2VuI3N0YXJ0KCkKKyAqLworcHVibGljIGludGVyZmFjZSBBU1RQYXJzZXJDb25zdGFudHMgeworCisgIC8qKiBFbmQgb2YgRmlsZS4gKi8KKyAgaW50IEVPRiA9IDA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNJTkdMRV9MSU5FX0NPTU1FTlQgPSA2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBKQVZBX0RPQ19DT01NRU5UID0gOTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTVVMVElfTElORV9DT01NRU5UID0gMTA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEFCU1RSQUNUID0gMTI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEFTU0VSVCA9IDEzOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCT09MRUFOID0gMTQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEJSRUFLID0gMTU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEJZVEUgPSAxNjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQ0FTRSA9IDE3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDQVRDSCA9IDE4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDSEFSID0gMTk7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IENMQVNTID0gMjA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IENPTlNUID0gMjE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IENPTlRJTlVFID0gMjI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IF9ERUZBVUxUID0gMjM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IERPID0gMjQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IERPVUJMRSA9IDI1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBFTFNFID0gMjY7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEVOVU0gPSAyNzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRVhURU5EUyA9IDI4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBGQUxTRSA9IDI5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBGSU5BTCA9IDMwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBGSU5BTExZID0gMzE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEZMT0FUID0gMzI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEZPUiA9IDMzOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBHT1RPID0gMzQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElGID0gMzU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElNUExFTUVOVFMgPSAzNjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSU1QT1JUID0gMzc7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElOU1RBTkNFT0YgPSAzODsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSU5UID0gMzk7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElOVEVSRkFDRSA9IDQwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMT05HID0gNDE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE5BVElWRSA9IDQyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBORVcgPSA0MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTlVMTCA9IDQ0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBQQUNLQUdFID0gNDU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFBSSVZBVEUgPSA0NjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUFJPVEVDVEVEID0gNDc7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFBVQkxJQyA9IDQ4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBSRVRVUk4gPSA0OTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU0hPUlQgPSA1MDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU1RBVElDID0gNTE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNUUklDVEZQID0gNTI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNVUEVSID0gNTM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNXSVRDSCA9IDU0OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTWU5DSFJPTklaRUQgPSA1NTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVEhJUyA9IDU2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBUSFJPVyA9IDU3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBUSFJPV1MgPSA1ODsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVFJBTlNJRU5UID0gNTk7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFRSVUUgPSA2MDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVFJZID0gNjE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFZPSUQgPSA2MjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVk9MQVRJTEUgPSA2MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgV0hJTEUgPSA2NDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTE9OR19MSVRFUkFMID0gNjU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IElOVEVHRVJfTElURVJBTCA9IDY2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBERUNJTUFMX0xJVEVSQUwgPSA2NzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSEVYX0xJVEVSQUwgPSA2ODsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgT0NUQUxfTElURVJBTCA9IDY5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCSU5BUllfTElURVJBTCA9IDcwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBGTE9BVElOR19QT0lOVF9MSVRFUkFMID0gNzE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IERFQ0lNQUxfRkxPQVRJTkdfUE9JTlRfTElURVJBTCA9IDcyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBERUNJTUFMX0VYUE9ORU5UID0gNzM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEhFWEFERUNJTUFMX0ZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSA3NDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSEVYQURFQ0lNQUxfRVhQT05FTlQgPSA3NTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQ0hBUkFDVEVSX0xJVEVSQUwgPSA3NjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU1RSSU5HX0xJVEVSQUwgPSA3NzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSURFTlRJRklFUiA9IDc4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMRVRURVIgPSA3OTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUEFSVF9MRVRURVIgPSA4MDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTFBBUkVOID0gODE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJQQVJFTiA9IDgyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMQlJBQ0UgPSA4MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUkJSQUNFID0gODQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExCUkFDS0VUID0gODU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJCUkFDS0VUID0gODY7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNFTUlDT0xPTiA9IDg3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDT01NQSA9IDg4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBET1QgPSA4OTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQVQgPSA5MDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQVNTSUdOID0gOTE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExUID0gOTI7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEJBTkcgPSA5MzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgVElMREUgPSA5NDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSE9PSyA9IDk1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBDT0xPTiA9IDk2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBFUSA9IDk3OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMRSA9IDk4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBHRSA9IDk5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBORSA9IDEwMDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgU0NfT1IgPSAxMDE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNDX0FORCA9IDEwMjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgSU5DUiA9IDEwMzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgREVDUiA9IDEwNDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUExVUyA9IDEwNTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgTUlOVVMgPSAxMDY7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNUQVIgPSAxMDc7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFNMQVNIID0gMTA4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCSVRfQU5EID0gMTA5OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBCSVRfT1IgPSAxMTA7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFhPUiA9IDExMTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUkVNID0gMTEyOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBMU0hJRlQgPSAxMTM7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFBMVVNBU1NJR04gPSAxMTQ7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IE1JTlVTQVNTSUdOID0gMTE1OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTVEFSQVNTSUdOID0gMTE2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBTTEFTSEFTU0lHTiA9IDExNzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgQU5EQVNTSUdOID0gMTE4OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBPUkFTU0lHTiA9IDExOTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgWE9SQVNTSUdOID0gMTIwOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBSRU1BU1NJR04gPSAxMjE7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IExTSElGVEFTU0lHTiA9IDEyMjsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUlNJR05FRFNISUZUQVNTSUdOID0gMTIzOworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBSVU5TSUdORURTSElGVEFTU0lHTiA9IDEyNDsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgRUxMSVBTSVMgPSAxMjU7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IEFSUk9XID0gMTI2OworICAvKiogUmVndWxhckV4cHJlc3Npb24gSWQuICovCisgIGludCBET1VCTEVDT0xPTiA9IDEyNzsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgUlVOU0lHTkVEU0hJRlQgPSAxMjg7CisgIC8qKiBSZWd1bGFyRXhwcmVzc2lvbiBJZC4gKi8KKyAgaW50IFJTSUdORURTSElGVCA9IDEyOTsKKyAgLyoqIFJlZ3VsYXJFeHByZXNzaW9uIElkLiAqLworICBpbnQgR1QgPSAxMzA7CisKKyAgLyoqIExleGljYWwgc3RhdGUuICovCisgIGludCBERUZBVUxUID0gMDsKKyAgLyoqIExleGljYWwgc3RhdGUuICovCisgIGludCBJTl9KQVZBX0RPQ19DT01NRU5UID0gMTsKKyAgLyoqIExleGljYWwgc3RhdGUuICovCisgIGludCBJTl9NVUxUSV9MSU5FX0NPTU1FTlQgPSAyOworCisgIC8qKiBMaXRlcmFsIHRva2VuIHZhbHVlcy4gKi8KKyAgU3RyaW5nW10gdG9rZW5JbWFnZSA9IHsKKyAgICAiPEVPRj4iLAorICAgICJcIiBcIiIsCisgICAgIlwiXFx0XCIiLAorICAgICJcIlxcblwiIiwKKyAgICAiXCJcXHJcIiIsCisgICAgIlwiXFxmXCIiLAorICAgICI8U0lOR0xFX0xJTkVfQ09NTUVOVD4iLAorICAgICI8dG9rZW4gb2Yga2luZCA3PiIsCisgICAgIlwiLypcIiIsCisgICAgIlwiKi9cIiIsCisgICAgIlwiKi9cIiIsCisgICAgIjx0b2tlbiBvZiBraW5kIDExPiIsCisgICAgIlwiYWJzdHJhY3RcIiIsCisgICAgIlwiYXNzZXJ0XCIiLAorICAgICJcImJvb2xlYW5cIiIsCisgICAgIlwiYnJlYWtcIiIsCisgICAgIlwiYnl0ZVwiIiwKKyAgICAiXCJjYXNlXCIiLAorICAgICJcImNhdGNoXCIiLAorICAgICJcImNoYXJcIiIsCisgICAgIlwiY2xhc3NcIiIsCisgICAgIlwiY29uc3RcIiIsCisgICAgIlwiY29udGludWVcIiIsCisgICAgIlwiZGVmYXVsdFwiIiwKKyAgICAiXCJkb1wiIiwKKyAgICAiXCJkb3VibGVcIiIsCisgICAgIlwiZWxzZVwiIiwKKyAgICAiXCJlbnVtXCIiLAorICAgICJcImV4dGVuZHNcIiIsCisgICAgIlwiZmFsc2VcIiIsCisgICAgIlwiZmluYWxcIiIsCisgICAgIlwiZmluYWxseVwiIiwKKyAgICAiXCJmbG9hdFwiIiwKKyAgICAiXCJmb3JcIiIsCisgICAgIlwiZ290b1wiIiwKKyAgICAiXCJpZlwiIiwKKyAgICAiXCJpbXBsZW1lbnRzXCIiLAorICAgICJcImltcG9ydFwiIiwKKyAgICAiXCJpbnN0YW5jZW9mXCIiLAorICAgICJcImludFwiIiwKKyAgICAiXCJpbnRlcmZhY2VcIiIsCisgICAgIlwibG9uZ1wiIiwKKyAgICAiXCJuYXRpdmVcIiIsCisgICAgIlwibmV3XCIiLAorICAgICJcIm51bGxcIiIsCisgICAgIlwicGFja2FnZVwiIiwKKyAgICAiXCJwcml2YXRlXCIiLAorICAgICJcInByb3RlY3RlZFwiIiwKKyAgICAiXCJwdWJsaWNcIiIsCisgICAgIlwicmV0dXJuXCIiLAorICAgICJcInNob3J0XCIiLAorICAgICJcInN0YXRpY1wiIiwKKyAgICAiXCJzdHJpY3RmcFwiIiwKKyAgICAiXCJzdXBlclwiIiwKKyAgICAiXCJzd2l0Y2hcIiIsCisgICAgIlwic3luY2hyb25pemVkXCIiLAorICAgICJcInRoaXNcIiIsCisgICAgIlwidGhyb3dcIiIsCisgICAgIlwidGhyb3dzXCIiLAorICAgICJcInRyYW5zaWVudFwiIiwKKyAgICAiXCJ0cnVlXCIiLAorICAgICJcInRyeVwiIiwKKyAgICAiXCJ2b2lkXCIiLAorICAgICJcInZvbGF0aWxlXCIiLAorICAgICJcIndoaWxlXCIiLAorICAgICI8TE9OR19MSVRFUkFMPiIsCisgICAgIjxJTlRFR0VSX0xJVEVSQUw+IiwKKyAgICAiPERFQ0lNQUxfTElURVJBTD4iLAorICAgICI8SEVYX0xJVEVSQUw+IiwKKyAgICAiPE9DVEFMX0xJVEVSQUw+IiwKKyAgICAiPEJJTkFSWV9MSVRFUkFMPiIsCisgICAgIjxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiIsCisgICAgIjxERUNJTUFMX0ZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKKyAgICAiPERFQ0lNQUxfRVhQT05FTlQ+IiwKKyAgICAiPEhFWEFERUNJTUFMX0ZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKKyAgICAiPEhFWEFERUNJTUFMX0VYUE9ORU5UPiIsCisgICAgIjxDSEFSQUNURVJfTElURVJBTD4iLAorICAgICI8U1RSSU5HX0xJVEVSQUw+IiwKKyAgICAiPElERU5USUZJRVI+IiwKKyAgICAiPExFVFRFUj4iLAorICAgICI8UEFSVF9MRVRURVI+IiwKKyAgICAiXCIoXCIiLAorICAgICJcIilcIiIsCisgICAgIlwie1wiIiwKKyAgICAiXCJ9XCIiLAorICAgICJcIltcIiIsCisgICAgIlwiXVwiIiwKKyAgICAiXCI7XCIiLAorICAgICJcIixcIiIsCisgICAgIlwiLlwiIiwKKyAgICAiXCJAXCIiLAorICAgICJcIj1cIiIsCisgICAgIlwiPFwiIiwKKyAgICAiXCIhXCIiLAorICAgICJcIn5cIiIsCisgICAgIlwiP1wiIiwKKyAgICAiXCI6XCIiLAorICAgICJcIj09XCIiLAorICAgICJcIjw9XCIiLAorICAgICJcIj49XCIiLAorICAgICJcIiE9XCIiLAorICAgICJcInx8XCIiLAorICAgICJcIiYmXCIiLAorICAgICJcIisrXCIiLAorICAgICJcIi0tXCIiLAorICAgICJcIitcIiIsCisgICAgIlwiLVwiIiwKKyAgICAiXCIqXCIiLAorICAgICJcIi9cIiIsCisgICAgIlwiJlwiIiwKKyAgICAiXCJ8XCIiLAorICAgICJcIl5cIiIsCisgICAgIlwiJVwiIiwKKyAgICAiXCI8PFwiIiwKKyAgICAiXCIrPVwiIiwKKyAgICAiXCItPVwiIiwKKyAgICAiXCIqPVwiIiwKKyAgICAiXCIvPVwiIiwKKyAgICAiXCImPVwiIiwKKyAgICAiXCJ8PVwiIiwKKyAgICAiXCJePVwiIiwKKyAgICAiXCIlPVwiIiwKKyAgICAiXCI8PD1cIiIsCisgICAgIlwiPj49XCIiLAorICAgICJcIj4+Pj1cIiIsCisgICAgIlwiLi4uXCIiLAorICAgICJcIi0+XCIiLAorICAgICJcIjo6XCIiLAorICAgICJcIj4+PlwiIiwKKyAgICAiXCI+PlwiIiwKKyAgICAiXCI+XCIiLAorICAgICJcIlxcdTAwMWFcIiIsCisgICAgIlwiPD5cIiIsCisgIH07CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlclRva2VuTWFuYWdlci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxNTc2NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0FTVFBhcnNlclRva2VuTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjU1OSBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKKy8qKiBUb2tlbiBNYW5hZ2VyLiAqLworcHVibGljIGNsYXNzIEFTVFBhcnNlclRva2VuTWFuYWdlciBpbXBsZW1lbnRzIEFTVFBhcnNlckNvbnN0YW50cworeworCisgIC8qKiBEZWJ1ZyBvdXRwdXQuICovCisgIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7CisgIC8qKiBTZXQgZGVidWcgb3V0cHV0LiAqLworICBwdWJsaWMgIHZvaWQgc2V0RGVidWdTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSBkcykgeyBkZWJ1Z1N0cmVhbSA9IGRzOyB9Citwcml2YXRlIGZpbmFsIGludCBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoaW50IHBvcywgbG9uZyBhY3RpdmUwLCBsb25nIGFjdGl2ZTEsIGxvbmcgYWN0aXZlMikKK3sKKyAgIHN3aXRjaCAocG9zKQorICAgeworICAgICAgY2FzZSAwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhmZmZmZmZmZmZmZmZmMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDIwMTAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gNDU7CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDIwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDMwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZmZmZmZmZjdmY2ZmZjAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zICE9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA1MDsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDA5ODIwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhkZmZmZjY3NWZlZmZmMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKKyAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDM6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDhlZmZlNTcxZjJmNGYwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NTEwMDEyMDQwYzBiMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4OGRiZTU3MDEyYzA3MDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7CisgICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgfQorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg2MjQwMDAxZTAzNDgwMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA1OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0NGIwNDIwMDIwMDIwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODg5MGUxNTA5MGMwNTAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NjAwMDkwODA0MDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDg4OTA4MTUwMDA0MDEwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDc6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDg4MDgxNTAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAxMDAwMDAwMDQwMTAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDQzOworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDA4MTAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDUwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDg7CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDk6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDUwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiA0MzsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDk7CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDEwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTA7CisgICAgICAgICAgICByZXR1cm4gNDM7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiAtMTsKKyAgIH0KK30KK3ByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTAsIGxvbmcgYWN0aXZlMSwgbG9uZyBhY3RpdmUyKQoreworICAgcmV0dXJuIGpqTW92ZU5mYV8wKGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChwb3MsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpLCBwb3MgKyAxKTsKK30KK3ByaXZhdGUgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQoreworICAgamptYXRjaGVkS2luZCA9IGtpbmQ7CisgICBqam1hdGNoZWRQb3MgPSBwb3M7CisgICByZXR1cm4gcG9zICsgMTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQoreworICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDI2OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDEzMSk7CisgICAgICBjYXNlIDMzOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDkzOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxMDAwMDAwMDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDM3OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDExMjsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MjAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDM4OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwOTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NDAwMDQwMDAwMDAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgNDA6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODEpOworICAgICAgY2FzZSA0MToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Mik7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwNzsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MTAwMDAwMDAwMDAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgNDM6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA1OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDA4MDAwMDAwMDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDQ0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg4KTsKKyAgICAgIGNhc2UgNDU6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA2OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDA4MDEwMDAwMDAwMDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDQ2OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDg5OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgyMDAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwODsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwTCwgMHgyMDAwMDAwMDAwMDAwMEwsIDB4MEwpOworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5NjsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAwMDAwMDAwMDAwMDAwMEwsIDB4MEwpOworICAgICAgY2FzZSA1OToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Nyk7CisgICAgICBjYXNlIDYwOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDkyOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDIwMDA0MDAwMDAwMDBMLCAweDEwTCk7CisgICAgICBjYXNlIDYxOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDkxOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgyMDAwMDAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTMwOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxODAwMDAwODAwMDAwMDAwTCwgMHgzTCk7CisgICAgICBjYXNlIDYzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDk1KTsKKyAgICAgIGNhc2UgNjQ6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgOTApOworICAgICAgY2FzZSA5MToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4NSk7CisgICAgICBjYXNlIDkzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg2KTsKKyAgICAgIGNhc2UgOTQ6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTExOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgxMDAwMDAwMDAwMDAwMDBMLCAweDBMKTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDMwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgOTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDFjMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg3ZTAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgzODAwMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MWMwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgzZTAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTAzOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxZjgwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MWMwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDExMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MWUwMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhmYzAwMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDNmMDAwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKKyAgICAgIGNhc2UgMTE4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhjMDAwMDAwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7CisgICAgICBjYXNlIDExOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MUwsIDB4MEwpOworICAgICAgY2FzZSAxMjM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODMpOworICAgICAgY2FzZSAxMjQ6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTEwOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg4MDAwMjAwMDAwMDAwMEwsIDB4MEwpOworICAgICAgY2FzZSAxMjU6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODQpOworICAgICAgY2FzZSAxMjY6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgOTQpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMCwgMCk7CisgICB9Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpCit7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDAsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMzg6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDIpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDgsIDUwKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MzoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwMyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDU6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTA0KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0NjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDIwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTI3KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2MDoKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExMzsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHg0MDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDYxOgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgyMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA5Nyk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgOTgpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDgwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDk5KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTAwKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTE0KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTE1KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDExNik7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMTcpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTE4KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDExOSk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MTAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTIwKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgyMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjEpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYyOgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTI2KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHgyTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTI5OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHgxMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEzMik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMHgxODAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMiwgMHgxTCk7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyNDAwMjAwNjAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSA5ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjA4MDAwMDgwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwMjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAzNSwgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NzA0MDAwMDAwMDgwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweGMwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDQxMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDMwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDFjMDA4MDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMjQ7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHhjMDAwMDIwNjAyNjA0MDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgzODAwYzAwMDAwMDA4MDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxODAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjExMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTIwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEyMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMTAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMjQ6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMDEpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxLCBsb25nIG9sZDIsIGxvbmcgYWN0aXZlMikKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSB8IChhY3RpdmUyICY9IG9sZDIpKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgb2xkMCwgb2xkMSwgb2xkMik7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDEsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpOworICAgICAgcmV0dXJuIDI7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDY6CisgICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygyLCAxMjUpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYxOgorICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygyLCAxMjIpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDgwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEyMyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBpZiAoKGFjdGl2ZTIgJiAweDFMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjg7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDB4MTAwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwODAwMDAwMDE4MDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDEwMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MTQwNDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAxMDAwMjAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDIwMGMwNjAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0ODAwMTAwMDA0MDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMzAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzMywgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg2MTAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMDQwMjMwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzOTsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwNTA0MTAwNTAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDAwMDAwMGEwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOworICAgICAgY2FzZSAxMTk6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0MywgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgNjEsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMik7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwLCBsb25nIG9sZDEsIGxvbmcgYWN0aXZlMSwgbG9uZyBvbGQyLCBsb25nIGFjdGl2ZTIpCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkgfCAoYWN0aXZlMiAmPSBvbGQyKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDEsIG9sZDAsIG9sZDEsIG9sZDIpOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgyLCBhY3RpdmUwLCBhY3RpdmUxLCAwTCk7CisgICAgICByZXR1cm4gMzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA2MToKKyAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4MTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDMsIDEyNCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwMDAxYzA4MDgwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwNDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNjIsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxNiwgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxNywgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDI2LCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgNjAsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMTAwMTAwMDIwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDEwMzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDQxLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDA0MDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTA3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA0NCwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAxMDAwMDA0MDAwTCwgYWN0aXZlMSwgMHgxTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMjcsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDM0LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDYwMDAwMjAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTksIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDU2LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMzAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQ4ODA0MDAwNDAxMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDExODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCwgbG9uZyBvbGQxLCBsb25nIGFjdGl2ZTEpCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBvbGQwLCBvbGQxLCAwTCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDMsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIHJldHVybiA0OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg2MDQwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg1MDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMjksIDQzKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA2NCwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDEwMDAwMDQwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDEwNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDE4LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDkwMDAwMDA0MDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDEwNzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTUsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMzA7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MjAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNTMsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAxMjAwMDAwMzAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDIwLCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDIxLCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAzMiwgNDMpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDUwLCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgY2FzZSAxMTk6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDU3OworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCwgbG9uZyBvbGQxLCBsb25nIGFjdGl2ZTEpCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBvbGQwLCBvbGQxLCAwTCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDQsIGFjdGl2ZTAsIDBMLCAwTCk7CisgICAgICByZXR1cm4gNTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4NTAwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNDgsIDQzKTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA1MSwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDI1LCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDQyLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDM6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDQ6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA1NCwgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODgwMDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwODAwMDAwTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDQ5LCA0Myk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDQwMDA0MDAwMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNTgsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDEzLCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgMzcsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MTA0MDAwMDAwMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDQsIGFjdGl2ZTAsIDBMLCAwTCk7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDQsIG9sZDAsIDBMLCAwTCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDUsIGFjdGl2ZTAsIDBMLCAwTCk7CisgICAgICByZXR1cm4gNjsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDQwMDAwMDEwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDQ1LCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCA0NiwgNDMpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg4MDAwMDEwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAxNCwgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMjgsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMjMsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4NDAwMDAwTCk7CisgICAgICBjYXNlIDEyMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDMxLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDUsIGFjdGl2ZTAsIDBMLCAwTCk7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDUsIG9sZDAsIDBMLCAwTCk7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDYsIGFjdGl2ZTAsIDBMLCAwTCk7CisgICAgICByZXR1cm4gNzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDIyLCA0Myk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgNjMsIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4ODA0MDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4ODgwMDAxMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDUyLCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAxMiwgNDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBhY3RpdmUwLCAwTCwgMEwpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBvbGQwLCAwTCwgMEwpOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg3LCBhY3RpdmUwLCAwTCwgMEwpOworICAgICAgcmV0dXJuIDg7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDgsIDQ3LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgNDAsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTlfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgNTksIDQzKTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgYWN0aXZlMCwgMEwsIDBMKTsKK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgb2xkMCwgMEwsIDBMKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoOCwgYWN0aXZlMCwgMEwsIDBMKTsKKyAgICAgIHJldHVybiA5OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDEwMjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOSwgMzgsIDQzKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDksIDM2LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTIyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExMF8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDgsIGFjdGl2ZTAsIDBMLCAwTCk7Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg4LCBvbGQwLCAwTCwgMEwpOworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg5LCBhY3RpdmUwLCAwTCwgMEwpOworICAgICAgcmV0dXJuIDEwOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTFfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCBhY3RpdmUwLCAwTCwgMEwpOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTExXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoOSwgb2xkMCwgMEwsIDBMKTsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMTAsIGFjdGl2ZTAsIDBMLCAwTCk7CisgICAgICByZXR1cm4gMTE7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMTEsIDU1LCA0Myk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDEwLCBhY3RpdmUwLCAwTCwgMEwpOworfQorcHJpdmF0ZSBpbnQgampTdGFydE5mYVdpdGhTdGF0ZXNfMChpbnQgcG9zLCBpbnQga2luZCwgaW50IHN0YXRlKQoreworICAgamptYXRjaGVkS2luZCA9IGtpbmQ7CisgICBqam1hdGNoZWRQb3MgPSBwb3M7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gcG9zICsgMTsgfQorICAgcmV0dXJuIGpqTW92ZU5mYV8wKHN0YXRlLCBwb3MgKyAxKTsKK30KK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMwID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZlTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyID0geworICAgMHgwTCwgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzID0geworICAgMHhmZmYwMDAwMDAwMjAwMDAyTCwgMHhmZmZmZmZmZmZmZmZkZmZmTCwgMHhmZmZmZjAwZjdmZmZmZmZmTCwgMHgxMjAwMDAwMDAwN2ZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0ID0geworICAgMHgwTCwgMHgwTCwgMHg0MjAwNDNjMDAwMDAwMDBMLCAweGZmN2ZmZmZmZmY3ZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzUgPSB7CisgICAweDdmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmYwMDAwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHg0MDFmMDAwM2ZmYzNMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYgPSB7CisgICAweDBMLCAweDQwMDAwMDAwMDAwMDAwMEwsIDB4ZmZmZmZmZmJmZmZmZDc0MEwsIDB4ZmJmZmZmZmZmZmY3ZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM3ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmYzAzTCwgMHgzM2ZmZmZmZmZmZjdmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzggPSB7CisgICAweGZmZmUwMDAwMDAwMGZmZmZMLCAweGZmZmZmZmZlMDI3ZmZmZmZMLCAweGZmTCwgMHg3MDdmZmZmZmYwMDAwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM5ID0geworICAgMHg3ZmZmZmZlMDAwMDAwMDBMLCAweGZmZmVjMDAwMDAwMDA3ZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDljMDBjMDYwMDAyZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzEwID0geworICAgMHhmZmZmZmZmZDAwMDBMLCAweGUwMDBMLCAweDIwMDNmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzExID0geworICAgMHgyM2ZmZmZmZmZmZmZmZmYwTCwgMHgzZmYwMTAwMDBMLCAweDIzYzVmZGZmZmZmOTlmZTBMLCAweGYwMDAzYjAwMDAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzEyID0geworICAgMHgzNmRmZGZmZmZmOTg3ZTBMLCAweDFjMDAwMDVlMDAwMDAwTCwgMHgyM2VkZmRmZmZmZmJiZmUwTCwgMHgyMDAwMzAwMDEwMDAwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxMyA9IHsKKyAgIDB4MjNlZGZkZmZmZmY5OWZlMEwsIDB4MjAwMDNiMDAwMDAwMEwsIDB4M2JmYzcxOGQ2M2RjN2U4TCwgMHgyMDAwMDAwMDAwMDAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzE0ID0geworICAgMHgzZWZmZGZmZmZmZGRmZTBMLCAweDMwMDAwMDAwMEwsIDB4MjNlZmZkZmZmZmZkZGZlMEwsIDB4MzQwMDAwMDAwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxNSA9IHsKKyAgIDB4M2ZmZmRmZmZmZmRkZmUwTCwgMHgzMDAwMDAwMDBMLCAweDJmZmJmZmZmZmM3ZmZmZTBMLCAweDdmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxNiA9IHsKKyAgIDB4ODAwZGZmZmZmZmZmZmZmZUwsIDB4N2ZMLCAweDIwMGRlY2FlZmVmMDI1OTZMLCAweDMwMDAwMDVmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMxNyA9IHsKKyAgIDB4MUwsIDB4N2ZmZmZmZmZlZmZMLCAweGYwMEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTggPSB7CisgICAweDZmYmZmZmZmZmZmTCwgMHgzZjAwMDBMLCAweGZmZmZmZmZmMDAwMDAwMDBMLCAweDFmZmZmZmZmZmZmMDAzZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMTkgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmODNmZmZmZmZMLCAweGZmZmZmZjA3ZmZmZmZmZmZMLCAweDNmZmZmZmZmZmZmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjAgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmN2ZMLCAweGZmZmZmZmZmM2Q3ZjNkN2ZMLCAweDdmM2Q3ZmZmZmZmZjNkN2ZMLCAweGZmZmY3ZmZmZmY3ZjdmM2RMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzIxID0geworICAgMHhmZmZmZmZmZjdmM2Q3ZmZmTCwgMHg3ZmZmZjdmTCwgMHhmZmZmZmZmZjAwMDAwMDAwTCwgMHgxZmZmZmZmZmZmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjIgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDdmOWZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZjA3ZmZmZmZlTCwgMHgxYzdmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyMyA9IHsKKyAgIDB4M2ZmZmYwMDAzZGZmZkwsIDB4MWRmZmYwMDAzZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZkwsIDB4MTg4MDAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI0ID0geworICAgMHhmZmZmZmZmZjAwMDAwMDAwTCwgMHhmZmZmZmZmZmZmZmZmZkwsIDB4MWZmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI1ID0geworICAgMHgxZmZmZmZmZkwsIDB4MWYzZmZmZmZmZjAwMDBMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI2ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZkwsIDB4MEwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjcgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmMGZmZmZmZmZMLCAweDNmZmZmZmZmZmZmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMjggPSB7CisgICAweGZmZmZmZmZmM2YzZmZmZmZMLCAweDNmZmZmZmZmYWFmZjNmM2ZMLCAweDVmZGZmZmZmZmZmZmZmZmZMLCAweDFmZGMxZmZmMGZjZjFmZGNMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzI5ID0geworICAgMHg4MDAwMDAwMDAwMDAwMDAwTCwgMHg4MDAyMDAwMDAwMTAwMDAxTCwgMHgzZmZmZjAwMDAwMDAwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzMCA9IHsKKyAgIDB4ZTNmYmJkNTAzZTJmZmM4NEwsIDB4ZmZmZmZmZmYwMDAwMDNlMEwsIDB4ZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzEgPSB7CisgICAweDFmM2UwM2ZlMDAwMDAwZTBMLCAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZlZTA3ZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzMyID0geworICAgMHhmZmZlMWZmZmZmZmZmZmUwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmYwMDAwN2ZmZkwsIDB4ZmZmZjAwMDAwMDAwMDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzMgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDNmZmZmZmZmZmZmZmZmTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzNCA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmZmZmZmZmZkwsIDB4MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMzUgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDFmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzM2ID0geworICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzM3ID0geworICAgMHg2TCwgMHgwTCwgMHgwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzOCA9IHsKKyAgIDB4ZmZmZjNmZmZmZmZmZmZmZkwsIDB4N2ZmZmZmZmZmZmZMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzM5ID0geworICAgMHg1ZjdmZmRmZmEwZjgwMDdmTCwgMHhmZmZmZmZmZmZmZmZmZmRiTCwgMHgzZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZjgwMDAwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0MCA9IHsKKyAgIDB4M2ZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmMDAwMEwsIDB4ZmZmZmZmZmZmZmZjZmZmZkwsIDB4MWZmZjAwMDAwMDAwMDBmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNDEgPSB7CisgICAweDE4MDAwMDAwMDAwMDAwTCwgMHhmZmRmMDIwMDAwMDBlMDAwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHgxZmZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0MiA9IHsKKyAgIDB4ODdmZmZmZmUwMDAwMDAxMEwsIDB4ZmZmZmZmZTAwN2ZmZmZmZUwsIDB4N2ZmZmZmZmZmZmZmZmZmZkwsIDB4NjMxY2ZjZmNmY0wKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNDMgPSB7CisgICAweDBMLCAweDBMLCAweDQyMDI0M2NmZmZmZmZmZkwsIDB4ZmY3ZmZmZmZmZjdmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNDQgPSB7CisgICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDQwMGZmZmZlMGZmZmZmZkwsIDB4ZmZmZmZmZmJmZmZmZDc0MEwsIDB4ZmJmZmZmZmZmZmY3ZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0NSA9IHsKKyAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmM3YkwsIDB4MzNmZmZmZmZmZmY3ZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0NiA9IHsKKyAgIDB4ZmZmZTAwMDAwMDAwZmZmZkwsIDB4ZmZmZmZmZmUwMjdmZmZmZkwsIDB4YmJmZmZmZmJmZmZlMDBmZkwsIDB4NzA3ZmZmZmZmMDAxNkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNDcgPSB7CisgICAweDdmZmZmZmUwMDNmMDAwZkwsIDB4ZmZmZmMzZmYwMWZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4OWZmZmZkZmZiZmVmZmZmZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNDggPSB7CisgICAweGZmZmZmZmZmZmZmZjgwMDBMLCAweGU3ZmZMLCAweDNmZmZmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQ5ID0geworICAgMHhmM2ZmZmZmZmZmZmZmZmZlTCwgMHhmZmNmZmYxZjNmZmZMLCAweGYzYzVmZGZmZmZmOTlmZWVMLCAweGZmZmNmYjA4MDM5OWZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzUwID0geworICAgMHhkMzZkZmRmZmZmZjk4N2VlTCwgMHgxZmZmYzA1ZTAwMzk4N0wsIDB4ZjNlZGZkZmZmZmZiYmZlZUwsIDB4MmZmY2YwMDAxM2JiZkwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTEgPSB7CisgICAweGYzZWRmZGZmZmZmOTlmZWVMLCAweDJmZmMzYjBjMDM5OGZMLCAweGMzYmZjNzE4ZDYzZGM3ZWNMLCAweDIwMGZmODAwMDgwM2RjN0wKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTIgPSB7CisgICAweGMzZWZmZGZmZmZmZGRmZWVMLCAweGZmYzMwMDYwM2RkZkwsIDB4ZjNlZmZkZmZmZmZkZGZlY0wsIDB4ZmZjMzQwNjAzZGRmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1MyA9IHsKKyAgIDB4YzNmZmZkZmZmZmZkZGZlY0wsIDB4ZmZjMzAwODAzZGNmTCwgMHgyZmZiZmZmZmZjN2ZmZmVjTCwgMHhjMDAwMGZmNWY4NDdmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1NCA9IHsKKyAgIDB4ODdmZmZmZmZmZmZmZmZmZUwsIDB4M2ZmN2ZmZkwsIDB4M2JmZmVjYWVmZWYwMjU5NkwsIDB4MzNmZjNmNWZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzU1ID0geworICAgMHhjMmEwMDNmZjAzMDAwMDAxTCwgMHhmZmZlMDdmZmZmZmZmZWZmTCwgMHgxZmZmZmZmZmZlZmYwZmRmTCwgMHg0MEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNTYgPSB7CisgICAweDNjN2Y2ZmJmZmZmZmZmZkwsIDB4M2ZmMDNmZkwsIDB4ZmZmZmZmZmYwMDAwMDAwMEwsIDB4MWZmZmZmZmZmZmYwMDNmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1NyA9IHsKKyAgIDB4ZmZmZmZmZmY3ZjNkN2ZmZkwsIDB4M2ZlMDAwN2ZmZmY3ZkwsIDB4ZmZmZmZmZmYwMDAwMDAwMEwsIDB4MWZmZmZmZmZmZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzU4ID0geworICAgMHgxZmZmZmYwMDFmZGZmZkwsIDB4ZGRmZmYwMDBmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmMzg4ZmZmZmZMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzU5ID0geworICAgMHhmZmZmZmZmZjAzZmYzODAwTCwgMHhmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmZmZmZmZmZmZMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYwID0geworICAgMHhmZmYwZmZmMWZmZmZmZmZMLCAweDFmM2ZmZmZmZmZmZmMwTCwgMHgwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2MSA9IHsKKyAgIDB4ODAwMDdjMDAwMDAwZjAwMEwsIDB4ODAwMmZjMGYwMDEwMDAwMUwsIDB4M2ZmZmYwMDAwMDAwMEwsIDB4N2UyMWZmZjAwMDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYyID0geworICAgMHgxZjNlZmZmZTAwMDAwMGUwTCwgMHhmZmZmZmZmZmZmZmZmZmZlTCwgMHhmZmZmZmZmZWU2N2ZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2MyA9IHsKKyAgIDB4MTAwMDAwMDAwMDAwMDZMLCAweDBMLCAweDBMLCAweDBMCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzY0ID0geworICAgMHgzTCwgMHgwTCwgMHgwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2NSA9IHsKKyAgIDB4MEwsIDB4ODAwMDAwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2NiA9IHsKKyAgIDB4NWY3ZmZkZmZlMGY4MDA3ZkwsIDB4ZmZmZmZmZmZmZmZmZmZkYkwsIDB4M2ZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmY4MDAwMEwKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNjcgPSB7CisgICAweDE4MDAwZjAwMDBmZmZmTCwgMHhmZmRmMDIwMDAwMDBlMDAwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHg5ZmZmZmZmZmZmZmZmZmZmTAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2OCA9IHsKKyAgIDB4ODdmZmZmZmUwM2ZmMDAxMEwsIDB4ZmZmZmZmZTAwN2ZmZmZmZUwsIDB4N2ZmZmZmZmZmZmZmZmZmZkwsIDB4ZTAwMDA2MzFjZmNmY2ZjTAorfTsKK3ByaXZhdGUgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQoreworICAgaW50IHN0YXJ0c0F0ID0gMDsKKyAgIGpqbmV3U3RhdGVDbnQgPSAxMzA7CisgICBpbnQgaSA9IDE7CisgICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKKyAgIGludCBraW5kID0gMHg3ZmZmZmZmZjsKKyAgIGZvciAoOzspCisgICB7CisgICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCisgICAgICAgICBSZUluaXRSb3VuZHMoKTsKKyAgICAgIGlmIChjdXJDaGFyIDwgNjQpCisgICAgICB7CisgICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOworICAgICAgICAgZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDQ1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDIpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1MDsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDcpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDIpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDMsIDE3KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDcpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxOCwgMTkpOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzNikKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0Myk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM0KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzkpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNCwgMjYpOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NikKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOworICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDgpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNywgMzQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDIsIDMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzksIDQxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDcsIDgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNiwgOSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDUsIDQ4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNCwgMjYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmRiZmZMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSAmJiBraW5kID4gNzYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE4LCAxNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZkYmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMCwgMjMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQgJiYga2luZCA+IDc3KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTQsIDU4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIwLCAyMyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gMzYpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0Myk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAxMDBmZmZjMWZmTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc4KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc4OworICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDcpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxOCwgMTkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZmZmZmRiZmZMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gNikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAgJiYga2luZCA+IDYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0OToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEzKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0MikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDUxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmY3ZmZmZmZmZmZmZmZMICYgbCkgIT0gMEwgJiYga2luZCA+IDcpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQyKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY2OworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMywgMTcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDU0LCA1NSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTU6CisgICAgICAgICAgICAgICBjYXNlIDk4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDU2KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg1NywgNTgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU4OgorICAgICAgICAgICAgICAgY2FzZSAxMDk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg1OSwgNjApOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDYwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU5LCA2MSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNjIsIDY1KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2MzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2NCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNjYsIDY4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg2NSwgNjYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDY0LCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg2OSwgNzIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDczLCA3Nyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNjksIDcwKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3MDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg3MSwgNzIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDcxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDc4LCA4MCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNzQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MTsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDgxLCA4Myk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNzUsIDc2KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3NjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg3NCwgOSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoODQsIDg3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3ODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg4OCwgOTEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDc5LCA4MCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoODEsIDgyKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4MToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg5MiwgOTQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDgyOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDYpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg5NSwgOTcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDgzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MTsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDk4LCAxMDEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDg0LCA4NSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoOTUsIDk3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg4OCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTAyLCAxMDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDg5LCA5MCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoODgsIDkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDkxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MTsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwNSwgMTA4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5MjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMDksIDExMyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTE0LCAxMTcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDgpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNywgMzQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDExOCwgMTIwKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg5NywgOTgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTIxLCAxMjMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwMCwgMTAxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Nik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTAzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDMwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMjQsIDEyNik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDMwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMDQsIDEwNSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDMwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Nik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA3OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwOCwgMTA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTA4LCAxMDkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExMSwgMTEyKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMTEsIDExMik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTEyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MzAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExNSwgMTE2KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MzAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExNSwgMTE2KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MzAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gNjYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTE4OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDEyNywgMTI4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTk6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NikKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEyMCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTIwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEyMCwgMTIxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTIzLCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTI5LCAxMzEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ2KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTI3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTI5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTI5LCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCisgICAgICB7CisgICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7CisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0Myk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTMyLCAxMzMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDEzNCwgMTM1KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxMzYsIDEzNyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg1MDAwMDAwMDUwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA3MSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxMzgsIDE0MCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQ0MTAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTQxLCAxNDMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDEwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjAsIDIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMyOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyMCwgMjMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc4KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc4OworICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7CisgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygwLCAyKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNykKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNDQsIDE0NSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwTCAmIGwpICE9IDBMICYmIGtpbmQgPiA2NSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1NzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTQ2LCAxNDcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDU5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNDgsIDE0OSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE1MCwgMTUxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTUyLCAxNTMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNTQsIDE1NSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE1NiwgMTU3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA3NToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTU4LCAxNTkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNjAsIDE2MSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODQ6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE2MiwgMTYzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4NjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTY0LCAxNjUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDg5OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNjYsIDE2Nyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOTY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDExOCwgMTIwKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5NzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTgwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoOTcsIDk4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5ODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNTYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDk1KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTY4LCAxNjkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg0MDAwMDAwMDRMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNzAsIDE3MSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA2OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwNzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwOCwgMTA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDg6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2U4MDAwMDA3ZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwOCwgMTA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCAmJiBraW5kID4gNjYpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTExOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTUpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNzIsIDE3Myk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTEzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDQwMDAwMDAwNEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTU6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5NSkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE3NCwgMTc1KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMTc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMDAxMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTE4LCAxMTkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExODoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTE4LCAxMTkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTc2LCAxNzcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyMToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTc4LCAxNzkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMjUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTI5LCAxMzEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyNzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTgwLCAxODEpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGhpQnl0ZSA9IChpbnQpKGN1ckNoYXIgPj4gOCk7CisgICAgICAgICBpbnQgaTEgPSBoaUJ5dGUgPj4gNjsKKyAgICAgICAgIGxvbmcgbDEgPSAxTCA8PCAoaGlCeXRlICYgMDc3KTsKKyAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKKyAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7CisgICAgICAgICBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgIGlmICghampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0Myk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDIwLCAyMyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNDM6CisgICAgICAgICAgICAgICAgICBpZiAoIWpqQ2FuTW92ZV8yKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc4KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc4OworICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDMpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7CisgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygwLCAyKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSAmJiBraW5kID4gNykKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKKyAgICAgIHsKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOworICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOworICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICB9CisgICAgICArK2N1clBvczsKKyAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDEzMCAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKKyAgICAgICAgIHJldHVybiBjdXJQb3M7CisgICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gY3VyUG9zOyB9CisgICB9Cit9Citwcml2YXRlIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8yKCkKK3sKKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8yKDB4NDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiAxOworICAgfQorfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMihsb25nIGFjdGl2ZTApCit7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDc6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gMjsKKyAgIH0KKyAgIHJldHVybiAyOworfQorcHJpdmF0ZSBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpCit7CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMSgweDIwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gMTsKKyAgIH0KK30KK3ByaXZhdGUgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzEobG9uZyBhY3RpdmUwKQoreworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA5KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gMjsKKyAgIH0KKyAgIHJldHVybiAyOworfQorc3RhdGljIGZpbmFsIGludFtdIGpqbmV4dFN0YXRlcyA9IHsKKyAgIDQ2LCA0NywgNDksIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYyLCA5LCA2OSwgNzIsIDc5LCA4MiwgOTMsIAorICAgNzgsIDY4LCA0NSwgNTIsIDI4LCAyOSwgMzYsIDM3LCAxMywgMTUsIDI2LCA5NSwgOTksIDEwMiwgMTA2LCAxMTAsIAorICAgMTEzLCAxMTcsIDEyNCwgMiwgNCwgOSwgMTEsIDEsIDQsIDksIDcsIDksIDEwLCA2LCA3LCA5LCAKKyAgIDEwLCAxLCAyLCA0LCA5LCAxMSwgMjgsIDI5LCAzOSwgMzYsIDM3LCA2MSwgNjIsIDksIDU5LCA2MiwgCisgICA5LCA2OCwgNjUsIDksIDY3LCA2NCwgNjUsIDksIDY3LCA2MSwgNTksIDYyLCA5LCA2OCwgNjksIDcyLCAKKyAgIDc4LCA3NSwgOSwgNzcsIDc0LCA3NSwgOSwgNzcsIDcxLCA2OSwgNzIsIDc4LCA3OSwgODIsIDkzLCA4MywgCisgICA4NiwgOSwgODQsIDg2LCA5LCA5MiwgODksIDksIDkxLCA4OCwgODksIDksIDkxLCA4MywgODQsIDg2LCAKKyAgIDksIDkyLCA4MSwgNzksIDgyLCA5MywgOTcsIDk4LCA1NiwgMTAwLCAxMDEsIDU2LCAxMDQsIDEwNSwgNTYsIDExOCwgCisgICAxMTksIDEyNSwgMTI2LCAxMjcsIDIsIDMsIDUsIDYsIDcsIDgsIDE2LCAxNywgMTksIDMwLCAzOCwgNDAsIAorICAgNTQsIDU1LCA1NywgNTgsIDU5LCA2MCwgNjMsIDY0LCA2NSwgNjYsIDY5LCA3MCwgNzMsIDc0LCA3NSwgNzYsIAorICAgNzksIDgwLCA4NCwgODUsIDg3LCA4OCwgODksIDkwLCAxMDAsIDEwMSwgMTA0LCAxMDUsIDExMSwgMTEyLCAxMTUsIDExNiwgCisgICAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyOCwgMTI5LCAKK307Citwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8wKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQoreworICAgc3dpdGNoKGhpQnl0ZSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMV0gJiBsMSkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KK3ByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gampDYW5Nb3ZlXzEoaW50IGhpQnl0ZSwgaW50IGkxLCBpbnQgaTIsIGxvbmcgbDEsIGxvbmcgbDIpCit7CisgICBzd2l0Y2goaGlCeXRlKQorICAgeworICAgICAgY2FzZSAwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM3W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzhbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjOVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA3OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxMFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxMVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzEzW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDEyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxNFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMTVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMxN1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMThbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE5W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE4OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyMFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxOToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjFbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzIyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyM1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjRbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzI1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyNltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzI4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyOVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNDg6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzMxW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDQ5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA3NzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTU5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzNFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNjQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIxNToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjE2OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzN1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1MToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjUzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0MFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzQxW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1NToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDJbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgaWYgKChqamJpdFZlYzNbaTFdICYgbDEpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9Cit9Citwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8yKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQoreworICAgc3dpdGNoKGhpQnl0ZSkKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0NFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0NVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0NltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA2OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0N1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA3OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0OFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0OVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzUxW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDEyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1MltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzU0W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE1OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1NVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzE5W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDE4OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyMFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxOToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjI6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzIyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIzOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1OFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNTlbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzYwW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyNltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMDoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMjdbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMzE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzI4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDMyOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2MVtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAzMzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgNDg6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzYyW2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDQ5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzMltpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSA3NzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzNbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMTU5OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzNFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAxNjQ6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzM1W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIxNToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMzZbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjE2OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2M1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyMjA6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzY0W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDIyMToKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNjVbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjUwOgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzOFtpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTE6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzY2W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBjYXNlIDI1MzoKKyAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNDBbaTJdICYgbDIpICE9IDBMKTsKKyAgICAgIGNhc2UgMjU0OgorICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2N1tpMl0gJiBsMikgIT0gMEwpOworICAgICAgY2FzZSAyNTU6CisgICAgICAgICByZXR1cm4gKChqamJpdFZlYzY4W2kyXSAmIGwyKSAhPSAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGlmICgoampiaXRWZWMzW2kxXSAmIGwxKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCisvKiogVG9rZW4gbGl0ZXJhbCB2YWx1ZXMuICovCitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGpqc3RyTGl0ZXJhbEltYWdlcyA9IHsKKyIiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKKyJcMTQxXDE0MlwxNjNcMTY0XDE2MlwxNDFcMTQzXDE2NCIsICJcMTQxXDE2M1wxNjNcMTQ1XDE2MlwxNjQiLCAiXDE0MlwxNTdcMTU3XDE1NFwxNDVcMTQxXDE1NiIsIAorIlwxNDJcMTYyXDE0NVwxNDFcMTUzIiwgIlwxNDJcMTcxXDE2NFwxNDUiLCAiXDE0M1wxNDFcMTYzXDE0NSIsICJcMTQzXDE0MVwxNjRcMTQzXDE1MCIsIAorIlwxNDNcMTUwXDE0MVwxNjIiLCAiXDE0M1wxNTRcMTQxXDE2M1wxNjMiLCAiXDE0M1wxNTdcMTU2XDE2M1wxNjQiLCAKKyJcMTQzXDE1N1wxNTZcMTY0XDE1MVwxNTZcMTY1XDE0NSIsICJcMTQ0XDE0NVwxNDZcMTQxXDE2NVwxNTRcMTY0IiwgIlwxNDRcMTU3IiwgIlwxNDRcMTU3XDE2NVwxNDJcMTU0XDE0NSIsIAorIlwxNDVcMTU0XDE2M1wxNDUiLCAiXDE0NVwxNTZcMTY1XDE1NSIsICJcMTQ1XDE3MFwxNjRcMTQ1XDE1NlwxNDRcMTYzIiwgIlwxNDZcMTQxXDE1NFwxNjNcMTQ1IiwgCisiXDE0NlwxNTFcMTU2XDE0MVwxNTQiLCAiXDE0NlwxNTFcMTU2XDE0MVwxNTRcMTU0XDE3MSIsICJcMTQ2XDE1NFwxNTdcMTQxXDE2NCIsICJcMTQ2XDE1N1wxNjIiLCAKKyJcMTQ3XDE1N1wxNjRcMTU3IiwgIlwxNTFcMTQ2IiwgIlwxNTFcMTU1XDE2MFwxNTRcMTQ1XDE1NVwxNDVcMTU2XDE2NFwxNjMiLCAKKyJcMTUxXDE1NVwxNjBcMTU3XDE2MlwxNjQiLCAiXDE1MVwxNTZcMTYzXDE2NFwxNDFcMTU2XDE0M1wxNDVcMTU3XDE0NiIsICJcMTUxXDE1NlwxNjQiLCAKKyJcMTUxXDE1NlwxNjRcMTQ1XDE2MlwxNDZcMTQxXDE0M1wxNDUiLCAiXDE1NFwxNTdcMTU2XDE0NyIsICJcMTU2XDE0MVwxNjRcMTUxXDE2NlwxNDUiLCAiXDE1NlwxNDVcMTY3IiwgCisiXDE1NlwxNjVcMTU0XDE1NCIsICJcMTYwXDE0MVwxNDNcMTUzXDE0MVwxNDdcMTQ1IiwgIlwxNjBcMTYyXDE1MVwxNjZcMTQxXDE2NFwxNDUiLCAKKyJcMTYwXDE2MlwxNTdcMTY0XDE0NVwxNDNcMTY0XDE0NVwxNDQiLCAiXDE2MFwxNjVcMTQyXDE1NFwxNTFcMTQzIiwgIlwxNjJcMTQ1XDE2NFwxNjVcMTYyXDE1NiIsIAorIlwxNjNcMTUwXDE1N1wxNjJcMTY0IiwgIlwxNjNcMTY0XDE0MVwxNjRcMTUxXDE0MyIsICJcMTYzXDE2NFwxNjJcMTUxXDE0M1wxNjRcMTQ2XDE2MCIsIAorIlwxNjNcMTY1XDE2MFwxNDVcMTYyIiwgIlwxNjNcMTY3XDE1MVwxNjRcMTQzXDE1MCIsIAorIlwxNjNcMTcxXDE1NlwxNDNcMTUwXDE2MlwxNTdcMTU2XDE1MVwxNzJcMTQ1XDE0NCIsICJcMTY0XDE1MFwxNTFcMTYzIiwgIlwxNjRcMTUwXDE2MlwxNTdcMTY3IiwgIlwxNjRcMTUwXDE2MlwxNTdcMTY3XDE2MyIsIAorIlwxNjRcMTYyXDE0MVwxNTZcMTYzXDE1MVwxNDVcMTU2XDE2NCIsICJcMTY0XDE2MlwxNjVcMTQ1IiwgIlwxNjRcMTYyXDE3MSIsICJcMTY2XDE1N1wxNTFcMTQ0IiwgCisiXDE2NlwxNTdcMTU0XDE0MVwxNjRcMTUxXDE1NFwxNDUiLCAiXDE2N1wxNTBcMTUxXDE1NFwxNDUiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKK251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcNTAiLCAiXDUxIiwgIlwxNzMiLCAiXDE3NSIsICJcMTMzIiwgCisiXDEzNSIsICJcNzMiLCAiXDU0IiwgIlw1NiIsICJcMTAwIiwgIlw3NSIsICJcNzQiLCAiXDQxIiwgIlwxNzYiLCAiXDc3IiwgIlw3MiIsIAorIlw3NVw3NSIsICJcNzRcNzUiLCAiXDc2XDc1IiwgIlw0MVw3NSIsICJcMTc0XDE3NCIsICJcNDZcNDYiLCAiXDUzXDUzIiwgIlw1NVw1NSIsICJcNTMiLCAKKyJcNTUiLCAiXDUyIiwgIlw1NyIsICJcNDYiLCAiXDE3NCIsICJcMTM2IiwgIlw0NSIsICJcNzRcNzQiLCAiXDUzXDc1IiwgIlw1NVw3NSIsIAorIlw1Mlw3NSIsICJcNTdcNzUiLCAiXDQ2XDc1IiwgIlwxNzRcNzUiLCAiXDEzNlw3NSIsICJcNDVcNzUiLCAiXDc0XDc0XDc1IiwgIlw3Nlw3Nlw3NSIsIAorIlw3Nlw3Nlw3Nlw3NSIsICJcNTZcNTZcNTYiLCAiXDU1XDc2IiwgIlw3Mlw3MiIsICJcNzZcNzZcNzYiLCAiXDc2XDc2IiwgIlw3NiIsICJcMzIiLCAKKyJcNzRcNzYiLCB9OworCisvKiogTGV4ZXIgc3RhdGUgbmFtZXMuICovCitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxleFN0YXRlTmFtZXMgPSB7CisgICAiREVGQVVMVCIsCisgICAiSU5fSkFWQV9ET0NfQ09NTUVOVCIsCisgICAiSU5fTVVMVElfTElORV9DT01NRU5UIiwKK307CisKKy8qKiBMZXggU3RhdGUgYXJyYXkuICovCitwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGpqbmV3TGV4U3RhdGUgPSB7CisgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMSwgMiwgMCwgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7CisgICAweGZmZmZmZmZmZmZmZmYwMDFMLCAweGZmZmZmZmZmZmZmZTcwODdMLCAweDFmTCwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU2tpcCA9IHsKKyAgIDB4NjdlTCwgMHgwTCwgMHgwTCwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU3BlY2lhbCA9IHsKKyAgIDB4NjQwTCwgMHgwTCwgMHgwTCwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvTW9yZSA9IHsKKyAgIDB4OTgwTCwgMHgwTCwgMHgwTCwgCit9OworcHJvdGVjdGVkIEphdmFDaGFyU3RyZWFtIGlucHV0X3N0cmVhbTsKK3ByaXZhdGUgZmluYWwgaW50W10gampyb3VuZHMgPSBuZXcgaW50WzEzMF07Citwcml2YXRlIGZpbmFsIGludFtdIGpqc3RhdGVTZXQgPSBuZXcgaW50WzI2MF07Citwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgamppbWFnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Citwcml2YXRlIFN0cmluZ0J1aWxkZXIgaW1hZ2UgPSBqamltYWdlOworcHJpdmF0ZSBpbnQgamppbWFnZUxlbjsKK3ByaXZhdGUgaW50IGxlbmd0aE9mTWF0Y2g7Citwcm90ZWN0ZWQgY2hhciBjdXJDaGFyOworLyoqIENvbnN0cnVjdG9yLiAqLworcHVibGljIEFTVFBhcnNlclRva2VuTWFuYWdlcihKYXZhQ2hhclN0cmVhbSBzdHJlYW0peworICAgaWYgKEphdmFDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVSUk9SOiBDYW5ub3QgdXNlIGEgc3RhdGljIENoYXJTdHJlYW0gY2xhc3Mgd2l0aCBhIG5vbi1zdGF0aWMgbGV4aWNhbCBhbmFseXplci4iKTsKKyAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKK30KKworLyoqIENvbnN0cnVjdG9yLiAqLworcHVibGljIEFTVFBhcnNlclRva2VuTWFuYWdlcihKYXZhQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSl7CisgICB0aGlzKHN0cmVhbSk7CisgICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Cit9CisKKy8qKiBSZWluaXRpYWxpc2UgcGFyc2VyLiAqLworcHVibGljIHZvaWQgUmVJbml0KEphdmFDaGFyU3RyZWFtIHN0cmVhbSkKK3sKKyAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOworICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7CisgICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07CisgICBSZUluaXRSb3VuZHMoKTsKK30KK3ByaXZhdGUgdm9pZCBSZUluaXRSb3VuZHMoKQoreworICAgaW50IGk7CisgICBqanJvdW5kID0gMHg4MDAwMDAwMTsKKyAgIGZvciAoaSA9IDEzMDsgaS0tID4gMDspCisgICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7Cit9CisKKy8qKiBSZWluaXRpYWxpc2UgcGFyc2VyLiAqLworcHVibGljIHZvaWQgUmVJbml0KEphdmFDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQoreworICAgUmVJbml0KHN0cmVhbSk7CisgICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Cit9CisKKy8qKiBTd2l0Y2ggdG8gc3BlY2lmaWVkIGxleCBzdGF0ZS4gKi8KK3B1YmxpYyB2b2lkIFN3aXRjaFRvKGludCBsZXhTdGF0ZSkKK3sKKyAgIGlmIChsZXhTdGF0ZSA+PSAzIHx8IGxleFN0YXRlIDwgMCkKKyAgICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKCJFcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogIiArIGxleFN0YXRlICsgIi4gU3RhdGUgdW5jaGFuZ2VkLiIsIFRva2VuTWdyRXJyb3IuSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKKyAgIGVsc2UKKyAgICAgIGN1ckxleFN0YXRlID0gbGV4U3RhdGU7Cit9CisKK3Byb3RlY3RlZCBUb2tlbiBqakZpbGxUb2tlbigpCit7CisgICBmaW5hbCBUb2tlbiB0OworICAgZmluYWwgU3RyaW5nIGN1clRva2VuSW1hZ2U7CisgICBmaW5hbCBpbnQgYmVnaW5MaW5lOworICAgZmluYWwgaW50IGVuZExpbmU7CisgICBmaW5hbCBpbnQgYmVnaW5Db2x1bW47CisgICBmaW5hbCBpbnQgZW5kQ29sdW1uOworICAgU3RyaW5nIGltID0gampzdHJMaXRlcmFsSW1hZ2VzW2pqbWF0Y2hlZEtpbmRdOworICAgY3VyVG9rZW5JbWFnZSA9IChpbSA9PSBudWxsKSA/IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpIDogaW07CisgICBiZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7CisgICBiZWdpbkNvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkNvbHVtbigpOworICAgZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICBlbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisgICB0ID0gQVNUUGFyc2VyLkdUVG9rZW4ubmV3VG9rZW4oamptYXRjaGVkS2luZCwgY3VyVG9rZW5JbWFnZSk7CisKKyAgIHQuYmVnaW5MaW5lID0gYmVnaW5MaW5lOworICAgdC5lbmRMaW5lID0gZW5kTGluZTsKKyAgIHQuYmVnaW5Db2x1bW4gPSBiZWdpbkNvbHVtbjsKKyAgIHQuZW5kQ29sdW1uID0gZW5kQ29sdW1uOworCisgICByZXR1cm4gdDsKK30KKworaW50IGN1ckxleFN0YXRlID0gMDsKK2ludCBkZWZhdWx0TGV4U3RhdGUgPSAwOworaW50IGpqbmV3U3RhdGVDbnQ7CitpbnQgampyb3VuZDsKK2ludCBqam1hdGNoZWRQb3M7CitpbnQgamptYXRjaGVkS2luZDsKKworLyoqIEdldCB0aGUgbmV4dCBUb2tlbi4gKi8KK3B1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSAKK3sKKyAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKKyAgVG9rZW4gbWF0Y2hlZFRva2VuOworICBpbnQgY3VyUG9zID0gMDsKKworICBFT0ZMb29wIDoKKyAgZm9yICg7OykKKyAgeworICAgdHJ5CisgICB7CisgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLkJlZ2luVG9rZW4oKTsKKyAgIH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKKyAgIHsKKyAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOworICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKKyAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47CisgICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOworICAgfQorICAgaW1hZ2UgPSBqamltYWdlOworICAgaW1hZ2Uuc2V0TGVuZ3RoKDApOworICAgamppbWFnZUxlbiA9IDA7CisKKyAgIGZvciAoOzspCisgICB7CisgICAgIHN3aXRjaChjdXJMZXhTdGF0ZSkKKyAgICAgeworICAgICAgIGNhc2UgMDoKKyAgICAgICAgIHRyeSB7IGlucHV0X3N0cmVhbS5iYWNrdXAoMCk7CisgICAgICAgICAgICB3aGlsZSAoY3VyQ2hhciA8PSAzMiAmJiAoMHgxMDAwMDM2MDBMICYgKDFMIDw8IGN1ckNoYXIpKSAhPSAwTCkKKyAgICAgICAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOworICAgICAgICAgfQorICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgY29udGludWUgRU9GTG9vcDsgfQorICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOworICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOworICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAxOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOworICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpOworICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA9PSAwICYmIGpqbWF0Y2hlZEtpbmQgPiAxMSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgMjoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKKyAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzIoKTsKKyAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPT0gMCAmJiBqam1hdGNoZWRLaW5kID4gMTEpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgfQorICAgICBpZiAoamptYXRjaGVkS2luZCAhPSAweDdmZmZmZmZmKQorICAgICB7CisgICAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQorICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGN1clBvcyAtIGpqbWF0Y2hlZFBvcyAtIDEpOworICAgICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQorICAgICAgICB7CisgICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7CisgICAgICAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47CisgICAgICAgICAgIFRva2VuTGV4aWNhbEFjdGlvbnMobWF0Y2hlZFRva2VuKTsKKyAgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKKyAgICAgICAgIGN1ckxleFN0YXRlID0gampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXTsKKyAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoamp0b1NraXBbamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKKyAgICAgICAgeworICAgICAgICAgICBpZiAoKGpqdG9TcGVjaWFsW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKKyAgICAgICAgICAgICAgaWYgKHNwZWNpYWxUb2tlbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBtYXRjaGVkVG9rZW47CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOworICAgICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSAoc3BlY2lhbFRva2VuLm5leHQgPSBtYXRjaGVkVG9rZW4pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFNraXBMZXhpY2FsQWN0aW9ucyhtYXRjaGVkVG9rZW4pOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgU2tpcExleGljYWxBY3Rpb25zKG51bGwpOworICAgICAgICAgaWYgKGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF0gIT0gLTEpCisgICAgICAgICAgIGN1ckxleFN0YXRlID0gampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXTsKKyAgICAgICAgICAgY29udGludWUgRU9GTG9vcDsKKyAgICAgICAgfQorICAgICAgICBNb3JlTGV4aWNhbEFjdGlvbnMoKTsKKyAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQorICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07CisgICAgICAgIGN1clBvcyA9IDA7CisgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICB0cnkgeworICAgICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IH0KKyAgICAgfQorICAgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisgICAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7CisgICAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOworICAgICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQorICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICBFT0ZTZWVuID0gdHJ1ZTsKKyAgICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7CisgICAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7CisgICAgICAgICAgIGVycm9yX2xpbmUrKzsKKyAgICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgIGVycm9yX2NvbHVtbisrOworICAgICB9CisgICAgIGlmICghRU9GU2VlbikgeworICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKKyAgICAgfQorICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcihFT0ZTZWVuLCBjdXJMZXhTdGF0ZSwgZXJyb3JfbGluZSwgZXJyb3JfY29sdW1uLCBlcnJvcl9hZnRlciwgY3VyQ2hhciwgVG9rZW5NZ3JFcnJvci5MRVhJQ0FMX0VSUk9SKTsKKyAgIH0KKyAgfQorfQorCit2b2lkIFNraXBMZXhpY2FsQWN0aW9ucyhUb2tlbiBtYXRjaGVkVG9rZW4pCit7CisgICBzd2l0Y2goamptYXRjaGVkS2luZCkKKyAgIHsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9Cit9Cit2b2lkIE1vcmVMZXhpY2FsQWN0aW9ucygpCit7CisgICBqamltYWdlTGVuICs9IChsZW5ndGhPZk1hdGNoID0gamptYXRjaGVkUG9zICsgMSk7CisgICBzd2l0Y2goamptYXRjaGVkS2luZCkKKyAgIHsKKyAgICAgIGNhc2UgNyA6CisgICAgICAgICBpbWFnZS5hcHBlbmQoaW5wdXRfc3RyZWFtLkdldFN1ZmZpeChqamltYWdlTGVuKSk7CisgICAgICAgICBqamltYWdlTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorfQordm9pZCBUb2tlbkxleGljYWxBY3Rpb25zKFRva2VuIG1hdGNoZWRUb2tlbikKK3sKKyAgIHN3aXRjaChqam1hdGNoZWRLaW5kKQorICAgeworICAgICAgY2FzZSAxMjggOgorICAgICAgICBpbWFnZS5hcHBlbmQoampzdHJMaXRlcmFsSW1hZ2VzWzEyOF0pOworICAgICAgICBsZW5ndGhPZk1hdGNoID0gampzdHJMaXRlcmFsSW1hZ2VzWzEyOF0ubGVuZ3RoKCk7CisgICAgIG1hdGNoZWRUb2tlbi5raW5kID0gR1Q7CisgICAgICgoQVNUUGFyc2VyLkdUVG9rZW4pbWF0Y2hlZFRva2VuKS5yZWFsS2luZCA9IFJVTlNJR05FRFNISUZUOworICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDIpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyOSA6CisgICAgICAgIGltYWdlLmFwcGVuZChqanN0ckxpdGVyYWxJbWFnZXNbMTI5XSk7CisgICAgICAgIGxlbmd0aE9mTWF0Y2ggPSBqanN0ckxpdGVyYWxJbWFnZXNbMTI5XS5sZW5ndGgoKTsKKyAgICAgbWF0Y2hlZFRva2VuLmtpbmQgPSBHVDsKKyAgICAgKChBU1RQYXJzZXIuR1RUb2tlbiltYXRjaGVkVG9rZW4pLnJlYWxLaW5kID0gUlNJR05FRFNISUZUOworICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorfQorcHJpdmF0ZSB2b2lkIGpqQ2hlY2tOQWRkKGludCBzdGF0ZSkKK3sKKyAgIGlmIChqanJvdW5kc1tzdGF0ZV0gIT0gampyb3VuZCkKKyAgIHsKKyAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IHN0YXRlOworICAgICAgampyb3VuZHNbc3RhdGVdID0gampyb3VuZDsKKyAgIH0KK30KK3ByaXZhdGUgdm9pZCBqakFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICBkbyB7CisgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBqam5leHRTdGF0ZXNbc3RhcnRdOworICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOworfQorcHJpdmF0ZSB2b2lkIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKGludCBzdGF0ZTEsIGludCBzdGF0ZTIpCit7CisgICBqakNoZWNrTkFkZChzdGF0ZTEpOworICAgampDaGVja05BZGQoc3RhdGUyKTsKK30KKworcHJpdmF0ZSB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKK3sKKyAgIGRvIHsKKyAgICAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOworICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOworfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvZ2VuZXJhdGVkL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhQ2hhclN0cmVhbS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvSmF2YUNoYXJTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE2NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvSmF2YUNoYXJTdHJlYW0uamF2YQpAQCAtMCwwICsxLDYyOSBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKYXZhQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gNS4wICovCisvKiBKYXZhQ0NPcHRpb25zOlNUQVRJQz1mYWxzZSxTVVBQT1JUX0NMQVNTX1ZJU0lCSUxJVFlfUFVCTElDPXRydWUgKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBDaGFyU3RyZWFtLCB3aGVyZSB0aGUgc3RyZWFtIGlzIGFzc3VtZWQgdG8KKyAqIGNvbnRhaW4gb25seSBBU0NJSSBjaGFyYWN0ZXJzICh3aXRoIGphdmEtbGlrZSB1bmljb2RlIGVzY2FwZSBwcm9jZXNzaW5nKS4KKyAqLworCitwdWJsaWMKK2NsYXNzIEphdmFDaGFyU3RyZWFtCit7CisgIC8qKiBXaGV0aGVyIHBhcnNlciBpcyBzdGF0aWMuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdGF0aWNGbGFnID0gZmFsc2U7CisKKyAgc3RhdGljIGZpbmFsIGludCBoZXh2YWwoY2hhciBjKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoKGMpCisgICAgeworICAgICAgIGNhc2UgJzAnIDoKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICBjYXNlICcxJyA6CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgY2FzZSAnMicgOgorICAgICAgICAgIHJldHVybiAyOworICAgICAgIGNhc2UgJzMnIDoKKyAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICBjYXNlICc0JyA6CisgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgY2FzZSAnNScgOgorICAgICAgICAgIHJldHVybiA1OworICAgICAgIGNhc2UgJzYnIDoKKyAgICAgICAgICByZXR1cm4gNjsKKyAgICAgICBjYXNlICc3JyA6CisgICAgICAgICAgcmV0dXJuIDc7CisgICAgICAgY2FzZSAnOCcgOgorICAgICAgICAgIHJldHVybiA4OworICAgICAgIGNhc2UgJzknIDoKKyAgICAgICAgICByZXR1cm4gOTsKKworICAgICAgIGNhc2UgJ2EnIDoKKyAgICAgICBjYXNlICdBJyA6CisgICAgICAgICAgcmV0dXJuIDEwOworICAgICAgIGNhc2UgJ2InIDoKKyAgICAgICBjYXNlICdCJyA6CisgICAgICAgICAgcmV0dXJuIDExOworICAgICAgIGNhc2UgJ2MnIDoKKyAgICAgICBjYXNlICdDJyA6CisgICAgICAgICAgcmV0dXJuIDEyOworICAgICAgIGNhc2UgJ2QnIDoKKyAgICAgICBjYXNlICdEJyA6CisgICAgICAgICAgcmV0dXJuIDEzOworICAgICAgIGNhc2UgJ2UnIDoKKyAgICAgICBjYXNlICdFJyA6CisgICAgICAgICAgcmV0dXJuIDE0OworICAgICAgIGNhc2UgJ2YnIDoKKyAgICAgICBjYXNlICdGJyA6CisgICAgICAgICAgcmV0dXJuIDE1OworICAgIH0KKworICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7IC8vIFNob3VsZCBuZXZlciBjb21lIGhlcmUKKyAgfQorCisvKiogUG9zaXRpb24gaW4gYnVmZmVyLiAqLworICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOworICBpbnQgYnVmc2l6ZTsKKyAgaW50IGF2YWlsYWJsZTsKKyAgaW50IHRva2VuQmVnaW47CisgIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOworICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOworCisgIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKKyAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7CisKKyAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOworCisgIHByb3RlY3RlZCBjaGFyW10gbmV4dENoYXJCdWY7CisgIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOworICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKKyAgcHJvdGVjdGVkIGludCBuZXh0Q2hhckluZCA9IC0xOworICBwcm90ZWN0ZWQgaW50IGluQnVmID0gMDsKKyAgcHJvdGVjdGVkIGludCB0YWJTaXplID0gODsKKworICBwcm90ZWN0ZWQgdm9pZCBzZXRUYWJTaXplKGludCBpKSB7IHRhYlNpemUgPSBpOyB9CisgIHByb3RlY3RlZCBpbnQgZ2V0VGFiU2l6ZShpbnQgaSkgeyByZXR1cm4gdGFiU2l6ZTsgfQorCisgIHByb3RlY3RlZCB2b2lkIEV4cGFuZEJ1ZmYoYm9vbGVhbiB3cmFwQXJvdW5kKQorICB7CisgICAgY2hhcltdIG5ld2J1ZmZlciA9IG5ldyBjaGFyW2J1ZnNpemUgKyAyMDQ4XTsKKyAgICBpbnQgbmV3YnVmbGluZVtdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisgICAgaW50IG5ld2J1ZmNvbHVtbltdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisKKyAgICB0cnkKKyAgICB7CisgICAgICBpZiAod3JhcEFyb3VuZCkKKyAgICAgIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3YnVmZmVyLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIDAsIG5ld2J1ZmxpbmUsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOworICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOworICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47CisKKyAgICAgICAgYnVmcG9zICs9IChidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKKworICAgICAgICBidWZwb3MgLT0gdG9rZW5CZWdpbjsKKyAgICAgIH0KKyAgICB9CisgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgYXZhaWxhYmxlID0gKGJ1ZnNpemUgKz0gMjA0OCk7CisgICAgdG9rZW5CZWdpbiA9IDA7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBGaWxsQnVmZigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICBpbnQgaTsKKyAgICBpZiAobWF4TmV4dENoYXJJbmQgPT0gNDA5NikKKyAgICAgIG1heE5leHRDaGFySW5kID0gbmV4dENoYXJJbmQgPSAwOworCisgICAgdHJ5IHsKKyAgICAgIGlmICgoaSA9IGlucHV0U3RyZWFtLnJlYWQobmV4dENoYXJCdWYsIG1heE5leHRDaGFySW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCisgICAgICB7CisgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICBtYXhOZXh0Q2hhckluZCArPSBpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlmIChidWZwb3MgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgLS1idWZwb3M7CisgICAgICAgIGJhY2t1cCgwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKKyAgICAgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47CisgICAgICB9CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBjaGFyIFJlYWRCeXRlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgIGlmICgrK25leHRDaGFySW5kID49IG1heE5leHRDaGFySW5kKQorICAgICAgRmlsbEJ1ZmYoKTsKKworICAgIHJldHVybiBuZXh0Q2hhckJ1ZltuZXh0Q2hhckluZF07CisgIH0KKworLyoqIEByZXR1cm4gc3RhcnRpbmcgY2hhcmFjdGVyIGZvciB0b2tlbi4gKi8KKyAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICBpZiAoaW5CdWYgPiAwKQorICAgIHsKKyAgICAgIC0taW5CdWY7CisKKyAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQorICAgICAgICBidWZwb3MgPSAwOworCisgICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOworICAgICAgcmV0dXJuIGJ1ZmZlcltidWZwb3NdOworICAgIH0KKworICAgIHRva2VuQmVnaW4gPSAwOworICAgIGJ1ZnBvcyA9IC0xOworCisgICAgcmV0dXJuIHJlYWRDaGFyKCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBBZGp1c3RCdWZmU2l6ZSgpCisgIHsKKyAgICBpZiAoYXZhaWxhYmxlID09IGJ1ZnNpemUpCisgICAgeworICAgICAgaWYgKHRva2VuQmVnaW4gPiAyMDQ4KQorICAgICAgeworICAgICAgICBidWZwb3MgPSAwOworICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlID4gdG9rZW5CZWdpbikKKyAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7CisgICAgZWxzZSBpZiAoKHRva2VuQmVnaW4gLSBhdmFpbGFibGUpIDwgMjA0OCkKKyAgICAgIEV4cGFuZEJ1ZmYodHJ1ZSk7CisgICAgZWxzZQorICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIFVwZGF0ZUxpbmVDb2x1bW4oY2hhciBjKQorICB7CisgICAgY29sdW1uKys7CisKKyAgICBpZiAocHJldkNoYXJJc0xGKQorICAgIHsKKyAgICAgIHByZXZDaGFySXNMRiA9IGZhbHNlOworICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7CisgICAgfQorICAgIGVsc2UgaWYgKHByZXZDaGFySXNDUikKKyAgICB7CisgICAgICBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgICAgIGlmIChjID09ICdcbicpCisgICAgICB7CisgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOworICAgIH0KKworICAgIHN3aXRjaCAoYykKKyAgICB7CisgICAgICBjYXNlICdccicgOgorICAgICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1xuJyA6CisgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXHQnIDoKKyAgICAgICAgY29sdW1uLS07CisgICAgICAgIGNvbHVtbiArPSAodGFiU2l6ZSAtIChjb2x1bW4gJSB0YWJTaXplKSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ1ZmxpbmVbYnVmcG9zXSA9IGxpbmU7CisgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47CisgIH0KKworLyoqIFJlYWQgYSBjaGFyYWN0ZXIuICovCisgIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgIGlmIChpbkJ1ZiA+IDApCisgICAgeworICAgICAgLS1pbkJ1ZjsKKworICAgICAgaWYgKCsrYnVmcG9zID09IGJ1ZnNpemUpCisgICAgICAgIGJ1ZnBvcyA9IDA7CisKKyAgICAgIHJldHVybiBidWZmZXJbYnVmcG9zXTsKKyAgICB9CisKKyAgICBjaGFyIGM7CisKKyAgICBpZiAoKytidWZwb3MgPT0gYXZhaWxhYmxlKQorICAgICAgQWRqdXN0QnVmZlNpemUoKTsKKworICAgIGlmICgoYnVmZmVyW2J1ZnBvc10gPSBjID0gUmVhZEJ5dGUoKSkgPT0gJ1xcJykKKyAgICB7CisgICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOworCisgICAgICBpbnQgYmFja1NsYXNoQ250ID0gMTsKKworICAgICAgZm9yICg7OykgLy8gUmVhZCBhbGwgdGhlIGJhY2tzbGFzaGVzCisgICAgICB7CisgICAgICAgIGlmICgrK2J1ZnBvcyA9PSBhdmFpbGFibGUpCisgICAgICAgICAgQWRqdXN0QnVmZlNpemUoKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgIGlmICgoYnVmZmVyW2J1ZnBvc10gPSBjID0gUmVhZEJ5dGUoKSkgIT0gJ1xcJykKKyAgICAgICAgICB7CisgICAgICAgICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOworICAgICAgICAgICAgLy8gZm91bmQgYSBub24tYmFja3NsYXNoIGNoYXIuCisgICAgICAgICAgICBpZiAoKGMgPT0gJ3UnKSAmJiAoKGJhY2tTbGFzaENudCAmIDEpID09IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoLS1idWZwb3MgPCAwKQorICAgICAgICAgICAgICAgIGJ1ZnBvcyA9IGJ1ZnNpemUgLSAxOworCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiYWNrdXAoYmFja1NsYXNoQ250KTsKKyAgICAgICAgICAgIHJldHVybiAnXFwnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKwkgIC8vIFdlIGFyZSByZXR1cm5pbmcgb25lIGJhY2tzbGFzaCBzbyB3ZSBzaG91bGQgb25seSBiYWNrdXAgKGNvdW50LTEpCisgICAgICAgICAgaWYgKGJhY2tTbGFzaENudCA+IDEpCisgICAgICAgICAgICBiYWNrdXAoYmFja1NsYXNoQ250LTEpOworCisgICAgICAgICAgcmV0dXJuICdcXCc7CisgICAgICAgIH0KKworICAgICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOworICAgICAgICBiYWNrU2xhc2hDbnQrKzsKKyAgICAgIH0KKworICAgICAgLy8gSGVyZSwgd2UgaGF2ZSBzZWVuIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoJ3MgZm9sbG93ZWQgYnkgYSAndScKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICB3aGlsZSAoKGMgPSBSZWFkQnl0ZSgpKSA9PSAndScpCisgICAgICAgICAgKytjb2x1bW47CisKKyAgICAgICAgYnVmZmVyW2J1ZnBvc10gPSBjID0gKGNoYXIpKGhleHZhbChjKSA8PCAxMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXh2YWwoUmVhZEJ5dGUoKSkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXh2YWwoUmVhZEJ5dGUoKSkgPDwgNCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXh2YWwoUmVhZEJ5dGUoKSkpOworCisgICAgICAgIGNvbHVtbiArPSA0OworICAgICAgfQorICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQorICAgICAgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZXNjYXBlIGNoYXJhY3RlciBhdCBsaW5lICIgKyBsaW5lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb2x1bW4gIiArIGNvbHVtbiArICIuIik7CisgICAgICB9CisKKyAgICAgIGlmIChiYWNrU2xhc2hDbnQgPT0gMSkKKyAgICAgICAgcmV0dXJuIGM7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGJhY2t1cChiYWNrU2xhc2hDbnQgLSAxKTsKKyAgICAgICAgcmV0dXJuICdcXCc7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOworICAgICAgcmV0dXJuIGM7CisgICAgfQorICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkCisgICAqIEBzZWUgI2dldEVuZENvbHVtbgorICAgKi8KKyAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7CisgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOworICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkCisgICAqIEBzZWUgI2dldEVuZExpbmUKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKKyAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOworICB9CisKKy8qKiBHZXQgZW5kIGNvbHVtbi4gKi8KKyAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKSB7CisgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOworICB9CisKKy8qKiBHZXQgZW5kIGxpbmUuICovCisgIHB1YmxpYyBpbnQgZ2V0RW5kTGluZSgpIHsKKyAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOworICB9CisKKy8qKiBAcmV0dXJuIGNvbHVtbiBvZiB0b2tlbiBzdGFydCAqLworICBwdWJsaWMgaW50IGdldEJlZ2luQ29sdW1uKCkgeworICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07CisgIH0KKworLyoqIEByZXR1cm4gbGluZSBudW1iZXIgb2YgdG9rZW4gc3RhcnQgKi8KKyAgcHVibGljIGludCBnZXRCZWdpbkxpbmUoKSB7CisgICAgcmV0dXJuIGJ1ZmxpbmVbdG9rZW5CZWdpbl07CisgIH0KKworLyoqIFJldHJlYXQuICovCisgIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KSB7CisKKyAgICBpbkJ1ZiArPSBhbW91bnQ7CisgICAgaWYgKChidWZwb3MgLT0gYW1vdW50KSA8IDApCisgICAgICBidWZwb3MgKz0gYnVmc2l6ZTsKKyAgfQorCisvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBKYXZhQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLAorICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOworICAgIGxpbmUgPSBzdGFydGxpbmU7CisgICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOworCisgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7CisgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07CisgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgICBuZXh0Q2hhckJ1ZiA9IG5ldyBjaGFyWzQwOTZdOworICB9CisKKy8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIEphdmFDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uKQorICB7CisgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisvKiogQ29uc3RydWN0b3IuICovCisgIHB1YmxpYyBKYXZhQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQorICB7CisgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sCisgICAgICAgICAgICAgICAgIGludCBzdGFydGxpbmUsIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCisgIHsKKyAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07CisgICAgbGluZSA9IHN0YXJ0bGluZTsKKyAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7CisKKyAgICBpZiAoYnVmZmVyID09IG51bGwgfHwgYnVmZmVyc2l6ZSAhPSBidWZmZXIubGVuZ3RoKQorICAgIHsKKyAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOworICAgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07CisgICAgICBidWZsaW5lID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgICBuZXh0Q2hhckJ1ZiA9IG5ldyBjaGFyWzQwOTZdOworICAgIH0KKyAgICBwcmV2Q2hhcklzTEYgPSBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgICB0b2tlbkJlZ2luID0gaW5CdWYgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgbmV4dENoYXJJbmQgPSBidWZwb3MgPSAtMTsKKyAgfQorCisvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCisgIHsKKyAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKy8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIEphdmFDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICB0aGlzKGVuY29kaW5nID09IG51bGwgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgSmF2YUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgSmF2YUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgIHRoaXMoZHN0cmVhbSwgZW5jb2RpbmcsIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKy8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIEphdmFDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKKyAgeworICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworLyoqIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgSmF2YUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgIHRoaXMoZHN0cmVhbSwgZW5jb2RpbmcsIDEsIDEsIDQwOTYpOworICB9CisKKy8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgcHVibGljIEphdmFDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKKyAgeworICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKworLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICBSZUluaXQoZW5jb2RpbmcgPT0gbnVsbCA/IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pIDogbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSwgZW5jb2RpbmcpLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCBidWZmZXJzaXplKTsKKyAgfQorCisvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgUmVJbml0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCBidWZmZXJzaXplKTsKKyAgfQorLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICBSZUluaXQoZHN0cmVhbSwgZW5jb2RpbmcsIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQorICB7CisgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisvKiogUmVpbml0aWFsaXNlLiAqLworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7CisgIH0KKworLyoqIFJlaW5pdGlhbGlzZS4gKi8KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKKyAgeworICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRva2VuIGltYWdlIGFzIFN0cmluZyAqLworICBwdWJsaWMgU3RyaW5nIEdldEltYWdlKCkKKyAgeworICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmcG9zIC0gdG9rZW5CZWdpbiArIDEpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHN1ZmZpeCAqLworICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQorICB7CisgICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07CisKKyAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qKiBTZXQgYnVmZmVycyBiYWNrIHRvIG51bGwgd2hlbiBmaW5pc2hlZC4gKi8KKyAgcHVibGljIHZvaWQgRG9uZSgpCisgIHsKKyAgICBuZXh0Q2hhckJ1ZiA9IG51bGw7CisgICAgYnVmZmVyID0gbnVsbDsKKyAgICBidWZsaW5lID0gbnVsbDsKKyAgICBidWZjb2x1bW4gPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBhZGp1c3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgZm9yIHRoZSBzdGFydCBvZiBhIHRva2VuLgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRqdXN0QmVnaW5MaW5lQ29sdW1uKGludCBuZXdMaW5lLCBpbnQgbmV3Q29sKQorICB7CisgICAgaW50IHN0YXJ0ID0gdG9rZW5CZWdpbjsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQorICAgIHsKKyAgICAgIGxlbiA9IGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyBpbkJ1ZiArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBidWZzaXplIC0gdG9rZW5CZWdpbiArIGJ1ZnBvcyArIDEgKyBpbkJ1ZjsKKyAgICB9CisKKyAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKKyAgICBpbnQgbmV4dENvbERpZmYgPSAwLCBjb2x1bW5EaWZmID0gMDsKKworICAgIHdoaWxlIChpIDwgbGVuICYmIGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gPT0gYnVmbGluZVtrID0gKytzdGFydCAlIGJ1ZnNpemVdKQorICAgIHsKKyAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOworICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKyAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICBpZiAoaSA8IGxlbikKKyAgICB7CisgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOworICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKworICAgICAgd2hpbGUgKGkrKyA8IGxlbikKKyAgICAgIHsKKyAgICAgICAgaWYgKGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gIT0gYnVmbGluZVsrK3N0YXJ0ICUgYnVmc2l6ZV0pCisgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgfQorICAgIH0KKworICAgIGxpbmUgPSBidWZsaW5lW2pdOworICAgIGNvbHVtbiA9IGJ1ZmNvbHVtbltqXTsKKyAgfQorCit9CisvKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPTUxMTFhOTUzNTVmMmYxY2M0MDUyNDZmODI4NzAzMDk3IChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvZ2VuZXJhdGVkL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQwN2NkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gNS4wICovCisvKiBKYXZhQ0NPcHRpb25zOktFRVBfTElORV9DT0w9bnVsbCAqLworLyoKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLgorICoKKyAqIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KKyAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5CisgKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCisgKiBwYXJzZXIuCisgKgorICogWW91IGNhbiBtb2RpZnkgdGhpcyBjbGFzcyB0byBjdXN0b21pemUgeW91ciBlcnJvciByZXBvcnRpbmcKKyAqIG1lY2hhbmlzbXMgc28gbG9uZyBhcyB5b3UgcmV0YWluIHRoZSBwdWJsaWMgZmllbGRzLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgIC8qKgorICAgKiBUaGUgdmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIFNlcmlhbGl6YWJsZSBjbGFzcy4KKyAgICogSW5jcmVtZW50IG9ubHkgaWYgdGhlIDxpPnNlcmlhbGl6ZWQ8L2k+IGZvcm0gb2YgdGhlCisgICAqIGNsYXNzIGNoYW5nZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4KKyAgICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCisgICAgICAgICAgICAgICAgICAgICAgICkKKyAgeworICAgIHN1cGVyKGluaXRpYWxpc2UoY3VycmVudFRva2VuVmFsLCBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLCB0b2tlbkltYWdlVmFsKSk7CisgICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOworICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOworICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKKyAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcworICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcworICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KKyAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQorICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCisgICAqLworCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yIHdpdGggbWVzc2FnZS4gKi8KKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKKyAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCisgICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCisgICAqLworICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOworCisgIC8qKgorICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5CisgICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKKyAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgorICAgKi8KKyAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKKyAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCisgICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7CisKKyAgLyoqCisgICAqIEl0IHVzZXMgImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCisgICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCisgICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KKyAgICogZnJvbSB0aGUgcGFyc2VyKSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCisgICAqIGdldHMgZGlzcGxheWVkLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGluaXRpYWxpc2UoVG9rZW4gY3VycmVudFRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZSkgeworICAgIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoJyAnKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9ICIgIiArIHRva2VuSW1hZ2VbdG9rLmtpbmRdOworICAgICAgcmV0dmFsICs9ICIgXCIiOworICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICByZXR2YWwgKz0gIiBcIiI7CisgICAgICB0b2sgPSB0b2submV4dDsKKyAgICB9CisgICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOworICAgIHJldHZhbCArPSAiLiIgKyBlb2w7CisgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7CisgICAgfQorICAgIHJldHZhbCArPSBleHBlY3RlZC50b1N0cmluZygpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisKKyAgLyoqCisgICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KKyAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCisgICAqIHN0cmluZyBsaXRlcmFsLgorICAgKi8KKyAgc3RhdGljIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworfQorLyogSmF2YUNDIC0gT3JpZ2luYWxDaGVja3N1bT02MmJhNzJiMjE1OTcwMzQyMGQ1Y2U3MjMyYTAyMjZmYiAoZG8gbm90IGVkaXQgdGhpcyBsaW5lKSAqLwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW4uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhODVmNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDUuMCAqLworLyogSmF2YUNDT3B0aW9uczpUT0tFTl9FWFRFTkRTPSxLRUVQX0xJTkVfQ09MPW51bGwsU1VQUE9SVF9DTEFTU19WSVNJQklMSVRZX1BVQkxJQz10cnVlICovCisvKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuCisgKgorICogSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGlucHV0IHRva2VuIHN0cmVhbS4KKyAqLworCitwdWJsaWMgY2xhc3MgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgLyoqCisgICAqIFRoZSB2ZXJzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgU2VyaWFsaXphYmxlIGNsYXNzLgorICAgKiBJbmNyZW1lbnQgb25seSBpZiB0aGUgPGk+c2VyaWFsaXplZDwvaT4gZm9ybSBvZiB0aGUKKyAgICogY2xhc3MgY2hhbmdlcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKgorICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZworICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKKyAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgorICAgKi8KKyAgcHVibGljIGludCBraW5kOworCisgIC8qKiBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIFRva2VuLiAqLworICBwdWJsaWMgaW50IGJlZ2luTGluZTsKKyAgLyoqIFRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyBUb2tlbi4gKi8KKyAgcHVibGljIGludCBiZWdpbkNvbHVtbjsKKyAgLyoqIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyBUb2tlbi4gKi8KKyAgcHVibGljIGludCBlbmRMaW5lOworICAvKiogVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgVG9rZW4uICovCisgIHB1YmxpYyBpbnQgZW5kQ29sdW1uOworCisgIC8qKgorICAgKiBUaGUgc3RyaW5nIGltYWdlIG9mIHRoZSB0b2tlbi4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgaW1hZ2U7CisKKyAgLyoqCisgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbiBmcm9tIHRoZSBpbnB1dAorICAgKiBzdHJlYW0uICBJZiB0aGlzIGlzIHRoZSBsYXN0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3IgaWYgdGhlCisgICAqIHRva2VuIG1hbmFnZXIgaGFzIG5vdCByZWFkIHRva2VucyBiZXlvbmQgdGhpcyBvbmUsIHRoaXMgZmllbGQgaXMKKyAgICogc2V0IHRvIG51bGwuICBUaGlzIGlzIHRydWUgb25seSBpZiB0aGlzIHRva2VuIGlzIGFsc28gYSByZWd1bGFyCisgICAqIHRva2VuLiAgT3RoZXJ3aXNlLCBzZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCisgICAqIHRoaXMgZmllbGQuCisgICAqLworICBwdWJsaWMgVG9rZW4gbmV4dDsKKworICAvKioKKyAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGFjY2VzcyBzcGVjaWFsIHRva2VucyB0aGF0IG9jY3VyIHByaW9yIHRvIHRoaXMKKyAgICogdG9rZW4sIGJ1dCBhZnRlciB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbi4KKyAgICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggc3BlY2lhbCB0b2tlbnMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwuCisgICAqIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgc3VjaCBzcGVjaWFsIHRva2VuLCB0aGlzIGZpZWxkIHJlZmVycworICAgKiB0byB0aGUgbGFzdCBvZiB0aGVzZSBzcGVjaWFsIHRva2Vucywgd2hpY2ggaW4gdHVybiByZWZlcnMgdG8gdGhlIG5leHQKKyAgICogcHJldmlvdXMgc3BlY2lhbCB0b2tlbiB0aHJvdWdoIGl0cyBzcGVjaWFsVG9rZW4gZmllbGQsIGFuZCBzbyBvbgorICAgKiB1bnRpbCB0aGUgZmlyc3Qgc3BlY2lhbCB0b2tlbiAod2hvc2Ugc3BlY2lhbFRva2VuIGZpZWxkIGlzIG51bGwpLgorICAgKiBUaGUgbmV4dCBmaWVsZHMgb2Ygc3BlY2lhbCB0b2tlbnMgcmVmZXIgdG8gb3RoZXIgc3BlY2lhbCB0b2tlbnMgdGhhdAorICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgcmVndWxhciB0b2tlbikuICBJZiB0aGVyZQorICAgKiBpcyBubyBzdWNoIHRva2VuLCB0aGlzIGZpZWxkIGlzIG51bGwuCisgICAqLworICBwdWJsaWMgVG9rZW4gc3BlY2lhbFRva2VuOworCisgIC8qKgorICAgKiBBbiBvcHRpb25hbCBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIFRva2VuLgorICAgKiBUb2tlbnMgd2hpY2ggYXJlIG5vdCB1c2VkIGFzIHN5bnRhY3RpYyBzdWdhciB3aWxsIG9mdGVuIGNvbnRhaW4KKyAgICogbWVhbmluZ2Z1bCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHVzZWQgbGF0ZXIgb24gYnkgdGhlIGNvbXBpbGVyIG9yCisgICAqIGludGVycHJldGVyLiBUaGlzIGF0dHJpYnV0ZSB2YWx1ZSBpcyBvZnRlbiBkaWZmZXJlbnQgZnJvbSB0aGUgaW1hZ2UuCisgICAqIEFueSBzdWJjbGFzcyBvZiBUb2tlbiB0aGF0IGFjdHVhbGx5IHdhbnRzIHRvIHJldHVybiBhIG5vbi1udWxsIHZhbHVlIGNhbgorICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBhcHByb3ByaWF0ZS4KKyAgICovCisgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogTm8tYXJndW1lbnQgY29uc3RydWN0b3IKKyAgICovCisgIHB1YmxpYyBUb2tlbigpIHt9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgSW1hZ2UuCisgICAqLworICBwdWJsaWMgVG9rZW4oaW50IGtpbmQpCisgIHsKKyAgICB0aGlzKGtpbmQsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgdG9rZW4gZm9yIHRoZSBzcGVjaWZpZWQgSW1hZ2UgYW5kIEtpbmQuCisgICAqLworICBwdWJsaWMgVG9rZW4oaW50IGtpbmQsIFN0cmluZyBpbWFnZSkKKyAgeworICAgIHRoaXMua2luZCA9IGtpbmQ7CisgICAgdGhpcy5pbWFnZSA9IGltYWdlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGltYWdlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgIHsKKyAgICByZXR1cm4gaW1hZ2U7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG5ldyBUb2tlbiBvYmplY3QsIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIGlmIHlvdSB3YW50LCB5b3UKKyAgICogY2FuIGNyZWF0ZSBhbmQgcmV0dXJuIHN1YmNsYXNzIG9iamVjdHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG9mS2luZC4KKyAgICogU2ltcGx5IGFkZCB0aGUgY2FzZXMgdG8gdGhlIHN3aXRjaCBmb3IgYWxsIHRob3NlIHNwZWNpYWwgY2FzZXMuCisgICAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHN1YmNsYXNzIG9mIFRva2VuIGNhbGxlZCBJRFRva2VuIHRoYXQKKyAgICogeW91IHdhbnQgdG8gY3JlYXRlIGlmIG9mS2luZCBpcyBJRCwgc2ltcGx5IGFkZCBzb21ldGhpbmcgbGlrZSA6CisgICAqCisgICAqICAgIGNhc2UgTXlQYXJzZXJDb25zdGFudHMuSUQgOiByZXR1cm4gbmV3IElEVG9rZW4ob2ZLaW5kLCBpbWFnZSk7CisgICAqCisgICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCisgICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2Ugc2l0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kLCBTdHJpbmcgaW1hZ2UpCisgIHsKKyAgICBzd2l0Y2gob2ZLaW5kKQorICAgIHsKKyAgICAgIGRlZmF1bHQgOiByZXR1cm4gbmV3IFRva2VuKG9mS2luZCwgaW1hZ2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCkKKyAgeworICAgIHJldHVybiBuZXdUb2tlbihvZktpbmQsIG51bGwpOworICB9CisKK30KKy8qIEphdmFDQyAtIE9yaWdpbmFsQ2hlY2tzdW09YTIwNTgyODJkNzZlYmYzMjRlZDIzNjI3MmEzMzQxY2IgKGRvIG5vdCBlZGl0IHRoaXMgbGluZSkgKi8KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9nZW5lcmF0ZWQvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE5N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL2dlbmVyYXRlZC9jb20vZ2l0aHViL2phdmFwYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuTWdyRXJyb3IuamF2YSBWZXJzaW9uIDUuMCAqLworLyogSmF2YUNDT3B0aW9uczogKi8KKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YSAxLjggcGFyc2VyIGFuZCBBYnN0cmFjdCBTeW50YXggVHJlZS4KKyAqCisgKiBKYXZhIDEuOCBwYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEphdmEgMS44IHBhcnNlciBhbmQgQWJzdHJhY3QgU3ludGF4IFRyZWUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCisvKiogVG9rZW4gTWFuYWdlciBFcnJvci4gKi8KK3B1YmxpYyBjbGFzcyBUb2tlbk1nckVycm9yIGV4dGVuZHMgRXJyb3IKK3sKKworICAvKioKKyAgICogVGhlIHZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhpcyBTZXJpYWxpemFibGUgY2xhc3MuCisgICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZQorICAgKiBjbGFzcyBjaGFuZ2VzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgLyoKKyAgICogT3JkaW5hbHMgZm9yIHZhcmlvdXMgcmVhc29ucyB3aHkgYW4gRXJyb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSB0aHJvd24uCisgICAqLworCisgIC8qKgorICAgKiBMZXhpY2FsIGVycm9yIG9jY3VycmVkLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKKworICAvKioKKyAgICogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBjcmVhdGUgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgYSBzdGF0aWMgdG9rZW4gbWFuYWdlci4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0xFWEVSX0VSUk9SID0gMTsKKworICAvKioKKyAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KKyAgICovCisgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKKworICAvKioKKyAgICogRGV0ZWN0ZWQgKGFuZCBiYWlsZWQgb3V0IG9mKSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSB0b2tlbiBtYW5hZ2VyLgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKKworICAvKioKKyAgICogSW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBJdCB3aWxsIGhhdmUKKyAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KKyAgICovCisgIGludCBlcnJvckNvZGU7CisKKyAgLyoqCisgICAqIFJlcGxhY2VzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYnkgdGhlaXIgZXNjYXBlZCAob3IgdW5pY29kZSBlc2NhcGVkKQorICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBhZGRFc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGNoYXIgY2g7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgeworICAgICAgICBjYXNlIDAgOgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7CisgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKKyAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCisgICAqIFBhcmFtZXRlcnMgOgorICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2FsIGVycm9yCisgICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VycmVkCisgICAqICAgIGVycm9yTGluZSAgIDogbGluZSBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJyZWQKKyAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkCisgICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJyZWQKKyAgICogICAgY3VyY2hhciAgICAgOiB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcgorICAgKiBOb3RlOiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgbGV4aWNhbCBlcnJvciBtZXNzYWdlIGJ5IG1vZGlmeWluZyB0aGlzIG1ldGhvZC4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIExleGljYWxFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKSB7CisgICAgcmV0dXJuKCJMZXhpY2FsIGVycm9yIGF0IGxpbmUgIiArCisgICAgICAgICAgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKworICAgICAgICAgIGVycm9yQ29sdW1uICsgIi4gIEVuY291bnRlcmVkOiAiICsKKyAgICAgICAgICAoRU9GU2VlbiA/ICI8RU9GPiAiIDogKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArIChpbnQpY3VyQ2hhciArICIpLCAiKSArCisgICAgICAgICAgImFmdGVyIDogXCIiICsgYWRkRXNjYXBlcyhlcnJvckFmdGVyKSArICJcIiIpOworICB9CisKKyAgLyoqCisgICAqIFlvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgbWVzc2FnZXMuCisgICAqIEZvciBleGFtcGxlLCBjYXNlcyBsaWtlIExPT1BfREVURUNURUQgYW5kIElOVkFMSURfTEVYSUNBTF9TVEFURSBhcmUgbm90CisgICAqIG9mIGVuZC11c2VycyBjb25jZXJuLCBzbyB5b3UgY2FuIHJldHVybiBzb21ldGhpbmcgbGlrZSA6CisgICAqCisgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCisgICAqCisgICAqIGZyb20gdGhpcyBtZXRob2QgZm9yIHN1Y2ggY2FzZXMgaW4gdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIHBhcnNlci4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICB9CisKKyAgLyoKKyAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCisgICAqLworCisgIC8qKiBObyBhcmcgY29uc3RydWN0b3IuICovCisgIHB1YmxpYyBUb2tlbk1nckVycm9yKCkgeworICB9CisKKyAgLyoqIENvbnN0cnVjdG9yIHdpdGggbWVzc2FnZSBhbmQgcmVhc29uLiAqLworICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IHJlYXNvbikgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKKyAgfQorCisgIC8qKiBGdWxsIENvbnN0cnVjdG9yLiAqLworICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyLCBpbnQgcmVhc29uKSB7CisgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOworICB9Cit9CisvKiBKYXZhQ0MgLSBPcmlnaW5hbENoZWNrc3VtPWYwNmM3ZTk2NGI1YzEzYTczMjMzN2MyZjNmYjRmODM2IChkbyBub3QgZWRpdCB0aGlzIGxpbmUpICovCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUSGVscGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvQVNUSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3MDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9BU1RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5RdWFsaWZpZWROYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlJlZmVyZW5jZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlZvaWRUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLlByaW1pdGl2ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBoZWxwcyB0byBjb25zdHJ1Y3QgbmV3IG5vZGVzLgorICogCisgKiBAYXV0aG9yIErDumxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBU1RIZWxwZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmltaXRpdmVUeXBlIEJZVEVfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5CeXRlKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBTSE9SVF9UWVBFID0gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLlNob3J0KTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBJTlRfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5JbnQpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmltaXRpdmVUeXBlIExPTkdfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5Mb25nKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBGTE9BVF9UWVBFID0gbmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlLkZsb2F0KTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBET1VCTEVfVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5Eb3VibGUpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmltaXRpdmVUeXBlIEJPT0xFQU5fVFlQRSA9IG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZS5Cb29sZWFuKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJpbWl0aXZlVHlwZSBDSEFSX1RZUEUgPSBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmUuQ2hhcik7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZvaWRUeXBlIFZPSURfVFlQRSA9IG5ldyBWb2lkVHlwZSgpOworCisgICAgcHJpdmF0ZSBBU1RIZWxwZXIoKSB7CisgICAgICAgIC8vIG5vcAorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE5hbWVFeHByfSBmcm9tIGEgcXVhbGlmaWVkIG5hbWUuPGJyPgorICAgICAqIFRoZSBxdWFsaWZpZWQgbmFtZSBjYW4gY29udGFpbnMgIi4iIChkb3QpIGNoYXJhY3RlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUKKyAgICAgKiAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lCisgICAgICogQHJldHVybiBpbnN0YW5jZW9mIHtAbGluayBOYW1lRXhwcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5hbWVFeHByIGNyZWF0ZU5hbWVFeHByKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7CisgICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gcXVhbGlmaWVkTmFtZS5zcGxpdCgiXFwuIik7CisgICAgICAgIE5hbWVFeHByIHJldCA9IG5ldyBOYW1lRXhwcihzcGxpdFswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IG5ldyBRdWFsaWZpZWROYW1lRXhwcihyZXQsIHNwbGl0W2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBhcmFtZXRlcn0uCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBQYXJhbWV0ZXJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXIgY3JlYXRlUGFyYW1ldGVyKFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIodHlwZSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKG5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVycworICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0eXBlCisgICAgICogQHBhcmFtIHZhcmlhYmxlCisgICAgICogICAgICAgICAgICB2YXJpYWJsZSBkZWNsYXJhdG9yCisgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkRGVjbGFyYXRpb24gY3JlYXRlRmllbGREZWNsYXJhdGlvbihpbnQgbW9kaWZpZXJzLCBUeXBlIHR5cGUsIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSkgeworICAgICAgICBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCk7CisgICAgICAgIHZhcmlhYmxlcy5hZGQodmFyaWFibGUpOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIHJldCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKG1vZGlmaWVycywgdHlwZSwgdmFyaWFibGVzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVycworICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0eXBlCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIGZpZWxkIG5hbWUKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmllbGREZWNsYXJhdGlvbiBjcmVhdGVGaWVsZERlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBuZXcgVmFyaWFibGVEZWNsYXJhdG9ySWQobmFtZSk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoaWQpOworICAgICAgICByZXR1cm4gY3JlYXRlRmllbGREZWNsYXJhdGlvbihtb2RpZmllcnMsIHR5cGUsIHZhcmlhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdHlwZQorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBuYW1lCisgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBjcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihUeXBlIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+KCk7CisgICAgICAgIHZhcnMuYWRkKG5ldyBWYXJpYWJsZURlY2xhcmF0b3IobmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKG5hbWUpKSk7CisgICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIodHlwZSwgdmFycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QuIFRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgd2lsbCBiZQorICAgICAqIGluaXRpYWxpemVkIGlmIGl0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgIG1ldGhvZAorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYXJhbWV0ZXIoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kLCBQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOworICAgICAgICAgICAgbWV0aG9kLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBhcmd1bWVudCB0byB0aGUgbWV0aG9kIGNhbGwuIFRoZSBsaXN0IG9mIGFyZ3VtZW50cyB3aWxsIGJlCisgICAgICogaW5pdGlhbGl6ZWQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGNhbGwKKyAgICAgKiAgICAgICAgICAgIG1ldGhvZCBjYWxsCisgICAgICogQHBhcmFtIGFyZworICAgICAqICAgICAgICAgICAgYXJndW1lbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQXJndW1lbnQoTWV0aG9kQ2FsbEV4cHIgY2FsbCwgRXhwcmVzc2lvbiBhcmcpIHsKKyAgICAgICAgTGlzdDxFeHByZXNzaW9uPiBhcmdzID0gY2FsbC5nZXRBcmdzKCk7CisgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIGFyZ3MgPSBuZXcgQXJyYXlMaXN0PEV4cHJlc3Npb24+KCk7CisgICAgICAgICAgICBjYWxsLnNldEFyZ3MoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgYXJncy5hZGQoYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiB0eXBlIGRlY2xhcmF0aW9uIHRvIHRoZSBjb21waWxhdGlvbiB1bml0LiBUaGUgbGlzdCBvZgorICAgICAqIHR5cGVzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGN1CisgICAgICogICAgICAgICAgICBjb21waWxhdGlvbiB1bml0CisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHR5cGUgZGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVHlwZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBjdSwgVHlwZURlY2xhcmF0aW9uIHR5cGUpIHsKKyAgICAgICAgTGlzdDxUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gY3UuZ2V0VHlwZXMoKTsKKyAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlRGVjbGFyYXRpb24+KCk7CisgICAgICAgICAgICBjdS5zZXRUeXBlcyh0eXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgdHlwZXMuYWRkKHR5cGUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUmVmZXJlbmNlVHlwZX0gZm9yIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UKKyAgICAgKiBAcGFyYW0gYXJyYXlDb3VudAorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGFycmF5cyBvciA8Y29kZT4wPC9jb2RlPiBpZiBpcyBub3QgYSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlb2Yge0BsaW5rIFJlZmVyZW5jZVR5cGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZWZlcmVuY2VUeXBlIGNyZWF0ZVJlZmVyZW5jZVR5cGUoU3RyaW5nIG5hbWUsIGludCBhcnJheUNvdW50KSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmZXJlbmNlVHlwZShuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUobmFtZSksIGFycmF5Q291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFJlZmVyZW5jZVR5cGV9IGZvciB0aGUgZ2l2ZW4gcHJpbWl0aXZlIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHByaW1pdGl2ZSB0eXBlCisgICAgICogQHBhcmFtIGFycmF5Q291bnQKKyAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBhcnJheXMgb3IgPGNvZGU+MDwvY29kZT4gaWYgaXMgbm90IGEgYXJyYXkuCisgICAgICogQHJldHVybiBpbnN0YW5jZW9mIHtAbGluayBSZWZlcmVuY2VUeXBlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVmZXJlbmNlVHlwZSBjcmVhdGVSZWZlcmVuY2VUeXBlKFByaW1pdGl2ZVR5cGUgdHlwZSwgaW50IGFycmF5Q291bnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VUeXBlKHR5cGUsIGFycmF5Q291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIHN0YXRlbWVudCB0byB0aGUgc3BlY2lmaWVkIGJsb2NrLiBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzCisgICAgICogd2lsbCBiZSBpbml0aWFsaXplZCBpZiBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmxvY2sgdG8gaGF2ZSBleHByZXNzaW9uIGFkZGVkIHRvCisgICAgICogQHBhcmFtIHN0bXQgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU3RtdChCbG9ja1N0bXQgYmxvY2ssIFN0YXRlbWVudCBzdG10KSB7CisgICAgICAgIExpc3Q8U3RhdGVtZW50PiBzdG10cyA9IGJsb2NrLmdldFN0bXRzKCk7CisgICAgICAgIGlmIChzdG10cyA9PSBudWxsKSB7CisgICAgICAgICAgICBzdG10cyA9IG5ldyBBcnJheUxpc3Q8U3RhdGVtZW50PigpOworICAgICAgICAgICAgYmxvY2suc2V0U3RtdHMoc3RtdHMpOworICAgICAgICB9CisgICAgICAgIHN0bXRzLmFkZChzdG10KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBleHByZXNzaW9uIHRvIHRoZSBzcGVjaWZpZWQgYmxvY2suIFRoZSBsaXN0IG9mIHN0YXRlbWVudHMKKyAgICAgKiB3aWxsIGJlIGluaXRpYWxpemVkIGlmIGl0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBibG9jayB0byBoYXZlIGV4cHJlc3Npb24gYWRkZWQgdG8KKyAgICAgKiBAcGFyYW0gZXhwciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdG10KEJsb2NrU3RtdCBibG9jaywgRXhwcmVzc2lvbiBleHByKSB7CisgICAgICAgIGFkZFN0bXQoYmxvY2ssIG5ldyBFeHByZXNzaW9uU3RtdChleHByKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gdG8gdGhlIHNwZWNpZmllZCB0eXBlLiBUaGUgbGlzdCBvZiBtZW1iZXJzCisgICAgICogd2lsbCBiZSBpbml0aWFsaXplZCBpZiBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdHlwZSBkZWNsYXJhdGlvbgorICAgICAqIEBwYXJhbSBkZWNsCisgICAgICogICAgICAgICAgICBtZW1iZXIgZGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVtYmVyKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBCb2R5RGVjbGFyYXRpb24gZGVjbCkgeworICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgICAgICBpZiAobWVtYmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxCb2R5RGVjbGFyYXRpb24+KCk7CisgICAgICAgICAgICB0eXBlLnNldE1lbWJlcnMobWVtYmVycyk7CisgICAgICAgIH0KKyAgICAgICAgbWVtYmVycy5hZGQoZGVjbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8TiBleHRlbmRzIE5vZGU+IExpc3Q8Tj4gZ2V0Tm9kZXNCeVR5cGUoTm9kZSBjb250YWluZXIsIENsYXNzPE4+IGNsYXp6KSB7CisgICAgICAgIExpc3Q8Tj4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE4+KCk7CisgICAgICAgIGZvciAoTm9kZSBjaGlsZCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbk5vZGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGF6ei5pc0luc3RhbmNlKGNoaWxkKSkgeworICAgICAgICAgICAgICAgIG5vZGVzLmFkZChjbGF6ei5jYXN0KGNoaWxkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2Rlcy5hZGRBbGwoZ2V0Tm9kZXNCeVR5cGUoY2hpbGQsIGNsYXp6KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFQYXJzZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxMjU1MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyLmphdmEKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb25VdGlscy5hcmVJbk9yZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkFTVFBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c1BhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy8gRklYTUUgdGhpcyBmaWxlIGRvZXMgbm90IHNlZW0gdG8gYmUgZ2VuZXJhdGVkIGJ5IGphdmFjYy4gSXMgdGhlIGRvYyB3cm9uZywgb3IgdGhlIGphdmFjYyBjb25maWc/CisvKioKKyAqIDxwPgorICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgamF2YWNjLCBkbyBub3QgZWRpdC4KKyAqIDwvcD4KKyAqIDxwPgorICogUGFyc2UgSmF2YSAxLjUgc291cmNlIGNvZGUgYW5kIGNyZWF0ZXMgQWJzdHJhY3QgU3ludGF4IFRyZWUgY2xhc3Nlcy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIErDumxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXZhUGFyc2VyIHsKKyAgICBwcml2YXRlIEphdmFQYXJzZXIoKSB7CisgICAgICAgIC8vIGhpZGUgdGhlIGNvbnN0cnVjdG9yCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfZG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZWRpbmdFbXB0eUxpbmVzID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gX2RvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9kb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24oYm9vbGVhbiBkb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbikgeworICAgICAgICBfZG9Ob3RDb25zaWRlckFubm90YXRpb25zQXNOb2RlU3RhcnRGb3JDb2RlQXR0cmlidXRpb24gPSBkb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZWRpbmdFbXB0eUxpbmVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZWRpbmdFbXB0eUxpbmVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VlZGluZ0VtcHR5TGluZXMoYm9vbGVhbiBkb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VlZGluZ0VtcHR5TGluZXMpCisgICAgeworICAgICAgICBfZG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZWRpbmdFbXB0eUxpbmVzID0gZG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZWRpbmdFbXB0eUxpbmVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICByZXR1cm4gcGFyc2UoaW4sZW5jb2RpbmcsdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJbnB1dFN0cmVhbX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHBhcmFtIGVuY29kaW5nCisgICAgICogICAgICAgICAgICBlbmNvZGluZyBvZiB0aGUgc291cmNlIGNvZGUKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nLCBib29sZWFuIGNvbnNpZGVyQ29tbWVudHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBjb2RlID0gU291cmNlc0hlbHBlci5zdHJlYW1Ub1N0cmluZyhpbiwgZW5jb2RpbmcpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4xID0gU291cmNlc0hlbHBlci5zdHJpbmdUb1N0cmVhbShjb2RlLCBlbmNvZGluZyk7CisgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQVNUUGFyc2VyKGluMSwgZW5jb2RpbmcpLkNvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICAgICAgaWYgKGNvbnNpZGVyQ29tbWVudHMpeworICAgICAgICAgICAgICAgIGluc2VydENvbW1lbnRzKGN1LGNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGN1OworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIHtAbGluayBJbnB1dFN0cmVhbX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgeworICAgICAgICByZXR1cm4gcGFyc2UoaW4sIG51bGwsdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgZW5jb2RpbmcpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGZpbGUsZW5jb2RpbmcsdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIGEge0BsaW5rIEZpbGV9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZQorICAgICAqICAgICAgICAgICAge0BsaW5rIEZpbGV9IGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEBwYXJhbSBlbmNvZGluZworICAgICAqICAgICAgICAgICAgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIFN0cmluZyBlbmNvZGluZywgYm9vbGVhbiBjb25zaWRlckNvbW1lbnRzKQorICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2UoaW4sIGVuY29kaW5nLCBjb25zaWRlckNvbW1lbnRzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSB7QGxpbmsgRmlsZX0gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlCisgICAgICogICAgICAgICAgICB7QGxpbmsgRmlsZX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGZpbGUsIG51bGwsdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgUmVhZGVyIHJlYWRlciwgYm9vbGVhbiBjb25zaWRlckNvbW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNvZGUgPSBTb3VyY2VzSGVscGVyLnJlYWRlclRvU3RyaW5nKHJlYWRlcik7CisgICAgICAgICAgICBSZWFkZXIgcmVhZGVyMSA9IFNvdXJjZXNIZWxwZXIuc3RyaW5nVG9SZWFkZXIoY29kZSk7CisgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQVNUUGFyc2VyKHJlYWRlcjEpLkNvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICAgICAgaWYgKGNvbnNpZGVyQ29tbWVudHMpeworICAgICAgICAgICAgICAgIGluc2VydENvbW1lbnRzKGN1LGNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGN1OworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGJsb2NrIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQmxvY2tTdG10fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmxvY2tTdGF0ZW1lbnQKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBibG9jayBjb2RlCisgICAgICogQHJldHVybiBCbG9ja1N0bXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIGJsb2NrCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmxvY2tTdG10IHBhcnNlQmxvY2soZmluYWwgU3RyaW5nIGJsb2NrU3RhdGVtZW50KQorICAgICAgICAgICAgeworICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKGJsb2NrU3RhdGVtZW50KTsKKyAgICAgICAgQmxvY2tTdG10IHJlc3VsdCA9IG5ldyBBU1RQYXJzZXIoc3IpLkJsb2NrKCk7CisgICAgICAgIHNyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIHN0YXRlbWVudCBjb250YWluZWQgaW4gYSB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIFN0YXRlbWVudH0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlbWVudAorICAgICAqICAgICAgICAgICAge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIHN0YXRlbWVudCBjb2RlCisgICAgICogQHJldHVybiBTdGF0ZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHN0YXRlbWVudAorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0YXRlbWVudCBwYXJzZVN0YXRlbWVudChmaW5hbCBTdHJpbmcgc3RhdGVtZW50KSB7CisgICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc3RhdGVtZW50KTsKKyAgICAgICAgU3RhdGVtZW50IHN0bXQgPSBuZXcgQVNUUGFyc2VyKHNyKS5TdGF0ZW1lbnQoKTsKKyAgICAgICAgc3IuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHN0bXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGltcG9ydCBjb250YWluZWQgaW4gYSB7QGxpbmsgU3RyaW5nfSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIEltcG9ydERlY2xhcmF0aW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1wb3J0RGVjbGFyYXRpb24KKyAgICAgKiAgICAgICAgICAgIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBpbXBvcnQgY29kZQorICAgICAqIEByZXR1cm4gSW1wb3J0RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGltcG9ydCBkZWNsYXJhdGlvbgorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltcG9ydERlY2xhcmF0aW9uIHBhcnNlSW1wb3J0KGZpbmFsIFN0cmluZyBpbXBvcnREZWNsYXJhdGlvbikgeworICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKGltcG9ydERlY2xhcmF0aW9uKTsKKyAgICAgICAgSW1wb3J0RGVjbGFyYXRpb24gaWQgPSBuZXcgQVNUUGFyc2VyKHNyKS5JbXBvcnREZWNsYXJhdGlvbigpOworICAgICAgICBzci5jbG9zZSgpOworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGV4cHJlc3Npb24gY29udGFpbmVkIGluIGEge0BsaW5rIFN0cmluZ30gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBFeHByZXNzaW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbgorICAgICAqICAgICAgICAgICAge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGV4cHJlc3Npb24KKyAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGV4cHJlc3Npb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeHByZXNzaW9uIHBhcnNlRXhwcmVzc2lvbihmaW5hbCBTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKGV4cHJlc3Npb24pOworICAgICAgICBFeHByZXNzaW9uIGUgPSBuZXcgQVNUUGFyc2VyKHNyKS5FeHByZXNzaW9uKCk7CisgICAgICAgIHNyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBhbm5vdGF0aW9uIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQW5ub3RhdGlvbkV4cHJ9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uCisgICAgICogICAgICAgICAgICB7QGxpbmsgU3RyaW5nfSBjb250YWluaW5nIEphdmEgYW5ub3RhdGlvbgorICAgICAqIEByZXR1cm4gQW5ub3RhdGlvbkV4cHIgcmVwcmVzZW50aW5nIHRoZSBKYXZhIGFubm90YXRpb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRXhwciBwYXJzZUFubm90YXRpb24oZmluYWwgU3RyaW5nIGFubm90YXRpb24pIHsKKyAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihhbm5vdGF0aW9uKTsKKyAgICAgICAgQW5ub3RhdGlvbkV4cHIgYWUgPSBuZXcgQVNUUGFyc2VyKHNyKS5Bbm5vdGF0aW9uKCk7CisgICAgICAgIHNyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBhZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgYm9keSBkZWNsYXJhdGlvbihlLmcgZmllbGRzIG9yIG1ldGhvZHMpIGNvbnRhaW5lZCBpbiBhCisgICAgICoge0BsaW5rIFN0cmluZ30gYW5kIHJldHVybnMgYSB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9keQorICAgICAqICAgICAgICAgICAge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGJvZHkgZGVjbGFyYXRpb24KKyAgICAgKiBAcmV0dXJuIEJvZHlEZWNsYXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIEphdmEgYW5ub3RhdGlvbgorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJvZHlEZWNsYXJhdGlvbiBwYXJzZUJvZHlEZWNsYXJhdGlvbihmaW5hbCBTdHJpbmcgYm9keSkgeworICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKGJvZHkpOworICAgICAgICBCb2R5RGVjbGFyYXRpb24gYmQgPSBuZXcgQVNUUGFyc2VyKHNyKS5Bbm5vdGF0aW9uQm9keURlY2xhcmF0aW9uKCk7CisgICAgICAgIHNyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBiZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tZW50cyBhcmUgYXR0cmlidXRlZCB0byB0aGUgdGhpbmcgdGhlIGNvbW1lbnQgYW5kIGFyZSByZW1vdmVkIGZyb20KKyAgICAgKiBhbGxDb21tZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydENvbW1lbnRzSW5DdShDb21waWxhdGlvblVuaXQgY3UsIENvbW1lbnRzQ29sbGVjdGlvbiBjb21tZW50c0NvbGxlY3Rpb24peworICAgICAgICBpZiAoY29tbWVudHNDb2xsZWN0aW9uLnNpemUoKT09MCkgcmV0dXJuOworCisgICAgICAgIC8vIEkgc2hvdWxkIHNvcnQgYWxsIHRoZSBkaXJlY3QgY2hpbGRyZW4gYW5kIHRoZSBjb21tZW50cywgaWYgYSBjb21tZW50IGlzIHRoZSBmaXJzdCB0aGluZyB0aGVuIGl0CisgICAgICAgIC8vIGEgY29tbWVudCB0byB0aGUgQ29tcGlsYXRpb25Vbml0CisgICAgICAgIC8vIEZJWE1FIGlmIHRoZXJlIGlzIG5vIHBhY2thZ2UgaXQgY291bGQgYmUgYWxzbyBhIGNvbW1lbnQgdG8gdGhlIGZvbGxvd2luZyBjbGFzcy4uLgorICAgICAgICAvLyBzbyBJIGNvdWxkIHVzZSBzb21lIGhldXJpc3RpY3MgaW4gdGhlc2UgY2FzZXMgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcworCisgICAgICAgIExpc3Q8Q29tbWVudD4gY29tbWVudHMgPSBjb21tZW50c0NvbGxlY3Rpb24uZ2V0QWxsKCk7CisgICAgICAgIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjb21tZW50cyk7CisgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGRyZW4gPSBjdS5nZXRDaGlsZHJlbk5vZGVzKCk7CisgICAgICAgIFBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbihjaGlsZHJlbik7CisKKyAgICAgICAgaWYgKGN1LmdldFBhY2thZ2UoKSE9bnVsbCAmJiAoY2hpbGRyZW4uc2l6ZSgpPT0wIHx8IFBvc2l0aW9uVXRpbHMuYXJlSW5PcmRlcihjb21tZW50cy5nZXQoMCksIGNoaWxkcmVuLmdldCgwKSkpKXsKKyAgICAgICAgICAgIGN1LnNldENvbW1lbnQoY29tbWVudHMuZ2V0KDApKTsKKyAgICAgICAgICAgIGNvbW1lbnRzLnJlbW92ZSgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGluc2VydENvbW1lbnRzSW5Ob2RlKGN1LGNvbW1lbnRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGF0dHJpYnV0ZUxpbmVDb21tZW50VG9Ob2RlT3JDaGlsZChOb2RlIG5vZGUsIExpbmVDb21tZW50IGxpbmVDb21tZW50KQorICAgIHsKKyAgICAgICAgLy8gVGhlIG5vZGUgc3RhcnQgYW5kIGVuZCBhdCB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjb21tZW50LAorICAgICAgICAvLyBsZXQncyBnaXZlIHRvIGl0IHRoZSBjb21tZW50CisgICAgICAgIGlmIChub2RlLmdldEJlZ2luTGluZSgpPT1saW5lQ29tbWVudC5nZXRCZWdpbkxpbmUoKSAmJiAhbm9kZS5oYXNDb21tZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vZGUuc2V0Q29tbWVudChsaW5lQ29tbWVudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRyeSB3aXRoIGFsbCB0aGUgY2hpbGRyZW4sIHNvcnRlZCBieSByZXZlcnNlIHBvc2l0aW9uIChzbyB0aGUKKyAgICAgICAgICAgIC8vIGZpcnN0IG9uZSBpcyB0aGUgbmVhcmVzdCB0byB0aGUgY29tbWVudAorICAgICAgICAgICAgTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICBjaGlsZHJlbi5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkpOworICAgICAgICAgICAgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoY2hpbGRyZW4pOworCisgICAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBjaGlsZHJlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlTGluZUNvbW1lbnRUb05vZGVPckNoaWxkKGNoaWxkLCBsaW5lQ29tbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHRyeSB0byBhdHRyaWJ1dGVzIHRoZSBub2RlcyByZWNlaXZlZCB0byBjaGlsZCBvZiB0aGUgbm9kZS4KKyAgICAgKiBJdCByZXR1cm5zIHRoZSBub2RlIHRoYXQgd2VyZSBub3QgYXR0cmlidXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydENvbW1lbnRzSW5Ob2RlKE5vZGUgbm9kZSwgTGlzdDxDb21tZW50PiBjb21tZW50c1RvQXR0cmlidXRlKXsKKyAgICAgICAgaWYgKGNvbW1lbnRzVG9BdHRyaWJ1dGUuc2l6ZSgpPT0wKSByZXR1cm47CisKKyAgICAgICAgLy8gdGhlIGNvbW1lbnRzIGNhbjoKKyAgICAgICAgLy8gMSkgSW5zaWRlIG9uZSBvZiB0aGUgY2hpbGQsIHRoZW4gaXQgaXMgdGhlIGNoaWxkIHRoYXQgaGF2ZSB0byBhc3NvY2lhdGUgdGhlbQorICAgICAgICAvLyAyKSBJZiB0aGV5IGFyZSBub3QgaW5zaWRlIGEgY2hpbGQgdGhleSBjb3VsZCBiZSBwcmVjZWVkaW5nIG5vdGhpbmcsIGEgY29tbWVudCBvciBhIGNoaWxkCisgICAgICAgIC8vICAgIGlmIHRoZXkgcHJlY2VlZCBhIGNoaWxkIHRoZXkgYXJlIGFzc2lnbmVkIHRvIGl0LCBvdGhlcndlaXNlIHRoZXkgcmVtYWluICJvcnBoYW5zIgorCisgICAgICAgIExpc3Q8Tm9kZT4gY2hpbGRyZW4gPSBub2RlLmdldENoaWxkcmVuTm9kZXMoKTsKKyAgICAgICAgUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uKGNoaWxkcmVuKTsKKworICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBjaGlsZHJlbil7CisgICAgICAgICAgICBMaXN0PENvbW1lbnQ+IGNvbW1lbnRzSW5zaWRlQ2hpbGQgPSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpOworICAgICAgICAgICAgZm9yIChDb21tZW50IGMgOiBjb21tZW50c1RvQXR0cmlidXRlKXsKKyAgICAgICAgICAgICAgICBpZiAoUG9zaXRpb25VdGlscy5ub2RlQ29udGFpbnMoY2hpbGQsIGMsIF9kb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbikpeworICAgICAgICAgICAgICAgICAgICBjb21tZW50c0luc2lkZUNoaWxkLmFkZChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21tZW50c1RvQXR0cmlidXRlLnJlbW92ZUFsbChjb21tZW50c0luc2lkZUNoaWxkKTsKKyAgICAgICAgICAgIGluc2VydENvbW1lbnRzSW5Ob2RlKGNoaWxkLGNvbW1lbnRzSW5zaWRlQ2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSSBjYW4gYXR0cmlidXRlIGluIGxpbmUgY29tbWVudHMgdG8gZWxlbWVudHMgcHJlY2VlZGluZyB0aGVtLCBpZiB0aGVyZQorICAgICAgICAvLyBpcyBzb21ldGhpbmcgY29udGFpbmVkIGluIHRoZWlyIGxpbmUKKyAgICAgICAgTGlzdDxDb21tZW50PiBhdHRyaWJ1dGVkQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpOworICAgICAgICBmb3IgKENvbW1lbnQgY29tbWVudCA6IGNvbW1lbnRzVG9BdHRyaWJ1dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb21tZW50LmlzTGluZUNvbW1lbnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBjaGlsZHJlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRFbmRMaW5lKCk9PWNvbW1lbnQuZ2V0QmVnaW5MaW5lKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVMaW5lQ29tbWVudFRvTm9kZU9yQ2hpbGQoY2hpbGQsIGNvbW1lbnQuYXNMaW5lQ29tbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVkQ29tbWVudHMuYWRkKGNvbW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXQgdGhpcyBwb2ludCBJIGNyZWF0ZSBhbiBvcmRlcmVkIGxpc3Qgb2YgYWxsIHJlbWFpbmluZyBjb21tZW50cyBhbmQgY2hpbGRyZW4KKyAgICAgICAgQ29tbWVudCBwcmV2aW91c0NvbW1lbnQgPSBudWxsOworICAgICAgICBhdHRyaWJ1dGVkQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpOworICAgICAgICBMaXN0PE5vZGU+IGNoaWxkcmVuQW5kQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxOb2RlPigpOworICAgICAgICBjaGlsZHJlbkFuZENvbW1lbnRzLmFkZEFsbChjaGlsZHJlbik7CisgICAgICAgIGNoaWxkcmVuQW5kQ29tbWVudHMuYWRkQWxsKGNvbW1lbnRzVG9BdHRyaWJ1dGUpOworICAgICAgICBQb3NpdGlvblV0aWxzLnNvcnRCeUJlZ2luUG9zaXRpb24oY2hpbGRyZW5BbmRDb21tZW50cywgX2RvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uKTsKKworICAgICAgICBmb3IgKE5vZGUgdGhpbmcgOiBjaGlsZHJlbkFuZENvbW1lbnRzKXsKKyAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENvbW1lbnQpeworICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tbWVudCA9IChDb21tZW50KXRoaW5nOworICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNDb21tZW50LmlzT3JwaGFuKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29tbWVudCAhPSBudWxsICYmICF0aGluZy5oYXNDb21tZW50KCkpeworICAgICAgICAgICAgICAgICAgICBpZiAoIV9kb05vdEFzc2lnbkNvbW1lbnRzUHJlY2VlZGluZ0VtcHR5TGluZXMgfHwgIXRoZXJlQXJlTGluZXNCZXR3ZWVuKHByZXZpb3VzQ29tbWVudCwgdGhpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5zZXRDb21tZW50KHByZXZpb3VzQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVkQ29tbWVudHMuYWRkKHByZXZpb3VzQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29tbWVudHNUb0F0dHJpYnV0ZS5yZW1vdmVBbGwoYXR0cmlidXRlZENvbW1lbnRzKTsKKworICAgICAgICAvLyBhbGwgdGhlIHJlbWFpbmluZyBhcmUgb3JwaGFuIG5vZGVzCisgICAgICAgIGZvciAoQ29tbWVudCBjIDogY29tbWVudHNUb0F0dHJpYnV0ZSl7CisgICAgICAgICAgICBpZiAoYy5pc09ycGhhbigpKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hZGRPcnBoYW5Db21tZW50KGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0aGVyZUFyZUxpbmVzQmV0d2VlbihOb2RlIGEsIE5vZGUgYikKKyAgICB7CisgICAgICAgIGlmICghUG9zaXRpb25VdGlscy5hcmVJbk9yZGVyKGEsIGIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhlcmVBcmVMaW5lc0JldHdlZW4oYiwgYSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuZE9mQSA9IGEuZ2V0RW5kTGluZSgpOworICAgICAgICByZXR1cm4gYi5nZXRCZWdpbkxpbmUoKT4oYS5nZXRFbmRMaW5lKCkrMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnNlcnRDb21tZW50cyhDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBjb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb21tZW50c1BhcnNlciBjb21tZW50c1BhcnNlciA9IG5ldyBDb21tZW50c1BhcnNlcigpOworICAgICAgICBDb21tZW50c0NvbGxlY3Rpb24gYWxsQ29tbWVudHMgPSBjb21tZW50c1BhcnNlci5wYXJzZShjb2RlKTsKKworICAgICAgICBpbnNlcnRDb21tZW50c0luQ3UoY3UsYWxsQ29tbWVudHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Bvc2l0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUG9zaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI0MTFjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Bvc2l0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCitwdWJsaWMgY2xhc3MgUG9zaXRpb24geworICAgIHByaXZhdGUgaW50IGxpbmU7CisgICAgcHJpdmF0ZSBpbnQgY29sdW1uOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQb3NpdGlvbiBBQlNPTFVURV9TVEFSVCA9IG5ldyBQb3NpdGlvbihOb2RlLkFCU09MVVRFX0JFR0lOX0xJTkUsLTEpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUG9zaXRpb24gQUJTT0xVVEVfRU5EID0gbmV3IFBvc2l0aW9uKE5vZGUuQUJTT0xVVEVfRU5EX0xJTkUsLTEpOworCisgICAgcHVibGljIHN0YXRpYyBQb3NpdGlvbiBiZWdpbk9mKE5vZGUgbm9kZSl7CisgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24obm9kZS5nZXRCZWdpbkxpbmUoKSxub2RlLmdldEJlZ2luQ29sdW1uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUG9zaXRpb24gZW5kT2YoTm9kZSBub2RlKXsKKyAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihub2RlLmdldEVuZExpbmUoKSxub2RlLmdldEVuZENvbHVtbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9zaXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4peworICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOworICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExpbmUoKXsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbigpeworICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Bvc2l0aW9uVXRpbHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qb3NpdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkZjgxNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9Qb3NpdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhYmxlTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CisKK2ltcG9ydCBqYXZhLmxhbmcuT3ZlcnJpZGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnNpZ251bTsKKworcHVibGljIGZpbmFsIGNsYXNzIFBvc2l0aW9uVXRpbHMgeworCisgICAgcHJpdmF0ZSBQb3NpdGlvblV0aWxzKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgTm9kZT4gdm9pZCBzb3J0QnlCZWdpblBvc2l0aW9uKExpc3Q8VD4gbm9kZXMpeworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKG5vZGVzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5vZGU+IHZvaWQgc29ydEJ5QmVnaW5Qb3NpdGlvbihMaXN0PFQ+IG5vZGVzLCBmaW5hbCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpeworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG5vZGVzLCBuZXcgQ29tcGFyYXRvcjxOb2RlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE5vZGUgbzEsIE5vZGUgbzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpb25VdGlscy5jb21wYXJlKG8xLCBvMiwgaWdub3JpbmdBbm5vdGF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVJbk9yZGVyKE5vZGUgYSwgTm9kZSBiKXsKKyAgICAgICAgcmV0dXJuIGFyZUluT3JkZXIoYSwgYiwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVJbk9yZGVyKE5vZGUgYSwgTm9kZSBiLCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpeworICAgICAgICByZXR1cm4gY29tcGFyZShhLCBiLCBpZ25vcmluZ0Fubm90YXRpb25zKSA8PSAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKE5vZGUgYSwgTm9kZSBiLCBib29sZWFuIGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgaWYgKGlnbm9yaW5nQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGludCBzaWduTGluZSA9IHNpZ251bShiZWdpbkxpbmVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5MaW5lV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihiKSk7CisgICAgICAgICAgICBpZiAoc2lnbkxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzaWdudW0oYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGEpIC0gYmVnaW5Db2x1bW5XaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9uKGIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25MaW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHNpZ25MaW5lID0gc2lnbnVtKCBhLmdldEJlZ2luTGluZSgpIC0gYi5nZXRCZWdpbkxpbmUoKSApOworICAgICAgICBpZiAoc2lnbkxpbmUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNpZ251bShhLmdldEJlZ2luQ29sdW1uKCkgLSBiLmdldEJlZ2luQ29sdW1uKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNpZ25MaW5lOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRXhwciBnZXRMYXN0QW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBbm5vdGFibGVOb2RlKXsKKyAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbmV3IExpbmtlZExpc3Q8QW5ub3RhdGlvbkV4cHI+KCk7CisgICAgICAgICAgICBhbm5vdGF0aW9ucy5hZGRBbGwoKChBbm5vdGFibGVOb2RlKSBub2RlKS5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5zaXplKCk9PTApeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc29ydEJ5QmVnaW5Qb3NpdGlvbihhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnMuZ2V0KGFubm90YXRpb25zLnNpemUoKS0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBiZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhub2RlKS5nZXRCZWdpbkxpbmUoKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGludCBiZWdpbkNvbHVtbldpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiBiZWdpbk5vZGVXaXRob3V0Q29uc2lkZXJpbmdBbm5vdGF0aW9ucyhub2RlKS5nZXRCZWdpbkNvbHVtbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE5vZGUgYmVnaW5Ob2RlV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbnMoTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGNhc3RlZCA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKKyAgICAgICAgICAgIHJldHVybiBjYXN0ZWQuZ2V0VHlwZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSB7CisgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGNhc3RlZCA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOworICAgICAgICAgICAgcmV0dXJuIGNhc3RlZC5nZXRUeXBlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNhc3RlZCA9IChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIG5vZGU7CisgICAgICAgICAgICByZXR1cm4gY2FzdGVkLmdldE5hbWVFeHByKCk7CisgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbm9kZUNvbnRhaW5zKE5vZGUgY29udGFpbmVyLCBOb2RlIGNvbnRhaW5lZCwgYm9vbGVhbiBpZ25vcmluZ0Fubm90YXRpb25zKXsKKyAgICAgICAgaWYgKCFpZ25vcmluZ0Fubm90YXRpb25zIHx8IFBvc2l0aW9uVXRpbHMuZ2V0TGFzdEFubm90YXRpb24oY29udGFpbmVyKT09bnVsbCl7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zKGNvbnRhaW5lZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb250YWluZXIuY29udGFpbnMoY29udGFpbmVkKSl7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXMgY29udGFpbmVkLCBidXQgaXQgY29tZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGFubm90YXRpb25zLAorICAgICAgICAvLyBsZXQncyBub3QgY29uc2lkZXIgaXQgY29udGFpbmVkCisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBBbm5vdGFibGVOb2RlKXsKKyAgICAgICAgICAgIGludCBibCA9IGJlZ2luTGluZVdpdGhvdXRDb25zaWRlcmluZ0Fubm90YXRpb24oY29udGFpbmVyKTsKKyAgICAgICAgICAgIGludCBiYyA9IGJlZ2luQ29sdW1uV2l0aG91dENvbnNpZGVyaW5nQW5ub3RhdGlvbihjb250YWluZXIpOworICAgICAgICAgICAgaWYgKGJsPmNvbnRhaW5lZC5nZXRCZWdpbkxpbmUoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKGJsPT1jb250YWluZWQuZ2V0QmVnaW5MaW5lKCkgJiYgYmM+Y29udGFpbmVkLmdldEJlZ2luQ29sdW1uKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0RW5kTGluZSgpPGNvbnRhaW5lZC5nZXRFbmRMaW5lKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0RW5kTGluZSgpPT1jb250YWluZWQuZ2V0RW5kTGluZSgpICYmIGNvbnRhaW5lci5nZXRFbmRDb2x1bW4oKTxjb250YWluZWQuZ2V0RW5kQ29sdW1uKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1NvdXJjZXNIZWxwZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9Tb3VyY2VzSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmODNmMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9Tb3VyY2VzSGVscGVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgU291cmNlc0hlbHBlciB7CisKKyAgICBzdGF0aWMgU3RyaW5nIHN0cmVhbVRvU3RyaW5nKElucHV0U3RyZWFtIGluLCBTdHJpbmcgZW5jb2RpbmcpeworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbVRvU3RyaW5nKGluKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGphdmEudXRpbC5TY2FubmVyIHMgPSBuZXcgamF2YS51dGlsLlNjYW5uZXIoaW4sIGVuY29kaW5nKS51c2VEZWxpbWl0ZXIoIlxcQSIpOworICAgICAgICAgICAgcmV0dXJuIHMuaGFzTmV4dCgpID8gcy5uZXh0KCkgOiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgc3RyZWFtVG9TdHJpbmcoSW5wdXRTdHJlYW0gaW4peworICAgICAgICBqYXZhLnV0aWwuU2Nhbm5lciBzID0gbmV3IGphdmEudXRpbC5TY2FubmVyKGluKS51c2VEZWxpbWl0ZXIoIlxcQSIpOworICAgICAgICByZXR1cm4gcy5oYXNOZXh0KCkgPyBzLm5leHQoKSA6ICIiOworICAgIH0KKworICAgIHN0YXRpYyBJbnB1dFN0cmVhbSBzdHJpbmdUb1N0cmVhbShTdHJpbmcgcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSByYXdEYXRhID0gZW5jb2RpbmcgIT0gbnVsbCA/IHMuZ2V0Qnl0ZXMoZW5jb2RpbmcpIDogcy5nZXRCeXRlcygpOworICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhd0RhdGEpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcmVhZGVyVG9TdHJpbmcoUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltdIGFyciA9IG5ldyBjaGFyWzgqMTAyNF07IC8vIDhLIGF0IGEgdGltZQorICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBudW1DaGFyczsKKworICAgICAgICB3aGlsZSAoKG51bUNoYXJzID0gcmVhZGVyLnJlYWQoYXJyLCAwLCBhcnIubGVuZ3RoKSkgPiAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGFyciwgMCwgbnVtQ2hhcnMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHN0YXRpYyBSZWFkZXIgc3RyaW5nVG9SZWFkZXIoU3RyaW5nIHMpeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1JlYWRlcihzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvQWNjZXNzU3BlY2lmaWVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FjY2Vzc1NwZWNpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYWZkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0FjY2Vzc1NwZWNpZmllci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Q7CisKKy8qKgorICogQWNjZXNzIHNwZWNpZmllci4gUmVwcmVzZW50cyBvbmUgb2YgdGhlIHBvc3NpYmxlIGxldmVscyBvZgorICogYWNjZXNzIHBlcm1pdHRlZCBieSB0aGUgbGFuZ3VhZ2UuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKiBAc2luY2UgSnVseSAyMDE0CisgKi8KK3B1YmxpYyBlbnVtIEFjY2Vzc1NwZWNpZmllciB7CisKKyAgICBQVUJMSUMoInB1YmxpYyIpLAorICAgIFBSSVZBVEUoInByaXZhdGUiKSwKKyAgICBQUk9URUNURUQoInByb3RlY3RlZCIpLAorICAgIERFRkFVTFQoIiIpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgY29kZVJlcHJlc2VuYXRpb247CisKKyAgICBwcml2YXRlIEFjY2Vzc1NwZWNpZmllcihTdHJpbmcgY29kZVJlcHJlc2VudGF0aW9uKSB7CisgICAgICAgIHRoaXMuY29kZVJlcHJlc2VuYXRpb24gPSBjb2RlUmVwcmVzZW50YXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2RlUmVwcmVzZW5hdGlvbigpeworICAgICAgICByZXR1cm4gdGhpcy5jb2RlUmVwcmVzZW5hdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Db21waWxhdGlvblVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RiMzAyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Db21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHVuaXQuIEVhY2ggamF2YSBmaWxlIGRlbm90ZXMgYQorICogY29tcGlsYXRpb24gdW5pdC4KKyAqIDwvcD4KKyAqIFRoZSBDb21waWxhdGlvblVuaXQgaXMgY29uc3RydWN0ZWQgZm9sbG93aW5nIHRoZSBzeW50YXg6PGJyPgorICogPHByZT4KKyAqIHtAY29kZQorICogQ29tcGlsYXRpb25Vbml0IDo6PSAgKCB9e0BsaW5rIFBhY2thZ2VEZWNsYXJhdGlvbn17QGNvZGUgKT8KKyAqICAgICAgICAgICAgICAgICAgICAgICggfXtAbGluayBJbXBvcnREZWNsYXJhdGlvbn17QGNvZGUgKSoKKyAqICAgICAgICAgICAgICAgICAgICAgICggfXtAbGluayBUeXBlRGVjbGFyYXRpb259e0Bjb2RlICkqCisgKiB9CisgKiA8L3ByZT4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgTm9kZSB7CisKKyAgICBwcml2YXRlIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWthZ2U7CisKKyAgICBwcml2YXRlIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHM7CisKKyAgICBwcml2YXRlIExpc3Q8VHlwZURlY2xhcmF0aW9uPiB0eXBlczsKKworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQoKSB7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdChQYWNrYWdlRGVjbGFyYXRpb24gcGFrYWdlLCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMpIHsKKyAgICAgICAgc2V0UGFja2FnZShwYWthZ2UpOworICAgICAgICBzZXRJbXBvcnRzKGltcG9ydHMpOworICAgICAgICBzZXRUeXBlcyh0eXBlcyk7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdChpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBQYWNrYWdlRGVjbGFyYXRpb24gcGFrYWdlLCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMpIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKyAgICAgICAgc2V0UGFja2FnZShwYWthZ2UpOworICAgICAgICBzZXRJbXBvcnRzKGltcG9ydHMpOworICAgICAgICBzZXRUeXBlcyh0eXBlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBhbGwgY29tbWVudHMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorICAgICAqIEluY2x1ZGluZyBqYXZhZG9jcywgbGluZSBjb21tZW50cyBhbmQgYmxvY2sgY29tbWVudHMgb2YgYWxsIHR5cGVzLAorICAgICAqIGlubmVyLWNsYXNzZXMgYW5kIG90aGVyIG1lbWJlcnMuPGJyPgorICAgICAqIElmIHRoZXJlIGlzIG5vIGNvbW1lbnQsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbGlzdCB3aXRoIGFsbCBjb21tZW50cyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgb3IKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHNlZSBKYXZhZG9jQ29tbWVudAorICAgICAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudAorICAgICAqIEBzZWUgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxDb21tZW50PiBnZXRDb21tZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgaW1wb3J0cyBkZWNsYXJlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBpbXBvcnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBpbXBvcnRzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGltcG9ydAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBnZXRJbXBvcnRzKCkgeworICAgICAgICByZXR1cm4gaW1wb3J0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gb2YgdGhpcyBjb21waWxhdGlvbiB1bml0Ljxicj4KKyAgICAgKiBJZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaGFzIG5vIHBhY2thZ2UgZGVjbGFyYXRpb24gKGRlZmF1bHQgcGFja2FnZSksCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGFja2FnZSBkZWNsYXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBQYWNrYWdlRGVjbGFyYXRpb24gZ2V0UGFja2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHBha2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0Ljxicj4KKyAgICAgKiBJZiB0aGVyZSBpcyBubyB0eXBlcyBkZWNsYXJlZCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB0eXBlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBudWxsIGlmIHRoZXJlIGlzIG5vIHR5cGUKKyAgICAgKiBAc2VlIEFubm90YXRpb25EZWNsYXJhdGlvbgorICAgICAqIEBzZWUgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCisgICAgICogQHNlZSBFbXB0eVR5cGVEZWNsYXJhdGlvbgorICAgICAqIEBzZWUgRW51bURlY2xhcmF0aW9uCisgICAgICovCisgICAgcHVibGljIExpc3Q8VHlwZURlY2xhcmF0aW9uPiBnZXRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgY29tbWVudHMgb2YgdGhpcyBjb21waWxhdGlvbiB1bml0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb21tZW50cworICAgICAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY29tbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50cyhMaXN0PENvbW1lbnQ+IGNvbW1lbnRzKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiBpbXBvcnRzIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gVGhlIGxpc3QgaXMgaW5pdGlhbGx5CisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGltcG9ydHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGltcG9ydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBvcnRzKExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMpIHsKKyAgICAgICAgdGhpcy5pbXBvcnRzID0gaW1wb3J0czsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbXBvcnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIG9yIGNsZWFyIHRoZSBwYWNrYWdlIGRlY2xhcmF0aW9ucyBvZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgICogCisgICAgICogQHBhcmFtIHBha2FnZQorICAgICAqICAgICAgICAgICAgdGhlIHBha2FnZSBkZWNsYXJhdGlvbiB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gZGVmYXVsdAorICAgICAqICAgICAgICAgICAgcGFja2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoUGFja2FnZURlY2xhcmF0aW9uIHBha2FnZSkgeworICAgICAgICB0aGlzLnBha2FnZSA9IHBha2FnZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYWthZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlcworICAgICAqICAgICAgICAgICAgdGhlIGxpcyBvZiB0eXBlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVzKExpc3Q8VHlwZURlY2xhcmF0aW9uPiB0eXBlcykgeworICAgICAgICB0aGlzLnR5cGVzID0gdHlwZXM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvRG9jdW1lbnRhYmxlTm9kZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Eb2N1bWVudGFibGVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzODgzMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvRG9jdW1lbnRhYmxlTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworCisvKioKKyAqIE5vZGUgd2hpY2ggY2FuIGJlIGRvY3VtZW50ZWQgdGhyb3VnaCBhIEphdmFkb2MgY29tbWVudC4KKyAqLworcHVibGljIGludGVyZmFjZSBEb2N1bWVudGFibGVOb2RlIHsKKworICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBnZXRKYXZhRG9jKCk7CisgICAgcHVibGljIHZvaWQgc2V0SmF2YURvYyhKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0ltcG9ydERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0ltcG9ydERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyNDllMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvSW1wb3J0RGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIDxwPgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgaW1wb3J0IGRlY2xhcmF0aW9uLiBJbXBvcnRzIGFyZSBvcHRpb25hbCBmb3IgdGhlCisgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fS4KKyAqIDwvcD4KKyAqIFRoZSBJbXBvcnREZWNsYXJhdGlvbiBpcyBjb25zdHJ1Y3RlZCBmb2xsb3dpbmcgdGhlIHN5bnRheDo8YnI+CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiBJbXBvcnREZWNsYXJhdGlvbiA6Oj0gImltcG9ydCIgKCAic3RhdGljIiApPyB9e0BsaW5rIE5hbWVFeHByfXtAY29kZSAoICIuIiAiKiIgKT8gIjsiCisgKiB9CisgKiA8L3ByZT4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW1wb3J0RGVjbGFyYXRpb24gZXh0ZW5kcyBOb2RlIHsKKworICAgIHByaXZhdGUgTmFtZUV4cHIgbmFtZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzdGF0aWNfOworCisgICAgcHJpdmF0ZSBib29sZWFuIGFzdGVyaXNrOworCisgICAgcHVibGljIEltcG9ydERlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBJbXBvcnREZWNsYXJhdGlvbihOYW1lRXhwciBuYW1lLCBib29sZWFuIGlzU3RhdGljLCBib29sZWFuIGlzQXN0ZXJpc2spIHsKKyAgICAgICAgc2V0QXN0ZXJpc2soaXNBc3Rlcmlzayk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldFN0YXRpYyhpc1N0YXRpYyk7CisgICAgfQorCisgICAgcHVibGljIEltcG9ydERlY2xhcmF0aW9uKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIE5hbWVFeHByIG5hbWUsIGJvb2xlYW4gaXNTdGF0aWMsIGJvb2xlYW4gaXNBc3RlcmlzaykgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRBc3Rlcmlzayhpc0FzdGVyaXNrKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0U3RhdGljKGlzU3RhdGljKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBpbXBvcnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0CisgICAgICovCisgICAgcHVibGljIE5hbWVFeHByIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGUgaW1wb3J0IGVuZHMgd2l0aCAiKiIuCisgICAgICogCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW1wb3J0IGVuZHMgd2l0aCAiKiIsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3RlcmlzaygpIHsKKyAgICAgICAgcmV0dXJuIGFzdGVyaXNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGUgaW1wb3J0IGlzIHN0YXRpYy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbXBvcnQgaXMgc3RhdGljLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gc3RhdGljXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGlmIHRoaXMgaW1wb3J0IGlzIGFzdGVyaXNrLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhc3RlcmlzaworICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbXBvcnQgaXMgYXN0ZXJpc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBc3Rlcmlzayhib29sZWFuIGFzdGVyaXNrKSB7CisgICAgICAgIHRoaXMuYXN0ZXJpc2sgPSBhc3RlcmlzazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIHRoaXMgaW1wb3J0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGlmIHRoaXMgaW1wb3J0IGlzIHN0YXRpYy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RhdGljXworICAgICAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbXBvcnQgaXMgc3RhdGljCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gc3RhdGljXykgeworICAgICAgICB0aGlzLnN0YXRpY18gPSBzdGF0aWNfOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9OYW1lZE5vZGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvTmFtZWROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4NWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvTmFtZWROb2RlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworLyoqCisgKiBBIG5vZGUgaGF2aW5nIGEgbmFtZS4KKyAqICAKKyAqIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBpbnRlcmZhY2UgaXMgdG8gcGVybWl0IHVzZXJzIHRvIG1hbmlwdWxhdGUgaG9tb2dlbmVvdXNseSBhbGwgbm9kZXMgd2l0aCBhIGdldE5hbWUgbWV0aG9kLgorICogCisgKiBAc2luY2UgMi4wLjEgCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmFtZWROb2RlIHsKKyAgICBTdHJpbmcgZ2V0TmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY5Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlLmphdmEKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuKjsKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyBmb3IgYWxsIG5vZGVzIG9mIHRoZSBBU1QuCisgKgorICogRWFjaCBOb2RlIGNhbiBoYXZlIG9uZSBhc3NvY2lhdGVkIGNvbW1lbnQgd2hpY2ggZGVzY3JpYmUgaXQgYW5kCisgKiBhIG51bWJlciBvZiAib3JwaGFuIGNvbW1lbnRzIiB3aGljaCBpdCBjb250YWlucyBidXQgYXJlIG5vdCBzcGVjaWZpY2FsbHkKKyAqIGFzc29jaWF0ZWQgdG8gYW55IGVsZW1lbnQuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIGludCBiZWdpbkxpbmU7CisKKyAgICBwcml2YXRlIGludCBiZWdpbkNvbHVtbjsKKworICAgIHByaXZhdGUgaW50IGVuZExpbmU7CisKKyAgICBwcml2YXRlIGludCBlbmRDb2x1bW47CisKKyAgICBwcml2YXRlIE5vZGUgcGFyZW50Tm9kZTsKKworICAgIHByaXZhdGUgTGlzdDxOb2RlPiBjaGlsZHJlbk5vZGVzID0gbmV3IExpbmtlZExpc3Q8Tm9kZT4oKTsKKyAgICBwcml2YXRlIExpc3Q8Q29tbWVudD4gb3JwaGFuQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpOworCisgICAgLyoqCisgICAgICogVGhpcyBhdHRyaWJ1dGUgY2FuIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJvbSBzZW1hbnRpYyBhbmFseXNpcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBkYXRhOworCisgICAgcHJpdmF0ZSBDb21tZW50IGNvbW1lbnQ7CisKKyAgICBwdWJsaWMgTm9kZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZShmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uKSB7CisgICAgICAgIHRoaXMuYmVnaW5MaW5lID0gYmVnaW5MaW5lOworICAgICAgICB0aGlzLmJlZ2luQ29sdW1uID0gYmVnaW5Db2x1bW47CisgICAgICAgIHRoaXMuZW5kTGluZSA9IGVuZExpbmU7CisgICAgICAgIHRoaXMuZW5kQ29sdW1uID0gZW5kQ29sdW1uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdCBtZXRob2QgZm9yIHZpc2l0b3Igc3VwcG9ydC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gPFI+CisgICAgICogICAgICAgICAgICB0aGUgdHlwZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yCisgICAgICogQHBhcmFtIDxBPgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgdmlzaXRvcgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgdmlzaXRvciBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBhcmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIHZpc2l0b3IKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIHZpc2l0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZyk7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgbWV0aG9kIGZvciB2aXNpdG9yIHN1cHBvcnQuCisgICAgICogCisgICAgICogQHBhcmFtIDxBPgorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgdGhlIGFyZ3VtZW50IHBhc3NlZCBmb3IgdGhlIHZpc2l0b3IKKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2l0b3IgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcGFyYW0gYXJnCisgICAgICogICAgICAgICAgICBhbnkgdmFsdWUgcmVsZXZhbnQgZm9yIHRoZSB2aXNpdG9yCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJlZ2luIGNvbHVtbiBvZiB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmVnaW4gY29sdW1uIG9mIHRoaXMgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0QmVnaW5Db2x1bW4oKSB7CisgICAgICAgIHJldHVybiBiZWdpbkNvbHVtbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJlZ2luIGxpbmUgb2YgdGhpcyBub2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJlZ2luIGxpbmUgb2YgdGhpcyBub2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRCZWdpbkxpbmUoKSB7CisgICAgICAgIHJldHVybiBiZWdpbkxpbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tbWVudCBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDb21tZW50IGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIHJldHJpZXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRhdGEgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW5kIGNvbHVtbiBvZiB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW5kIGNvbHVtbiBvZiB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEVuZENvbHVtbigpIHsKKyAgICAgICAgcmV0dXJuIGVuZENvbHVtbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVuZCBsaW5lIG9mIHRoaXMgbm9kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmQgbGluZSBvZiB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEVuZExpbmUoKSB7CisgICAgICAgIHJldHVybiBlbmRMaW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJlZ2luIGNvbHVtbiBvZiB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQHBhcmFtIGJlZ2luQ29sdW1uCisgICAgICogICAgICAgICAgICB0aGUgYmVnaW4gY29sdW1uIG9mIHRoaXMgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEJlZ2luQ29sdW1uKGZpbmFsIGludCBiZWdpbkNvbHVtbikgeworICAgICAgICB0aGlzLmJlZ2luQ29sdW1uID0gYmVnaW5Db2x1bW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmVnaW4gbGluZSBvZiB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQHBhcmFtIGJlZ2luTGluZQorICAgICAqICAgICAgICAgICAgdGhlIGJlZ2luIGxpbmUgb2YgdGhpcyBub2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0QmVnaW5MaW5lKGZpbmFsIGludCBiZWdpbkxpbmUpIHsKKyAgICAgICAgdGhpcy5iZWdpbkxpbmUgPSBiZWdpbkxpbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDb21tZW50KGZpbmFsIENvbW1lbnQgY29tbWVudCkgeworICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsICYmICh0aGlzIGluc3RhbmNlb2YgQ29tbWVudCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBIGNvbW1lbnQgY2FuIG5vdCBiZSBjb21tZW50ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jb21tZW50ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudC5zZXRDb21tZW50ZWROb2RlKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudC5zZXRDb21tZW50ZWROb2RlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREYXRhKGZpbmFsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW5kIGNvbHVtbiBvZiB0aGlzIG5vZGUuCisgICAgICogCisgICAgICogQHBhcmFtIGVuZENvbHVtbgorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBjb2x1bW4gb2YgdGhpcyBub2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RW5kQ29sdW1uKGZpbmFsIGludCBlbmRDb2x1bW4pIHsKKyAgICAgICAgdGhpcy5lbmRDb2x1bW4gPSBlbmRDb2x1bW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW5kIGxpbmUgb2YgdGhpcyBub2RlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmRMaW5lCisgICAgICogICAgICAgICAgICB0aGUgZW5kIGxpbmUgb2YgdGhpcyBub2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RW5kTGluZShmaW5hbCBpbnQgZW5kTGluZSkgeworICAgICAgICB0aGlzLmVuZExpbmUgPSBlbmRMaW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgRHVtcFZpc2l0b3IgdmlzaXRvciA9IG5ldyBEdW1wVmlzaXRvcigpOworICAgICAgICBhY2NlcHQodmlzaXRvciwgbnVsbCk7CisgICAgICAgIHJldHVybiB2aXNpdG9yLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSB7CisgICAgICAgIGZpbmFsIER1bXBWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRHVtcFZpc2l0b3IoZmFsc2UpOworICAgICAgICBhY2NlcHQodmlzaXRvciwgbnVsbCk7CisgICAgICAgIHJldHVybiB2aXNpdG9yLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgTm9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRXF1YWxzVmlzaXRvci5lcXVhbHModGhpcywgKE5vZGUpIG9iaik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5vZGUgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFjY2VwdChuZXcgQ2xvbmVWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnROb2RlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PE5vZGU+IGdldENoaWxkcmVuTm9kZXMoKSB7CisgICAgICAgIHJldHVybiBjaGlsZHJlbk5vZGVzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE5vZGUgb3RoZXIpIHsKKyAgICAgICAgaWYgKGdldEJlZ2luTGluZSgpID4gb3RoZXIuZ2V0QmVnaW5MaW5lKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGdldEJlZ2luTGluZSgpID09IG90aGVyLmdldEJlZ2luTGluZSgpICYmIGdldEJlZ2luQ29sdW1uKCkgPiBvdGhlci5nZXRCZWdpbkNvbHVtbigpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChnZXRFbmRMaW5lKCkgPCBvdGhlci5nZXRFbmRMaW5lKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGdldEVuZExpbmUoKSA9PSBvdGhlci5nZXRFbmRMaW5lKCkgJiYgZ2V0RW5kQ29sdW1uKCkgPCBvdGhlci5nZXRFbmRDb2x1bW4oKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPcnBoYW5Db21tZW50KENvbW1lbnQgY29tbWVudCkgeworICAgICAgICBvcnBoYW5Db21tZW50cy5hZGQoY29tbWVudCk7CisgICAgICAgIGNvbW1lbnQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbGlzdCBvZiBDb21tZW50IHdoaWNoIGFyZSBpbnNpZGUgdGhlIG5vZGUgYW5kIGFyZSBub3QgYXNzb2NpYXRlZAorICAgICAqIHdpdGggYW55IG1lYW5pbmdmdWwgQVNUIE5vZGUuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgY29tbWVudHMgYXQgdGhlIGVuZCBvZiBtZXRob2RzIChpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHBhcmVudGhlc2lzKQorICAgICAqIG9yIGF0IHRoZSBlbmQgb2YgQ29tcGlsYXRpb25Vbml0IGFyZSBvcnBoYW4gY29tbWVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIG1vcmUgdGhhbiBvbmUgY29tbWVudHMgcHJlY2VlZCBhIHN0YXRlbWVudCwgdGhlIG9uZSBpbW1lZGlhdGVseSBwcmVjZWVkaW5nIGl0CisgICAgICogaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZW1lbnRzLCB3aGlsZSB0aGUgb3RoZXJzIGFyZSAib3JwaGFuIi4KKyAgICAgKiBAcmV0dXJuIGFsbCBjb21tZW50cyB0aGF0IGNhbm5vdCBiZSBhdHRyaWJ1dGVkIHRvIGEgY29uY2VwdAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENvbW1lbnQ+IGdldE9ycGhhbkNvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gb3JwaGFuQ29tbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgbGlzdCBvZiBDb21tZW50IHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhlIE5vZGUgZWl0aGVyIGJlY2F1c2UKKyAgICAgKiB0aGV5IGFyZSBwcm9wZXJseSBhc3NvY2lhdGVkIHRvIG9uZSBvZiBpdHMgY2hpbGRyZW4gb3IgYmVjYXVzZSB0aGV5IGFyZSBmbG9hdGluZworICAgICAqIGFyb3VuZCBpbnNpZGUgdGhlIE5vZGUKKyAgICAgKiBAcmV0dXJuIGFsbCBDb21tZW50cyB3aXRoaW4gdGhlIG5vZGUgYXMgYSBsaXN0CisgICAgICovCisgICAgcHVibGljIExpc3Q8Q29tbWVudD4gZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKSB7CisgICAgICAgIExpc3Q8Q29tbWVudD4gY29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxDb21tZW50PigpOworICAgICAgICBjb21tZW50cy5hZGRBbGwoZ2V0T3JwaGFuQ29tbWVudHMoKSk7CisKKyAgICAgICAgZm9yIChOb2RlIGNoaWxkIDogZ2V0Q2hpbGRyZW5Ob2RlcygpKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb21tZW50cy5hZGQoY2hpbGQuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1lbnRzLmFkZEFsbChjaGlsZC5nZXRBbGxDb250YWluZWRDb21tZW50cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYSBuZXcgcGFyZW50IHRvIHRoaXMgbm9kZSwgcmVtb3ZpbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSBwcmV2aW91cyBwYXJlbnQsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnROb2RlIG5vZGUgdG8gYmUgc2V0IGFzIHBhcmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKSB7CisgICAgICAgIC8vIHJlbW92ZSBmcm9tIG9sZCBwYXJlbnQsIGlmIGFueQorICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5jaGlsZHJlbk5vZGVzLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOworICAgICAgICAvLyBhZGQgdG8gbmV3IHBhcmVudCwgaWYgYW55CisgICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmNoaWxkcmVuTm9kZXMuYWRkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QXNQYXJlbnROb2RlT2YoTGlzdDw/IGV4dGVuZHMgTm9kZT4gY2hpbGROb2RlcykgeworICAgICAgICBpZiAoY2hpbGROb2RlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgTm9kZT4gaXQgPSBjaGlsZE5vZGVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50ID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGN1cnJlbnQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEFzUGFyZW50Tm9kZU9mKE5vZGUgY2hpbGROb2RlKSB7CisgICAgICAgIGlmIChjaGlsZE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgY2hpbGROb2RlLnNldFBhcmVudE5vZGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNPTFVURV9CRUdJTl9MSU5FID0gLTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTT0xVVEVfRU5EX0xJTkUgPSAtMjsKKworICAgIHB1YmxpYyBib29sZWFuIGlzUG9zaXRpb25lZEFmdGVyKGludCBsaW5lLCBpbnQgY29sdW1uKSB7CisgICAgICAgIGlmIChsaW5lID09IEFCU09MVVRFX0JFR0lOX0xJTkUpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoZ2V0QmVnaW5MaW5lKCkgPiBsaW5lKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRCZWdpbkxpbmUoKSA9PSBsaW5lKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0QmVnaW5Db2x1bW4oKSA+IGNvbHVtbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUG9zaXRpb25lZEJlZm9yZShpbnQgbGluZSwgaW50IGNvbHVtbikgeworICAgICAgICBpZiAobGluZSA9PSBBQlNPTFVURV9FTkRfTElORSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChnZXRFbmRMaW5lKCkgPCBsaW5lKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRFbmRMaW5lKCkgPT0gbGluZSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEVuZENvbHVtbigpIDwgY29sdW1uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWVudCgpCisgICAgeworICAgICAgICByZXR1cm4gY29tbWVudCAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFja2FnZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWFmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1BhY2thZ2VEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogPHA+CisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24uIFRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGlzCisgKiBvcHRpb25hbCBmb3IgdGhlIHtAbGluayBDb21waWxhdGlvblVuaXR9LgorICogPC9wPgorICogVGhlIFBhY2thZ2VEZWNsYXJhdGlvbiBpcyBjb25zdHJ1Y3RlZCBmb2xsb3dpbmcgdGhlIHN5bnRheDo8YnI+CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiBQYWNrYWdlRGVjbGFyYXRpb24gOjo9ICggfXtAbGluayBBbm5vdGF0aW9uRXhwcn17QGNvZGUgKSogInBhY2thZ2UiIH17QGxpbmsgTmFtZUV4cHJ9e0Bjb2RlICkgIjsiCisgKiB9CisgKiA8L3ByZT4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGFja2FnZURlY2xhcmF0aW9uIGV4dGVuZHMgTm9kZSB7CisKKyAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHJpdmF0ZSBOYW1lRXhwciBuYW1lOworCisgICAgcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uKE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBOYW1lRXhwciBuYW1lKSB7CisgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBOYW1lRXhwciBuYW1lKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGFubm90YXRpb25zIGRlY2xhcmVkIGJlZm9yZSB0aGUgcGFja2FnZQorICAgICAqIGRlY2xhcmF0aW9uLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbGlzdCBvZiBhbm5vdGF0aW9ucyBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlCisgICAgICovCisgICAgcHVibGljIE5hbWVFeHByIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucworICAgICAqICAgICAgICAgICAgdGhlIGFubm90YXRpb25zIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25zKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIHBhY2thZ2UgZGVjbGFyYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoTmFtZUV4cHIgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzZXRBc1BhcmVudE5vZGVPZih0aGlzLm5hbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9UcmVlVmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9UcmVlVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjI2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1RyZWVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVWaXNpdG9yIHsKKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVwdGhGaXJzdChOb2RlIG5vZGUpeworICAgICAgICBwcm9jZXNzKG5vZGUpOworICAgICAgICBmb3IgKE5vZGUgY2hpbGQgOiBub2RlLmdldENoaWxkcmVuTm9kZXMoKSl7CisgICAgICAgICAgICB2aXNpdERlcHRoRmlyc3QoY2hpbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpOworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1R5cGVQYXJhbWV0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvVHlwZVBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0M2QzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L1R5cGVQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDxwPgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGdlbmVyaWNzIGFyZ3VtZW50LgorICogPC9wPgorICogVGhlIFR5cGVQYXJhbWV0ZXIgaXMgY29uc3RydWN0ZWQgZm9sbG93aW5nIHRoZSBzeW50YXg6PGJyPgorICogPHByZT4KKyAqIHtAY29kZQorICogVHlwZVBhcmFtZXRlciA6Oj0gPElERU5USUZJRVI+ICggImV4dGVuZHMiIH17QGxpbmsgQ2xhc3NPckludGVyZmFjZVR5cGV9e0Bjb2RlICggIiYiIH17QGxpbmsgQ2xhc3NPckludGVyZmFjZVR5cGV9e0Bjb2RlICkqICk/CisgKiB9CisgKiA8L3ByZT4KKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHlwZVBhcmFtZXRlciBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBOYW1lZE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKwlwcml2YXRlIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZDsKKworCXB1YmxpYyBUeXBlUGFyYW1ldGVyKCkgeworCX0KKworCXB1YmxpYyBUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCk7CisJfQorCisJcHVibGljIFR5cGVQYXJhbWV0ZXIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCk7CisJfQorCisgICAgcHVibGljIFR5cGVQYXJhbWV0ZXIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kQ29sdW1uLCBTdHJpbmcgbmFtZSwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gdHlwZUJvdW5kLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgbmFtZSwgdHlwZUJvdW5kKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0VHlwZUJvdW5kKHR5cGVCb3VuZCk7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICB9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhcmFtZW50ZXIuCisJICogCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFyYW1lbnRlcgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBsaXN0IG9mIHtAbGluayBDbGFzc09ySW50ZXJmYWNlVHlwZX0gdGhhdCB0aGlzIHBhcmFtZXRlcgorCSAqIGV4dGVuZHMuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBudWxsIGlmIHRoZXJlIGFyZSBubyB0eXBlLgorCSAqIAorCSAqIEByZXR1cm4gbGlzdCBvZiB0eXBlcyB0aGF0IHRoaXMgcGFyYW1lbnRlIGV4dGVuZHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0VHlwZUJvdW5kKCkgeworCQlyZXR1cm4gdHlwZUJvdW5kOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyB0eXBlIHBhcmFtZXRlci4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGxpc3QgbyB0eXBlcy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZUJvdW5kCisJICogICAgICAgICAgICB0aGUgdHlwZUJvdW5kIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVCb3VuZChmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiB0eXBlQm91bmQpIHsKKwkJdGhpcy50eXBlQm91bmQgPSB0eXBlQm91bmQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHR5cGVCb3VuZCk7CisJfQorCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbnMoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGFibGVOb2RlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhYmxlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzhjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhYmxlTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIGVsZW1lbnQgd2hpY2ggY2FuIGJlIHRoZSB0YXJnZXQgb2YgYW5ub3RhdGlvbnMuCisgKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKiBAc2luY2UgSnVseSAyMDE0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3RhYmxlTm9kZSB7CisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMjU2MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uIGltcGxlbWVudHMgRG9jdW1lbnRhYmxlTm9kZSB7CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uRGVjbGFyYXRpb24oaW50IG1vZGlmaWVycywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobW9kaWZpZXJzLCBuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbkRlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTdHJpbmcgbmFtZSwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IG1lbWJlcnMpIHsKKyAgICAgICAgc3VwZXIoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25EZWNsYXJhdGlvbihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBpbnQgbW9kaWZpZXJzLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU3RyaW5nIG5hbWUsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEphdmFEb2MoSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5qYXZhZG9jQ29tbWVudCA9IGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBnZXRKYXZhRG9jKCkgeworICAgICAgICByZXR1cm4gamF2YWRvY0NvbW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODFlNmNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIGV4dGVuZHMgQm9keURlY2xhcmF0aW9uIGltcGxlbWVudHMgRG9jdW1lbnRhYmxlTm9kZSwgTmFtZWROb2RlIHsKKworICAgIHByaXZhdGUgaW50IG1vZGlmaWVyczsKKworICAgIHByaXZhdGUgVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oaW50IG1vZGlmaWVycywgVHlwZSB0eXBlLCBTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oaW50IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHN1cGVyKGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgaW50IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgYW5ub3RhdGlvbnMpOworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldERlZmF1bHRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIG1lbWJlciBkZWNsYXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIE1vZGlmaWVyU2V0CisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YoZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllcnMoaW50IG1vZGlmaWVycykgeworICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SmF2YURvYyhKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudCkgeworICAgICAgICB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEphdmFkb2NDb21tZW50IGdldEphdmFEb2MoKSB7CisgICAgICAgIHJldHVybiBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBwcml2YXRlIEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50OworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0Jhc2VQYXJhbWV0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9CYXNlUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0ZGViMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9CYXNlUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVBhcmFtZXRlciBleHRlbmRzIE5vZGUgeworICAgIHByaXZhdGUgaW50IG1vZGlmaWVyczsKKworICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisgICAgCisgICAgcHJpdmF0ZSBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZDsKKyAgICAKKyAgICBwdWJsaWMgQmFzZVBhcmFtZXRlcigpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJhc2VQYXJhbWV0ZXIoVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQpIHsKKyAgICAgICAgc2V0SWQoaWQpOworCX0KKworCXB1YmxpYyBCYXNlUGFyYW1ldGVyKGludCBtb2RpZmllcnMsIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRJZChpZCk7CisJfQorCQorCXB1YmxpYyBCYXNlUGFyYW1ldGVyKGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICBzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBzZXRJZChpZCk7CisJfQorCisJcHVibGljIEJhc2VQYXJhbWV0ZXIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgaW50IG1vZGlmaWVycywgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisJICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldElkKGlkKTsKKwl9CisKKyAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9ySWQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIHBhcmFtZXRlciBkZWNsYXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIE1vZGlmaWVyU2V0CisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9ucyhMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0JvZHlEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0JvZHlEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjEzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQm9keURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb2R5RGVjbGFyYXRpb24gZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgQW5ub3RhYmxlTm9kZSB7CisKKyAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHVibGljIEJvZHlEZWNsYXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9keURlY2xhcmF0aW9uKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgCXNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9keURlY2xhcmF0aW9uKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgCXNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucz09bnVsbCl7CisgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkV4cHI+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEFubm90YXRpb25zKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hbm5vdGF0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOThmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBleHRlbmRzIFR5cGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIERvY3VtZW50YWJsZU5vZGUgeworCisJcHJpdmF0ZSBib29sZWFuIGludGVyZmFjZV87CisKKwlwcml2YXRlIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CisKKwkvLyBDYW4gY29udGFpbiBtb3JlIHRoYW4gb25lIGl0ZW0gaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UKKwlwcml2YXRlIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dGVuZHNMaXN0OworCisJcHJpdmF0ZSBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdDsKKworCXB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CisJfQorCisJcHVibGljIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihmaW5hbCBpbnQgbW9kaWZpZXJzLCBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworCQlzdXBlcihtb2RpZmllcnMsIG5hbWUpOworCQlzZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UpOworCX0KKworCXB1YmxpYyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oZmluYWwgaW50IG1vZGlmaWVycywKKwkJCWZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlLCBmaW5hbCBTdHJpbmcgbmFtZSwKKwkJCWZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIGZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dGVuZHNMaXN0LAorCQkJZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QsIGZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzKSB7CisJCXN1cGVyKGFubm90YXRpb25zLCBtb2RpZmllcnMsIG5hbWUsIG1lbWJlcnMpOworCQlzZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UpOworCQlzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisJCXNldEV4dGVuZHMoZXh0ZW5kc0xpc3QpOworCQlzZXRJbXBsZW1lbnRzKGltcGxlbWVudHNMaXN0KTsKKwl9CisKKwlwdWJsaWMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsCisJCQlmaW5hbCBpbnQgZW5kQ29sdW1uLCBmaW5hbCBpbnQgbW9kaWZpZXJzLAorCQkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIGZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UsIGZpbmFsIFN0cmluZyBuYW1lLAorCQkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kc0xpc3QsCisJCQlmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRzTGlzdCwgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IG1lbWJlcnMpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBuYW1lLCBtZW1iZXJzKTsKKwkJc2V0SW50ZXJmYWNlKGlzSW50ZXJmYWNlKTsKKwkJc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworCQlzZXRFeHRlbmRzKGV4dGVuZHNMaXN0KTsKKwkJc2V0SW1wbGVtZW50cyhpbXBsZW1lbnRzTGlzdCk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGdldEV4dGVuZHMoKSB7CisJCXJldHVybiBleHRlbmRzTGlzdDsKKwl9CisKKwlwdWJsaWMgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0SW1wbGVtZW50cygpIHsKKwkJcmV0dXJuIGltcGxlbWVudHNMaXN0OworCX0KKworCXB1YmxpYyBMaXN0PFR5cGVQYXJhbWV0ZXI+IGdldFR5cGVQYXJhbWV0ZXJzKCkgeworCQlyZXR1cm4gdHlwZVBhcmFtZXRlcnM7CisJfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJCXJldHVybiBpbnRlcmZhY2VfOworCX0KKworCXB1YmxpYyB2b2lkIHNldEV4dGVuZHMoZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5kc0xpc3QpIHsKKwkJdGhpcy5leHRlbmRzTGlzdCA9IGV4dGVuZHNMaXN0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4dGVuZHNMaXN0KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRzKGZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0KSB7CisJCXRoaXMuaW1wbGVtZW50c0xpc3QgPSBpbXBsZW1lbnRzTGlzdDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbXBsZW1lbnRzTGlzdCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlKGZpbmFsIGJvb2xlYW4gaW50ZXJmYWNlXykgeworCQl0aGlzLmludGVyZmFjZV8gPSBpbnRlcmZhY2VfOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGVQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMpIHsKKwkJdGhpcy50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVQYXJhbWV0ZXJzKTsKKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRG9jKEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50KSB7CisgICAgICAgIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIHByaXZhdGUgSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQ7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI4MTBjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5BY2Nlc3NTcGVjaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIERvY3VtZW50YWJsZU5vZGUsIFdpdGhEZWNsYXJhdGlvbiwKKyAgICAgICAgTmFtZWROb2RlIHsKKworICAgIHByaXZhdGUgaW50IG1vZGlmaWVyczsKKworICAgIHByaXZhdGUgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVyczsKKworICAgIHByaXZhdGUgTmFtZUV4cHIgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIExpc3Q8TmFtZUV4cHI+IHRocm93c187CisKKyAgICBwcml2YXRlIEJsb2NrU3RtdCBibG9jazsKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycywgTGlzdDxOYW1lRXhwcj4gdGhyb3dzXywgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHN1cGVyKGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0VGhyb3dzKHRocm93c18pOworICAgICAgICBzZXRCbG9jayhibG9jayk7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yRGVjbGFyYXRpb24oaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgaW50IG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsIExpc3Q8TmFtZUV4cHI+IHRocm93c18sIEJsb2NrU3RtdCBibG9jaykgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgICAgIHNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKyAgICAgICAgc2V0VGhyb3dzKHRocm93c18pOworICAgICAgICBzZXRCbG9jayhibG9jayk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBCbG9ja1N0bXQgZ2V0QmxvY2soKSB7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIG1lbWJlciBkZWNsYXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIE1vZGlmaWVyU2V0CisgICAgICogQHJldHVybiBtb2RpZmllcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIE5hbWVFeHByIGdldE5hbWVFeHByKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxOYW1lRXhwcj4gZ2V0VGhyb3dzKCkgeworICAgICAgICBpZiAodGhyb3dzXyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvd3NfID0gbmV3IEFycmF5TGlzdDxOYW1lRXhwcj4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhyb3dzXzsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUeXBlUGFyYW1ldGVyPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrKEJsb2NrU3RtdCBibG9jaykgeworICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYmxvY2spOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmV3IE5hbWVFeHByKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWVFeHByKE5hbWVFeHByIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFyYW1ldGVycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGhyb3dzKExpc3Q8TmFtZUV4cHI+IHRocm93c18pIHsKKyAgICAgICAgdGhpcy50aHJvd3NfID0gdGhyb3dzXzsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50aHJvd3NfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlUGFyYW1ldGVycyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlY2xhcmF0aW9uIHJldHVybmVkIGhhcyB0aGlzIHNjaGVtYToKKyAgICAgKgorICAgICAqIFthY2Nlc3NTcGVjaWZpZXJdIGNsYXNzTmFtZSAoW3BhcmFtVHlwZSBbcGFyYW1OYW1lXV0pCisgICAgICogW3Rocm93cyBleGNlcHRpb25zTGlzdF0KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGluZ1BhcmFtZXRlck5hbWUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoaW5jbHVkaW5nTW9kaWZpZXJzKSB7CisgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyID0gTW9kaWZpZXJTZXQuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIuZ2V0Q29kZVJlcHJlc2VuYXRpb24oKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyID09IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUID8gIiIgOiAiICIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIigiKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdFBhcmFtID0gdHJ1ZTsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW0gOiBnZXRQYXJhbWV0ZXJzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdFBhcmFtKSB7CisgICAgICAgICAgICAgICAgZmlyc3RQYXJhbSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtLmdldFR5cGUoKS50b1N0cmluZ1dpdGhvdXRDb21tZW50cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgaWYgKGluY2x1ZGluZ1Rocm93cykgeworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFRocm93ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoTmFtZUV4cHIgdGhyIDogZ2V0VGhyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RUaHJvdykgeworICAgICAgICAgICAgICAgICAgICBmaXJzdFRocm93ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHRocm93cyAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0aHIudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4gaW5jbHVkaW5nTW9kaWZpZXJzLCBib29sZWFuIGluY2x1ZGluZ1Rocm93cykgeworICAgICAgICByZXR1cm4gZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhpbmNsdWRpbmdNb2RpZmllcnMsIGluY2x1ZGluZ1Rocm93cywgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyh0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRG9jKEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50KSB7CisgICAgICAgIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIHByaXZhdGUgSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQ7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlNZW1iZXJEZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VtcHR5TWVtYmVyRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzE5ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VtcHR5TWVtYmVyRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIERvY3VtZW50YWJsZU5vZGUgeworCisgICAgcHVibGljIEVtcHR5TWVtYmVyRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHN1cGVyKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBFbXB0eU1lbWJlckRlY2xhcmF0aW9uKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4pIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SmF2YURvYyhKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudCkgeworICAgICAgICB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEphdmFkb2NDb21tZW50IGdldEphdmFEb2MoKSB7CisgICAgICAgIHJldHVybiBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBwcml2YXRlIEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50OworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VtcHR5VHlwZURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW1wdHlUeXBlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWU4Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VtcHR5VHlwZURlY2xhcmF0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5VHlwZURlY2xhcmF0aW9uIGV4dGVuZHMgVHlwZURlY2xhcmF0aW9uIGltcGxlbWVudHMgRG9jdW1lbnRhYmxlTm9kZSB7CisKKyAgICBwdWJsaWMgRW1wdHlUeXBlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHN1cGVyKG51bGwsIDAsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBFbXB0eVR5cGVEZWNsYXJhdGlvbihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEphdmFEb2MoSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQpIHsKKyAgICAgICAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0VudW1Db25zdGFudERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjNDI1YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb24gaW1wbGVtZW50cyBEb2N1bWVudGFibGVOb2RlLCBOYW1lZE5vZGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBhcmdzOworCisgICAgcHJpdmF0ZSBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gY2xhc3NCb2R5OworCisgICAgcHVibGljIEVudW1Db25zdGFudERlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU3RyaW5nIG5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJncywgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGNsYXNzQm9keSkgeworICAgICAgICBzdXBlcihhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEFyZ3MoYXJncyk7CisgICAgICAgIHNldENsYXNzQm9keShjbGFzc0JvZHkpOworICAgIH0KKworICAgIHB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgU3RyaW5nIG5hbWUsIExpc3Q8RXhwcmVzc2lvbj4gYXJncywgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGNsYXNzQm9keSkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0QXJncyhhcmdzKTsKKyAgICAgICAgc2V0Q2xhc3NCb2R5KGNsYXNzQm9keSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEV4cHJlc3Npb24+IGdldEFyZ3MoKSB7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gZ2V0Q2xhc3NCb2R5KCkgeworICAgICAgICByZXR1cm4gY2xhc3NCb2R5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJncyhMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKyAgICAgICAgdGhpcy5hcmdzID0gYXJnczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0JvZHkoTGlzdDxCb2R5RGVjbGFyYXRpb24+IGNsYXNzQm9keSkgeworICAgICAgICB0aGlzLmNsYXNzQm9keSA9IGNsYXNzQm9keTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jbGFzc0JvZHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRG9jKEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50KSB7CisgICAgICAgIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIHByaXZhdGUgSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQ7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bURlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRW51bURlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiOGVlNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9FbnVtRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbnVtRGVjbGFyYXRpb24gZXh0ZW5kcyBUeXBlRGVjbGFyYXRpb24gaW1wbGVtZW50cyBEb2N1bWVudGFibGVOb2RlIHsKKworICAgIHByaXZhdGUgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3Q7CisKKyAgICBwcml2YXRlIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXM7CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uKCkgeworICAgIH0KKworICAgIHB1YmxpYyBFbnVtRGVjbGFyYXRpb24oaW50IG1vZGlmaWVycywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobW9kaWZpZXJzLCBuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uKGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTdHJpbmcgbmFtZSwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QsIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXMsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzKSB7CisgICAgICAgIHN1cGVyKGFubm90YXRpb25zLCBtb2RpZmllcnMsIG5hbWUsIG1lbWJlcnMpOworICAgICAgICBzZXRJbXBsZW1lbnRzKGltcGxlbWVudHNMaXN0KTsKKyAgICAgICAgc2V0RW50cmllcyhlbnRyaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRW51bURlY2xhcmF0aW9uKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBTdHJpbmcgbmFtZSwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QsIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudHJpZXMsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgbmFtZSwgbWVtYmVycyk7CisgICAgICAgIHNldEltcGxlbWVudHMoaW1wbGVtZW50c0xpc3QpOworICAgICAgICBzZXRFbnRyaWVzKGVudHJpZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBnZXRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gZW50cmllczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZ2V0SW1wbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGltcGxlbWVudHNMaXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcykgeworICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVudHJpZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudHMoTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QpIHsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRzTGlzdCA9IGltcGxlbWVudHNMaXN0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmltcGxlbWVudHNMaXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRG9jKEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50KSB7CisgICAgICAgIHRoaXMuamF2YWRvY0NvbW1lbnQgPSBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQgZ2V0SmF2YURvYygpIHsKKyAgICAgICAgcmV0dXJuIGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIHByaXZhdGUgSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQ7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ4ZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Eb2N1bWVudGFibGVOb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmllbGREZWNsYXJhdGlvbiBleHRlbmRzIEJvZHlEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIERvY3VtZW50YWJsZU5vZGUgeworCisgICAgcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXM7CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbihpbnQgbW9kaWZpZXJzLCBUeXBlIHR5cGUsIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZSkgeworICAgIAlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAJc2V0VHlwZSh0eXBlKTsKKyAgICAJTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IGF1eCA9IG5ldyBBcnJheUxpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPigpOworICAgIAlhdXguYWRkKHZhcmlhYmxlKTsKKyAgICAJc2V0VmFyaWFibGVzKGF1eCk7CisgICAgfQorCisgICAgcHVibGljIEZpZWxkRGVjbGFyYXRpb24oaW50IG1vZGlmaWVycywgVHlwZSB0eXBlLCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgCXNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgIAlzZXRUeXBlKHR5cGUpOworICAgIAlzZXRWYXJpYWJsZXModmFyaWFibGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGREZWNsYXJhdGlvbihpbnQgbW9kaWZpZXJzLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgVHlwZSB0eXBlLCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFyaWFibGVzKSB7CisgICAgICAgIHN1cGVyKGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisgICAgCXNldFR5cGUodHlwZSk7CisgICAgCXNldFZhcmlhYmxlcyh2YXJpYWJsZXMpOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZERlY2xhcmF0aW9uKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiB2YXJpYWJsZXMpIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIHNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgIAlzZXRUeXBlKHR5cGUpOworICAgIAlzZXRWYXJpYWJsZXModmFyaWFibGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtb2RpZmllcnMgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24uCisgICAgICogCisgICAgICogQHNlZSBNb2RpZmllclNldAorICAgICAqIEByZXR1cm4gbW9kaWZpZXJzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiBnZXRWYXJpYWJsZXMoKSB7CisgICAgICAgIHJldHVybiB2YXJpYWJsZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZXMoTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcykgeworICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy52YXJpYWJsZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEphdmFEb2MoSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5qYXZhZG9jQ29tbWVudCA9IGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBnZXRKYXZhRG9jKCkgeworICAgICAgICByZXR1cm4gamF2YWRvY0NvbW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Jbml0aWFsaXplckRlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWRmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuRG9jdW1lbnRhYmxlTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEluaXRpYWxpemVyRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb24gaW1wbGVtZW50cyBEb2N1bWVudGFibGVOb2RlIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0YXRpYzsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IGJsb2NrOworCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24oYm9vbGVhbiBpc1N0YXRpYywgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICBzZXRTdGF0aWMoaXNTdGF0aWMpOworICAgICAgICBzZXRCbG9jayhibG9jayk7CisgICAgfQorCisgICAgcHVibGljIEluaXRpYWxpemVyRGVjbGFyYXRpb24oaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgYm9vbGVhbiBpc1N0YXRpYywgQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgbnVsbCk7CisgICAgICAgIHNldFN0YXRpYyhpc1N0YXRpYyk7CisgICAgICAgIHNldEJsb2NrKGJsb2NrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEJsb2NrU3RtdCBnZXRCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gaXNTdGF0aWM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmxvY2soQmxvY2tTdG10IGJsb2NrKSB7CisgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jazsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ibG9jayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gaXNTdGF0aWMpIHsKKyAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEphdmFEb2MoSmF2YWRvY0NvbW1lbnQgamF2YWRvY0NvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5qYXZhZG9jQ29tbWVudCA9IGphdmFkb2NDb21tZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCBnZXRKYXZhRG9jKCkgeworICAgICAgICByZXR1cm4gamF2YWRvY0NvbW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudDsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NZXRob2REZWNsYXJhdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01ldGhvZERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5Y2EwYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NZXRob2REZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkFjY2Vzc1NwZWNpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkRvY3VtZW50YWJsZU5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5OYW1lZE5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb24gaW1wbGVtZW50cyBEb2N1bWVudGFibGVOb2RlLCBXaXRoRGVjbGFyYXRpb24sIE5hbWVkTm9kZSB7CisKKwlwcml2YXRlIGludCBtb2RpZmllcnM7CisKKwlwcml2YXRlIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CisKKwlwcml2YXRlIFR5cGUgdHlwZTsKKworCXByaXZhdGUgTmFtZUV4cHIgbmFtZTsKKworCXByaXZhdGUgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKwlwcml2YXRlIGludCBhcnJheUNvdW50OworCisJcHJpdmF0ZSBMaXN0PE5hbWVFeHByPiB0aHJvd3NfOworCisJcHJpdmF0ZSBCbG9ja1N0bXQgYm9keTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHQgPSBmYWxzZTsKKworICAgIHB1YmxpYyBNZXRob2REZWNsYXJhdGlvbigpIHsKKwl9CisKKwlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgaW50IG1vZGlmaWVycywgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworCQlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwkJc2V0TmFtZShuYW1lKTsKKwl9CisKKwlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgaW50IG1vZGlmaWVycywgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKwkJc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisJCXNldFR5cGUodHlwZSk7CisJCXNldE5hbWUobmFtZSk7CisJCXNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisJfQorCisJcHVibGljIE1ldGhvZERlY2xhcmF0aW9uKGZpbmFsIGludCBtb2RpZmllcnMsIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLAorCQkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgbmFtZSwKKwkJCWZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBmaW5hbCBpbnQgYXJyYXlDb3VudCwgZmluYWwgTGlzdDxOYW1lRXhwcj4gdGhyb3dzXywgZmluYWwgQmxvY2tTdG10IGJsb2NrKSB7CisJCXN1cGVyKGFubm90YXRpb25zKTsKKwkJc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisJCXNldFR5cGVQYXJhbWV0ZXJzKHR5cGVQYXJhbWV0ZXJzKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKKwkJc2V0QXJyYXlDb3VudChhcnJheUNvdW50KTsKKwkJc2V0VGhyb3dzKHRocm93c18pOworCQlzZXRCb2R5KGJsb2NrKTsKKwl9CisKKwlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24oZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIGludCBtb2RpZmllcnMsIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLAorCQkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycywgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBTdHJpbmcgbmFtZSwKKwkJCWZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBmaW5hbCBpbnQgYXJyYXlDb3VudCwgZmluYWwgTGlzdDxOYW1lRXhwcj4gdGhyb3dzXywgZmluYWwgQmxvY2tTdG10IGJsb2NrKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgYW5ub3RhdGlvbnMpOworCQlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwkJc2V0VHlwZVBhcmFtZXRlcnModHlwZVBhcmFtZXRlcnMpOworCQlzZXRUeXBlKHR5cGUpOworCQlzZXROYW1lKG5hbWUpOworCQlzZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworCQlzZXRBcnJheUNvdW50KGFycmF5Q291bnQpOworCQlzZXRUaHJvd3ModGhyb3dzXyk7CisJCXNldEJvZHkoYmxvY2spOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0QXJyYXlDb3VudCgpIHsKKwkJcmV0dXJuIGFycmF5Q291bnQ7CisJfQorCisJLy8gRklYTUUgdGhpcyBpcyBjYWxsZWQgIkJsb2NrIiBpbiB0aGUgY29uc3RydWN0b3IuIFBpY2sgb25lLgorCXB1YmxpYyBCbG9ja1N0bXQgZ2V0Qm9keSgpIHsKKwkJcmV0dXJuIGJvZHk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBtb2RpZmllcnMgb2YgdGhpcyBtZW1iZXIgZGVjbGFyYXRpb24uCisJICogCisJICogQHNlZSBNb2RpZmllclNldAorCSAqIEByZXR1cm4gbW9kaWZpZXJzCisJICovCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiBtb2RpZmllcnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZS5nZXROYW1lKCk7CisJfQorCisgICAgcHVibGljIE5hbWVFeHByIGdldE5hbWVFeHByKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKwlwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKKyAgICAgICAgfQorCQlyZXR1cm4gcGFyYW1ldGVyczsKKwl9CisKKwlwdWJsaWMgTGlzdDxOYW1lRXhwcj4gZ2V0VGhyb3dzKCkgeworICAgICAgICBpZiAodGhyb3dzXyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvd3NfID0gbmV3IEFycmF5TGlzdDxOYW1lRXhwcj4oKTsKKyAgICAgICAgfQorCQlyZXR1cm4gdGhyb3dzXzsKKwl9CisKKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxUeXBlUGFyYW1ldGVyPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIHR5cGVQYXJhbWV0ZXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFycmF5Q291bnQoZmluYWwgaW50IGFycmF5Q291bnQpIHsKKwkJdGhpcy5hcnJheUNvdW50ID0gYXJyYXlDb3VudDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCb2R5KGZpbmFsIEJsb2NrU3RtdCBib2R5KSB7CisJCXRoaXMuYm9keSA9IGJvZHk7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYm9keSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TW9kaWZpZXJzKGZpbmFsIGludCBtb2RpZmllcnMpIHsKKwkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuZXcgTmFtZUV4cHIobmFtZSk7CisJfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZUV4cHIoZmluYWwgTmFtZUV4cHIgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5wYXJhbWV0ZXJzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaHJvd3MoZmluYWwgTGlzdDxOYW1lRXhwcj4gdGhyb3dzXykgeworCQl0aGlzLnRocm93c18gPSB0aHJvd3NfOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRocm93c18pOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZVBhcmFtZXRlcnMoZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgeworCQl0aGlzLnR5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHR5cGVQYXJhbWV0ZXJzKTsKKwl9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIGlzRGVmYXVsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7CisgICAgICAgIHRoaXMuaXNEZWZhdWx0ID0gaXNEZWZhdWx0OworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyh0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzKSB7CisgICAgICAgIHJldHVybiBnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGluY2x1ZGluZ01vZGlmaWVycywgaW5jbHVkaW5nVGhyb3dzLCB0cnVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlY2xhcmF0aW9uIHJldHVybmVkIGhhcyB0aGlzIHNjaGVtYToKKyAgICAgKgorICAgICAqIFthY2Nlc3NTcGVjaWZpZXJdIFtzdGF0aWNdIFthYnN0cmFjdF0gW2ZpbmFsXSBbbmF0aXZlXQorICAgICAqIFtzeW5jaHJvbml6ZWRdIHJldHVyblR5cGUgbWV0aG9kTmFtZSAoW3BhcmFtVHlwZSBbcGFyYW1OYW1lXV0pCisgICAgICogW3Rocm93cyBleGNlcHRpb25zTGlzdF0KKyAgICAgKiBAcmV0dXJuIG1ldGhvZCBkZWNsYXJhdGlvbiBhcyBTdHJpbmcKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uQXNTdHJpbmcoYm9vbGVhbiBpbmNsdWRpbmdNb2RpZmllcnMsIGJvb2xlYW4gaW5jbHVkaW5nVGhyb3dzLCBib29sZWFuIGluY2x1ZGluZ1BhcmFtZXRlck5hbWUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoaW5jbHVkaW5nTW9kaWZpZXJzKSB7CisgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgYWNjZXNzU3BlY2lmaWVyID0gTW9kaWZpZXJTZXQuZ2V0QWNjZXNzU3BlY2lmaWVyKGdldE1vZGlmaWVycygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhY2Nlc3NTcGVjaWZpZXIuZ2V0Q29kZVJlcHJlc2VuYXRpb24oKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYWNjZXNzU3BlY2lmaWVyID09IEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUID8gIiIgOiAiICIpOworICAgICAgICAgICAgaWYgKE1vZGlmaWVyU2V0LmlzU3RhdGljKGdldE1vZGlmaWVycygpKSl7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJzdGF0aWMgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTW9kaWZpZXJTZXQuaXNBYnN0cmFjdChnZXRNb2RpZmllcnMoKSkpeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJzdHJhY3QgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTW9kaWZpZXJTZXQuaXNGaW5hbChnZXRNb2RpZmllcnMoKSkpeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiZmluYWwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTW9kaWZpZXJTZXQuaXNOYXRpdmUoZ2V0TW9kaWZpZXJzKCkpKXsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm5hdGl2ZSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNb2RpZmllclNldC5pc1N5bmNocm9uaXplZChnZXRNb2RpZmllcnMoKSkpeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgic3luY2hyb25pemVkICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gdmVyaWZ5IGl0IGRvZXMgbm90IHByaW50IGNvbW1lbnRzIGNvbm5lY3RlZCB0byB0aGUgdHlwZQorICAgICAgICBzYi5hcHBlbmQoZ2V0VHlwZSgpLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpOworICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiKCIpOworICAgICAgICBib29sZWFuIGZpcnN0UGFyYW0gPSB0cnVlOworICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IGdldFBhcmFtZXRlcnMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0UGFyYW0pIHsKKyAgICAgICAgICAgICAgICBmaXJzdFBhcmFtID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmNsdWRpbmdQYXJhbWV0ZXJOYW1lKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFyYW0uZ2V0VHlwZSgpLnRvU3RyaW5nV2l0aG91dENvbW1lbnRzKCkpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc1ZhckFyZ3MoKSkgeworICAgICAgICAgICAgICAgIAlzYi5hcHBlbmQoIi4uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgaWYgKGluY2x1ZGluZ1Rocm93cykgeworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFRocm93ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoTmFtZUV4cHIgdGhyIDogZ2V0VGhyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RUaHJvdykgeworICAgICAgICAgICAgICAgICAgICBmaXJzdFRocm93ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHRocm93cyAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0aHIudG9TdHJpbmdXaXRob3V0Q29tbWVudHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SmF2YURvYyhKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudCkgeworICAgICAgICB0aGlzLmphdmFkb2NDb21tZW50ID0gamF2YWRvY0NvbW1lbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEphdmFkb2NDb21tZW50IGdldEphdmFEb2MoKSB7CisgICAgICAgIHJldHVybiBqYXZhZG9jQ29tbWVudDsKKyAgICB9CisKKyAgICBwcml2YXRlIEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50OworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01vZGlmaWVyU2V0LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvTW9kaWZpZXJTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgxY2VkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01vZGlmaWVyU2V0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQWNjZXNzU3BlY2lmaWVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKKy8qKgorICogQ2xhc3MgdG8gaG9sZCBtb2RpZmllcnMuPGJyPgorICogVGhlIG1vZGlmaWVyIGNvbnN0YW50cyBkZWNsYXJlZCBoZXJlIGhvbGRzIGVxdWl2YWxlbnQgdmFsdWVzIHRvCisgKiB7QGxpbmsgTW9kaWZpZXJ9IGNvbnN0YW50cy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vZGlmaWVyU2V0IHsKKworICAgIC8qIERlZmluaXRpb25zIG9mIHRoZSBiaXRzIGluIHRoZSBtb2RpZmllcnMgZmllbGQuICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gTW9kaWZpZXIuUFVCTElDOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURSA9IE1vZGlmaWVyLlBSSVZBVEU7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNURUQgPSBNb2RpZmllci5QUk9URUNURUQ7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUSUMgPSBNb2RpZmllci5TVEFUSUM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTCA9IE1vZGlmaWVyLkZJTkFMOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOQ0hST05JWkVEID0gTW9kaWZpZXIuU1lOQ0hST05JWkVEOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MQVRJTEUgPSBNb2RpZmllci5WT0xBVElMRTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSUVOVCA9IE1vZGlmaWVyLlRSQU5TSUVOVDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVElWRSA9IE1vZGlmaWVyLk5BVElWRTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUID0gTW9kaWZpZXIuQUJTVFJBQ1Q7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJQ1RGUCA9IE1vZGlmaWVyLlNUUklDVDsKKworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzU3BlY2lmaWVyIGdldEFjY2Vzc1NwZWNpZmllcihpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIGlmIChpc1B1YmxpYyhtb2RpZmllcnMpKXsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIuUFVCTElDOworICAgICAgICB9IGVsc2UgaWYgKGlzUHJvdGVjdGVkKG1vZGlmaWVycykpeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUk9URUNURUQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlKG1vZGlmaWVycykpeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5QUklWQVRFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc1NwZWNpZmllci5ERUZBVUxUOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgYWRkTW9kaWZpZXIoaW50IG1vZGlmaWVycywgaW50IG1vZCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzIHwgbW9kOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNb2RpZmllcihpbnQgbW9kaWZpZXJzLCBpbnQgbW9kaWZpZXIpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiBtb2RpZmllcikgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnN0cmFjdChpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgQUJTVFJBQ1QpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmluYWwoaW50IG1vZGlmaWVycykgeworICAgICAgICByZXR1cm4gKG1vZGlmaWVycyAmIEZJTkFMKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hdGl2ZShpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgTkFUSVZFKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaXZhdGUoaW50IG1vZGlmaWVycykgeworICAgICAgICByZXR1cm4gKG1vZGlmaWVycyAmIFBSSVZBVEUpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvdGVjdGVkKGludCBtb2RpZmllcnMpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiBQUk9URUNURUQpICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGVsZW1lbnQgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiB0aGUgcGFja2FnZT8KKyAgICAgKiBJdCBpcyB0aGUgbGV2ZWwgb2YgYWNjZXNzIHdoaWNoIGlzIGFwcGxpZWQgaWYgbm8gbW9kaWZpZXJzIGFyZSBjaG9zZW4sCisgICAgICogaXQgaXMgc29tZXRpbWVzIGNhbGxlZCAiZGVmYXVsdCIuCisgICAgICogQHBhcmFtIG1vZGlmaWVycyBpbmRpY2F0b3IKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbW9kaWZpZXIgZGVub3RlcyBwYWNrYWdlIGxldmVsIGFjY2VzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQYWNrYWdlTGV2ZWxBY2Nlc3MoaW50IG1vZGlmaWVycykgeworICAgICAgICByZXR1cm4gIWlzUHVibGljKG1vZGlmaWVycykgJiYgIWlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYgIWlzUHJpdmF0ZShtb2RpZmllcnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmxpYyhpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgUFVCTElDKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXRpYyhpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgU1RBVElDKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0cmljdGZwKGludCBtb2RpZmllcnMpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiBTVFJJQ1RGUCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoaW50IG1vZGlmaWVycykgeworICAgICAgICByZXR1cm4gKG1vZGlmaWVycyAmIFNZTkNIUk9OSVpFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFuc2llbnQoaW50IG1vZGlmaWVycykgeworICAgICAgICByZXR1cm4gKG1vZGlmaWVycyAmIFRSQU5TSUVOVCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWb2xhdGlsZShpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgVk9MQVRJTEUpICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbW9kaWZpZXIuCisgICAgICogQHBhcmFtIG1vZGlmaWVycyBleGlzdGluZyBtb2RpZmllcnMKKyAgICAgKiBAcGFyYW0gbW9kIG1vZGlmaWVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcmV0dXJuIHJlc3VsdCBmb3IgcmVtb3ZpbmcgbW9kaWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZW1vdmVNb2RpZmllcihpbnQgbW9kaWZpZXJzLCBpbnQgbW9kKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnMgJiB+bW9kOworICAgIH0KKworICAgIHByaXZhdGUgTW9kaWZpZXJTZXQoKSB7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NdWx0aVR5cGVQYXJhbWV0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9NdWx0aVR5cGVQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFkMjRjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L011bHRpVHlwZVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNdWx0aVR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBCYXNlUGFyYW1ldGVyIHsKKyAgICBwcml2YXRlIExpc3Q8VHlwZT4gdHlwZXM7CisJCisgICAgcHVibGljIE11bHRpVHlwZVBhcmFtZXRlcigpIHt9CisKKyAgICBwdWJsaWMgTXVsdGlUeXBlUGFyYW1ldGVyKGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBMaXN0PFR5cGU+IHR5cGVzLCBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICBzdXBlcihtb2RpZmllcnMsIGFubm90YXRpb25zLCBpZCk7CisgICAgICAgIHRoaXMudHlwZXMgPSB0eXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgTXVsdGlUeXBlUGFyYW1ldGVyKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBMaXN0PFR5cGU+IHR5cGVzLCBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIGlkKTsKKyAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOworCX0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VHlwZT4gZ2V0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhMaXN0PFR5cGU+IHR5cGVzKSB7CisgICAgICAgIHRoaXMudHlwZXMgPSB0eXBlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvUGFyYW1ldGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExM2Q3MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgQmFzZVBhcmFtZXRlciB7CisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYXJBcmdzOworCisgICAgcHVibGljIFBhcmFtZXRlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyKFR5cGUgdHlwZSwgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQpIHsKKyAgICAJc3VwZXIoaWQpOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoaW50IG1vZGlmaWVycywgVHlwZSB0eXBlLCBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgIAlzdXBlcihtb2RpZmllcnMsIGlkKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIGludCBtb2RpZmllcnMsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBUeXBlIHR5cGUsIGJvb2xlYW4gaXNWYXJBcmdzLCBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZCkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIG1vZGlmaWVycywgYW5ub3RhdGlvbnMsIGlkKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0VmFyQXJncyhpc1ZhckFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhckFyZ3MoKSB7CisgICAgICAgIHJldHVybiBpc1ZhckFyZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJBcmdzKGJvb2xlYW4gaXNWYXJBcmdzKSB7CisgICAgICAgIHRoaXMuaXNWYXJBcmdzID0gaXNWYXJBcmdzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9UeXBlRGVjbGFyYXRpb24uamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9UeXBlRGVjbGFyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdjMDkzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L1R5cGVEZWNsYXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlRGVjbGFyYXRpb24gZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb24gaW1wbGVtZW50cyBOYW1lZE5vZGUgeworCisJcHJpdmF0ZSBOYW1lRXhwciBuYW1lOworCisJcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOworCisJcHJpdmF0ZSBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVyczsKKworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24oKSB7CisJfQorCisJcHVibGljIFR5cGVEZWNsYXJhdGlvbihpbnQgbW9kaWZpZXJzLCBTdHJpbmcgbmFtZSkgeworCQlzZXROYW1lKG5hbWUpOworCQlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwl9CisKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLAorCQkJaW50IG1vZGlmaWVycywgU3RyaW5nIG5hbWUsCisJCQlMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycykgeworCQlzdXBlcihhbm5vdGF0aW9ucyk7CisJCXNldE5hbWUobmFtZSk7CisJCXNldE1vZGlmaWVycyhtb2RpZmllcnMpOworCQlzZXRNZW1iZXJzKG1lbWJlcnMpOworCX0KKworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb24oaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwKKwkJCWludCBlbmRDb2x1bW4sIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLAorCQkJaW50IG1vZGlmaWVycywgU3RyaW5nIG5hbWUsCisJCQlMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIGFubm90YXRpb25zKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0TW9kaWZpZXJzKG1vZGlmaWVycyk7CisJCXNldE1lbWJlcnMobWVtYmVycyk7CisJfQorCisJcHVibGljIGZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBnZXRNZW1iZXJzKCkgeworCQlyZXR1cm4gbWVtYmVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBvZiB0aGlzIHR5cGUgZGVjbGFyYXRpb24uCisJICogCisJICogQHNlZSBNb2RpZmllclNldAorCSAqIEByZXR1cm4gbW9kaWZpZXJzCisJICovCisJcHVibGljIGZpbmFsIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiBtb2RpZmllcnM7CisJfQorCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZS5nZXROYW1lKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVtYmVycyhMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycykgeworCQl0aGlzLm1lbWJlcnMgPSBtZW1iZXJzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLm1lbWJlcnMpOworCX0KKworCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCX0KKworCXB1YmxpYyBmaW5hbCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmV3IE5hbWVFeHByKG5hbWUpOworCX0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE5hbWVFeHByKE5hbWVFeHByIG5hbWVFeHByKSB7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lRXhwcjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgTmFtZUV4cHIgZ2V0TmFtZUV4cHIoKSB7CisgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwOTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9WYXJpYWJsZURlY2xhcmF0b3IuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRvciBleHRlbmRzIE5vZGUgeworCisgICAgcHJpdmF0ZSBWYXJpYWJsZURlY2xhcmF0b3JJZCBpZDsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBpbml0OworCisgICAgcHVibGljIFZhcmlhYmxlRGVjbGFyYXRvcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yKFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisgICAgICAgIHNldElkKGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9yKFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkLCBFeHByZXNzaW9uIGluaXQpIHsKKyAgICAJc2V0SWQoaWQpOworICAgIAlzZXRJbml0KGluaXQpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3IoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQsIEV4cHJlc3Npb24gaW5pdCkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRJZChpZCk7CisgICAgICAgIHNldEluaXQoaW5pdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEluaXQoKSB7CisgICAgICAgIHJldHVybiBpbml0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKFZhcmlhYmxlRGVjbGFyYXRvcklkIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5pdChFeHByZXNzaW9uIGluaXQpIHsKKyAgICAgICAgdGhpcy5pbml0ID0gaW5pdDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5pbml0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9ySWQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9WYXJpYWJsZURlY2xhcmF0b3JJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmJkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvVmFyaWFibGVEZWNsYXJhdG9ySWQuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRvcklkIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5hbWVkTm9kZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBpbnQgYXJyYXlDb3VudDsKKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVEZWNsYXJhdG9ySWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICBzZXROYW1lKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZURlY2xhcmF0b3JJZChpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBTdHJpbmcgbmFtZSwgaW50IGFycmF5Q291bnQpIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0QXJyYXlDb3VudChhcnJheUNvdW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBcnJheUNvdW50KCkgeworICAgICAgICByZXR1cm4gYXJyYXlDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5Q291bnQoaW50IGFycmF5Q291bnQpIHsKKyAgICAgICAgdGhpcy5hcnJheUNvdW50ID0gYXJyYXlDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvV2l0aERlY2xhcmF0aW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvV2l0aERlY2xhcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxNzI1YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9XaXRoRGVjbGFyYXRpb24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKKy8qKgorICogRWxlbWVudCB3aXRoIGEgZGVjbGFyYXRpb24gcmVwcmVzZW50YWJsZSBhcyBhIFN0cmluZy4KKyAqCisgKiBAYXV0aG9yIEZlZGVyaWNvIFRvbWFzc2V0dGkKKyAqIEBzaW5jZSBKdWx5IDIwMTQKKyAqLworcHVibGljIGludGVyZmFjZSBXaXRoRGVjbGFyYXRpb24geworCisgICAgLyoqCisgICAgICogQXMge0BsaW5rIFdpdGhEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pfSBpbmNsdWRpbmcKKyAgICAgKiB0aGUgbW9kaWZpZXJzLCB0aGUgdGhyb3dzIGNsYXVzZSBhbmQgdGhlIHBhcmFtZXRlcnMgd2l0aCBib3RoIHR5cGUgYW5kIG5hbWUuCisgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZygpOworCisgICAgLyoqCisgICAgICogQXMge0BsaW5rIFdpdGhEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbkFzU3RyaW5nKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pfSBpbmNsdWRpbmcKKyAgICAgKiB0aGUgcGFyYW1ldGVycyB3aXRoIGJvdGggdHlwZSBhbmQgbmFtZS4KKyAgICAgKiBAcGFyYW0gaW5jbHVkaW5nTW9kaWZpZXJzIGZsYWcgdG8gaW5jbHVkZSB0aGUgbW9kaWZpZXJzIChpZiBwcmVzZW50KSBpbiB0aGUgc3RyaW5nIHByb2R1Y2VkCisgICAgICogQHBhcmFtIGluY2x1ZGluZ1Rocm93cyBmbGFnIHRvIGluY2x1ZGUgdGhlIHRocm93cyBjbGF1c2UgKGlmIHByZXNlbnQpIGluIHRoZSBzdHJpbmcgcHJvZHVjZWQKKyAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkZWNsYXJhdGlvbiBiYXNlZCBvbiBwYXJhbWV0ZXIgZmxhZ3MKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuIGluY2x1ZGluZ01vZGlmaWVycywgYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MpOworCisgICAgLyoqCisgICAgICogQSBzaW1wbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24uCisgICAgICogSXQgc2hvdWxkIGZpdCBvbmUgc3RyaW5nLgorICAgICAqIEBwYXJhbSBpbmNsdWRpbmdNb2RpZmllcnMgZmxhZyB0byBpbmNsdWRlIHRoZSBtb2RpZmllcnMgKGlmIHByZXNlbnQpIGluIHRoZSBzdHJpbmcgcHJvZHVjZWQKKyAgICAgKiBAcGFyYW0gaW5jbHVkaW5nVGhyb3dzIGZsYWcgdG8gaW5jbHVkZSB0aGUgdGhyb3dzIGNsYXVzZSAoaWYgcHJlc2VudCkgaW4gdGhlIHN0cmluZyBwcm9kdWNlZAorICAgICAqIEBwYXJhbSBpbmNsdWRpbmdQYXJhbWV0ZXJOYW1lIGZsYWcgdG8gaW5jbHVkZSB0aGUgcGFyYW1ldGVyIG5hbWUgKHdoaWxlIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhbHdheXMgaW5jbHVkZWQpIGluIHRoZSBzdHJpbmcgcHJvZHVjZWQKKyAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkZWNsYXJhdGlvbiBiYXNlZCBvbiBwYXJhbWV0ZXIgZmxhZ3MKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhib29sZWFuIGluY2x1ZGluZ01vZGlmaWVycywgYm9vbGVhbiBpbmNsdWRpbmdUaHJvd3MsIGJvb2xlYW4gaW5jbHVkaW5nUGFyYW1ldGVyTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0Jsb2NrQ29tbWVudC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9CbG9ja0NvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk0OTNiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9CbG9ja0NvbW1lbnQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiA8cD4KKyAqIEFTVCBub2RlIHRoYXQgcmVwcmVzZW50IGJsb2NrIGNvbW1lbnRzLgorICogPC9wPgorICogQmxvY2sgY29tbWVudHMgY2FuIGhhcyBtdWx0aSBsaW5lcyBhbmQgYXJlIGRlbGltaXRlZCBieSAiLyYjNDI7IiBhbmQKKyAqICImIzQyOy8iLgorICogCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsb2NrQ29tbWVudCBleHRlbmRzIENvbW1lbnQgeworCisgICAgcHVibGljIEJsb2NrQ29tbWVudCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvY2tDb21tZW50KFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKGNvbnRlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBCbG9ja0NvbW1lbnQoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBjb250ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzU5NzJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CisKKy8qKgorICogQWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBBU1Qgbm9kZXMgdGhhdCByZXByZXNlbnQgY29tbWVudHMuCisgKiAKKyAqIEBzZWUgQmxvY2tDb21tZW50CisgKiBAc2VlIExpbmVDb21tZW50CisgKiBAc2VlIEphdmFkb2NDb21tZW50CisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOb2RlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnQ7CisgICAgcHJpdmF0ZSBOb2RlIGNvbW1lbnRlZE5vZGU7CisKKyAgICBwdWJsaWMgQ29tbWVudCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tbWVudChTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworICAgIH0KKworICAgIHB1YmxpYyBDb21tZW50KGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSBjb21tZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGV4dCBvZiB0aGUgY29tbWVudAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGV4dCBvZiB0aGUgY29tbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGVudAorICAgICAqICAgICAgICAgICAgdGhlIHRleHQgb2YgdGhlIGNvbW1lbnQgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGluZUNvbW1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBMaW5lQ29tbWVudCBhc0xpbmVDb21tZW50KCkKKyAgICB7CisgICAgICAgIGlmIChpc0xpbmVDb21tZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTGluZUNvbW1lbnQpIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBhIGxpbmUgY29tbWVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0Q29tbWVudGVkTm9kZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50ZWROb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRlZE5vZGUoTm9kZSBjb21tZW50ZWROb2RlKQorICAgIHsKKyAgICAgICAgaWYgKGNvbW1lbnRlZE5vZGU9PW51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudGVkTm9kZSA9IGNvbW1lbnRlZE5vZGU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1lbnRlZE5vZGU9PXRoaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tbWVudGVkTm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbW1lbnRlZE5vZGUgPSBjb21tZW50ZWROb2RlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3JwaGFuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRlZE5vZGUgPT0gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnRzQ29sbGVjdGlvbi5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk0YzYxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50czsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFNldCBvZiBjb21tZW50cyBwcm9kdWNlZCBieSBDb21tZW50c1BhcnNlci4KKyAqLworcHVibGljIGNsYXNzIENvbW1lbnRzQ29sbGVjdGlvbiB7CisgICAgcHJpdmF0ZSBMaXN0PExpbmVDb21tZW50PiBsaW5lQ29tbWVudHMgPSBuZXcgTGlua2VkTGlzdDxMaW5lQ29tbWVudD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QmxvY2tDb21tZW50PiBibG9ja0NvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8QmxvY2tDb21tZW50PigpOworICAgIHByaXZhdGUgTGlzdDxKYXZhZG9jQ29tbWVudD4gamF2YWRvY0NvbW1lbnRzID0gbmV3IExpbmtlZExpc3Q8SmF2YWRvY0NvbW1lbnQ+KCk7CisKKyAgICBwdWJsaWMgTGlzdDxMaW5lQ29tbWVudD4gZ2V0TGluZUNvbW1lbnRzKCl7CisgICAgICAgIHJldHVybiBsaW5lQ29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QmxvY2tDb21tZW50PiBnZXRCbG9ja0NvbW1lbnRzKCl7CisgICAgICAgIHJldHVybiBibG9ja0NvbW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEphdmFkb2NDb21tZW50PiBnZXRKYXZhZG9jQ29tbWVudHMoKXsKKyAgICAgICAgcmV0dXJuIGphdmFkb2NDb21tZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb21tZW50KExpbmVDb21tZW50IGxpbmVDb21tZW50KXsKKyAgICAgICAgdGhpcy5saW5lQ29tbWVudHMuYWRkKGxpbmVDb21tZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb21tZW50KEJsb2NrQ29tbWVudCBibG9ja0NvbW1lbnQpeworICAgICAgICB0aGlzLmJsb2NrQ29tbWVudHMuYWRkKGJsb2NrQ29tbWVudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ29tbWVudChKYXZhZG9jQ29tbWVudCBqYXZhZG9jQ29tbWVudCl7CisgICAgICAgIHRoaXMuamF2YWRvY0NvbW1lbnRzLmFkZChqYXZhZG9jQ29tbWVudCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ29tbWVudCBjb21tZW50KXsKKyAgICAgICAgZm9yIChDb21tZW50IGMgOiBnZXRBbGwoKSl7CisgICAgICAgICAgICAvLyB3ZSB0b2xsZXJhdGUgYSBkaWZmZXJlbmNlIG9mIG9uZSBlbGVtZW50IGluIHRoZSBlbmQgY29sdW1uOgorICAgICAgICAgICAgLy8gaXQgZGVwZW5kcyBob3cgXHIgYW5kIFxuIGFyZSBjYWxjdWxhdGVkLi4uCisgICAgICAgICAgICBpZiAoIGMuZ2V0QmVnaW5MaW5lKCk9PWNvbW1lbnQuZ2V0QmVnaW5MaW5lKCkgJiYKKyAgICAgICAgICAgICAgICAgYy5nZXRCZWdpbkNvbHVtbigpPT1jb21tZW50LmdldEJlZ2luQ29sdW1uKCkgJiYKKyAgICAgICAgICAgICAgICAgYy5nZXRFbmRMaW5lKCk9PWNvbW1lbnQuZ2V0RW5kTGluZSgpICYmCisgICAgICAgICAgICAgICAgIE1hdGguYWJzKGMuZ2V0RW5kQ29sdW1uKCktY29tbWVudC5nZXRFbmRDb2x1bW4oKSk8MiApeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxDb21tZW50PiBnZXRBbGwoKXsKKyAgICAgICAgTGlzdDxDb21tZW50PiBjb21tZW50cyA9IG5ldyBMaW5rZWRMaXN0PENvbW1lbnQ+KCk7CisgICAgICAgIGNvbW1lbnRzLmFkZEFsbChsaW5lQ29tbWVudHMpOworICAgICAgICBjb21tZW50cy5hZGRBbGwoYmxvY2tDb21tZW50cyk7CisgICAgICAgIGNvbW1lbnRzLmFkZEFsbChqYXZhZG9jQ29tbWVudHMpOworICAgICAgICByZXR1cm4gY29tbWVudHM7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCl7CisgICAgICAgIHJldHVybiBsaW5lQ29tbWVudHMuc2l6ZSgpK2Jsb2NrQ29tbWVudHMuc2l6ZSgpK2phdmFkb2NDb21tZW50cy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbiBtaW51cyhDb21tZW50c0NvbGxlY3Rpb24gb3RoZXIpeworICAgICAgICBDb21tZW50c0NvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IENvbW1lbnRzQ29sbGVjdGlvbigpOworICAgICAgICBmb3IgKExpbmVDb21tZW50IGNvbW1lbnQgOiBsaW5lQ29tbWVudHMpeworICAgICAgICAgICAgaWYgKCFvdGhlci5jb250YWlucyhjb21tZW50KSl7CisgICAgICAgICAgICAgICAgcmVzdWx0LmxpbmVDb21tZW50cy5hZGQoY29tbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChCbG9ja0NvbW1lbnQgY29tbWVudCA6IGJsb2NrQ29tbWVudHMpeworICAgICAgICAgICAgaWYgKCFvdGhlci5jb250YWlucyhjb21tZW50KSl7CisgICAgICAgICAgICAgICAgcmVzdWx0LmJsb2NrQ29tbWVudHMuYWRkKGNvbW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoSmF2YWRvY0NvbW1lbnQgY29tbWVudCA6IGphdmFkb2NDb21tZW50cyl7CisgICAgICAgICAgICBpZiAoIW90aGVyLmNvbnRhaW5zKGNvbW1lbnQpKXsKKyAgICAgICAgICAgICAgICByZXN1bHQuamF2YWRvY0NvbW1lbnRzLmFkZChjb21tZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQ29tbWVudHNQYXJzZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQ29tbWVudHNQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNhNTlkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9Db21tZW50c1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBUaGlzIHBhcnNlciBjYXJlcyBleGNsdXNpdmVseSBhYm91dCBjb21tZW50cy4KKyAqLworcHVibGljIGNsYXNzIENvbW1lbnRzUGFyc2VyIHsKKworICAgIHByaXZhdGUgZW51bSBTdGF0ZSB7CisgICAgICAgIENPREUsCisgICAgICAgIElOX0xJTkVfQ09NTUVOVCwKKyAgICAgICAgSU5fQkxPQ0tfQ09NTUVOVCwKKyAgICAgICAgSU5fU1RSSU5HLAorICAgICAgICBJTl9DSEFSOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5TX1BFUl9UQUIgPSA0OworCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbiBwYXJzZShmaW5hbCBTdHJpbmcgc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzb3VyY2UuZ2V0Qnl0ZXMoQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpKSk7CisgICAgICAgIHJldHVybiBwYXJzZShpbiwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpLm5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRzQ29sbGVjdGlvbiBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgU3RyaW5nIGNoYXJzZXROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGxhc3RXYXNBU2xhc2hSID0gZmFsc2U7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgY2hhcnNldE5hbWUpKTsKKyAgICAgICAgQ29tbWVudHNDb2xsZWN0aW9uIGNvbW1lbnRzID0gbmV3IENvbW1lbnRzQ29sbGVjdGlvbigpOworICAgICAgICBpbnQgcjsKKworICAgICAgICBEZXF1ZSBwcmV2VHdvQ2hhcnMgPSBuZXcgTGlua2VkTGlzdDxDaGFyYWN0ZXI+KEFycmF5cy5hc0xpc3QoJ3onLCd6JykpOworCisgICAgICAgIFN0YXRlIHN0YXRlID0gU3RhdGUuQ09ERTsKKyAgICAgICAgTGluZUNvbW1lbnQgY3VycmVudExpbmVDb21tZW50ID0gbnVsbDsKKyAgICAgICAgQmxvY2tDb21tZW50IGN1cnJlbnRCbG9ja0NvbW1lbnQgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgY3VycmVudENvbnRlbnQgPSBudWxsOworCisgICAgICAgIGludCBjdXJyTGluZSA9IDE7CisgICAgICAgIGludCBjdXJyQ29sICA9IDE7CisKKyAgICAgICAgd2hpbGUgKChyPWJyLnJlYWQoKSkgIT0gLTEpeworICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpcjsKKyAgICAgICAgICAgIGlmIChjPT0nXHInKXsKKyAgICAgICAgICAgICAgICBsYXN0V2FzQVNsYXNoUiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGM9PSdcbicmJmxhc3RXYXNBU2xhc2hSKXsKKyAgICAgICAgICAgICAgICBsYXN0V2FzQVNsYXNoUj1mYWxzZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFzdFdhc0FTbGFzaFI9ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAocHJldlR3b0NoYXJzLnBlZWtMYXN0KCkuZXF1YWxzKCcvJykgJiYgYyA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lQ29tbWVudCA9IG5ldyBMaW5lQ29tbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmVDb21tZW50LnNldEJlZ2luTGluZShjdXJyTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZUNvbW1lbnQuc2V0QmVnaW5Db2x1bW4oY3VyckNvbCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTl9MSU5FX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2VHdvQ2hhcnMucGVla0xhc3QoKS5lcXVhbHMoJy8nKSAmJiBjID09ICcqJykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrQ29tbWVudCA9IG5ldyBCbG9ja0NvbW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0NvbW1lbnQuc2V0QmVnaW5MaW5lKGN1cnJMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0NvbW1lbnQuc2V0QmVnaW5Db2x1bW4oY3VyckNvbCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTl9CTE9DS19DT01NRU5UOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSU5fU1RSSU5HOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wnJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTl9DSEFSOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5fTElORV9DT01NRU5UOgorICAgICAgICAgICAgICAgICAgICBpZiAoYz09J1xuJyB8fCBjPT0nXHInKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lQ29tbWVudC5zZXRDb250ZW50KGN1cnJlbnRDb250ZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmVDb21tZW50LnNldEVuZExpbmUoY3VyckxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmVDb21tZW50LnNldEVuZENvbHVtbihjdXJyQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFkZENvbW1lbnQoY3VycmVudExpbmVDb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQ09ERTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50LmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOX0JMT0NLX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2VHdvQ2hhcnMucGVla0xhc3QoKS5lcXVhbHMoJyonKSAmJiBjPT0nLycgJiYgIXByZXZUd29DaGFycy5wZWVrRmlyc3QoKS5lcXVhbHMoJy8nKSl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBsYXN0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBjdXJyZW50Q29udGVudC5kZWxldGVDaGFyQXQoY3VycmVudENvbnRlbnQudG9TdHJpbmcoKS5sZW5ndGgoKS0xKS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5zdGFydHNXaXRoKCIqIikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFkb2NDb21tZW50IGphdmFkb2NDb21tZW50ID0gbmV3IEphdmFkb2NDb21tZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YWRvY0NvbW1lbnQuc2V0Q29udGVudChjb250ZW50LnN1YnN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YWRvY0NvbW1lbnQuc2V0QmVnaW5MaW5lKGN1cnJlbnRCbG9ja0NvbW1lbnQuZ2V0QmVnaW5MaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFkb2NDb21tZW50LnNldEJlZ2luQ29sdW1uKGN1cnJlbnRCbG9ja0NvbW1lbnQuZ2V0QmVnaW5Db2x1bW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YWRvY0NvbW1lbnQuc2V0RW5kTGluZShjdXJyTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YWRvY0NvbW1lbnQuc2V0RW5kQ29sdW1uKGN1cnJDb2wrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYWRkQ29tbWVudChqYXZhZG9jQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0NvbW1lbnQuc2V0Q29udGVudChjb250ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2tDb21tZW50LnNldEVuZExpbmUoY3VyckxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0NvbW1lbnQuc2V0RW5kQ29sdW1uKGN1cnJDb2wrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYWRkQ29tbWVudChjdXJyZW50QmxvY2tDb21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQ09ERTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50LmFwcGVuZChjPT0nXHInPydcbic6Yyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTl9TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJldlR3b0NoYXJzLnBlZWtMYXN0KCkuZXF1YWxzKCdcXCcpICYmIGMgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkNPREU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTl9DSEFSOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZUd29DaGFycy5wZWVrTGFzdCgpLmVxdWFscygnXFwnKSAmJiBjID09ICdcJycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQ09ERTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChjKXsKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBjdXJyTGluZSs9MTsKKyAgICAgICAgICAgICAgICAgICAgY3VyckNvbCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICAgICAgY3VyckNvbCs9Q09MVU1OU19QRVJfVEFCOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjdXJyQ29sKz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldlR3b0NoYXJzLnJlbW92ZSgpOworICAgICAgICAgICAgcHJldlR3b0NoYXJzLmFkZChjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZT09U3RhdGUuSU5fTElORV9DT01NRU5UKXsKKyAgICAgICAgICAgIGN1cnJlbnRMaW5lQ29tbWVudC5zZXRDb250ZW50KGN1cnJlbnRDb250ZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgY3VycmVudExpbmVDb21tZW50LnNldEVuZExpbmUoY3VyckxpbmUpOworICAgICAgICAgICAgY3VycmVudExpbmVDb21tZW50LnNldEVuZENvbHVtbihjdXJyQ29sKTsKKyAgICAgICAgICAgIGNvbW1lbnRzLmFkZENvbW1lbnQoY3VycmVudExpbmVDb21tZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvSmF2YWRvY0NvbW1lbnQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvSmF2YWRvY0NvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDcwMzIxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9KYXZhZG9jQ29tbWVudC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmF2YWRvY0NvbW1lbnQgZXh0ZW5kcyBDb21tZW50IHsKKworICAgIHB1YmxpYyBKYXZhZG9jQ29tbWVudCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWRvY0NvbW1lbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIoY29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIEphdmFkb2NDb21tZW50KGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgY29udGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvTGluZUNvbW1lbnQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvTGluZUNvbW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RmMWRmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9jb21tZW50cy9MaW5lQ29tbWVudC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIDxwPgorICogQVNUIG5vZGUgdGhhdCByZXByZXNlbnQgbGluZSBjb21tZW50cy4KKyAqIDwvcD4KKyAqIExpbmUgY29tbWVudHMgYXJlIHN0YXJ0ZWQgd2l0aCAiLy8iIGFuZCBmaW5pc2ggYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAoIlxuIikuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTGluZUNvbW1lbnQgZXh0ZW5kcyBDb21tZW50IHsKKworICAgIHB1YmxpYyBMaW5lQ29tbWVudCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTGluZUNvbW1lbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIoY29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIExpbmVDb21tZW50KGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgY29udGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGluZUNvbW1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fubm90YXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQW5ub3RhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY1ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fubm90YXRpb25FeHByLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXByb3RlY3RlZCBOYW1lRXhwciBuYW1lOworCisJcHVibGljIEFubm90YXRpb25FeHByKCkge30KKworCXB1YmxpYyBBbm5vdGF0aW9uRXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLAorCQkJaW50IGVuZENvbHVtbikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCX0KKworCXB1YmxpYyBOYW1lRXhwciBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKE5hbWVFeHByIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YobmFtZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5QWNjZXNzRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5QWNjZXNzRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjZkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlBY2Nlc3NFeHByLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFycmF5QWNjZXNzRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIG5hbWU7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gaW5kZXg7CisKKyAgICBwdWJsaWMgQXJyYXlBY2Nlc3NFeHByKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUFjY2Vzc0V4cHIoRXhwcmVzc2lvbiBuYW1lLCBFeHByZXNzaW9uIGluZGV4KSB7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEluZGV4KGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlBY2Nlc3NFeHByKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIEV4cHJlc3Npb24gbmFtZSwgRXhwcmVzc2lvbiBpbmRleCkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICBzZXRJbmRleChpbmRleCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5kZXgoRXhwcmVzc2lvbiBpbmRleCkgeworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoRXhwcmVzc2lvbiBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMubmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5Q3JlYXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXJyYXlDcmVhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E0MjViCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5Q3JlYXRpb25FeHByLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFycmF5Q3JlYXRpb25FeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKworICAgIHByaXZhdGUgaW50IGFycmF5Q291bnQ7CisKKyAgICBwcml2YXRlIEFycmF5SW5pdGlhbGl6ZXJFeHByIGluaXRpYWxpemVyOworCisgICAgcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IGRpbWVuc2lvbnM7CisKKyAgICBwcml2YXRlIExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IGFycmF5c0Fubm90YXRpb25zOworCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwcihUeXBlIHR5cGUsIGludCBhcnJheUNvdW50LCBBcnJheUluaXRpYWxpemVyRXhwciBpbml0aWFsaXplcikgeworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgICAgICBzZXRBcnJheUNvdW50KGFycmF5Q291bnQpOworICAgICAgICBzZXRJbml0aWFsaXplcihpbml0aWFsaXplcik7CisgICAgICAgIHNldERpbWVuc2lvbnMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5Q3JlYXRpb25FeHByKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIFR5cGUgdHlwZSwgaW50IGFycmF5Q291bnQsIEFycmF5SW5pdGlhbGl6ZXJFeHByIGluaXRpYWxpemVyKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldEFycmF5Q291bnQoYXJyYXlDb3VudCk7CisgICAgICAgIHNldEluaXRpYWxpemVyKGluaXRpYWxpemVyKTsKKyAgICAgICAgc2V0RGltZW5zaW9ucyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJyYXlDcmVhdGlvbkV4cHIoVHlwZSB0eXBlLCBMaXN0PEV4cHJlc3Npb24+IGRpbWVuc2lvbnMsIGludCBhcnJheUNvdW50KSB7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgICAgIHNldEFycmF5Q291bnQoYXJyYXlDb3VudCk7CisgICAgICAgIHNldERpbWVuc2lvbnMoZGltZW5zaW9ucyk7CisgICAgICAgIHNldEluaXRpYWxpemVyKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUNyZWF0aW9uRXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBUeXBlIHR5cGUsIExpc3Q8RXhwcmVzc2lvbj4gZGltZW5zaW9ucywgaW50IGFycmF5Q291bnQpIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0QXJyYXlDb3VudChhcnJheUNvdW50KTsKKyAgICAgICAgc2V0RGltZW5zaW9ucyhkaW1lbnNpb25zKTsKKyAgICAgICAgc2V0SW5pdGlhbGl6ZXIobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXJyYXlDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGFycmF5Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0RGltZW5zaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGRpbWVuc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIEFycmF5SW5pdGlhbGl6ZXJFeHByIGdldEluaXRpYWxpemVyKCkgeworICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZXI7CisgICAgfQorCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJyYXlDb3VudChpbnQgYXJyYXlDb3VudCkgeworICAgICAgICB0aGlzLmFycmF5Q291bnQgPSBhcnJheUNvdW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpbWVuc2lvbnMoTGlzdDxFeHByZXNzaW9uPiBkaW1lbnNpb25zKSB7CisgICAgICAgIHRoaXMuZGltZW5zaW9ucyA9IGRpbWVuc2lvbnM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZGltZW5zaW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplckV4cHIgaW5pdGlhbGl6ZXIpIHsKKyAgICAgICAgdGhpcy5pbml0aWFsaXplciA9IGluaXRpYWxpemVyOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmluaXRpYWxpemVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBnZXRBcnJheXNBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFycmF5c0Fubm90YXRpb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5c0Fubm90YXRpb25zKAorICAgICAgICAgICAgTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gYXJyYXlzQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5hcnJheXNBbm5vdGF0aW9ucyA9IGFycmF5c0Fubm90YXRpb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUluaXRpYWxpemVyRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0FycmF5SW5pdGlhbGl6ZXJFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmYTQyNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9BcnJheUluaXRpYWxpemVyRXhwci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFycmF5SW5pdGlhbGl6ZXJFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzOworCisgICAgcHVibGljIEFycmF5SW5pdGlhbGl6ZXJFeHByKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwcihMaXN0PEV4cHJlc3Npb24+IHZhbHVlcykgeworICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUluaXRpYWxpemVyRXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBMaXN0PEV4cHJlc3Npb24+IHZhbHVlcykgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhMaXN0PEV4cHJlc3Npb24+IHZhbHVlcykgeworICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy52YWx1ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Bc3NpZ25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDUwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXNzaWduRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHVibGljIHN0YXRpYyBlbnVtIE9wZXJhdG9yIHsKKyAgICAgICAgYXNzaWduLCAvLyA9CisgICAgICAgIHBsdXMsIC8vICs9CisgICAgICAgIG1pbnVzLCAvLyAtPQorICAgICAgICBzdGFyLCAvLyAqPQorICAgICAgICBzbGFzaCwgLy8gLz0KKyAgICAgICAgYW5kLCAvLyAmPQorICAgICAgICBvciwgLy8gfD0KKyAgICAgICAgeG9yLCAvLyBePQorICAgICAgICByZW0sIC8vICU9CisgICAgICAgIGxTaGlmdCwgLy8gPDw9CisgICAgICAgIHJTaWduZWRTaGlmdCwgLy8gPj49CisgICAgICAgIHJVbnNpZ25lZFNoaWZ0LCAvLyA+Pj49CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRhcmdldDsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiB2YWx1ZTsKKworICAgIHByaXZhdGUgT3BlcmF0b3Igb3A7CisKKyAgICBwdWJsaWMgQXNzaWduRXhwcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzaWduRXhwcihFeHByZXNzaW9uIHRhcmdldCwgRXhwcmVzc2lvbiB2YWx1ZSwgT3BlcmF0b3Igb3ApIHsKKyAgICAgICAgc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgc2V0T3BlcmF0b3Iob3ApOworICAgIH0KKworICAgIHB1YmxpYyBBc3NpZ25FeHByKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIEV4cHJlc3Npb24gdGFyZ2V0LCBFeHByZXNzaW9uIHZhbHVlLCBPcGVyYXRvciBvcCkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICBzZXRPcGVyYXRvcihvcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG9wOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKE9wZXJhdG9yIG9wKSB7CisgICAgICAgIHRoaXMub3AgPSBvcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoRXhwcmVzc2lvbiB0YXJnZXQpIHsKKyAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudGFyZ2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy52YWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0JpbmFyeUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjZTRiZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gT3BlcmF0b3IgeworICAgICAgICBvciwgLy8gfHwKKyAgICAgICAgYW5kLCAvLyAmJgorICAgICAgICBiaW5PciwgLy8gfAorICAgICAgICBiaW5BbmQsIC8vICYKKyAgICAgICAgeG9yLCAvLyBeCisgICAgICAgIGVxdWFscywgLy8gPT0KKyAgICAgICAgbm90RXF1YWxzLCAvLyAhPQorICAgICAgICBsZXNzLCAvLyA8CisgICAgICAgIGdyZWF0ZXIsIC8vID4KKyAgICAgICAgbGVzc0VxdWFscywgLy8gPD0KKyAgICAgICAgZ3JlYXRlckVxdWFscywgLy8gPj0KKyAgICAgICAgbFNoaWZ0LCAvLyA8PAorICAgICAgICByU2lnbmVkU2hpZnQsIC8vID4+CisgICAgICAgIHJVbnNpZ25lZFNoaWZ0LCAvLyA+Pj4KKyAgICAgICAgcGx1cywgLy8gKworICAgICAgICBtaW51cywgLy8gLQorICAgICAgICB0aW1lcywgLy8gKgorICAgICAgICBkaXZpZGUsIC8vIC8KKyAgICAgICAgcmVtYWluZGVyLCAvLyAlCisgICAgfQorCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGxlZnQ7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gcmlnaHQ7CisKKyAgICBwcml2YXRlIE9wZXJhdG9yIG9wOworCisgICAgcHVibGljIEJpbmFyeUV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIEJpbmFyeUV4cHIoRXhwcmVzc2lvbiBsZWZ0LCBFeHByZXNzaW9uIHJpZ2h0LCBPcGVyYXRvciBvcCkgeworICAgIAlzZXRMZWZ0KGxlZnQpOworICAgIAlzZXRSaWdodChyaWdodCk7CisgICAgCXNldE9wZXJhdG9yKG9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmluYXJ5RXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBFeHByZXNzaW9uIGxlZnQsIEV4cHJlc3Npb24gcmlnaHQsIE9wZXJhdG9yIG9wKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgCXNldExlZnQobGVmdCk7CisgICAgCXNldFJpZ2h0KHJpZ2h0KTsKKyAgICAJc2V0T3BlcmF0b3Iob3ApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRMZWZ0KCkgeworICAgICAgICByZXR1cm4gbGVmdDsKKyAgICB9CisKKyAgICBwdWJsaWMgT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBvcDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRSaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExlZnQoRXhwcmVzc2lvbiBsZWZ0KSB7CisgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMubGVmdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3BlcmF0b3IoT3BlcmF0b3Igb3ApIHsKKyAgICAgICAgdGhpcy5vcCA9IG9wOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJpZ2h0KEV4cHJlc3Npb24gcmlnaHQpIHsKKyAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnJpZ2h0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQm9vbGVhbkxpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQm9vbGVhbkxpdGVyYWxFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Cb29sZWFuTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhbkxpdGVyYWxFeHByIGV4dGVuZHMgTGl0ZXJhbEV4cHIgeworCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbHVlOworCisgICAgcHVibGljIEJvb2xlYW5MaXRlcmFsRXhwcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vbGVhbkxpdGVyYWxFeHByKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAJc2V0VmFsdWUodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBCb29sZWFuTGl0ZXJhbEV4cHIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2FzdEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMzODY5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Nhc3RFeHByLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENhc3RFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByOworCisgICAgcHVibGljIENhc3RFeHByKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDYXN0RXhwcihUeXBlIHR5cGUsIEV4cHJlc3Npb24gZXhwcikgeworICAgIAlzZXRUeXBlKHR5cGUpOworICAgIAlzZXRFeHByKGV4cHIpOworICAgIH0KKworICAgIHB1YmxpYyBDYXN0RXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBUeXBlIHR5cGUsIEV4cHJlc3Npb24gZXhwcikgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRUeXBlKHR5cGUpOworICAgIAlzZXRFeHByKGV4cHIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByKCkgeworICAgICAgICByZXR1cm4gZXhwcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHByKEV4cHJlc3Npb24gZXhwcikgeworICAgICAgICB0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NoYXJMaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NoYXJMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTgwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2hhckxpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENoYXJMaXRlcmFsRXhwciBleHRlbmRzIFN0cmluZ0xpdGVyYWxFeHByIHsKKworICAgIHB1YmxpYyBDaGFyTGl0ZXJhbEV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIENoYXJMaXRlcmFsRXhwcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyTGl0ZXJhbEV4cHIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2xhc3NFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ2xhc3NFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzM2M2NwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9DbGFzc0V4cHIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKKworICAgIHB1YmxpYyBDbGFzc0V4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIENsYXNzRXhwcihUeXBlIHR5cGUpIHsKKyAgICAgICBzZXRUeXBlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0V4cHIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgVHlwZSB0eXBlKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NvbmRpdGlvbmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0NvbmRpdGlvbmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGI2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQ29uZGl0aW9uYWxFeHByLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbmRpdGlvbmFsRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNvbmRpdGlvbjsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiB0aGVuRXhwcjsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBlbHNlRXhwcjsKKworICAgIHB1YmxpYyBDb25kaXRpb25hbEV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIENvbmRpdGlvbmFsRXhwcihFeHByZXNzaW9uIGNvbmRpdGlvbiwgRXhwcmVzc2lvbiB0aGVuRXhwciwgRXhwcmVzc2lvbiBlbHNlRXhwcikgeworICAgICAgICBzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKyAgICAgICAgc2V0VGhlbkV4cHIodGhlbkV4cHIpOworICAgICAgICBzZXRFbHNlRXhwcihlbHNlRXhwcik7CisgICAgfQorCisgICAgcHVibGljIENvbmRpdGlvbmFsRXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgRXhwcmVzc2lvbiB0aGVuRXhwciwgRXhwcmVzc2lvbiBlbHNlRXhwcikgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICBzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKyAgICAgICAgc2V0VGhlbkV4cHIodGhlbkV4cHIpOworICAgICAgICBzZXRFbHNlRXhwcihlbHNlRXhwcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldENvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFbHNlRXhwcigpIHsKKyAgICAgICAgcmV0dXJuIGVsc2VFeHByOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFRoZW5FeHByKCkgeworICAgICAgICByZXR1cm4gdGhlbkV4cHI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uKEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbmRpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RWxzZUV4cHIoRXhwcmVzc2lvbiBlbHNlRXhwcikgeworICAgICAgICB0aGlzLmVsc2VFeHByID0gZWxzZUV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZWxzZUV4cHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRoZW5FeHByKEV4cHJlc3Npb24gdGhlbkV4cHIpIHsKKyAgICAgICAgdGhpcy50aGVuRXhwciA9IHRoZW5FeHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRoZW5FeHByKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRG91YmxlTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Eb3VibGVMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjk2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRG91YmxlTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRG91YmxlTGl0ZXJhbEV4cHIgZXh0ZW5kcyBTdHJpbmdMaXRlcmFsRXhwciB7CisKKwlwdWJsaWMgRG91YmxlTGl0ZXJhbEV4cHIoKSB7CisJfQorCisJcHVibGljIERvdWJsZUxpdGVyYWxFeHByKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcih2YWx1ZSk7CisJfQorCisJcHVibGljIERvdWJsZUxpdGVyYWxFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCB2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0VuY2xvc2VkRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0VuY2xvc2VkRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjlkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRW5jbG9zZWRFeHByLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVuY2xvc2VkRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGlubmVyOworCisJcHVibGljIEVuY2xvc2VkRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgRW5jbG9zZWRFeHByKGZpbmFsIEV4cHJlc3Npb24gaW5uZXIpIHsKKwkJc2V0SW5uZXIoaW5uZXIpOworCX0KKworCXB1YmxpYyBFbmNsb3NlZEV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIEV4cHJlc3Npb24gaW5uZXIpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0SW5uZXIoaW5uZXIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldElubmVyKCkgeworCQlyZXR1cm4gaW5uZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5uZXIoZmluYWwgRXhwcmVzc2lvbiBpbm5lcikgeworCQl0aGlzLmlubmVyID0gaW5uZXI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5uZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9FeHByZXNzaW9uLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzZkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24gZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBFeHByZXNzaW9uKCkgeworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4pIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9GaWVsZEFjY2Vzc0V4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9GaWVsZEFjY2Vzc0V4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdiZjdmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ZpZWxkQWNjZXNzRXhwci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpZWxkQWNjZXNzRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisJcHJpdmF0ZSBFeHByZXNzaW9uIHNjb3BlOworCisJcHJpdmF0ZSBMaXN0PFR5cGU+IHR5cGVBcmdzOworCisJcHJpdmF0ZSBOYW1lRXhwciBmaWVsZDsKKworCXB1YmxpYyBGaWVsZEFjY2Vzc0V4cHIoKSB7CisJfQorCisJcHVibGljIEZpZWxkQWNjZXNzRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTdHJpbmcgZmllbGQpIHsKKwkJc2V0U2NvcGUoc2NvcGUpOworCQlzZXRGaWVsZChmaWVsZCk7CisJfQorCisJcHVibGljIEZpZWxkQWNjZXNzRXhwcihmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgTGlzdDxUeXBlPiB0eXBlQXJncywgZmluYWwgU3RyaW5nIGZpZWxkKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldFNjb3BlKHNjb3BlKTsKKwkJc2V0VHlwZUFyZ3ModHlwZUFyZ3MpOworCQlzZXRGaWVsZChmaWVsZCk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaWVsZCgpIHsKKwkJcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKKwl9CisKKwlwdWJsaWMgTmFtZUV4cHIgZ2V0RmllbGRFeHByKCkgeworCQlyZXR1cm4gZmllbGQ7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0U2NvcGUoKSB7CisJCXJldHVybiBzY29wZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxUeXBlPiBnZXRUeXBlQXJncygpIHsKKwkJcmV0dXJuIHR5cGVBcmdzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZpZWxkKGZpbmFsIFN0cmluZyBmaWVsZCkgeworCQl0aGlzLmZpZWxkID0gbmV3IE5hbWVFeHByKGZpZWxkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGaWVsZEV4cHIoTmFtZUV4cHIgZmllbGQpIHsKKwkJdGhpcy5maWVsZCA9IGZpZWxkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNjb3BlKGZpbmFsIEV4cHJlc3Npb24gc2NvcGUpIHsKKwkJdGhpcy5zY29wZSA9IHNjb3BlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnNjb3BlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlQXJncyhmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzKSB7CisJCXRoaXMudHlwZUFyZ3MgPSB0eXBlQXJnczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlQXJncyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0luc3RhbmNlT2ZFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvSW5zdGFuY2VPZkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTk3ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0luc3RhbmNlT2ZFeHByLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbmNlT2ZFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcjsKKworCXByaXZhdGUgVHlwZSB0eXBlOworCisJcHVibGljIEluc3RhbmNlT2ZFeHByKCkgeworCX0KKworCXB1YmxpYyBJbnN0YW5jZU9mRXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHIsIGZpbmFsIFR5cGUgdHlwZSkgeworCQlzZXRFeHByKGV4cHIpOworCQlzZXRUeXBlKHR5cGUpOworCX0KKworCXB1YmxpYyBJbnN0YW5jZU9mRXhwcihmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgRXhwcmVzc2lvbiBleHByLCBmaW5hbCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0RXhwcihleHByKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeHByKGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQl0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ludGVnZXJMaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ludGVnZXJMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjZjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvSW50ZWdlckxpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGNsYXNzIEludGVnZXJMaXRlcmFsRXhwciBleHRlbmRzIFN0cmluZ0xpdGVyYWxFeHByIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNJR05FRF9NSU5fVkFMVUUgPSAiMjE0NzQ4MzY0OCI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fVkFMVUUgPSAiLSIgKyBVTlNJR05FRF9NSU5fVkFMVUU7CisKKwlwdWJsaWMgSW50ZWdlckxpdGVyYWxFeHByKCkgeworCX0KKworCXB1YmxpYyBJbnRlZ2VyTGl0ZXJhbEV4cHIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJCXN1cGVyKHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlckxpdGVyYWxFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCB2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgLy8KKwkJCQl2YWx1ZS5sZW5ndGgoKSA9PSAxMCAmJiAvLworCQkJCXZhbHVlLmVxdWFscyhVTlNJR05FRF9NSU5fVkFMVUUpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0ludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4YjU2NAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBleHRlbmRzIEludGVnZXJMaXRlcmFsRXhwciB7CisKKwlwdWJsaWMgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIoKSB7CisJCXN1cGVyKE1JTl9WQUxVRSk7CisJfQorCisJcHVibGljIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4pIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBNSU5fVkFMVUUpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xhbWJkYUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MYW1iZGFFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0ZTkzNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MYW1iZGFFeHByLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIExhbWJkYSBleHByZXNzaW9ucy4gCisgKiBAYXV0aG9yIFJhcXVlbCBQYXUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMYW1iZGFFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzOworCisJcHJpdmF0ZSBib29sZWFuIHBhcmFtZXRlcnNFbmNsb3NlZDsKKworCXByaXZhdGUgU3RhdGVtZW50IGJvZHk7CisKKwlwdWJsaWMgTGFtYmRhRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgTGFtYmRhRXhwcihpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRDb2x1bW4sIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBTdGF0ZW1lbnQgYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmFtZXRlcnNFbmNsb3NlZCkgeworCisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisJCXNldEJvZHkoYm9keSk7CisgICAgICAgIHNldFBhcmFtZXRlcnNFbmNsb3NlZChwYXJhbWV0ZXJzRW5jbG9zZWQpOworCX0KKworCXB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIHBhcmFtZXRlcnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycykgeworCQl0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnBhcmFtZXRlcnMpOworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKwkJcmV0dXJuIGJvZHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Qm9keShTdGF0ZW1lbnQgYm9keSkgeworCQl0aGlzLmJvZHkgPSBib2R5OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJvZHkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KFZvaWRWaXNpdG9yPEE+IHYsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcnNFbmNsb3NlZCgpIHsKKwkJcmV0dXJuIHBhcmFtZXRlcnNFbmNsb3NlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzRW5jbG9zZWQoYm9vbGVhbiBwYXJhbWV0ZXJzRW5jbG9zZWQpIHsKKwkJdGhpcy5wYXJhbWV0ZXJzRW5jbG9zZWQgPSBwYXJhbWV0ZXJzRW5jbG9zZWQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjdmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbEV4cHIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXRlcmFsRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisJcHVibGljIExpdGVyYWxFeHByKCkgeworCX0KKworCXB1YmxpYyBMaXRlcmFsRXhwcihmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZWEyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTG9uZ0xpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGNsYXNzIExvbmdMaXRlcmFsRXhwciBleHRlbmRzIFN0cmluZ0xpdGVyYWxFeHByIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNJR05FRF9NSU5fVkFMVUUgPSAiOTIyMzM3MjAzNjg1NDc3NTgwOCI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fVkFMVUUgPSAiLSIgKyBVTlNJR05FRF9NSU5fVkFMVUUgKyAiTCI7CisKKwlwdWJsaWMgTG9uZ0xpdGVyYWxFeHByKCkgeworCX0KKworCXB1YmxpYyBMb25nTGl0ZXJhbEV4cHIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJCXN1cGVyKHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgTG9uZ0xpdGVyYWxFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCB2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgLy8KKwkJCQl2YWx1ZS5sZW5ndGgoKSA9PSAyMCAmJiAvLworCQkJCXZhbHVlLnN0YXJ0c1dpdGgoVU5TSUdORURfTUlOX1ZBTFVFKSAmJiAvLworCQkJCSh2YWx1ZS5jaGFyQXQoMTkpID09ICdMJyB8fCB2YWx1ZS5jaGFyQXQoMTkpID09ICdsJyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsTWluVmFsdWVFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzUxZjdhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0xvbmdMaXRlcmFsTWluVmFsdWVFeHByLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIGV4dGVuZHMgTG9uZ0xpdGVyYWxFeHByIHsKKworCXB1YmxpYyBMb25nTGl0ZXJhbE1pblZhbHVlRXhwcigpIHsKKwkJc3VwZXIoTUlOX1ZBTFVFKTsKKwl9CisKKwlwdWJsaWMgTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIE1JTl9WQUxVRSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWFya2VyQW5ub3RhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NYXJrZXJBbm5vdGF0aW9uRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTM1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWFya2VyQW5ub3RhdGlvbkV4cHIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWFya2VyQW5ub3RhdGlvbkV4cHIgZXh0ZW5kcyBBbm5vdGF0aW9uRXhwciB7CisKKwlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIoKSB7CisJfQorCisJcHVibGljIE1hcmtlckFubm90YXRpb25FeHByKGZpbmFsIE5hbWVFeHByIG5hbWUpIHsKKwkJc2V0TmFtZShuYW1lKTsKKwl9CisKKwlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbkV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIE5hbWVFeHByIG5hbWUpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0TmFtZShuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZW1iZXJWYWx1ZVBhaXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZW1iZXJWYWx1ZVBhaXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGZhODBjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01lbWJlclZhbHVlUGFpci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTmFtZWROb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVtYmVyVmFsdWVQYWlyIGV4dGVuZHMgTm9kZSBpbXBsZW1lbnRzIE5hbWVkTm9kZSB7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJcHJpdmF0ZSBFeHByZXNzaW9uIHZhbHVlOworCisJcHVibGljIE1lbWJlclZhbHVlUGFpcigpIHsKKwl9CisKKwlwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBFeHByZXNzaW9uIHZhbHVlKSB7CisJCXNldE5hbWUobmFtZSk7CisJCXNldFZhbHVlKHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgTWVtYmVyVmFsdWVQYWlyKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRXhwcmVzc2lvbiB2YWx1ZSkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXROYW1lKG5hbWUpOworCQlzZXRWYWx1ZSh2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBFeHByZXNzaW9uIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy52YWx1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZENhbGxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kQ2FsbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVkMTBmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZENhbGxFeHByLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZENhbGxFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gc2NvcGU7CisKKwlwcml2YXRlIExpc3Q8VHlwZT4gdHlwZUFyZ3M7CisKKwlwcml2YXRlIE5hbWVFeHByIG5hbWU7CisKKwlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gYXJnczsKKworCXB1YmxpYyBNZXRob2RDYWxsRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgTWV0aG9kQ2FsbEV4cHIoZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJc2V0U2NvcGUoc2NvcGUpOworCQlzZXROYW1lKG5hbWUpOworCX0KKworCXB1YmxpYyBNZXRob2RDYWxsRXhwcihmaW5hbCBFeHByZXNzaW9uIHNjb3BlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhcmdzKSB7CisJCXNldFNjb3BlKHNjb3BlKTsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0QXJncyhhcmdzKTsKKwl9CisKKwlwdWJsaWMgTWV0aG9kQ2FsbEV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIEV4cHJlc3Npb24gc2NvcGUsIGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3MsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0U2NvcGUoc2NvcGUpOworCQlzZXRUeXBlQXJncyh0eXBlQXJncyk7CisJCXNldE5hbWUobmFtZSk7CisJCXNldEFyZ3MoYXJncyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0QXJncygpIHsKKwkJcmV0dXJuIGFyZ3M7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZS5nZXROYW1lKCk7CisJfQorCisJcHVibGljIE5hbWVFeHByIGdldE5hbWVFeHByKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRTY29wZSgpIHsKKwkJcmV0dXJuIHNjb3BlOworCX0KKworCXB1YmxpYyBMaXN0PFR5cGU+IGdldFR5cGVBcmdzKCkgeworCQlyZXR1cm4gdHlwZUFyZ3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJncyhmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKwkJdGhpcy5hcmdzID0gYXJnczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hcmdzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5ldyBOYW1lRXhwcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lRXhwcihOYW1lRXhwciBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2NvcGUoZmluYWwgRXhwcmVzc2lvbiBzY29wZSkgeworCQl0aGlzLnNjb3BlID0gc2NvcGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuc2NvcGUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGVBcmdzKGZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3MpIHsKKwkJdGhpcy50eXBlQXJncyA9IHR5cGVBcmdzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVBcmdzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kUmVmZXJlbmNlRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThhZDNmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHIuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1ldGhvZCByZWZlcmVuY2UgZXhwcmVzc2lvbnMgaW50cm9kdWNlZCBpbiBKYXZhIDggc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHNpbXBsaWZ5IGxhbWJkYSBFeHByZXNzaW9ucy4KKyAqIFRoZXNlIGFyZSBzb21lIGV4YW1wbGVzOgorICoKKyAqIFN5c3RlbS5vdXQ6OnByaW50bG47IAorICoKKyAqICh0ZXN0ID8gc3RyZWFtLm1hcChTdHJpbmc6OnRyaW0pIDogc3RyZWFtKTo6dG9BcnJheTsgCisgKiBAYXV0aG9yIFJhcXVlbCBQYXUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RSZWZlcmVuY2VFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gc2NvcGU7CisKKyAgICBwcml2YXRlIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIFN0cmluZyBpZGVudGlmaWVyOworCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIoKSB7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZFJlZmVyZW5jZUV4cHIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kQ29sdW1uLCBFeHByZXNzaW9uIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlcnMsIFN0cmluZyBpZGVudGlmaWVyKSB7CisKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKyAgICAgICAgc2V0SWRlbnRpZmllcihpZGVudGlmaWVyKTsKKyAgICAgICAgc2V0U2NvcGUoc2NvcGUpOworICAgICAgICBzZXRUeXBlUGFyYW1ldGVycyh0eXBlUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworCisgICAgICAgIHJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBPiB2b2lkIGFjY2VwdChWb2lkVmlzaXRvcjxBPiB2LCBBIGFyZykgeworICAgICAgICB2LnZpc2l0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShFeHByZXNzaW9uIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlUGFyYW1ldGVycyhMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgIHRoaXMudHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy50eXBlUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CisgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OYW1lRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGJiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZUV4cHIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5hbWVkTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgTmFtZUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIGltcGxlbWVudHMgTmFtZWROb2RlIHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwdWJsaWMgTmFtZUV4cHIoKSB7CisJfQorCisJcHVibGljIE5hbWVFeHByKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIE5hbWVFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBTdHJpbmcgbmFtZSkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIGZpbmFsIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTm9ybWFsQW5ub3RhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJhZGZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05vcm1hbEFubm90YXRpb25FeHByLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTm9ybWFsQW5ub3RhdGlvbkV4cHIgZXh0ZW5kcyBBbm5vdGF0aW9uRXhwciB7CisKKwlwcml2YXRlIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlyczsKKworCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHIoZmluYWwgTmFtZUV4cHIgbmFtZSwgZmluYWwgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzKSB7CisJCXNldE5hbWUobmFtZSk7CisJCXNldFBhaXJzKHBhaXJzKTsKKwl9CisKKwlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbkV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIE5hbWVFeHByIG5hbWUsIGZpbmFsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXROYW1lKG5hbWUpOworCQlzZXRQYWlycyhwYWlycyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRQYWlycygpIHsKKwkJcmV0dXJuIHBhaXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhaXJzKGZpbmFsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycykgeworCQl0aGlzLnBhaXJzID0gcGFpcnM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMucGFpcnMpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OdWxsTGl0ZXJhbEV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9OdWxsTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2JjMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL051bGxMaXRlcmFsRXhwci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGl0ZXJhbEV4cHIgZXh0ZW5kcyBMaXRlcmFsRXhwciB7CisKKwlwdWJsaWMgTnVsbExpdGVyYWxFeHByKCkgeworCX0KKworCXB1YmxpYyBOdWxsTGl0ZXJhbEV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9PYmplY3RDcmVhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9PYmplY3RDcmVhdGlvbkV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhkYWJjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL09iamVjdENyZWF0aW9uRXhwci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RDcmVhdGlvbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBzY29wZTsKKworCXByaXZhdGUgQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZTsKKworCXByaXZhdGUgTGlzdDxUeXBlPiB0eXBlQXJnczsKKworCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBhcmdzOworCisJcHJpdmF0ZSBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYW5vbnltb3VzQ2xhc3NCb2R5OworCisJcHVibGljIE9iamVjdENyZWF0aW9uRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgT2JqZWN0Q3JlYXRpb25FeHByKGZpbmFsIEV4cHJlc3Npb24gc2NvcGUsIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIHR5cGUsIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncykgeworCQlzZXRTY29wZShzY29wZSk7CisJCXNldFR5cGUodHlwZSk7CisJCXNldEFyZ3MoYXJncyk7CisJfQorCisJcHVibGljIE9iamVjdENyZWF0aW9uRXhwcihmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgRXhwcmVzc2lvbiBzY29wZSwgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgdHlwZSwgZmluYWwgTGlzdDxUeXBlPiB0eXBlQXJncywKKwkJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncywgZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGFub255bW91c0JvZHkpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0U2NvcGUoc2NvcGUpOworCQlzZXRUeXBlKHR5cGUpOworCQlzZXRUeXBlQXJncyh0eXBlQXJncyk7CisJCXNldEFyZ3MoYXJncyk7CisJCXNldEFub255bW91c0NsYXNzQm9keShhbm9ueW1vdXNCb2R5KTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGdldEFub255bW91c0NsYXNzQm9keSgpIHsKKwkJcmV0dXJuIGFub255bW91c0NsYXNzQm9keTsKKwl9CisKKwlwdWJsaWMgTGlzdDxFeHByZXNzaW9uPiBnZXRBcmdzKCkgeworCQlyZXR1cm4gYXJnczsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRTY29wZSgpIHsKKwkJcmV0dXJuIHNjb3BlOworCX0KKworCXB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxUeXBlPiBnZXRUeXBlQXJncygpIHsKKwkJcmV0dXJuIHR5cGVBcmdzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFub255bW91c0NsYXNzQm9keShmaW5hbCBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYW5vbnltb3VzQ2xhc3NCb2R5KSB7CisJCXRoaXMuYW5vbnltb3VzQ2xhc3NCb2R5ID0gYW5vbnltb3VzQ2xhc3NCb2R5OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmFub255bW91c0NsYXNzQm9keSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJncyhmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKwkJdGhpcy5hcmdzID0gYXJnczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hcmdzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY29wZShmaW5hbCBFeHByZXNzaW9uIHNjb3BlKSB7CisJCXRoaXMuc2NvcGUgPSBzY29wZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZUFyZ3MoZmluYWwgTGlzdDxUeXBlPiB0eXBlQXJncykgeworCQl0aGlzLnR5cGVBcmdzID0gdHlwZUFyZ3M7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9RdWFsaWZpZWROYW1lRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1F1YWxpZmllZE5hbWVFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhNjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9RdWFsaWZpZWROYW1lRXhwci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBRdWFsaWZpZWROYW1lRXhwciBleHRlbmRzIE5hbWVFeHByIHsKKworCXByaXZhdGUgTmFtZUV4cHIgcXVhbGlmaWVyOworCisJcHVibGljIFF1YWxpZmllZE5hbWVFeHByKCkgeworCX0KKworCXB1YmxpYyBRdWFsaWZpZWROYW1lRXhwcihmaW5hbCBOYW1lRXhwciBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCXNldFF1YWxpZmllcihzY29wZSk7CisJfQorCisJcHVibGljIFF1YWxpZmllZE5hbWVFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBOYW1lRXhwciBzY29wZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBuYW1lKTsKKwkJc2V0UXVhbGlmaWVyKHNjb3BlKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgTmFtZUV4cHIgZ2V0UXVhbGlmaWVyKCkgeworCQlyZXR1cm4gcXVhbGlmaWVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFF1YWxpZmllcihmaW5hbCBOYW1lRXhwciBxdWFsaWZpZXIpIHsKKwkJdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMucXVhbGlmaWVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGFkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgZXh0ZW5kcyBBbm5vdGF0aW9uRXhwciB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gbWVtYmVyVmFsdWU7CisKKwlwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIoKSB7CisJfQorCisJcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKGZpbmFsIE5hbWVFeHByIG5hbWUsIGZpbmFsIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUpIHsKKwkJc2V0TmFtZShuYW1lKTsKKwkJc2V0TWVtYmVyVmFsdWUobWVtYmVyVmFsdWUpOworCX0KKworCXB1YmxpYyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcihmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLAorCQkJZmluYWwgaW50IGVuZENvbHVtbiwgZmluYWwgTmFtZUV4cHIgbmFtZSwgZmluYWwgRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXROYW1lKG5hbWUpOworCQlzZXRNZW1iZXJWYWx1ZShtZW1iZXJWYWx1ZSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0TWVtYmVyVmFsdWUoKSB7CisJCXJldHVybiBtZW1iZXJWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZW1iZXJWYWx1ZShmaW5hbCBFeHByZXNzaW9uIG1lbWJlclZhbHVlKSB7CisJCXRoaXMubWVtYmVyVmFsdWUgPSBtZW1iZXJWYWx1ZTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5tZW1iZXJWYWx1ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N0cmluZ0xpdGVyYWxFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3RyaW5nTGl0ZXJhbEV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc2ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N0cmluZ0xpdGVyYWxFeHByLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0xpdGVyYWxFeHByIGV4dGVuZHMgTGl0ZXJhbEV4cHIgeworCisJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKKworCXB1YmxpYyBTdHJpbmdMaXRlcmFsRXhwcigpIHsKKwl9CisKKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbEV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N1cGVyRXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1N1cGVyRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MWQyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3VwZXJFeHByLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN1cGVyRXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGNsYXNzRXhwcjsKKworCXB1YmxpYyBTdXBlckV4cHIoKSB7CisJfQorCisJcHVibGljIFN1cGVyRXhwcihmaW5hbCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworCQlzZXRDbGFzc0V4cHIoY2xhc3NFeHByKTsKKwl9CisKKwlwdWJsaWMgU3VwZXJFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRDbGFzc0V4cHIoY2xhc3NFeHByKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDbGFzc0V4cHIoKSB7CisJCXJldHVybiBjbGFzc0V4cHI7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2xhc3NFeHByKGZpbmFsIEV4cHJlc3Npb24gY2xhc3NFeHByKSB7CisJCXRoaXMuY2xhc3NFeHByID0gY2xhc3NFeHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNsYXNzRXhwcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1RoaXNFeHByLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVGhpc0V4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY5Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1RoaXNFeHByLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRoaXNFeHByIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gY2xhc3NFeHByOworCisJcHVibGljIFRoaXNFeHByKCkgeworCX0KKworCXB1YmxpYyBUaGlzRXhwcihmaW5hbCBFeHByZXNzaW9uIGNsYXNzRXhwcikgeworCQlzZXRDbGFzc0V4cHIoY2xhc3NFeHByKTsKKwl9CisKKwlwdWJsaWMgVGhpc0V4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIEV4cHJlc3Npb24gY2xhc3NFeHByKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldENsYXNzRXhwcihjbGFzc0V4cHIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldENsYXNzRXhwcigpIHsKKwkJcmV0dXJuIGNsYXNzRXhwcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDbGFzc0V4cHIoZmluYWwgRXhwcmVzc2lvbiBjbGFzc0V4cHIpIHsKKwkJdGhpcy5jbGFzc0V4cHIgPSBjbGFzc0V4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2xhc3NFeHByKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9UeXBlRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNmQyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVHlwZUV4cHIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMganVzdCBpbnN0YW50aWF0ZWQgYXMgc2NvcGVzIGZvciBNZXRob2RSZWZlcmVuY2VFeHByIG5vZGVzIHRvIGVuY2Fwc3VsYXRlIFR5cGVzLgorICogQGF1dGhvciBSYXF1ZWwgUGF1CisgKgorICovCitwdWJsaWMgY2xhc3MgVHlwZUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9ueworCisgICAgcHJpdmF0ZSBUeXBlIHR5cGU7CisKKyAgICBwdWJsaWMgVHlwZUV4cHIoKXt9CisKKyAgICBwdWJsaWMgVHlwZUV4cHIoaW50IGJlZ2luTGluZSwgaW50IGJlZ2luQ29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgVHlwZSB0eXBlKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHNldFR5cGUodHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBBPiBSIGFjY2VwdChHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBBIGFyZykgeworICAgICAgICByZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoVm9pZFZpc2l0b3I8QT4gdiwgQSBhcmcpIHsKKyAgICAgICAgdi52aXNpdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisgICAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL1VuYXJ5RXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZDkzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVW5hcnlFeHByLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVuYXJ5RXhwciBleHRlbmRzIEV4cHJlc3Npb24geworCisJcHVibGljIHN0YXRpYyBlbnVtIE9wZXJhdG9yIHsKKwkJcG9zaXRpdmUsIC8vICsKKwkJbmVnYXRpdmUsIC8vIC0KKwkJcHJlSW5jcmVtZW50LCAvLyArKworCQlwcmVEZWNyZW1lbnQsIC8vIC0tCisJCW5vdCwgLy8gIQorCQlpbnZlcnNlLCAvLyB+CisJCXBvc0luY3JlbWVudCwgLy8gKysKKwkJcG9zRGVjcmVtZW50LCAvLyAtLQorCX0KKworCXByaXZhdGUgRXhwcmVzc2lvbiBleHByOworCisJcHJpdmF0ZSBPcGVyYXRvciBvcDsKKworCXB1YmxpYyBVbmFyeUV4cHIoKSB7CisJfQorCisJcHVibGljIFVuYXJ5RXhwcihmaW5hbCBFeHByZXNzaW9uIGV4cHIsIGZpbmFsIE9wZXJhdG9yIG9wKSB7CisJCXNldEV4cHIoZXhwcik7CisJCXNldE9wZXJhdG9yKG9wKTsKKwl9CisKKwlwdWJsaWMgVW5hcnlFeHByKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBFeHByZXNzaW9uIGV4cHIsIGZpbmFsIE9wZXJhdG9yIG9wKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldEV4cHIoZXhwcik7CisJCXNldE9wZXJhdG9yKG9wKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgT3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7CisJCXJldHVybiBvcDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeHByKGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQl0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKGZpbmFsIE9wZXJhdG9yIG9wKSB7CisJCXRoaXMub3AgPSBvcDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9WYXJpYWJsZURlY2xhcmF0aW9uRXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2FhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1vZGlmaWVyU2V0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworCXByaXZhdGUgaW50IG1vZGlmaWVyczsKKworCXByaXZhdGUgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnM7CisKKwlwcml2YXRlIFR5cGUgdHlwZTsKKworCXByaXZhdGUgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcnM7CisKKwlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKSB7CisJfQorCisJcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcnMpIHsKKwkJc2V0VHlwZSh0eXBlKTsKKwkJc2V0VmFycyh2YXJzKTsKKwl9CisKKwlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoZmluYWwgaW50IG1vZGlmaWVycywgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFycykgeworCQlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwkJc2V0VHlwZSh0eXBlKTsKKwkJc2V0VmFycyh2YXJzKTsKKwl9CisKKwlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIGludCBtb2RpZmllcnMsIGZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBmaW5hbCBUeXBlIHR5cGUsCisJCQlmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFycykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKwkJc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworCQlzZXRUeXBlKHR5cGUpOworCQlzZXRWYXJzKHZhcnMpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBMaXN0PEFubm90YXRpb25FeHByPiBnZXRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIGFubm90YXRpb25zOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgbW9kaWZpZXJzIG9mIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb24uCisJICogCisJICogQHNlZSBNb2RpZmllclNldAorCSAqIEByZXR1cm4gbW9kaWZpZXJzCisJICovCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiBtb2RpZmllcnM7CisJfQorCisJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIExpc3Q8VmFyaWFibGVEZWNsYXJhdG9yPiBnZXRWYXJzKCkgeworCQlyZXR1cm4gdmFyczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9ucyhmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworCQl0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYW5ub3RhdGlvbnMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhmaW5hbCBpbnQgbW9kaWZpZXJzKSB7CisJCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFycyhmaW5hbCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRvcj4gdmFycykgeworCQl0aGlzLnZhcnMgPSB2YXJzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnZhcnMpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvaW50ZXJuYWwvVXRpbHMuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvaW50ZXJuYWwvVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI3YWJiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9pbnRlcm5hbC9VdGlscy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBGZWRlcmljbyBUb21hc3NldHRpCisgKiBAc2luY2UgMi4wLjEKKyAqLworcHVibGljIGNsYXNzIFV0aWxzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gZW5zdXJlTm90TnVsbChMaXN0PFQ+IGxpc3QpIHsKKyAgICAgICAgcmV0dXJuIGxpc3QgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxUPmVtcHR5TGlzdCgpIDogbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGlzTnVsbE9yRW1wdHkoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Fzc2VydFN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmNjFiYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Bc3NlcnRTdG10LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGNoZWNrOworCisJcHJpdmF0ZSBFeHByZXNzaW9uIG1zZzsKKworCXB1YmxpYyBBc3NlcnRTdG10KCkgeworCX0KKworCXB1YmxpYyBBc3NlcnRTdG10KGZpbmFsIEV4cHJlc3Npb24gY2hlY2spIHsKKwkJc2V0Q2hlY2soY2hlY2spOworCX0KKworCXB1YmxpYyBBc3NlcnRTdG10KGZpbmFsIEV4cHJlc3Npb24gY2hlY2ssIGZpbmFsIEV4cHJlc3Npb24gbXNnKSB7CisJCXNldENoZWNrKGNoZWNrKTsKKwkJc2V0TWVzc2FnZShtc2cpOworCX0KKworCXB1YmxpYyBBc3NlcnRTdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBFeHByZXNzaW9uIGNoZWNrLCBmaW5hbCBFeHByZXNzaW9uIG1zZykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQkKKwkJc2V0Q2hlY2soY2hlY2spOworCQlzZXRNZXNzYWdlKG1zZyk7CisJCQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldENoZWNrKCkgeworCQlyZXR1cm4gY2hlY2s7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0TWVzc2FnZSgpIHsKKwkJcmV0dXJuIG1zZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDaGVjayhmaW5hbCBFeHByZXNzaW9uIGNoZWNrKSB7CisJCXRoaXMuY2hlY2sgPSBjaGVjazsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jaGVjayk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShmaW5hbCBFeHByZXNzaW9uIG1zZykgeworCQl0aGlzLm1zZyA9IG1zZzsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5tc2cpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9CbG9ja1N0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9CbG9ja1N0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIxNjczCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Jsb2NrU3RtdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsb2NrU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIExpc3Q8U3RhdGVtZW50PiBzdG10czsKKworCXB1YmxpYyBCbG9ja1N0bXQoKSB7CisJfQorCisJcHVibGljIEJsb2NrU3RtdChmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMpIHsKKwkJc2V0U3RtdHMoc3RtdHMpOworCX0KKworCXB1YmxpYyBCbG9ja1N0bXQoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLAorCQkJZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdG10cykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRTdG10cyhzdG10cyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBMaXN0PFN0YXRlbWVudD4gZ2V0U3RtdHMoKSB7CisJCXJldHVybiBzdG10czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdG10cyhmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMpIHsKKwkJdGhpcy5zdG10cyA9IHN0bXRzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnN0bXRzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQnJlYWtTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQnJlYWtTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4MGYzZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9CcmVha1N0bXQuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnJlYWtTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgU3RyaW5nIGlkOworCisJcHVibGljIEJyZWFrU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgQnJlYWtTdG10KGZpbmFsIFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJcHVibGljIEJyZWFrU3RtdChmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLCBmaW5hbCBTdHJpbmcgaWQpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwkJdGhpcy5pZCA9IGlkOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9DYXRjaENsYXVzZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NhdGNoQ2xhdXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0M2U3OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9DYXRjaENsYXVzZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2F0Y2hDbGF1c2UgZXh0ZW5kcyBOb2RlIHsKKworICAgIHByaXZhdGUgTXVsdGlUeXBlUGFyYW1ldGVyIGV4Y2VwdDsKKworICAgIHByaXZhdGUgQmxvY2tTdG10IGNhdGNoQmxvY2s7CisKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2UoKSB7CisgICAgfQorCisgICAgcHVibGljIENhdGNoQ2xhdXNlKGZpbmFsIE11bHRpVHlwZVBhcmFtZXRlciBleGNlcHQsIGZpbmFsIEJsb2NrU3RtdCBjYXRjaEJsb2NrKSB7CisgICAgICAgIHNldEV4Y2VwdChleGNlcHQpOworICAgICAgICBzZXRDYXRjaEJsb2NrKGNhdGNoQmxvY2spOworICAgIH0KKwkKKyAgICBwdWJsaWMgQ2F0Y2hDbGF1c2UoaW50IGV4Y2VwdE1vZGlmaWVyLCBMaXN0PEFubm90YXRpb25FeHByPiBleGNlcHRBbm5vdGF0aW9ucywgTGlzdDxUeXBlPiBleGNlcHRUeXBlcywgVmFyaWFibGVEZWNsYXJhdG9ySWQgZXhjZXB0SWQsIEJsb2NrU3RtdCBjYXRjaEJsb2NrKSB7CisgICAgICAgIHRoaXMobmV3IE11bHRpVHlwZVBhcmFtZXRlcihleGNlcHRNb2RpZmllciwgZXhjZXB0QW5ub3RhdGlvbnMsIGV4Y2VwdFR5cGVzLCBleGNlcHRJZCksIGNhdGNoQmxvY2spOworICAgIH0KKworICAgIHB1YmxpYyBDYXRjaENsYXVzZShmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorICAgIAkgICAgZmluYWwgaW50IGV4Y2VwdE1vZGlmaWVyLCBmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBleGNlcHRBbm5vdGF0aW9ucywgZmluYWwgTGlzdDxUeXBlPiBleGNlcHRUeXBlcywgCisgICAgCSAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3JJZCBleGNlcHRJZCwgZmluYWwgQmxvY2tTdG10IGNhdGNoQmxvY2spIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKyAgICAgICAgc2V0RXhjZXB0KG5ldyBNdWx0aVR5cGVQYXJhbWV0ZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBleGNlcHRNb2RpZmllciwgZXhjZXB0QW5ub3RhdGlvbnMsIGV4Y2VwdFR5cGVzLCBleGNlcHRJZCkpOworICAgICAgICBzZXRDYXRjaEJsb2NrKGNhdGNoQmxvY2spOworICAgIH0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBCbG9ja1N0bXQgZ2V0Q2F0Y2hCbG9jaygpIHsKKwkJcmV0dXJuIGNhdGNoQmxvY2s7CisJfQorCisJcHVibGljIE11bHRpVHlwZVBhcmFtZXRlciBnZXRFeGNlcHQoKSB7CisJCXJldHVybiBleGNlcHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0Y2hCbG9jayhmaW5hbCBCbG9ja1N0bXQgY2F0Y2hCbG9jaykgeworCQl0aGlzLmNhdGNoQmxvY2sgPSBjYXRjaEJsb2NrOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNhdGNoQmxvY2spOworCX0KKworCXB1YmxpYyB2b2lkIHNldEV4Y2VwdChmaW5hbCBNdWx0aVR5cGVQYXJhbWV0ZXIgZXhjZXB0KSB7CisJCXRoaXMuZXhjZXB0ID0gZXhjZXB0OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4Y2VwdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NvbnRpbnVlU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0NvbnRpbnVlU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzYwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvQ29udGludWVTdG10LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnRpbnVlU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIFN0cmluZyBpZDsKKworCXB1YmxpYyBDb250aW51ZVN0bXQoKSB7CisJfQorCisJcHVibGljIENvbnRpbnVlU3RtdChmaW5hbCBTdHJpbmcgaWQpIHsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCXB1YmxpYyBDb250aW51ZVN0bXQoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIFN0cmluZyBpZCkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQl0aGlzLmlkID0gaWQ7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCXB1YmxpYyB2b2lkIHNldElkKGZpbmFsIFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0RvU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0RvU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNmE3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRG9TdG10LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERvU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIFN0YXRlbWVudCBib2R5OworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGNvbmRpdGlvbjsKKworCXB1YmxpYyBEb1N0bXQoKSB7CisJfQorCisJcHVibGljIERvU3RtdChmaW5hbCBTdGF0ZW1lbnQgYm9keSwgZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKwkJc2V0Qm9keShib2R5KTsKKwkJc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisJfQorCisJcHVibGljIERvU3RtdChmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgU3RhdGVtZW50IGJvZHksIGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldEJvZHkoYm9keSk7CisJCXNldENvbmRpdGlvbihjb25kaXRpb24pOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKwkJcmV0dXJuIGJvZHk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0Q29uZGl0aW9uKCkgeworCQlyZXR1cm4gY29uZGl0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEJvZHkoZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJdGhpcy5ib2R5ID0gYm9keTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKwkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRW1wdHlTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRW1wdHlTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNmM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FbXB0eVN0bXQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXB1YmxpYyBFbXB0eVN0bXQoKSB7CisJfQorCisJcHVibGljIEVtcHR5U3RtdChmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTllZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIExpc3Q8VHlwZT4gdHlwZUFyZ3M7CisKKwlwcml2YXRlIGJvb2xlYW4gaXNUaGlzOworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHI7CisKKwlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gYXJnczsKKworCXB1YmxpYyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoKSB7CisJfQorCisJcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdChmaW5hbCBib29sZWFuIGlzVGhpcywKKwkJCWZpbmFsIEV4cHJlc3Npb24gZXhwciwgZmluYWwgTGlzdDxFeHByZXNzaW9uPiBhcmdzKSB7CisJCXNldFRoaXMoaXNUaGlzKTsKKwkJc2V0RXhwcihleHByKTsKKwkJc2V0QXJncyhhcmdzKTsKKwl9CisKKwlwdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KGZpbmFsIGludCBiZWdpbkxpbmUsCisJCQlmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgTGlzdDxUeXBlPiB0eXBlQXJncywgZmluYWwgYm9vbGVhbiBpc1RoaXMsCisJCQlmaW5hbCBFeHByZXNzaW9uIGV4cHIsIGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRUeXBlQXJncyh0eXBlQXJncyk7CisJCXNldFRoaXMoaXNUaGlzKTsKKwkJc2V0RXhwcihleHByKTsKKwkJc2V0QXJncyhhcmdzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0QXJncygpIHsKKwkJcmV0dXJuIGFyZ3M7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcigpIHsKKwkJcmV0dXJuIGV4cHI7CisJfQorCisJcHVibGljIExpc3Q8VHlwZT4gZ2V0VHlwZUFyZ3MoKSB7CisJCXJldHVybiB0eXBlQXJnczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1RoaXMoKSB7CisJCXJldHVybiBpc1RoaXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJncyhmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MpIHsKKwkJdGhpcy5hcmdzID0gYXJnczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5hcmdzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeHByKGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQl0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRoaXMoZmluYWwgYm9vbGVhbiBpc1RoaXMpIHsKKwkJdGhpcy5pc1RoaXMgPSBpc1RoaXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHlwZUFyZ3MoZmluYWwgTGlzdDxUeXBlPiB0eXBlQXJncykgeworCQl0aGlzLnR5cGVBcmdzID0gdHlwZUFyZ3M7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHByZXNzaW9uU3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0V4cHJlc3Npb25TdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0NDFlMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9FeHByZXNzaW9uU3RtdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHByZXNzaW9uU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcjsKKworCXB1YmxpYyBFeHByZXNzaW9uU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvblN0bXQoZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXNldEV4cHJlc3Npb24oZXhwcik7CisJfQorCisJcHVibGljIEV4cHJlc3Npb25TdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0RXhwcmVzc2lvbihleHByKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQl0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Gb3JTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzQ5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yU3RtdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGb3JTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBpbml0OworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGNvbXBhcmU7CisKKwlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlOworCisJcHJpdmF0ZSBTdGF0ZW1lbnQgYm9keTsKKworCXB1YmxpYyBGb3JTdG10KCkgeworCX0KKworCXB1YmxpYyBGb3JTdG10KGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gaW5pdCwgZmluYWwgRXhwcmVzc2lvbiBjb21wYXJlLAorCQkJZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUsIGZpbmFsIFN0YXRlbWVudCBib2R5KSB7CisJCXNldENvbXBhcmUoY29tcGFyZSk7CisJCXNldEluaXQoaW5pdCk7CisJCXNldFVwZGF0ZSh1cGRhdGUpOworCQlzZXRCb2R5KGJvZHkpOworCX0KKworCXB1YmxpYyBGb3JTdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwKKwkJCWZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgTGlzdDxFeHByZXNzaW9uPiBpbml0LCBmaW5hbCBFeHByZXNzaW9uIGNvbXBhcmUsCisJCQlmaW5hbCBMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSwgZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0Q29tcGFyZShjb21wYXJlKTsKKwkJc2V0SW5pdChpbml0KTsKKwkJc2V0VXBkYXRlKHVwZGF0ZSk7CisJCXNldEJvZHkoYm9keSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKwkJcmV0dXJuIGJvZHk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0Q29tcGFyZSgpIHsKKwkJcmV0dXJuIGNvbXBhcmU7CisJfQorCisJcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0SW5pdCgpIHsKKwkJcmV0dXJuIGluaXQ7CisJfQorCisJcHVibGljIExpc3Q8RXhwcmVzc2lvbj4gZ2V0VXBkYXRlKCkgeworCQlyZXR1cm4gdXBkYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEJvZHkoZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJdGhpcy5ib2R5ID0gYm9keTsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5ib2R5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb21wYXJlKGZpbmFsIEV4cHJlc3Npb24gY29tcGFyZSkgeworCQl0aGlzLmNvbXBhcmUgPSBjb21wYXJlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmNvbXBhcmUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluaXQoZmluYWwgTGlzdDxFeHByZXNzaW9uPiBpbml0KSB7CisJCXRoaXMuaW5pdCA9IGluaXQ7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuaW5pdCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXBkYXRlKGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdXBkYXRlKSB7CisJCXRoaXMudXBkYXRlID0gdXBkYXRlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnVwZGF0ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvcmVhY2hTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvRm9yZWFjaFN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDU2MjJmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0ZvcmVhY2hTdG10LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGb3JlYWNoU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhcjsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBpdGVyYWJsZTsKKworCXByaXZhdGUgU3RhdGVtZW50IGJvZHk7CisKKwlwdWJsaWMgRm9yZWFjaFN0bXQoKSB7CisJfQorCisJcHVibGljIEZvcmVhY2hTdG10KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhciwKKwkJCWZpbmFsIEV4cHJlc3Npb24gaXRlcmFibGUsIGZpbmFsIFN0YXRlbWVudCBib2R5KSB7CisJCXNldFZhcmlhYmxlKHZhcik7CisJCXNldEl0ZXJhYmxlKGl0ZXJhYmxlKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKwlwdWJsaWMgRm9yZWFjaFN0bXQoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLAorCQkJZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2YXIsIGZpbmFsIEV4cHJlc3Npb24gaXRlcmFibGUsCisJCQlmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRWYXJpYWJsZSh2YXIpOworCQlzZXRJdGVyYWJsZShpdGVyYWJsZSk7CisJCXNldEJvZHkoYm9keSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0Qm9keSgpIHsKKwkJcmV0dXJuIGJvZHk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gZ2V0SXRlcmFibGUoKSB7CisJCXJldHVybiBpdGVyYWJsZTsKKwl9CisKKwlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgZ2V0VmFyaWFibGUoKSB7CisJCXJldHVybiB2YXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0Qm9keShmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQl0aGlzLmJvZHkgPSBib2R5OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJvZHkpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEl0ZXJhYmxlKGZpbmFsIEV4cHJlc3Npb24gaXRlcmFibGUpIHsKKwkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLml0ZXJhYmxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZShmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2YXIpIHsKKwkJdGhpcy52YXIgPSB2YXI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudmFyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkZGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9JZlN0bXQuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSWZTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBjb25kaXRpb247CisKKwlwcml2YXRlIFN0YXRlbWVudCB0aGVuU3RtdDsKKworCXByaXZhdGUgU3RhdGVtZW50IGVsc2VTdG10OworCisJcHVibGljIElmU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgSWZTdG10KGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uLCBmaW5hbCBTdGF0ZW1lbnQgdGhlblN0bXQsIGZpbmFsIFN0YXRlbWVudCBlbHNlU3RtdCkgeworCQlzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwkJc2V0VGhlblN0bXQodGhlblN0bXQpOworCQlzZXRFbHNlU3RtdChlbHNlU3RtdCk7CisJfQorCisJcHVibGljIElmU3RtdChmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24sIGZpbmFsIFN0YXRlbWVudCB0aGVuU3RtdCwgZmluYWwgU3RhdGVtZW50IGVsc2VTdG10KSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldENvbmRpdGlvbihjb25kaXRpb24pOworCQlzZXRUaGVuU3RtdCh0aGVuU3RtdCk7CisJCXNldEVsc2VTdG10KGVsc2VTdG10KTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKSB7CisJCXJldHVybiBjb25kaXRpb247CisJfQorCisJcHVibGljIFN0YXRlbWVudCBnZXRFbHNlU3RtdCgpIHsKKwkJcmV0dXJuIGVsc2VTdG10OworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQgZ2V0VGhlblN0bXQoKSB7CisJCXJldHVybiB0aGVuU3RtdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oZmluYWwgRXhwcmVzc2lvbiBjb25kaXRpb24pIHsKKwkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY29uZGl0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbHNlU3RtdChmaW5hbCBTdGF0ZW1lbnQgZWxzZVN0bXQpIHsKKwkJdGhpcy5lbHNlU3RtdCA9IGVsc2VTdG10OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmVsc2VTdG10KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaGVuU3RtdChmaW5hbCBTdGF0ZW1lbnQgdGhlblN0bXQpIHsKKwkJdGhpcy50aGVuU3RtdCA9IHRoZW5TdG10OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnRoZW5TdG10KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvTGFiZWxlZFN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9MYWJlbGVkU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDhlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvTGFiZWxlZFN0bXQuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBTdHJpbmcgbGFiZWw7CisKKwlwcml2YXRlIFN0YXRlbWVudCBzdG10OworCisJcHVibGljIExhYmVsZWRTdG10KCkgeworCX0KKworCXB1YmxpYyBMYWJlbGVkU3RtdChmaW5hbCBTdHJpbmcgbGFiZWwsIGZpbmFsIFN0YXRlbWVudCBzdG10KSB7CisJCXNldExhYmVsKGxhYmVsKTsKKwkJc2V0U3RtdChzdG10KTsKKwl9CisKKwlwdWJsaWMgTGFiZWxlZFN0bXQoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIFN0cmluZyBsYWJlbCwgZmluYWwgU3RhdGVtZW50IHN0bXQpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0TGFiZWwobGFiZWwpOworCQlzZXRTdG10KHN0bXQpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RhdGVtZW50IGdldFN0bXQoKSB7CisJCXJldHVybiBzdG10OworCX0KKworCXB1YmxpYyB2b2lkIHNldExhYmVsKGZpbmFsIFN0cmluZyBsYWJlbCkgeworCQl0aGlzLmxhYmVsID0gbGFiZWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RtdChmaW5hbCBTdGF0ZW1lbnQgc3RtdCkgeworCQl0aGlzLnN0bXQgPSBzdG10OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnN0bXQpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9SZXR1cm5TdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvUmV0dXJuU3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvUmV0dXJuU3RtdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXR1cm5TdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBleHByOworCisJcHVibGljIFJldHVyblN0bXQoKSB7CisJfQorCisJcHVibGljIFJldHVyblN0bXQoZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXNldEV4cHIoZXhwcik7CisJfQorCisJcHVibGljIFJldHVyblN0bXQoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKwkJCWZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRFeHByKGV4cHIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHIoKSB7CisJCXJldHVybiBleHByOworCX0KKworCXB1YmxpYyB2b2lkIHNldEV4cHIoZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXRoaXMuZXhwciA9IGV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N0YXRlbWVudC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzQ2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVtZW50IGV4dGVuZHMgTm9kZSB7CisKKwlwdWJsaWMgU3RhdGVtZW50KCkgeworCX0KKworCXB1YmxpYyBTdGF0ZW1lbnQoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaEVudHJ5U3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaEVudHJ5U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWE4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvU3dpdGNoRW50cnlTdG10LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3dpdGNoRW50cnlTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBsYWJlbDsKKworCXByaXZhdGUgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzOworCisJcHVibGljIFN3aXRjaEVudHJ5U3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgU3dpdGNoRW50cnlTdG10KGZpbmFsIEV4cHJlc3Npb24gbGFiZWwsIGZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdG10cykgeworCQlzZXRMYWJlbChsYWJlbCk7CisJCXNldFN0bXRzKHN0bXRzKTsKKwl9CisKKwlwdWJsaWMgU3dpdGNoRW50cnlTdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwKKwkJCWZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLCBmaW5hbCBFeHByZXNzaW9uIGxhYmVsLAorCQkJZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldExhYmVsKGxhYmVsKTsKKwkJc2V0U3RtdHMoc3RtdHMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCXB1YmxpYyBMaXN0PFN0YXRlbWVudD4gZ2V0U3RtdHMoKSB7CisJCXJldHVybiBzdG10czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChmaW5hbCBFeHByZXNzaW9uIGxhYmVsKSB7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5sYWJlbCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RtdHMoZmluYWwgTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzKSB7CisJCXRoaXMuc3RtdHMgPSBzdG10czsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zdG10cyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N3aXRjaFN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZTkwMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9Td2l0Y2hTdG10LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3dpdGNoU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gc2VsZWN0b3I7CisKKwlwcml2YXRlIExpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzOworCisJcHVibGljIFN3aXRjaFN0bXQoKSB7CisJfQorCisJcHVibGljIFN3aXRjaFN0bXQoZmluYWwgRXhwcmVzc2lvbiBzZWxlY3RvciwKKwkJCWZpbmFsIExpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzKSB7CisJCXNldFNlbGVjdG9yKHNlbGVjdG9yKTsKKwkJc2V0RW50cmllcyhlbnRyaWVzKTsKKwl9CisKKwlwdWJsaWMgU3dpdGNoU3RtdChmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sCisJCQlmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwgZmluYWwgRXhwcmVzc2lvbiBzZWxlY3RvciwKKwkJCWZpbmFsIExpc3Q8U3dpdGNoRW50cnlTdG10PiBlbnRyaWVzKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldFNlbGVjdG9yKHNlbGVjdG9yKTsKKwkJc2V0RW50cmllcyhlbnRyaWVzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIExpc3Q8U3dpdGNoRW50cnlTdG10PiBnZXRFbnRyaWVzKCkgeworCQlyZXR1cm4gZW50cmllczsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRTZWxlY3RvcigpIHsKKwkJcmV0dXJuIHNlbGVjdG9yOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVudHJpZXMoZmluYWwgTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMpIHsKKwkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5lbnRyaWVzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvcihmaW5hbCBFeHByZXNzaW9uIHNlbGVjdG9yKSB7CisJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zZWxlY3Rvcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1N5bmNocm9uaXplZFN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9TeW5jaHJvbml6ZWRTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxZmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9TeW5jaHJvbml6ZWRTdG10LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN5bmNocm9uaXplZFN0bXQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHI7CisKKwlwcml2YXRlIEJsb2NrU3RtdCBibG9jazsKKworCXB1YmxpYyBTeW5jaHJvbml6ZWRTdG10KCkgeworCX0KKworCXB1YmxpYyBTeW5jaHJvbml6ZWRTdG10KGZpbmFsIEV4cHJlc3Npb24gZXhwciwgZmluYWwgQmxvY2tTdG10IGJsb2NrKSB7CisJCXNldEV4cHIoZXhwcik7CisJCXNldEJsb2NrKGJsb2NrKTsKKwl9CisKKwlwdWJsaWMgU3luY2hyb25pemVkU3RtdChmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sCisJCQlmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwgZmluYWwgRXhwcmVzc2lvbiBleHByLAorCQkJZmluYWwgQmxvY2tTdG10IGJsb2NrKSB7CisJCXN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisJCXNldEV4cHIoZXhwcik7CisJCXNldEJsb2NrKGJsb2NrKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIEJsb2NrU3RtdCBnZXRCbG9jaygpIHsKKwkJcmV0dXJuIGJsb2NrOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHIoKSB7CisJCXJldHVybiBleHByOworCX0KKworCXB1YmxpYyB2b2lkIHNldEJsb2NrKGZpbmFsIEJsb2NrU3RtdCBibG9jaykgeworCQl0aGlzLmJsb2NrID0gYmxvY2s7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuYmxvY2spOworCX0KKworCXB1YmxpYyB2b2lkIHNldEV4cHIoZmluYWwgRXhwcmVzc2lvbiBleHByKSB7CisJCXRoaXMuZXhwciA9IGV4cHI7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuZXhwcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1Rocm93U3RtdC5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1Rocm93U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjgzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVGhyb3dTdG10LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRocm93U3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIEV4cHJlc3Npb24gZXhwcjsKKworCXB1YmxpYyBUaHJvd1N0bXQoKSB7CisJfQorCisJcHVibGljIFRocm93U3RtdChmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJc2V0RXhwcihleHByKTsKKwl9CisKKwlwdWJsaWMgVGhyb3dTdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBFeHByZXNzaW9uIGV4cHIpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0RXhwcihleHByKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByKCkgeworCQlyZXR1cm4gZXhwcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeHByKGZpbmFsIEV4cHJlc3Npb24gZXhwcikgeworCQl0aGlzLmV4cHIgPSBleHByOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmV4cHIpOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UcnlTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHJ5U3RtdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDA5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvVHJ5U3RtdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJ5U3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisJCisJcHJpdmF0ZSBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiByZXNvdXJjZXM7CisKKwlwcml2YXRlIEJsb2NrU3RtdCB0cnlCbG9jazsKKworCXByaXZhdGUgTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzOworCisJcHJpdmF0ZSBCbG9ja1N0bXQgZmluYWxseUJsb2NrOworCisJcHVibGljIFRyeVN0bXQoKSB7CisJfQorCisJcHVibGljIFRyeVN0bXQoZmluYWwgQmxvY2tTdG10IHRyeUJsb2NrLCBmaW5hbCBMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaHMsCisJCQlmaW5hbCBCbG9ja1N0bXQgZmluYWxseUJsb2NrKSB7CisJCXNldFRyeUJsb2NrKHRyeUJsb2NrKTsKKwkJc2V0Q2F0Y2hzKGNhdGNocyk7CisJCXNldEZpbmFsbHlCbG9jayhmaW5hbGx5QmxvY2spOworCX0KKworCXB1YmxpYyBUcnlTdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwKKwkJCWZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLCBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiByZXNvdXJjZXMsCisJCQlmaW5hbCBCbG9ja1N0bXQgdHJ5QmxvY2ssIGZpbmFsIExpc3Q8Q2F0Y2hDbGF1c2U+IGNhdGNocywgZmluYWwgQmxvY2tTdG10IGZpbmFsbHlCbG9jaykgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKKwkJc2V0VHJ5QmxvY2sodHJ5QmxvY2spOworCQlzZXRDYXRjaHMoY2F0Y2hzKTsKKwkJc2V0RmluYWxseUJsb2NrKGZpbmFsbHlCbG9jayk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBMaXN0PENhdGNoQ2xhdXNlPiBnZXRDYXRjaHMoKSB7CisJCXJldHVybiBjYXRjaHM7CisJfQorCisJcHVibGljIEJsb2NrU3RtdCBnZXRGaW5hbGx5QmxvY2soKSB7CisJCXJldHVybiBmaW5hbGx5QmxvY2s7CisJfQorCisJcHVibGljIEJsb2NrU3RtdCBnZXRUcnlCbG9jaygpIHsKKwkJcmV0dXJuIHRyeUJsb2NrOworCX0KKwkKKwlwdWJsaWMgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gZ2V0UmVzb3VyY2VzKCkgeworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGNocyhmaW5hbCBMaXN0PENhdGNoQ2xhdXNlPiBjYXRjaHMpIHsKKwkJdGhpcy5jYXRjaHMgPSBjYXRjaHM7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMuY2F0Y2hzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGaW5hbGx5QmxvY2soZmluYWwgQmxvY2tTdG10IGZpbmFsbHlCbG9jaykgeworCQl0aGlzLmZpbmFsbHlCbG9jayA9IGZpbmFsbHlCbG9jazsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5maW5hbGx5QmxvY2spOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRyeUJsb2NrKGZpbmFsIEJsb2NrU3RtdCB0cnlCbG9jaykgeworCQl0aGlzLnRyeUJsb2NrID0gdHJ5QmxvY2s7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHJ5QmxvY2spOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gcmVzb3VyY2VzKSB7CisJCXRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnJlc291cmNlcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1R5cGVEZWNsYXJhdGlvblN0bXQuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UeXBlRGVjbGFyYXRpb25TdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliNTA3YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UeXBlRGVjbGFyYXRpb25TdG10LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHlwZURlY2xhcmF0aW9uU3RtdCBleHRlbmRzIFN0YXRlbWVudCB7CisKKwlwcml2YXRlIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbDsKKworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb25TdG10KCkgeworCX0KKworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb25TdG10KGZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCkgeworCQlzZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2wpOworCX0KKworCXB1YmxpYyBUeXBlRGVjbGFyYXRpb25TdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxSLCBBPiBSIGFjY2VwdChmaW5hbCBHZW5lcmljVmlzaXRvcjxSLCBBPiB2LCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbigpIHsKKwkJcmV0dXJuIHR5cGVEZWNsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGVEZWNsYXJhdGlvbihmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wpIHsKKwkJdGhpcy50eXBlRGVjbCA9IHR5cGVEZWNsOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnR5cGVEZWNsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvV2hpbGVTdG10LmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvV2hpbGVTdG10LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiMmExYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9XaGlsZVN0bXQuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV2hpbGVTdG10IGV4dGVuZHMgU3RhdGVtZW50IHsKKworCXByaXZhdGUgRXhwcmVzc2lvbiBjb25kaXRpb247CisKKwlwcml2YXRlIFN0YXRlbWVudCBib2R5OworCisJcHVibGljIFdoaWxlU3RtdCgpIHsKKwl9CisKKwlwdWJsaWMgV2hpbGVTdG10KGZpbmFsIEV4cHJlc3Npb24gY29uZGl0aW9uLCBmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQlzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKKwkJc2V0Qm9keShib2R5KTsKKwl9CisKKwlwdWJsaWMgV2hpbGVTdG10KGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbiwgZmluYWwgU3RhdGVtZW50IGJvZHkpIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7CisJCXNldEJvZHkoYm9keSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIDxBPiB2b2lkIGFjY2VwdChmaW5hbCBWb2lkVmlzaXRvcjxBPiB2LCBmaW5hbCBBIGFyZykgeworCQl2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJcHVibGljIFN0YXRlbWVudCBnZXRCb2R5KCkgeworCQlyZXR1cm4gYm9keTsKKwl9CisKKwlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb25kaXRpb24oKSB7CisJCXJldHVybiBjb25kaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Qm9keShmaW5hbCBTdGF0ZW1lbnQgYm9keSkgeworCQl0aGlzLmJvZHkgPSBib2R5OworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLmJvZHkpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbmRpdGlvbihmaW5hbCBFeHByZXNzaW9uIGNvbmRpdGlvbikgeworCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5jb25kaXRpb24pOworCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9DbGFzc09ySW50ZXJmYWNlVHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0NsYXNzT3JJbnRlcmZhY2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZmJmNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9DbGFzc09ySW50ZXJmYWNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5HZW5lcmljVmlzaXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzT3JJbnRlcmZhY2VUeXBlIGV4dGVuZHMgVHlwZSB7CisKKyAgICBwcml2YXRlIENsYXNzT3JJbnRlcmZhY2VUeXBlIHNjb3BlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgTGlzdDxUeXBlPiB0eXBlQXJnczsKKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGUsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgc2NvcGUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzKSB7CisgICAgICAgIHN1cGVyKGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbik7CisgICAgICAgIHNldFNjb3BlKHNjb3BlKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0VHlwZUFyZ3ModHlwZUFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc09ySW50ZXJmYWNlVHlwZSBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIHNjb3BlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFR5cGU+IGdldFR5cGVBcmdzKCkgeworICAgICAgICByZXR1cm4gdHlwZUFyZ3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNCb3hlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBQcmltaXRpdmVUeXBlLnVuYm94TWFwLmNvbnRhaW5zS2V5KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBQcmltaXRpdmVUeXBlIHRvVW5ib3hlZFR5cGUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpZiAoIWlzQm94ZWRUeXBlKCkpIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihuYW1lICsgIiBpc24ndCBhIGJveGVkIHR5cGUuIik7CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLnVuYm94TWFwLmdldChuYW1lKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgc2V0QXNQYXJlbnROb2RlT2YodGhpcy5zY29wZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZUFyZ3MoZmluYWwgTGlzdDxUeXBlPiB0eXBlQXJncykgeworICAgICAgICB0aGlzLnR5cGVBcmdzID0gdHlwZUFyZ3M7CisgICAgICAgIHNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZUFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9QcmltaXRpdmVUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUHJpbWl0aXZlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MWE4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUHJpbWl0aXZlVHlwZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFByaW1pdGl2ZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKworCXB1YmxpYyBlbnVtIFByaW1pdGl2ZSB7CisJCUJvb2xlYW4gKCJCb29sZWFuIiksCisJCUNoYXIgICAgKCJDaGFyYWN0ZXIiKSwKKwkJQnl0ZSAgICAoIkJ5dGUiKSwKKwkJU2hvcnQgICAoIlNob3J0IiksCisJCUludCAgICAgKCJJbnRlZ2VyIiksCisJCUxvbmcgICAgKCJMb25nIiksCisJCUZsb2F0ICAgKCJGbG9hdCIpLAorCQlEb3VibGUgICgiRG91YmxlIik7CisKKwkJZmluYWwgU3RyaW5nIG5hbWVPZkJveGVkVHlwZTsKKworCQlwdWJsaWMgQ2xhc3NPckludGVyZmFjZVR5cGUgdG9Cb3hlZFR5cGUoKSB7CisJCQlyZXR1cm4gbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKG5hbWVPZkJveGVkVHlwZSk7CisJCX0KKworCQlwcml2YXRlIFByaW1pdGl2ZShTdHJpbmcgbmFtZU9mQm94ZWRUeXBlKSB7CisJCQl0aGlzLm5hbWVPZkJveGVkVHlwZSA9IG5hbWVPZkJveGVkVHlwZTsKKwkJfQorCX0KKworCXN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgUHJpbWl0aXZlPiB1bmJveE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJpbWl0aXZlPigpOworCXN0YXRpYyB7CisJCWZvcihQcmltaXRpdmUgdW5ib3hlZFR5cGUgOiBQcmltaXRpdmUudmFsdWVzKCkpIHsKKwkJCXVuYm94TWFwLnB1dCh1bmJveGVkVHlwZS5uYW1lT2ZCb3hlZFR5cGUsIHVuYm94ZWRUeXBlKTsKKwkJfQorCX0KKworCXByaXZhdGUgUHJpbWl0aXZlIHR5cGU7CisKKwlwdWJsaWMgUHJpbWl0aXZlVHlwZSgpIHsKKwl9CisKKwlwdWJsaWMgUHJpbWl0aXZlVHlwZShmaW5hbCBQcmltaXRpdmUgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBQcmltaXRpdmVUeXBlKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBQcmltaXRpdmUgdHlwZSkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBQcmltaXRpdmUgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIHRvQm94ZWRUeXBlKCkgeworCQlyZXR1cm4gdHlwZS50b0JveGVkVHlwZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoZmluYWwgUHJpbWl0aXZlIHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9SZWZlcmVuY2VUeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODg0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvUmVmZXJlbmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVmZXJlbmNlVHlwZSBleHRlbmRzIFR5cGUgeworCisJcHJpdmF0ZSBUeXBlIHR5cGU7CisKKwlwcml2YXRlIGludCBhcnJheUNvdW50OworCisgICAgcHJpdmF0ZSBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBhcnJheXNBbm5vdGF0aW9uczsKKworICAgIHB1YmxpYyBSZWZlcmVuY2VUeXBlKCkgeworCX0KKworCXB1YmxpYyBSZWZlcmVuY2VUeXBlKGZpbmFsIFR5cGUgdHlwZSkgeworCQlzZXRUeXBlKHR5cGUpOworCX0KKworCXB1YmxpYyBSZWZlcmVuY2VUeXBlKGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgaW50IGFycmF5Q291bnQpIHsKKwkJc2V0VHlwZSh0eXBlKTsKKwkJc2V0QXJyYXlDb3VudChhcnJheUNvdW50KTsKKwl9CisKKwlwdWJsaWMgUmVmZXJlbmNlVHlwZShmaW5hbCBpbnQgYmVnaW5MaW5lLCBmaW5hbCBpbnQgYmVnaW5Db2x1bW4sIGZpbmFsIGludCBlbmRMaW5lLCBmaW5hbCBpbnQgZW5kQ29sdW1uLAorCQkJZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBpbnQgYXJyYXlDb3VudCkgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCQlzZXRUeXBlKHR5cGUpOworCQlzZXRBcnJheUNvdW50KGFycmF5Q291bnQpOworCX0KKworICAgIHB1YmxpYyBSZWZlcmVuY2VUeXBlKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZENvbHVtbiwgVHlwZSB0eXBlLCBpbnQgYXJyYXlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBhcnJheXNBbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgc2V0QXJyYXlDb3VudChhcnJheUNvdW50KTsKKyAgICAgICAgdGhpcy5hcnJheXNBbm5vdGF0aW9ucyA9IGFycmF5c0Fubm90YXRpb25zOworICAgIH0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0QXJyYXlDb3VudCgpIHsKKwkJcmV0dXJuIGFycmF5Q291bnQ7CisJfQorCisJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJyYXlDb3VudChmaW5hbCBpbnQgYXJyYXlDb3VudCkgeworCQl0aGlzLmFycmF5Q291bnQgPSBhcnJheUNvdW50OworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXNldEFzUGFyZW50Tm9kZU9mKHRoaXMudHlwZSk7CisJfQorCisJLyoqCisJICogPHA+QXJyYXlzIGFubm90YXRpb25zIGFyZSBhbm5vdGF0aW9ucyBvbiB0aGUgYXJyYXlzIG1vZGlmaWVycyBvZiB0aGUgdHlwZS4KKwkgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6PC9wPgorCSAqIAorCSAqIDxwPjxwcmU+CisJICoge0Bjb2RlCisJICogaW50IEBBbm4xIFtdIEBBbm4yIFtdIGFycmF5OworCSAqIH08L3ByZT48L3A+CisJICogCisJICogPHA+aW4gdGhpcyB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIGxpc3Qgd2l0aCB0aGUgYW5ub3RhdGlvbiBleHByZXNzaW9ucyA8cHJlPkBBbm4xPC9wcmU+CisJICogYW5kIDxwcmU+QEFubjI8L3ByZT48L3A+CisJICogCisJICogPHA+Tm90ZSB0aGF0IHRoZSBmaXJzdCBsaXN0IGVsZW1lbnQgb2YgYXJyYXlzQW5ub3RhdGlvbnMgd2lsbCByZWZlciB0byB0aGUgZmlyc3QgYXJyYXkgbW9kaWZpZXIgZW5jb3VudGVyZWQuCisJICogQ29uc2lkZXJpbmcgdGhlIGV4YW1wbGUgdGhlIGZpcnN0IGVsZW1lbnQgd2lsbCBiZSBhIGxpc3QgY29udGFpbmluZyBqdXN0IEBBbm4xIHdoaWxlIHRoZSBzZWNvbmQgZWxlbWVudCB3aWxsCisJICogYmUgYSBsaXN0IGNvbnRhaW5pbmcganVzdCBAQW5uMi4KKwkgKiA8L3A+CisJICoKKwkgKiA8cD5UaGlzIHByb3BlcnR5IGlzIGd1YXJhbnRlZWQgdG8gaG9sZDogPHByZT57QGNvZGUgZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKS5zaXplKCkgPT0gZ2V0QXJyYXlDb3VudCgpfTwvcHJlPgorCSAqIElmIGEgY2VydGFpbiBhcnJheSBtb2RpZmllciBoYXMgbm8gYW5ub3RhdGlvbiB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBvZiBhcnJheXNBbm5vdGF0aW9ucyB3aWxsIGJlIG51bGw8L3A+CisJICovCisgICAgcHVibGljIExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IGdldEFycmF5c0Fubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gYXJyYXlzQW5ub3RhdGlvbnM7CisgICAgfQorCisJLyoqCisJICogRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFycmF5QW5ub3RhdGlvbnMgZmllbGQgcmVmZXIgdG8ge0BsaW5rICNnZXRBcnJheXNBbm5vdGF0aW9ucygpfQorCSAqLworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5c0Fubm90YXRpb25zKExpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IGFycmF5c0Fubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMuYXJyYXlzQW5ub3RhdGlvbnMgPSBhcnJheXNBbm5vdGF0aW9uczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM5MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7CisKKyAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zOworCisgICAgcHVibGljIFR5cGUoKSB7CisgICAgfQorCisgICAgcHVibGljIFR5cGUoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbil7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlKGludCBiZWdpbkxpbmUsIGludCBiZWdpbkNvbHVtbiwgaW50IGVuZExpbmUsIGludCBlbmRDb2x1bW4pIHsKKyAgICAgICAgc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZShpbnQgYmVnaW5MaW5lLCBpbnQgYmVnaW5Db2x1bW4sIGludCBlbmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucykgeworICAgICAgICBzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbnMoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1Vua25vd25UeXBlLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVW5rbm93blR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjZkNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1Vua25vd25UeXBlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBBbiB1bmtub3duIHBhcmFtZXRlciB0eXBlIG9iamVjdC4gSXQgcGxheXMgdGhlIHJvbGUgb2YgYSBudWxsIG9iamVjdCBmb3IKKyAqIGxhbWJkYSBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBubyBleHBsaWNpdCB0eXBlIGRlY2xhcmVkLiBBcyBzdWNoLCBpdCBoYXMgbm8KKyAqIGxleGljYWwgcmVwcmVzZW50YXRpb24gYW5kIGhlbmNlIGdldHMgbm8gY29tbWVudCBhdHRyaWJ1dGVkLgorICoKKyAqIEBhdXRob3IgRGlkaWVyIFZpbGxldmFsb2lzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duVHlwZSBleHRlbmRzIFR5cGUgeworCisgICAgcHVibGljIFVua25vd25UeXBlKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UiwgQT4gUiBhY2NlcHQoZmluYWwgR2VuZXJpY1Zpc2l0b3I8UiwgQT4gdiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgcmV0dXJuIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEE+IHZvaWQgYWNjZXB0KGZpbmFsIFZvaWRWaXNpdG9yPEE+IHYsIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIHYudmlzaXQodGhpcywgYXJnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVm9pZFR5cGUuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9Wb2lkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYWNiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvVm9pZFR5cGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGU7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuR2VuZXJpY1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVm9pZFR5cGUgZXh0ZW5kcyBUeXBlIHsKKworCXB1YmxpYyBWb2lkVHlwZSgpIHsKKwl9CisKKwlwdWJsaWMgVm9pZFR5cGUoZmluYWwgaW50IGJlZ2luTGluZSwgZmluYWwgaW50IGJlZ2luQ29sdW1uLCBmaW5hbCBpbnQgZW5kTGluZSwgZmluYWwgaW50IGVuZENvbHVtbikgeworCQlzdXBlcihiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4pOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1dpbGRjYXJkVHlwZS5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1dpbGRjYXJkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTZlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3R5cGUvV2lsZGNhcmRUeXBlLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Wb2lkVmlzaXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdpbGRjYXJkVHlwZSBleHRlbmRzIFR5cGUgeworCisJcHJpdmF0ZSBSZWZlcmVuY2VUeXBlIGV4dDsKKworCXByaXZhdGUgUmVmZXJlbmNlVHlwZSBzdXA7CisKKwlwdWJsaWMgV2lsZGNhcmRUeXBlKCkgeworCX0KKworCXB1YmxpYyBXaWxkY2FyZFR5cGUoZmluYWwgUmVmZXJlbmNlVHlwZSBleHQpIHsKKwkJc2V0RXh0ZW5kcyhleHQpOworCX0KKworCXB1YmxpYyBXaWxkY2FyZFR5cGUoZmluYWwgUmVmZXJlbmNlVHlwZSBleHQsIGZpbmFsIFJlZmVyZW5jZVR5cGUgc3VwKSB7CisJCXNldEV4dGVuZHMoZXh0KTsKKwkJc2V0U3VwZXIoc3VwKTsKKwl9CisKKwlwdWJsaWMgV2lsZGNhcmRUeXBlKGZpbmFsIGludCBiZWdpbkxpbmUsIGZpbmFsIGludCBiZWdpbkNvbHVtbiwgZmluYWwgaW50IGVuZExpbmUsIGZpbmFsIGludCBlbmRDb2x1bW4sCisJCQlmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dCwgZmluYWwgUmVmZXJlbmNlVHlwZSBzdXApIHsKKwkJc3VwZXIoYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uKTsKKwkJc2V0RXh0ZW5kcyhleHQpOworCQlzZXRTdXBlcihzdXApOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgPFIsIEE+IFIgYWNjZXB0KGZpbmFsIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHYsIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiB2LnZpc2l0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyA8QT4gdm9pZCBhY2NlcHQoZmluYWwgVm9pZFZpc2l0b3I8QT4gdiwgZmluYWwgQSBhcmcpIHsKKwkJdi52aXNpdCh0aGlzLCBhcmcpOworCX0KKworCXB1YmxpYyBSZWZlcmVuY2VUeXBlIGdldEV4dGVuZHMoKSB7CisJCXJldHVybiBleHQ7CisJfQorCisJcHVibGljIFJlZmVyZW5jZVR5cGUgZ2V0U3VwZXIoKSB7CisJCXJldHVybiBzdXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0RXh0ZW5kcyhmaW5hbCBSZWZlcmVuY2VUeXBlIGV4dCkgeworCQl0aGlzLmV4dCA9IGV4dDsKKwkJc2V0QXNQYXJlbnROb2RlT2YodGhpcy5leHQpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN1cGVyKGZpbmFsIFJlZmVyZW5jZVR5cGUgc3VwKSB7CisJCXRoaXMuc3VwID0gc3VwOworCQlzZXRBc1BhcmVudE5vZGVPZih0aGlzLnN1cCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvQ2xvbmVWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvQ2xvbmVWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4ZDI5OQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9DbG9uZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDEyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlNZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKK3B1YmxpYyBjbGFzcyBDbG9uZVZpc2l0b3IgaW1wbGVtZW50cyBHZW5lcmljVmlzaXRvcjxOb2RlLCBPYmplY3Q+IHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VfID0gY2xvbmVOb2Rlcyhfbi5nZXRQYWNrYWdlKCksIF9hcmcpOworCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdmlzaXQoX24uZ2V0SW1wb3J0cygpLCBfYXJnKTsKKwkJTGlzdDxUeXBlRGVjbGFyYXRpb24+IHR5cGVzID0gdmlzaXQoX24uZ2V0VHlwZXMoKSwgX2FyZyk7CisKKwkJcmV0dXJuIG5ldyBDb21waWxhdGlvblVuaXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJcGFja2FnZV8sIGltcG9ydHMsIHR5cGVzCisJCSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworCQlOYW1lRXhwciBuYW1lID0gY2xvbmVOb2Rlcyhfbi5nZXROYW1lKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJUGFja2FnZURlY2xhcmF0aW9uIHIgPSBuZXcgUGFja2FnZURlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWFubm90YXRpb25zLCBuYW1lCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoSW1wb3J0RGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCU5hbWVFeHByIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlJbXBvcnREZWNsYXJhdGlvbiByID0gbmV3IEltcG9ydERlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCW5hbWUsIF9uLmlzU3RhdGljKCksIF9uLmlzQXN0ZXJpc2soKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFR5cGVQYXJhbWV0ZXIgX24sIE9iamVjdCBfYXJnKSB7CisgICAgICAgIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCA9IHZpc2l0KF9uLmdldFR5cGVCb3VuZCgpLCBfYXJnKTsKKworICAgICAgICBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworICAgICAgICBUeXBlUGFyYW1ldGVyIHIgPSBuZXcgVHlwZVBhcmFtZXRlcihfbi5nZXRCZWdpbkxpbmUoKSwKKyAgICAgICAgICAgICAgICBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorICAgICAgICAgICAgICAgIF9uLmdldE5hbWUoKSwgdHlwZUJvdW5kLCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KExpbmVDb21tZW50IF9uLCBPYmplY3QgX2FyZykgeworCQlyZXR1cm4gbmV3IExpbmVDb21tZW50KF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBfbi5nZXRDb250ZW50KCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEJsb2NrQ29tbWVudCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJcmV0dXJuIG5ldyBCbG9ja0NvbW1lbnQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIF9uLmdldENvbnRlbnQoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpOworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworCQlMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZyk7CisJCUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGV4dGVuZHNMaXN0ID0gdmlzaXQoX24uZ2V0RXh0ZW5kcygpLCBfYXJnKTsKKwkJTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaW1wbGVtZW50c0xpc3QgPSB2aXNpdChfbi5nZXRJbXBsZW1lbnRzKCksIF9hcmcpOworCQlMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycyA9IHZpc2l0KF9uLmdldE1lbWJlcnMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gciA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCBfbi5pc0ludGVyZmFjZSgpLCBfbi5nZXROYW1lKCksIHR5cGVQYXJhbWV0ZXJzLCBleHRlbmRzTGlzdCwgaW1wbGVtZW50c0xpc3QsIG1lbWJlcnMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChFbnVtRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZyk7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCUxpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHNMaXN0ID0gdmlzaXQoX24uZ2V0SW1wbGVtZW50cygpLCBfYXJnKTsKKwkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcyA9IHZpc2l0KF9uLmdldEVudHJpZXMoKSwgX2FyZyk7CisJCUxpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzID0gdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUVudW1EZWNsYXJhdGlvbiByID0gbmV3IEVudW1EZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQkgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCBfbi5nZXROYW1lKCksIGltcGxlbWVudHNMaXN0LCBlbnRyaWVzLCBtZW1iZXJzCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRW1wdHlUeXBlRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlFbXB0eVR5cGVEZWNsYXJhdGlvbiByID0gbmV3IEVtcHR5VHlwZURlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZyk7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZyk7CisJCUxpc3Q8Qm9keURlY2xhcmF0aW9uPiBjbGFzc0JvZHkgPSB2aXNpdChfbi5nZXRDbGFzc0JvZHkoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiByID0gbmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCSBhbm5vdGF0aW9ucywgX24uZ2V0TmFtZSgpLCBhcmdzLCBjbGFzc0JvZHkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBbm5vdGF0aW9uRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZyk7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCUxpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzID0gdmlzaXQoX24uZ2V0TWVtYmVycygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFubm90YXRpb25EZWNsYXJhdGlvbiByID0gbmV3IEFubm90YXRpb25EZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQkgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCBfbi5nZXROYW1lKCksIG1lbWJlcnMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gX24sIE9iamVjdCBfYXJnKSB7CisJCUphdmFkb2NDb21tZW50IGphdmFEb2MgPSBjbG9uZU5vZGVzKF9uLmdldEphdmFEb2MoKSwgX2FyZyk7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCVR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZyk7CisJCUV4cHJlc3Npb24gZGVmYXVsdFZhbHVlID0gY2xvbmVOb2Rlcyhfbi5nZXREZWZhdWx0VmFsdWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gciA9IG5ldyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJIF9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZV8sIF9uLmdldE5hbWUoKSwgZGVmYXVsdFZhbHVlCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRmllbGREZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJSmF2YWRvY0NvbW1lbnQgamF2YURvYyA9IGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKTsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IHZpc2l0KF9uLmdldFZhcmlhYmxlcygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUZpZWxkRGVjbGFyYXRpb24gciA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCSBfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCB2YXJpYWJsZXMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3IgX24sIE9iamVjdCBfYXJnKSB7CisJCVZhcmlhYmxlRGVjbGFyYXRvcklkIGlkID0gY2xvbmVOb2Rlcyhfbi5nZXRJZCgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBpbml0ID0gY2xvbmVOb2Rlcyhfbi5nZXRJbml0KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVmFyaWFibGVEZWNsYXJhdG9yIHIgPSBuZXcgVmFyaWFibGVEZWNsYXJhdG9yKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWlkLCBpbml0CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9ySWQgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlWYXJpYWJsZURlY2xhcmF0b3JJZCByID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRvcklkKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCV9uLmdldE5hbWUoKSwgX24uZ2V0QXJyYXlDb3VudCgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJSmF2YWRvY0NvbW1lbnQgamF2YURvYyA9IGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKTsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFR5cGVQYXJhbWV0ZXJzKCksIF9hcmcpOworCQlMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IHZpc2l0KF9uLmdldFBhcmFtZXRlcnMoKSwgX2FyZyk7CisJCUxpc3Q8TmFtZUV4cHI+IHRocm93c18gPSB2aXNpdChfbi5nZXRUaHJvd3MoKSwgX2FyZyk7CisJCUJsb2NrU3RtdCBibG9jayA9IGNsb25lTm9kZXMoX24uZ2V0QmxvY2soKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHIgPSBuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQkgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCB0eXBlUGFyYW1ldGVycywgX24uZ2V0TmFtZSgpLCBwYXJhbWV0ZXJzLCB0aHJvd3NfLCBibG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIF9uLCBPYmplY3QgX2FyZykgeworCQlKYXZhZG9jQ29tbWVudCBqYXZhRG9jID0gY2xvbmVOb2Rlcyhfbi5nZXRKYXZhRG9jKCksIF9hcmcpOworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IHZpc2l0KF9uLmdldEFubm90YXRpb25zKCksIF9hcmcpOworCQlMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgX2FyZyk7CisJCVR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZyk7CisJCUxpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0UGFyYW1ldGVycygpLCBfYXJnKTsKKwkJTGlzdDxOYW1lRXhwcj4gdGhyb3dzXyA9IHZpc2l0KF9uLmdldFRocm93cygpLCBfYXJnKTsKKwkJQmxvY2tTdG10IGJsb2NrID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTWV0aG9kRGVjbGFyYXRpb24gciA9IG5ldyBNZXRob2REZWNsYXJhdGlvbigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQkgX24uZ2V0TW9kaWZpZXJzKCksIGFubm90YXRpb25zLCB0eXBlUGFyYW1ldGVycywgdHlwZV8sIF9uLmdldE5hbWUoKSwgcGFyYW1ldGVycywgX24uZ2V0QXJyYXlDb3VudCgpLCB0aHJvd3NfLCBibG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFBhcmFtZXRlciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBjbG9uZU5vZGVzKF9uLmdldElkKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJUGFyYW1ldGVyIHIgPSBuZXcgUGFyYW1ldGVyKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCV9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZV8sIF9uLmlzVmFyQXJncygpLCBpZAorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChNdWx0aVR5cGVQYXJhbWV0ZXIgX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gdmlzaXQoX24uZ2V0QW5ub3RhdGlvbnMoKSwgX2FyZyk7CisJCUxpc3Q8VHlwZT4gdHlwZXMgPSB2aXNpdChfbi5nZXRUeXBlcygpLCBfYXJnKTsKKwkJVmFyaWFibGVEZWNsYXJhdG9ySWQgaWQgPSBjbG9uZU5vZGVzKF9uLmdldElkKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTXVsdGlUeXBlUGFyYW1ldGVyIHIgPSBuZXcgTXVsdGlUeXBlUGFyYW1ldGVyKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCV9uLmdldE1vZGlmaWVycygpLCBhbm5vdGF0aW9ucywgdHlwZXMsIGlkCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJSmF2YWRvY0NvbW1lbnQgamF2YURvYyA9IGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUVtcHR5TWVtYmVyRGVjbGFyYXRpb24gciA9IG5ldyBFbXB0eU1lbWJlckRlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJSmF2YWRvY0NvbW1lbnQgamF2YURvYyA9IGNsb25lTm9kZXMoX24uZ2V0SmF2YURvYygpLCBfYXJnKTsKKwkJQmxvY2tTdG10IGJsb2NrID0gY2xvbmVOb2Rlcyhfbi5nZXRCbG9jaygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUluaXRpYWxpemVyRGVjbGFyYXRpb24gciA9IG5ldyBJbml0aWFsaXplckRlY2xhcmF0aW9uKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCSBfbi5pc1N0YXRpYygpLCBibG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEphdmFkb2NDb21tZW50IF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisJCUphdmFkb2NDb21tZW50IHIgPSBuZXcgSmF2YWRvY0NvbW1lbnQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJX24uZ2V0Q29udGVudCgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ2xhc3NPckludGVyZmFjZVR5cGUgX24sIE9iamVjdCBfYXJnKSB7CisJCUNsYXNzT3JJbnRlcmZhY2VUeXBlIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ2xhc3NPckludGVyZmFjZVR5cGUgciA9IG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlzY29wZSwgX24uZ2V0TmFtZSgpLCB0eXBlQXJncworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFByaW1pdGl2ZVR5cGUgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlQcmltaXRpdmVUeXBlIHIgPSBuZXcgUHJpbWl0aXZlVHlwZSgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlfbi5nZXRUeXBlKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChSZWZlcmVuY2VUeXBlIF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm4gPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gYXJyYXlzQW5ub3RhdGlvbnMgPSBfbi5nZXRBcnJheXNBbm5vdGF0aW9ucygpOworCQlMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBfYXJyYXlzQW5ub3RhdGlvbnMgPSBudWxsOworCQlpZihhcnJheXNBbm5vdGF0aW9ucyAhPSBudWxsKXsKKwkJCV9hcnJheXNBbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PigpOworCQkJZm9yKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGF1eDogYXJyYXlzQW5ub3RhdGlvbnMpeworCQkJCV9hcnJheXNBbm5vdGF0aW9ucy5hZGQodmlzaXQoYXV4LCBfYXJnKSk7CisJCQl9CisJCX0KKworICAgICAgICBSZWZlcmVuY2VUeXBlIHIgPSBuZXcgUmVmZXJlbmNlVHlwZShfbi5nZXRCZWdpbkxpbmUoKSwKKyAgICAgICAgICAgICAgICBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCB0eXBlXywKKyAgICAgICAgICAgICAgICBfbi5nZXRBcnJheUNvdW50KCksIGFubiwgX2FycmF5c0Fubm90YXRpb25zKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworICAgICAgICByLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFZvaWRUeXBlIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVm9pZFR5cGUgciA9IG5ldyBWb2lkVHlwZShfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoV2lsZGNhcmRUeXBlIF9uLCBPYmplY3QgX2FyZykgeworCQlSZWZlcmVuY2VUeXBlIGV4dCA9IGNsb25lTm9kZXMoX24uZ2V0RXh0ZW5kcygpLCBfYXJnKTsKKwkJUmVmZXJlbmNlVHlwZSBzdXAgPSBjbG9uZU5vZGVzKF9uLmdldFN1cGVyKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJV2lsZGNhcmRUeXBlIHIgPSBuZXcgV2lsZGNhcmRUeXBlKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWV4dCwgc3VwCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoVW5rbm93blR5cGUgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlVbmtub3duVHlwZSByID0gbmV3IFVua25vd25UeXBlKCk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQXJyYXlBY2Nlc3NFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZyk7CisJCUV4cHJlc3Npb24gaW5kZXggPSBjbG9uZU5vZGVzKF9uLmdldEluZGV4KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQXJyYXlBY2Nlc3NFeHByIHIgPSBuZXcgQXJyYXlBY2Nlc3NFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCW5hbWUsIGluZGV4CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQXJyYXlDcmVhdGlvbkV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCVR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gZGltZW5zaW9ucyA9IHZpc2l0KF9uLmdldERpbWVuc2lvbnMoKSwgX2FyZyk7CisJCUFycmF5Q3JlYXRpb25FeHByIHIgPSBuZXcgQXJyYXlDcmVhdGlvbkV4cHIoX24uZ2V0QmVnaW5MaW5lKCksCisJCQkJX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwgdHlwZV8sCisJCQkJZGltZW5zaW9ucywgX24uZ2V0QXJyYXlDb3VudCgpKTsKKwkJaWYgKF9uLmdldEluaXRpYWxpemVyKCkgIT0gbnVsbCkgey8vIEFycmF5Q3JlYXRpb25FeHByIGhhcyB0d28gbXV0dWFsbHkKKwkJCS8vIGV4Y2x1c2l2ZSBjb25zdHJ1Y3RvcnMKKwkJCXIuc2V0SW5pdGlhbGl6ZXIoY2xvbmVOb2Rlcyhfbi5nZXRJbml0aWFsaXplcigpLCBfYXJnKSk7CisJCX0KKwkJTGlzdDxMaXN0PEFubm90YXRpb25FeHByPj4gYXJyYXlzQW5ub3RhdGlvbnMgPSBfbi5nZXRBcnJheXNBbm5vdGF0aW9ucygpOworCQlMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBfYXJyYXlzQW5ub3RhdGlvbnMgPSBudWxsOworCQlpZihhcnJheXNBbm5vdGF0aW9ucyAhPSBudWxsKXsKKwkJCV9hcnJheXNBbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PigpOworCQkJZm9yKExpc3Q8QW5ub3RhdGlvbkV4cHI+IGF1eDogYXJyYXlzQW5ub3RhdGlvbnMpeworCQkJCV9hcnJheXNBbm5vdGF0aW9ucy5hZGQodmlzaXQoYXV4LCBfYXJnKSk7CisJCQl9CisJCX0KKwkJci5zZXRBcnJheXNBbm5vdGF0aW9ucyhfYXJyYXlzQW5ub3RhdGlvbnMpOworICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisgICAgICAgIHIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQXJyYXlJbml0aWFsaXplckV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUxpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzID0gdmlzaXQoX24uZ2V0VmFsdWVzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQXJyYXlJbml0aWFsaXplckV4cHIgciA9IG5ldyBBcnJheUluaXRpYWxpemVyRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQl2YWx1ZXMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChBc3NpZ25FeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIHRhcmdldCA9IGNsb25lTm9kZXMoX24uZ2V0VGFyZ2V0KCksIF9hcmcpOworCQlFeHByZXNzaW9uIHZhbHVlID0gY2xvbmVOb2Rlcyhfbi5nZXRWYWx1ZSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUFzc2lnbkV4cHIgciA9IG5ldyBBc3NpZ25FeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCXRhcmdldCwgdmFsdWUsIF9uLmdldE9wZXJhdG9yKCkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEJpbmFyeUV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gbGVmdCA9IGNsb25lTm9kZXMoX24uZ2V0TGVmdCgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiByaWdodCA9IGNsb25lTm9kZXMoX24uZ2V0UmlnaHQoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlCaW5hcnlFeHByIHIgPSBuZXcgQmluYXJ5RXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlsZWZ0LCByaWdodCwgX24uZ2V0T3BlcmF0b3IoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENhc3RFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlUeXBlIHR5cGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpOworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDYXN0RXhwciByID0gbmV3IENhc3RFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCXR5cGVfLCBleHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ2xhc3NFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlUeXBlIHR5cGVfID0gY2xvbmVOb2Rlcyhfbi5nZXRUeXBlKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ2xhc3NFeHByIHIgPSBuZXcgQ2xhc3NFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCXR5cGVfCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQ29uZGl0aW9uYWxFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGNsb25lTm9kZXMoX24uZ2V0Q29uZGl0aW9uKCksIF9hcmcpOworCQlFeHByZXNzaW9uIHRoZW5FeHByID0gY2xvbmVOb2Rlcyhfbi5nZXRUaGVuRXhwcigpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBlbHNlRXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RWxzZUV4cHIoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDb25kaXRpb25hbEV4cHIgciA9IG5ldyBDb25kaXRpb25hbEV4cHIoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJY29uZGl0aW9uLCB0aGVuRXhwciwgZWxzZUV4cHIKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChFbmNsb3NlZEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gaW5uZXIgPSBjbG9uZU5vZGVzKF9uLmdldElubmVyKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRW5jbG9zZWRFeHByIHIgPSBuZXcgRW5jbG9zZWRFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWlubmVyCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRmllbGRBY2Nlc3NFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRmllbGRBY2Nlc3NFeHByIHIgPSBuZXcgRmllbGRBY2Nlc3NFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCXNjb3BlLCB0eXBlQXJncywgX24uZ2V0RmllbGQoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEluc3RhbmNlT2ZFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZyk7CisJCVR5cGUgdHlwZV8gPSBjbG9uZU5vZGVzKF9uLmdldFR5cGUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlJbnN0YW5jZU9mRXhwciByID0gbmV3IEluc3RhbmNlT2ZFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWV4cHIsIHR5cGVfCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoU3RyaW5nTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKwkJU3RyaW5nTGl0ZXJhbEV4cHIgciA9IG5ldyBTdHJpbmdMaXRlcmFsRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlfbi5nZXRWYWx1ZSgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoSW50ZWdlckxpdGVyYWxFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJSW50ZWdlckxpdGVyYWxFeHByIHIgPSBuZXcgSW50ZWdlckxpdGVyYWxFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCV9uLmdldFZhbHVlKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChMb25nTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlMb25nTGl0ZXJhbEV4cHIgciA9IG5ldyBMb25nTGl0ZXJhbEV4cHIoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJX24uZ2V0VmFsdWUoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIgciA9IG5ldyBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlMb25nTGl0ZXJhbE1pblZhbHVlRXhwciByID0gbmV3IExvbmdMaXRlcmFsTWluVmFsdWVFeHByKF9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChDaGFyTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlDaGFyTGl0ZXJhbEV4cHIgciA9IG5ldyBDaGFyTGl0ZXJhbEV4cHIoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJX24uZ2V0VmFsdWUoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KERvdWJsZUxpdGVyYWxFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRG91YmxlTGl0ZXJhbEV4cHIgciA9IG5ldyBEb3VibGVMaXRlcmFsRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlfbi5nZXRWYWx1ZSgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoQm9vbGVhbkxpdGVyYWxFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQm9vbGVhbkxpdGVyYWxFeHByIHIgPSBuZXcgQm9vbGVhbkxpdGVyYWxFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCV9uLmdldFZhbHVlKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChOdWxsTGl0ZXJhbEV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlOdWxsTGl0ZXJhbEV4cHIgciA9IG5ldyBOdWxsTGl0ZXJhbEV4cHIoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1ldGhvZENhbGxFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpOworCQlMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSB2aXNpdChfbi5nZXRBcmdzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTWV0aG9kQ2FsbEV4cHIgciA9IG5ldyBNZXRob2RDYWxsRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlzY29wZSwgdHlwZUFyZ3MsIF9uLmdldE5hbWUoKSwgYXJncworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE5hbWVFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTmFtZUV4cHIgciA9IG5ldyBOYW1lRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlfbi5nZXROYW1lKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChPYmplY3RDcmVhdGlvbkV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gc2NvcGUgPSBjbG9uZU5vZGVzKF9uLmdldFNjb3BlKCksIF9hcmcpOworCQlDbGFzc09ySW50ZXJmYWNlVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpOworCQlMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSB2aXNpdChfbi5nZXRBcmdzKCksIF9hcmcpOworCQlMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYW5vbnltb3VzQm9keSA9IHZpc2l0KF9uLmdldEFub255bW91c0NsYXNzQm9keSgpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCU9iamVjdENyZWF0aW9uRXhwciByID0gbmV3IE9iamVjdENyZWF0aW9uRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlzY29wZSwgdHlwZV8sIHR5cGVBcmdzLCBhcmdzLCBhbm9ueW1vdXNCb2R5CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoUXVhbGlmaWVkTmFtZUV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCU5hbWVFeHByIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRRdWFsaWZpZXIoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlRdWFsaWZpZWROYW1lRXhwciByID0gbmV3IFF1YWxpZmllZE5hbWVFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCXNjb3BlLCBfbi5nZXROYW1lKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChUaGlzRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBjbGFzc0V4cHIgPSBjbG9uZU5vZGVzKF9uLmdldENsYXNzRXhwcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVRoaXNFeHByIHIgPSBuZXcgVGhpc0V4cHIoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJY2xhc3NFeHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoU3VwZXJFeHByIF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGNsYXNzRXhwciA9IGNsb25lTm9kZXMoX24uZ2V0Q2xhc3NFeHByKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJU3VwZXJFeHByIHIgPSBuZXcgU3VwZXJFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWNsYXNzRXhwcgorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFVuYXJ5RXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVW5hcnlFeHByIHIgPSBuZXcgVW5hcnlFeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWV4cHIsIF9uLmdldE9wZXJhdG9yKCkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSB2aXNpdChfbi5nZXRBbm5vdGF0aW9ucygpLCBfYXJnKTsKKwkJVHlwZSB0eXBlXyA9IGNsb25lTm9kZXMoX24uZ2V0VHlwZSgpLCBfYXJnKTsKKwkJTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcnMgPSB2aXNpdChfbi5nZXRWYXJzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgciA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlfbi5nZXRNb2RpZmllcnMoKSwgYW5ub3RhdGlvbnMsIHR5cGVfLCB2YXJzCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoTWFya2VyQW5ub3RhdGlvbkV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCU5hbWVFeHByIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlNYXJrZXJBbm5vdGF0aW9uRXhwciByID0gbmV3IE1hcmtlckFubm90YXRpb25FeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCW5hbWUKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTmFtZUV4cHIgbmFtZSA9IGNsb25lTm9kZXMoX24uZ2V0TmFtZSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSA9IGNsb25lTm9kZXMoX24uZ2V0TWVtYmVyVmFsdWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciByID0gbmV3IFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCW5hbWUsIG1lbWJlclZhbHVlCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoTm9ybWFsQW5ub3RhdGlvbkV4cHIgX24sIE9iamVjdCBfYXJnKSB7CisJCU5hbWVFeHByIG5hbWUgPSBjbG9uZU5vZGVzKF9uLmdldE5hbWUoKSwgX2FyZyk7CisJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiBwYWlycyA9IHZpc2l0KF9uLmdldFBhaXJzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJTm9ybWFsQW5ub3RhdGlvbkV4cHIgciA9IG5ldyBOb3JtYWxBbm5vdGF0aW9uRXhwcigKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQluYW1lLCBwYWlycworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1lbWJlclZhbHVlUGFpciBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiB2YWx1ZSA9IGNsb25lTm9kZXMoX24uZ2V0VmFsdWUoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlNZW1iZXJWYWx1ZVBhaXIgciA9IG5ldyBNZW1iZXJWYWx1ZVBhaXIoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJX24uZ2V0TmFtZSgpLCB2YWx1ZQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxUeXBlPiB0eXBlQXJncyA9IHZpc2l0KF9uLmdldFR5cGVBcmdzKCksIF9hcmcpOworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHIoKSwgX2FyZyk7CisJCUxpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IHZpc2l0KF9uLmdldEFyZ3MoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgciA9IG5ldyBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJdHlwZUFyZ3MsIF9uLmlzVGhpcygpLCBleHByLCBhcmdzCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gY2xvbmVOb2Rlcyhfbi5nZXRUeXBlRGVjbGFyYXRpb24oKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlUeXBlRGVjbGFyYXRpb25TdG10IHIgPSBuZXcgVHlwZURlY2xhcmF0aW9uU3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQl0eXBlRGVjbAorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEFzc2VydFN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gY2hlY2sgPSBjbG9uZU5vZGVzKF9uLmdldENoZWNrKCksIF9hcmcpOworCQlFeHByZXNzaW9uIG1lc3NhZ2UgPSBjbG9uZU5vZGVzKF9uLmdldE1lc3NhZ2UoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlBc3NlcnRTdG10IHIgPSBuZXcgQXNzZXJ0U3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQljaGVjaywgbWVzc2FnZQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEJsb2NrU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gdmlzaXQoX24uZ2V0U3RtdHMoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlCbG9ja1N0bXQgciA9IG5ldyBCbG9ja1N0bXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJc3RtdHMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChMYWJlbGVkU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJU3RhdGVtZW50IHN0bXQgPSBjbG9uZU5vZGVzKF9uLmdldFN0bXQoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlMYWJlbGVkU3RtdCByID0gbmV3IExhYmVsZWRTdG10KAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCV9uLmdldExhYmVsKCksIHN0bXQKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChFbXB0eVN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlFbXB0eVN0bXQgciA9IG5ldyBFbXB0eVN0bXQoX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KEV4cHJlc3Npb25TdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIGV4cHIgPSBjbG9uZU5vZGVzKF9uLmdldEV4cHJlc3Npb24oKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlFeHByZXNzaW9uU3RtdCByID0gbmV3IEV4cHJlc3Npb25TdG10KAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWV4cHIKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChTd2l0Y2hTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlFeHByZXNzaW9uIHNlbGVjdG9yID0gY2xvbmVOb2Rlcyhfbi5nZXRTZWxlY3RvcigpLCBfYXJnKTsKKwkJTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMgPSB2aXNpdChfbi5nZXRFbnRyaWVzKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJU3dpdGNoU3RtdCByID0gbmV3IFN3aXRjaFN0bXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJc2VsZWN0b3IsIGVudHJpZXMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChTd2l0Y2hFbnRyeVN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gbGFiZWwgPSBjbG9uZU5vZGVzKF9uLmdldExhYmVsKCksIF9hcmcpOworCQlMaXN0PFN0YXRlbWVudD4gc3RtdHMgPSB2aXNpdChfbi5nZXRTdG10cygpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVN3aXRjaEVudHJ5U3RtdCByID0gbmV3IFN3aXRjaEVudHJ5U3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlsYWJlbCwgc3RtdHMKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChCcmVha1N0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlCcmVha1N0bXQgciA9IG5ldyBCcmVha1N0bXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJX24uZ2V0SWQoKQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFJldHVyblN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVJldHVyblN0bXQgciA9IG5ldyBSZXR1cm5TdG10KAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWV4cHIKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChJZlN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZyk7CisJCVN0YXRlbWVudCB0aGVuU3RtdCA9IGNsb25lTm9kZXMoX24uZ2V0VGhlblN0bXQoKSwgX2FyZyk7CisJCVN0YXRlbWVudCBlbHNlU3RtdCA9IGNsb25lTm9kZXMoX24uZ2V0RWxzZVN0bXQoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlJZlN0bXQgciA9IG5ldyBJZlN0bXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJY29uZGl0aW9uLCB0aGVuU3RtdCwgZWxzZVN0bXQKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChXaGlsZVN0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gY29uZGl0aW9uID0gY2xvbmVOb2Rlcyhfbi5nZXRDb25kaXRpb24oKSwgX2FyZyk7CisJCVN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJV2hpbGVTdG10IHIgPSBuZXcgV2hpbGVTdG10KAorCQkJCV9uLmdldEJlZ2luTGluZSgpLCBfbi5nZXRCZWdpbkNvbHVtbigpLCBfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLAorCQkJCWNvbmRpdGlvbiwgYm9keQorCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENvbnRpbnVlU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCUNvbnRpbnVlU3RtdCByID0gbmV3IENvbnRpbnVlU3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlfbi5nZXRJZCgpCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRG9TdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBjb25kaXRpb24gPSBjbG9uZU5vZGVzKF9uLmdldENvbmRpdGlvbigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCURvU3RtdCByID0gbmV3IERvU3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlib2R5LCBjb25kaXRpb24KKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChGb3JlYWNoU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyID0gY2xvbmVOb2Rlcyhfbi5nZXRWYXJpYWJsZSgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBpdGVyYWJsZSA9IGNsb25lTm9kZXMoX24uZ2V0SXRlcmFibGUoKSwgX2FyZyk7CisJCVN0YXRlbWVudCBib2R5ID0gY2xvbmVOb2Rlcyhfbi5nZXRCb2R5KCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJRm9yZWFjaFN0bXQgciA9IG5ldyBGb3JlYWNoU3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQl2YXIsIGl0ZXJhYmxlLCBib2R5CisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoRm9yU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJTGlzdDxFeHByZXNzaW9uPiBpbml0ID0gdmlzaXQoX24uZ2V0SW5pdCgpLCBfYXJnKTsKKwkJRXhwcmVzc2lvbiBjb21wYXJlID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21wYXJlKCksIF9hcmcpOworCQlMaXN0PEV4cHJlc3Npb24+IHVwZGF0ZSA9IHZpc2l0KF9uLmdldFVwZGF0ZSgpLCBfYXJnKTsKKwkJU3RhdGVtZW50IGJvZHkgPSBjbG9uZU5vZGVzKF9uLmdldEJvZHkoKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlGb3JTdG10IHIgPSBuZXcgRm9yU3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlpbml0LCBjb21wYXJlLCB1cGRhdGUsIGJvZHkKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChUaHJvd1N0bXQgX24sIE9iamVjdCBfYXJnKSB7CisJCUV4cHJlc3Npb24gZXhwciA9IGNsb25lTm9kZXMoX24uZ2V0RXhwcigpLCBfYXJnKTsKKwkJQ29tbWVudCBjb21tZW50ID0gY2xvbmVOb2Rlcyhfbi5nZXRDb21tZW50KCksIF9hcmcpOworCisJCVRocm93U3RtdCByID0gbmV3IFRocm93U3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlleHByCisJCSk7CisJCXIuc2V0Q29tbWVudChjb21tZW50KTsKKwkJcmV0dXJuIHI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE5vZGUgdmlzaXQoU3luY2hyb25pemVkU3RtdCBfbiwgT2JqZWN0IF9hcmcpIHsKKwkJRXhwcmVzc2lvbiBleHByID0gY2xvbmVOb2Rlcyhfbi5nZXRFeHByKCksIF9hcmcpOworCQlCbG9ja1N0bXQgYmxvY2sgPSBjbG9uZU5vZGVzKF9uLmdldEJsb2NrKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJU3luY2hyb25pemVkU3RtdCByID0gbmV3IFN5bmNocm9uaXplZFN0bXQoCisJCQkJX24uZ2V0QmVnaW5MaW5lKCksIF9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksCisJCQkJZXhwciwgYmxvY2sKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChUcnlTdG10IF9uLCBPYmplY3QgX2FyZykgeworCQlMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiByZXNvdXJjZXMgPSB2aXNpdChfbi5nZXRSZXNvdXJjZXMoKSxfYXJnKTsKKwkJQmxvY2tTdG10IHRyeUJsb2NrID0gY2xvbmVOb2Rlcyhfbi5nZXRUcnlCbG9jaygpLCBfYXJnKTsKKwkJTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzID0gdmlzaXQoX24uZ2V0Q2F0Y2hzKCksIF9hcmcpOworCQlCbG9ja1N0bXQgZmluYWxseUJsb2NrID0gY2xvbmVOb2Rlcyhfbi5nZXRGaW5hbGx5QmxvY2soKSwgX2FyZyk7CisJCUNvbW1lbnQgY29tbWVudCA9IGNsb25lTm9kZXMoX24uZ2V0Q29tbWVudCgpLCBfYXJnKTsKKworCQlUcnlTdG10IHIgPSBuZXcgVHJ5U3RtdCgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlyZXNvdXJjZXMsIHRyeUJsb2NrLCBjYXRjaHMsIGZpbmFsbHlCbG9jaworCQkpOworCQlyLnNldENvbW1lbnQoY29tbWVudCk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KENhdGNoQ2xhdXNlIF9uLCBPYmplY3QgX2FyZykgeworCQlNdWx0aVR5cGVQYXJhbWV0ZXIgZXhjZXB0ID0gY2xvbmVOb2Rlcyhfbi5nZXRFeGNlcHQoKSwgX2FyZyk7CisJCUJsb2NrU3RtdCBjYXRjaEJsb2NrID0gY2xvbmVOb2Rlcyhfbi5nZXRDYXRjaEJsb2NrKCksIF9hcmcpOworCQlDb21tZW50IGNvbW1lbnQgPSBjbG9uZU5vZGVzKF9uLmdldENvbW1lbnQoKSwgX2FyZyk7CisKKwkJQ2F0Y2hDbGF1c2UgciA9IG5ldyBDYXRjaENsYXVzZSgKKwkJCQlfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwgX24uZ2V0RW5kTGluZSgpLCBfbi5nZXRFbmRDb2x1bW4oKSwKKwkJCQlleGNlcHQuZ2V0TW9kaWZpZXJzKCksIGV4Y2VwdC5nZXRBbm5vdGF0aW9ucygpLCBleGNlcHQuZ2V0VHlwZXMoKSwgZXhjZXB0LmdldElkKCksIGNhdGNoQmxvY2sKKwkJKTsKKwkJci5zZXRDb21tZW50KGNvbW1lbnQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm9kZSB2aXNpdChMYW1iZGFFeHByIF9uLCBPYmplY3QgX2FyZykgeworCisJCUxpc3Q8UGFyYW1ldGVyPiBsYW1iZGFQYXJhbWV0ZXJzID0gdmlzaXQoX24uZ2V0UGFyYW1ldGVycygpLCBfYXJnKTsKKworCQlTdGF0ZW1lbnQgYm9keSA9IGNsb25lTm9kZXMoX24uZ2V0Qm9keSgpLCBfYXJnKTsKKworCQlMYW1iZGFFeHByIHIgPSBuZXcgTGFtYmRhRXhwcihfbi5nZXRCZWdpbkxpbmUoKSwgX24uZ2V0QmVnaW5Db2x1bW4oKSwKKwkJCQlfbi5nZXRFbmRMaW5lKCksIF9uLmdldEVuZENvbHVtbigpLCBsYW1iZGFQYXJhbWV0ZXJzLCBib2R5LAorCQkJCV9uLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkpOworCisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgX24sIE9iamVjdCBhcmcpIHsKKworCQlMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbXMgPSB2aXNpdChfbi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworCQlFeHByZXNzaW9uIHNjb3BlID0gY2xvbmVOb2Rlcyhfbi5nZXRTY29wZSgpLCBhcmcpOworCisJCU1ldGhvZFJlZmVyZW5jZUV4cHIgciA9IG5ldyBNZXRob2RSZWZlcmVuY2VFeHByKF9uLmdldEJlZ2luTGluZSgpLAorCQkJCV9uLmdldEJlZ2luQ29sdW1uKCksIF9uLmdldEVuZExpbmUoKSwgX24uZ2V0RW5kQ29sdW1uKCksIHNjb3BlLAorCQkJCXR5cGVQYXJhbXMsIF9uLmdldElkZW50aWZpZXIoKSk7CisJCXJldHVybiByOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBOb2RlIHZpc2l0KFR5cGVFeHByIG4sIE9iamVjdCBhcmcpIHsKKworCQlUeXBlIHQgPSBjbG9uZU5vZGVzKG4uZ2V0VHlwZSgpLCBhcmcpOworCisJCVR5cGVFeHByIHIgPSBuZXcgVHlwZUV4cHIobi5nZXRCZWdpbkxpbmUoKSwgbi5nZXRCZWdpbkNvbHVtbigpLAorCQkJCW4uZ2V0RW5kTGluZSgpLCBuLmdldEVuZENvbHVtbigpLCB0KTsKKworCQlyZXR1cm4gcjsKKwl9CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBOb2RlPiBMaXN0PFQ+IHZpc2l0KExpc3Q8VD4gX25vZGVzLCBPYmplY3QgX2FyZykgeworICAgICAgICBpZiAoX25vZGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgTGlzdDxUPiByID0gbmV3IEFycmF5TGlzdDxUPihfbm9kZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChUIG4gOiBfbm9kZXMpIHsKKyAgICAgICAgICAgIFQgck4gPSBjbG9uZU5vZGVzKG4sIF9hcmcpOworICAgICAgICAgICAgaWYgKHJOICE9IG51bGwpCisgICAgICAgICAgICAgICAgci5hZGQock4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIE5vZGU+IFQgY2xvbmVOb2RlcyhUIF9ub2RlLCBPYmplY3QgX2FyZykgeworICAgICAgICBpZiAoX25vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBOb2RlIHIgPSBfbm9kZS5hY2NlcHQodGhpcywgX2FyZyk7CisgICAgICAgIGlmIChyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChUKSByOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0R1bXBWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvRHVtcFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA0YWZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0R1bXBWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxNjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlNZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Nb2RpZmllclNldDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJyZWFrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5pbnRlcm5hbC5VdGlscy5pc051bGxPckVtcHR5OworCisvKioKKyAqIER1bXBzIHRoZSBBU1QgdG8gZm9ybWF0dGVkIEphdmEgc291cmNlIGNvZGUuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRHVtcFZpc2l0b3IgaW1wbGVtZW50cyBWb2lkVmlzaXRvcjxPYmplY3Q+IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmludENvbW1lbnRzOworCisgICAgcHVibGljIER1bXBWaXNpdG9yKCkgeworICAgICAgICB0aGlzKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBEdW1wVmlzaXRvcihib29sZWFuIHByaW50Q29tbWVudHMpIHsKKyAgICAgICAgdGhpcy5wcmludENvbW1lbnRzID0gcHJpbnRDb21tZW50czsKKyAgICB9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBTb3VyY2VQcmludGVyIHsKKworCQlwcml2YXRlIGludCBsZXZlbCA9IDA7CisKKwkJcHJpdmF0ZSBib29sZWFuIGluZGVudGVkID0gZmFsc2U7CisKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKwkJcHVibGljIHZvaWQgaW5kZW50KCkgeworCQkJbGV2ZWwrKzsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHVuaW5kZW50KCkgeworCQkJbGV2ZWwtLTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBtYWtlSW5kZW50KCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7CisJCQkJYnVmLmFwcGVuZCgiICAgICIpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgcHJpbnQoZmluYWwgU3RyaW5nIGFyZykgeworCQkJaWYgKCFpbmRlbnRlZCkgeworCQkJCW1ha2VJbmRlbnQoKTsKKwkJCQlpbmRlbnRlZCA9IHRydWU7CisJCQl9CisJCQlidWYuYXBwZW5kKGFyZyk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBwcmludExuKGZpbmFsIFN0cmluZyBhcmcpIHsKKwkJCXByaW50KGFyZyk7CisJCQlwcmludExuKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBwcmludExuKCkgeworCQkJYnVmLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOworCQkJaW5kZW50ZWQgPSBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgeworCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCQl9CisKKwkJQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gZ2V0U291cmNlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIFNvdXJjZVByaW50ZXIgcHJpbnRlciA9IG5ldyBTb3VyY2VQcmludGVyKCk7CisKKwlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKKwkJcmV0dXJuIHByaW50ZXIuZ2V0U291cmNlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50TW9kaWZpZXJzKGZpbmFsIGludCBtb2RpZmllcnMpIHsKKwkJaWYgKE1vZGlmaWVyU2V0LmlzUHJpdmF0ZShtb2RpZmllcnMpKSB7CisJCQlwcmludGVyLnByaW50KCJwcml2YXRlICIpOworCQl9CisJCWlmIChNb2RpZmllclNldC5pc1Byb3RlY3RlZChtb2RpZmllcnMpKSB7CisJCQlwcmludGVyLnByaW50KCJwcm90ZWN0ZWQgIik7CisJCX0KKwkJaWYgKE1vZGlmaWVyU2V0LmlzUHVibGljKG1vZGlmaWVycykpIHsKKwkJCXByaW50ZXIucHJpbnQoInB1YmxpYyAiKTsKKwkJfQorCQlpZiAoTW9kaWZpZXJTZXQuaXNBYnN0cmFjdChtb2RpZmllcnMpKSB7CisJCQlwcmludGVyLnByaW50KCJhYnN0cmFjdCAiKTsKKwkJfQorCQlpZiAoTW9kaWZpZXJTZXQuaXNTdGF0aWMobW9kaWZpZXJzKSkgeworCQkJcHJpbnRlci5wcmludCgic3RhdGljICIpOworCQl9CisJCWlmIChNb2RpZmllclNldC5pc0ZpbmFsKG1vZGlmaWVycykpIHsKKwkJCXByaW50ZXIucHJpbnQoImZpbmFsICIpOworCQl9CisJCWlmIChNb2RpZmllclNldC5pc05hdGl2ZShtb2RpZmllcnMpKSB7CisJCQlwcmludGVyLnByaW50KCJuYXRpdmUgIik7CisJCX0KKwkJaWYgKE1vZGlmaWVyU2V0LmlzU3RyaWN0ZnAobW9kaWZpZXJzKSkgeworCQkJcHJpbnRlci5wcmludCgic3RyaWN0ZnAgIik7CisJCX0KKwkJaWYgKE1vZGlmaWVyU2V0LmlzU3luY2hyb25pemVkKG1vZGlmaWVycykpIHsKKwkJCXByaW50ZXIucHJpbnQoInN5bmNocm9uaXplZCAiKTsKKwkJfQorCQlpZiAoTW9kaWZpZXJTZXQuaXNUcmFuc2llbnQobW9kaWZpZXJzKSkgeworCQkJcHJpbnRlci5wcmludCgidHJhbnNpZW50ICIpOworCQl9CisJCWlmIChNb2RpZmllclNldC5pc1ZvbGF0aWxlKG1vZGlmaWVycykpIHsKKwkJCXByaW50ZXIucHJpbnQoInZvbGF0aWxlICIpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50TWVtYmVycyhmaW5hbCBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycywgZmluYWwgT2JqZWN0IGFyZykgeworCQlmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgOiBtZW1iZXJzKSB7CisJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCW1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCXByaW50ZXIucHJpbnRMbigpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50TWVtYmVyQW5ub3RhdGlvbnMoZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJaWYgKCFpc051bGxPckVtcHR5KGFubm90YXRpb25zKSkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogYW5ub3RhdGlvbnMpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50QW5ub3RhdGlvbnMoZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJaWYgKCFpc051bGxPckVtcHR5KGFubm90YXRpb25zKSkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogYW5ub3RhdGlvbnMpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmludFR5cGVBcmdzKGZpbmFsIExpc3Q8VHlwZT4gYXJncywgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYXJncykpIHsKKwkJCXByaW50ZXIucHJpbnQoIjwiKTsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8VHlwZT4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQkJZmluYWwgVHlwZSB0ID0gaS5uZXh0KCk7CisJCQkJdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCQlwcmludGVyLnByaW50KCI+Iik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRUeXBlUGFyYW1ldGVycyhmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IGFyZ3MsIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KGFyZ3MpKSB7CisJCQlwcmludGVyLnByaW50KCI8Iik7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGVQYXJhbWV0ZXI+IGkgPSBhcmdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA9IGkubmV4dCgpOworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQkJcHJpbnRlci5wcmludCgiPiIpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50QXJndW1lbnRzKGZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncywgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShhcmdzKSkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gYXJncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBFeHByZXNzaW9uIGUgPSBpLm5leHQoKTsKKwkJCQllLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGVyLnByaW50KCIpIik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50SmF2YWRvYyhmaW5hbCBKYXZhZG9jQ29tbWVudCBqYXZhZG9jLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCWlmIChqYXZhZG9jICE9IG51bGwpIHsKKwkJCWphdmFkb2MuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRKYXZhQ29tbWVudChmaW5hbCBDb21tZW50IGphdmFjb21tZW50LCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCWlmIChqYXZhY29tbWVudCAhPSBudWxsKSB7CisJCQlqYXZhY29tbWVudC5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCisJCWlmIChuLmdldFBhY2thZ2UoKSAhPSBudWxsKSB7CisJCQluLmdldFBhY2thZ2UoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCisJCWlmIChuLmdldEltcG9ydHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIGkgOiBuLmdldEltcG9ydHMoKSkgeworCQkJCWkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCQlwcmludGVyLnByaW50TG4oKTsKKwkJfQorCisJCWlmIChuLmdldFR5cGVzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxUeXBlRGVjbGFyYXRpb24+IGkgPSBuLmdldFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQkJaS5uZXh0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJcHJpbnRlci5wcmludExuKCk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJCX0KKwkJCX0KKwkJfQorCisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJwYWNrYWdlICIpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludExuKCI7Iik7CisJCXByaW50ZXIucHJpbnRMbigpOworCisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUXVhbGlmaWVkTmFtZUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFF1YWxpZmllcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIuIik7CisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiaW1wb3J0ICIpOworCQlpZiAobi5pc1N0YXRpYygpKSB7CisJCQlwcmludGVyLnByaW50KCJzdGF0aWMgIik7CisJCX0KKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmlzQXN0ZXJpc2soKSkgeworCQkJcHJpbnRlci5wcmludCgiLioiKTsKKwkJfQorCQlwcmludGVyLnByaW50TG4oIjsiKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworCQlpZiAobi5pc0ludGVyZmFjZSgpKSB7CisJCQlwcmludGVyLnByaW50KCJpbnRlcmZhY2UgIik7CisJCX0gZWxzZSB7CisJCQlwcmludGVyLnByaW50KCJjbGFzcyAiKTsKKwkJfQorCisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCisJCXByaW50VHlwZVBhcmFtZXRlcnMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworCisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldEV4dGVuZHMoKSkpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0RXh0ZW5kcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldEltcGxlbWVudHMoKSkpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBpbXBsZW1lbnRzICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXByaW50ZXIucHJpbnRMbigiIHsiKTsKKwkJcHJpbnRlci5pbmRlbnQoKTsKKwkJaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0TWVtYmVycygpKSkgeworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpOworCQl9CisKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKworCQlwcmludGVyLnVuaW5kZW50KCk7CisJCXByaW50ZXIucHJpbnQoIn0iKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW1wdHlUeXBlRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50ZXIucHJpbnQoIi8qKiIpOworCQlwcmludGVyLnByaW50KG4uZ2V0Q29udGVudCgpKTsKKwkJcHJpbnRlci5wcmludExuKCIqLyIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKEFubm90YXRpb25FeHByIGFlIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJYWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJfQorCQl9CisKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCIuIik7CisJCX0KKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisJCXByaW50VHlwZUFyZ3Mobi5nZXRUeXBlQXJncygpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKEFubm90YXRpb25FeHByIGFubiA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCWFubi5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlwcmludGVyLnByaW50KCIgIik7CisJCQl9CisJCX0KKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisJCWlmIChuLmdldFR5cGVCb3VuZCgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0VHlwZUJvdW5kKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQkJZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9IGkubmV4dCgpOworCQkJCWMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiAmICIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKEFubm90YXRpb25FeHByIGFlIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJYWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJfQorCQl9CisJCXN3aXRjaCAobi5nZXRUeXBlKCkpIHsKKwkJY2FzZSBCb29sZWFuOgorCQkJcHJpbnRlci5wcmludCgiYm9vbGVhbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQnl0ZToKKwkJCXByaW50ZXIucHJpbnQoImJ5dGUiKTsKKwkJCWJyZWFrOworCQljYXNlIENoYXI6CisJCQlwcmludGVyLnByaW50KCJjaGFyIik7CisJCQlicmVhazsKKwkJY2FzZSBEb3VibGU6CisJCQlwcmludGVyLnByaW50KCJkb3VibGUiKTsKKwkJCWJyZWFrOworCQljYXNlIEZsb2F0OgorCQkJcHJpbnRlci5wcmludCgiZmxvYXQiKTsKKwkJCWJyZWFrOworCQljYXNlIEludDoKKwkJCXByaW50ZXIucHJpbnQoImludCIpOworCQkJYnJlYWs7CisJCWNhc2UgTG9uZzoKKwkJCXByaW50ZXIucHJpbnQoImxvbmciKTsKKwkJCWJyZWFrOworCQljYXNlIFNob3J0OgorCQkJcHJpbnRlci5wcmludCgic2hvcnQiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFJlZmVyZW5jZVR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoQW5ub3RhdGlvbkV4cHIgYWUgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlwcmludGVyLnByaW50KCIgIik7CisJCQl9CisJCX0KKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCUxpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IGFycmF5c0Fubm90YXRpb25zID0gbi5nZXRBcnJheXNBbm5vdGF0aW9ucygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG4uZ2V0QXJyYXlDb3VudCgpOyBpKyspIHsKKwkJCWlmIChhcnJheXNBbm5vdGF0aW9ucyAhPSBudWxsICYmIGkgPCBhcnJheXNBbm5vdGF0aW9ucy5zaXplKCkpIHsKKwkJCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGFycmF5c0Fubm90YXRpb25zLmdldChpKTsKKwkJCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJCQlmb3IgKEFubm90YXRpb25FeHByIGFlIDogYW5ub3RhdGlvbnMpIHsKKwkJCQkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCQkJCWFlLmFjY2VwdCh0aGlzLCBhcmcpOworCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlwcmludGVyLnByaW50KCJbXSIpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChBbm5vdGF0aW9uRXhwciBhZSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCQlhZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlwcmludGVyLnByaW50KCI/Iik7CisJCWlmIChuLmdldEV4dGVuZHMoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgZXh0ZW5kcyAiKTsKKwkJCW4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldFN1cGVyKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiIHN1cGVyICIpOworCQkJbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJLy8gTm90aGluZyB0byBkdW1wCisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKTsKKworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKwkJcHJpbnRlci5wcmludCgiICIpOworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRvcj4gaSA9IG4uZ2V0VmFyaWFibGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyID0gaS5uZXh0KCk7CisJCQl2YXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJfQorCQl9CisKKwkJcHJpbnRlci5wcmludCgiOyIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldElkKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldEluaXQoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgPSAiKTsKKwkJCW4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbi5nZXRBcnJheUNvdW50KCk7IGkrKykgeworCQkJcHJpbnRlci5wcmludCgiW10iKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoInsiKTsKKwkJaWYgKG4uZ2V0VmFsdWVzKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBFeHByZXNzaW9uIGV4cHIgPSBpLm5leHQoKTsKKwkJCQlleHByLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJfQorCQlwcmludGVyLnByaW50KCJ9Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgidm9pZCIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiWyIpOworCQluLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIl0iKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJuZXcgIik7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBhcnJheXNBbm5vdGF0aW9ucyA9IG4uZ2V0QXJyYXlzQW5ub3RhdGlvbnMoKTsKKwkJaWYgKG4uZ2V0RGltZW5zaW9ucygpICE9IG51bGwpIHsKKwkJCWludCBqID0gMDsKKwkJCWZvciAoZmluYWwgRXhwcmVzc2lvbiBkaW0gOiBuLmdldERpbWVuc2lvbnMoKSkgeworCisJCQkJaWYgKGFycmF5c0Fubm90YXRpb25zICE9IG51bGwgJiYgaiA8IGFycmF5c0Fubm90YXRpb25zLnNpemUoKSkgeworCQkJCQlMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IGFycmF5c0Fubm90YXRpb25zLmdldChqKTsKKwkJCQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCQkJCWZvciAoQW5ub3RhdGlvbkV4cHIgYWUgOiBhbm5vdGF0aW9ucykgeworCQkJCQkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCQkJCQlhZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlwcmludGVyLnByaW50KCJbIik7CisJCQkJZGltLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnQoIl0iKTsKKwkJCQlqKys7CisJCQl9CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG4uZ2V0QXJyYXlDb3VudCgpOyBpKyspIHsKKwkJCQlpZiAoYXJyYXlzQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiBpIDwgYXJyYXlzQW5ub3RhdGlvbnMuc2l6ZSgpKSB7CisKKwkJCQkJTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBhcnJheXNBbm5vdGF0aW9ucy5nZXQoaSk7CisJCQkJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQkJCQlmb3IgKEFubm90YXRpb25FeHByIGFlIDogYW5ub3RhdGlvbnMpIHsKKwkJCQkJCQlwcmludGVyLnByaW50KCIgIik7CisJCQkJCQkJYWUuYWNjZXB0KHRoaXMsIGFyZyk7CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlwcmludGVyLnByaW50KCJbXSIpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG4uZ2V0QXJyYXlDb3VudCgpOyBpKyspIHsKKwkJCQlpZiAoYXJyYXlzQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiBpIDwgYXJyYXlzQW5ub3RhdGlvbnMuc2l6ZSgpKSB7CisJCQkJCUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gYXJyYXlzQW5ub3RhdGlvbnMuZ2V0KGkpOworCQkJCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJCQkJZm9yIChBbm5vdGF0aW9uRXhwciBhZSA6IGFubm90YXRpb25zKSB7CisJCQkJCQkJYWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCQkJcHJpbnRlci5wcmludCgiICIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXByaW50ZXIucHJpbnQoIltdIik7CisJCQl9CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCQluLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJc3dpdGNoIChuLmdldE9wZXJhdG9yKCkpIHsKKwkJY2FzZSBhc3NpZ246CisJCQlwcmludGVyLnByaW50KCI9Iik7CisJCQlicmVhazsKKwkJY2FzZSBhbmQ6CisJCQlwcmludGVyLnByaW50KCImPSIpOworCQkJYnJlYWs7CisJCWNhc2Ugb3I6CisJCQlwcmludGVyLnByaW50KCJ8PSIpOworCQkJYnJlYWs7CisJCWNhc2UgeG9yOgorCQkJcHJpbnRlci5wcmludCgiXj0iKTsKKwkJCWJyZWFrOworCQljYXNlIHBsdXM6CisJCQlwcmludGVyLnByaW50KCIrPSIpOworCQkJYnJlYWs7CisJCWNhc2UgbWludXM6CisJCQlwcmludGVyLnByaW50KCItPSIpOworCQkJYnJlYWs7CisJCWNhc2UgcmVtOgorCQkJcHJpbnRlci5wcmludCgiJT0iKTsKKwkJCWJyZWFrOworCQljYXNlIHNsYXNoOgorCQkJcHJpbnRlci5wcmludCgiLz0iKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXI6CisJCQlwcmludGVyLnByaW50KCIqPSIpOworCQkJYnJlYWs7CisJCWNhc2UgbFNoaWZ0OgorCQkJcHJpbnRlci5wcmludCgiPDw9Iik7CisJCQlicmVhazsKKwkJY2FzZSByU2lnbmVkU2hpZnQ6CisJCQlwcmludGVyLnByaW50KCI+Pj0iKTsKKwkJCWJyZWFrOworCQljYXNlIHJVbnNpZ25lZFNoaWZ0OgorCQkJcHJpbnRlci5wcmludCgiPj4+PSIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRlci5wcmludCgiICIpOworCQluLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldExlZnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiICIpOworCQlzd2l0Y2ggKG4uZ2V0T3BlcmF0b3IoKSkgeworCQljYXNlIG9yOgorCQkJcHJpbnRlci5wcmludCgifHwiKTsKKwkJCWJyZWFrOworCQljYXNlIGFuZDoKKwkJCXByaW50ZXIucHJpbnQoIiYmIik7CisJCQlicmVhazsKKwkJY2FzZSBiaW5PcjoKKwkJCXByaW50ZXIucHJpbnQoInwiKTsKKwkJCWJyZWFrOworCQljYXNlIGJpbkFuZDoKKwkJCXByaW50ZXIucHJpbnQoIiYiKTsKKwkJCWJyZWFrOworCQljYXNlIHhvcjoKKwkJCXByaW50ZXIucHJpbnQoIl4iKTsKKwkJCWJyZWFrOworCQljYXNlIGVxdWFsczoKKwkJCXByaW50ZXIucHJpbnQoIj09Iik7CisJCQlicmVhazsKKwkJY2FzZSBub3RFcXVhbHM6CisJCQlwcmludGVyLnByaW50KCIhPSIpOworCQkJYnJlYWs7CisJCWNhc2UgbGVzczoKKwkJCXByaW50ZXIucHJpbnQoIjwiKTsKKwkJCWJyZWFrOworCQljYXNlIGdyZWF0ZXI6CisJCQlwcmludGVyLnByaW50KCI+Iik7CisJCQlicmVhazsKKwkJY2FzZSBsZXNzRXF1YWxzOgorCQkJcHJpbnRlci5wcmludCgiPD0iKTsKKwkJCWJyZWFrOworCQljYXNlIGdyZWF0ZXJFcXVhbHM6CisJCQlwcmludGVyLnByaW50KCI+PSIpOworCQkJYnJlYWs7CisJCWNhc2UgbFNoaWZ0OgorCQkJcHJpbnRlci5wcmludCgiPDwiKTsKKwkJCWJyZWFrOworCQljYXNlIHJTaWduZWRTaGlmdDoKKwkJCXByaW50ZXIucHJpbnQoIj4+Iik7CisJCQlicmVhazsKKwkJY2FzZSByVW5zaWduZWRTaGlmdDoKKwkJCXByaW50ZXIucHJpbnQoIj4+PiIpOworCQkJYnJlYWs7CisJCWNhc2UgcGx1czoKKwkJCXByaW50ZXIucHJpbnQoIisiKTsKKwkJCWJyZWFrOworCQljYXNlIG1pbnVzOgorCQkJcHJpbnRlci5wcmludCgiLSIpOworCQkJYnJlYWs7CisJCWNhc2UgdGltZXM6CisJCQlwcmludGVyLnByaW50KCIqIik7CisJCQlicmVhazsKKwkJY2FzZSBkaXZpZGU6CisJCQlwcmludGVyLnByaW50KCIvIik7CisJCQlicmVhazsKKwkJY2FzZSByZW1haW5kZXI6CisJCQlwcmludGVyLnByaW50KCIlIik7CisJCQlicmVhazsKKwkJfQorCQlwcmludGVyLnByaW50KCIgIik7CisJCW4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCIoIik7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpICIpOworCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIi5jbGFzcyIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgPyAiKTsKKwkJbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgOiAiKTsKKwkJbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCIoIik7CisJCWlmIChuLmdldElubmVyKCkgIT0gbnVsbCkgeworCQluLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJcHJpbnRlci5wcmludCgiKSIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIi4iKTsKKwkJcHJpbnRlci5wcmludChuLmdldEZpZWxkKCkpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIgaW5zdGFuY2VvZiAiKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiciKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCQlwcmludGVyLnByaW50KCInIik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIlwiIik7CisJCXByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKwkJcHJpbnRlci5wcmludCgiXCIiKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChTdHJpbmcudmFsdWVPZihuLmdldFZhbHVlKCkpKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTnVsbExpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgibnVsbCIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUaGlzRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldENsYXNzRXhwcigpICE9IG51bGwpIHsKKwkJCW4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCIuIik7CisJCX0KKwkJcHJpbnRlci5wcmludCgidGhpcyIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQluLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJcHJpbnRlci5wcmludCgiLiIpOworCQl9CisJCXByaW50ZXIucHJpbnQoInN1cGVyIik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCIuIik7CisJCX0KKwkJcHJpbnRUeXBlQXJncyhuLmdldFR5cGVBcmdzKCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCQlwcmludEFyZ3VtZW50cyhuLmdldEFyZ3MoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCIuIik7CisJCX0KKworCQlwcmludGVyLnByaW50KCJuZXcgIik7CisKKwkJcHJpbnRUeXBlQXJncyhuLmdldFR5cGVBcmdzKCksIGFyZyk7CisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVBcmdzKCkpKSB7CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCX0KKworCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworCQlwcmludEFyZ3VtZW50cyhuLmdldEFyZ3MoKSwgYXJnKTsKKworCQlpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50TG4oIiB7Iik7CisJCQlwcmludGVyLmluZGVudCgpOworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCksIGFyZyk7CisJCQlwcmludGVyLnVuaW5kZW50KCk7CisJCQlwcmludGVyLnByaW50KCJ9Iik7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5hcnlFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJc3dpdGNoIChuLmdldE9wZXJhdG9yKCkpIHsKKwkJY2FzZSBwb3NpdGl2ZToKKwkJCXByaW50ZXIucHJpbnQoIisiKTsKKwkJCWJyZWFrOworCQljYXNlIG5lZ2F0aXZlOgorCQkJcHJpbnRlci5wcmludCgiLSIpOworCQkJYnJlYWs7CisJCWNhc2UgaW52ZXJzZToKKwkJCXByaW50ZXIucHJpbnQoIn4iKTsKKwkJCWJyZWFrOworCQljYXNlIG5vdDoKKwkJCXByaW50ZXIucHJpbnQoIiEiKTsKKwkJCWJyZWFrOworCQljYXNlIHByZUluY3JlbWVudDoKKwkJCXByaW50ZXIucHJpbnQoIisrIik7CisJCQlicmVhazsKKwkJY2FzZSBwcmVEZWNyZW1lbnQ6CisJCQlwcmludGVyLnByaW50KCItLSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCX0KKworCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKworCQlzd2l0Y2ggKG4uZ2V0T3BlcmF0b3IoKSkgeworCQljYXNlIHBvc0luY3JlbWVudDoKKwkJCXByaW50ZXIucHJpbnQoIisrIik7CisJCQlicmVhazsKKwkJY2FzZSBwb3NEZWNyZW1lbnQ6CisJCQlwcmludGVyLnByaW50KCItLSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKTsKKwkJcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisJCXByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisJCXByaW50VHlwZVBhcmFtZXRlcnMobi5nZXRUeXBlUGFyYW1ldGVycygpLCBhcmcpOworCQlpZiAobi5nZXRUeXBlUGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJfQorCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKworCQlwcmludGVyLnByaW50KCIoIik7CisJCWlmIChuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IG4uZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIFBhcmFtZXRlciBwID0gaS5uZXh0KCk7CisJCQkJcC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpbnRlci5wcmludCgiKSIpOworCisJCWlmICghaXNOdWxsT3JFbXB0eShuLmdldFRocm93cygpKSkgeworCQkJcHJpbnRlci5wcmludCgiIHRocm93cyAiKTsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8TmFtZUV4cHI+IGkgPSBuLmdldFRocm93cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIE5hbWVFeHByIG5hbWUgPSBpLm5leHQoKTsKKwkJCQluYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGVyLnByaW50KCIgIik7CisJCW4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShuKTsKKworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKwkJaWYgKG4uaXNEZWZhdWx0KCkpIHsKKwkJCXByaW50ZXIucHJpbnQoImRlZmF1bHQgIik7CisJCX0KKwkJcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisJCWlmIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiICIpOworCQl9CisKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisKKwkJcHJpbnRlci5wcmludCgiKCIpOworCQlpZiAobi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBQYXJhbWV0ZXIgcCA9IGkubmV4dCgpOworCQkJCXAuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQl9CisJCXByaW50ZXIucHJpbnQoIikiKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG4uZ2V0QXJyYXlDb3VudCgpOyBpKyspIHsKKwkJCXByaW50ZXIucHJpbnQoIltdIik7CisJCX0KKworCQlpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUaHJvd3MoKSkpIHsKKwkJCXByaW50ZXIucHJpbnQoIiB0aHJvd3MgIik7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE5hbWVFeHByPiBpID0gbi5nZXRUaHJvd3MoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBOYW1lRXhwciBuYW1lID0gaS5uZXh0KCk7CisJCQkJbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Qm9keSgpID09IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIjsiKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKwkJaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmlzVmFyQXJncygpKSB7CisJCQlwcmludGVyLnByaW50KCIuLi4iKTsKKwkJfQorCQlwcmludGVyLnByaW50KCIgIik7CisJCW4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisJCisgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KE11bHRpVHlwZVBhcmFtZXRlciBuLCBPYmplY3QgYXJnKSB7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworICAgICAgICBJdGVyYXRvcjxUeXBlPiB0eXBlcyA9IG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpOworICAgICAgICB0eXBlcy5uZXh0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHdoaWxlICh0eXBlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgCXByaW50ZXIucHJpbnQoIiB8ICIpOworICAgICAgICAJdHlwZXMubmV4dCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uaXNUaGlzKCkpIHsKKwkJCXByaW50VHlwZUFyZ3Mobi5nZXRUeXBlQXJncygpLCBhcmcpOworCQkJcHJpbnRlci5wcmludCgidGhpcyIpOworCQl9IGVsc2UgeworCQkJaWYgKG4uZ2V0RXhwcigpICE9IG51bGwpIHsKKwkJCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlwcmludGVyLnByaW50KCIuIik7CisJCQl9CisJCQlwcmludFR5cGVBcmdzKG4uZ2V0VHlwZUFyZ3MoKSwgYXJnKTsKKwkJCXByaW50ZXIucHJpbnQoInN1cGVyIik7CisJCX0KKwkJcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKwkJcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKworCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRvcj4gaSA9IG4uZ2V0VmFycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHYgPSBpLm5leHQoKTsKKwkJCXYuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFR5cGVEZWNsYXJhdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiYXNzZXJ0ICIpOworCQluLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgOiAiKTsKKwkJCW4uZ2V0TWVzc2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnRMbigieyIpOworCQlpZiAobi5nZXRTdG10cygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIuaW5kZW50KCk7CisJCQlmb3IgKGZpbmFsIFN0YXRlbWVudCBzIDogbi5nZXRTdG10cygpKSB7CisJCQkJcy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCX0KKwkJCXByaW50ZXIudW5pbmRlbnQoKTsKKwkJfQorCQlwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworCQlwcmludGVyLnByaW50KCJ9Iik7CisKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TGFiZWwoKSk7CisJCXByaW50ZXIucHJpbnQoIjogIik7CisJCW4uZ2V0U3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJzd2l0Y2goIik7CisJCW4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludExuKCIpIHsiKTsKKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIuaW5kZW50KCk7CisJCQlmb3IgKGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBlIDogbi5nZXRFbnRyaWVzKCkpIHsKKwkJCQllLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQkJcHJpbnRlci51bmluZGVudCgpOworCQl9CisJCXByaW50ZXIucHJpbnQoIn0iKTsKKworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRMYWJlbCgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoImNhc2UgIik7CisJCQluLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlwcmludGVyLnByaW50KCI6Iik7CisJCX0gZWxzZSB7CisJCQlwcmludGVyLnByaW50KCJkZWZhdWx0OiIpOworCQl9CisJCXByaW50ZXIucHJpbnRMbigpOworCQlwcmludGVyLmluZGVudCgpOworCQlpZiAobi5nZXRTdG10cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgU3RhdGVtZW50IHMgOiBuLmdldFN0bXRzKCkpIHsKKwkJCQlzLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJfQorCQl9CisJCXByaW50ZXIudW5pbmRlbnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiYnJlYWsiKTsKKwkJaWYgKG4uZ2V0SWQoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCQlwcmludGVyLnByaW50KG4uZ2V0SWQoKSk7CisJCX0KKwkJcHJpbnRlci5wcmludCgiOyIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgicmV0dXJuIik7CisJCWlmIChuLmdldEV4cHIoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgIik7CisJCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50SmF2YWRvYyhuLmdldEphdmFEb2MoKSwgYXJnKTsKKwkJcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisJCXByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisJCXByaW50ZXIucHJpbnQoImVudW0gIik7CisJCXByaW50ZXIucHJpbnQobi5nZXROYW1lKCkpOworCisJCWlmIChuLmdldEltcGxlbWVudHMoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50KCIgaW1wbGVtZW50cyAiKTsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8Q2xhc3NPckludGVyZmFjZVR5cGU+IGkgPSBuLmdldEltcGxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID0gaS5uZXh0KCk7CisJCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwcmludGVyLnByaW50TG4oIiB7Iik7CisJCXByaW50ZXIuaW5kZW50KCk7CisJCWlmIChuLmdldEVudHJpZXMoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGkgPSBuLmdldEVudHJpZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlID0gaS5uZXh0KCk7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcHJpbnRlci5wcmludCgiLCAiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0TWVtYmVycygpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnRMbigiOyIpOworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpOworCQl9IGVsc2UgeworCQkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCX0KKwkJfQorCQlwcmludGVyLnVuaW5kZW50KCk7CisJCXByaW50ZXIucHJpbnQoIn0iKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZyk7CisJCXByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworCQlwcmludGVyLnByaW50KG4uZ2V0TmFtZSgpKTsKKworCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJcHJpbnRBcmd1bWVudHMobi5nZXRBcmdzKCksIGFyZyk7CisJCX0KKworCQlpZiAobi5nZXRDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisJCQlwcmludGVyLnByaW50TG4oIiB7Iik7CisJCQlwcmludGVyLmluZGVudCgpOworCQkJcHJpbnRNZW1iZXJzKG4uZ2V0Q2xhc3NCb2R5KCksIGFyZyk7CisJCQlwcmludGVyLnVuaW5kZW50KCk7CisJCQlwcmludGVyLnByaW50TG4oIn0iKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eU1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRKYXZhZG9jKG4uZ2V0SmF2YURvYygpLCBhcmcpOworCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludEphdmFkb2Mobi5nZXRKYXZhRG9jKCksIGFyZyk7CisJCWlmIChuLmlzU3RhdGljKCkpIHsKKwkJCXByaW50ZXIucHJpbnQoInN0YXRpYyAiKTsKKwkJfQorCQluLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoImlmICgiKTsKKwkJbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJZmluYWwgYm9vbGVhbiB0aGVuQmxvY2sgPSBuLmdldFRoZW5TdG10KCkgaW5zdGFuY2VvZiBCbG9ja1N0bXQ7CisJCWlmICh0aGVuQmxvY2spIC8vIGJsb2NrIHN0YXRlbWVudCBzaG91bGQgc3RhcnQgb24gdGhlIHNhbWUgbGluZQorCQkJcHJpbnRlci5wcmludCgiKSAiKTsKKwkJZWxzZSB7CisJCQlwcmludGVyLnByaW50TG4oIikiKTsKKwkJCXByaW50ZXIuaW5kZW50KCk7CisJCX0KKwkJbi5nZXRUaGVuU3RtdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAoIXRoZW5CbG9jaykKKwkJCXByaW50ZXIudW5pbmRlbnQoKTsKKwkJaWYgKG4uZ2V0RWxzZVN0bXQoKSAhPSBudWxsKSB7CisJCQlpZiAodGhlbkJsb2NrKQorCQkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCWVsc2UKKwkJCQlwcmludGVyLnByaW50TG4oKTsKKwkJCWZpbmFsIGJvb2xlYW4gZWxzZUlmID0gbi5nZXRFbHNlU3RtdCgpIGluc3RhbmNlb2YgSWZTdG10OworCQkJZmluYWwgYm9vbGVhbiBlbHNlQmxvY2sgPSBuLmdldEVsc2VTdG10KCkgaW5zdGFuY2VvZiBCbG9ja1N0bXQ7CisJCQlpZiAoZWxzZUlmIHx8IGVsc2VCbG9jaykgLy8gcHV0IGNoYWluZWQgaWYgYW5kIHN0YXJ0IG9mIGJsb2NrIHN0YXRlbWVudCBvbiBhIHNhbWUgbGV2ZWwKKwkJCQlwcmludGVyLnByaW50KCJlbHNlICIpOworCQkJZWxzZSB7CisJCQkJcHJpbnRlci5wcmludExuKCJlbHNlIik7CisJCQkJcHJpbnRlci5pbmRlbnQoKTsKKwkJCX0KKwkJCW4uZ2V0RWxzZVN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmICghKGVsc2VJZiB8fCBlbHNlQmxvY2spKQorCQkJCXByaW50ZXIudW5pbmRlbnQoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJ3aGlsZSAoIik7CisJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIikgIik7CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJjb250aW51ZSIpOworCQlpZiAobi5nZXRJZCgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJCXByaW50ZXIucHJpbnQobi5nZXRJZCgpKTsKKwkJfQorCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoImRvICIpOworCQluLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiIHdoaWxlICgiKTsKKwkJbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKTsiKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJmb3IgKCIpOworCQluLmdldFZhcmlhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiA6ICIpOworCQluLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIikgIik7CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiZm9yICgiKTsKKwkJaWYgKG4uZ2V0SW5pdCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IG4uZ2V0SW5pdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQl9CisJCXByaW50ZXIucHJpbnQoIjsgIik7CisJCWlmIChuLmdldENvbXBhcmUoKSAhPSBudWxsKSB7CisJCQluLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlwcmludGVyLnByaW50KCI7ICIpOworCQlpZiAobi5nZXRVcGRhdGUoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPEV4cHJlc3Npb24+IGkgPSBuLmdldFVwZGF0ZSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCWZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQl9CisJCXByaW50ZXIucHJpbnQoIikgIik7CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJ0aHJvdyAiKTsKKwkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIjsiKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoInN5bmNocm9uaXplZCAoIik7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIpICIpOworCQluLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJ0cnkgIik7CisJCWlmICghbi5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKwkJCXByaW50ZXIucHJpbnQoIigiKTsKKwkJCUl0ZXJhdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25FeHByPiByZXNvdXJjZXMgPSBuLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7CisJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCXdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7CisJCQkJdmlzaXQocmVzb3VyY2VzLm5leHQoKSwgYXJnKTsKKwkJCQlpZiAocmVzb3VyY2VzLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCI7Iik7CisJCQkJCXByaW50ZXIucHJpbnRMbigpOworCQkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJCXByaW50ZXIuaW5kZW50KCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCX0KKwkJCWlmIChuLmdldFJlc291cmNlcygpLnNpemUoKSA+IDEpIHsKKwkJCQlwcmludGVyLnVuaW5kZW50KCk7CisJCQl9CisJCQlwcmludGVyLnByaW50KCIpICIpOworCQl9CisJCW4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0Q2F0Y2hzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBDYXRjaENsYXVzZSBjIDogbi5nZXRDYXRjaHMoKSkgeworCQkJCWMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCkgeworCQkJcHJpbnRlci5wcmludCgiIGZpbmFsbHkgIik7CisJCQluLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiIGNhdGNoICgiKTsKKwkJbi5nZXRFeGNlcHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKSAiKTsKKwkJbi5nZXRDYXRjaEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRKYXZhZG9jKG4uZ2V0SmF2YURvYygpLCBhcmcpOworCQlwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKwkJcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKwkJcHJpbnRlci5wcmludCgiQGludGVyZmFjZSAiKTsKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisJCXByaW50ZXIucHJpbnRMbigiIHsiKTsKKwkJcHJpbnRlci5pbmRlbnQoKTsKKwkJaWYgKG4uZ2V0TWVtYmVycygpICE9IG51bGwpIHsKKwkJCXByaW50TWVtYmVycyhuLmdldE1lbWJlcnMoKSwgYXJnKTsKKwkJfQorCQlwcmludGVyLnVuaW5kZW50KCk7CisJCXByaW50ZXIucHJpbnQoIn0iKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRKYXZhZG9jKG4uZ2V0SmF2YURvYygpLCBhcmcpOworCQlwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKwkJcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIiAiKTsKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisJCXByaW50ZXIucHJpbnQoIigpIik7CisJCWlmIChuLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKKwkJCXByaW50ZXIucHJpbnQoIiBkZWZhdWx0ICIpOworCQkJbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlwcmludGVyLnByaW50KCI7Iik7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiQCIpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworCQlwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlwcmludGVyLnByaW50KCJAIik7CisJCW4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlwcmludGVyLnByaW50KCIoIik7CisJCW4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJcHJpbnRlci5wcmludCgiKSIpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisJCXByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIkAiKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCXByaW50ZXIucHJpbnQoIigiKTsKKwkJaWYgKG4uZ2V0UGFpcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gaSA9IG4uZ2V0UGFpcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbSA9IGkubmV4dCgpOworCQkJCW0uYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKGkuaGFzTmV4dCgpKSB7CisJCQkJCXByaW50ZXIucHJpbnQoIiwgIik7CisJCQkJfQorCQkJfQorCQl9CisJCXByaW50ZXIucHJpbnQoIikiKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJcHJpbnRlci5wcmludChuLmdldE5hbWUoKSk7CisJCXByaW50ZXIucHJpbnQoIiA9ICIpOworCQluLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKwkJaWYgKCF0aGlzLnByaW50Q29tbWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIvLyIpOworCQlTdHJpbmcgdG1wID0gbi5nZXRDb250ZW50KCk7CisJCXRtcCA9IHRtcC5yZXBsYWNlKCdccicsICcgJyk7CisJCXRtcCA9IHRtcC5yZXBsYWNlKCdcbicsICcgJyk7CisJCXByaW50ZXIucHJpbnRMbih0bXApOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBpZiAoIXRoaXMucHJpbnRDb21tZW50cykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIi8qIik7CisJCXByaW50ZXIucHJpbnQobi5nZXRDb250ZW50KCkpOworCQlwcmludGVyLnByaW50TG4oIiovIik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBPYmplY3QgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuLmdldFBhcmFtZXRlcnMoKTsKKwkJYm9vbGVhbiBwcmludFBhciA9IGZhbHNlOworCQlwcmludFBhciA9IG4uaXNQYXJhbWV0ZXJzRW5jbG9zZWQoKTsKKworCQlpZiAocHJpbnRQYXIpIHsKKwkJCXByaW50ZXIucHJpbnQoIigiKTsKKwkJfQorCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQlmb3IgKEl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IHBhcmFtZXRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQkJUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKwkJCQlwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChpLmhhc05leHQoKSkgeworCQkJCQlwcmludGVyLnByaW50KCIsICIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAocHJpbnRQYXIpIHsKKwkJCXByaW50ZXIucHJpbnQoIikiKTsKKwkJfQorCisJCXByaW50ZXIucHJpbnQoIiAtPiAiKTsKKwkJU3RhdGVtZW50IGJvZHkgPSBuLmdldEJvZHkoKTsKKwkJaWYgKGJvZHkgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RtdCkgeworCQkJLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gZGlyZWN0bHkKKwkJCSgoRXhwcmVzc2lvblN0bXQpIGJvZHkpLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfSBlbHNlIHsKKwkJCWJvZHkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgT2JqZWN0IGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBFeHByZXNzaW9uIHNjb3BlID0gbi5nZXRTY29wZSgpOworICAgICAgICBTdHJpbmcgaWRlbnRpZmllciA9IG4uZ2V0SWRlbnRpZmllcigpOworICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludCgiOjoiKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI8Iik7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFR5cGVQYXJhbWV0ZXI+IGkgPSBuLmdldFR5cGVQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaQorICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFR5cGVQYXJhbWV0ZXIgcCA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIHAuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRlci5wcmludCgiPiIpOworICAgICAgICB9CisgICAgICAgIGlmIChpZGVudGlmaWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoaWRlbnRpZmllcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVFeHByIG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKGZpbmFsIE5vZGUgbm9kZSl7CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgcmV0dXJuOworCisgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7CisgICAgICAgIGlmIChwYXJlbnQ9PW51bGwpIHJldHVybjsKKyAgICAgICAgTGlzdDxOb2RlPiBldmVyeXRoaW5nID0gbmV3IExpbmtlZExpc3Q8Tm9kZT4oKTsKKyAgICAgICAgZXZlcnl0aGluZy5hZGRBbGwocGFyZW50LmdldENoaWxkcmVuTm9kZXMoKSk7CisgICAgICAgIHNvcnRCeUJlZ2luUG9zaXRpb24oZXZlcnl0aGluZyk7CisgICAgICAgIGludCBwb3NpdGlvbk9mVGhlQ2hpbGQgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8ZXZlcnl0aGluZy5zaXplKCk7aSsrKXsKKyAgICAgICAgICAgIGlmIChldmVyeXRoaW5nLmdldChpKT09bm9kZSkgcG9zaXRpb25PZlRoZUNoaWxkPWk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvc2l0aW9uT2ZUaGVDaGlsZD09LTEpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNeSBpbmRleCBub3QgZm91bmQhISEgIitub2RlKTsKKyAgICAgICAgaW50IHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID0gLTE7CisgICAgICAgIGZvciAoaW50IGk9cG9zaXRpb25PZlRoZUNoaWxkLTE7aT49MCAmJiBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZD09LTE7aS0tKXsKKyAgICAgICAgICAgIGlmICghKGV2ZXJ5dGhpbmcuZ2V0KGkpIGluc3RhbmNlb2YgQ29tbWVudCkpIHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID0gaTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPXBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkKzE7aTxwb3NpdGlvbk9mVGhlQ2hpbGQ7aSsrKXsKKyAgICAgICAgICAgIE5vZGUgbm9kZVRvUHJpbnQgPSBldmVyeXRoaW5nLmdldChpKTsKKyAgICAgICAgICAgIGlmICghKG5vZGVUb1ByaW50IGluc3RhbmNlb2YgQ29tbWVudCkpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBjb21tZW50LCBpbnN0ZWFkICIrbm9kZVRvUHJpbnQuZ2V0Q2xhc3MoKSsiLiBQb3NpdGlvbiBvZiBwcmV2aW91cyBjaGlsZDogIitwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCsiLCBwb3NpdGlvbiBvZiBjaGlsZCAiK3Bvc2l0aW9uT2ZUaGVDaGlsZCk7CisgICAgICAgICAgICBub2RlVG9QcmludC5hY2NlcHQodGhpcyxudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcoZmluYWwgTm9kZSBub2RlKXsKKyAgICAgICAgTGlzdDxOb2RlPiBldmVyeXRoaW5nID0gbmV3IExpbmtlZExpc3Q8Tm9kZT4oKTsKKyAgICAgICAgZXZlcnl0aGluZy5hZGRBbGwobm9kZS5nZXRDaGlsZHJlbk5vZGVzKCkpOworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKGV2ZXJ5dGhpbmcpOworICAgICAgICBpZiAoZXZlcnl0aGluZy5zaXplKCk9PTApIHJldHVybjsKKworICAgICAgICBpbnQgY29tbWVudHNBdEVuZCA9IDA7CisgICAgICAgIGJvb2xlYW4gZmluZGluZ0NvbW1lbnRzID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKGZpbmRpbmdDb21tZW50cyYmY29tbWVudHNBdEVuZDxldmVyeXRoaW5nLnNpemUoKSl7CisgICAgICAgICAgICBOb2RlIGxhc3QgPSBldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKS0xLWNvbW1lbnRzQXRFbmQpOworICAgICAgICAgICAgZmluZGluZ0NvbW1lbnRzID0gKGxhc3QgaW5zdGFuY2VvZiBDb21tZW50KTsKKyAgICAgICAgICAgIGlmIChmaW5kaW5nQ29tbWVudHMpIGNvbW1lbnRzQXRFbmQrKzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7aTxjb21tZW50c0F0RW5kO2krKyl7CisgICAgICAgICAgICBldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKS1jb21tZW50c0F0RW5kK2kpLmFjY2VwdCh0aGlzLG51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0VxdWFsc1Zpc2l0b3IuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9FcXVhbHNWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0YTc4NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9FcXVhbHNWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxNDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJhc2VQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlNZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcklkOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Bc3NlcnRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJyZWFrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ2F0Y2hDbGF1c2U7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNvbnRpbnVlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRG9TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FbXB0eVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvclN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkZvcmVhY2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5JZlN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkxhYmVsZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgRXF1YWxzVmlzaXRvciBpbXBsZW1lbnRzIEdlbmVyaWNWaXNpdG9yPEJvb2xlYW4sIE5vZGU+IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEVxdWFsc1Zpc2l0b3IgU0lOR0xFVE9OID0gbmV3IEVxdWFsc1Zpc2l0b3IoKTsKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgTm9kZSBuMSwgZmluYWwgTm9kZSBuMikgeworCQlyZXR1cm4gU0lOR0xFVE9OLm5vZGVFcXVhbHMobjEsIG4yKTsKKwl9CisKKwlwcml2YXRlIEVxdWFsc1Zpc2l0b3IoKSB7CisJCS8vIGhpZGUgY29uc3RydWN0b3IKKwl9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBmb3IgZXF1YWxpdHkgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBlYWNoIGtpbmQgb2Ygbm9kZSwKKyAgICAgKiB0byBub3QgcmVwZWF0IGl0IGluIGV2ZXJ5IG1ldGhvZCB3ZSBzdG9yZSB0aGF0IGhlcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbW1vbk5vZGVFcXVhbGl0eShOb2RlIG4xLCBOb2RlIG4yKSB7CisgICAgICAgIGlmICghbm9kZUVxdWFscyhuMS5nZXRDb21tZW50KCksIG4yLmdldENvbW1lbnQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW5vZGVzRXF1YWxzKG4xLmdldE9ycGhhbkNvbW1lbnRzKCksIG4yLmdldE9ycGhhbkNvbW1lbnRzKCkpKXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKwlwcml2YXRlIDxUIGV4dGVuZHMgTm9kZT4gYm9vbGVhbiBub2Rlc0VxdWFscyhmaW5hbCBMaXN0PFQ+IG5vZGVzMSwgZmluYWwgTGlzdDxUPiBub2RlczIpIHsKKwkJaWYgKG5vZGVzMSA9PSBudWxsKSB7CisJCQlpZiAobm9kZXMyID09IG51bGwpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmIChub2RlczIgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChub2RlczEuc2l6ZSgpICE9IG5vZGVzMi5zaXplKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzMS5zaXplKCk7IGkrKykgeworCQkJaWYgKCFub2RlRXF1YWxzKG5vZGVzMS5nZXQoaSksIG5vZGVzMi5nZXQoaSkpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgPFQgZXh0ZW5kcyBOb2RlPiBib29sZWFuIG5vZGVFcXVhbHMoZmluYWwgVCBuMSwgZmluYWwgVCBuMikgeworCQlpZiAobjEgPT0gbjIpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChuMSA9PSBudWxsKSB7CisJCQlpZiAobjIgPT0gbnVsbCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKG4yID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAobjEuZ2V0Q2xhc3MoKSAhPSBuMi5nZXRDbGFzcygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKyAgICAgICAgaWYgKCFjb21tb25Ob2RlRXF1YWxpdHkobjEsIG4yKSl7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwkJcmV0dXJuIG4xLmFjY2VwdCh0aGlzLCBuMikuYm9vbGVhblZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIG9iakVxdWFscyhmaW5hbCBPYmplY3QgbjEsIGZpbmFsIE9iamVjdCBuMikgeworCQlpZiAobjEgPT0gbjIpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChuMSA9PSBudWxsKSB7CisJCQlpZiAobjIgPT0gbnVsbCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKG4yID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gbjEuZXF1YWxzKG4yKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDb21waWxhdGlvblVuaXQgbjIgPSAoQ29tcGlsYXRpb25Vbml0KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFBhY2thZ2UoKSwgbjIuZ2V0UGFja2FnZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEltcG9ydHMoKSwgbjIuZ2V0SW1wb3J0cygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVzKCksIG4yLmdldFR5cGVzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0Q29tbWVudHMoKSwgbjIuZ2V0Q29tbWVudHMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbjIgPSAoUGFja2FnZURlY2xhcmF0aW9uKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuMiA9IChJbXBvcnREZWNsYXJhdGlvbikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgVHlwZVBhcmFtZXRlciBuMiA9IChUeXBlUGFyYW1ldGVyKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUJvdW5kKCksIG4yLmdldFR5cGVCb3VuZCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIExpbmVDb21tZW50IG4yID0gKExpbmVDb21tZW50KSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0Q29udGVudCgpLCBuMi5nZXRDb250ZW50KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisgICAgICAgIGlmICghb2JqRXF1YWxzKG4xLmdldEJlZ2luTGluZSgpLCBuMi5nZXRCZWdpbkxpbmUoKSkpIHsKKyAgICAgIAkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQmxvY2tDb21tZW50IG4yID0gKEJsb2NrQ29tbWVudCkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldENvbnRlbnQoKSwgbjIuZ2V0Q29udGVudCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworICAgICAgICBpZiAoIW9iakVxdWFscyhuMS5nZXRCZWdpbkxpbmUoKSwgbjIuZ2V0QmVnaW5MaW5lKCkpKSB7CisgICAgICAJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICAgIAl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbjIgPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBhcmc7CisKKwkJLy8gamF2YWRvYyBhcmUgY2hlY2tlZCBhdCBDb21waWxhdGlvblVuaXQKKworCQlpZiAobjEuZ2V0TW9kaWZpZXJzKCkgIT0gbjIuZ2V0TW9kaWZpZXJzKCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKG4xLmlzSW50ZXJmYWNlKCkgIT0gbjIuaXNJbnRlcmZhY2UoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVQYXJhbWV0ZXJzKCksIG4yLmdldFR5cGVQYXJhbWV0ZXJzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0RXh0ZW5kcygpLCBuMi5nZXRFeHRlbmRzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0SW1wbGVtZW50cygpLCBuMi5nZXRJbXBsZW1lbnRzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEVudW1EZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRW51bURlY2xhcmF0aW9uIG4yID0gKEVudW1EZWNsYXJhdGlvbikgYXJnOworCisJCS8vIGphdmFkb2MgYXJlIGNoZWNrZWQgYXQgQ29tcGlsYXRpb25Vbml0CisKKwkJaWYgKG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0SW1wbGVtZW50cygpLCBuMi5nZXRJbXBsZW1lbnRzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0RW50cmllcygpLCBuMi5nZXRFbnRyaWVzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0TWVtYmVycygpLCBuMi5nZXRNZW1iZXJzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEVtcHR5VHlwZURlY2xhcmF0aW9uIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbjIgPSAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0Q2xhc3NCb2R5KCksIG4yLmdldENsYXNzQm9keSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuMiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisJCWlmIChuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldE1lbWJlcnMoKSwgbjIuZ2V0TWVtYmVycygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuMiA9IChBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisJCWlmIChuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RGVmYXVsdFZhbHVlKCksIG4yLmdldERlZmF1bHRWYWx1ZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbjIgPSAoRmllbGREZWNsYXJhdGlvbikgYXJnOworCisJCS8vIGphdmFkb2MgYXJlIGNoZWNrZWQgYXQgQ29tcGlsYXRpb25Vbml0CisKKwkJaWYgKG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFZhcmlhYmxlcygpLCBuMi5nZXRWYXJpYWJsZXMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbjIgPSAoVmFyaWFibGVEZWNsYXJhdG9yKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldElkKCksIG4yLmdldElkKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRJbml0KCksIG4yLmdldEluaXQoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9ySWQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIG4yID0gKFZhcmlhYmxlRGVjbGFyYXRvcklkKSBhcmc7CisKKwkJaWYgKG4xLmdldEFycmF5Q291bnQoKSAhPSBuMi5nZXRBcnJheUNvdW50KCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbjIgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgYXJnOworCisJCS8vIGphdmFkb2MgYXJlIGNoZWNrZWQgYXQgQ29tcGlsYXRpb25Vbml0CisKKwkJaWYgKG4xLmdldE1vZGlmaWVycygpICE9IG4yLmdldE1vZGlmaWVycygpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCbG9jaygpLCBuMi5nZXRCbG9jaygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFBhcmFtZXRlcnMoKSwgbjIuZ2V0UGFyYW1ldGVycygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFRocm93cygpLCBuMi5nZXRUaHJvd3MoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUeXBlUGFyYW1ldGVycygpLCBuMi5nZXRUeXBlUGFyYW1ldGVycygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbjIgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFyZzsKKworCQkvLyBqYXZhZG9jIGFyZSBjaGVja2VkIGF0IENvbXBpbGF0aW9uVW5pdAorCisJCWlmIChuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAobjEuZ2V0QXJyYXlDb3VudCgpICE9IG4yLmdldEFycmF5Q291bnQoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRQYXJhbWV0ZXJzKCksIG4yLmdldFBhcmFtZXRlcnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUaHJvd3MoKSwgbjIuZ2V0VGhyb3dzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCWlmKG4xLmlzRGVmYXVsdCgpICE9IG4yLmlzRGVmYXVsdCgpKXsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCQorCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBQYXJhbWV0ZXIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFBhcmFtZXRlciBuMiA9IChQYXJhbWV0ZXIpIGFyZzsKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIHZpc2l0KChCYXNlUGFyYW1ldGVyKSBuMSwgYXJnKTsKKwl9CisJCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KE11bHRpVHlwZVBhcmFtZXRlciBuMSwgTm9kZSBhcmcpIHsKKwkJTXVsdGlUeXBlUGFyYW1ldGVyIG4yID0gKE11bHRpVHlwZVBhcmFtZXRlcikgYXJnOworCQlpZiAobjEuZ2V0VHlwZXMoKS5zaXplKCkgIT0gbjIuZ2V0VHlwZXMoKS5zaXplKCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCUl0ZXJhdG9yPFR5cGU+IG4xdHlwZXMgPSBuMS5nZXRUeXBlcygpLml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yPFR5cGU+IG4ydHlwZXMgPSBuMi5nZXRUeXBlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChuMXR5cGVzLmhhc05leHQoKSAmJiBuMnR5cGVzLmhhc05leHQoKSkgeworCQkJaWYgKCFub2RlRXF1YWxzKG4xdHlwZXMubmV4dCgpLCBuMnR5cGVzLm5leHQoKSkpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmlzaXQoKEJhc2VQYXJhbWV0ZXIpIG4xLCBhcmcpOworCX0KKworCXByb3RlY3RlZCBCb29sZWFuIHZpc2l0KGZpbmFsIEJhc2VQYXJhbWV0ZXIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEJhc2VQYXJhbWV0ZXIgbjIgPSAoQmFzZVBhcmFtZXRlcikgYXJnOworCisJCWlmIChuMS5nZXRNb2RpZmllcnMoKSAhPSBuMi5nZXRNb2RpZmllcnMoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0SWQoKSwgbjIuZ2V0SWQoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKwkKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuMiA9IChJbml0aWFsaXplckRlY2xhcmF0aW9uKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEJsb2NrKCksIG4yLmdldEJsb2NrKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEphdmFkb2NDb21tZW50IG4yID0gKEphdmFkb2NDb21tZW50KSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0Q29udGVudCgpLCBuMi5nZXRDb250ZW50KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuMiA9IChDbGFzc09ySW50ZXJmYWNlVHlwZSkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJncygpLCBuMi5nZXRUeXBlQXJncygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUHJpbWl0aXZlVHlwZSBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgUHJpbWl0aXZlVHlwZSBuMiA9IChQcmltaXRpdmVUeXBlKSBhcmc7CisKKwkJaWYgKG4xLmdldFR5cGUoKSAhPSBuMi5nZXRUeXBlKCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFJlZmVyZW5jZVR5cGUgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFJlZmVyZW5jZVR5cGUgbjIgPSAoUmVmZXJlbmNlVHlwZSkgYXJnOworCisJCWlmIChuMS5nZXRBcnJheUNvdW50KCkgIT0gbjIuZ2V0QXJyYXlDb3VudCgpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFubm90YXRpb25zKCksIG4yLmdldEFubm90YXRpb25zKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCQlMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBuMWEgPSBuMS5nZXRBcnJheXNBbm5vdGF0aW9ucygpOworCQlMaXN0PExpc3Q8QW5ub3RhdGlvbkV4cHI+PiBuMmEgPSBuMi5nZXRBcnJheXNBbm5vdGF0aW9ucygpOworCisJCWlmIChuMWEgIT1udWxsICYmIG4yYSE9IG51bGwpIHsKKwkJCWlmKG4xYS5zaXplKCkgIT0gbjJhLnNpemUoKSl7CisJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQl9CisJCQllbHNleworCQkJCWludCBpID0gMDsKKwkJCQlmb3IoTGlzdDxBbm5vdGF0aW9uRXhwcj4gYXV4OiBuMWEpeworCQkJCQlpZighbm9kZXNFcXVhbHMoYXV4LCBuMmEuZ2V0KGkpKSl7CisJCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQkJfQorCQkJCQlpKys7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYgKG4xYSAhPSBuMmEpeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiB2aXNpdChWb2lkVHlwZSBuMSwgTm9kZSBhcmcpIHsKKwkJVm9pZFR5cGUgbjIgPSAoVm9pZFR5cGUpIGFyZzsKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBXaWxkY2FyZFR5cGUgbjIgPSAoV2lsZGNhcmRUeXBlKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEV4dGVuZHMoKSwgbjIuZ2V0RXh0ZW5kcygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0U3VwZXIoKSwgbjIuZ2V0U3VwZXIoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QW5ub3RhdGlvbnMoKSwgbjIuZ2V0QW5ub3RhdGlvbnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBXaWxkY2FyZFR5cGUgbjIgPSAoV2lsZGNhcmRUeXBlKSBhcmc7CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbjIgPSAoQXJyYXlBY2Nlc3NFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0SW5kZXgoKSwgbjIuZ2V0SW5kZXgoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4yID0gKEFycmF5Q3JlYXRpb25FeHByKSBhcmc7CisKKwkJaWYgKG4xLmdldEFycmF5Q291bnQoKSAhPSBuMi5nZXRBcnJheUNvdW50KCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0SW5pdGlhbGl6ZXIoKSwgbjIuZ2V0SW5pdGlhbGl6ZXIoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXREaW1lbnNpb25zKCksIG4yLmdldERpbWVuc2lvbnMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisJCUxpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IG4xYSA9IG4xLmdldEFycmF5c0Fubm90YXRpb25zKCk7CisJCUxpc3Q8TGlzdDxBbm5vdGF0aW9uRXhwcj4+IG4yYSA9IG4yLmdldEFycmF5c0Fubm90YXRpb25zKCk7CisKKwkJaWYgKG4xYSAhPW51bGwgJiYgbjJhIT0gbnVsbCkgeworCQkJaWYobjFhLnNpemUoKSAhPSBuMmEuc2l6ZSgpKXsKKwkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCX0KKwkJCWVsc2V7CisJCQkJaW50IGkgPSAwOworCQkJCWZvcihMaXN0PEFubm90YXRpb25FeHByPiBhdXg6IG4xYSl7CisJCQkJCWlmKCFub2Rlc0VxdWFscyhhdXgsIG4yYS5nZXQoaSkpKXsKKwkJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQkJCQl9CisJCQkJCWkrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAobjFhICE9IG4yYSl7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbjIgPSAoQXJyYXlJbml0aWFsaXplckV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFZhbHVlcygpLCBuMi5nZXRWYWx1ZXMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQXNzaWduRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQXNzaWduRXhwciBuMiA9IChBc3NpZ25FeHByKSBhcmc7CisKKwkJaWYgKG4xLmdldE9wZXJhdG9yKCkgIT0gbjIuZ2V0T3BlcmF0b3IoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VGFyZ2V0KCksIG4yLmdldFRhcmdldCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQmluYXJ5RXhwciBuMiA9IChCaW5hcnlFeHByKSBhcmc7CisKKwkJaWYgKG4xLmdldE9wZXJhdG9yKCkgIT0gbjIuZ2V0T3BlcmF0b3IoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0TGVmdCgpLCBuMi5nZXRMZWZ0KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRSaWdodCgpLCBuMi5nZXRSaWdodCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDYXN0RXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQ2FzdEV4cHIgbjIgPSAoQ2FzdEV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDbGFzc0V4cHIgbjIgPSAoQ2xhc3NFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFR5cGUoKSwgbjIuZ2V0VHlwZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIENvbmRpdGlvbmFsRXhwciBuMiA9IChDb25kaXRpb25hbEV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VGhlbkV4cHIoKSwgbjIuZ2V0VGhlbkV4cHIoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEVsc2VFeHByKCksIG4yLmdldEVsc2VFeHByKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRW5jbG9zZWRFeHByIG4yID0gKEVuY2xvc2VkRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRJbm5lcigpLCBuMi5nZXRJbm5lcigpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEZpZWxkQWNjZXNzRXhwciBuMiA9IChGaWVsZEFjY2Vzc0V4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0RmllbGQoKSwgbjIuZ2V0RmllbGQoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJncygpLCBuMi5nZXRUeXBlQXJncygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgSW5zdGFuY2VPZkV4cHIgbjIgPSAoSW5zdGFuY2VPZkV4cHIpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4yID0gKFN0cmluZ0xpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbjIgPSAoSW50ZWdlckxpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbjIgPSAoTG9uZ0xpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxNaW5WYWx1ZUV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIG4yID0gKEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTG9uZ0xpdGVyYWxNaW5WYWx1ZUV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4yID0gKExvbmdMaXRlcmFsTWluVmFsdWVFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbjIgPSAoQ2hhckxpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRG91YmxlTGl0ZXJhbEV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4yID0gKERvdWJsZUxpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbjIgPSAoQm9vbGVhbkxpdGVyYWxFeHByKSBhcmc7CisKKwkJaWYgKG4xLmdldFZhbHVlKCkgIT0gbjIuZ2V0VmFsdWUoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBOdWxsTGl0ZXJhbEV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBNZXRob2RDYWxsRXhwciBuMiA9IChNZXRob2RDYWxsRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRTY29wZSgpLCBuMi5nZXRTY29wZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBcmdzKCksIG4yLmdldEFyZ3MoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRUeXBlQXJncygpLCBuMi5nZXRUeXBlQXJncygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBOYW1lRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgTmFtZUV4cHIgbjIgPSAoTmFtZUV4cHIpIGFyZzsKKworCQlpZiAoIW9iakVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbjIgPSAoT2JqZWN0Q3JlYXRpb25FeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFNjb3BlKCksIG4yLmdldFNjb3BlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSwgbjIuZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0QXJncygpLCBuMi5nZXRBcmdzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZUFyZ3MoKSwgbjIuZ2V0VHlwZUFyZ3MoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgUXVhbGlmaWVkTmFtZUV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFF1YWxpZmllZE5hbWVFeHByIG4yID0gKFF1YWxpZmllZE5hbWVFeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFF1YWxpZmllcigpLCBuMi5nZXRRdWFsaWZpZXIoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFvYmpFcXVhbHMobjEuZ2V0TmFtZSgpLCBuMi5nZXROYW1lKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBUaGlzRXhwciBuMiA9IChUaGlzRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDbGFzc0V4cHIoKSwgbjIuZ2V0Q2xhc3NFeHByKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgU3VwZXJFeHByIG4yID0gKFN1cGVyRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDbGFzc0V4cHIoKSwgbjIuZ2V0Q2xhc3NFeHByKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgVW5hcnlFeHByIG4yID0gKFVuYXJ5RXhwcikgYXJnOworCisJCWlmIChuMS5nZXRPcGVyYXRvcigpICE9IG4yLmdldE9wZXJhdG9yKCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbjIgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIpIGFyZzsKKworCQlpZiAobjEuZ2V0TW9kaWZpZXJzKCkgIT0gbjIuZ2V0TW9kaWZpZXJzKCkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRBbm5vdGF0aW9ucygpLCBuMi5nZXRBbm5vdGF0aW9ucygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHlwZSgpLCBuMi5nZXRUeXBlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0VmFycygpLCBuMi5nZXRWYXJzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuMiA9IChNYXJrZXJBbm5vdGF0aW9uRXhwcikgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXROYW1lKCksIG4yLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4yID0gKFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0TWVtYmVyVmFsdWUoKSwgbjIuZ2V0TWVtYmVyVmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4yID0gKE5vcm1hbEFubm90YXRpb25FeHByKSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFBhaXJzKCksIG4yLmdldFBhaXJzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4yID0gKE1lbWJlclZhbHVlUGFpcikgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldE5hbWUoKSwgbjIuZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VmFsdWUoKSwgbjIuZ2V0VmFsdWUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbjIgPSAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldEFyZ3MoKSwgbjIuZ2V0QXJncygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFR5cGVBcmdzKCksIG4yLmdldFR5cGVBcmdzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbjIgPSAoVHlwZURlY2xhcmF0aW9uU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRUeXBlRGVjbGFyYXRpb24oKSwgbjIuZ2V0VHlwZURlY2xhcmF0aW9uKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEFzc2VydFN0bXQgbjIgPSAoQXNzZXJ0U3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDaGVjaygpLCBuMi5nZXRDaGVjaygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0TWVzc2FnZSgpLCBuMi5nZXRNZXNzYWdlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJsb2NrU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQmxvY2tTdG10IG4yID0gKEJsb2NrU3RtdCkgYXJnOworCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0U3RtdHMoKSwgbjIuZ2V0U3RtdHMoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIExhYmVsZWRTdG10IG4yID0gKExhYmVsZWRTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFN0bXQoKSwgbjIuZ2V0U3RtdCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBFeHByZXNzaW9uU3RtdCBuMiA9IChFeHByZXNzaW9uU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeHByZXNzaW9uKCksIG4yLmdldEV4cHJlc3Npb24oKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgU3dpdGNoU3RtdCBuMiA9IChTd2l0Y2hTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFNlbGVjdG9yKCksIG4yLmdldFNlbGVjdG9yKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0RW50cmllcygpLCBuMi5nZXRFbnRyaWVzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgU3dpdGNoRW50cnlTdG10IG4yID0gKFN3aXRjaEVudHJ5U3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRMYWJlbCgpLCBuMi5nZXRMYWJlbCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVzRXF1YWxzKG4xLmdldFN0bXRzKCksIG4yLmdldFN0bXRzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQnJlYWtTdG10IG4yID0gKEJyZWFrU3RtdCkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldElkKCksIG4yLmdldElkKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFJldHVyblN0bXQgbjIgPSAoUmV0dXJuU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeHByKCksIG4yLmdldEV4cHIoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgSWZTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBJZlN0bXQgbjIgPSAoSWZTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldENvbmRpdGlvbigpLCBuMi5nZXRDb25kaXRpb24oKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFRoZW5TdG10KCksIG4yLmdldFRoZW5TdG10KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFbHNlU3RtdCgpLCBuMi5nZXRFbHNlU3RtdCgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIFdoaWxlU3RtdCBuMiA9IChXaGlsZVN0bXQpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Q29uZGl0aW9uKCksIG4yLmdldENvbmRpdGlvbigpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgQ29udGludWVTdG10IG4yID0gKENvbnRpbnVlU3RtdCkgYXJnOworCisJCWlmICghb2JqRXF1YWxzKG4xLmdldElkKCksIG4yLmdldElkKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIERvU3RtdCBuMSwgZmluYWwgTm9kZSBhcmcpIHsKKwkJZmluYWwgRG9TdG10IG4yID0gKERvU3RtdCkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldENvbmRpdGlvbigpLCBuMi5nZXRDb25kaXRpb24oKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEZvcmVhY2hTdG10IG4yID0gKEZvcmVhY2hTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldFZhcmlhYmxlKCksIG4yLmdldFZhcmlhYmxlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRJdGVyYWJsZSgpLCBuMi5nZXRJdGVyYWJsZSgpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIEZvclN0bXQgbjEsIGZpbmFsIE5vZGUgYXJnKSB7CisJCWZpbmFsIEZvclN0bXQgbjIgPSAoRm9yU3RtdCkgYXJnOworCisJCWlmICghbm9kZXNFcXVhbHMobjEuZ2V0SW5pdCgpLCBuMi5nZXRJbml0KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDb21wYXJlKCksIG4yLmdldENvbXBhcmUoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRVcGRhdGUoKSwgbjIuZ2V0VXBkYXRlKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCb2R5KCksIG4yLmdldEJvZHkoKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIEJvb2xlYW4gdmlzaXQoZmluYWwgVGhyb3dTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBUaHJvd1N0bXQgbjIgPSAoVGhyb3dTdG10KSBhcmc7CisKKwkJaWYgKCFub2RlRXF1YWxzKG4xLmdldEV4cHIoKSwgbjIuZ2V0RXhwcigpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4yID0gKFN5bmNocm9uaXplZFN0bXQpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0RXhwcigpLCBuMi5nZXRFeHByKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRCbG9jaygpLCBuMi5nZXRCbG9jaygpKSkgeworCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgQm9vbGVhbiB2aXNpdChmaW5hbCBUcnlTdG10IG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBUcnlTdG10IG4yID0gKFRyeVN0bXQpIGFyZzsKKworCQlpZiAoIW5vZGVFcXVhbHMobjEuZ2V0VHJ5QmxvY2soKSwgbjIuZ2V0VHJ5QmxvY2soKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRDYXRjaHMoKSwgbjIuZ2V0Q2F0Y2hzKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRGaW5hbGx5QmxvY2soKSwgbjIuZ2V0RmluYWxseUJsb2NrKCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCXJldHVybiBCb29sZWFuLlRSVUU7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBCb29sZWFuIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4xLCBmaW5hbCBOb2RlIGFyZykgeworCQlmaW5hbCBDYXRjaENsYXVzZSBuMiA9IChDYXRjaENsYXVzZSkgYXJnOworCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRFeGNlcHQoKSwgbjIuZ2V0RXhjZXB0KCkpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCisJCWlmICghbm9kZUVxdWFscyhuMS5nZXRDYXRjaEJsb2NrKCksIG4yLmdldENhdGNoQmxvY2soKSkpIHsKKwkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQl9CisKKwkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChMYW1iZGFFeHByIG4xLCBOb2RlIGFyZykgeworICAgICAgICBMYW1iZGFFeHByIG4yID0gKExhbWJkYUV4cHIpIGFyZzsKKyAgICAgICAgaWYgKCFub2Rlc0VxdWFscyhuMS5nZXRQYXJhbWV0ZXJzKCksIG4yLmdldFBhcmFtZXRlcnMoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmKG4xLmlzUGFyYW1ldGVyc0VuY2xvc2VkKCkgIT0gbjIuaXNQYXJhbWV0ZXJzRW5jbG9zZWQoKSl7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW5vZGVFcXVhbHMobjEuZ2V0Qm9keSgpLCBuMi5nZXRCb2R5KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCb29sZWFuIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbjEsIE5vZGUgYXJnKSB7CisgICAgICAgIE1ldGhvZFJlZmVyZW5jZUV4cHIgbjIgPSAoTWV0aG9kUmVmZXJlbmNlRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobjEuZ2V0U2NvcGUoKSwgbjIuZ2V0U2NvcGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICghbm9kZXNFcXVhbHMobjEuZ2V0VHlwZVBhcmFtZXRlcnMoKSwgbjIuZ2V0VHlwZVBhcmFtZXRlcnMoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICghb2JqRXF1YWxzKG4xLmdldElkZW50aWZpZXIoKSwgbjIuZ2V0SWRlbnRpZmllcigpKSkgeworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQm9vbGVhbiB2aXNpdChUeXBlRXhwciBuLCBOb2RlIGFyZykgeworICAgICAgICBUeXBlRXhwciBuMiA9IChUeXBlRXhwcikgYXJnOworICAgICAgICBpZiAoIW5vZGVFcXVhbHMobi5nZXRUeXBlKCksIG4yLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvR2VuZXJpY1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZiZjZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE1IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqIAorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisgCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuQmxvY2tDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5TWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVtcHR5VHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Jbml0aWFsaXplckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NdWx0aVR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRW1wdHlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKKworLyoqCisgKiBBIHZpc2l0b3IgdGhhdCBoYXMgYSByZXR1cm4gdmFsdWUuCisgKiAKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyaWNWaXNpdG9yPFIsIEE+IHsKKworCS8vLSBDb21waWxhdGlvbiBVbml0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXB1YmxpYyBSIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoSW1wb3J0RGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoVHlwZVBhcmFtZXRlciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChMaW5lQ29tbWVudCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChCbG9ja0NvbW1lbnQgbiwgQSBhcmcpOworCisJLy8tIEJvZHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcHVibGljIFIgdmlzaXQoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEVudW1EZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChFbXB0eVR5cGVEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9yIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRvcklkIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoUGFyYW1ldGVyIG4sIEEgYXJnKTsKKwkKKwlwdWJsaWMgUiB2aXNpdChNdWx0aVR5cGVQYXJhbWV0ZXIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEphdmFkb2NDb21tZW50IG4sIEEgYXJnKTsKKworCS8vLSBUeXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXB1YmxpYyBSIHZpc2l0KENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFByaW1pdGl2ZVR5cGUgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoUmVmZXJlbmNlVHlwZSBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChWb2lkVHlwZSBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChXaWxkY2FyZFR5cGUgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoVW5rbm93blR5cGUgbiwgQSBhcmcpOworCisJLy8tIEV4cHJlc3Npb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcHVibGljIFIgdmlzaXQoQXJyYXlBY2Nlc3NFeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEFycmF5Q3JlYXRpb25FeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEFzc2lnbkV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQmluYXJ5RXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChDYXN0RXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChDbGFzc0V4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQ29uZGl0aW9uYWxFeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEVuY2xvc2VkRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChGaWVsZEFjY2Vzc0V4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoSW5zdGFuY2VPZkV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoU3RyaW5nTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoSW50ZWdlckxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KExvbmdMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChMb25nTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChDaGFyTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoRG91YmxlTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQm9vbGVhbkxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KE51bGxMaXRlcmFsRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChNZXRob2RDYWxsRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChOYW1lRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChPYmplY3RDcmVhdGlvbkV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoUXVhbGlmaWVkTmFtZUV4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoVGhpc0V4cHIgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoU3VwZXJFeHByIG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFVuYXJ5RXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbiwgQSBhcmcpOworCisJLy8tIFN0YXRlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcHVibGljIFIgdmlzaXQoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFR5cGVEZWNsYXJhdGlvblN0bXQgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQXNzZXJ0U3RtdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChCbG9ja1N0bXQgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoTGFiZWxlZFN0bXQgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoRW1wdHlTdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEV4cHJlc3Npb25TdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFN3aXRjaFN0bXQgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoU3dpdGNoRW50cnlTdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KEJyZWFrU3RtdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChSZXR1cm5TdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KElmU3RtdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChXaGlsZVN0bXQgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQ29udGludWVTdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KERvU3RtdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChGb3JlYWNoU3RtdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChGb3JTdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFRocm93U3RtdCBuLCBBIGFyZyk7CisKKwlwdWJsaWMgUiB2aXNpdChTeW5jaHJvbml6ZWRTdG10IG4sIEEgYXJnKTsKKworCXB1YmxpYyBSIHZpc2l0KFRyeVN0bXQgbiwgQSBhcmcpOworCisJcHVibGljIFIgdmlzaXQoQ2F0Y2hDbGF1c2UgbiwgQSBhcmcpOworCisgICAgcHVibGljIFIgdmlzaXQoTGFtYmRhRXhwciBuLCBBIGFyZyk7CisKKyAgICBwdWJsaWMgUiB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIEEgYXJnKTsKKworICAgIHB1YmxpYyBSIHZpc2l0KFR5cGVFeHByIG4sIEEgYXJnKTsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljVmlzaXRvckFkYXB0ZXIuamF2YSBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9HZW5lcmljVmlzaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM5Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL0dlbmVyaWNWaXNpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTYxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQXNzZXJ0U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CcmVha1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkNhdGNoQ2xhdXNlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Db250aW51ZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkRvU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRW1wdHlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Gb3JlYWNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuSWZTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5MYWJlbGVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuUmV0dXJuU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hFbnRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN5bmNocm9uaXplZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRocm93U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVHlwZURlY2xhcmF0aW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuV2hpbGVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS4qOworCisvKioKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1Zpc2l0b3JBZGFwdGVyPFIsIEE+IGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8UiwgQT4geworCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgOiBuLmdldE1lbWJlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXJyYXlBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXREaW1lbnNpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGRpbSA6IG4uZ2V0RGltZW5zaW9ucygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGRpbS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRJbml0aWFsaXplcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRWYWx1ZXMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZXhwciA6IG4uZ2V0VmFsdWVzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gZXhwci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0U3RtdHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFN0YXRlbWVudCBzIDogbi5nZXRTdG10cygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEV4Y2VwdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Q2F0Y2hCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlUGFyYW1ldGVyIHQgOiBuLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEV4dGVuZHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldEV4dGVuZHMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBjLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobi5nZXRJbXBsZW1lbnRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjIDogbi5nZXRJbXBsZW1lbnRzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgOiBuLmdldE1lbWJlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZUFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGUgdCA6IG4uZ2V0VHlwZUFyZ3MoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSB0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFBhY2thZ2UoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldFBhY2thZ2UoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0SW1wb3J0cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gaSA6IG4uZ2V0SW1wb3J0cygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUeXBlcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IG4uZ2V0VHlwZXMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSB0eXBlRGVjbGFyYXRpb24uYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA6IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSB0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0UGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgUGFyYW1ldGVyIHAgOiBuLmdldFBhcmFtZXRlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VGhyb3dzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBOYW1lRXhwciBuYW1lIDogbi5nZXRUaHJvd3MoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIENvbnRpbnVlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBEb1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbXB0eU1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRW1wdHlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEVtcHR5VHlwZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgRW5jbG9zZWRFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRJbm5lcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Q2xhc3NCb2R5KCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyIDogbi5nZXRDbGFzc0JvZHkoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0SW1wbGVtZW50cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA6IG4uZ2V0SW1wbGVtZW50cygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRFbnRyaWVzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlIDogbi5nZXRFbnRyaWVzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgOiBuLmdldE1lbWJlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKCFuLmlzVGhpcygpKSB7CisJCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlIHQgOiBuLmdldFR5cGVBcmdzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJZm9yIChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyIDogbi5nZXRWYXJpYWJsZXMoKSkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gdmFyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VmFyaWFibGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SW5pdCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRXhwcmVzc2lvbiBlIDogbi5nZXRJbml0KCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldENvbXBhcmUoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VXBkYXRlKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldFVwZGF0ZSgpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RWxzZVN0bXQoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEVsc2VTdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRTdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFNjb3BlKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUeXBlQXJncygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVHlwZSB0IDogbi5nZXRUeXBlQXJncygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IHQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA6IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSB0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0UGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgUGFyYW1ldGVyIHAgOiBuLmdldFBhcmFtZXRlcnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VGhyb3dzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBOYW1lRXhwciBuYW1lIDogbi5nZXRUaHJvd3MoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Qm9keSgpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRQYWlycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG0gOiBuLmdldFBhaXJzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gbS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlIHQgOiBuLmdldFR5cGVBcmdzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBtZW1iZXIgOiBuLmdldEFub255bW91c0NsYXNzQm9keSgpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IG1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIE11bHRpVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJeworCQkJZm9yIChmaW5hbCBUeXBlIHR5cGUgOiBuLmdldFR5cGVzKCkpIHsKKwkJCQlSIHJlc3VsdCA9IHR5cGUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFF1YWxpZmllZE5hbWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgUmVmZXJlbmNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEV4cHIoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0TGFiZWwoKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldExhYmVsKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFN0bXRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RtdHMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBzLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgU3dpdGNoRW50cnlTdG10IGUgOiBuLmdldEVudHJpZXMoKSkgeworCQkJCXsKKwkJCQkJUiByZXN1bHQgPSBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCWlmIChuLmdldEV4cHIoKSAhPSBudWxsKSB7CisJCQkgICAgUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCSAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkgICAgcmV0dXJuIHJlc3VsdDsKKwkJCSAgICB9CisJCQl9CisJCX0KKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldENsYXNzRXhwcigpICE9IG51bGwpIHsKKwkJCXsKKwkJCQlSIHJlc3VsdCA9IG4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFJlc291cmNlcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdiA6IG4uZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gdi5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRDYXRjaHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENhdGNoQ2xhdXNlIGMgOiBuLmdldENhdGNocygpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobi5nZXRGaW5hbGx5QmxvY2soKSAhPSBudWxsKSB7CisJCQl7CisJCQkJUiByZXN1bHQgPSBuLmdldEZpbmFsbHlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBUeXBlRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUeXBlRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRUeXBlQm91bmQoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldFR5cGVCb3VuZCgpKSB7CisJCQkJeworCQkJCQlSIHJlc3VsdCA9IGMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJeworCQkJUiByZXN1bHQgPSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQl7CisJCQkJCVIgcmVzdWx0ID0gYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIHYgOiBuLmdldFZhcnMoKSkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gdi5hY2NlcHQodGhpcywgYXJnKTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFIgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4sIGZpbmFsIEEgYXJnKSB7CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRJbml0KCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvcklkIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFdoaWxlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl7CisJCQlSIHJlc3VsdCA9IG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXsKKwkJCVIgcmVzdWx0ID0gbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRFeHRlbmRzKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChuLmdldFN1cGVyKCkgIT0gbnVsbCkgeworCQkJeworCQkJCVIgcmVzdWx0ID0gbi5nZXRTdXBlcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUiB2aXNpdChMYW1iZGFFeHByIG4sIEEgYXJnKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgQSBhcmcpeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUiB2aXNpdChUeXBlRXhwciBuLCBBIGFyZyl7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUiB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Nb2RpZmllclZpc2l0b3JBZGFwdGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjNjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsOTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJhc2VQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3JJZDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5QWNjZXNzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5SW5pdGlhbGl6ZXJFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Bc3NpZ25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5CaW5hcnlFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Cb29sZWFuTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DaGFyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ29uZGl0aW9uYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Eb3VibGVMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRW5jbG9zZWRFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkluc3RhbmNlT2ZFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsTWluVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5Mb25nTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkxvbmdMaXRlcmFsTWluVmFsdWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kUmVmZXJlbmNlRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OdWxsTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk9iamVjdENyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuUXVhbGlmaWVkTmFtZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU3VwZXJFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5UaGlzRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVHlwZUV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlVuYXJ5RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgdmlzaXRvciBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIHNhdmUgdGltZSB3aGVuIHNvbWUgc3BlY2lmaWMgbm9kZXMgbmVlZHMKKyAqIHRvIGJlIGNoYW5nZWQuIFRvIGRvIHRoYXQganVzdCBleHRlbmQgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgdGhlIG1ldGhvZHMKKyAqIGZyb20gdGhlIG5vZGVzIHdobyBuZWVkcyB0byBiZSBjaGFuZ2VkLCByZXR1cm5pbmcgdGhlIGNoYW5nZWQgbm9kZS4KKyAqIAorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RpZmllclZpc2l0b3JBZGFwdGVyPEE+IGltcGxlbWVudHMgR2VuZXJpY1Zpc2l0b3I8Tm9kZSwgQT4geworCisJcHJpdmF0ZSB2b2lkIHJlbW92ZU51bGxzKGZpbmFsIExpc3Q8Pz4gbGlzdCkgeworCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKGxpc3QuZ2V0KGkpID09IG51bGwpIHsKKwkJCQlsaXN0LnJlbW92ZShpKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCW4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpOworCQl9CisJCWZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzID0gbi5nZXRNZW1iZXJzKCk7CisJCWlmIChtZW1iZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgeworCQkJCW1lbWJlcnMuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIG1lbWJlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKG1lbWJlcnMpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCW4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpOworCQl9CisJCW4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlpZiAobi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7CisJCQluLnNldERlZmF1bHRWYWx1ZSgoRXhwcmVzc2lvbikgbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldE5hbWUoKEV4cHJlc3Npb24pIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJbi5zZXRJbmRleCgoRXhwcmVzc2lvbikgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEFycmF5Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlpZiAobi5nZXREaW1lbnNpb25zKCkgIT0gbnVsbCkgeworCQkJZmluYWwgTGlzdDxFeHByZXNzaW9uPiBkaW1lbnNpb25zID0gbi5nZXREaW1lbnNpb25zKCk7CisJCQlpZiAoZGltZW5zaW9ucyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJCWRpbWVuc2lvbnMuc2V0KGksIChFeHByZXNzaW9uKSBkaW1lbnNpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQkJfQorCQkJCXJlbW92ZU51bGxzKGRpbWVuc2lvbnMpOworCQkJfQorCQl9IGVsc2UgeworCQkJbi5zZXRJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplckV4cHIpIG4uZ2V0SW5pdGlhbGl6ZXIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFZhbHVlcygpICE9IG51bGwpIHsKKwkJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gdmFsdWVzID0gbi5nZXRWYWx1ZXMoKTsKKwkJCWlmICh2YWx1ZXMgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7CisJCQkJCXZhbHVlcy5zZXQoaSwgKEV4cHJlc3Npb24pIHZhbHVlcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJCX0KKwkJCQlyZW1vdmVOdWxscyh2YWx1ZXMpOworCQkJfQorCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0Q2hlY2soKEV4cHJlc3Npb24pIG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQluLnNldE1lc3NhZ2UoKEV4cHJlc3Npb24pIG4uZ2V0TWVzc2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldFRhcmdldCgoRXhwcmVzc2lvbikgbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0VmFsdWUoKEV4cHJlc3Npb24pIG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0TGVmdCgoRXhwcmVzc2lvbikgbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldFJpZ2h0KChFeHByZXNzaW9uKSBuLmdldFJpZ2h0KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCWZpbmFsIExpc3Q8U3RhdGVtZW50PiBzdG10cyA9IG4uZ2V0U3RtdHMoKTsKKwkJaWYgKHN0bXRzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RtdHMuc2l6ZSgpOyBpKyspIHsKKwkJCQlzdG10cy5zZXQoaSwgKFN0YXRlbWVudCkgc3RtdHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHN0bXRzKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQm9vbGVhbkxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0RXhjZXB0KChNdWx0aVR5cGVQYXJhbWV0ZXIpIG4uZ2V0RXhjZXB0KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldENhdGNoQmxvY2soKEJsb2NrU3RtdCkgbi5nZXRDYXRjaEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5zZXRKYXZhRG9jKChKYXZhZG9jQ29tbWVudCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCWZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpOworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCWFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhhbm5vdGF0aW9ucyk7CisJCX0KKwkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKwkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQl0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlUGFyYW1ldGVycyk7CisJCX0KKwkJZmluYWwgTGlzdDxDbGFzc09ySW50ZXJmYWNlVHlwZT4gZXh0ZW5keiA9IG4uZ2V0RXh0ZW5kcygpOworCQlpZiAoZXh0ZW5keiAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZHouc2l6ZSgpOyBpKyspIHsKKwkJCQlleHRlbmR6LnNldChpLCAoQ2xhc3NPckludGVyZmFjZVR5cGUpIGV4dGVuZHouZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGV4dGVuZHopOworCQl9CisJCWZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IGltcGxlbWVudHogPSBuLmdldEltcGxlbWVudHMoKTsKKwkJaWYgKGltcGxlbWVudHogIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnR6LnNpemUoKTsgaSsrKSB7CisJCQkJaW1wbGVtZW50ei5zZXQoaSwgKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBpbXBsZW1lbnR6LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhpbXBsZW1lbnR6KTsKKwkJfQorCQlmaW5hbCBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gbWVtYmVycyA9IG4uZ2V0TWVtYmVycygpOworCQlpZiAobWVtYmVycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQltZW1iZXJzLnNldChpLCAoQm9keURlY2xhcmF0aW9uKSBtZW1iZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhtZW1iZXJzKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLnNldFNjb3BlKChDbGFzc09ySW50ZXJmYWNlVHlwZSkgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzID0gbi5nZXRUeXBlQXJncygpOworCQlpZiAodHlwZUFyZ3MgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJncy5zaXplKCk7IGkrKykgeworCQkJCXR5cGVBcmdzLnNldChpLCAoVHlwZSkgdHlwZUFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVBcmdzKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFBhY2thZ2UoKSAhPSBudWxsKSB7CisJCQluLnNldFBhY2thZ2UoKFBhY2thZ2VEZWNsYXJhdGlvbikgbi5nZXRQYWNrYWdlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCWZpbmFsIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMgPSBuLmdldEltcG9ydHMoKTsKKwkJaWYgKGltcG9ydHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLnNpemUoKTsgaSsrKSB7CisJCQkJaW1wb3J0cy5zZXQoaSwgKEltcG9ydERlY2xhcmF0aW9uKSBpbXBvcnRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhpbXBvcnRzKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMgPSBuLmdldFR5cGVzKCk7CisJCWlmICh0eXBlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7CisJCQkJdHlwZXMuc2V0KGksIChUeXBlRGVjbGFyYXRpb24pIHR5cGVzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlcyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldENvbmRpdGlvbigoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0VGhlbkV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0VGhlbkV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0RWxzZUV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RWxzZUV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gbi5nZXRUeXBlUGFyYW1ldGVycygpOworCQlpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5zaXplKCk7IGkrKykgeworCQkJCXR5cGVQYXJhbWV0ZXJzLnNldChpLCAoVHlwZVBhcmFtZXRlcikgdHlwZVBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVQYXJhbWV0ZXJzKTsKKwkJfQorCQlmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG4uZ2V0UGFyYW1ldGVycygpOworCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlwYXJhbWV0ZXJzLnNldChpLCAoUGFyYW1ldGVyKSBwYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhwYXJhbWV0ZXJzKTsKKwkJfQorCQlmaW5hbCBMaXN0PE5hbWVFeHByPiB0aHJvd3ogPSBuLmdldFRocm93cygpOworCQlpZiAodGhyb3d6ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyb3d6LnNpemUoKTsgaSsrKSB7CisJCQkJdGhyb3d6LnNldChpLCAoTmFtZUV4cHIpIHRocm93ei5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHModGhyb3d6KTsKKwkJfQorCQluLnNldEJsb2NrKChCbG9ja1N0bXQpIG4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldENvbmRpdGlvbigoRXhwcmVzc2lvbikgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5zZXRKYXZhRG9jKChKYXZhZG9jQ29tbWVudCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEVtcHR5VHlwZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldElubmVyKChFeHByZXNzaW9uKSBuLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCW4uc2V0SmF2YURvYygoSmF2YWRvY0NvbW1lbnQpIG4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucyA9IG4uZ2V0QW5ub3RhdGlvbnMoKTsKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm5vdGF0aW9ucy5zZXQoaSwgKEFubm90YXRpb25FeHByKSBhbm5vdGF0aW9ucy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5ub3RhdGlvbnMpOworCQl9CisJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpOworCQlpZiAoYXJncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCQlhcmdzLnNldChpLCAoRXhwcmVzc2lvbikgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYXJncyk7CisJCX0KKwkJZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGNsYXNzQm9keSA9IG4uZ2V0Q2xhc3NCb2R5KCk7CisJCWlmIChjbGFzc0JvZHkgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0JvZHkuc2l6ZSgpOyBpKyspIHsKKwkJCQljbGFzc0JvZHkuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIGNsYXNzQm9keS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoY2xhc3NCb2R5KTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQlmaW5hbCBMaXN0PENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnR6ID0gbi5nZXRJbXBsZW1lbnRzKCk7CisJCWlmIChpbXBsZW1lbnR6ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wbGVtZW50ei5zaXplKCk7IGkrKykgeworCQkJCWltcGxlbWVudHouc2V0KGksIChDbGFzc09ySW50ZXJmYWNlVHlwZSkgaW1wbGVtZW50ei5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoaW1wbGVtZW50eik7CisJCX0KKwkJZmluYWwgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW50cmllcyA9IG4uZ2V0RW50cmllcygpOworCQlpZiAoZW50cmllcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQllbnRyaWVzLnNldChpLCAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24pIGVudHJpZXMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGVudHJpZXMpOworCQl9CisJCWZpbmFsIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBtZW1iZXJzID0gbi5nZXRNZW1iZXJzKCk7CisJCWlmIChtZW1iZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgeworCQkJCW1lbWJlcnMuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIG1lbWJlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKG1lbWJlcnMpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKCFuLmlzVGhpcygpKSB7CisJCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJCW4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQl9CisJCWZpbmFsIExpc3Q8VHlwZT4gdHlwZUFyZ3MgPSBuLmdldFR5cGVBcmdzKCk7CisJCWlmICh0eXBlQXJncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVBcmdzLnNpemUoKTsgaSsrKSB7CisJCQkJdHlwZUFyZ3Muc2V0KGksIChUeXBlKSB0eXBlQXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHModHlwZUFyZ3MpOworCQl9CisJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpOworCQlpZiAoYXJncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCQlhcmdzLnNldChpLCAoRXhwcmVzc2lvbikgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYXJncyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgRmllbGRBY2Nlc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0U2NvcGUoKEV4cHJlc3Npb24pIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBGaWVsZERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQluLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcmlhYmxlcyA9IG4uZ2V0VmFyaWFibGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFyaWFibGVzLnNpemUoKTsgaSsrKSB7CisJCQl2YXJpYWJsZXMuc2V0KGksIChWYXJpYWJsZURlY2xhcmF0b3IpIHZhcmlhYmxlcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJlbW92ZU51bGxzKHZhcmlhYmxlcyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldFZhcmlhYmxlKChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcikgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJbi5zZXRJdGVyYWJsZSgoRXhwcmVzc2lvbikgbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJbi5zZXRCb2R5KChTdGF0ZW1lbnQpIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJZmluYWwgTGlzdDxFeHByZXNzaW9uPiBpbml0ID0gbi5nZXRJbml0KCk7CisJCWlmIChpbml0ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdC5zaXplKCk7IGkrKykgeworCQkJCWluaXQuc2V0KGksIChFeHByZXNzaW9uKSBpbml0LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhpbml0KTsKKwkJfQorCQlpZiAobi5nZXRDb21wYXJlKCkgIT0gbnVsbCkgeworCQkJbi5zZXRDb21wYXJlKChFeHByZXNzaW9uKSBuLmdldENvbXBhcmUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJZmluYWwgTGlzdDxFeHByZXNzaW9uPiB1cGRhdGUgPSBuLmdldFVwZGF0ZSgpOworCQlpZiAodXBkYXRlICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlLnNpemUoKTsgaSsrKSB7CisJCQkJdXBkYXRlLnNldChpLCAoRXhwcmVzc2lvbikgdXBkYXRlLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh1cGRhdGUpOworCQl9CisJCW4uc2V0Qm9keSgoU3RhdGVtZW50KSBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRDb25kaXRpb24oKEV4cHJlc3Npb24pIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldFRoZW5TdG10KChTdGF0ZW1lbnQpIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWlmIChuLmdldEVsc2VTdG10KCkgIT0gbnVsbCkgeworCQkJbi5zZXRFbHNlU3RtdCgoU3RhdGVtZW50KSBuLmdldEVsc2VTdG10KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLnNldEphdmFEb2MoKEphdmFkb2NDb21tZW50KSBuLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJbi5zZXRCbG9jaygoQmxvY2tTdG10KSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0VHlwZSgoVHlwZSkgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgSmF2YWRvY0NvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0U3RtdCgoU3RhdGVtZW50KSBuLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBNZW1iZXJWYWx1ZVBhaXIgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRWYWx1ZSgoRXhwcmVzc2lvbikgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFNjb3BlKCkgIT0gbnVsbCkgeworCQkJbi5zZXRTY29wZSgoRXhwcmVzc2lvbikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzID0gbi5nZXRUeXBlQXJncygpOworCQlpZiAodHlwZUFyZ3MgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJncy5zaXplKCk7IGkrKykgeworCQkJCXR5cGVBcmdzLnNldChpLCAoVHlwZSkgdHlwZUFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVBcmdzKTsKKwkJfQorCQlmaW5hbCBMaXN0PEV4cHJlc3Npb24+IGFyZ3MgPSBuLmdldEFyZ3MoKTsKKwkJaWYgKGFyZ3MgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisJCQkJYXJncy5zZXQoaSwgKEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFyZ3MpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5zZXRKYXZhRG9jKChKYXZhZG9jQ29tbWVudCkgbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCWZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpOworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCWFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhhbm5vdGF0aW9ucyk7CisJCX0KKwkJZmluYWwgTGlzdDxUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycyA9IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKTsKKwkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQl0eXBlUGFyYW1ldGVycy5zZXQoaSwgKFR5cGVQYXJhbWV0ZXIpIHR5cGVQYXJhbWV0ZXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlUGFyYW1ldGVycyk7CisJCX0KKwkJbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbi5nZXRQYXJhbWV0ZXJzKCk7CisJCWlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7IGkrKykgeworCQkJCXBhcmFtZXRlcnMuc2V0KGksIChQYXJhbWV0ZXIpIHBhcmFtZXRlcnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHBhcmFtZXRlcnMpOworCQl9CisJCWZpbmFsIExpc3Q8TmFtZUV4cHI+IHRocm93eiA9IG4uZ2V0VGhyb3dzKCk7CisJCWlmICh0aHJvd3ogIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJvd3ouc2l6ZSgpOyBpKyspIHsKKwkJCQl0aHJvd3ouc2V0KGksIChOYW1lRXhwcikgdGhyb3d6LmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0aHJvd3opOworCQl9CisJCWlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisJCQluLnNldEJvZHkoKEJsb2NrU3RtdCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgTm9ybWFsQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXROYW1lKChOYW1lRXhwcikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlmaW5hbCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gcGFpcnMgPSBuLmdldFBhaXJzKCk7CisJCWlmIChwYWlycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhaXJzLnNpemUoKTsgaSsrKSB7CisJCQkJcGFpcnMuc2V0KGksIChNZW1iZXJWYWx1ZVBhaXIpIHBhaXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhwYWlycyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgT2JqZWN0Q3JlYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldFNjb3BlKCkgIT0gbnVsbCkgeworCQkJbi5zZXRTY29wZSgoRXhwcmVzc2lvbikgbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PFR5cGU+IHR5cGVBcmdzID0gbi5nZXRUeXBlQXJncygpOworCQlpZiAodHlwZUFyZ3MgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJncy5zaXplKCk7IGkrKykgeworCQkJCXR5cGVBcmdzLnNldChpLCAoVHlwZSkgdHlwZUFyZ3MuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKHR5cGVBcmdzKTsKKwkJfQorCQluLnNldFR5cGUoKENsYXNzT3JJbnRlcmZhY2VUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWZpbmFsIExpc3Q8RXhwcmVzc2lvbj4gYXJncyA9IG4uZ2V0QXJncygpOworCQlpZiAoYXJncyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCQlhcmdzLnNldChpLCAoRXhwcmVzc2lvbikgYXJncy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYXJncyk7CisJCX0KKwkJZmluYWwgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGFub255bW91c0NsYXNzQm9keSA9IG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCk7CisJCWlmIChhbm9ueW1vdXNDbGFzc0JvZHkgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9ueW1vdXNDbGFzc0JvZHkuc2l6ZSgpOyBpKyspIHsKKwkJCQlhbm9ueW1vdXNDbGFzc0JvZHkuc2V0KGksIChCb2R5RGVjbGFyYXRpb24pIGFub255bW91c0NsYXNzQm9keS5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoYW5vbnltb3VzQ2xhc3NCb2R5KTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCWZpbmFsIExpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zID0gbi5nZXRBbm5vdGF0aW9ucygpOworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCWFubm90YXRpb25zLnNldChpLCAoQW5ub3RhdGlvbkV4cHIpIGFubm90YXRpb25zLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhhbm5vdGF0aW9ucyk7CisJCX0KKwkJbi5zZXROYW1lKChOYW1lRXhwcikgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisJCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdCgoQmFzZVBhcmFtZXRlcikgbiwgYXJnKTsKKwkJbi5zZXRUeXBlKChUeXBlKSBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKwkKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoTXVsdGlUeXBlUGFyYW1ldGVyIG4sIEEgYXJnKSB7CisgICAgCXZpc2l0KChCYXNlUGFyYW1ldGVyKSBuLCBhcmcpOworICAgIAlMaXN0PFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8VHlwZT4oKTsKKyAgICAJZm9yIChUeXBlIHR5cGUgOiBuLmdldFR5cGVzKCkpIHsKKyAgICAJCXR5cGVzLmFkZCgoVHlwZSkgdHlwZS5hY2NlcHQodGhpcywgYXJnKSk7CisgICAgCX0KKyAgICAgICAgbi5zZXRUeXBlcyh0eXBlcyk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworCXByb3RlY3RlZCBOb2RlIHZpc2l0KGZpbmFsIEJhc2VQYXJhbWV0ZXIgbiwgZmluYWwgQSBhcmcpIHsKKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQkKKwkJbi5zZXRJZCgoVmFyaWFibGVEZWNsYXJhdG9ySWQpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBRdWFsaWZpZWROYW1lRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldFF1YWxpZmllcigoTmFtZUV4cHIpIG4uZ2V0UXVhbGlmaWVyKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgUmVmZXJlbmNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0RXhwcigpICE9IG51bGwpIHsKKwkJCW4uc2V0RXhwcigoRXhwcmVzc2lvbikgbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldE5hbWUoKE5hbWVFeHByKSBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCW4uc2V0TWVtYmVyVmFsdWUoKEV4cHJlc3Npb24pIG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgU3VwZXJFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldENsYXNzRXhwcigpICE9IG51bGwpIHsKKwkJCW4uc2V0Q2xhc3NFeHByKChFeHByZXNzaW9uKSBuLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldExhYmVsKCkgIT0gbnVsbCkgeworCQkJbi5zZXRMYWJlbCgoRXhwcmVzc2lvbikgbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlmaW5hbCBMaXN0PFN0YXRlbWVudD4gc3RtdHMgPSBuLmdldFN0bXRzKCk7CisJCWlmIChzdG10cyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0bXRzLnNpemUoKTsgaSsrKSB7CisJCQkJc3RtdHMuc2V0KGksIChTdGF0ZW1lbnQpIHN0bXRzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyhzdG10cyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRTZWxlY3RvcigoRXhwcmVzc2lvbikgbi5nZXRTZWxlY3RvcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxTd2l0Y2hFbnRyeVN0bXQ+IGVudHJpZXMgPSBuLmdldEVudHJpZXMoKTsKKwkJaWYgKGVudHJpZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisJCQkJZW50cmllcy5zZXQoaSwgKFN3aXRjaEVudHJ5U3RtdCkgZW50cmllcy5nZXQoaSkuYWNjZXB0KHRoaXMsIGFyZykpOworCQkJfQorCQkJcmVtb3ZlTnVsbHMoZW50cmllcyk7CisJCX0KKwkJcmV0dXJuIG47CisKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQluLnNldEV4cHIoKEV4cHJlc3Npb24pIG4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJbi5zZXRCbG9jaygoQmxvY2tTdG10KSBuLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCkgeworCQkJbi5zZXRDbGFzc0V4cHIoKEV4cHJlc3Npb24pIG4uZ2V0Q2xhc3NFeHByKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCW4uc2V0VHJ5QmxvY2soKEJsb2NrU3RtdCkgbi5nZXRUcnlCbG9jaygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxDYXRjaENsYXVzZT4gY2F0Y2hzID0gbi5nZXRDYXRjaHMoKTsKKwkJaWYgKGNhdGNocyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGNocy5zaXplKCk7IGkrKykgeworCQkJCWNhdGNocy5zZXQoaSwgKENhdGNoQ2xhdXNlKSBjYXRjaHMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGNhdGNocyk7CisJCX0KKwkJaWYgKG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCkgeworCQkJbi5zZXRGaW5hbGx5QmxvY2soKEJsb2NrU3RtdCkgbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFR5cGVEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRUeXBlRGVjbGFyYXRpb24oKFR5cGVEZWNsYXJhdGlvbikgbi5nZXRUeXBlRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisJCWZpbmFsIExpc3Q8Q2xhc3NPckludGVyZmFjZVR5cGU+IHR5cGVCb3VuZCA9IG4uZ2V0VHlwZUJvdW5kKCk7CisJCWlmICh0eXBlQm91bmQgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQm91bmQuc2l6ZSgpOyBpKyspIHsKKwkJCQl0eXBlQm91bmQuc2V0KGksIChDbGFzc09ySW50ZXJmYWNlVHlwZSkgdHlwZUJvdW5kLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCQl9CisJCQlyZW1vdmVOdWxscyh0eXBlQm91bmQpOworCQl9CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRFeHByKChFeHByZXNzaW9uKSBuLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJZmluYWwgTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMgPSBuLmdldEFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbnMuc2V0KGksIChBbm5vdGF0aW9uRXhwcikgYW5ub3RhdGlvbnMuZ2V0KGkpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJCX0KKwkJCXJlbW92ZU51bGxzKGFubm90YXRpb25zKTsKKwkJfQorCQluLnNldFR5cGUoKFR5cGUpIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJZmluYWwgTGlzdDxWYXJpYWJsZURlY2xhcmF0b3I+IHZhcnMgPSBuLmdldFZhcnMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJzLnNpemUoKTsgaSsrKSB7CisJCQl2YXJzLnNldChpLCAoVmFyaWFibGVEZWNsYXJhdG9yKSB2YXJzLmdldChpKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmVtb3ZlTnVsbHModmFycyk7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRJZCgoVmFyaWFibGVEZWNsYXJhdG9ySWQpIG4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCWlmIChuLmdldEluaXQoKSAhPSBudWxsKSB7CisJCQluLnNldEluaXQoKEV4cHJlc3Npb24pIG4uZ2V0SW5pdCgpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9ySWQgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJbi5zZXRDb25kaXRpb24oKEV4cHJlc3Npb24pIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQluLnNldEJvZHkoKFN0YXRlbWVudCkgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZykpOworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCWlmIChuLmdldEV4dGVuZHMoKSAhPSBudWxsKSB7CisJCQluLnNldEV4dGVuZHMoKFJlZmVyZW5jZVR5cGUpIG4uZ2V0RXh0ZW5kcygpLmFjY2VwdCh0aGlzLCBhcmcpKTsKKwkJfQorCQlpZiAobi5nZXRTdXBlcigpICE9IG51bGwpIHsKKwkJCW4uc2V0U3VwZXIoKFJlZmVyZW5jZVR5cGUpIG4uZ2V0U3VwZXIoKS5hY2NlcHQodGhpcywgYXJnKSk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIExhbWJkYUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJcmV0dXJuIG47CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyBOb2RlIHZpc2l0KGZpbmFsIE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgZmluYWwgQSBhcmcpeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgVHlwZUV4cHIgbiwgZmluYWwgQSBhcmcpeworCQlyZXR1cm4gbjsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIE5vZGUgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXJldHVybiBuOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgTm9kZSB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBBIGFyZykgeworCQlyZXR1cm4gbjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2phdmFwYXJzZXJfc3JjL3Byb3Blcl9zb3VyY2UvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1ZvaWRWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1YmQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNSBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKiAKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIAorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworIAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5UeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eU1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbXB0eVR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bUNvbnN0YW50RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTXVsdGlUeXBlUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN3aXRjaEVudHJ5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3luY2hyb25pemVkU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuVGhyb3dTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UcnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UeXBlRGVjbGFyYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5XaGlsZVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CisKKy8qKgorICogQSB2aXNpdG9yIHRoYXQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgorICogCisgKiBAYXV0aG9yIEp1bGlvIFZpbG1hciBHZXNzZXIKKyAqLworcHVibGljIGludGVyZmFjZSBWb2lkVmlzaXRvcjxBPiB7CisKKwkvLy0gQ29tcGlsYXRpb24gVW5pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVHlwZVBhcmFtZXRlciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KExpbmVDb21tZW50IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQmxvY2tDb21tZW50IG4sIEEgYXJnKTsKKworCS8vLSBCb2R5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgdmlzaXQoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoRW51bURlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoRW1wdHlUeXBlRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3IgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3JJZCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFBhcmFtZXRlciBuLCBBIGFyZyk7CisJCisJdm9pZCB2aXNpdChNdWx0aVR5cGVQYXJhbWV0ZXIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChFbXB0eU1lbWJlckRlY2xhcmF0aW9uIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEphdmFkb2NDb21tZW50IG4sIEEgYXJnKTsKKworCS8vLSBUeXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgdmlzaXQoQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChQcmltaXRpdmVUeXBlIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoUmVmZXJlbmNlVHlwZSBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFZvaWRUeXBlIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoV2lsZGNhcmRUeXBlIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVW5rbm93blR5cGUgbiwgQSBhcmcpOworCisJLy8tIEV4cHJlc3Npb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCB2aXNpdChBcnJheUFjY2Vzc0V4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChBcnJheUNyZWF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXJFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQXNzaWduRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEJpbmFyeUV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChDYXN0RXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENsYXNzRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENvbmRpdGlvbmFsRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEVuY2xvc2VkRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEZpZWxkQWNjZXNzRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEluc3RhbmNlT2ZFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoU3RyaW5nTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChMb25nTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KExvbmdMaXRlcmFsTWluVmFsdWVFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoQ2hhckxpdGVyYWxFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoRG91YmxlTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChCb29sZWFuTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChOdWxsTGl0ZXJhbEV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChNZXRob2RDYWxsRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KE5hbWVFeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoT2JqZWN0Q3JlYXRpb25FeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoUXVhbGlmaWVkTmFtZUV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChUaGlzRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFN1cGVyRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFVuYXJ5RXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KE5vcm1hbEFubm90YXRpb25FeHByIG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoTWVtYmVyVmFsdWVQYWlyIG4sIEEgYXJnKTsKKworCS8vLSBTdGF0ZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgdmlzaXQoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEFzc2VydFN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChCbG9ja1N0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChMYWJlbGVkU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEVtcHR5U3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEV4cHJlc3Npb25TdG10IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoU3dpdGNoU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFN3aXRjaEVudHJ5U3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEJyZWFrU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KFJldHVyblN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChJZlN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChXaGlsZVN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChDb250aW51ZVN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChEb1N0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChGb3JlYWNoU3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KEZvclN0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChUaHJvd1N0bXQgbiwgQSBhcmcpOworCisJdm9pZCB2aXNpdChTeW5jaHJvbml6ZWRTdG10IG4sIEEgYXJnKTsKKworCXZvaWQgdmlzaXQoVHJ5U3RtdCBuLCBBIGFyZyk7CisKKwl2b2lkIHZpc2l0KENhdGNoQ2xhdXNlIG4sIEEgYXJnKTsKKworICAgIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBBIGFyZyk7CisKKyAgICB2b2lkIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgQSBhcmcpOworCisgICAgdm9pZCB2aXNpdChUeXBlRXhwciBuLCBBIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3JBZGFwdGVyLmphdmEgYi9qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvamF2YXBhcnNlcl9zcmMvcHJvcGVyX3NvdXJjZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVm9pZFZpc2l0b3JBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhZDEyZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItc3ltYm9sLXNvbHZlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9qYXZhcGFyc2VyX3NyYy9wcm9wZXJfc291cmNlL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Wb2lkVmlzaXRvckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTUgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICogCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSAKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlNZW1iZXJEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW1wdHlUeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1Db25zdGFudERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk11bHRpVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5UeXBlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9ySWQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkFzc2VydFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQnJlYWtTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5DYXRjaENsYXVzZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQ29udGludWVTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Eb1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkVtcHR5U3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRm9yZWFjaFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LklmU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3dpdGNoRW50cnlTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5Td2l0Y2hTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TeW5jaHJvbml6ZWRTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5UaHJvd1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlR5cGVEZWNsYXJhdGlvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LldoaWxlU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmludGVybmFsLlV0aWxzLmlzTnVsbE9yRW1wdHk7CisKKy8qKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWb2lkVmlzaXRvckFkYXB0ZXI8QT4gaW1wbGVtZW50cyBWb2lkVmlzaXRvcjxBPiB7CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCW4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyIDogbi5nZXRNZW1iZXJzKCkpIHsKKwkJCQltZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCW4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgeworCQkJbi5nZXREZWZhdWx0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXREaW1lbnNpb25zKCkpKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZGltIDogbi5nZXREaW1lbnNpb25zKCkpIHsKKwkJCQlkaW0uYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQluLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRWYWx1ZXMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZXhwciA6IG4uZ2V0VmFsdWVzKCkpIHsKKwkJCQlleHByLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFzc2VydFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldENoZWNrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCWlmIChuLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQluLmdldE1lc3NhZ2UoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUYXJnZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0U3RtdHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFN0YXRlbWVudCBzIDogbi5nZXRTdG10cygpKSB7CisJCQkJcy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldEV4Y2VwdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldENhdGNoQmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2hhckxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCWEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGVQYXJhbWV0ZXIgdCA6IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RXh0ZW5kcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA6IG4uZ2V0RXh0ZW5kcygpKSB7CisJCQkJYy5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCisJCWlmIChuLmdldEltcGxlbWVudHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldEltcGxlbWVudHMoKSkgeworCQkJCWMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0TWVtYmVycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQm9keURlY2xhcmF0aW9uIG1lbWJlciA6IG4uZ2V0TWVtYmVycygpKSB7CisJCQkJbWVtYmVyLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisJCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0VHlwZUFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGUgdCA6IG4uZ2V0VHlwZUFyZ3MoKSkgeworCQkJCXQuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29tcGlsYXRpb25Vbml0IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0UGFja2FnZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0UGFja2FnZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldEltcG9ydHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEltcG9ydERlY2xhcmF0aW9uIGkgOiBuLmdldEltcG9ydHMoKSkgeworCQkJCWkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0VHlwZXMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gOiBuLmdldFR5cGVzKCkpIHsKKwkJCQl0eXBlRGVjbGFyYXRpb24uYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uZGl0aW9uYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlUGFyYW1ldGVyIHQgOiBuLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIFBhcmFtZXRlciBwIDogbi5nZXRQYXJhbWV0ZXJzKCkpIHsKKwkJCQlwLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldFRocm93cygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgTmFtZUV4cHIgbmFtZSA6IG4uZ2V0VGhyb3dzKCkpIHsKKwkJCQluYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29udGludWVTdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW1wdHlNZW1iZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eVR5cGVEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldElubmVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0SmF2YURvYygpICE9IG51bGwpIHsKKwkJCW4uZ2V0SmF2YURvYygpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Q2xhc3NCb2R5KCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyIDogbi5nZXRDbGFzc0JvZHkoKSkgeworCQkJCW1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldEltcGxlbWVudHMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgOiBuLmdldEltcGxlbWVudHMoKSkgeworCQkJCWMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZSA6IG4uZ2V0RW50cmllcygpKSB7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRNZW1iZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyIDogbi5nZXRNZW1iZXJzKCkpIHsKKwkJCQltZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKCFuLmlzVGhpcygpKSB7CisJCQlpZiAobi5nZXRFeHByKCkgIT0gbnVsbCkgeworCQkJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlIHQgOiBuLmdldFR5cGVBcmdzKCkpIHsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldEFyZ3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEV4cHJlc3Npb24gZSA6IG4uZ2V0QXJncygpKSB7CisJCQkJZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmb3IgKGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2YXIgOiBuLmdldFZhcmlhYmxlcygpKSB7CisJCQl2YXIuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFZhcmlhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0SXRlcmFibGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRJbml0KCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEluaXQoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0Q29tcGFyZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0Q29tcGFyZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldFVwZGF0ZSgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgRXhwcmVzc2lvbiBlIDogbi5nZXRVcGRhdGUoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0RWxzZVN0bXQoKSAhPSBudWxsKSB7CisJCQluLmdldEVsc2VTdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW1wb3J0RGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldEphdmFEb2MoKSAhPSBudWxsKSB7CisJCQluLmdldEphdmFEb2MoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQluLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluc3RhbmNlT2ZFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldFN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGluZUNvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbE1pblZhbHVlRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kQ2FsbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRTY29wZSgpICE9IG51bGwpIHsKKwkJCW4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCQlpZiAobi5nZXRUeXBlQXJncygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVHlwZSB0IDogbi5nZXRUeXBlQXJncygpKSB7CisJCQkJdC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRKYXZhRG9jKCkgIT0gbnVsbCkgeworCQkJbi5nZXRKYXZhRG9jKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWlmIChuLmdldFR5cGVQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlUGFyYW1ldGVyIHQgOiBuLmdldFR5cGVQYXJhbWV0ZXJzKCkpIHsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBQYXJhbWV0ZXIgcCA6IG4uZ2V0UGFyYW1ldGVycygpKSB7CisJCQkJcC5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRUaHJvd3MoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIE5hbWVFeHByIG5hbWUgOiBuLmdldFRocm93cygpKSB7CisJCQkJbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQlpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworCQkJbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTmFtZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXRQYWlycygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG0gOiBuLmdldFBhaXJzKCkpIHsKKwkJCQltLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldFNjb3BlKCkgIT0gbnVsbCkgeworCQkJbi5nZXRTY29wZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldFR5cGVBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBUeXBlIHQgOiBuLmdldFR5cGVBcmdzKCkpIHsKKwkJCQl0LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXRBcmdzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBFeHByZXNzaW9uIGUgOiBuLmdldEFyZ3MoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb24gbWVtYmVyIDogbi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKSkgeworCQkJCW1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworCQkJCWEuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisJCQkJYS5hY2NlcHQodGhpcywgYXJnKTsKKwkJCX0KKwkJfQorCQluLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKwkKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTXVsdGlUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCWZvciAoZmluYWwgVHlwZSB0eXBlIDogbi5nZXRUeXBlcygpKSB7CisJCQl0eXBlLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCW4uZ2V0SWQoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUHJpbWl0aXZlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFF1YWxpZmllZE5hbWVFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRRdWFsaWZpZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUmVmZXJlbmNlVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0RXhwcigpICE9IG51bGwpIHsKKwkJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRDbGFzc0V4cHIoKSAhPSBudWxsKSB7CisJCQluLmdldENsYXNzRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldExhYmVsKCkgIT0gbnVsbCkgeworCQkJbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQl9CisJCWlmIChuLmdldFN0bXRzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RtdHMoKSkgeworCQkJCXMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgU3dpdGNoRW50cnlTdG10IGUgOiBuLmdldEVudHJpZXMoKSkgeworCQkJCWUuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3luY2hyb25pemVkU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCQluLmdldEJsb2NrKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0Q2xhc3NFeHByKCkgIT0gbnVsbCkgeworCQkJbi5nZXRDbGFzc0V4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUaHJvd1N0bXQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQluLmdldEV4cHIoKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVHJ5U3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldFJlc291cmNlcygpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdiA6IG4uZ2V0UmVzb3VyY2VzKCkpIHsKKwkJCQl2LmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0VHJ5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJaWYgKG4uZ2V0Q2F0Y2hzKCkgIT0gbnVsbCkgeworCQkJZm9yIChmaW5hbCBDYXRjaENsYXVzZSBjIDogbi5nZXRDYXRjaHMoKSkgeworCQkJCWMuYWNjZXB0KHRoaXMsIGFyZyk7CisJCQl9CisJCX0KKwkJaWYgKG4uZ2V0RmluYWxseUJsb2NrKCkgIT0gbnVsbCkgeworCQkJbi5nZXRGaW5hbGx5QmxvY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUeXBlRGVjbGFyYXRpb25TdG10IG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRUeXBlRGVjbGFyYXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCWlmIChuLmdldFR5cGVCb3VuZCgpICE9IG51bGwpIHsKKwkJCWZvciAoZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA6IG4uZ2V0VHlwZUJvdW5kKCkpIHsKKwkJCQljLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0RXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmtub3duVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJaWYgKG4uZ2V0QW5ub3RhdGlvbnMoKSAhPSBudWxsKSB7CisJCQlmb3IgKGZpbmFsIEFubm90YXRpb25FeHByIGEgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKwkJCQlhLmFjY2VwdCh0aGlzLCBhcmcpOworCQkJfQorCQl9CisJCW4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlmb3IgKGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2IDogbi5nZXRWYXJzKCkpIHsKKwkJCXYuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9yIG4sIGZpbmFsIEEgYXJnKSB7CisJCXZpc2l0Q29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKwkJbi5nZXRJZCgpLmFjY2VwdCh0aGlzLCBhcmcpOworCQlpZiAobi5nZXRJbml0KCkgIT0gbnVsbCkgeworCQkJbi5nZXRJbml0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdG9ySWQgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJfQorCisJQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFdoaWxlU3RtdCBuLCBmaW5hbCBBIGFyZykgeworCQl2aXNpdENvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisJCW4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCW4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCX0KKworCUBPdmVycmlkZSBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgQSBhcmcpIHsKKwkJdmlzaXRDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCQlpZiAobi5nZXRFeHRlbmRzKCkgIT0gbnVsbCkgeworCQkJbi5nZXRFeHRlbmRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwkJaWYgKG4uZ2V0U3VwZXIoKSAhPSBudWxsKSB7CisJCQluLmdldFN1cGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisJCX0KKwl9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChMYW1iZGFFeHByIG4sIGZpbmFsIEEgYXJnKSB7CisgICAgICAgIGlmIChuLmdldFBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFBhcmFtZXRlciBhIDogbi5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBhLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgZmluYWwgQSBhcmcpIHsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFR5cGVQYXJhbWV0ZXIgYSA6IG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgICAgIGEuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChUeXBlRXhwciBuLCBmaW5hbCBBIGFyZykgeworICAgICAgICBpZiAobi5nZXRUeXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRDb21tZW50KGZpbmFsIENvbW1lbnQgbiwgZmluYWwgQSBhcmcpIHsKKwkJaWYgKG4gIT0gbnVsbCkgeworCQkJbi5hY2NlcHQodGhpcywgYXJnKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9qYXZhcGFyc2VyLXRlc3RpbmcuaW1sIGIvamF2YXBhcnNlci10ZXN0aW5nL2phdmFwYXJzZXItdGVzdGluZy5pbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzMGUxYQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9qYXZhcGFyc2VyLXRlc3RpbmcuaW1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bW9kdWxlIG9yZy5qZXRicmFpbnMuaWRlYS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdHNNYW5hZ2VyLmlzTWF2ZW5Nb2R1bGU9InRydWUiIHR5cGU9IkpBVkFfTU9EVUxFIiB2ZXJzaW9uPSI0Ij4KKyAgPGNvbXBvbmVudCBuYW1lPSJOZXdNb2R1bGVSb290TWFuYWdlciIgTEFOR1VBR0VfTEVWRUw9IkpES18xXzgiPgorICAgIDxvdXRwdXQgdXJsPSJmaWxlOi8vJE1PRFVMRV9ESVIkL3RhcmdldC9jbGFzc2VzIiAvPgorICAgIDxvdXRwdXQtdGVzdCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0L3Rlc3QtY2xhc3NlcyIgLz4KKyAgICA8Y29udGVudCB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQiPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL3Rlc3QvamF2YSIgaXNUZXN0U291cmNlPSJ0cnVlIiAvPgorICAgICAgPHNvdXJjZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvc3JjL3Rlc3QvcmVzb3VyY2VzIiB0eXBlPSJqYXZhLXRlc3QtcmVzb3VyY2UiIC8+CisgICAgICA8ZXhjbHVkZUZvbGRlciB1cmw9ImZpbGU6Ly8kTU9EVUxFX0RJUiQvdGFyZ2V0IiAvPgorICAgIDwvY29udGVudD4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJpbmhlcml0ZWRKZGsiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ic291cmNlRm9sZGVyIiBmb3JUZXN0cz0iZmFsc2UiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibW9kdWxlIiBtb2R1bGUtbmFtZT0iamF2YXBhcnNlci1jb3JlIiBzY29wZT0iVEVTVCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IG9yZy5qdW5pdC5qdXBpdGVyOmp1bml0LWp1cGl0ZXItYXBpOjUuMC4wIiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IG9yZy5hcGlndWFyZGlhbjphcGlndWFyZGlhbi1hcGk6MS4wLjAiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogb3JnLm9wZW50ZXN0NGo6b3BlbnRlc3Q0ajoxLjAuMCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBvcmcuanVuaXQucGxhdGZvcm06anVuaXQtcGxhdGZvcm0tY29tbW9uczoxLjAuMCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBvcmcuamJlaGF2ZTpqYmVoYXZlLWNvcmU6NC4xLjIiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjoganVuaXQ6anVuaXQ6NC4xMiIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBvcmcuaGFtY3Jlc3Q6aGFtY3Jlc3QtY29yZToxLjMiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogb3JnLmhhbWNyZXN0OmhhbWNyZXN0LWxpYnJhcnk6MS4zIiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IG9yZy5oYW1jcmVzdDpoYW1jcmVzdC1pbnRlZ3JhdGlvbjoxLjMiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogb3JnLmFwYWNoZS5jb21tb25zOmNvbW1vbnMtY29sbGVjdGlvbnM0OjQuMSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBjb21tb25zLWlvOmNvbW1vbnMtaW86Mi41IiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IG9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWxhbmczOjMuNCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBvcmcuY29kZWhhdXMucGxleHVzOnBsZXh1cy11dGlsczozLjAuMjIiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogb3JnLmZyZWVtYXJrZXI6ZnJlZW1hcmtlcjoyLjMuMjMiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogY29tLnRob3VnaHR3b3Jrcy5wYXJhbmFtZXI6cGFyYW5hbWVyOjIuOCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBjb20udGhvdWdodHdvcmtzLnhzdHJlYW06eHN0cmVhbToxLjQuOSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiB4bWxwdWxsOnhtbHB1bGw6MS4xLjMuMSIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiB4cHAzOnhwcDNfbWluOjEuMS40YyIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuOC4wIiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IGNvbS5naXRodWIudmFsZmlyc3Q6amJlaGF2ZS1qdW5pdC1ydW5uZXI6Mi4xLjAiIGxldmVsPSJwcm9qZWN0IiAvPgorICAgIDxvcmRlckVudHJ5IHR5cGU9ImxpYnJhcnkiIHNjb3BlPSJURVNUIiBuYW1lPSJNYXZlbjogb3JnLmFzc2VydGo6YXNzZXJ0ai1jb3JlOjMuNi4yIiBsZXZlbD0icHJvamVjdCIgLz4KKyAgICA8b3JkZXJFbnRyeSB0eXBlPSJsaWJyYXJ5IiBzY29wZT0iVEVTVCIgbmFtZT0iTWF2ZW46IGNvbS5zcXVhcmV1cC5va2h0dHAzOm9raHR0cDozLjYuMCIgbGV2ZWw9InByb2plY3QiIC8+CisgICAgPG9yZGVyRW50cnkgdHlwZT0ibGlicmFyeSIgc2NvcGU9IlRFU1QiIG5hbWU9Ik1hdmVuOiBjb20uc3F1YXJldXAub2tpbzpva2lvOjEuMTEuMCIgbGV2ZWw9InByb2plY3QiIC8+CisgIDwvY29tcG9uZW50PgorPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3BvbS54bWwgYi9qYXZhcGFyc2VyLXRlc3RpbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTNhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3BvbS54bWwKQEAgLTAsMCArMSwxMTYgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphdmFwYXJzZXItcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4xNi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXRlc3Rpbmc8L2FydGlmYWN0SWQ+CisgICAgPGRlc2NyaXB0aW9uPlRoZSB0ZXN0IHN1aXRlIGZvciBqYXZhcGFyc2VyLWNvcmU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5BIGJ1c2luZXNzLWZyaWVuZGx5IE9TUyBsaWNlbnNlPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY29jby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+amFjb2NvLWluaXRpYWxpemU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByZXBhcmUtYWdlbnQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYWNvY28tc2l0ZTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVwb3J0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1yZXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5LXJlc291cmNlczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vamF2YXBhcnNlci1jb3JlL3RhcmdldC9jbGFzc2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBubyBuZWVkIHRvIHJlbGVhc2UgdGhpcyBtb2R1bGUgLS0+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdC1qdXBpdGVyLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYmVoYXZlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amJlaGF2ZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC4xLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLnZhbGZpcnN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amJlaGF2ZS1qdW5pdC1ydW5uZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hc3NlcnRqPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNzZXJ0ai1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My42LjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3F1YXJldXAub2todHRwMzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9raHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuNi4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Db21tZW50c0luc2VydGVyVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0NvbW1lbnRzSW5zZXJ0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0YTYzZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Db21tZW50c0luc2VydGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnRzQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRFcXVhbHNOb0VvbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBDb21tZW50c0luc2VydGVyVGVzdCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWFrZUZpbGVuYW1lKFN0cmluZyBzYW1wbGVOYW1lKSB7CisgICAgICAgIHJldHVybiAiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2lzc3VlX3NhbXBsZXMvIiArIHNhbXBsZU5hbWUgKyAiLmphdmEudHh0IjsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcGFyc2VTYW1wbGUoU3RyaW5nIHNhbXBsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb3ZpZGVyIHAgPSBQcm92aWRlcnMucmVzb3VyY2VQcm92aWRlcigKKyAgICAgICAgICAgICAgICBtYWtlRmlsZW5hbWUoc2FtcGxlTmFtZSkpOworICAgICAgICByZXR1cm4gbmV3IEphdmFQYXJzZXIoKS5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzc3VlOiAiV2hlbiB0aGVyZSBpcyBhIFN0cmluZyBjb25zdGFudCAiXFwiIGNvbXBpbGF0aW9uVW5pdCBpZ25vcmVzIGFsbCBmdXJ0aGVyIGNvbW1lbnRzIgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUyOTAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYXJzZVJlc3VsdCByZXN1bHQgPSBwYXJzZVNhbXBsZSgiSXNzdWUyOTAiKTsKKyAgICAgICAgQ29tbWVudHNDb2xsZWN0aW9uIGNjID0gKENvbW1lbnRzQ29sbGVjdGlvbikgcmVzdWx0LmdldENvbW1lbnRzQ29sbGVjdGlvbigpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2MuZ2V0TGluZUNvbW1lbnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNjLmdldEphdmFkb2NDb21tZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTYyNCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlUmVzb3VyY2UobWFrZUZpbGVuYW1lKCJJc3N1ZTYyNCIpKTsKKyAgICAgICAgLy8gU2hvdWxkIG5vdCBmYWlsCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTIwMEVudW1Db25zdGFudHNXaXRoQ29tbWVudHNGb3JjZVZlcnRpY2FsQWxpZ25tZW50KCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgicHVibGljIGVudW0gWCB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAvKiogY29uc3QxIGphdmFkb2MgKi8iICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIEJPUkRFUl9DT05TVEFOVCwiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIC8qKiBjb25zdDIgamF2YWRvYyAqLyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgQU5PVEhFUl9DT05TVEFOVCIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9Iik7CisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJwdWJsaWMgZW51bSBYIHtcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgLyoqXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAqIGNvbnN0MSBqYXZhZG9jXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAqL1xuIiArCisgICAgICAgICAgICAgICAgIiAgICBCT1JERVJfQ09OU1RBTlQsXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIC8qKlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKiBjb25zdDIgamF2YWRvY1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKi9cbiIgKworICAgICAgICAgICAgICAgICIgICAgQU5PVEhFUl9DT05TVEFOVFxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIGN1LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUyMzRMb3NpbmdDb21tZW50c0luQXJyYXlJbml0aWFsaXplckV4cHIoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJAQW5ubyhzdHVmZj17IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAvLyBKdXN0LCIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgLy8gYW4sIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAvLyBleGFtcGxlIiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0pIiArIEVPTCArCisgICAgICAgICAgICAgICAgImNsYXNzIEFCQyB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm9Fb2woIkBBbm5vKHN0dWZmID0gey8vIEp1c3QsXG4iICsKKyAgICAgICAgICAgICAgICAiLy8gYW4sXG4iICsKKyAgICAgICAgICAgICAgICAiLy8gZXhhbXBsZVxuIiArCisgICAgICAgICAgICAgICAgIn0pXG4iICsKKyAgICAgICAgICAgICAgICAiY2xhc3MgQUJDIHtcbiIgKworICAgICAgICAgICAgICAgICJ9XG4iLCBjdS50b1N0cmluZygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9HZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0dlbmVyYXRlZEphdmFQYXJzZXJUb2tlbk1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlY2VkZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9HZW5lcmF0ZWRKYXZhUGFyc2VyVG9rZW5NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEdlbmVyYXRlZEphdmFQYXJzZXJUb2tlbk1hbmFnZXJUZXN0IHsKKyAgICBwcml2YXRlIFN0cmluZyBtYWtlRmlsZW5hbWUoU3RyaW5nIHNhbXBsZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuICJjb20vZ2l0aHViL2phdmFwYXJzZXIvaXNzdWVfc2FtcGxlcy8iICsgc2FtcGxlTmFtZSArICIuamF2YS50eHQiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUxMDAzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSmF2YVBhcnNlci5wYXJzZVJlc291cmNlKG1ha2VGaWxlbmFtZSgiaXNzdWUxMDAzIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFQYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwMmU5NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlDcmVhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNhc3RFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5MYW1iZGFFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuSW50ZXJzZWN0aW9uVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklUOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UucmFuZ2U7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLm1hdmVuTW9kdWxlUm9vdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRJbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgSmF2YVBhcnNlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5nZU9mQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uSXNDb3JyZWN0KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJAaW50ZXJmYWNlIEFEIHsgU3RyaW5nIGZvbygpOyB9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG1lbWJlckRlY2xhcmF0aW9uID0gY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJBRCIpLmdldCgpLmdldE1lbWJlcigwKS5hc0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbWVtYmVyRGVjbGFyYXRpb24uZ2V0UmFuZ2UoKS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmFuZ2UobmV3IFBvc2l0aW9uKDEsIDE3KSwgbmV3IFBvc2l0aW9uKDEsIDI5KSksIG1lbWJlckRlY2xhcmF0aW9uLmdldFJhbmdlKCkuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmFuZ2VPZkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbldpdGhBcnJheVR5cGVJc0NvcnJlY3QoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gIkBpbnRlcmZhY2UgQUQgeyBTdHJpbmdbXSBmb28oKTsgfSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBtZW1iZXJEZWNsYXJhdGlvbiA9IGN1LmdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgiQUQiKS5nZXQoKS5nZXRNZW1iZXIoMCkuYXNBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1lbWJlckRlY2xhcmF0aW9uLmdldFJhbmdlKCkuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFJhbmdlKG5ldyBQb3NpdGlvbigxLCAxNyksIG5ldyBQb3NpdGlvbigxLCAzMSkpLCBtZW1iZXJEZWNsYXJhdGlvbi5nZXRSYW5nZSgpLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJhbmdlT2ZBcnJheUNyZWF0aW9uTGV2ZWxXaXRoRXhwcmVzc2lvbklzQ29ycmVjdCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAibmV3IGludFsxMjNdWzQ1Nl0iOworICAgICAgICBBcnJheUNyZWF0aW9uRXhwciBleHByZXNzaW9uID0gSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oY29kZSk7CisgICAgICAgIE9wdGlvbmFsPFJhbmdlPiByYW5nZTsKKworICAgICAgICByYW5nZSA9IGV4cHJlc3Npb24uZ2V0TGV2ZWxzKCkuZ2V0KDApLmdldFJhbmdlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByYW5nZS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmFuZ2UobmV3IFBvc2l0aW9uKDEsIDgpLCBuZXcgUG9zaXRpb24oMSwgMTIpKSwgcmFuZ2UuZ2V0KCkpOworCisgICAgICAgIHJhbmdlID0gZXhwcmVzc2lvbi5nZXRMZXZlbHMoKS5nZXQoMSkuZ2V0UmFuZ2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJhbmdlLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZShuZXcgUG9zaXRpb24oMSwgMTMpLCBuZXcgUG9zaXRpb24oMSwgMTcpKSwgcmFuZ2UuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmFuZ2VPZkFycmF5Q3JlYXRpb25MZXZlbFdpdGhvdXRFeHByZXNzaW9uSXNDb3JyZWN0KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJuZXcgaW50W11bXSI7CisgICAgICAgIEFycmF5Q3JlYXRpb25FeHByIGV4cHJlc3Npb24gPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbihjb2RlKTsKKyAgICAgICAgT3B0aW9uYWw8UmFuZ2U+IHJhbmdlOworCisgICAgICAgIHJhbmdlID0gZXhwcmVzc2lvbi5nZXRMZXZlbHMoKS5nZXQoMCkuZ2V0UmFuZ2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJhbmdlLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZShuZXcgUG9zaXRpb24oMSwgOCksIG5ldyBQb3NpdGlvbigxLCA5KSksIHJhbmdlLmdldCgpKTsKKworICAgICAgICByYW5nZSA9IGV4cHJlc3Npb24uZ2V0TGV2ZWxzKCkuZ2V0KDEpLmdldFJhbmdlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByYW5nZS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUmFuZ2UobmV3IFBvc2l0aW9uKDEsIDEwKSwgbmV3IFBvc2l0aW9uKDEsIDExKSksIHJhbmdlLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlRXJyb3JDb250YWluc0xvY2F0aW9uKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKCkucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFggeyAvLyBibGFoIikpOworCisgICAgICAgIFByb2JsZW0gcHJvYmxlbSA9IHJlc3VsdC5nZXRQcm9ibGVtKDApOworICAgICAgICBhc3NlcnRFcXVhbHMocmFuZ2UoMSwgOSwgMSwgMTcpLCBwcm9ibGVtLmdldExvY2F0aW9uKCkuZ2V0KCkudG9SYW5nZSgpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkIG9uZSBvZiAgXCI7XCIgXCI8XCIgXCJAXCIgXCJhYnN0cmFjdFwiIFwiYm9vbGVhblwiIFwiYnl0ZVwiIFwiY2hhclwiIFwiY2xhc3NcIiBcImRlZmF1bHRcIiBcImRvdWJsZVwiIFwiZW51bVwiIFwiZXhwb3J0c1wiIFwiZmluYWxcIiBcImZsb2F0XCIgXCJpbnRcIiBcImludGVyZmFjZVwiIFwibG9uZ1wiIFwibW9kdWxlXCIgXCJuYXRpdmVcIiBcIm9wZW5cIiBcIm9wZW5zXCIgXCJwcml2YXRlXCIgXCJwcm90ZWN0ZWRcIiBcInByb3ZpZGVzXCIgXCJwdWJsaWNcIiBcInJlcXVpcmVzXCIgXCJzaG9ydFwiIFwic3RhdGljXCIgXCJzdHJpY3RmcFwiIFwic3luY2hyb25pemVkXCIgXCJ0b1wiIFwidHJhbnNpZW50XCIgXCJ0cmFuc2l0aXZlXCIgXCJ1c2VzXCIgXCJ2b2lkXCIgXCJ2b2xhdGlsZVwiIFwid2l0aFwiIFwie1wiIFwifVwiIDxJREVOVElGSUVSPiIsIHByb2JsZW0uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihQYXJzZUV4Y2VwdGlvbi5jbGFzcywgcHJvYmxlbS5nZXRDYXVzZSgpLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlSW50ZXJzZWN0aW9uVHlwZSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiKFJ1bm5hYmxlICYgU2VyaWFsaXphYmxlKSAoKCkgLT4ge30pIjsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oY29kZSk7CisgICAgICAgIFR5cGUgdHlwZSA9IGV4cHJlc3Npb24uYXNDYXN0RXhwcigpLmdldFR5cGUoKTsKKworICAgICAgICBhc3NlcnRUcnVlKHR5cGUgaW5zdGFuY2VvZiBJbnRlcnNlY3Rpb25UeXBlKTsKKyAgICAgICAgSW50ZXJzZWN0aW9uVHlwZSBpbnRlcnNlY3Rpb25UeXBlID0gdHlwZS5hc0ludGVyc2VjdGlvblR5cGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGludGVyc2VjdGlvblR5cGUuZ2V0RWxlbWVudHMoKS5nZXQoMCkgaW5zdGFuY2VvZiBDbGFzc09ySW50ZXJmYWNlVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUnVubmFibGUiLCBpbnRlcnNlY3Rpb25UeXBlLmdldEVsZW1lbnRzKCkuZ2V0KDApLmFzQ2xhc3NPckludGVyZmFjZVR5cGUoKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydFRydWUoaW50ZXJzZWN0aW9uVHlwZS5nZXRFbGVtZW50cygpLmdldCgxKSBpbnN0YW5jZW9mIENsYXNzT3JJbnRlcmZhY2VUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXJpYWxpemFibGUiLCBpbnRlcnNlY3Rpb25UeXBlLmdldEVsZW1lbnRzKCkuZ2V0KDEpLmFzQ2xhc3NPckludGVyZmFjZVR5cGUoKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5nZU9mSW50ZXJzZWN0aW9uVHlwZSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgT2JqZWN0IGYoKSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAmIFNlcmlhbGl6YWJsZSkoYzEsIGMyKSAtPiBjMS5nZXRLZXkoKS5jb21wYXJlVG8oYzIuZ2V0S2V5KCkpOyAiICsgRU9MCisgICAgICAgICAgICAgICAgKyAifX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKS5hc1JldHVyblN0bXQoKTsKKyAgICAgICAgQ2FzdEV4cHIgY2FzdEV4cHIgPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKS5hc0Nhc3RFeHByKCk7CisgICAgICAgIFR5cGUgdHlwZSA9IGNhc3RFeHByLmdldFR5cGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJhbmdlKDMsIDEzLCAzLCA1NCksIHR5cGUuZ2V0UmFuZ2UoKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5nZU9mQ2FzdCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgT2JqZWN0IGYoKSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAmIFNlcmlhbGl6YWJsZSkoYzEsIGMyKSAtPiBjMS5nZXRLZXkoKS5jb21wYXJlVG8oYzIuZ2V0S2V5KCkpOyAiICsgRU9MCisgICAgICAgICAgICAgICAgKyAifX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKS5hc1JldHVyblN0bXQoKTsKKyAgICAgICAgQ2FzdEV4cHIgY2FzdEV4cHIgPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKS5hc0Nhc3RFeHByKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyYW5nZSgzLCAxMiwgMywgMTAxKSwgY2FzdEV4cHIuZ2V0UmFuZ2UoKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5nZU9mQ2FzdE5vbkludGVyc2VjdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgT2JqZWN0IGYoKSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAgICAgICAgICAgICAgICkoYzEsIGMyKSAtPiBjMS5nZXRLZXkoKS5jb21wYXJlVG8oYzIuZ2V0S2V5KCkpOyAiICsgRU9MCisgICAgICAgICAgICAgICAgKyAifX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKS5hc1JldHVyblN0bXQoKTsKKyAgICAgICAgQ2FzdEV4cHIgY2FzdEV4cHIgPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKS5hc0Nhc3RFeHByKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyYW5nZSgzLCAxMiwgMywgMTAxKSwgY2FzdEV4cHIuZ2V0UmFuZ2UoKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5nZU9mTGFtYmRhKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsiICsgRU9MCisgICAgICAgICAgICAgICAgKyAiICBPYmplY3QgZigpIHsiICsgRU9MCisgICAgICAgICAgICAgICAgKyAiICAgIHJldHVybiAoQ29tcGFyYXRvcjxNYXAuRW50cnk8SywgVj4+ICYgU2VyaWFsaXphYmxlKShjMSwgYzIpIC0+IGMxLmdldEtleSgpLmNvbXBhcmVUbyhjMi5nZXRLZXkoKSk7ICIgKyBFT0wKKyAgICAgICAgICAgICAgICArICJ9fSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZW1iZXIoMCkuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBSZXR1cm5TdG10IHJldHVyblN0bXQgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50KDApLmFzUmV0dXJuU3RtdCgpOworICAgICAgICBDYXN0RXhwciBjYXN0RXhwciA9IHJldHVyblN0bXQuZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFzQ2FzdEV4cHIoKTsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gY2FzdEV4cHIuZ2V0RXhwcmVzc2lvbigpLmFzTGFtYmRhRXhwcigpOworICAgICAgICBhc3NlcnRFcXVhbHMocmFuZ2UoMywgNTYsIDMsIDEwMSksIGxhbWJkYUV4cHIuZ2V0UmFuZ2UoKS5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiwgbGFtYmRhRXhwci5nZXRUb2tlblJhbmdlKCkuZ2V0KCkuZ2V0QmVnaW4oKS5nZXRLaW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4sIGxhbWJkYUV4cHIuZ2V0VG9rZW5SYW5nZSgpLmdldCgpLmdldEVuZCgpLmdldEtpbmQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5nZU9mTGFtYmRhQm9keSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgT2JqZWN0IGYoKSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAmIFNlcmlhbGl6YWJsZSkoYzEsIGMyKSAtPiBjMS5nZXRLZXkoKS5jb21wYXJlVG8oYzIuZ2V0S2V5KCkpOyAiICsgRU9MCisgICAgICAgICAgICAgICAgKyAifX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKS5hc1JldHVyblN0bXQoKTsKKyAgICAgICAgQ2FzdEV4cHIgY2FzdEV4cHIgPSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5nZXQoKS5hc0Nhc3RFeHByKCk7CisgICAgICAgIExhbWJkYUV4cHIgbGFtYmRhRXhwciA9IGNhc3RFeHByLmdldEV4cHJlc3Npb24oKS5hc0xhbWJkYUV4cHIoKTsKKyAgICAgICAgU3RhdGVtZW50IGxhbWJkYUJvZHkgPSBsYW1iZGFFeHByLmdldEJvZHkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJhbmdlKDMsIDY4LCAzLCAxMDEpLCBsYW1iZGFCb2R5LmdldFJhbmdlKCkuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdFN0b3JpbmdUb2tlbnMoKSB7CisgICAgICAgIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0U3RvcmVUb2tlbnMoZmFsc2UpKTsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXN1bHQuZ2V0VG9rZW5zKCkuaXNQcmVzZW50KCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gUGFyc2VQcm9ibGVtRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRyYWlsaW5nQ29kZUlzQW5FcnJvcigpIHsKKyAgICAgICAgSmF2YVBhcnNlci5wYXJzZUJsb2NrKCJ7fSBlZmlqcW9pZmpxZWZqIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0cmFpbGluZ1doaXRlc3BhY2VJc0lnbm9yZWQoKSB7CisgICAgICAgIEJsb2NrU3RtdCBibG9ja1N0bXQgPSBKYXZhUGFyc2VyLnBhcnNlQmxvY2soInt9IC8vIGhlbGxvIik7CisgICAgICAgIGFzc2VydEVxdWFscygie30iLCBibG9ja1N0bXQuZ2V0VG9rZW5SYW5nZSgpLmdldCgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXZlcnlUb2tlbkhhc0FDYXRlZ29yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCB0b2tlbkNvdW50ID0gR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy50b2tlbkltYWdlLmxlbmd0aDsKKyAgICAgICAgUGF0aCB0b2tlblR5cGVzUGF0aCA9IG1hdmVuTW9kdWxlUm9vdChKYXZhUGFyc2VyVGVzdC5jbGFzcykucmVzb2x2ZSgiLi4vamF2YXBhcnNlci1jb3JlL3NyYy9tYWluL2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuVHlwZXMuamF2YSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgdG9rZW5UeXBlc0N1ID0gSmF2YVBhcnNlci5wYXJzZSh0b2tlblR5cGVzUGF0aCk7CisgICAgICAgIC8vIC0xIHRvIHRha2Ugb2ZmIHRoZSBkZWZhdWx0OiBjYXNlLgorICAgICAgICBpbnQgc3dpdGNoRW50cmllcyA9IHRva2VuVHlwZXNDdS5maW5kQWxsKFN3aXRjaEVudHJ5U3RtdC5jbGFzcykuc2l6ZSgpLTE7CisgICAgICAgIC8vIFRoZSBhbW91bnQgb2YgImNhc2UgWFhYOiIgaW4gVG9rZW5UeXBlcy5qYXZhIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgYW1vdW50IG9mIHRva2VucyBKYXZhQ0Mga25vd3MgYWJvdXQ6CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbkNvdW50LCBzd2l0Y2hFbnRyaWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNpbmdJbml0aWFsaXplZEFuZFVuaXRpYWxpemVkVmFyc0luRm9yU3RtdCgpIHsKKyAgICAgICAgRm9yU3RtdCBmb3JTdG10ID0gSmF2YVBhcnNlci5wYXJzZVN0YXRlbWVudCgiZm9yKGludCBhLGI9MDs7KXt9IikuYXNGb3JTdG10KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBmb3JTdG10LmdldEluaXRpYWxpemF0aW9uKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZvclN0bXQuZ2V0SW5pdGlhbGl6YXRpb24oKS5nZXQoMCkuaXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvclN0bXQuZ2V0SW5pdGlhbGl6YXRpb24oKS5nZXQoMCkuYXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpLmdldFZhcmlhYmxlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGZvclN0bXQuZ2V0SW5pdGlhbGl6YXRpb24oKS5nZXQoMCkuYXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpLmdldFZhcmlhYmxlcygpLmdldCgwKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGZvclN0bXQuZ2V0SW5pdGlhbGl6YXRpb24oKS5nZXQoMCkuYXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpLmdldFZhcmlhYmxlcygpLmdldCgxKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpLmdldCgwKS5hc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkuZ2V0VmFyaWFibGVzKCkuZ2V0KDApLmdldEluaXRpYWxpemVyKCkuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpLmdldCgwKS5hc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkuZ2V0VmFyaWFibGVzKCkuZ2V0KDEpLmdldEluaXRpYWxpemVyKCkuaXNQcmVzZW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2luZ0luaXRpYWxpemVkQW5kVW5pdGlhbGl6ZWRWYXJzSW5Gb3JTdG10Q29tcGxleENhc2UoKSB7CisgICAgICAgIC8vIFNlZSBpc3N1ZSAxMjgxCisgICAgICAgIEZvclN0bXQgZm9yU3RtdCA9IEphdmFQYXJzZXIucGFyc2VTdGF0ZW1lbnQoImZvcihpbnQgaSwgaiA9IGFycmF5Mi5sZW5ndGggLSAxOzspe30iKS5hc0ZvclN0bXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZvclN0bXQuZ2V0SW5pdGlhbGl6YXRpb24oKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpLmdldCgwKS5pc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpLmdldCgwKS5hc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkuZ2V0VmFyaWFibGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpIiwgZm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpLmdldCgwKS5hc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkuZ2V0VmFyaWFibGVzKCkuZ2V0KDApLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqIiwgZm9yU3RtdC5nZXRJbml0aWFsaXphdGlvbigpLmdldCgwKS5hc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkuZ2V0VmFyaWFibGVzKCkuZ2V0KDEpLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBmb3JTdG10LmdldEluaXRpYWxpemF0aW9uKCkuZ2V0KDApLmFzVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKS5nZXRWYXJpYWJsZXMoKS5nZXQoMCkuZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBmb3JTdG10LmdldEluaXRpYWxpemF0aW9uKCkuZ2V0KDApLmFzVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKS5nZXRWYXJpYWJsZXMoKS5nZXQoMSkuZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFUb2tlblRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhVG9rZW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5YTc2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9KYXZhVG9rZW5UZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFUb2tlbi5DYXRlZ29yeS4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UucmFuZ2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBKYXZhVG9rZW5UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFGZXdUb2tlbnMoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PEV4cHJlc3Npb24+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKCkucGFyc2UoUGFyc2VTdGFydC5FWFBSRVNTSU9OLCBwcm92aWRlcigiMSArLyoyKi8xICIpKTsKKyAgICAgICAgSXRlcmF0b3I8SmF2YVRva2VuPiBpdGVyYXRvciA9IHJlc3VsdC5nZXRSZXN1bHQoKS5nZXQoKS5nZXRUb2tlblJhbmdlKCkuZ2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0VG9rZW4oIjEiLCByYW5nZSgxLCAxLCAxLCAxKSwgSU5URUdFUl9MSVRFUkFMLCBMSVRFUkFMLCBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICBhc3NlcnRUb2tlbigiICIsIHJhbmdlKDEsIDIsIDEsIDIpLCBTUEFDRSwgV0hJVEVTUEFDRV9OT19FT0wsIGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIGFzc2VydFRva2VuKCIrIiwgcmFuZ2UoMSwgMywgMSwgMyksIFBMVVMsIE9QRVJBVE9SLCBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICBhc3NlcnRUb2tlbigiLyoyKi8iLCByYW5nZSgxLCA0LCAxLCA4KSwgTVVMVElfTElORV9DT01NRU5ULCBDT01NRU5ULCBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICBhc3NlcnRUb2tlbigiMSIsIHJhbmdlKDEsIDksIDEsIDkpLCBJTlRFR0VSX0xJVEVSQUwsIExJVEVSQUwsIGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIGFzc2VydFRva2VuKCIgIiwgcmFuZ2UoMSwgMTAsIDEsIDEwKSwgU1BBQ0UsIFdISVRFU1BBQ0VfTk9fRU9MLCBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICBhc3NlcnRUb2tlbigiIiwgcmFuZ2UoMSwgMTAsIDEsIDEwKSwgRU9GLCBXSElURVNQQUNFX05PX0VPTCwgaXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBpdGVyYXRvci5oYXNOZXh0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUb2tlbihTdHJpbmcgaW1hZ2UsIFJhbmdlIHJhbmdlLCBpbnQga2luZCwgSmF2YVRva2VuLkNhdGVnb3J5IGNhdGVnb3J5LCBKYXZhVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGltYWdlLCB0b2tlbi5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmFuZ2UsIHRva2VuLmdldFJhbmdlKCkuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2luZCwgdG9rZW4uZ2V0S2luZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNhdGVnb3J5LCB0b2tlbi5nZXRDYXRlZ29yeSgpKTsKKyAgICAgICAgdG9rZW4uZ2V0TmV4dFRva2VuKCkuaWZQcmVzZW50KG50IC0+IGFzc2VydEVxdWFscyh0b2tlbiwgbnQuZ2V0UHJldmlvdXNUb2tlbigpLmdldCgpKSk7CisgICAgICAgIHRva2VuLmdldFByZXZpb3VzVG9rZW4oKS5pZlByZXNlbnQocHQgLT4gYXNzZXJ0RXF1YWxzKHRva2VuLCBwdC5nZXROZXh0VG9rZW4oKS5nZXQoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHRva2VuLmdldE5leHRUb2tlbigpLmlzUHJlc2VudCgpIHx8IHRva2VuLmdldFByZXZpb3VzVG9rZW4oKS5pc1ByZXNlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QUZld0ltYWdlc0ZvclRva2VuS2luZHMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiPSIsIG5ldyBKYXZhVG9rZW4oQVNTSUdOKS5nZXRUZXh0KCkpOworICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkbid0IGJlIGEgc3BhY2UuCisgICAgICAgIGFzc2VydEVxdWFscygiICIsIG5ldyBKYXZhVG9rZW4oRU9GKS5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiovIiwgbmV3IEphdmFUb2tlbihKQVZBRE9DX0NPTU1FTlQpLmdldFRleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2luZEVudW0oKSB7CisgICAgICAgIEphdmFUb2tlbi5LaW5kIGtpbmQgPSBKYXZhVG9rZW4uS2luZC52YWx1ZU9mKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVNTRVJUKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSmF2YVRva2VuLktpbmQuQVNTRVJULCBraW5kKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVNTRVJULCBraW5kLmdldEtpbmQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFkb2NQYXJzZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvSmF2YWRvY1BhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWUxMzhlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL0phdmFkb2NQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jLkphdmFkb2M7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuSmF2YWRvY0Jsb2NrVGFnOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jLmRlc2NyaXB0aW9uLkphdmFkb2NEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSmF2YWRvY1BhcnNlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZVNpbXBsZXN0Q29udGVudCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSmF2YWRvYyhKYXZhZG9jRGVzY3JpcHRpb24ucGFyc2VUZXh0KCJBIHNpbXBsZSBsaW5lIG9mIHRleHQiKSksCisgICAgICAgICAgICAgICAgSmF2YWRvY1BhcnNlci5wYXJzZSgiQSBzaW1wbGUgbGluZSBvZiB0ZXh0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VTaW5nbGVMaW5lV2l0aFNwYWNpbmcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSmF2YWRvYyhKYXZhZG9jRGVzY3JpcHRpb24ucGFyc2VUZXh0KCJUaGUgbGluZSBudW1iZXIgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIFRva2VuLiIpKSwKKyAgICAgICAgICAgICAgICBKYXZhZG9jUGFyc2VyLnBhcnNlKCIgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyBUb2tlbi4gIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VTaW5nbGVMaW5lV2l0aE5ld0xpbmVzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEphdmFkb2MoSmF2YWRvY0Rlc2NyaXB0aW9uLnBhcnNlVGV4dCgiVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uIikpLAorICAgICAgICAgICAgICAgIEphdmFkb2NQYXJzZXIucGFyc2UoRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLiIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29tbWVudFdpdGhOZXdMaW5lcygpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBFT0wgKworICAgICAgICAgICAgICAgICIgICAqIFRoZSB2ZXJzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgU2VyaWFsaXphYmxlIGNsYXNzLiIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAqIEluY3JlbWVudCBvbmx5IGlmIHRoZSA8aT5zZXJpYWxpemVkPC9pPiBmb3JtIG9mIHRoZSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAqIGNsYXNzIGNoYW5nZXMuIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICI7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSmF2YWRvYyhKYXZhZG9jRGVzY3JpcHRpb24ucGFyc2VUZXh0KCJUaGUgdmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIFNlcmlhbGl6YWJsZSBjbGFzcy4iICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbmNyZW1lbnQgb25seSBpZiB0aGUgPGk+c2VyaWFsaXplZDwvaT4gZm9ybSBvZiB0aGUiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBjaGFuZ2VzLiIpKSwKKyAgICAgICAgICAgICAgICBKYXZhZG9jUGFyc2VyLnBhcnNlKHRleHQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29tbWVudFdpdGhJbmRlbnRhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiUmV0dXJucyBhIG5ldyBUb2tlbiBvYmplY3QsIGJ5IGRlZmF1bHQuIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICogSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdSBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLiIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAqIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbihvZktpbmQsIGltYWdlKTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgKiIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBKYXZhZG9jKEphdmFkb2NEZXNjcmlwdGlvbi5wYXJzZVRleHQoIlJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIkhvd2V2ZXIsIGlmIHlvdSB3YW50LCB5b3UgY2FuIGNyZWF0ZSBhbmQgcmV0dXJuIHN1YmNsYXNzIG9iamVjdHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG9mS2luZC4iICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbihvZktpbmQsIGltYWdlKTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAidG8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LiBUaGVuIHlvdSBjYW4gY2FzdCBtYXRjaGVkVG9rZW4iKSksCisgICAgICAgICAgICAgICAgSmF2YWRvY1BhcnNlci5wYXJzZSh0ZXh0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUJsb2NrVGFnc0FuZEVtcHR5RGVzY3JpcHRpb24oKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gRU9MICsKKyAgICAgICAgICAgICAgICAiICAgKiBAZGVwcmVjYXRlZCIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAqIEBzZWUgI2dldEVuZENvbHVtbiIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAiOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEphdmFkb2MoSmF2YWRvY0Rlc2NyaXB0aW9uLnBhcnNlVGV4dCgiIikpCisgICAgICAgICAgICAgICAgLmFkZEJsb2NrVGFnKG5ldyBKYXZhZG9jQmxvY2tUYWcoSmF2YWRvY0Jsb2NrVGFnLlR5cGUuREVQUkVDQVRFRCwgIiIpKQorICAgICAgICAgICAgICAgIC5hZGRCbG9ja1RhZyhuZXcgSmF2YWRvY0Jsb2NrVGFnKEphdmFkb2NCbG9ja1RhZy5UeXBlLlNFRSwgIiNnZXRFbmRDb2x1bW4iKSksIEphdmFkb2NQYXJzZXIucGFyc2UodGV4dCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VCbG9ja1RhZ3NBbmRQcm92aWRlVGFnTmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGV4dCA9IEVPTCArCisgICAgICAgICAgICAgICAgIiAgICogQHVub2ZmaWNpYWwiICsgRU9MICsgIiAiICsKKyAgICAgICAgICAgICAgICAiICAgIjsKKworICAgICAgICBKYXZhZG9jIHVuZGVyVGVzdCA9IG5ldyBKYXZhZG9jKEphdmFkb2NEZXNjcmlwdGlvbi5wYXJzZVRleHQoIiIpKQorICAgICAgICAgICAgICAgIC5hZGRCbG9ja1RhZyhuZXcgSmF2YWRvY0Jsb2NrVGFnKCJ1bm9mZmljaWFsIiwgIiIpKTsKKworCisgICAgICAgIGFzc2VydEVxdWFscyh1bmRlclRlc3QsIEphdmFkb2NQYXJzZXIucGFyc2UoZXhwZWN0ZWRUZXh0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB1bmRlclRlc3QuZ2V0QmxvY2tUYWdzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bm9mZmljaWFsIiwgdW5kZXJUZXN0LmdldEJsb2NrVGFncygpLmdldCgwKS5nZXRUYWdOYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyc2VQYXJhbUJsb2NrVGFncygpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICogQWRkIGEgZmllbGQgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydCBvZiB0aGUgdHlwZSBpZiBuZWVkZWQiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICAqIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAgKiBAcGFyYW0gdHlwZUNsYXNzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMgbGlrZSB7QGxpbmsgTW9kaWZpZXIjUFVCTElDfSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICAiOworICAgICAgICBKYXZhZG9jIHJlcyA9IEphdmFkb2NQYXJzZXIucGFyc2UodGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSmF2YWRvYyhKYXZhZG9jRGVzY3JpcHRpb24ucGFyc2VUZXh0KCJBZGQgYSBmaWVsZCB0byB0aGlzIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0IG9mIHRoZSB0eXBlIGlmIG5lZWRlZCIpKQorICAgICAgICAgICAgICAgIC5hZGRCbG9ja1RhZyhKYXZhZG9jQmxvY2tUYWcuY3JlYXRlUGFyYW1CbG9ja1RhZygidHlwZUNsYXNzIiwgInRoZSB0eXBlIG9mIHRoZSBmaWVsZCIpKQorICAgICAgICAgICAgICAgIC5hZGRCbG9ja1RhZyhKYXZhZG9jQmxvY2tUYWcuY3JlYXRlUGFyYW1CbG9ja1RhZygibmFtZSIsICJ0aGUgbmFtZSBvZiB0aGUgZmllbGQiKSkKKyAgICAgICAgICAgICAgICAuYWRkQmxvY2tUYWcoSmF2YWRvY0Jsb2NrVGFnLmNyZWF0ZVBhcmFtQmxvY2tUYWcoIm1vZGlmaWVycyIsICJ0aGUgbW9kaWZpZXJzIGxpa2Uge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30iKSkKKyAgICAgICAgICAgICAgICAuYWRkQmxvY2tUYWcobmV3IEphdmFkb2NCbG9ja1RhZyhKYXZhZG9jQmxvY2tUYWcuVHlwZS5SRVRVUk4sICJ0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQiKSksIHJlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZU11bHRpbGluZVBhcmFtQmxvY2tUYWdzKCkgeworICAgICAgICBTdHJpbmcgdGV4dCA9IEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGlzIGFuZCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW1wb3J0IG9mIHRoZSB0eXBlIGlmIG5lZWRlZCIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICoiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICAqIEBwYXJhbSB0eXBlQ2xhc3MgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAgKiAgICAgY29udGludWVkIGluIGEgc2Vjb25kIGxpbmUiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzIGxpa2Uge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30iICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBjcmVhdGVkIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAgIjsKKyAgICAgICAgSmF2YWRvYyByZXMgPSBKYXZhZG9jUGFyc2VyLnBhcnNlKHRleHQpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEphdmFkb2MoSmF2YWRvY0Rlc2NyaXB0aW9uLnBhcnNlVGV4dCgiQWRkIGEgZmllbGQgdG8gdGhpcyBhbmQgYXV0b21hdGljYWxseSBhZGQgdGhlIGltcG9ydCBvZiB0aGUgdHlwZSBpZiBuZWVkZWQiKSkKKyAgICAgICAgICAgICAgICAuYWRkQmxvY2tUYWcoSmF2YWRvY0Jsb2NrVGFnLmNyZWF0ZVBhcmFtQmxvY2tUYWcoInR5cGVDbGFzcyIsICJ0aGUgdHlwZSBvZiB0aGUgZmllbGQiICsgRU9MICsgIiAgICBjb250aW51ZWQgaW4gYSBzZWNvbmQgbGluZSIpKQorICAgICAgICAgICAgICAgIC5hZGRCbG9ja1RhZyhKYXZhZG9jQmxvY2tUYWcuY3JlYXRlUGFyYW1CbG9ja1RhZygibmFtZSIsICJ0aGUgbmFtZSBvZiB0aGUgZmllbGQiKSkKKyAgICAgICAgICAgICAgICAuYWRkQmxvY2tUYWcoSmF2YWRvY0Jsb2NrVGFnLmNyZWF0ZVBhcmFtQmxvY2tUYWcoIm1vZGlmaWVycyIsICJ0aGUgbW9kaWZpZXJzIGxpa2Uge0BsaW5rIE1vZGlmaWVyI1BVQkxJQ30iKSkKKyAgICAgICAgICAgICAgICAuYWRkQmxvY2tUYWcobmV3IEphdmFkb2NCbG9ja1RhZyhKYXZhZG9jQmxvY2tUYWcuVHlwZS5SRVRVUk4sICJ0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGNyZWF0ZWQiKSksIHJlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGFydHNXaXRoQXN0ZXJpc2tFbXB0eSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBKYXZhZG9jUGFyc2VyLnN0YXJ0c1dpdGhBc3RlcmlzaygiIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RhcnRzV2l0aEFzdGVyaXNrTm9Bc3RlcmlzaygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBKYXZhZG9jUGFyc2VyLnN0YXJ0c1dpdGhBc3RlcmlzaygiIGNpYW8iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGFydHNXaXRoQXN0ZXJpc2tBdFRoZUJlZ2lubmluZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEphdmFkb2NQYXJzZXIuc3RhcnRzV2l0aEFzdGVyaXNrKCIqIGNpYW8iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGFydHNXaXRoQXN0ZXJpc2tBZnRlclNwYWNlcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEphdmFkb2NQYXJzZXIuc3RhcnRzV2l0aEFzdGVyaXNrKCIgICAqIGNpYW8iKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUGFyc2VFcnJvclJlY292ZXJ5VGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlRXJyb3JSZWNvdmVyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFjMjhiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlRXJyb3JSZWNvdmVyeVRlc3QuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuTGFiZWxlZFN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuUGFyc2VkbmVzcy5VTlBBUlNBQkxFOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFBhcnNlRXJyb3JSZWNvdmVyeVRlc3QgeworICAgIHByaXZhdGUgZmluYWwgSmF2YVBhcnNlciBwYXJzZXIgPSBuZXcgSmF2YVBhcnNlcigpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21waWxhdGlvblVuaXRSZWNvdmVyeSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VyLnBhcnNlKFBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoIlhYWCIpKS5nZXRSZXN1bHQoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVOUEFSU0FCTEUsIGN1LmdldFBhcnNlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJvZHlzdGF0ZW1lbnRTZW1pY29sb25SZWNvdmVyeSgpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gY3UgPSBwYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DTEFTU19CT0RZLCBwcm92aWRlcigiaW50IHgoKXtYIFggWDt9IikpLmdldFJlc3VsdCgpLmdldCgpLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgU3RhdGVtZW50IHh4eCA9IGN1LmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoVU5QQVJTQUJMRSwgeHh4LmdldFBhcnNlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJvZHlzdGF0ZW1lbnRDbG9zaW5nQnJhY2VSZWNvdmVyeSgpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gY3UgPSBwYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DTEFTU19CT0RZLCBwcm92aWRlcigiaW50IHgoKXtYIFggWH0iKSkuZ2V0UmVzdWx0KCkuZ2V0KCkuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBTdGF0ZW1lbnQgeHh4ID0gY3UuZ2V0Qm9keSgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoVU5QQVJTQUJMRSwgeHh4LmdldFBhcnNlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhYmVsZWRTdGF0ZW1lbnRTZW1pY29sb25SZWNvdmVyeSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2VyLnBhcnNlKFBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7aW50IHgoKXthYWE6WCBYIFg7fX0iKSkuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgICAgIExhYmVsZWRTdG10IHh4eCA9IGN1LmdldENsYXNzQnlOYW1lKCJYIikuZ2V0KCkuZ2V0TWV0aG9kcygpLmdldCgwKS5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKS5hc0xhYmVsZWRTdG10KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhVTlBBUlNBQkxFLCB4eHguZ2V0U3RhdGVtZW50KCkuZ2V0UGFyc2VkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZXJDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1BhcnNlckNvbmZpZ3VyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNDAwOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9QYXJzZXJDb25maWd1cmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuU1RBVEVNRU5UOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBQYXJzZXJDb25maWd1cmF0aW9uVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdG9yZU5vVG9rZW5zKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0U3RvcmVUb2tlbnMoZmFsc2UpKS5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYe30iKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0LmdldFJlc3VsdCgpLmdldCgpLmdldFRva2VuUmFuZ2UoKS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFJlc3VsdCgpLmdldCgpLmZpbmRBbGwoTm9kZS5jbGFzcykuc3RyZWFtKCkubm9uZU1hdGNoKG5vZGUgLT4gbm9kZS5nZXRUb2tlblJhbmdlKCkuaXNQcmVzZW50KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vUHJvYmxlbXNIZXJlKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9CisgICAgICAgICAgICAgICAgbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKFJBVykpCisgICAgICAgICAgICAgICAgICAgICAgICAucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigidHJ5e30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXN1bHQuaXNTdWNjZXNzZnVsKCkpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvYmxlbVRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Qcm9ibGVtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvYmxlbVRlc3QuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZS5yYW5nZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRJbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFByb2JsZW1UZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVHZXR0ZXJzKCkgeworICAgICAgICBQcm9ibGVtIHByb2JsZW0gPSBuZXcgUHJvYmxlbSgiUGFyc2UgZXJyb3IiLCBUb2tlblJhbmdlLklOVkFMSUQsIG5ldyBFeGNlcHRpb24oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRva2VuUmFuZ2UuSU5WQUxJRCwgcHJvYmxlbS5nZXRMb2NhdGlvbigpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJzZSBlcnJvciIsIHByb2JsZW0uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihFeGNlcHRpb24uY2xhc3MsIHByb2JsZW0uZ2V0Q2F1c2UoKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zZU1lc3NhZ2UoKSB7CisgICAgICAgIFByb2JsZW0gcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCJQYXJzZSBlcnJvciIsIFRva2VuUmFuZ2UuSU5WQUxJRCwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIobGluZSA/LGNvbCA/KSBQYXJzZSBlcnJvciIsIHByb2JsZW0uZ2V0VmVyYm9zZU1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zZU1lc3NhZ2VXaXRob3V0TG9jYXRpb24oKSB7CisgICAgICAgIFByb2JsZW0gcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCJQYXJzZSBlcnJvciIsIG51bGwsIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygiUGFyc2UgZXJyb3IiLCBwcm9ibGVtLmdldFZlcmJvc2VNZXNzYWdlKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUHJvdmlkZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb3ZpZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIzNTFhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Byb3ZpZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIFByb3ZpZGVyc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VQcm92aWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gUHJvdmlkZXJzLnJlc291cmNlUHJvdmlkZXIoImNvbS9naXRodWIvamF2YXBhcnNlci9pc3N1ZV9zYW1wbGVzL0lzc3VlMjkwLmphdmEudHh0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJvdmlkZXIpOworICAgICAgICBKYXZhUGFyc2VyIHBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKCk7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcGFyc2UgPSBwYXJzZXIucGFyc2UoUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklULCBwcm92aWRlcik7CisgICAgICAgIGFzc2VydFRydWUocGFyc2UuaXNTdWNjZXNzZnVsKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlUHJvdmlkZXJXaXRoV3JvbmdFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb3ZpZGVyIHByb3ZpZGVyID0gUHJvdmlkZXJzLnJlc291cmNlUHJvdmlkZXIoImNvbS9naXRodWIvamF2YXBhcnNlci9UZXN0RmlsZUlzbzg4NTkxLmphdmEiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm92aWRlcik7CisgICAgICAgIEphdmFQYXJzZXIgcGFyc2VyID0gbmV3IEphdmFQYXJzZXIoKTsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiBwYXJzZSA9IHBhcnNlci5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocGFyc2UuaXNTdWNjZXNzZnVsKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlUHJvdmlkZXJXaXRoRW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcm92aWRlciBwcm92aWRlciA9IFByb3ZpZGVycy5yZXNvdXJjZVByb3ZpZGVyKAorICAgICAgICAgICAgICAgICJjb20vZ2l0aHViL2phdmFwYXJzZXIvVGVzdEZpbGVJc284ODU5MS5qYXZhIiwKKyAgICAgICAgICAgICAgICBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKQorICAgICAgICApOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb3ZpZGVyKTsKKyAgICAgICAgSmF2YVBhcnNlciBwYXJzZXIgPSBuZXcgSmF2YVBhcnNlcigpOworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHBhcnNlID0gcGFyc2VyLnBhcnNlKFBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIpOworICAgICAgICBhc3NlcnRUcnVlKHBhcnNlLmlzU3VjY2Vzc2Z1bCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUmFuZ2VUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvUmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyYjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9SYW5nZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgUmFuZ2VUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYVJhbmdlQ29udGFpbnNJdHNlbGYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSYW5nZSByID0gUmFuZ2UucmFuZ2UoMSwgMSwgMywgMTApOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgci5jb250YWlucyhyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhUmFuZ2VEb2VzTm90U3RyaWN0bHlDb250YWluc0l0c2VsZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJhbmdlIHIgPSBSYW5nZS5yYW5nZSgxLCAxLCAzLCAxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgci5zdHJpY3RseUNvbnRhaW5zKHIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG92ZXJsYXBwaW5nQnV0Tm90Q29udGFpbmVkUmFuZ2VzQXJlTm90T25Db250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJhbmdlIHIxID0gUmFuZ2UucmFuZ2UoMSwgMSwgMywgMTApOworICAgICAgICBSYW5nZSByMiA9IFJhbmdlLnJhbmdlKDIsIDEsIDcsIDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByMS5jb250YWlucyhyMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHIyLmNvbnRhaW5zKHIxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvdmVybGFwcGluZ0J1dE5vdENvbnRhaW5lZFJhbmdlc0FyZU5vdE9uU3RyaWN0bHlDb250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJhbmdlIHIxID0gUmFuZ2UucmFuZ2UoMSwgMSwgMywgMTApOworICAgICAgICBSYW5nZSByMiA9IFJhbmdlLnJhbmdlKDIsIDEsIDcsIDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByMS5zdHJpY3RseUNvbnRhaW5zKHIyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcjIuc3RyaWN0bHlDb250YWlucyhyMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdW5yZWxhdGVkUmFuZ2VzQXJlTm90T25Db250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJhbmdlIHIxID0gUmFuZ2UucmFuZ2UoMSwgMSwgMywgMTApOworICAgICAgICBSYW5nZSByMiA9IFJhbmdlLnJhbmdlKDUsIDEsIDcsIDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByMS5jb250YWlucyhyMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHIyLmNvbnRhaW5zKHIxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB1bnJlbGF0ZWRSYW5nZXNBcmVOb3RPblN0cmljdGx5Q29udGFpbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSYW5nZSByMSA9IFJhbmdlLnJhbmdlKDEsIDEsIDMsIDEwKTsKKyAgICAgICAgUmFuZ2UgcjIgPSBSYW5nZS5yYW5nZSg1LCAxLCA3LCAxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcjEuc3RyaWN0bHlDb250YWlucyhyMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHIyLnN0cmljdGx5Q29udGFpbnMocjEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0cmljdGx5Q29udGFpbmVkUmFuZ2VzT25Db250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJhbmdlIHIxID0gUmFuZ2UucmFuZ2UoMSwgMSwgMywgMTApOworICAgICAgICBSYW5nZSByMiA9IFJhbmdlLnJhbmdlKDIsIDEsIDMsIDQpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcjEuY29udGFpbnMocjIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByMi5jb250YWlucyhyMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RyaWN0bHlDb250YWluZWRSYW5nZXNPblN0cmljdGx5Q29udGFpbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSYW5nZSByMSA9IFJhbmdlLnJhbmdlKDEsIDEsIDMsIDEwKTsKKyAgICAgICAgUmFuZ2UgcjIgPSBSYW5nZS5yYW5nZSgyLCAxLCAzLCA0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHIxLnN0cmljdGx5Q29udGFpbnMocjIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByMi5zdHJpY3RseUNvbnRhaW5zKHIxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb250YWluc0NvbnNpZGVyTGluZXMoKSB7CisgICAgICAgIFJhbmdlIHIxID0gUmFuZ2UucmFuZ2UoMjIsIDksIDIyLCAyOSk7CisgICAgICAgIFJhbmdlIHIyID0gUmFuZ2UucmFuZ2UoMjYsIDE5LCAyNiwgMjgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHIxLmNvbnRhaW5zKHIyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcjIuY29udGFpbnMocjEpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlblJhbmdlVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rva2VuUmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2N2M4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9Ub2tlblJhbmdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitwdWJsaWMgY2xhc3MgVG9rZW5SYW5nZVRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9TdHJpbmdXb3JrcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWCB7XG5cdFgoKXtcbi8vIGhlbGxvXG59XG59Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiWCgpe1xuLy8gaGVsbG9cbn0iLCBjdS5nZXRDbGFzc0J5TmFtZSgiWCIpLmdldCgpLmdldERlZmF1bHRDb25zdHJ1Y3RvcigpLmdldCgpLmdldFRva2VuUmFuZ2UoKS5nZXQoKS50b1N0cmluZygpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Db21waWxhdGlvblVuaXRUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0NvbXBpbGF0aW9uVW5pdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE3ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Db21waWxhdGlvblVuaXRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Q7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2U7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLm1hdmVuTW9kdWxlUm9vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlNTc4VGhlRmlyc3RDb21tZW50SXNXaXRoaW5UaGVDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBwYXJzZSgiLy8gVGhpcyBpcyBteSBjbGFzcywgd2l0aCBteSBjb21tZW50XG4iICsKKyAgICAgICAgICAgICAgICAiY2xhc3MgQSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHN0YXRpYyBpbnQgYTtcbiIgKworICAgICAgICAgICAgICAgICJ9Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbXBpbGF0aW9uVW5pdC5nZXRBbGxDb250YWluZWRDb21tZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U291cmNlUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggc291cmNlUm9vdCA9IG1hdmVuTW9kdWxlUm9vdChDb21waWxhdGlvblVuaXRUZXN0LmNsYXNzKS5yZXNvbHZlKFBhdGhzLmdldCgic3JjIiwgInRlc3QiLCAicmVzb3VyY2VzIikpLm5vcm1hbGl6ZSgpOworICAgICAgICBQYXRoIHRlc3RGaWxlID0gc291cmNlUm9vdC5yZXNvbHZlKFBhdGhzLmdldCgiY29tIiwgImdpdGh1YiIsICJqYXZhcGFyc2VyIiwgInN0b3JhZ2UiLCAiWi5qYXZhIikpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKHRlc3RGaWxlKTsKKyAgICAgICAgUGF0aCBzb3VyY2VSb290MSA9IGN1LmdldFN0b3JhZ2UoKS5nZXQoKS5nZXRTb3VyY2VSb290KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2VSb290LCBzb3VyY2VSb290MSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTb3VyY2VSb290V2l0aEJhZFBhY2thZ2VEZWNsYXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggc291cmNlUm9vdCA9IG1hdmVuTW9kdWxlUm9vdChDb21waWxhdGlvblVuaXRUZXN0LmNsYXNzKS5yZXNvbHZlKFBhdGhzLmdldCgic3JjIiwgInRlc3QiLCAicmVzb3VyY2VzIikpLm5vcm1hbGl6ZSgpOworICAgICAgICBQYXRoIHRlc3RGaWxlID0gc291cmNlUm9vdC5yZXNvbHZlKFBhdGhzLmdldCgiY29tIiwgImdpdGh1YiIsICJqYXZhcGFyc2VyIiwgInN0b3JhZ2UiLCAiQS5qYXZhIikpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKHRlc3RGaWxlKTsKKyAgICAgICAgY3UuZ2V0U3RvcmFnZSgpLmdldCgpLmdldFNvdXJjZVJvb3QoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTb3VyY2VSb290SW5EZWZhdWx0UGFja2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggc291cmNlUm9vdCA9IG1hdmVuTW9kdWxlUm9vdChDb21waWxhdGlvblVuaXRUZXN0LmNsYXNzKS5yZXNvbHZlKFBhdGhzLmdldCgic3JjIiwgInRlc3QiLCAicmVzb3VyY2VzIiwgImNvbSIsICJnaXRodWIiLCAiamF2YXBhcnNlciIsICJzdG9yYWdlIikpLm5vcm1hbGl6ZSgpOworICAgICAgICBQYXRoIHRlc3RGaWxlID0gc291cmNlUm9vdC5yZXNvbHZlKFBhdGhzLmdldCgiQi5qYXZhIikpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKHRlc3RGaWxlKTsKKyAgICAgICAgUGF0aCBzb3VyY2VSb290MSA9IGN1LmdldFN0b3JhZ2UoKS5nZXQoKS5nZXRTb3VyY2VSb290KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2VSb290LCBzb3VyY2VSb290MSk7CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFByaW1hcnlUeXBlTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggc291cmNlUm9vdCA9IG1hdmVuTW9kdWxlUm9vdChDb21waWxhdGlvblVuaXRUZXN0LmNsYXNzKS5yZXNvbHZlKFBhdGhzLmdldCgic3JjIiwgInRlc3QiLCAicmVzb3VyY2VzIikpLm5vcm1hbGl6ZSgpOworICAgICAgICBQYXRoIHRlc3RGaWxlID0gc291cmNlUm9vdC5yZXNvbHZlKFBhdGhzLmdldCgiY29tIiwgImdpdGh1YiIsICJqYXZhcGFyc2VyIiwgInN0b3JhZ2UiLCAiUHJpbWFyeVR5cGUuamF2YSIpKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZSh0ZXN0RmlsZSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoIlByaW1hcnlUeXBlIiwgY3UuZ2V0UHJpbWFyeVR5cGVOYW1lKCkuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vUHJpbWFyeVR5cGVOYW1lKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBQcmltYXJ5VHlwZXt9Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjdS5nZXRQcmltYXJ5VHlwZU5hbWUoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFByaW1hcnlUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0aCBzb3VyY2VSb290ID0gbWF2ZW5Nb2R1bGVSb290KENvbXBpbGF0aW9uVW5pdFRlc3QuY2xhc3MpLnJlc29sdmUoUGF0aHMuZ2V0KCJzcmMiLCAidGVzdCIsICJyZXNvdXJjZXMiKSkubm9ybWFsaXplKCk7CisgICAgICAgIFBhdGggdGVzdEZpbGUgPSBzb3VyY2VSb290LnJlc29sdmUoUGF0aHMuZ2V0KCJjb20iLCAiZ2l0aHViIiwgImphdmFwYXJzZXIiLCAic3RvcmFnZSIsICJQcmltYXJ5VHlwZS5qYXZhIikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKHRlc3RGaWxlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlByaW1hcnlUeXBlIiwgICAgIGN1LmdldFByaW1hcnlUeXBlKCkuZ2V0KCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vUHJpbWFyeVR5cGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYXRoIHNvdXJjZVJvb3QgPSBtYXZlbk1vZHVsZVJvb3QoQ29tcGlsYXRpb25Vbml0VGVzdC5jbGFzcykucmVzb2x2ZShQYXRocy5nZXQoInNyYyIsICJ0ZXN0IiwgInJlc291cmNlcyIpKS5ub3JtYWxpemUoKTsKKyAgICAgICAgUGF0aCB0ZXN0RmlsZSA9IHNvdXJjZVJvb3QucmVzb2x2ZShQYXRocy5nZXQoImNvbSIsICJnaXRodWIiLCAiamF2YXBhcnNlciIsICJzdG9yYWdlIiwgIlByaW1hcnlUeXBlMi5qYXZhIikpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKHRlc3RGaWxlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGN1LmdldFByaW1hcnlUeXBlKCkuaXNQcmVzZW50KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9EYXRhS2V5VGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9EYXRhS2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTYzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L0RhdGFLZXlUZXN0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zRm9ySW50ZXJmYWNlVHlwZXMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIERhdGFLZXlUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFLZXk8U3RyaW5nPiBBQkMgPSBuZXcgRGF0YUtleTxTdHJpbmc+KCkgeworICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhS2V5PExpc3Q8U3RyaW5nPj4gTElTVFkgPSBuZXcgRGF0YUtleTxMaXN0PFN0cmluZz4+KCkgeworICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhS2V5PExpc3Q8U3RyaW5nPj4gRElORyA9IG5ldyBEYXRhS2V5PExpc3Q8U3RyaW5nPj4oKSB7CisgICAgfTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkQUZld0tleXNBbmRTZWVJZlRoZXlBcmVTdG9yZWRDb3JyZWN0bHkoKSB7CisgICAgICAgIE5vZGUgbm9kZSA9IG5ldyBTaW1wbGVOYW1lKCk7CisKKyAgICAgICAgbm9kZS5zZXREYXRhKEFCQywgIkh1cnJheSEiKTsKKyAgICAgICAgbm9kZS5zZXREYXRhKExJU1RZLCBBcnJheXMuYXNMaXN0KCJhIiwgImIiKSk7CisgICAgICAgIG5vZGUuc2V0RGF0YShBQkMsICJ3MDB0Iik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChub2RlLmdldERhdGEoQUJDKSkuY29udGFpbnMoIncwMHQiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChub2RlLmdldERhdGEoTElTVFkpKS5jb250YWluc0V4YWN0bHkoImEiLCAiYiIpOworICAgICAgICBhc3NlcnRUaGF0KG5vZGUuZ2V0RGF0YShESU5HKSkuaXNOdWxsKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGVMaXN0VGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlTGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRkNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5Bc3RPYnNlcnZlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdC5ub2RlTGlzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIE5vZGVMaXN0VGVzdCB7CisKKyAgICBwcml2YXRlIEFzdE9ic2VydmVyIGNyZWF0ZU9ic2VydmVyKExpc3Q8U3RyaW5nPiBjaGFuZ2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXN0T2JzZXJ2ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoU3RyaW5nLmZvcm1hdCgiY2hhbmdlIG9mIHByb3BlcnR5ICVzIGZvciAlczogZnJvbSAnJXMnIHRvICclcyciLCBwcm9wZXJ0eSwgb2JzZXJ2ZWROb2RlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJlbnRDaGFuZ2UoTm9kZSBvYnNlcnZlZE5vZGUsIE5vZGUgcHJldmlvdXNQYXJlbnQsIE5vZGUgbmV3UGFyZW50KSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoU3RyaW5nLmZvcm1hdCgic2V0dGluZyBwYXJlbnQgZm9yICVzOiB3YXMgJXMsIG5vdyBpcyAlcyIsIG9ic2VydmVkTm9kZSwgcHJldmlvdXNQYXJlbnQsIG5ld1BhcmVudCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxpc3RDaGFuZ2UoTm9kZUxpc3Qgb2JzZXJ2ZWROb2RlLCBMaXN0Q2hhbmdlVHlwZSB0eXBlLCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoU3RyaW5nLmZvcm1hdCgiJyVzJyAlcyBpbiBsaXN0IGF0ICVkIiwgbm9kZUFkZGVkT3JSZW1vdmVkLCB0eXBlLCBpbmRleCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxpc3RSZXBsYWNlbWVudChOb2RlTGlzdCBvYnNlcnZlZE5vZGUsIGludCBpbmRleCwgTm9kZSBvbGROb2RlLCBOb2RlIG5ld05vZGUpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VzLmFkZChTdHJpbmcuZm9ybWF0KCInJXMnICVzIGluIGxpc3QgYXQgJWQiLCBvbGROb2RlLCBMaXN0Q2hhbmdlVHlwZS5SRU1PVkFMLCBpbmRleCkpOworICAgICAgICAgICAgICAgIGNoYW5nZXMuYWRkKFN0cmluZy5mb3JtYXQoIiclcycgJXMgaW4gbGlzdCBhdCAlZCIsIG5ld05vZGUsIExpc3RDaGFuZ2VUeXBlLkFERElUSU9OLCBpbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgRmllbGREZWNsYXJhdGlvbiBjcmVhdGVJbnRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBQcmltaXRpdmVUeXBlLmludFR5cGUoKSwgbmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGxXaXRob3V0SW5kZXgoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFuZ2VzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oaW50IHApIHsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2QgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBjZC5nZXRNZW1iZXJzKCkucmVnaXN0ZXIoY3JlYXRlT2JzZXJ2ZXIoY2hhbmdlcykpOworCisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChjcmVhdGVJbnRGaWVsZCgiYSIpLCBjcmVhdGVJbnRGaWVsZCgiYiIpLCBjcmVhdGVJbnRGaWVsZCgiYyIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCInaW50IGE7JyBBRERJVElPTiBpbiBsaXN0IGF0IDEiLAorICAgICAgICAgICAgICAgICInaW50IGI7JyBBRERJVElPTiBpbiBsaXN0IGF0IDIiLAorICAgICAgICAgICAgICAgICInaW50IGM7JyBBRERJVElPTiBpbiBsaXN0IGF0IDMiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGxXaXRoSW5kZXgoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFuZ2VzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oaW50IHApIHsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2QgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBjZC5nZXRNZW1iZXJzKCkucmVnaXN0ZXIoY3JlYXRlT2JzZXJ2ZXIoY2hhbmdlcykpOworCisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5hZGRBbGwoMCwgQXJyYXlzLmFzTGlzdChjcmVhdGVJbnRGaWVsZCgiYSIpLCBjcmVhdGVJbnRGaWVsZCgiYiIpLCBjcmVhdGVJbnRGaWVsZCgiYyIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCInaW50IGE7JyBBRERJVElPTiBpbiBsaXN0IGF0IDAiLAorICAgICAgICAgICAgICAgICInaW50IGI7JyBBRERJVElPTiBpbiBsaXN0IGF0IDEiLAorICAgICAgICAgICAgICAgICInaW50IGM7JyBBRERJVElPTiBpbiBsaXN0IGF0IDIiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgYTsgaW50IGI7IGludCBjOyB9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNkID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlZ2lzdGVyKGNyZWF0ZU9ic2VydmVyKGNoYW5nZXMpKTsKKworICAgICAgICBjZC5nZXRNZW1iZXJzKCkuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIidpbnQgYTsnIFJFTU9WQUwgaW4gbGlzdCBhdCAwIiwKKyAgICAgICAgICAgICAgICAiJ2ludCBiOycgUkVNT1ZBTCBpbiBsaXN0IGF0IDAiLAorICAgICAgICAgICAgICAgICInaW50IGM7JyBSRU1PVkFMIGluIGxpc3QgYXQgMCIpLCBjaGFuZ2VzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNldCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgYTsgaW50IGI7IGludCBjOyB9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNkID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlZ2lzdGVyKGNyZWF0ZU9ic2VydmVyKGNoYW5nZXMpKTsKKworICAgICAgICBjZC5nZXRNZW1iZXJzKCkuc2V0KDEsIGNyZWF0ZUludEZpZWxkKCJkIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiJ2ludCBiOycgUkVNT1ZBTCBpbiBsaXN0IGF0IDEiLAorICAgICAgICAgICAgICAgICInaW50IGQ7JyBBRERJVElPTiBpbiBsaXN0IGF0IDEiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb2RlKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gY2hhbmdlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IGludCBhOyBpbnQgYjsgaW50IGM7IGludCBkOyBpbnQgZTsgfSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjZCA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCk7CisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5yZWdpc3RlcihjcmVhdGVPYnNlcnZlcihjaGFuZ2VzKSk7CisKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlbW92ZShjZC5nZXRGaWVsZEJ5TmFtZSgiYyIpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIidpbnQgYzsnIFJFTU9WQUwgaW4gbGlzdCBhdCAyIiksIGNoYW5nZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlyc3ROb2RlKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gY2hhbmdlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IGludCBhOyBpbnQgYjsgaW50IGM7IGludCBkOyBpbnQgZTsgfSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjZCA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCk7CisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5yZWdpc3RlcihjcmVhdGVPYnNlcnZlcihjaGFuZ2VzKSk7CisKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlbW92ZUZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCInaW50IGE7JyBSRU1PVkFMIGluIGxpc3QgYXQgMCIpLCBjaGFuZ2VzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNkLmdldE1lbWJlcnMoKS5zaXplKCksIDQpOworCisgICAgICAgIGZvciAoaW50IGkgPSAzOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjZC5nZXRNZW1iZXJzKCkucmVtb3ZlRmlyc3QoKSAhPSBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZC5nZXRNZW1iZXJzKCkuc2l6ZSgpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhjZC5nZXRNZW1iZXJzKCkuc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxhc3ROb2RlKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gY2hhbmdlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IGludCBhOyBpbnQgYjsgaW50IGM7IGludCBkOyBpbnQgZTsgfSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjZCA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCk7CisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5yZWdpc3RlcihjcmVhdGVPYnNlcnZlcihjaGFuZ2VzKSk7CisKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlbW92ZUxhc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIidpbnQgZTsnIFJFTU9WQUwgaW4gbGlzdCBhdCA0IiksIGNoYW5nZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2QuZ2V0TWVtYmVycygpLnNpemUoKSwgNCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNkLmdldE1lbWJlcnMoKS5yZW1vdmVMYXN0KCkgIT0gbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2QuZ2V0TWVtYmVycygpLnNpemUoKSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoY2QuZ2V0TWVtYmVycygpLnNpemUoKSwgMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3QoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFuZ2VzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgaW50IGE7IGludCBiOyBpbnQgYzsgaW50IGQ7IGludCBlOyB9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNkID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlZ2lzdGVyKGNyZWF0ZU9ic2VydmVyKGNoYW5nZXMpKTsKKworICAgICAgICBjZC5nZXRNZW1iZXJzKCkucmVtb3ZlKCJoaSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgpLCBjaGFuZ2VzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgYTsgaW50IGI7IGludCBjOyBpbnQgZDsgaW50IGU7IH0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2QgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBjZC5nZXRNZW1iZXJzKCkucmVnaXN0ZXIoY3JlYXRlT2JzZXJ2ZXIoY2hhbmdlcykpOworCisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChjZC5nZXRGaWVsZEJ5TmFtZSgiYiIpLmdldCgpLCAiZm9vIiwgY2QuZ2V0RmllbGRCeU5hbWUoImQiKS5nZXQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiJ2ludCBiOycgUkVNT1ZBTCBpbiBsaXN0IGF0IDEiLAorICAgICAgICAgICAgICAgICInaW50IGQ7JyBSRU1PVkFMIGluIGxpc3QgYXQgMiIpLCBjaGFuZ2VzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJldGFpbkFsbCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgYTsgaW50IGI7IGludCBjOyBpbnQgZDsgaW50IGU7IH0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2QgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBjZC5nZXRNZW1iZXJzKCkucmVnaXN0ZXIoY3JlYXRlT2JzZXJ2ZXIoY2hhbmdlcykpOworCisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5yZXRhaW5BbGwoQXJyYXlzLmFzTGlzdChjZC5nZXRGaWVsZEJ5TmFtZSgiYiIpLmdldCgpLCAiZm9vIiwgY2QuZ2V0RmllbGRCeU5hbWUoImQiKS5nZXQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiJ2ludCBhOycgUkVNT1ZBTCBpbiBsaXN0IGF0IDAiLAorICAgICAgICAgICAgICAgICInaW50IGM7JyBSRU1PVkFMIGluIGxpc3QgYXQgMSIsCisgICAgICAgICAgICAgICAgIidpbnQgZTsnIFJFTU9WQUwgaW4gbGlzdCBhdCAyIiksIGNoYW5nZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjZUFsbCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgYTsgaW50IGI7IGludCBjOyB9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNkID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlZ2lzdGVyKGNyZWF0ZU9ic2VydmVyKGNoYW5nZXMpKTsKKworICAgICAgICBjZC5nZXRNZW1iZXJzKCkucmVwbGFjZUFsbChib2R5RGVjbGFyYXRpb24gLT4geworICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbiBjbG9uZSA9IChGaWVsZERlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb24uY2xvbmUoKTsKKyAgICAgICAgICAgIFNpbXBsZU5hbWUgaWQgPSBjbG9uZS5nZXRWYXJpYWJsZSgwKS5nZXROYW1lKCk7CisgICAgICAgICAgICBpZC5zZXRJZGVudGlmaWVyKGlkLmdldElkZW50aWZpZXIoKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCInaW50IGE7JyBSRU1PVkFMIGluIGxpc3QgYXQgMCIsICInaW50IEE7JyBBRERJVElPTiBpbiBsaXN0IGF0IDAiLAorICAgICAgICAgICAgICAgICInaW50IGI7JyBSRU1PVkFMIGluIGxpc3QgYXQgMSIsICInaW50IEI7JyBBRERJVElPTiBpbiBsaXN0IGF0IDEiLAorICAgICAgICAgICAgICAgICInaW50IGM7JyBSRU1PVkFMIGluIGxpc3QgYXQgMiIsICInaW50IEM7JyBBRERJVElPTiBpbiBsaXN0IGF0IDIiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJZigpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgYTsgaW50IGxvbmdOYW1lOyBpbnQgYzsgfSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjZCA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCk7CisgICAgICAgIGNkLmdldE1lbWJlcnMoKS5yZWdpc3RlcihjcmVhdGVPYnNlcnZlcihjaGFuZ2VzKSk7CisKKyAgICAgICAgY2QuZ2V0TWVtYmVycygpLnJlbW92ZUlmKG0gLT4gKChGaWVsZERlY2xhcmF0aW9uKSBtKS5nZXRWYXJpYWJsZSgwKS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmxlbmd0aCgpID4gMyk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCInaW50IGxvbmdOYW1lOycgUkVNT1ZBTCBpbiBsaXN0IGF0IDEiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlKCkgeworICAgICAgICBmaW5hbCBOb2RlTGlzdDxOYW1lPiBsaXN0ID0gbm9kZUxpc3QobmV3IE5hbWUoImEiKSwgbmV3IE5hbWUoImIiKSwgbmV3IE5hbWUoImMiKSk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXBsYWNlZCA9IGxpc3QucmVwbGFjZShuZXcgTmFtZSgiYiIpLCBuZXcgTmFtZSgieiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVwbGFjZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBsaXN0LmdldCgwKS5hc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ6IiwgbGlzdC5nZXQoMSkuYXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGxpc3QuZ2V0KDIpLmFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9TdHJpbmdUZXN0KCkgeworICAgICAgICBmaW5hbCBOb2RlTGlzdDxOYW1lPiBsaXN0ID0gbm9kZUxpc3QobmV3IE5hbWUoImFiYyIpLCBuZXcgTmFtZSgiYmNkIiksIG5ldyBOYW1lKCJjZGUiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbYWJjLCBiY2QsIGNkZV0iLCBsaXN0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkRmlyc3QoKSB7CisgICAgICAgIGZpbmFsIE5vZGVMaXN0PE5hbWU+IGxpc3QgPSBub2RlTGlzdChuZXcgTmFtZSgiYWJjIiksIG5ldyBOYW1lKCJiY2QiKSwgbmV3IE5hbWUoImNkZSIpKTsKKworICAgICAgICBsaXN0LmFkZEZpcnN0KG5ldyBOYW1lKCJ4eHgiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbeHh4LCBhYmMsIGJjZCwgY2RlXSIsIGxpc3QudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRMYXN0KCkgeworICAgICAgICBmaW5hbCBOb2RlTGlzdDxOYW1lPiBsaXN0ID0gbm9kZUxpc3QobmV3IE5hbWUoImFiYyIpLCBuZXcgTmFtZSgiYmNkIiksIG5ldyBOYW1lKCJjZGUiKSk7CisKKyAgICAgICAgbGlzdC5hZGRMYXN0KG5ldyBOYW1lKCJ4eHgiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbYWJjLCBiY2QsIGNkZSwgeHh4XSIsIGxpc3QudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRCZWZvcmUoKSB7CisgICAgICAgIE5hbWUgbiA9IG5ldyBOYW1lKCJiY2QiKTsKKyAgICAgICAgZmluYWwgTm9kZUxpc3Q8TmFtZT4gbGlzdCA9IG5vZGVMaXN0KG5ldyBOYW1lKCJhYmMiKSwgbiwgbmV3IE5hbWUoImNkZSIpKTsKKworICAgICAgICBsaXN0LmFkZEJlZm9yZShuZXcgTmFtZSgieHh4IiksIG4pOworCisgICAgICAgIGFzc2VydEVxdWFscygiW2FiYywgeHh4LCBiY2QsIGNkZV0iLCBsaXN0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkQWZ0ZXIoKSB7CisgICAgICAgIE5hbWUgbiA9IG5ldyBOYW1lKCJiY2QiKTsKKyAgICAgICAgZmluYWwgTm9kZUxpc3Q8TmFtZT4gbGlzdCA9IG5vZGVMaXN0KG5ldyBOYW1lKCJhYmMiKSwgbiwgbmV3IE5hbWUoImNkZSIpKTsKKworICAgICAgICBsaXN0LmFkZEFmdGVyKG5ldyBOYW1lKCJ4eHgiKSwgbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbYWJjLCBiY2QsIHh4eCwgY2RlXSIsIGxpc3QudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRCZWZvcmVGaXJzdCgpIHsKKyAgICAgICAgTmFtZSBhYmMgPSBuZXcgTmFtZSgiYWJjIik7CisgICAgICAgIGZpbmFsIE5vZGVMaXN0PE5hbWU+IGxpc3QgPSBub2RlTGlzdChhYmMsIG5ldyBOYW1lKCJiY2QiKSwgbmV3IE5hbWUoImNkZSIpKTsKKworICAgICAgICBsaXN0LmFkZEJlZm9yZShuZXcgTmFtZSgieHh4IiksIGFiYyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbeHh4LCBhYmMsIGJjZCwgY2RlXSIsIGxpc3QudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRBZnRlckxhc3QoKSB7CisgICAgICAgIE5hbWUgY2RlID0gbmV3IE5hbWUoImNkZSIpOworICAgICAgICBmaW5hbCBOb2RlTGlzdDxOYW1lPiBsaXN0ID0gbm9kZUxpc3QobmV3IE5hbWUoImFiYyIpLCBuZXcgTmFtZSgiYmNkIiksIGNkZSk7CisKKyAgICAgICAgbGlzdC5hZGRBZnRlcihuZXcgTmFtZSgieHh4IiksIGNkZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbYWJjLCBiY2QsIGNkZSwgeHh4XSIsIGxpc3QudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlUG9zaXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGVQb3NpdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UxMTZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9Ob2RlUG9zaXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIE5vZGVQb3NpdGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBMaXN0PE5vZGU+IGdldEFsbE5vZGVzKE5vZGUgbm9kZSkgeworICAgICAgICBMaXN0PE5vZGU+IG5vZGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBub2Rlcy5hZGQobm9kZSk7CisgICAgICAgIG5vZGUuZ2V0Q2hpbGROb2RlcygpLmZvckVhY2goYyAtPiBub2Rlcy5hZGRBbGwoZ2V0QWxsTm9kZXMoYykpKTsKKyAgICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFja2FnZVByb3RlY3RlZENsYXNzU2hvdWxkSGF2ZVBvc2l0aW9uU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlQWxsTm9kZXNIYXZlVmFsaWRCZWdpblBvc2l0aW9uKCJjbGFzcyBBIHsgfSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFja2FnZVByb3RlY3RlZEludGVyZmFjZVNob3VsZEhhdmVQb3NpdGlvblNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZUFsbE5vZGVzSGF2ZVZhbGlkQmVnaW5Qb3NpdGlvbigiaW50ZXJmYWNlIEEgeyB9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYWNrYWdlUHJvdGVjdGVkRW51bVNob3VsZEhhdmVQb3NpdGlvblNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZUFsbE5vZGVzSGF2ZVZhbGlkQmVnaW5Qb3NpdGlvbigiZW51bSBBIHsgfSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFja2FnZVByb3RlY3RlZEFubm90YXRpb25TaG91bGRIYXZlUG9zaXRpb25TZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBlbnN1cmVBbGxOb2Rlc0hhdmVWYWxpZEJlZ2luUG9zaXRpb24oIkBpbnRlcmZhY2UgQSB7IH0iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhY2thZ2VQcm90ZWN0ZWRGaWVsZFNob3VsZEhhdmVQb3NpdGlvblNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZUFsbE5vZGVzSGF2ZVZhbGlkQmVnaW5Qb3NpdGlvbigicHVibGljIGNsYXNzIEEgeyBpbnQgaTsgfSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFja2FnZVByb3RlY3RlZE1ldGhvZFNob3VsZEhhdmVQb3NpdGlvblNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBlbnN1cmVBbGxOb2Rlc0hhdmVWYWxpZEJlZ2luUG9zaXRpb24oInB1YmxpYyBjbGFzcyBBIHsgdm9pZCBmb28oKSB7fSB9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYWNrYWdlUHJvdGVjdGVkQ29uc3RydWN0b3JTaG91bGRIYXZlUG9zaXRpb25TZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZW5zdXJlQWxsTm9kZXNIYXZlVmFsaWRCZWdpblBvc2l0aW9uKCJwdWJsaWMgY2xhc3MgQSB7IEEoKSB7fSB9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFsbE5vZGVzSGF2ZVZhbGlkQmVnaW5Qb3NpdGlvbihmaW5hbCBTdHJpbmcgY29kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXMgPSBuZXcgSmF2YVBhcnNlcigpLnBhcnNlKFBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVCwgUHJvdmlkZXJzLnByb3ZpZGVyKGNvZGUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXMuZ2V0UHJvYmxlbXMoKS5pc0VtcHR5KCkpOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHJlcy5nZXRSZXN1bHQoKS5nZXQoKTsKKyAgICAgICAgZ2V0QWxsTm9kZXMoY3UpLmZvckVhY2gobiAtPiB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKFN0cmluZy5mb3JtYXQoIlRoZXJlIHNob3VsZCBiZSBubyBub2RlIHdpdGhvdXQgYSByYW5nZTogJXMgKGNsYXNzOiAlcykiLAorICAgICAgICAgICAgICAgICAgICBuLCBuLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKSwgbi5nZXRSYW5nZSgpKTsKKyAgICAgICAgICAgIGlmIChuLmdldEJlZ2luKCkuZ2V0KCkubGluZSA9PSAwICYmICFuLnRvU3RyaW5nKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlcmUgc2hvdWxkIGJlIG5vIG5vZGUgYXQgbGluZSAwOiAiICsgbiArICIgKGNsYXNzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG4uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGVUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L05vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwMWIyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvTm9kZVRlc3QuamF2YQpAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TaW1wbGVOYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuQXN0T2JzZXJ2ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5Bc3RPYnNlcnZlckFkYXB0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2U7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitwdWJsaWMgY2xhc3MgTm9kZVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlclN1YlRyZWUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgZjsgdm9pZCBmb28oaW50IHApIHsgcmV0dXJuICd6JzsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgQXN0T2JzZXJ2ZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgIGNoYW5nZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzLiVzIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIsIG9ic2VydmVkTm9kZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgcHJvcGVydHkubmFtZSgpLnRvTG93ZXJDYXNlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjdS5yZWdpc3RlckZvclN1YnRyZWUob2JzZXJ2ZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuc2V0TmFtZSgiTXlDb29sQ2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5uYW1lIGNoYW5nZWQgZnJvbSBBIHRvIE15Q29vbENsYXNzIiksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJNeUNvb2xDbGFzcyIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJmIikuZ2V0KCkuZ2V0VmFyaWFibGUoMCkuc2V0VHlwZShuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5CT09MRUFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ubmFtZSBjaGFuZ2VkIGZyb20gQSB0byBNeUNvb2xDbGFzcyIsCisgICAgICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24ubWF4aW11bV9jb21tb25fdHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iLAorICAgICAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3IudHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iKSwgY2hhbmdlcyk7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIk15Q29vbENsYXNzIikuZ2V0KCkuZ2V0TWV0aG9kc0J5TmFtZSgiZm9vIikuZ2V0KDApLmdldFBhcmFtZXRlckJ5TmFtZSgicCIpLmdldCgpLnNldE5hbWUoIm15UGFyYW0iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5uYW1lIGNoYW5nZWQgZnJvbSBBIHRvIE15Q29vbENsYXNzIiwKKyAgICAgICAgICAgICAgICAiRmllbGREZWNsYXJhdGlvbi5tYXhpbXVtX2NvbW1vbl90eXBlIGNoYW5nZWQgZnJvbSBpbnQgdG8gYm9vbGVhbiIsCisgICAgICAgICAgICAgICAgIlZhcmlhYmxlRGVjbGFyYXRvci50eXBlIGNoYW5nZWQgZnJvbSBpbnQgdG8gYm9vbGVhbiIsCisgICAgICAgICAgICAgICAgIlBhcmFtZXRlci5uYW1lIGNoYW5nZWQgZnJvbSBwIHRvIG15UGFyYW0iKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcldpdGhKdXN0Tm9kZU1vZGUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgZjsgdm9pZCBmb28oaW50IHApIHsgcmV0dXJuICd6JzsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgQXN0T2JzZXJ2ZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgIGNoYW5nZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzLiVzIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIsIG9ic2VydmVkTm9kZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgcHJvcGVydHkubmFtZSgpLnRvTG93ZXJDYXNlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLnJlZ2lzdGVyKG9ic2VydmVyLCBOb2RlLk9ic2VydmVyUmVnaXN0cmF0aW9uTW9kZS5KVVNUX1RISVNfTk9ERSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoKSwgY2hhbmdlcyk7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5zZXROYW1lKCJNeUNvb2xDbGFzcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLm5hbWUgY2hhbmdlZCBmcm9tIEEgdG8gTXlDb29sQ2xhc3MiKSwgY2hhbmdlcyk7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIk15Q29vbENsYXNzIikuZ2V0KCkuZ2V0RmllbGRCeU5hbWUoImYiKS5nZXQoKS5nZXRWYXJpYWJsZSgwKS5zZXRUeXBlKG5ldyBQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLkJPT0xFQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5uYW1lIGNoYW5nZWQgZnJvbSBBIHRvIE15Q29vbENsYXNzIiksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJNeUNvb2xDbGFzcyIpLmdldCgpLmdldE1ldGhvZHNCeU5hbWUoImZvbyIpLmdldCgwKS5nZXRQYXJhbWV0ZXJCeU5hbWUoInAiKS5nZXQoKS5zZXROYW1lKCJteVBhcmFtIik7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ubmFtZSBjaGFuZ2VkIGZyb20gQSB0byBNeUNvb2xDbGFzcyIpLCBjaGFuZ2VzKTsKKworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiTXlDb29sQ2xhc3MiKS5nZXQoKS5hZGRGaWVsZCgiaW50IiwgImJhciIpLmdldFZhcmlhYmxlcygpLmdldCgwKS5zZXRJbml0aWFsaXplcigiMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLm5hbWUgY2hhbmdlZCBmcm9tIEEgdG8gTXlDb29sQ2xhc3MiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcldpdGhOb2RlQW5kRXhpc3RpbmdEZXNjZW5kYW50c01vZGUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyBpbnQgZjsgdm9pZCBmb28oaW50IHApIHsgcmV0dXJuICd6JzsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgQXN0T2JzZXJ2ZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShOb2RlIG9ic2VydmVkTm9kZSwgT2JzZXJ2YWJsZVByb3BlcnR5IHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgIGNoYW5nZXMuYWRkKFN0cmluZy5mb3JtYXQoIiVzLiVzIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIsIG9ic2VydmVkTm9kZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgcHJvcGVydHkubmFtZSgpLnRvTG93ZXJDYXNlKCksIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLnJlZ2lzdGVyKG9ic2VydmVyLCBOb2RlLk9ic2VydmVyUmVnaXN0cmF0aW9uTW9kZS5USElTX05PREVfQU5EX0VYSVNUSU5HX0RFU0NFTkRBTlRTKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgpLCBjaGFuZ2VzKTsKKworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLnNldE5hbWUoIk15Q29vbENsYXNzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ubmFtZSBjaGFuZ2VkIGZyb20gQSB0byBNeUNvb2xDbGFzcyIpLCBjaGFuZ2VzKTsKKworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiTXlDb29sQ2xhc3MiKS5nZXQoKS5nZXRGaWVsZEJ5TmFtZSgiZiIpLmdldCgpLmdldFZhcmlhYmxlKDApLnNldFR5cGUobmV3IFByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuQk9PTEVBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLm5hbWUgY2hhbmdlZCBmcm9tIEEgdG8gTXlDb29sQ2xhc3MiLAorICAgICAgICAgICAgICAgICJGaWVsZERlY2xhcmF0aW9uLm1heGltdW1fY29tbW9uX3R5cGUgY2hhbmdlZCBmcm9tIGludCB0byBib29sZWFuIiwKKyAgICAgICAgICAgICAgICAiVmFyaWFibGVEZWNsYXJhdG9yLnR5cGUgY2hhbmdlZCBmcm9tIGludCB0byBib29sZWFuIiksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJNeUNvb2xDbGFzcyIpLmdldCgpLmdldE1ldGhvZHNCeU5hbWUoImZvbyIpLmdldCgwKS5nZXRQYXJhbWV0ZXJCeU5hbWUoInAiKS5nZXQoKS5zZXROYW1lKCJteVBhcmFtIik7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ubmFtZSBjaGFuZ2VkIGZyb20gQSB0byBNeUNvb2xDbGFzcyIsCisgICAgICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24ubWF4aW11bV9jb21tb25fdHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iLAorICAgICAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3IudHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iLAorICAgICAgICAgICAgICAgICJQYXJhbWV0ZXIubmFtZSBjaGFuZ2VkIGZyb20gcCB0byBteVBhcmFtIiksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJNeUNvb2xDbGFzcyIpLmdldCgpLmFkZEZpZWxkKCJpbnQiLCAiYmFyIikuZ2V0VmFyaWFibGVzKCkuZ2V0KDApLnNldEluaXRpYWxpemVyKCIwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ubmFtZSBjaGFuZ2VkIGZyb20gQSB0byBNeUNvb2xDbGFzcyIsCisgICAgICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24ubWF4aW11bV9jb21tb25fdHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iLAorICAgICAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3IudHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iLAorICAgICAgICAgICAgICAgICJQYXJhbWV0ZXIubmFtZSBjaGFuZ2VkIGZyb20gcCB0byBteVBhcmFtIiksIGNoYW5nZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaXRoU2VsZlByb3BhZ2F0aW5nTW9kZSgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IGludCBmOyB2b2lkIGZvbyhpbnQgcCkgeyByZXR1cm4gJ3onOyB9fSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKGNvZGUpOworICAgICAgICBMaXN0PFN0cmluZz4gY2hhbmdlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBBc3RPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBBc3RPYnNlcnZlckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoU3RyaW5nLmZvcm1hdCgiJXMuJXMgY2hhbmdlZCBmcm9tICVzIHRvICVzIiwgb2JzZXJ2ZWROb2RlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBwcm9wZXJ0eS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkucmVnaXN0ZXIob2JzZXJ2ZXIsIE5vZGUuT2JzZXJ2ZXJSZWdpc3RyYXRpb25Nb2RlLlNFTEZfUFJPUEFHQVRJTkcpOworCisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuc2V0TmFtZSgiTXlDb29sQ2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5uYW1lIGNoYW5nZWQgZnJvbSBBIHRvIE15Q29vbENsYXNzIiksIGNoYW5nZXMpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJNeUNvb2xDbGFzcyIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJmIikuZ2V0KCkuZ2V0VmFyaWFibGUoMCkuc2V0VHlwZShuZXcgUHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlByaW1pdGl2ZS5CT09MRUFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24ubmFtZSBjaGFuZ2VkIGZyb20gQSB0byBNeUNvb2xDbGFzcyIsCisgICAgICAgICAgICAgICAgIkZpZWxkRGVjbGFyYXRpb24ubWF4aW11bV9jb21tb25fdHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iLAorICAgICAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3IudHlwZSBjaGFuZ2VkIGZyb20gaW50IHRvIGJvb2xlYW4iKSwgY2hhbmdlcyk7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIk15Q29vbENsYXNzIikuZ2V0KCkuZ2V0TWV0aG9kc0J5TmFtZSgiZm9vIikuZ2V0KDApLmdldFBhcmFtZXRlckJ5TmFtZSgicCIpLmdldCgpLnNldE5hbWUoIm15UGFyYW0iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5uYW1lIGNoYW5nZWQgZnJvbSBBIHRvIE15Q29vbENsYXNzIiwKKyAgICAgICAgICAgICAgICAiRmllbGREZWNsYXJhdGlvbi5tYXhpbXVtX2NvbW1vbl90eXBlIGNoYW5nZWQgZnJvbSBpbnQgdG8gYm9vbGVhbiIsCisgICAgICAgICAgICAgICAgIlZhcmlhYmxlRGVjbGFyYXRvci50eXBlIGNoYW5nZWQgZnJvbSBpbnQgdG8gYm9vbGVhbiIsCisgICAgICAgICAgICAgICAgIlBhcmFtZXRlci5uYW1lIGNoYW5nZWQgZnJvbSBwIHRvIG15UGFyYW0iKSwgY2hhbmdlcyk7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIk15Q29vbENsYXNzIikuZ2V0KCkKKyAgICAgICAgICAgICAgICAuYWRkRmllbGQoImludCIsICJiYXIiKQorICAgICAgICAgICAgICAgIC5nZXRWYXJpYWJsZXMoKS5nZXQoMCkuc2V0SW5pdGlhbGl6ZXIoIjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5uYW1lIGNoYW5nZWQgZnJvbSBBIHRvIE15Q29vbENsYXNzIiwKKyAgICAgICAgICAgICAgICAiRmllbGREZWNsYXJhdGlvbi5tYXhpbXVtX2NvbW1vbl90eXBlIGNoYW5nZWQgZnJvbSBpbnQgdG8gYm9vbGVhbiIsCisgICAgICAgICAgICAgICAgIlZhcmlhYmxlRGVjbGFyYXRvci50eXBlIGNoYW5nZWQgZnJvbSBpbnQgdG8gYm9vbGVhbiIsCisgICAgICAgICAgICAgICAgIlBhcmFtZXRlci5uYW1lIGNoYW5nZWQgZnJvbSBwIHRvIG15UGFyYW0iLAorICAgICAgICAgICAgICAgICJWYXJpYWJsZURlY2xhcmF0b3IuaW5pdGlhbGl6ZXIgY2hhbmdlZCBmcm9tIG51bGwgdG8gMCIpLCBjaGFuZ2VzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUFQYXJhbWV0ZXJUcmlnZ2VyTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKGludCBwKSB7IH19IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2UoY29kZSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIEFzdE9ic2VydmVyIG9ic2VydmVyID0gbmV3IEFzdE9ic2VydmVyQWRhcHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlKE5vZGVMaXN0IG9ic2VydmVkTm9kZSwgTGlzdENoYW5nZVR5cGUgdHlwZSwgaW50IGluZGV4LCBOb2RlIG5vZGVBZGRlZE9yUmVtb3ZlZCkgeworICAgICAgICAgICAgICAgIGNoYW5nZXMuYWRkKCJyZW1vdmluZyBbIiArIG5vZGVBZGRlZE9yUmVtb3ZlZCArICJdIGZyb20gaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgY3UucmVnaXN0ZXIob2JzZXJ2ZXIsIE5vZGUuT2JzZXJ2ZXJSZWdpc3RyYXRpb25Nb2RlLlNFTEZfUFJPUEFHQVRJTkcpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWV0aG9kc0J5TmFtZSgiZm9vIikuZ2V0KDApLmdldFBhcmFtZXRlcigwKS5yZW1vdmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoInJlbW92aW5nIFtpbnQgcF0gZnJvbSBpbmRleCAwIiksIGNoYW5nZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVsZXRlQ2xhc3NOYW1lRG9lc05vdFRyaWdnZXJOb3RpZmljYXRpb25zKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oaW50IHApIHsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgQXN0T2JzZXJ2ZXJBZGFwdGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxpc3RDaGFuZ2UoTm9kZUxpc3Qgb2JzZXJ2ZWROb2RlLCBMaXN0Q2hhbmdlVHlwZSB0eXBlLCBpbnQgaW5kZXgsIE5vZGUgbm9kZUFkZGVkT3JSZW1vdmVkKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoInJlbW92aW5nIFsiICsgbm9kZUFkZGVkT3JSZW1vdmVkICsgIl0gZnJvbSBpbmRleCAiICsgaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjdS5yZWdpc3RlcihvYnNlcnZlciwgTm9kZS5PYnNlcnZlclJlZ2lzdHJhdGlvbk1vZGUuU0VMRl9QUk9QQUdBVElORyk7CisKKyAgICAgICAgLy8gSSBjYW5ub3QgcmVtb3ZlIHRoZSBuYW1lIG9mIGEgdHlwZQorICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TmFtZSgpLnJlbW92ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVNZXRob2RCb2R5RG9lc1RyaWdnZXJOb3RpZmljYXRpb25zKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oaW50IHApIHsgfX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXN0T2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgQXN0T2JzZXJ2ZXJBZGFwdGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoInNldHRpbmcgWyIgKyBwcm9wZXJ0eSArICJdIHRvICIgKyBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbGlzdENoYW5nZShOb2RlTGlzdCBvYnNlcnZlZE5vZGUsIExpc3RDaGFuZ2VUeXBlIHR5cGUsIGludCBpbmRleCwgTm9kZSBub2RlQWRkZWRPclJlbW92ZWQpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VzLmFkZCgicmVtb3ZpbmcgWyIgKyBub2RlQWRkZWRPclJlbW92ZWQgKyAiXSBmcm9tIGluZGV4ICIgKyBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGN1LnJlZ2lzdGVyKG9ic2VydmVyLCBOb2RlLk9ic2VydmVyUmVnaXN0cmF0aW9uTW9kZS5TRUxGX1BST1BBR0FUSU5HKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCkuZ2V0Qm9keSgpLmdldCgpLnJlbW92ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoInNldHRpbmcgW0JPRFldIHRvIG51bGwiKSwgY2hhbmdlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPcnBoYW5Db21tZW50UG9zaXRpdmVDYXNlKCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBmYWxzZSwgIkEiKTsKKyAgICAgICAgQ29tbWVudCBjID0gbmV3IExpbmVDb21tZW50KCJBIGNvbW1lbnQiKTsKKyAgICAgICAgZGVjbC5hZGRPcnBoYW5Db21tZW50KGMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGVjbC5nZXRPcnBoYW5Db21tZW50cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGVjbCA9PSBjLmdldFBhcmVudE5vZGUoKS5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGVjbC5yZW1vdmVPcnBoYW5Db21tZW50KGMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRlY2wuZ2V0T3JwaGFuQ29tbWVudHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjLmdldFBhcmVudE5vZGUoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPcnBoYW5Db21tZW50TmVnYXRpdmVDYXNlKCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYUNsYXNzID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIGZhbHNlLCAiQSIpOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGFGaWVsZCA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcihQcmltaXRpdmVUeXBlLmludFR5cGUoKSwgImYiKSk7CisgICAgICAgIGFDbGFzcy5nZXRNZW1iZXJzKCkuYWRkKGFGaWVsZCk7CisgICAgICAgIENvbW1lbnQgYyA9IG5ldyBMaW5lQ29tbWVudCgiQSBjb21tZW50Iik7CisgICAgICAgIGFGaWVsZC5hZGRPcnBoYW5Db21tZW50KGMpOworICAgICAgICAvLyB0aGUgY29tbWVudCBpcyBhbiBvcnBoYW4gY29tbWVudCBvZiB0aGUgZmllbGQsIHNvIHRyeWluZyB0byByZW1vdmUgaXQgb24gdGhlIGNsYXNzIHNob3VsZCBub3Qgd29yaworICAgICAgICBhc3NlcnRGYWxzZShhQ2xhc3MucmVtb3ZlT3JwaGFuQ29tbWVudChjKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhRmllbGQuZ2V0T3JwaGFuQ29tbWVudHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc0phdmFEb2NDb21tZW50UG9zaXRpdmVDYXNlV2l0aFNldEphdmFEb2NDb21tZW50KCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAiRm9vIik7CisgICAgICAgIGRlY2wuc2V0SmF2YWRvY0NvbW1lbnQoIkEgY29tbWVudCIpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZGVjbC5oYXNKYXZhRG9jQ29tbWVudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc0phdmFEb2NDb21tZW50UG9zaXRpdmVDYXNlV2l0aFNldENvbW1lbnQoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBkZWNsID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksCisgICAgICAgICAgICAgICAgZmFsc2UsICJGb28iKTsKKyAgICAgICAgZGVjbC5zZXRDb21tZW50KG5ldyBKYXZhZG9jQ29tbWVudCgiQSBjb21tZW50IikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZGVjbC5oYXNKYXZhRG9jQ29tbWVudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc0phdmFEb2NDb21tZW50TmVnYXRpdmVDYXNlTm9Db21tZW50KCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAiRm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZGVjbC5oYXNKYXZhRG9jQ29tbWVudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc0phdmFEb2NDb21tZW50TmVnYXRpdmVDYXNlTGluZUNvbW1lbnQoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBkZWNsID0gbmV3IENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksCisgICAgICAgICAgICAgICAgZmFsc2UsICJGb28iKTsKKyAgICAgICAgZGVjbC5zZXRDb21tZW50KG5ldyBMaW5lQ29tbWVudCgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGRlY2wuaGFzSmF2YURvY0NvbW1lbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYXNKYXZhRG9jQ29tbWVudE5lZ2F0aXZlQ2FzZUJsb2NrQ29tbWVudCgpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGRlY2wgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgIkZvbyIpOworICAgICAgICBkZWNsLnNldENvbW1lbnQobmV3IEJsb2NrQ29tbWVudCgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGRlY2wuaGFzSmF2YURvY0NvbW1lbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxPblJlcXVpcmVkUHJvcGVydHkoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJjbGFzcyBYeyB2b2lkIHgoKXt9fSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldFR5cGUoMCkuZ2V0TWV0aG9kcygpLmdldCgwKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpLnJlbW92ZUZvcmNlZCgpOworICAgICAgICAvLyBOYW1lIGlzIHJlcXVpcmVkLCBzbyB0byByZW1vdmUgaXQgdGhlIHdob2xlIG1ldGhvZCBpcyByZW1vdmVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiY2xhc3MgWCB7JTEkc30lMSRzIiwgRU9MKSwgY3UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ1RoZVNlY29uZE9mQUxpc3RPZklkZW50aWNhbFN0YXRlbWVudHNEb2VzTm90TWVzc1VwVGhlUGFyZW50cygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBwYXJzZShTdHJpbmcuZm9ybWF0KCJwdWJsaWMgY2xhc3MgRXhhbXBsZSB7JTEkcyIgKworICAgICAgICAgICAgICAgICIgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGFtcGxlKCkgeyUxJHMiICsKKyAgICAgICAgICAgICAgICAiICAgIGJvb2xlYW4gc3dhcHBlZDslMSRzIiArCisgICAgICAgICAgICAgICAgIiAgICBzd2FwcGVkPWZhbHNlOyUxJHMiICsKKyAgICAgICAgICAgICAgICAiICAgIHN3YXBwZWQ9ZmFsc2U7JTEkcyIgKworICAgICAgICAgICAgICAgICIgIH0lMSRzIiArCisgICAgICAgICAgICAgICAgIn0lMSRzIiwgRU9MKSk7CisgICAgICAgIC8vIHJlbW92ZSB0aGUgc2Vjb25kIHN3YXBwZWQ9ZmFsc2UKKyAgICAgICAgTm9kZSB0YXJnZXQgPSB1bml0LmdldENoaWxkTm9kZXMoKS5nZXQoMCkuZ2V0Q2hpbGROb2RlcygpLmdldCgxKS5nZXRDaGlsZE5vZGVzKCkuZ2V0KDIpLmdldENoaWxkTm9kZXMoKS5nZXQoMik7CisgICAgICAgIHRhcmdldC5yZW1vdmUoKTsKKyAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50cyBhcmUgYmFkLgorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odW5pdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZpbmRDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJjbGFzcyBYe2ludCB4O30iKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHggPSBjdS5nZXRDbGFzc0J5TmFtZSgiWCIpLmdldCgpLmdldE1lbWJlcigwKS5hc0ZpZWxkRGVjbGFyYXRpb24oKS5nZXRWYXJpYWJsZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjdSwgeC5maW5kQ29tcGlsYXRpb25Vbml0KCkuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmluZFBhcmVudCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2UoImNsYXNzIFh7aW50IHg7fSIpOworICAgICAgICBTaW1wbGVOYW1lIHggPSBjdS5nZXRDbGFzc0J5TmFtZSgiWCIpLmdldCgpLmdldE1lbWJlcigwKS5hc0ZpZWxkRGVjbGFyYXRpb24oKS5nZXRWYXJpYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCB4OyIsIHguZmluZFBhcmVudChGaWVsZERlY2xhcmF0aW9uLmNsYXNzKS5nZXQoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhbnRGaW5kQ29tcGlsYXRpb25Vbml0KCkgeworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgeCA9IG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoeC5maW5kQ29tcGlsYXRpb25Vbml0KCkuaXNQcmVzZW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2VuZXJpY1dhbGsoKSB7CisgICAgICAgIEV4cHJlc3Npb24gZSA9IHBhcnNlRXhwcmVzc2lvbigiMSsxIik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGUud2FsayhuIC0+IGIuYXBwZW5kKG4udG9TdHJpbmcoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEgKyAxMTEiLCBiLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2xhc3NTcGVjaWZpY1dhbGsoKSB7CisgICAgICAgIEV4cHJlc3Npb24gZSA9IHBhcnNlRXhwcmVzc2lvbigiMSsxIik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGUud2FsayhJbnRlZ2VyTGl0ZXJhbEV4cHIuY2xhc3MsIG4gLT4gYi5hcHBlbmQobi50b1N0cmluZygpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTEiLCBiLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29uZGl0aW9uYWxGaW5kQWxsKCkgeworICAgICAgICBFeHByZXNzaW9uIGUgPSBwYXJzZUV4cHJlc3Npb24oIjErMiszIik7CisgICAgICAgIExpc3Q8SW50ZWdlckxpdGVyYWxFeHByPiBpbnRzID0gZS5maW5kQWxsKEludGVnZXJMaXRlcmFsRXhwci5jbGFzcywgbiAtPiBuLmFzSW50KCkgPiAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMiwgM10iLCBpbnRzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHlwZU9ubHlGaW5kQWxsKCkgeworICAgICAgICBFeHByZXNzaW9uIGUgPSBwYXJzZUV4cHJlc3Npb24oIjErMiszIik7CisgICAgICAgIExpc3Q8SW50ZWdlckxpdGVyYWxFeHByPiBpbnRzID0gZS5maW5kQWxsKEludGVnZXJMaXRlcmFsRXhwci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzEsIDIsIDNdIiwgaW50cy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHR5cGVPbmx5RmluZEFsbE1hdGNoZXNTdWJjbGFzc2VzKCkgeworICAgICAgICBFeHByZXNzaW9uIGUgPSBwYXJzZUV4cHJlc3Npb24oIjErMiszIik7CisgICAgICAgIExpc3Q8Tm9kZT4gaW50cyA9IGUuZmluZEFsbChOb2RlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMSArIDIgKyAzLCAxICsgMiwgMSwgMiwgM10iLCBpbnRzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29uZGl0aW9uYWxUeXBlZEZpbmRGaXJzdCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBlID0gcGFyc2VFeHByZXNzaW9uKCIxKzIrMyIpOworICAgICAgICBPcHRpb25hbDxJbnRlZ2VyTGl0ZXJhbEV4cHI+IGludHMgPSBlLmZpbmRGaXJzdChJbnRlZ2VyTGl0ZXJhbEV4cHIuY2xhc3MsIG4gLT4gbi5hc0ludCgpID4gMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT3B0aW9uYWxbMl0iLCBpbnRzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHlwZU9ubHlGaW5kRmlyc3QoKSB7CisgICAgICAgIEV4cHJlc3Npb24gZSA9IHBhcnNlRXhwcmVzc2lvbigiMSsyKzMiKTsKKyAgICAgICAgT3B0aW9uYWw8SW50ZWdlckxpdGVyYWxFeHByPiBpbnRzID0gZS5maW5kRmlyc3QoSW50ZWdlckxpdGVyYWxFeHByLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcHRpb25hbFsxXSIsIGludHMudG9TdHJpbmcoKSk7CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RyZWFtKCkgeworICAgICAgICBFeHByZXNzaW9uIGUgPSBwYXJzZUV4cHJlc3Npb24oIjErMiszIik7CisgICAgICAgIExpc3Q8SW50ZWdlckxpdGVyYWxFeHByPiBpbnRzID0gZS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIobiAtPiBuIGluc3RhbmNlb2YgSW50ZWdlckxpdGVyYWxFeHByKQorICAgICAgICAgICAgICAgIC5tYXAoSW50ZWdlckxpdGVyYWxFeHByLmNsYXNzOjpjYXN0KQorICAgICAgICAgICAgICAgIC5maWx0ZXIoaSAtPiBpLmFzSW50KCkgPiAxKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsyLCAzXSIsIGludHMudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9QYXJzZVJlc3VsdFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFyc2VSZXN1bHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkNzcyNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUGFyc2VSZXN1bHRUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvYmxlbTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklUOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGUuUGFyc2VkbmVzcy5QQVJTRUQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZS5QYXJzZWRuZXNzLlVOUEFSU0FCTEU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIFBhcnNlUmVzdWx0VGVzdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBKYXZhUGFyc2VyIGphdmFQYXJzZXIgPSBuZXcgSmF2YVBhcnNlcihuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd2hlblBhcnNpbmdTdWNjZWVkc1RoZW5XZUdldFJlc3VsdHNBbmROb1Byb2JsZW1zKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7fSIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdC5nZXRSZXN1bHQoKS5pc1ByZXNlbnQoKSkuaXNUcnVlKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LmdldFJlc3VsdCgpLmdldCgpLmdldFBhcnNlZCgpKS5pc0VxdWFsVG8oUEFSU0VEKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQuZ2V0UHJvYmxlbXMoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdC5nZXRUb2tlbnMoKS5pc1ByZXNlbnQoKSkuaXNUcnVlKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQudG9TdHJpbmcoKSkuaXNFcXVhbFRvKCJQYXJzaW5nIHN1Y2Nlc3NmdWwiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHdoZW5QYXJzaW5nRmFpbHNUaGVuV2VHZXRQcm9ibGVtc0FuZEFCYWRSZXN1bHQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgeyIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdC5nZXRSZXN1bHQoKS5pc1ByZXNlbnQoKSkuaXNUcnVlKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LmdldFJlc3VsdCgpLmdldCgpLmdldFBhcnNlZCgpKS5pc0VxdWFsVG8oVU5QQVJTQUJMRSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LmdldFByb2JsZW1zKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMSk7CisKKyAgICAgICAgUHJvYmxlbSBwcm9ibGVtID0gcmVzdWx0LmdldFByb2JsZW0oMCk7CisgICAgICAgIGFzc2VydFRoYXQocHJvYmxlbS5nZXRNZXNzYWdlKCkpLmlzRXF1YWxUbygiUGFyc2UgZXJyb3IuIEZvdW5kIFwie1wiLCBleHBlY3RlZCBvbmUgb2YgIFwiZW51bVwiIFwiZXhwb3J0c1wiIFwibW9kdWxlXCIgXCJvcGVuXCIgXCJvcGVuc1wiIFwicHJvdmlkZXNcIiBcInJlcXVpcmVzXCIgXCJzdHJpY3RmcFwiIFwidG9cIiBcInRyYW5zaXRpdmVcIiBcInVzZXNcIiBcIndpdGhcIiA8SURFTlRJRklFUj4iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQuZ2V0VG9rZW5zKCkuaXNQcmVzZW50KCkpLmlzVHJ1ZSgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LnRvU3RyaW5nKCkpLnN0YXJ0c1dpdGgoIlBhcnNpbmcgZmFpbGVkOiIgKyBFT0wgKyAiKGxpbmUgMSxjb2wgMSkgUGFyc2UgZXJyb3IuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9SZXBsYWNlTm9kZVRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUmVwbGFjZU5vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5M2VmYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvUmVwbGFjZU5vZGVUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2U7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFJlcGxhY2VOb2RlVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUHJvcGVydHlXaXRoR2VuZXJpY1JlcGxhY2UoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJwYWNrYWdlIHg7IGNsYXNzIFkge30iKTsKKyAgICAgICAgY3UucmVwbGFjZShjdS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5nZXQoKSwgcGFyc2VQYWNrYWdlRGVjbGFyYXRpb24oInBhY2thZ2UgejsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJwYWNrYWdlIHo7JTEkcyIgKworICAgICAgICAgICAgICAgICIlMSRzIiArCisgICAgICAgICAgICAgICAgImNsYXNzIFkgeyUxJHMiICsKKyAgICAgICAgICAgICAgICAifSUxJHMiLCBFT0wpLCBjdS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0UHJvcGVydHkoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJwYWNrYWdlIHg7IGNsYXNzIFkge30iKTsKKyAgICAgICAgY3UucmVwbGFjZShjdS5nZXRDbGFzc0J5TmFtZSgiWSIpLmdldCgpLCBwYXJzZSgiY2xhc3MgQntpbnQgeTt9IikuZ2V0Q2xhc3NCeU5hbWUoIkIiKS5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJwYWNrYWdlIHg7JTEkcyIgKworICAgICAgICAgICAgICAgICIlMSRzIiArCisgICAgICAgICAgICAgICAgImNsYXNzIEIgeyUxJHMiICsKKyAgICAgICAgICAgICAgICAiJTEkcyIgKworICAgICAgICAgICAgICAgICIgICAgaW50IHk7JTEkcyIgKworICAgICAgICAgICAgICAgICJ9JTEkcyIsIEVPTCksIGN1LnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzNiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbXBsZU5hbWU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3aGVuU2V0dGluZ05hbWVUaGVQYXJlbnRPZk5hbWVJc0Fzc2lnbmVkKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gbmV3IFNpbXBsZU5hbWUoImZvbyIpOworICAgICAgICBkZWNsLnNldE5hbWUobmFtZSk7CisgICAgICAgIGFzc2VydFRydWUobmFtZS5nZXRQYXJlbnROb2RlKCkuaXNQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKGRlY2wgPT0gbmFtZS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlV2hlbk5vRGVmYXVsdFZhbHVlSXNQcmVzZW50KCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24oKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuYW1lID0gbmV3IFNpbXBsZU5hbWUoImZvbyIpOworICAgICAgICBkZWNsLnNldE5hbWUobmFtZSk7CisKKyAgICAgICAgZGVjbC5yZW1vdmVEZWZhdWx0VmFsdWUoKTsKKworICAgICAgICBhc3NlcnRGYWxzZShkZWNsLmdldERlZmF1bHRWYWx1ZSgpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZURlZmF1bHRWYWx1ZVdoZW5EZWZhdWx0VmFsdWVJc1ByZXNlbnQoKSB7CisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBkZWNsID0gbmV3IEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpOworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBuZXcgU2ltcGxlTmFtZSgiZm9vIik7CisgICAgICAgIGRlY2wuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUgPSBuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIyIik7CisgICAgICAgIGRlY2wuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7CisKKyAgICAgICAgZGVjbC5yZW1vdmVEZWZhdWx0VmFsdWUoKTsKKworICAgICAgICBhc3NlcnRGYWxzZShkZWZhdWx0VmFsdWUuZ2V0UGFyZW50Tm9kZSgpLmlzUHJlc2VudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmM3N2YxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvblRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RhdGljTmVzdGVkQ2xhc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7c3RhdGljIGNsYXNzIFl7fX0iKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHkgPSBjdS5nZXRDbGFzc0J5TmFtZSgiWCIpLmdldCgpLmdldE1lbWJlcnMoKS5nZXQoMCkuYXNDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKTsKKworICAgICAgICBhc3NlcnRGYWxzZSh5LmlzSW5uZXJDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh5LmlzTmVzdGVkVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoeS5pc0xvY2FsQ2xhc3NEZWNsYXJhdGlvbigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5lc3RlZEludGVyZmFjZSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHtpbnRlcmZhY2UgWXt9fSIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24geSA9IGN1LmdldENsYXNzQnlOYW1lKCJYIikuZ2V0KCkuZ2V0TWVtYmVycygpLmdldCgwKS5hc0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpOworCisgICAgICAgIGFzc2VydEZhbHNlKHkuaXNJbm5lckNsYXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHkuaXNOZXN0ZWRUeXBlKCkpOworICAgICAgICBhc3NlcnRGYWxzZSh5LmlzTG9jYWxDbGFzc0RlY2xhcmF0aW9uKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm9uU3RhdGljTmVzdGVkQ2xhc3MoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7Y2xhc3MgWXt9fSIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24geSA9IGN1LmdldENsYXNzQnlOYW1lKCJYIikuZ2V0KCkuZ2V0TWVtYmVycygpLmdldCgwKS5hc0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpOworCisgICAgICAgIGFzc2VydFRydWUoeS5pc0lubmVyQ2xhc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoeS5pc05lc3RlZFR5cGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHkuaXNMb2NhbENsYXNzRGVjbGFyYXRpb24oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0b3BDbGFzcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB5ID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIlgiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRGYWxzZSh5LmlzSW5uZXJDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoeS5pc05lc3RlZFR5cGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHkuaXNMb2NhbENsYXNzRGVjbGFyYXRpb24oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsb2NhbENsYXNzKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2Q9IChNZXRob2REZWNsYXJhdGlvbilKYXZhUGFyc2VyLnBhcnNlQm9keURlY2xhcmF0aW9uKCJ2b2lkIHgoKXtjbGFzcyBYe307fSIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24geCA9IG1ldGhvZC5maW5kRmlyc3QoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRGYWxzZSh4LmlzSW5uZXJDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoeC5pc05lc3RlZFR5cGUoKSk7CisgICAgICAgIGFzc2VydFRydWUoeC5pc0xvY2FsQ2xhc3NEZWNsYXJhdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ29uc3RydWN0b3JEZWNsYXJhdGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvYm9keS9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDNiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvQ29uc3RydWN0b3JEZWNsYXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5DTEFTU19CT0RZOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydFByb2JsZW1zOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yRGVjbGFyYXRpb25UZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFjY2VwdHNTdXBlcigpIHsKKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zID0gbmV3IENvbnN0cnVjdG9yRGVjbGFyYXRpb24oIkNvbnMiKTsKKyAgICAgICAgY29ucy5jcmVhdGVCb2R5KCkuYWRkU3RhdGVtZW50KCJzdXBlcigpOyIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJwdWJsaWMgQ29ucygpIHslMSRzIiArCisgICAgICAgICAgICAgICAgIiAgICBzdXBlcigpOyUxJHMiICsKKyAgICAgICAgICAgICAgICAifSIsIEVPTCksIGNvbnMudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb25UZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvRmllbGREZWNsYXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI2M2E0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3b2Zqd2VvaWZqKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcGFyc2UoIiIgKworICAgICAgICAgICAgICAgICJjbGFzcyBBIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgaW50IGEsIGI7XG4iICsKKyAgICAgICAgICAgICAgICAifSIpOworCisgICAgICAgIEJvZHlEZWNsYXJhdGlvbjw/PiBkZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKDApLmdldE1lbWJlcnMoKS5nZXQoMCk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uLmFzRmllbGREZWNsYXJhdGlvbigpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyMSA9IGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkuZ2V0KDApOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3IgdmFyMiA9IGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHModmFyMSwgdmFyMS5nZXRUeXBlKCkuZ2V0UGFyZW50Tm9kZSgpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHZhcjIsIHZhcjIuZ2V0VHlwZSgpLmdldFBhcmVudE5vZGUoKS5nZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01ldGhvZERlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ib2R5L01ldGhvZERlY2xhcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmFiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2JvZHkvTWV0aG9kRGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHk7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlQm9keURlY2xhcmF0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBNZXRob2REZWNsYXJhdGlvblRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYW5ub3RhdGlvbnNBbGxvd2VkQWZ0ZXJHZW5lcmljc0FuZEJlZm9yZVJldHVyblR5cGUoKSB7CisgICAgICAgIHBhcnNlQm9keURlY2xhcmF0aW9uKCJwdWJsaWMgPFQ+IEBBYmMgU3RyaW5nIG1ldGhvZCgpIHtyZXR1cm4gbnVsbDt9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uc0FsbG93ZWRCZWZvcmVHZW5lcmljcygpIHsKKyAgICAgICAgcGFyc2VCb2R5RGVjbGFyYXRpb24oInB1YmxpYyBAQWJjIDxUPiBTdHJpbmcgbWV0aG9kKCkge3JldHVybiBudWxsO30iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4cGxpY2l0UmVjZWl2ZXJQYXJhbWV0ZXJzMSgpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oInZvaWQgSW5uZXJJbm5lcihAbXlwYWNrYWdlLkFubm8gU291cmNlLkBteXBhY2thZ2UuQW5ubyBJbm5lciBTb3VyY2UuSW5uZXIudGhpcykgeyB9IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNvdXJjZS5Jbm5lci50aGlzIiwgbWV0aG9kLmdldFJlY2VpdmVyUGFyYW1ldGVyKCkuZ2V0KCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXhwbGljaXRSZWNlaXZlclBhcmFtZXRlcnMyKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBwYXJzZUJvZHlEZWNsYXJhdGlvbigidm9pZCB4KEEgdGhpcykgeyB9IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXMiLCBtZXRob2QuZ2V0UmVjZWl2ZXJQYXJhbWV0ZXIoKS5nZXQoKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBleHBsaWNpdFJlY2VpdmVyUGFyYW1ldGVyczMoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJ2b2lkIHgoQSB0aGF0KSB7IH0iKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1ldGhvZC5nZXRSZWNlaXZlclBhcmFtZXRlcigpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNpZ25hdHVyZXNFcXVhbCgpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMSA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJ2b2lkIHgoU3RyaW5nIGEpIHsgfSIpLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMiA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJpbnQgeChTdHJpbmcgeik7IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMobWV0aG9kMS5nZXRTaWduYXR1cmUoKSwgbWV0aG9kMi5nZXRTaWduYXR1cmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaWduYXR1cmVzRXF1YWxXaGVuR2VuZXJpY3NEaWZmZXIoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDEgPSBwYXJzZUJvZHlEZWNsYXJhdGlvbigidm9pZCB4KExpc3Q8TG9uZz4gYSkgeyB9IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QyID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oInZvaWQgeChMaXN0PEludGVnZXI+IGEpIHsgfSIpLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZDEuZ2V0U2lnbmF0dXJlKCksIG1ldGhvZDIuZ2V0U2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2lnbmF0dXJlc0VxdWFsV2hlbkFubm90YXRpb25zRGlmZmVyKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QxID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oInZvaWQgeChAQSBAQiBMaXN0IGEpIHsgfSIpLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMiA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJ2b2lkIHgoQEMgTGlzdCBhKSB7IH0iKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXRob2QxLmdldFNpZ25hdHVyZSgpLCBtZXRob2QyLmdldFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNpZ25hdHVyZXNEaWZmZXJlbnROYW1lKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QxID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oInZvaWQgeChTdHJpbmcgYSkgeyB9IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QyID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oImludCB5KFN0cmluZyB6KTsiKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhtZXRob2QxLmdldFNpZ25hdHVyZSgpLCBtZXRob2QyLmdldFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNpZ25hdHVyZXNEaWZmZXJlbnRUeXBlcygpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMSA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJ2b2lkIHgoU3RyaW5nIGEpIHsgfSIpLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMiA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJpbnQgeChpbnQgeik7IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMobWV0aG9kMS5nZXRTaWduYXR1cmUoKSwgbWV0aG9kMi5nZXRTaWduYXR1cmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaWduYXR1cmVzRGlmZmVyZW50VmFyYXJncygpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kMSA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJpbnQgeChpbnQgeik7IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QyID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oImludCB4KGludC4uLiB6KTsiKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhtZXRob2QxLmdldFNpZ25hdHVyZSgpLCBtZXRob2QyLmdldFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNpZ25hdHVyZVRvU3RyaW5nKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QxID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oImludCB4KGludCB6LCBTdHJpbmcgcSk7IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIngoaW50LCBTdHJpbmcpIiwgbWV0aG9kMS5nZXRTaWduYXR1cmUoKS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnRUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2NvbW1lbnRzL0NvbW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2Yjc2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvY29tbWVudHMvQ29tbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2U7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlTmFtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIENvbW1lbnRUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZlT3JwaGFuQ29tbWVudCgpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGRlY2wgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgZmFsc2UsICJBIik7CisgICAgICAgIENvbW1lbnQgYyA9IG5ldyBMaW5lQ29tbWVudCgiQSBjb21tZW50Iik7CisgICAgICAgIGRlY2wuYWRkT3JwaGFuQ29tbWVudChjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRlY2wuZ2V0T3JwaGFuQ29tbWVudHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGMucmVtb3ZlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGVjbC5nZXRPcnBoYW5Db21tZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBc3NvY2lhdGVkQ29tbWVudCgpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGRlY2wgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgZmFsc2UsICJBIik7CisgICAgICAgIENvbW1lbnQgYyA9IG5ldyBMaW5lQ29tbWVudCgiQSBjb21tZW50Iik7CisgICAgICAgIGRlY2wuc2V0Q29tbWVudChjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGRlY2wuZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlbW92ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWNsLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYW5ub3RSZW1vdmVDb21tZW50Tm90VXNlZEFueXdoZXJlKCkgeworICAgICAgICBDb21tZW50IGMgPSBuZXcgTGluZUNvbW1lbnQoIkEgY29tbWVudCIpOworICAgICAgICBhc3NlcnRGYWxzZShjLnJlbW92ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHVuaWNvZGVFc2NhcGVzQXJlUHJlc2VydmVkSW5Db21tZW50cygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2UoIi8vIHh4eFxcdTIxMjJ4eHgiKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50ID0gY3UuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiIHh4eFxcdTIxMjJ4eHgiLCBjb21tZW50LmdldENvbnRlbnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fzc2lnbkV4cHJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvQXNzaWduRXhwclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWU4N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0Fzc2lnbkV4cHJUZXN0LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBBc3NpZ25FeHByVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb252ZXJ0T3BlcmF0b3IoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhCaW5hcnlFeHByLk9wZXJhdG9yLlBMVVMsIEFzc2lnbkV4cHIuT3BlcmF0b3IuUExVUy50b0JpbmFyeU9wZXJhdG9yKCkuZ2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0JpbmFyeUV4cHJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3NWVmMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9CaW5hcnlFeHByVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgQmluYXJ5RXhwclRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29udmVydE9wZXJhdG9yKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoQXNzaWduRXhwci5PcGVyYXRvci5QTFVTLCBCaW5hcnlFeHByLk9wZXJhdG9yLlBMVVMudG9Bc3NpZ25PcGVyYXRvcigpLmdldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRG91YmxlTGl0ZXJhbEV4cHJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvRG91YmxlTGl0ZXJhbEV4cHJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1NDY0MwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9Eb3VibGVMaXRlcmFsRXhwclRlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbjsKKworcHVibGljIGNsYXNzIERvdWJsZUxpdGVyYWxFeHByVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZmxvYXQgeCA9IDB4MC4wMF8wMF8wMnAtMTI2ZjsKKyAgICAgICAgcGFyc2VFeHByZXNzaW9uKCIweDAuMDBfMDBfMDJwLTEyNmYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBkb3VibGUgeCA9IDB4MC4wMDBfMDAwXzAwMF8wMDBfMXAtMV8wMjI7CisgICAgICAgIHBhcnNlRXhwcmVzc2lvbigiMHgwLjAwMF8wMDBfMDAwXzAwMF8xcC0xXzAyMiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGRvdWJsZSBhID0gMHgxLnArMTsKKyAgICAgICAgcGFyc2VFeHByZXNzaW9uKCIweDEucCsxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgZG91YmxlIGEgPSAweC4wcDA7CisgICAgICAgIHBhcnNlRXhwcmVzc2lvbigiMHguMHAwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZG91YmxlIHggPSAweDBfMC4wXzBwLTFfMDsKKyAgICAgICAgcGFyc2VFeHByZXNzaW9uKCIweDBfMC4wXzBwLTFfMCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9JbnN0YW5jZU9mRXhwclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDhhNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL0luc3RhbmNlT2ZFeHByVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uc0ZvckludGVyZmFjZVR5cGVzLmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBJbnN0YW5jZU9mRXhwclRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYW5ub3RhdGlvbnNPblRoZVR5cGUoKSB7CisgICAgICAgIEluc3RhbmNlT2ZFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigicyBpbnN0YW5jZW9mIEBBIEBEQSBTdHJpbmciKTsKKworICAgICAgICBhc3NlcnRUaGF0KGV4cHIuZ2V0VHlwZSgpLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIoIkEiKSwgbmV3IE1hcmtlckFubm90YXRpb25FeHByKCJEQSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGFtYmRhRXhwclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MYW1iZGFFeHByVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjkwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGFtYmRhRXhwclRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Ub2tlblJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb247CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzIExhbWJkYUV4cHJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYVJhbmdlMSgpeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oInggLT4geSIpOworICAgICAgICBhc3NlcnRSYW5nZSgieCIsICJ5IiwgZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsYW1iZGFSYW5nZTIoKXsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCIoeCkgLT4geSIpOworICAgICAgICBhc3NlcnRSYW5nZSgiKCIsICJ5IiwgZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJhbmdlKFN0cmluZyBzdGFydFRva2VuLCBTdHJpbmcgZW5kVG9rZW4sIE5vZGUgbm9kZSkgeworICAgICAgICBUb2tlblJhbmdlIHRva2VuUmFuZ2UgPSBub2RlLmdldFRva2VuUmFuZ2UoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0VG9rZW4sIHRva2VuUmFuZ2UuZ2V0QmVnaW4oKS5hc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZFRva2VuLCB0b2tlblJhbmdlLmdldEVuZCgpLmFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0RXhwcmVzc2lvbkJvZHkoKXsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gcGFyc2VFeHByZXNzaW9uKCJ4IC0+IHkiKS5hc0xhbWJkYUV4cHIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcHRpb25hbFt5XSIsIGxhbWJkYUV4cHIuZ2V0RXhwcmVzc2lvbkJvZHkoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldE5vRXhwcmVzc2lvbkJvZHkoKXsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gcGFyc2VFeHByZXNzaW9uKCJ4IC0+IHt5O30iKS5hc0xhbWJkYUV4cHIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcHRpb25hbC5lbXB0eSIsIGxhbWJkYUV4cHIuZ2V0RXhwcmVzc2lvbkJvZHkoKS50b1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9MaXRlcmFsU3RyaW5nVmFsdWVFeHByVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWRmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwclRlc3QuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTcgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuZGF0YS5QZXJjZW50YWdlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworQFN1cHByZXNzV2FybmluZ3MoIk9jdGFsSW50ZWdlciIpCitwdWJsaWMgY2xhc3MgTGl0ZXJhbFN0cmluZ1ZhbHVlRXhwclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0cml2aWFsTGl0ZXJhbHNBcmVDb252ZXJ0ZWQoKSB7CisgICAgICAgIGFzc2VydFRoYXQobmV3IENoYXJMaXRlcmFsRXhwcignXHQnKS5nZXRWYWx1ZSgpKS5pc0VxdWFsVG8oIlxcdCIpOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBDaGFyTGl0ZXJhbEV4cHIoJ1xiJykuZ2V0VmFsdWUoKSkuaXNFcXVhbFRvKCJcXGIiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgQ2hhckxpdGVyYWxFeHByKCdcZicpLmdldFZhbHVlKCkpLmlzRXF1YWxUbygiXFxmIik7CisgICAgICAgIGFzc2VydFRoYXQobmV3IENoYXJMaXRlcmFsRXhwcignXHInKS5nZXRWYWx1ZSgpKS5pc0VxdWFsVG8oIlxcciIpOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBDaGFyTGl0ZXJhbEV4cHIoJ1xuJykuZ2V0VmFsdWUoKSkuaXNFcXVhbFRvKCJcXG4iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgQ2hhckxpdGVyYWxFeHByKCdcXCcpLmdldFZhbHVlKCkpLmlzRXF1YWxUbygiXFxcXCIpOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBDaGFyTGl0ZXJhbEV4cHIoJ1wiJykuZ2V0VmFsdWUoKSkuaXNFcXVhbFRvKCJcXFwiIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIwQjAiKS5hc0ludCgpKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IEludGVnZXJMaXRlcmFsRXhwcigiMGIwIikuYXNJbnQoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjBYMCIpLmFzSW50KCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIweDAiKS5hc0ludCgpKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IEludGVnZXJMaXRlcmFsRXhwcigwKS5hc0ludCgpKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IEludGVnZXJMaXRlcmFsRXhwcigwMCkuYXNJbnQoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoMEIwKS5hc0ludCgpKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IEludGVnZXJMaXRlcmFsRXhwcigwYjApLmFzSW50KCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgSW50ZWdlckxpdGVyYWxFeHByKDBYMCkuYXNJbnQoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoMHgwKS5hc0ludCgpKS5pc0VxdWFsVG8oMCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgTG9uZ0xpdGVyYWxFeHByKCIwQjBMIikuYXNMb25nKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgTG9uZ0xpdGVyYWxFeHByKCIwYjBMIikuYXNMb25nKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgTG9uZ0xpdGVyYWxFeHByKCIwWDBMIikuYXNMb25nKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgTG9uZ0xpdGVyYWxFeHByKCIweDBMIikuYXNMb25nKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgTG9uZ0xpdGVyYWxFeHByKDBMKS5hc0xvbmcoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBMb25nTGl0ZXJhbEV4cHIoMDBMKS5hc0xvbmcoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBMb25nTGl0ZXJhbEV4cHIoMEIwTCkuYXNMb25nKCkpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgTG9uZ0xpdGVyYWxFeHByKDBiMEwpLmFzTG9uZygpKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IExvbmdMaXRlcmFsRXhwcigwWDBMKS5hc0xvbmcoKSkuaXNFcXVhbFRvKDApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBMb25nTGl0ZXJhbEV4cHIoMHgwTCkuYXNMb25nKCkpLmlzRXF1YWxUbygwKTsKKworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEb3VibGVMaXRlcmFsRXhwcigiMC4wZiIpLmFzRG91YmxlKCkpLmlzRXF1YWxUbygwLjApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEb3VibGVMaXRlcmFsRXhwcigiMC4wRiIpLmFzRG91YmxlKCkpLmlzRXF1YWxUbygwLjApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEb3VibGVMaXRlcmFsRXhwcigiMC4wZCIpLmFzRG91YmxlKCkpLmlzRXF1YWxUbygwLjApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEb3VibGVMaXRlcmFsRXhwcigiMC4wRCIpLmFzRG91YmxlKCkpLmlzRXF1YWxUbygwLjApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEb3VibGVMaXRlcmFsRXhwcigwLjBGKS5hc0RvdWJsZSgpKS5pc0VxdWFsVG8oMC4wKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgRG91YmxlTGl0ZXJhbEV4cHIoMC4wZikuYXNEb3VibGUoKSkuaXNFcXVhbFRvKDAuMCk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IERvdWJsZUxpdGVyYWxFeHByKDAuMEQpLmFzRG91YmxlKCkpLmlzRXF1YWxUbygwLjApOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBEb3VibGVMaXRlcmFsRXhwcigwLjBkKS5hc0RvdWJsZSgpKS5pc0VxdWFsVG8oMC4wKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxvd2VyQW5kVXBwZXJCb3VuZEludGVnZXJzQXJlQ29udmVydGVkKCkgeworICAgICAgICBJbnRlZ2VyTGl0ZXJhbEV4cHIgZGVjID0gcGFyc2VFeHByZXNzaW9uKCIyMTQ3NDgzNjQ3Iik7CisgICAgICAgIEludGVnZXJMaXRlcmFsRXhwciBwb3NPY3QgPSBwYXJzZUV4cHJlc3Npb24oIjAxNzdfNzc3N183Nzc3Iik7CisgICAgICAgIEludGVnZXJMaXRlcmFsRXhwciBuZWdPY3QgPSBwYXJzZUV4cHJlc3Npb24oIjAzNzdfNzc3N183Nzc3Iik7CisgICAgICAgIEludGVnZXJMaXRlcmFsRXhwciBwb3NIZXggPSBwYXJzZUV4cHJlc3Npb24oIjB4N2ZmZl9mZmZmIik7CisgICAgICAgIEludGVnZXJMaXRlcmFsRXhwciBuZWdIZXggPSBwYXJzZUV4cHJlc3Npb24oIjB4ZmZmZl9mZmZmIik7CisgICAgICAgIEludGVnZXJMaXRlcmFsRXhwciBwb3NCaW4gPSBwYXJzZUV4cHJlc3Npb24oIjBiMDExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExIik7CisgICAgICAgIEludGVnZXJMaXRlcmFsRXhwciBuZWdCaW4gPSBwYXJzZUV4cHJlc3Npb24oIjBiMTAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChkZWMuYXNJbnQoKSkuaXNFcXVhbFRvKDIxNDc0ODM2NDcpOworICAgICAgICBhc3NlcnRUaGF0KHBvc09jdC5hc0ludCgpKS5pc0VxdWFsVG8oMjE0NzQ4MzY0Nyk7IC8vIDAxNzdfNzc3N183Nzc3CisgICAgICAgIGFzc2VydFRoYXQobmVnT2N0LmFzSW50KCkpLmlzRXF1YWxUbygtMSk7IC8vIDAzNzdfNzc3N183Nzc3CisgICAgICAgIGFzc2VydFRoYXQocG9zSGV4LmFzSW50KCkpLmlzRXF1YWxUbygweDdmZmZfZmZmZik7CisgICAgICAgIGFzc2VydFRoYXQobmVnSGV4LmFzSW50KCkpLmlzRXF1YWxUbygweGZmZmZfZmZmZik7CisgICAgICAgIGFzc2VydFRoYXQocG9zQmluLmFzSW50KCkpLmlzRXF1YWxUbygwYjAxMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMSk7CisgICAgICAgIGFzc2VydFRoYXQobmVnQmluLmFzSW50KCkpLmlzRXF1YWxUbygwYjEwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsb3dlckFuZFVwcGVyQm91bmRMb25nc0FyZUNvbnZlcnRlZCgpIHsKKyAgICAgICAgTG9uZ0xpdGVyYWxFeHByIGRlYyA9IHBhcnNlRXhwcmVzc2lvbigiOTIyMzM3MjAzNjg1NDc3NTgwN0wiKTsKKyAgICAgICAgTG9uZ0xpdGVyYWxFeHByIHBvc09jdCA9IHBhcnNlRXhwcmVzc2lvbigiMDdfNzc3N183Nzc3Xzc3NzdfNzc3N183Nzc3TCIpOworICAgICAgICBMb25nTGl0ZXJhbEV4cHIgbmVnT2N0ID0gcGFyc2VFeHByZXNzaW9uKCIwMTBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwTCIpOworICAgICAgICBMb25nTGl0ZXJhbEV4cHIgcG9zSGV4ID0gcGFyc2VFeHByZXNzaW9uKCIweDdmZmZfZmZmZl9mZmZmX2ZmZmZMIik7CisgICAgICAgIExvbmdMaXRlcmFsRXhwciBuZWdIZXggPSBwYXJzZUV4cHJlc3Npb24oIjB4ZmZmZl9mZmZmX2ZmZmZfZmZmZkwiKTsKKyAgICAgICAgTG9uZ0xpdGVyYWxFeHByIHBvc0JpbiA9IHBhcnNlRXhwcmVzc2lvbigiMGIwMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExTCIpOworICAgICAgICBMb25nTGl0ZXJhbEV4cHIgbmVnQmluID0gcGFyc2VFeHByZXNzaW9uKCIwYjEwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBMIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChkZWMuYXNMb25nKCkpLmlzRXF1YWxUbyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCk7CisgICAgICAgIGFzc2VydFRoYXQocG9zT2N0LmFzTG9uZygpKS5pc0VxdWFsVG8oOTIyMzM3MjAzNjg1NDc3NTgwN0wpOyAvLyAwN183Nzc3Xzc3NzdfNzc3N183Nzc3Xzc3NzdMCisgICAgICAgIGFzc2VydFRoYXQobmVnT2N0LmFzTG9uZygpKS5pc0VxdWFsVG8oLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKTsgLy8gMDEwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMEwKKyAgICAgICAgYXNzZXJ0VGhhdChwb3NIZXguYXNMb25nKCkpLmlzRXF1YWxUbygweDdmZmZfZmZmZl9mZmZmX2ZmZmZMKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZWdIZXguYXNMb25nKCkpLmlzRXF1YWxUbygweGZmZmZfZmZmZl9mZmZmX2ZmZmZMKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwb3NCaW4uYXNMb25nKCkpLmlzRXF1YWxUbygwYjAxMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFfMTExMV8xMTExXzExMTFMKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZWdCaW4uYXNMb25nKCkpLmlzRXF1YWxUbygwYjEwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBMKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoYXJMaXRlcmFsc0FyZUNvbnZlcnRlZCgpIHsKKyAgICAgICAgQ2hhckxpdGVyYWxFeHByIGEgPSBwYXJzZUV4cHJlc3Npb24oIidhJyIpOworICAgICAgICBDaGFyTGl0ZXJhbEV4cHIgcGVyY2VudCA9IHBhcnNlRXhwcmVzc2lvbigiJyUnIik7CisgICAgICAgIENoYXJMaXRlcmFsRXhwciB0YWIgPSBwYXJzZUV4cHJlc3Npb24oIidcXHQnIik7CisgICAgICAgIENoYXJMaXRlcmFsRXhwciBuZXdMaW5lID0gcGFyc2VFeHByZXNzaW9uKCInXFxuJyIpOworICAgICAgICBDaGFyTGl0ZXJhbEV4cHIgc2xhc2ggPSBwYXJzZUV4cHJlc3Npb24oIidcXFxcJyIpOworICAgICAgICBDaGFyTGl0ZXJhbEV4cHIgcXVvdGUgPSBwYXJzZUV4cHJlc3Npb24oIidcXCcnIik7CisgICAgICAgIENoYXJMaXRlcmFsRXhwciBvbWVnYSA9IHBhcnNlRXhwcmVzc2lvbigiJ1xcdTAzYTknIik7CisgICAgICAgIENoYXJMaXRlcmFsRXhwciB1bmljb2RlID0gcGFyc2VFeHByZXNzaW9uKCInXFx1RkZGRiciKTsKKyAgICAgICAgQ2hhckxpdGVyYWxFeHByIGFzY2lpID0gcGFyc2VFeHByZXNzaW9uKCInXFwxNzcnIik7CisgICAgICAgIENoYXJMaXRlcmFsRXhwciB0cmFkZW1hcmsgPSBwYXJzZUV4cHJlc3Npb24oIifihKInIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhLmFzQ2hhcigpKS5pc0VxdWFsVG8oJ2EnKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwZXJjZW50LmFzQ2hhcigpKS5pc0VxdWFsVG8oJyUnKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YWIuYXNDaGFyKCkpLmlzRXF1YWxUbygnXHQnKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXdMaW5lLmFzQ2hhcigpKS5pc0VxdWFsVG8oJ1xuJyk7CisgICAgICAgIGFzc2VydFRoYXQoc2xhc2guYXNDaGFyKCkpLmlzRXF1YWxUbygnXFwnKTsKKyAgICAgICAgYXNzZXJ0VGhhdChxdW90ZS5hc0NoYXIoKSkuaXNFcXVhbFRvKCdcJycpOworICAgICAgICBhc3NlcnRUaGF0KG9tZWdhLmFzQ2hhcigpKS5pc0VxdWFsVG8oJ1x1MDNhOScpOworICAgICAgICBhc3NlcnRUaGF0KHVuaWNvZGUuYXNDaGFyKCkpLmlzRXF1YWxUbygnXHVGRkZGJyk7CisgICAgICAgIGFzc2VydFRoYXQoYXNjaWkuYXNDaGFyKCkpLmlzRXF1YWxUbygnXDE3NycpOworICAgICAgICBhc3NlcnRUaGF0KHRyYWRlbWFyay5hc0NoYXIoKSkuaXNFcXVhbFRvKCfihKInKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxvd2VyQW5kVXBwZXJCb3VuZERvdWJsZXNBcmVDb252ZXJ0ZWQoKSB7CisgICAgICAgIERvdWJsZUxpdGVyYWxFeHByIHBvc0Zsb2F0ID0gcGFyc2VFeHByZXNzaW9uKCIzLjQwMjgyMzVlMzhmIik7CisgICAgICAgIERvdWJsZUxpdGVyYWxFeHByIG5lZ0Zsb2F0ID0gcGFyc2VFeHByZXNzaW9uKCIxLjQwZS00NWYiKTsKKyAgICAgICAgRG91YmxlTGl0ZXJhbEV4cHIgcG9zRG91YmxlID0gcGFyc2VFeHByZXNzaW9uKCIxLjc5NzY5MzEzNDg2MjMxNTdlMzA4Iik7CisgICAgICAgIERvdWJsZUxpdGVyYWxFeHByIG5lZ0RvdWJsZSA9IHBhcnNlRXhwcmVzc2lvbigiNC45ZS0zMjQiKTsKKyAgICAgICAgRG91YmxlTGl0ZXJhbEV4cHIgcG9zSGV4RmxvYXQgPSBwYXJzZUV4cHJlc3Npb24oIjB4MS5mZmZmZmZmZmZmZmZmcDEwMjMiKTsKKyAgICAgICAgRG91YmxlTGl0ZXJhbEV4cHIgbmVnSGV4RmxvYXQgPSBwYXJzZUV4cHJlc3Npb24oIjB4MC4wMDAwMDAwMDAwMDAxUC0xMDIyIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChwb3NGbG9hdC5hc0RvdWJsZSgpKS5pc0Nsb3NlVG8oMy40MDI4MjM1ZTM4ZiwgUGVyY2VudGFnZS53aXRoUGVyY2VudGFnZSgxKSk7CisgICAgICAgIGFzc2VydFRoYXQobmVnRmxvYXQuYXNEb3VibGUoKSkuaXNDbG9zZVRvKDEuNDBlLTQ1ZiwgUGVyY2VudGFnZS53aXRoUGVyY2VudGFnZSgxKSk7CisgICAgICAgIGFzc2VydFRoYXQocG9zRG91YmxlLmFzRG91YmxlKCkpLmlzRXF1YWxUbygxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZWdEb3VibGUuYXNEb3VibGUoKSkuaXNFcXVhbFRvKDQuOWUtMzI0KTsKKyAgICAgICAgYXNzZXJ0VGhhdChwb3NIZXhGbG9hdC5hc0RvdWJsZSgpKS5pc0VxdWFsVG8oMHgxLmZmZmZmZmZmZmZmZmZwMTAyMyk7CisgICAgICAgIGFzc2VydFRoYXQobmVnSGV4RmxvYXQuYXNEb3VibGUoKSkuaXNFcXVhbFRvKDB4MC4wMDAwMDAwMDAwMDAxUC0xMDIyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNwZWNpYWxDaGFyYWN0ZXJzSW5TdHJpbmdzQXJlRXNjYXBlZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoIlxuIikuZ2V0VmFsdWUoKSkuaXNFcXVhbFRvKCJcXG4iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoIlxyIikuZ2V0VmFsdWUoKSkuaXNFcXVhbFRvKCJcXHIiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoIiIpLnNldEVzY2FwZWRWYWx1ZSgiXG4iKS5nZXRWYWx1ZSgpKS5pc0VxdWFsVG8oIlxcbiIpOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBTdHJpbmdMaXRlcmFsRXhwcigiIikuc2V0RXNjYXBlZFZhbHVlKCJcciIpLmdldFZhbHVlKCkpLmlzRXF1YWxUbygiXFxyIik7CisgICAgICAgIGFzc2VydFRoYXQobmV3IFN0cmluZ0xpdGVyYWxFeHByKCIiKS5zZXRFc2NhcGVkVmFsdWUoIlxuIikuYXNTdHJpbmcoKSkuaXNFcXVhbFRvKCJcbiIpOworICAgICAgICBhc3NlcnRUaGF0KG5ldyBTdHJpbmdMaXRlcmFsRXhwcigiIikuc2V0RXNjYXBlZFZhbHVlKCJcciIpLmFzU3RyaW5nKCkpLmlzRXF1YWxUbygiXHIiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoIkhlbGxvXG5Xb3JsZFxySGVsbG9cIldvcmxkXCciKS5hc1N0cmluZygpKS5pc0VxdWFsVG8oIkhlbGxvXG5Xb3JsZFxySGVsbG9cIldvcmxkXCciKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9NZXRob2RDYWxsRXhwclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg1NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZENhbGxFeHByVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuT3B0aW9uYWwuZW1wdHk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIE1ldGhvZENhbGxFeHByVGVzdCB7CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlTGFtYmRhSXNzdWUxMjkwKCkgeworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IHBhcnNlRXhwcmVzc2lvbigiY2FsbFNvbWVGdW4ociAtPiByIGluc3RhbmNlb2YgU29tZVR5cGUpIikuYXNNZXRob2RDYWxsRXhwcigpOworICAgICAgICBMYW1iZGFFeHByIGxhbWJkYUV4cHIgPSBtZXRob2RDYWxsRXhwci5nZXRBcmd1bWVudCgwKS5hc0xhbWJkYUV4cHIoKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgbGFtYmRhV3JhcHBlciA9IG5ldyBNZXRob2RDYWxsRXhwcigibGFtYmRhV3JhcHBlciIpOworICAgICAgICBsYW1iZGFFeHByLnJlcGxhY2UobGFtYmRhV3JhcHBlcik7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWV0aG9kQ2FsbEV4cHIuZ2V0Q2hpbGROb2RlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbXB0eSgpLCBsYW1iZGFFeHByLmdldFBhcmVudE5vZGUoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTWV0aG9kUmVmZXJlbmNlRXhwclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjA2NDNiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL01ldGhvZFJlZmVyZW5jZUV4cHJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRFeHByZXNzaW9uVmFsaWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIE1ldGhvZFJlZmVyZW5jZUV4cHJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWV0aG9kUmVmZXJlbmNlRXhwckhhc0Fsd2F5c0FTY29wZSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgTWV0aG9kUmVmZXJlbmNlRXhwcigpLmdldFNjb3BlKCkgIT0gbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxKCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoIlN0cmluZzo6bGVuZ3RoIik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTIoKSB7CisgICAgICAgIGFzc2VydEV4cHJlc3Npb25WYWxpZCgiU3lzdGVtOjpjdXJyZW50VGltZU1pbGxpcyAvLyBzdGF0aWMgbWV0aG9kIik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTMoKSB7CisgICAgICAgIGFzc2VydEV4cHJlc3Npb25WYWxpZCgiTGlzdDxTdHJpbmc+OjpzaXplIC8vIGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzIGZvciBnZW5lcmljIHR5cGUiKTsKKyAgICB9CisgICAgICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVmZXJlbmNlNCgpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJMaXN0OjpzaXplIC8vIGluZmVycmVkIHR5cGUgYXJndW1lbnRzIGZvciBnZW5lcmljIHR5cGUiKTsKKyAgICB9CisgICAgICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVmZXJlbmNlNSgpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJpbnRbXTo6Y2xvbmUiKTsKKyAgICB9CisgICAgICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVmZXJlbmNlNigpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJUOjp0dmFyTWVtYmVyIik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTcoKSB7CisgICAgICAgIGFzc2VydEV4cHJlc3Npb25WYWxpZCgiU3lzdGVtLm91dDo6cHJpbnRsbiIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2U4KCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoIlwiYWJjXCI6Omxlbmd0aCIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2U5KCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoImZvb1t4XTo6YmFyIik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTEwKCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoIih0ZXN0ID8gbGlzdC5yZXBsYWNlQWxsKFN0cmluZzo6dHJpbSkgOiBsaXN0KSA6OiBpdGVyYXRvciIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxMEFubm90YXRlZDEoKSB7CisgICAgICAgIGFzc2VydEV4cHJlc3Npb25WYWxpZCgiKHRlc3QgPyBsaXN0LnJlcGxhY2VBbGwoQEEgU3RyaW5nOjp0cmltKSA6IGxpc3QpIDo6IGl0ZXJhdG9yIik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTExKCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoIlN0cmluZzo6dmFsdWVPZiAvLyBvdmVybG9hZCByZXNvbHV0aW9uIG5lZWRlZCIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxMigpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJBcnJheXM6OnNvcnQgLy8gdHlwZSBhcmd1bWVudHMgaW5mZXJyZWQgZnJvbSBjb250ZXh0Iik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTEzKCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoIkFycmF5czo6PFN0cmluZz5zb3J0IC8vIGV4cGxpY2l0IHR5cGUgYXJndW1lbnRzIik7CisgICAgfQorICAgICAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlZmVyZW5jZTE0KCkgeworICAgICAgICBhc3NlcnRFeHByZXNzaW9uVmFsaWQoIkFycmF5TGlzdDxTdHJpbmc+OjpuZXcgLy8gY29uc3RydWN0b3IgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZSIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxNSgpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJBcnJheUxpc3Q6Om5ldyAvLyBpbmZlcnJlZCB0eXBlIGFyZ3VtZW50cyIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxNigpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJGb286OjxJbnRlZ2VyPm5ldyAvLyBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cyIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxNygpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJCYXI8U3RyaW5nPjo6PEludGVnZXI+bmV3IC8vIGdlbmVyaWMgY2xhc3MsIGdlbmVyaWMgY29uc3RydWN0b3IiKTsKKyAgICB9CisgICAgICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVmZXJlbmNlMTgoKSB7CisgICAgICAgIGFzc2VydEV4cHJlc3Npb25WYWxpZCgiT3V0ZXIuSW5uZXI6Om5ldyAvLyBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvciIpOworICAgIH0KKyAgICAgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWZlcmVuY2UxOSgpIHsKKyAgICAgICAgYXNzZXJ0RXhwcmVzc2lvblZhbGlkKCJpbnRbXTo6bmV3IC8vIGFycmF5IGNyZWF0aW9uIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05hbWVUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvTmFtZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGYzYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9leHByL05hbWVUZXN0LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTcgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUHJvYmxlbUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLkNvbmNyZXRlU3ludGF4TW9kZWw7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uc0ZvckludGVyZmFjZVR5cGVzLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgTmFtZVRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb3V0ZXJOYW1lRXhwcklzVGhlUmlnaHRNb3N0SWRlbnRpZmllcigpIHsKKyAgICAgICAgTmFtZSBuYW1lID0gcGFyc2VOYW1lKCJhLmIuYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBuYW1lLmdldElkZW50aWZpZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzaW5nQW5kVW5wYXJzaW5nV29ya3MoKSB7CisgICAgICAgIE5hbWUgbmFtZSA9IHBhcnNlTmFtZSgiYS5iLmMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLmIuYyIsIG5hbWUuYXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBQYXJzZVByb2JsZW1FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgcGFyc2luZ0VtcHR5TmFtZVRocm93c0V4Y2VwdGlvbigpIHsKKyAgICAgICAgcGFyc2VOYW1lKCIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5hbWVDYW5IYXZlQW5ub3RhdGlvbnNJbnNpZGUoKSB7CisgICAgICAgIE5hbWUgbmFtZSA9IHBhcnNlTmFtZSgiYS5AQSBiLiBAQyBjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYS5iLmMiLCBuYW1lLmFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRUaGF0KG5hbWUuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcigiQyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuYW1lLmdldFF1YWxpZmllcigpLmdldCgpLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIoIkEiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLkBBIGIuQEMgYyIsIG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYS5AQSBiLkBDIGMiLCBDb25jcmV0ZVN5bnRheE1vZGVsLmdlbmVyaWNQcmV0dHlQcmludChuYW1lKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbXBvcnROYW1lKCkgeworICAgICAgICBJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA9IHBhcnNlSW1wb3J0KCJpbXBvcnQgamF2YS5AQWJjIHV0aWwuTGlzdDsiKTsKKworICAgICAgICBhc3NlcnRUaGF0KGltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRRdWFsaWZpZXIoKS5nZXQoKS5nZXRBbm5vdGF0aW9ucygpKS5jb250YWluc0V4YWN0bHkobmV3IE1hcmtlckFubm90YXRpb25FeHByKCJBYmMiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgamF2YS5AQWJjIHV0aWwuTGlzdDsiICsgRU9MLCBpbXBvcnREZWNsYXJhdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgamF2YS5AQWJjIHV0aWwuTGlzdDsiICsgRU9MLCBDb25jcmV0ZVN5bnRheE1vZGVsLmdlbmVyaWNQcmV0dHlQcmludChpbXBvcnREZWNsYXJhdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFja2FnZU5hbWUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJwYWNrYWdlIEBBYmMgcDEucDI7Iik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjdS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5nZXQoKS5nZXROYW1lKCkuZ2V0UXVhbGlmaWVyKCkuZ2V0KCkuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcigiQWJjIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygicGFja2FnZSBAQWJjIHAxLnAyOyIgKyBFT0wgKyBFT0wsIGN1LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhY2thZ2UgQEFiYyBwMS5wMjsiICsgRU9MICsgRU9MLCBDb25jcmV0ZVN5bnRheE1vZGVsLmdlbmVyaWNQcmV0dHlQcmludChjdSkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2ltcGxlTmFtZVRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TaW1wbGVOYW1lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTAyODUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU2ltcGxlTmFtZVRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNyBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZVNpbXBsZU5hbWU7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVOYW1lVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRDb25zdHJ1Y3RvclNldHNJZGVudGlmaWVyVG9FbXB0eSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbXB0eSIsIG5ldyBTaW1wbGVOYW1lKCkuZ2V0SWRlbnRpZmllcigpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGlkZW50aWZpZXJNdXN0Tm90QmVFbXB0eSgpIHsKKyAgICAgICAgbmV3IFNpbXBsZU5hbWUoIiIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgICAgcHVibGljIHZvaWQgaWRlbnRpZmllck11c3ROb3RCZU51bGwoKSB7CisgICAgICAgIG5ldyBTaW1wbGVOYW1lKG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdW5pY29kZUVzY2FwZXNBcmVQcmVzZXJ2ZWRJbklkZW50aWZpZXJzKCkgeworICAgICAgICBTaW1wbGVOYW1lIG5hbWUgPSBwYXJzZVNpbXBsZU5hbWUoInh4eFxcdTIxMjJ4eHgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eHhcXHUyMTIyeHh4IiwgbmFtZS5hc1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3RyaW5nTGl0ZXJhbEV4cHJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2V4cHIvU3RyaW5nTGl0ZXJhbEV4cHJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhOWJmYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvZXhwci9TdHJpbmdMaXRlcmFsRXhwclRlc3QuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitwdWJsaWMgY2xhc3MgU3RyaW5nTGl0ZXJhbEV4cHJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHVuaWNvZGVFc2NhcGVzQXJlUHJlc2VydmVkSW5TdHJpbmdzKCkgeworICAgICAgICBTdHJpbmdMaXRlcmFsRXhwciBvbWVnYSA9IHBhcnNlRXhwcmVzc2lvbigiXCJ4eHhcXHUwM2E5eHh4XCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eHhcXHUwM2E5eHh4Iiwgb21lZ2EuZ2V0VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9pbXBvcnRzL0ltcG9ydERlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9pbXBvcnRzL0ltcG9ydERlY2xhcmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODIxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L2ltcG9ydHMvSW1wb3J0RGVjbGFyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5pbXBvcnRzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5JbXBvcnREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEltcG9ydERlY2xhcmF0aW9uVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW5nbGVUeXBlSW1wb3J0RGVjbGFyYXRpb24oKSB7CisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGkgPSBKYXZhUGFyc2VyLnBhcnNlSW1wb3J0KCJpbXBvcnQgYS5iLmMuWDsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLmIuYy5YIiwgaS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0eXBlSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbigpIHsKKyAgICAgICAgSW1wb3J0RGVjbGFyYXRpb24gaSA9IEphdmFQYXJzZXIucGFyc2VJbXBvcnQoImltcG9ydCBhLmIuYy5ELio7Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiYS5iLmMuRCIsIGkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkQiLCBpLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2luZ2xlU3RhdGljSW1wb3J0RGVjbGFyYXRpb24oKSB7CisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGkgPSBKYXZhUGFyc2VyLnBhcnNlSW1wb3J0KCJpbXBvcnQgc3RhdGljIGEuYi5jLlguZGVmOyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEuYi5jLlgiLCBpLmdldE5hbWUoKS5nZXRRdWFsaWZpZXIoKS5nZXQoKS5hc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYiLCBpLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RhdGljSW1wb3J0T25EZW1hbmREZWNsYXJhdGlvbigpIHsKKyAgICAgICAgSW1wb3J0RGVjbGFyYXRpb24gaSA9IEphdmFQYXJzZXIucGFyc2VJbXBvcnQoImltcG9ydCBzdGF0aWMgYS5iLmMuWC4qOyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEuYi5jLlgiLCBpLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEphdmFkb2NUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aEphdmFkb2NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3MjhlNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoSmF2YWRvY1Rlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNyBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIE5vZGVXaXRoSmF2YWRvY1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVKYXZhRG9jTmVnYXRpdmVDYXNlTm9Db21tZW50KCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAiRm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZGVjbC5yZW1vdmVKYXZhRG9jQ29tbWVudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUphdmFEb2NOZWdhdGl2ZUNhc2VDb21tZW50Tm90SmF2YURvYygpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGRlY2wgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBmYWxzZSwgIkZvbyIpOworICAgICAgICBkZWNsLnNldENvbW1lbnQobmV3IExpbmVDb21tZW50KCJBIGNvbW1lbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZGVjbC5yZW1vdmVKYXZhRG9jQ29tbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZWNsLmdldENvbW1lbnQoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVKYXZhRG9jUG9zaXRpdmVDYXNlKCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAiRm9vIik7CisgICAgICAgIGRlY2wuc2V0Q29tbWVudChuZXcgSmF2YWRvY0NvbW1lbnQoIkEgY29tbWVudCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGRlY2wucmVtb3ZlSmF2YURvY0NvbW1lbnQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGRlY2wuZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldEphdmFkb2NPbk1ldGhvZFdpdGhMaW5lQ29tbWVudFNob3VsZFJldHVybkVtcHR5T3B0aW9uYWwoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbigpOworICAgICAgICBtZXRob2Quc2V0TGluZUNvbW1lbnQoIkxvcmVtIElwc3VtLiIpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1ldGhvZC5nZXRKYXZhZG9jQ29tbWVudCgpLmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWV0aG9kLmdldEphdmFkb2MoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNb2RpZmllcnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aE1vZGlmaWVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGMzMDJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhNb2RpZmllcnNUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTcgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5Bc3RPYnNlcnZlckFkYXB0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlci5PYnNlcnZhYmxlUHJvcGVydHk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBOb2RlV2l0aE1vZGlmaWVyc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZmllcldvcmtzKCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAiRm9vIik7CisgICAgICAgIGRlY2wuYWRkTW9kaWZpZXIoTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKSwgZGVjbC5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZmllclRyaWdnZXJOb3RpZmljYXRpb24oKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFuZ2VzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gZGVjbCA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgIGZhbHNlLCAiRm9vIik7CisgICAgICAgIGRlY2wucmVnaXN0ZXIobmV3IEFzdE9ic2VydmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoTm9kZSBvYnNlcnZlZE5vZGUsIE9ic2VydmFibGVQcm9wZXJ0eSBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VzLmFkZCgicHJvcGVydHkgIiArIHByb3BlcnR5Lm5hbWUoKSArICIgaXMgY2hhbmdlZCB0byAiICsgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgZGVjbC5hZGRNb2RpZmllcihNb2RpZmllci5QVUJMSUMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hhbmdlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByb3BlcnR5IE1PRElGSUVSUyBpcyBjaGFuZ2VkIHRvIFtQVUJMSUNdIiwgY2hhbmdlcy5nZXQoMCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoT3B0aW9uYWxTY29wZVRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvbm9kZVR5cGVzL05vZGVXaXRoT3B0aW9uYWxTY29wZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdlOGJkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhPcHRpb25hbFNjb3BlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBOb2RlV2l0aE9wdGlvbmFsU2NvcGVUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29tbW9uRXhwcmVzc2lvbldoaWNoSGF2ZUludGVyZmFjZU5vZGVXaXRoT3B0aW9uYWxTY29wZSgpIHsKKyAgICAgICAgTm9kZVdpdGhPcHRpb25hbFNjb3BlIG1ldGhvZENhbGxFeHByID0gbmV3IE1ldGhvZENhbGxFeHByKG5ldyBOYW1lRXhwcigiQSIpLCAiY2FsbCIpOworICAgICAgICBOb2RlV2l0aE9wdGlvbmFsU2NvcGUgb2JqZWN0Q3JlYXRpb25FeHByID0gbmV3IE9iamVjdENyZWF0aW9uRXhwcigpOworCisgICAgICAgIGFzc2VydFRydWUobWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG9iamVjdENyZWF0aW9uRXhwci5nZXRTY29wZSgpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNjb3BlKCkgeworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IG5ldyBNZXRob2RDYWxsRXhwcihuZXcgTmFtZUV4cHIoIkEiKSwgIm1ldGhvZCIpOworCisgICAgICAgIG1ldGhvZENhbGxFeHByLnJlbW92ZVNjb3BlKCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobWV0aG9kQ2FsbEV4cHIuZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUcmF2ZXJzYWJsZVNjb3BlVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhUcmF2ZXJzYWJsZVNjb3BlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWFmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFRyYXZlcnNhYmxlU2NvcGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk1ldGhvZENhbGxFeHByOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRJbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCitwdWJsaWMgY2xhc3MgTm9kZVdpdGhUcmF2ZXJzYWJsZVNjb3BlVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0cmF2ZXJzZTEoKSB7CisgICAgICAgIE5vZGVXaXRoVHJhdmVyc2FibGVTY29wZSBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCJnZXRBZGRyZXNzKCkubmFtZS5zdGFydHNXaXRoKFwiYWJjXCIpIik7CisKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihNZXRob2RDYWxsRXhwci5jbGFzcywgZXhwcmVzc2lvbik7CisgICAgICAgIGV4cHJlc3Npb24gPSAoTm9kZVdpdGhUcmF2ZXJzYWJsZVNjb3BlKSBleHByZXNzaW9uLnRyYXZlcnNlU2NvcGUoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihGaWVsZEFjY2Vzc0V4cHIuY2xhc3MsIGV4cHJlc3Npb24pOworICAgICAgICBleHByZXNzaW9uID0gKE5vZGVXaXRoVHJhdmVyc2FibGVTY29wZSkgZXhwcmVzc2lvbi50cmF2ZXJzZVNjb3BlKCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEluc3RhbmNlT2YoTWV0aG9kQ2FsbEV4cHIuY2xhc3MsIGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRGYWxzZShleHByZXNzaW9uLnRyYXZlcnNlU2NvcGUoKS5pc1ByZXNlbnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhWYXJpYWJsZXNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L25vZGVUeXBlcy9Ob2RlV2l0aFZhcmlhYmxlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM2MzMzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9ub2RlVHlwZXMvTm9kZVdpdGhWYXJpYWJsZXNUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuVmFyaWFibGVEZWNsYXJhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBOb2RlV2l0aFZhcmlhYmxlc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRDb21tb25UeXBlV29ya3NGb3JOb3JtYWxWYXJpYWJsZXMoKSB7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGRlY2xhcmF0aW9uID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50IGEsYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCksIGRlY2xhcmF0aW9uLmdldENvbW1vblR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRDb21tb25UeXBlV29ya3NGb3JBcnJheVR5cGVzKCkgeworICAgICAgICBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCJpbnQgYVtdLGJbXSIpLmdldENvbW1vblR5cGUoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGdldENvbW1vblR5cGVGYWlsc09uQXJyYXlEaWZmZXJlbmNlcygpIHsKKyAgICAgICAgcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50IGFbXSxiW11bXSIpLmdldENvbW1vblR5cGUoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGdldENvbW1vblR5cGVGYWlsc09uRG9kZ3lTZXR0ZXJVc2FnZSgpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgZGVjbGFyYXRpb24gPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCJpbnQgYSxiIik7CisgICAgICAgIGRlY2xhcmF0aW9uLmdldFZhcmlhYmxlKDEpLnNldFR5cGUoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZGVjbGFyYXRpb24uZ2V0Q29tbW9uVHlwZSgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgICAgcHVibGljIHZvaWQgZ2V0Q29tbW9uVHlwZUZhaWxzT25JbnZhbGlkRW1wdHlWYXJpYWJsZUxpc3QoKSB7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGRlY2xhcmF0aW9uID0gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50IGEiKTsKKyAgICAgICAgZGVjbGFyYXRpb24uZ2V0VmFyaWFibGVzKCkuY2xlYXIoKTsKKyAgICAgICAgZGVjbGFyYXRpb24uZ2V0Q29tbW9uVHlwZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0RWxlbWVudFR5cGVXb3Jrc0Zvck5vcm1hbFZhcmlhYmxlcygpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgZGVjbGFyYXRpb24gPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCJpbnQgYSxiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhQcmltaXRpdmVUeXBlLmludFR5cGUoKSwgZGVjbGFyYXRpb24uZ2V0RWxlbWVudFR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRFbGVtZW50VHlwZVdvcmtzRm9yQXJyYXlUeXBlcygpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgZGVjbGFyYXRpb24gPSBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCJpbnQgYVtdLGJbXSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCksIGRlY2xhcmF0aW9uLmdldEVsZW1lbnRUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0RWxlbWVudFR5cGVJc09rYXlXaXRoQXJyYXlEaWZmZXJlbmNlcygpIHsKKyAgICAgICAgcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50IGFbXSxiW11bXSIpLmdldEVsZW1lbnRUeXBlKCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBnZXRFbGVtZW50VHlwZUZhaWxzT25Eb2RneVNldHRlclVzYWdlKCkgeworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBkZWNsYXJhdGlvbiA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoImludCBhLGIiKTsKKyAgICAgICAgZGVjbGFyYXRpb24uZ2V0VmFyaWFibGUoMSkuc2V0VHlwZShTdHJpbmcuY2xhc3MpOworICAgICAgICBkZWNsYXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgICAgcHVibGljIHZvaWQgZ2V0RWxlbWVudFR5cGVGYWlsc09uSW52YWxpZEVtcHR5VmFyaWFibGVMaXN0KCkgeworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBkZWNsYXJhdGlvbiA9IHBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoImludCBhIik7CisgICAgICAgIGRlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpLmNsZWFyKCk7CisgICAgICAgIGRlY2xhcmF0aW9uLmdldEVsZW1lbnRUeXBlKCk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Qcm9wYWdhdGluZ0FzdE9ic2VydmVyVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9vYnNlcnZlci9Qcm9wYWdhdGluZ0FzdE9ic2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTBmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L29ic2VydmVyL1Byb3BhZ2F0aW5nQXN0T2JzZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5vYnNlcnZlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFByb3BhZ2F0aW5nQXN0T2JzZXJ2ZXJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZlcmlmeVByb3BhZ2F0aW9uKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgIH0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBMaXN0PFN0cmluZz4gY2hhbmdlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBBc3RPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBQcm9wYWdhdGluZ0FzdE9ic2VydmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb25jcmV0ZVByb3BlcnR5Q2hhbmdlKE5vZGUgb2JzZXJ2ZWROb2RlLCBPYnNlcnZhYmxlUHJvcGVydHkgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlcy5hZGQoU3RyaW5nLmZvcm1hdCgiJXMuJXMgY2hhbmdlZCBmcm9tICVzIHRvICVzIiwgb2JzZXJ2ZWROb2RlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBwcm9wZXJ0eS5uYW1lKCkudG9Mb3dlckNhc2UoKSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGN1LnJlZ2lzdGVyRm9yU3VidHJlZShvYnNlcnZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoKSwgY2hhbmdlcyk7CisKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5hZGRGaWVsZCgiU3RyaW5nIiwgImZvbyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgpLCBjaGFuZ2VzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZpZWxkRGVjbGFyYXRpb24uaXNSZWdpc3RlcmVkKG9ic2VydmVyKSk7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRGaWVsZEJ5TmFtZSgiZm9vIikuZ2V0KCkuZ2V0VmFyaWFibGVzKCkuZ2V0KDApLnNldE5hbWUoIkJhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiVmFyaWFibGVEZWNsYXJhdG9yLm5hbWUgY2hhbmdlZCBmcm9tIGZvbyB0byBCYXIiKSwgY2hhbmdlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L0Jsb2NrU3RtdFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9CbG9ja1N0bXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1OTc2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9CbG9ja1N0bXRUZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWV0aG9kQ2FsbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQmxvY2tTdG10VGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc3N1ZTc0OEFkZGluZ0lkZW50aWNhbFN0YXRlbWVudHNEb2VzUGFyZW50aW5nUmlnaHQoKSB7CisgICAgICAgIEJsb2NrU3RtdCBibG9ja1N0bXQgPSBuZXcgQmxvY2tTdG10KCk7CisgICAgICAgIEV4cHJlc3Npb24gZXhwID0gbmV3IE5hbWVFeHByKCJ4Iik7CisgICAgICAgIE1ldGhvZENhbGxFeHByIGV4cHJlc3Npb24gPSBuZXcgTWV0aG9kQ2FsbEV4cHIoZXhwLCAieSIpOworCisgICAgICAgIGJsb2NrU3RtdC5hZGRTdGF0ZW1lbnQoZXhwcmVzc2lvbik7CisgICAgICAgIGJsb2NrU3RtdC5hZGRTdGF0ZW1lbnQoZXhwcmVzc2lvbi5jbG9uZSgpKTsKKyAgICAgICAgLy8gVGhpcyBmYWlscyB3aGVuIHRoZSBpc3N1ZSBleGlzdHM6CisgICAgICAgIFN0cmluZyBzID0gYmxvY2tTdG10LnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZFbHNlU3RtdFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9JZkVsc2VTdG10VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzViZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3N0bXQvSWZFbHNlU3RtdFRlc3QuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NZXRob2RDYWxsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZUV4cHI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJZkVsc2VTdG10VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTI0N3dpdGhFbHNlU2luZ2xlU3RtdCgpIHsKKyAgICAgICAgSWZTdG10IGlmU3RtdCA9IChJZlN0bXQpIEphdmFQYXJzZXIucGFyc2VTdGF0ZW1lbnQoImlmIChjb25kKSBkb1NvbWV0aGluZygpOyBlbHNlIGRvU29tZXRoaW5nRWxzZSgpOyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGlmU3RtdC5oYXNFbHNlQmxvY2soKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBpZlN0bXQuaGFzRWxzZUJyYW5jaCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBpZlN0bXQuaGFzQ2FzY2FkaW5nSWZTdG10KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUxMjQ3d2l0aEVsc2VCbG9ja1N0bXQoKSB7CisgICAgICAgIElmU3RtdCBpZlN0bXQgPSAoSWZTdG10KSBKYXZhUGFyc2VyLnBhcnNlU3RhdGVtZW50KCJpZiAoY29uZCkgZG9Tb21ldGhpbmcoKTsgZWxzZSB7IGRvU29tZXRoaW5nRWxzZSgpOyB9Iik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBpZlN0bXQuaGFzRWxzZUJsb2NrKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgaWZTdG10Lmhhc0Vsc2VCcmFuY2goKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgaWZTdG10Lmhhc0Nhc2NhZGluZ0lmU3RtdCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTI0N3dpdGhFbHNlU2luZ2xlU3RtdFdoaWNoSXNBbklmKCkgeworICAgICAgICBJZlN0bXQgaWZTdG10ID0gKElmU3RtdCkgSmF2YVBhcnNlci5wYXJzZVN0YXRlbWVudCgiaWYgKGNvbmQxKSBkb1NvbWV0aGluZygpOyBlbHNlIGlmIChjb25kMikgZG9Tb21ldGhpbmdFbHNlKCk7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgaWZTdG10Lmhhc0Vsc2VCbG9jaygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGlmU3RtdC5oYXNFbHNlQnJhbmNoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgaWZTdG10Lmhhc0Nhc2NhZGluZ0lmU3RtdCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UcnlTdG10VGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC9zdG10L1RyeVN0bXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2M2IyMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3Qvc3RtdC9UcnlTdG10VGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5GaWVsZEFjY2Vzc0V4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWVFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5KYXZhOVZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0SW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgVHJ5U3RtdFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2ltcGxlVGVzdCgpIHsKKyAgICAgICAgVHJ5U3RtdCB0cnlTdG10ID0gcGFyc2U5KCJ0cnkoUmVhZGVyIHggPSBuZXcgRmlsZVJlYWRlcigpKXt9Iik7CisgICAgICAgIGFzc2VydEluc3RhbmNlT2YoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuY2xhc3MsIHRyeVN0bXQuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG11bHRpcGxlVGVzdCgpIHsKKyAgICAgICAgVHJ5U3RtdCB0cnlTdG10ID0gcGFyc2U5KCJ0cnkoUmVhZGVyIHggPSBuZXcgRmlsZVJlYWRlcigpOyBSZWFkZXIgeCA9IG5ldyBGaWxlUmVhZGVyKCkpe30iKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihWYXJpYWJsZURlY2xhcmF0aW9uRXhwci5jbGFzcywgdHJ5U3RtdC5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtb2RpZmllcnNUZXN0KCkgeworICAgICAgICBUcnlTdG10IHRyeVN0bXQgPSBwYXJzZTkoInRyeShmaW5hbCBAQSBSZWFkZXIgeCA9IG5ldyBGaWxlUmVhZGVyKCkpe30iKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihWYXJpYWJsZURlY2xhcmF0aW9uRXhwci5jbGFzcywgdHJ5U3RtdC5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW1wbGVWYXJpYWJsZSgpIHsKKyAgICAgICAgVHJ5U3RtdCB0cnlTdG10ID0gcGFyc2U5KCJ0cnkoYSl7fSIpOworICAgICAgICBhc3NlcnRJbnN0YW5jZU9mKE5hbWVFeHByLmNsYXNzLCB0cnlTdG10LmdldFJlc291cmNlcygpLmdldCgwKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHR3b1NpbXBsZVZhcmlhYmxlcygpIHsKKyAgICAgICAgVHJ5U3RtdCB0cnlTdG10ID0gcGFyc2U5KCJ0cnkoYTtiKXt9Iik7CisgICAgICAgIGFzc2VydEluc3RhbmNlT2YoTmFtZUV4cHIuY2xhc3MsIHRyeVN0bXQuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VPZihOYW1lRXhwci5jbGFzcywgdHJ5U3RtdC5nZXRSZXNvdXJjZXMoKS5nZXQoMSkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21wbGV4VmFyaWFibGUoKSB7CisgICAgICAgIFRyeVN0bXQgdHJ5U3RtdCA9IHBhcnNlOSgidHJ5KGEuYi5jKXt9Iik7CisgICAgICAgIGFzc2VydEluc3RhbmNlT2YoRmllbGRBY2Nlc3NFeHByLmNsYXNzLCB0cnlTdG10LmdldFJlc291cmNlcygpLmdldCgwKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN1cGVyQWNjZXNzKCkgeworICAgICAgICBUcnlTdG10IHRyeVN0bXQgPSBwYXJzZTkoInRyeShzdXBlci5hKXt9Iik7CisgICAgICAgIGFzc2VydEluc3RhbmNlT2YoRmllbGRBY2Nlc3NFeHByLmNsYXNzLCB0cnlTdG10LmdldFJlc291cmNlcygpLmdldCgwKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG91dGVyQ2xhc3NBY2Nlc3MoKSB7CisgICAgICAgIFRyeVN0bXQgdHJ5U3RtdCA9IHBhcnNlOSgidHJ5KFgudGhpcy5hKXt9Iik7CisgICAgICAgIGFzc2VydEluc3RhbmNlT2YoRmllbGRBY2Nlc3NFeHByLmNsYXNzLCB0cnlTdG10LmdldFJlc291cmNlcygpLmdldCgwKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBUIHBhcnNlOShTdHJpbmcgY29kZSkgeworICAgICAgICBKYXZhUGFyc2VyIHBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzkpKTsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBwYXJzZXIucGFyc2UoUGFyc2VTdGFydC5TVEFURU1FTlQsIHByb3ZpZGVyKGNvZGUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQudG9TdHJpbmcoKSwgcmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKTsKKyAgICAgICAgcmV0dXJuIChUKSByZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL0FycmF5VHlwZVRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9BcnJheVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkZWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9BcnJheVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5BcnJheUNyZWF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTWFya2VyQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5FeHByZXNzaW9uU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5Db25jcmV0ZVN5bnRheE1vZGVsOworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgQXJyYXlUeXBlVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRGaWVsZERlY2xhcmF0aW9uV2l0aEFycmF5cygpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oIkBDIGludCBAQVtdIEBCW10gYSBAWFtdIEBZW107IikuYXNGaWVsZERlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZTEgPSBmaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlKDApLmdldFR5cGUoKS5hc0FycmF5VHlwZSgpOworICAgICAgICBBcnJheVR5cGUgYXJyYXlUeXBlMiA9IGFycmF5VHlwZTEuZ2V0Q29tcG9uZW50VHlwZSgpLmFzQXJyYXlUeXBlKCk7CisgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUzID0gYXJyYXlUeXBlMi5nZXRDb21wb25lbnRUeXBlKCkuYXNBcnJheVR5cGUoKTsKKyAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZTQgPSBhcnJheVR5cGUzLmdldENvbXBvbmVudFR5cGUoKS5hc0FycmF5VHlwZSgpOworICAgICAgICBQcmltaXRpdmVUeXBlIGVsZW1lbnRUeXBlID0gYXJyYXlUeXBlNC5nZXRDb21wb25lbnRUeXBlKCkuYXNQcmltaXRpdmVUeXBlKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhcnJheVR5cGUxLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIocGFyc2VOYW1lKCJBIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhcnJheVR5cGUyLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIocGFyc2VOYW1lKCJCIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhcnJheVR5cGUzLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIocGFyc2VOYW1lKCJYIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhcnJheVR5cGU0LmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIocGFyc2VOYW1lKCJZIikpKTsKKworICAgICAgICBhc3NlcnRUaGF0KGVsZW1lbnRUeXBlLmdldFR5cGUoKSkuaXNFcXVhbFRvKFByaW1pdGl2ZVR5cGUuUHJpbWl0aXZlLklOVCk7CisgICAgICAgIGFzc2VydFRoYXQoZmllbGREZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpKS5jb250YWluc0V4YWN0bHkobmV3IE1hcmtlckFubm90YXRpb25FeHByKHBhcnNlTmFtZSgiQyIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhcnJheVR5cGUxLmdldFBhcmVudE5vZGUoKS5nZXQoKS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpLmlzU2FtZUFzKGZpZWxkRGVjbGFyYXRpb24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0VmFyaWFibGVEZWNsYXJhdGlvbldpdGhBcnJheXMoKSB7CisgICAgICAgIEV4cHJlc3Npb25TdG10IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgiQEMgaW50IEBBW10gQEJbXSBhIEBYW10gQFlbXTsiKS5hc0V4cHJlc3Npb25TdG10KCk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCkuYXNWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigpOworCisgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUxID0gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHIuZ2V0VmFyaWFibGUoMCkuZ2V0VHlwZSgpLmFzQXJyYXlUeXBlKCk7CisgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUyID0gYXJyYXlUeXBlMS5nZXRDb21wb25lbnRUeXBlKCkuYXNBcnJheVR5cGUoKTsKKyAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZTMgPSBhcnJheVR5cGUyLmdldENvbXBvbmVudFR5cGUoKS5hc0FycmF5VHlwZSgpOworICAgICAgICBBcnJheVR5cGUgYXJyYXlUeXBlNCA9IGFycmF5VHlwZTMuZ2V0Q29tcG9uZW50VHlwZSgpLmFzQXJyYXlUeXBlKCk7CisgICAgICAgIFByaW1pdGl2ZVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGU0LmdldENvbXBvbmVudFR5cGUoKS5hc1ByaW1pdGl2ZVR5cGUoKTsKKworICAgICAgICBhc3NlcnRUaGF0KGFycmF5VHlwZTEuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIkEiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGFycmF5VHlwZTIuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIkIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGFycmF5VHlwZTMuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIlgiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGFycmF5VHlwZTQuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIlkiKSkpOworCisgICAgICAgIGFzc2VydFRoYXQoZWxlbWVudFR5cGUuZ2V0VHlwZSgpKS5pc0VxdWFsVG8oUHJpbWl0aXZlVHlwZS5QcmltaXRpdmUuSU5UKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRBbm5vdGF0aW9ucygpKS5jb250YWluc0V4YWN0bHkobmV3IE1hcmtlckFubm90YXRpb25FeHByKHBhcnNlTmFtZSgiQyIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhcnJheVR5cGUxLmdldFBhcmVudE5vZGUoKS5nZXQoKS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpLmlzU2FtZUFzKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldE1ldGhvZERlY2xhcmF0aW9uV2l0aEFycmF5cygpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBwYXJzZUJvZHlEZWNsYXJhdGlvbigiQEMgaW50IEBBW10gYSgpIEBCW10ge30iKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZTEgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRUeXBlKCkuYXNBcnJheVR5cGUoKTsKKyAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZTIgPSBhcnJheVR5cGUxLmdldENvbXBvbmVudFR5cGUoKS5hc0FycmF5VHlwZSgpOworICAgICAgICBUeXBlIGVsZW1lbnRUeXBlID0gYXJyYXlUeXBlMi5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZWxlbWVudFR5cGUpLmlzSW5zdGFuY2VPZihQcmltaXRpdmVUeXBlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGFycmF5VHlwZTEuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIkEiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGFycmF5VHlwZTIuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIkIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIocGFyc2VOYW1lKCJDIikpKTsKKworICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZERlY2xhcmF0aW9uLmdldFR5cGUoKS5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpLmlzU2FtZUFzKG1ldGhvZERlY2xhcmF0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFBhcmFtZXRlcldpdGhBcnJheXMoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gcGFyc2VCb2R5RGVjbGFyYXRpb24oInZvaWQgYShAQyBpbnQgQEFbXSBhIEBCW10pIHt9IikuYXNNZXRob2REZWNsYXJhdGlvbigpOworCisgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXIoMCk7CisKKyAgICAgICAgQXJyYXlUeXBlIG91dGVyQXJyYXlUeXBlID0gcGFyYW1ldGVyLmdldFR5cGUoKS5hc0FycmF5VHlwZSgpOworCisgICAgICAgIEFycmF5VHlwZSBpbm5lckFycmF5VHlwZSA9IG91dGVyQXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKS5hc0FycmF5VHlwZSgpOworICAgICAgICBQcmltaXRpdmVUeXBlIGVsZW1lbnRUeXBlID0gaW5uZXJBcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmFzUHJpbWl0aXZlVHlwZSgpOworCisgICAgICAgIGFzc2VydFRoYXQoZWxlbWVudFR5cGUpLmlzSW5zdGFuY2VPZihQcmltaXRpdmVUeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvdXRlckFycmF5VHlwZS5nZXRBbm5vdGF0aW9ucygpKS5jb250YWluc0V4YWN0bHkobmV3IE1hcmtlckFubm90YXRpb25FeHByKHBhcnNlTmFtZSgiQSIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoaW5uZXJBcnJheVR5cGUuZ2V0QW5ub3RhdGlvbnMoKSkuY29udGFpbnNFeGFjdGx5KG5ldyBNYXJrZXJBbm5vdGF0aW9uRXhwcihwYXJzZU5hbWUoIkIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KHBhcmFtZXRlci5nZXRBbm5vdGF0aW9ucygpKS5jb250YWluc0V4YWN0bHkobmV3IE1hcmtlckFubm90YXRpb25FeHByKHBhcnNlTmFtZSgiQyIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChwYXJhbWV0ZXIuZ2V0VHlwZSgpLmdldFBhcmVudE5vZGUoKS5nZXQoKSkuaXNTYW1lQXMocGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlRGVjbGFyYXRpb25XaXRoQXJyYXlzKCkgeworICAgICAgICBFeHByZXNzaW9uU3RtdCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gcGFyc2VTdGF0ZW1lbnQoIkBDIGludCBAQVtdIEBCW10gYSBAWFtdIEBZW107IikuYXNFeHByZXNzaW9uU3RtdCgpOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2YXJpYWJsZURlY2xhcmF0aW9uRXhwciA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLmFzVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKTsKKworICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uRXhwci5nZXRWYXJpYWJsZSgwKS5zZXRUeXBlKG5ldyBBcnJheVR5cGUobmV3IEFycmF5VHlwZShQcmltaXRpdmVUeXBlLmludFR5cGUoKSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJAQyBpbnRbXVtdIGE7IiwgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkRGVjbGFyYXRpb25XaXRoQXJyYXlzKCkgeworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBwYXJzZUJvZHlEZWNsYXJhdGlvbigiaW50W11bXSBhW11bXTsiKS5hc0ZpZWxkRGVjbGFyYXRpb24oKTsKKyAgICAgICAgZmllbGREZWNsYXJhdGlvbi5nZXRWYXJpYWJsZSgwKS5zZXRUeXBlKG5ldyBBcnJheVR5cGUobmV3IEFycmF5VHlwZShwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKCJCbG9iIikpKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCbG9iW11bXSBhOyIsIGZpZWxkRGVjbGFyYXRpb24udG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2REZWNsYXJhdGlvbldpdGhBcnJheXMoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJpbnRbXVtdIGEoKVtdW10ge30iKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIG1ldGhvZC5zZXRUeXBlKG5ldyBBcnJheVR5cGUobmV3IEFycmF5VHlwZShwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKCJCbG9iIikpKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCbG9iW11bXSBhKCkgeyIgKyBFT0wgKyAifSIsIG1ldGhvZC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZpZWxkRGVjbGFyYXRpb25XaXRoQXJyYXlzSGFzQ29ycmVjdE9yaWdpbnMoKSB7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJpbnRbXSBhW107IikuYXNGaWVsZERlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgVHlwZSBvdXRlclR5cGUgPSBmaWVsZERlY2xhcmF0aW9uLmdldFZhcmlhYmxlcygpLmdldCgwKS5nZXRUeXBlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheVR5cGUuT3JpZ2luLlRZUEUsIG91dGVyVHlwZS5hc0FycmF5VHlwZSgpLmdldE9yaWdpbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5VHlwZS5PcmlnaW4uTkFNRSwgb3V0ZXJUeXBlLmFzQXJyYXlUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpLmFzQXJyYXlUeXBlKCkuZ2V0T3JpZ2luKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWV0aG9kRGVjbGFyYXRpb25XaXRoQXJyYXlzSGFzQ29ycmVjdE9yaWdpbnMoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgcGFyc2VCb2R5RGVjbGFyYXRpb24oImludFtdIGEoKVtdIHt9Iik7CisKKyAgICAgICAgVHlwZSBvdXRlclR5cGUgPSBtZXRob2QuZ2V0VHlwZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlUeXBlLk9yaWdpbi5UWVBFLCBvdXRlclR5cGUuYXNBcnJheVR5cGUoKS5nZXRPcmlnaW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheVR5cGUuT3JpZ2luLk5BTUUsIG91dGVyVHlwZS5hc0FycmF5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5hc0FycmF5VHlwZSgpLmdldE9yaWdpbigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcldpdGhBcnJheXMoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IHBhcnNlQm9keURlY2xhcmF0aW9uKCJ2b2lkIGEoaW50W11bXSBhW11bXSkge30iKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIG1ldGhvZC5nZXRQYXJhbWV0ZXIoMCkuc2V0VHlwZShuZXcgQXJyYXlUeXBlKG5ldyBBcnJheVR5cGUocGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZSgiQmxvYiIpKSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCBhKEJsb2JbXVtdIGEpIHsiICsgRU9MICsgIn0iLCBtZXRob2QudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRBcnJheUNyZWF0aW9uVHlwZSgpIHsKKyAgICAgICAgQXJyYXlDcmVhdGlvbkV4cHIgZXhwciA9IHBhcnNlRXhwcmVzc2lvbigibmV3IGludFtdIik7CisgICAgICAgIEFycmF5VHlwZSBvdXRlclR5cGUgPSBleHByLmNyZWF0ZWRUeXBlKCkuYXNBcnJheVR5cGUoKTsKKyAgICAgICAgVHlwZSBpbm5lclR5cGUgPSBvdXRlclR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICBhc3NlcnRUaGF0KGlubmVyVHlwZSkuaXNFcXVhbFRvKGV4cHIuZ2V0RWxlbWVudFR5cGUoKSk7CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZWxsaXBzaXNDYW5IYXZlQW5ub3RhdGlvbnNUb28oKSB7CisgICAgICAgIFBhcmFtZXRlciBwID0gcGFyc2VQYXJhbWV0ZXIoImludFtdQFguLi5hW10iKTsKKworICAgICAgICBhc3NlcnRUaGF0KHAuZ2V0VmFyQXJnc0Fubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseShuZXcgTWFya2VyQW5ub3RhdGlvbkV4cHIocGFyc2VOYW1lKCJYIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRbXVtdQFggLi4uIGEiLCBwLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdW11AWC4uLiBhIiwgQ29uY3JldGVTeW50YXhNb2RlbC5nZW5lcmljUHJldHR5UHJpbnQocCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9UeXBlVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC90eXBlL1R5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNDRmMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdHlwZS9UeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUHJvYmxlbUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yLkphdmE1VmFsaWRhdG9yOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlVHlwZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBUeXBlVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhc1N0cmluZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCB0eXBlQXNTdHJpbmcoImludCB4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxpc3Q8TG9uZz4iLCB0eXBlQXNTdHJpbmcoIkxpc3Q8TG9uZz4geCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCB0eXBlQXNTdHJpbmcoIkBBIFN0cmluZyB4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxpc3Q8PyBleHRlbmRzIE9iamVjdD4iLCB0eXBlQXNTdHJpbmcoIkxpc3Q8PyBleHRlbmRzIE9iamVjdD4geCIpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IFBhcnNlUHJvYmxlbUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBwcmltaXRpdmVUeXBlQXJndW1lbnREZWZhdWx0VmFsaWRhdG9yKCkgeworICAgICAgICB0eXBlQXNTdHJpbmcoIkxpc3Q8bG9uZz4geDsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW1pdGl2ZVR5cGVBcmd1bWVudExlbmllbnRWYWxpZGF0b3IoKSB7CisgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgICAgIC5zZXRMYW5ndWFnZUxldmVsKFJBVyk7CisgICAgICAgIGNvbmZpZy5nZXRQb3N0UHJvY2Vzc29ycygpLmFkZChuZXcgSmF2YTVWYWxpZGF0b3IoKSB7eworICAgICAgICAgICAgcmVtb3ZlKG5vUHJpbWl0aXZlR2VuZXJpY0FyZ3VtZW50cyk7CisgICAgICAgIH19LnBvc3RQcm9jZXNzb3IoKSk7CisKKyAgICAgICAgUGFyc2VSZXN1bHQ8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKGNvbmZpZykucGFyc2UoCisgICAgICAgICAgICAgICAgVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUiwgcHJvdmlkZXIoIkxpc3Q8bG9uZz4geCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaXNTdWNjZXNzZnVsKCkpOworCisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGRlY2wgPSByZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGlzdDxsb25nPiIsIGRlY2wuZ2V0VmFyaWFibGUoMCkuZ2V0VHlwZSgpLmFzU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHR5cGVBc1N0cmluZyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcihzKS5nZXRWYXJpYWJsZSgwKS5nZXRUeXBlKCkuYXNTdHJpbmcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFycmF5VHlwZSgpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gcGFyc2VUeXBlKCJpbnRbXSIpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGUuaXNBcnJheVR5cGUoKSk7CisgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSB0eXBlLmFzQXJyYXlUeXBlKCk7CisgICAgICAgIGZpbmFsIEFycmF5VHlwZVtdIHMgPSBuZXcgQXJyYXlUeXBlWzFdOworICAgICAgICB0eXBlLmlmQXJyYXlUeXBlKHQgLT4gc1swXSA9IHQpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNbMF0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUxMjUxKCkgeworICAgICAgICBmaW5hbCBUeXBlIHR5cGUgPSBwYXJzZVR5cGUoIlR5cGVVdGlsc1Rlc3Q8U3RyaW5nPi5UZXN0ZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUeXBlVXRpbHNUZXN0PFN0cmluZz4uVGVzdGVyIiwgdHlwZS50b1N0cmluZygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExMFZhbGlkYXRvclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExMFZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJiOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTEwVmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LkNMQVNTX0JPRFk7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LlNUQVRFTUVOVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC5KQVZBXzEwOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydE5vUHJvYmxlbXM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0UHJvYmxlbXM7CisKK3B1YmxpYyBjbGFzcyBKYXZhMTBWYWxpZGF0b3JUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzEwKSk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZhckFsbG93ZWRJbkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInZhciBhID0gNTsiKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZhckFsbG93ZWRJbkZvckVhY2goKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJmb3IodmFyIGEgOiBhcyl7fSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyQWxsb3dlZEluT2xkRm9yKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigiZm9yKHZhciBhID0gNTthPDk7YSsrKXt9IikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2YXJOb3RBbGxvd2VkSW5DYXN0KCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigiaW50IGEgPSAodmFyKTIwOyIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyTm90QWxsb3dlZEluVHJ5V2l0aFJlc291cmNlcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInRyeSh2YXIgZiA9IG5ldyBGaWxlUmVhZGVyKFwiXCIpKXsgfWNhdGNoIChFeGNlcHRpb24gZSl7IH0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDUpIFwidmFyXCIgaXMgbm90IGFsbG93ZWQgaGVyZS4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZhck5vdEFsbG93ZWRJbkZpZWxkKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxCb2R5RGVjbGFyYXRpb248Pz4+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ0xBU1NfQk9EWSwgcHJvdmlkZXIoInZhciBhID0gMjA7IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBcInZhclwiIGlzIG5vdCBhbGxvd2VkIGhlcmUuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2YXJOb3RBbGxvd2VkSW5UeXBlQXJndW1lbnRzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigibmV3IFg8dmFyPigpOyIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgNykgXCJ2YXJcIiBpcyBub3QgYWxsb3dlZCBoZXJlLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyTm90QWxsb3dlZEluTGFtYmRhUGFyYW1ldGVycygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoIngoKHZhciB4KSAtPiBudWxsKTsiKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDQpIFwidmFyXCIgaXMgbm90IGFsbG93ZWQgaGVyZS4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGVtcHR5SW5pdGlhbGl6ZXJOb3RBbGxvd2VkKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigidmFyIGE7IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBcInZhclwiIG5lZWRzIGFuIGluaXRpYWxpemVyLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXVsdGlwbGVWYXJpYWJsZXNOb3RBbGxvd2VkKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigidmFyIGE9MSwgYj0yOyIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMSkgXCJ2YXJcIiBvbmx5IHRha2VzIGEgc2luZ2xlIHZhcmlhYmxlLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbnVsbFZhcmlhYmxlc05vdEFsbG93ZWQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJ2YXIgYT1udWxsOyIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMSkgXCJ2YXJcIiBjYW5ub3QgaW5mZXIgdHlwZSBmcm9tIGp1c3QgbnVsbC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFycmF5RGltZW5zaW9uQnJhY2tldHNOb3RBbGxvd2VkKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigidmFyIGE9bmV3IFN0cmluZ1tde307IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBcInZhclwiIGNhbm5vdCBpbmZlciBhcnJheSB0eXBlcy4iKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHByZXR0eSBoYXJkIHRvIGltcG9zc2libGUgdG8gaW1wbGVtZW50IGNvcnJlY3RseSB3aXRoIGp1c3QgdGhlIEFTVC4KKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZWxmUmVmZXJlbmNlTm90QWxsb3dlZCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInZhciBhPWE7IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIiKTsKKyAgICB9CisKKyAgICAvLyBDYW4gYmUgaW1wbGVtZW50ZWQgb25jZSBodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2lzc3Vlcy8xNDM0IGlzIGltcGxlbWVudGVkLgorICAgIEBJZ25vcmUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBvbHlFeHByZXNzaW9uQXNJbml0aWFsaXplck5vdEFsbG93ZWQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJ2YXIgYT1uZXcgQXJyYXlMaXN0PD4oKTsiKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExMVZhbGlkYXRvclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExMVZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFmOGMwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTExVmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5TVEFURU1FTlQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uLkxhbmd1YWdlTGV2ZWwuSkFWQV8xMV9QUkVWSUVXOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydE5vUHJvYmxlbXM7CisKK3B1YmxpYyBjbGFzcyBKYXZhMTFWYWxpZGF0b3JUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzExX1BSRVZJRVcpKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyQWxsb3dlZEluTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigieCgodmFyIHgsIHZhciB5KSAtPiB4K3kpOyIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzBWYWxpZGF0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV8wVmFsaWRhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjBiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV8wVmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb2JsZW07CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0Lio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uLkxhbmd1YWdlTGV2ZWwuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnROb1Byb2JsZW1zOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydFByb2JsZW1zOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEphdmExXzBWYWxpZGF0b3JUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMCkpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0cnlXaXRob3V0UmVzb3VyY2VzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigidHJ5KFggeD1uZXcgWSgpKXt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIENhdGNoIHdpdGggcmVzb3VyY2UgaXMgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBUcnkgaGFzIG5vIGZpbmFsbHkgYW5kIG5vIGNhdGNoLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2xhc3NFeHRlbmRpbmdNb3JlVGhhbk9uZSgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYIGV4dGVuZHMgWSwgWiB7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMjApIEEgY2xhc3MgY2Fubm90IGV4dGVuZCBtb3JlIHRoYW4gb25lIG90aGVyIGNsYXNzLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlVXNpbmdJbXBsZW1lbnRzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImludGVyZmFjZSBYIGltcGxlbWVudHMgWSB7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMjQpIEFuIGludGVyZmFjZSBjYW5ub3QgaW1wbGVtZW50IG90aGVyIGludGVyZmFjZXMuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VXaXRoSW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiaW50ZXJmYWNlIFgge3t9fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMTQpIEFuIGludGVyZmFjZSBjYW5ub3QgaGF2ZSBpbml0aWFsaXplcnMuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0SW5DbGFzcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYIHtkZWZhdWx0IHZvaWQgYSgpe307fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMTApICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbGVmdEhhbmRBc3NpZ25tZW50Q2Fubm90QmVBQ29uZGl0aW9uYWwoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PEV4cHJlc3Npb24+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoRVhQUkVTU0lPTiwgcHJvdmlkZXIoIigxPT0yKT0zIikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBJbGxlZ2FsIGxlZnQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsZWZ0SGFuZEFzc2lnbm1lbnRDYW5ub3RCZUVtcHR5QnJhY2VzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxFeHByZXNzaW9uPiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKEVYUFJFU1NJT04sIHByb3ZpZGVyKCIoKT0zIikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIElsbGVnYWwgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudC4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBMYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbGVmdEhhbmRBc3NpZ25tZW50Q2FuQmVJbkJyYWNlcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8RXhwcmVzc2lvbj4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShFWFBSRVNTSU9OLCBwcm92aWRlcigiKGkpICs9IChpKSArPSAxIikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub0lubmVyQ2xhc3NlcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYe2NsYXNzIFl7fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDkpIGlubmVyIGNsYXNzZXMgb3IgaW50ZXJmYWNlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vUmVmbGVjdGlvbigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8RXhwcmVzc2lvbj4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShFWFBSRVNTSU9OLCBwcm92aWRlcigiQWJjLmNsYXNzIikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBSZWZsZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub25FbXB0eUxpc3QoKSB7CisgICAgICAgIEFycmF5Q3JlYXRpb25FeHByIGV4cHIgPSBuZXcgQXJyYXlDcmVhdGlvbkV4cHIoUHJpbWl0aXZlVHlwZS5ib29sZWFuVHlwZSgpKTsKKyAgICAgICAgTGlzdDxQcm9ibGVtPiBwcm9ibGVtcz0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG5ldyBKYXZhMV8wVmFsaWRhdG9yKCkuYWNjZXB0KGV4cHIsIG5ldyBQcm9ibGVtUmVwb3J0ZXIocHJvYmxlbXM6OmFkZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFycmF5Q3JlYXRpb25FeHByLmxldmVscyBjYW4gbm90IGJlIGVtcHR5LiIsIHByb2JsZW1zLmdldCgwKS5nZXRNZXNzYWdlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzFWYWxpZGF0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV8xVmFsaWRhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzFkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV8xVmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuRVhQUkVTU0lPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuU1RBVEVNRU5UOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0Tm9Qcm9ibGVtczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRQcm9ibGVtczsKKworcHVibGljIGNsYXNzIEphdmExXzFWYWxpZGF0b3JUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMSkpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWxsTW9kaWZpZXJzID0gInB1YmxpYyBwcm90ZWN0ZWQgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgZmluYWwgdHJhbnNpZW50IHZvbGF0aWxlIHN5bmNocm9uaXplZCBuYXRpdmUgc3RyaWN0ZnAgdHJhbnNpdGl2ZSBkZWZhdWx0ICI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRvcENsYXNzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoYWxsTW9kaWZpZXJzICsgImNsYXNzIFh7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdzdHJpY3RmcCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAncHJvdGVjdGVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5lc3RlZENsYXNzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IiArIGFsbE1vZGlmaWVycyArICJjbGFzcyBJe319IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsb2NhbENsYXNzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IHZvaWQgeCgpIHsiICsgYWxsTW9kaWZpZXJzICsgImNsYXNzIEl7fX19IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjApICdzdHJpY3RmcCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjApICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9wSW50ZXJmYWNlKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoYWxsTW9kaWZpZXJzICsgImludGVyZmFjZSBYe30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ2ZpbmFsJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbmVzdGVkSW50ZXJmYWNlKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IiArIGFsbE1vZGlmaWVycyArICJpbnRlcmZhY2UgSXt9fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdmaW5hbCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IiArIGFsbE1vZGlmaWVycyArICJYKCl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2ZpbmFsJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdzdHJpY3RmcCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yUGFyYW1ldGVyKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7WCgiICsgYWxsTW9kaWZpZXJzICsgIiBpbnQgaSl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjbGFzc01ldGhvZCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYeyIgKyBhbGxNb2RpZmllcnMgKyAiaW50IHgoKXt9O30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW5ub3QgYmUgJ2Fic3RyYWN0JyBhbmQgYWxzbyAncHJpdmF0ZScsICdzdGF0aWMnLCAnZmluYWwnLCAnbmF0aXZlJywgJ3N0cmljdGZwJywgJ3N5bmNocm9uaXplZCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZU1ldGhvZCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJpbnRlcmZhY2UgWHsiICsgYWxsTW9kaWZpZXJzICsgImludCB4KCl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQ2Fubm90IGJlICdhYnN0cmFjdCcgYW5kIGFsc28gJ3ByaXZhdGUnLCAnc3RhdGljJywgJ2ZpbmFsJywgJ25hdGl2ZScsICdzdHJpY3RmcCcsICdzeW5jaHJvbml6ZWQnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtZXRob2RQYXJhbWV0ZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHtpbnQgeCgiICsgYWxsTW9kaWZpZXJzICsgIiBpbnQgaSl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaWVsZCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYeyIgKyBhbGxNb2RpZmllcnMgKyAiaW50IGk7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2Fic3RyYWN0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxvY2FsVmFyaWFibGUoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHtpbnQgeCgpeyIgKyBhbGxNb2RpZmllcnMgKyAiaW50IGk7fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAncHVibGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAncHJvdGVjdGVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2F0Y2hQYXJhbWV0ZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHtpbnQgeCgpeyB0cnl7fWNhdGNoKCIgKyBhbGxNb2RpZmllcnMgKyAiIEludGVnZXIgeCl7fX19IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpICdwdWJsaWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAncHJvdGVjdGVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlubmVyQ2xhc3NlcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYe2NsYXNzIFl7fX0iKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxvY2FsSW50ZXJmYWNlKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IHZvaWQgeCgpIHsiICsgYWxsTW9kaWZpZXJzICsgImludGVyZmFjZSBJe319fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMjApIFRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBsb2NhbCBpbnRlcmZhY2UuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVmbGVjdGlvbigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8RXhwcmVzc2lvbj4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShFWFBSRVNTSU9OLCBwcm92aWRlcigiQWJjLmNsYXNzIikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdHJpY3RmcEFsbG93ZWRBc0lkZW50aWZpZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJpbnQgc3RyaWN0ZnA7IikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfMlZhbGlkYXRvclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzJWYWxpZGF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlNzAxOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmExXzJWYWxpZGF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyNzUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklUOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5TVEFURU1FTlQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uLkxhbmd1YWdlTGV2ZWwuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRQcm9ibGVtczsKKworcHVibGljIGNsYXNzIEphdmExXzJWYWxpZGF0b3JUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfMikpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWxsTW9kaWZpZXJzID0gInB1YmxpYyBwcm90ZWN0ZWQgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgZmluYWwgdHJhbnNpZW50IHZvbGF0aWxlIHN5bmNocm9uaXplZCBuYXRpdmUgc3RyaWN0ZnAgdHJhbnNpdGl2ZSBkZWZhdWx0ICI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRvcENsYXNzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoYWxsTW9kaWZpZXJzICsgImNsYXNzIFh7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbmVzdGVkQ2xhc3MoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHsiICsgYWxsTW9kaWZpZXJzICsgImNsYXNzIEl7fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbG9jYWxDbGFzcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYeyB2b2lkIHgoKSB7IiArIGFsbE1vZGlmaWVycyArICJjbGFzcyBJe319fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjApIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjApIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjApICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMCkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjApICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9wSW50ZXJmYWNlKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoYWxsTW9kaWZpZXJzICsgImludGVyZmFjZSBYe30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnZmluYWwnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBuZXN0ZWRJbnRlcmZhY2UoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHsiICsgYWxsTW9kaWZpZXJzICsgImludGVyZmFjZSBJe319IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2ZpbmFsJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYeyIgKyBhbGxNb2RpZmllcnMgKyAiWCgpe307fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdmaW5hbCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnN0cnVjdG9yUGFyYW1ldGVyKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7WCgiICsgYWxsTW9kaWZpZXJzICsgIiBpbnQgaSl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ2Fic3RyYWN0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDExKSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMSkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICdwdWJsaWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTEpICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2xhc3NNZXRob2QoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHsiICsgYWxsTW9kaWZpZXJzICsgImludCB4KCl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2Fubm90IGJlICdhYnN0cmFjdCcgYW5kIGFsc28gJ3ByaXZhdGUnLCAnc3RhdGljJywgJ2ZpbmFsJywgJ25hdGl2ZScsICdzdHJpY3RmcCcsICdzeW5jaHJvbml6ZWQnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZU1ldGhvZCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJpbnRlcmZhY2UgWHsiICsgYWxsTW9kaWZpZXJzICsgImludCB4KCl7fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpIENhbm5vdCBiZSAnYWJzdHJhY3QnIGFuZCBhbHNvICdwcml2YXRlJywgJ3N0YXRpYycsICdmaW5hbCcsICduYXRpdmUnLCAnc3RyaWN0ZnAnLCAnc3luY2hyb25pemVkJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZFBhcmFtZXRlcigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYe2ludCB4KCIgKyBhbGxNb2RpZmllcnMgKyAiIGludCBpKXt9O30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTUpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE1KSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNSkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaWVsZCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYeyIgKyBhbGxNb2RpZmllcnMgKyAiaW50IGk7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2Fic3RyYWN0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxvY2FsVmFyaWFibGUoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWHtpbnQgeCgpeyIgKyBhbGxNb2RpZmllcnMgKyAiaW50IGk7fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNykgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYXRjaFBhcmFtZXRlcigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYe2ludCB4KCl7IHRyeXt9Y2F0Y2goIiArIGFsbE1vZGlmaWVycyArICIgSW50ZWdlciB4KXt9fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ2Fic3RyYWN0JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNDQpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQ0KSAncHVibGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0NCkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RyaWN0ZnBOb3RBbGxvd2VkQXNJZGVudGlmaWVyKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigiaW50IHN0cmljdGZwOyIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgNSkgJ3N0cmljdGZwJyBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGFzIGl0IGlzIGEga2V5d29yZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV8zVmFsaWRhdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfM1ZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTAxMTRhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfM1ZhbGlkYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuU1RBVEVNRU5UOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0UHJvYmxlbXM7CisKK3B1YmxpYyBjbGFzcyBKYXZhMV8zVmFsaWRhdG9yVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyc2VyIGphdmFQYXJzZXIgPSBuZXcgSmF2YVBhcnNlcihuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpLnNldExhbmd1YWdlTGV2ZWwoSkFWQV8xXzMpKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm9Bc3NlcnQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJhc3NlcnQgYTsiKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDEpICdhc3NlcnQnIGtleXdvcmQgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhMV80VmFsaWRhdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfNFZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDBiZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTFfNFZhbGlkYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0Tm9Qcm9ibGVtczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRQcm9ibGVtczsKKworcHVibGljIGNsYXNzIEphdmExXzRWYWxpZGF0b3JUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFQYXJzZXIgamF2YVBhcnNlciA9IG5ldyBKYXZhUGFyc2VyKG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzFfNCkpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB5ZXNBc3NlcnQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJhc3NlcnQgYTsiKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vR2VuZXJpY3MoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWDxBPntMaXN0PFN0cmluZz4gYjt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEyKSBHZW5lcmljcyBhcmUgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBHZW5lcmljcyBhcmUgbm90IHN1cHBvcnRlZC4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub0Fubm90YXRpb25zKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoIkBBYmMgQERlZigpIEBHaGkoYT0zKSBAaW50ZXJmYWNlIFh7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA2KSBBbm5vdGF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQW5ub3RhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgQW5ub3RhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm92YXJhcmdzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxQYXJhbWV0ZXI+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoUEFSQU1FVEVSLCBwcm92aWRlcigiU3RyaW5nLi4uIHgiKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDEpIFZhcmFyZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub2ZvcmVhY2goKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJmb3IoWCB4OiB4cyl7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMSkgRm9yLWVhY2ggbG9vcHMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGF0aWNJbXBvcnQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiaW1wb3J0IHN0YXRpYyB4O2ltcG9ydCBzdGF0aWMgeC4qO2ltcG9ydCB4Llg7aW1wb3J0IHguKjsiKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTcpIFN0YXRpYyBpbXBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIFN0YXRpYyBpbXBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZW51bUFsbG93ZWRBc0lkZW50aWZpZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJpbnQgZW51bTsiKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhNVZhbGlkYXRvclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE1VmFsaWRhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTE2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhNVZhbGlkYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuQ09NUElMQVRJT05fVU5JVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5KYXZhMV8xVmFsaWRhdG9yVGVzdC5hbGxNb2RpZmllcnM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0Tm9Qcm9ibGVtczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRQcm9ibGVtczsKKworcHVibGljIGNsYXNzIEphdmE1VmFsaWRhdG9yVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyc2VyIGphdmFQYXJzZXIgPSBuZXcgSmF2YVBhcnNlcihuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpLnNldExhbmd1YWdlTGV2ZWwoSkFWQV81KSk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdlbmVyaWNzV2l0aG91dERpYW1vbmQoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWDxBPntMaXN0PFN0cmluZz4gYiA9IG5ldyBBcnJheUxpc3Q8PigpO30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDMzKSBUaGUgZGlhbW9uZCBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9wQW5ub3RhdGlvbkRlY2xhcmF0aW9uKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoYWxsTW9kaWZpZXJzICsgIkBpbnRlcmZhY2UgWHt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwdWJsaWMnLCAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ2ZpbmFsJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbkRlY2xhcmF0aW9uKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IiArIGFsbE1vZGlmaWVycyArICJAaW50ZXJmYWNlIEl7fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnZmluYWwnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnbmF0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFubm90YXRpb25NZW1iZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiQGludGVyZmFjZSBYeyIgKyBhbGxNb2RpZmllcnMgKyAiaW50IHgoKTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgJ2ZpbmFsJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE0KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTQpICdzdHJpY3RmcCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxNCkgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9wRW51bSgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGFsbE1vZGlmaWVycyArICJlbnVtIFh7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnZmluYWwnLCAnYWJzdHJhY3QnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3ZvbGF0aWxlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxKSAnZmluYWwnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMSkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBuZXN0ZWRFbnVtKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImNsYXNzIFh7IiArIGFsbE1vZGlmaWVycyArICJlbnVtIEl7fX0iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAnbmF0aXZlJywgJ3N0cmljdGZwJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ2ZpbmFsJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDkpICdzeW5jaHJvbml6ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgOSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA5KSAndHJhbnNpdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2YXJhcmdzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxQYXJhbWV0ZXI+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoUEFSQU1FVEVSLCBwcm92aWRlcigiU3RyaW5nLi4uIHgiKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZvcmVhY2goKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJmb3IoWCB4OiB4cyl7fSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RhdGljSW1wb3J0KCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImltcG9ydCBzdGF0aWMgeDtpbXBvcnQgc3RhdGljIHguKjtpbXBvcnQgeC5YO2ltcG9ydCB4Lio7IikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub1ByaW1pdGl2ZVR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiY2xhc3MgWCBleHRlbmRzIFk8aW50PiB7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMTcpIFR5cGUgYXJndW1lbnRzIG1heSBub3QgYmUgcHJpbWl0aXZlLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZW51bUFsbG93ZWRBc0lkZW50aWZpZXIoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJpbnQgZW51bTsiKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDUpICdlbnVtJyBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGFzIGl0IGlzIGEga2V5d29yZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhNlZhbGlkYXRvclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE2VmFsaWRhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjZhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhNlZhbGlkYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmFsaWRhdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuRVhQUkVTU0lPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuU1RBVEVNRU5UOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0UHJvYmxlbXM7CisKK3B1YmxpYyBjbGFzcyBKYXZhNlZhbGlkYXRvclRlc3QgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcnNlciBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKEpBVkFfNikpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub1N0cmluZ3NJblN3aXRjaCgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInN3aXRjaCh4KXtjYXNlIFwiYWJjXCI6IDt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxNikgU3RyaW5ncyBpbiBzd2l0Y2ggc3RhdGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vYmluYXJ5SW50ZWdlckxpdGVyYWxzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxFeHByZXNzaW9uPiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKEVYUFJFU1NJT04sIHByb3ZpZGVyKCIwYjAxIikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBCaW5hcnkgbGl0ZXJhbCB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub1VuZGVyc2NvcmVzSW5JbnRlZ2VyTGl0ZXJhbHMoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PEV4cHJlc3Npb24+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoRVhQUkVTU0lPTiwgcHJvdmlkZXIoIjFfMDAwXzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMSkgVW5kZXJzY29yZXMgaW4gbGl0ZXJhbCB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub011bHRpQ2F0Y2goKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJ0cnl7fWNhdGNoKEFiY3xEZWYgZSl7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LCAiKGxpbmUgMSxjb2wgMTIpIE11bHRpLWNhdGNoIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTdWYWxpZGF0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhN1ZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmEwM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTdWYWxpZGF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb2JsZW07CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlVuaW9uVHlwZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LkVYUFJFU1NJT047CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LlNUQVRFTUVOVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydE5vUHJvYmxlbXM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0UHJvYmxlbXM7CisKK3B1YmxpYyBjbGFzcyBKYXZhN1ZhbGlkYXRvclRlc3QgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcnNlciBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKEpBVkFfNykpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmljcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYPEE+e0xpc3Q8U3RyaW5nPiBiID0gbmV3IEFycmF5TGlzdDw+KCk7fSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVmYXVsdE1ldGhvZFdpdGhvdXRCb2R5KCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoImludGVyZmFjZSBYIHtkZWZhdWx0IHZvaWQgYSgpO30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDE0KSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRyeVdpdGhvdXRBbnl0aGluZygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInRyeXt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBUcnkgaGFzIG5vIGZpbmFsbHksIG5vIGNhdGNoLCBhbmQgbm8gcmVzb3VyY2VzLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ5V2l0aFJlc291cmNlVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInRyeShSZWFkZXIgciA9IG5ldyBSZWFkZXIoKSl7fSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ5V2l0aFJlc291cmNlUmVmZXJlbmNlKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxTdGF0ZW1lbnQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoU1RBVEVNRU5ULCBwcm92aWRlcigidHJ5KGEuYi5jKXt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxKSBUcnkgd2l0aCByZXNvdXJjZXMgb25seSBzdXBwb3J0cyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdHJpbmdzSW5Td2l0Y2goKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJzd2l0Y2goeCl7Y2FzZSBcImFiY1wiOiA7fSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmluYXJ5SW50ZWdlckxpdGVyYWxzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxFeHByZXNzaW9uPiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKEVYUFJFU1NJT04sIHByb3ZpZGVyKCIwYjAxIikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB1bmRlcnNjb3Jlc0luSW50ZWdlckxpdGVyYWxzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxFeHByZXNzaW9uPiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKEVYUFJFU1NJT04sIHByb3ZpZGVyKCIxXzAwMF8wMDAiKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG11bHRpQ2F0Y2goKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJ0cnl7fWNhdGNoKEFiY3xEZWYgZSl7fSIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXVsdGlDYXRjaFdpdGhvdXRFbGVtZW50cygpIHsKKyAgICAgICAgVW5pb25UeXBlIHVuaW9uVHlwZSA9IG5ldyBVbmlvblR5cGUoKTsKKworICAgICAgICBMaXN0PFByb2JsZW0+IHByb2JsZW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG5ldyBKYXZhN1ZhbGlkYXRvcigpLmFjY2VwdCh1bmlvblR5cGUsIG5ldyBQcm9ibGVtUmVwb3J0ZXIocHJvYmxlbXM6OmFkZCkpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocHJvYmxlbXMsICJVbmlvblR5cGUuZWxlbWVudHMgY2FuIG5vdCBiZSBlbXB0eS4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG11bHRpQ2F0Y2hXaXRoT25lRWxlbWVudCgpIHsKKyAgICAgICAgVW5pb25UeXBlIHVuaW9uVHlwZSA9IG5ldyBVbmlvblR5cGUoKTsKKyAgICAgICAgdW5pb25UeXBlLmdldEVsZW1lbnRzKCkuYWRkKG5ldyBDbGFzc09ySW50ZXJmYWNlVHlwZSgpKTsKKworICAgICAgICBMaXN0PFByb2JsZW0+IHByb2JsZW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG5ldyBKYXZhN1ZhbGlkYXRvcigpLmFjY2VwdCh1bmlvblR5cGUsIG5ldyBQcm9ibGVtUmVwb3J0ZXIocHJvYmxlbXM6OmFkZCkpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocHJvYmxlbXMsICJVbmlvbiB0eXBlIChtdWx0aSBjYXRjaCkgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cy4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vTGFtYmRhcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoImEoKCkgLT4gMSk7IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAzKSBMYW1iZGFzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE4VmFsaWRhdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YThWYWxpZGF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2ZmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmFsaWRhdG9yL0phdmE4VmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5DT01QSUxBVElPTl9VTklUOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5TVEFURU1FTlQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uLkxhbmd1YWdlTGV2ZWwuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuSmF2YTFfMVZhbGlkYXRvclRlc3QuYWxsTW9kaWZpZXJzOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydE5vUHJvYmxlbXM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0UHJvYmxlbXM7CisKK3B1YmxpYyBjbGFzcyBKYXZhOFZhbGlkYXRvclRlc3QgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcnNlciBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKEpBVkFfOCkpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBsb2NhbEludGVyZmFjZSgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYIHt2b2lkIGEoKXtpbnRlcmZhY2UgSXt9fTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxOSkgVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhIGxvY2FsIGludGVyZmFjZS4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYVBhcmFtZXRlcigpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJjbGFzcyBYe2ludCB4KCl7IGEoKCIgKyBhbGxNb2RpZmllcnMgKyAiIEludGVnZXIgeCkgLT4gMTApO319IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIxKSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ2ZpbmFsJywgJ2Fic3RyYWN0Jy4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ25hdGl2ZScsICdzdHJpY3RmcCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjEpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjEpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIxKSAnZGVmYXVsdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIxKSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjEpICdzdGF0aWMnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMjEpICd0cmFuc2l0aXZlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIxKSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAyMSkgJ3Byb3RlY3RlZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VNZXRob2QoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiaW50ZXJmYWNlIFh7IiArIGFsbE1vZGlmaWVycyArICJpbnQgeCgpe307fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSBDYW5ub3QgYmUgJ2Fic3RyYWN0JyBhbmQgYWxzbyAncHJpdmF0ZScsICdzdGF0aWMnLCAnZmluYWwnLCAnbmF0aXZlJywgJ3N0cmljdGZwJywgJ3N5bmNocm9uaXplZCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRNZXRob2RXaXRob3V0Qm9keSgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJpbnRlcmZhY2UgWCB7ZGVmYXVsdCB2b2lkIGEoKTt9IikpOworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQsICIobGluZSAxLGNvbCAxNCkgJ2RlZmF1bHQnIG1ldGhvZHMgbXVzdCBoYXZlIGEgYm9keS4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGxhbWJkYXMoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJhKCgpIC0+IDEpOyIpKTsKKyAgICAgICAgYXNzZXJ0Tm9Qcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm9Nb2R1bGVzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoIm9wZW4gbW9kdWxlIHgge30iKSk7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdCwgIihsaW5lIDEsY29sIDEpIE1vZHVsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTlWYWxpZGF0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3ZhbGlkYXRvci9KYXZhOVZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFmNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92YWxpZGF0b3IvSmF2YTlWYWxpZGF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LlNUQVRFTUVOVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZhbGlkYXRvci5KYXZhMV8xVmFsaWRhdG9yVGVzdC5hbGxNb2RpZmllcnM7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0Tm9Qcm9ibGVtczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5hc3NlcnRQcm9ibGVtczsKKworcHVibGljIGNsYXNzIEphdmE5VmFsaWRhdG9yVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyc2VyIGphdmFQYXJzZXIgPSBuZXcgSmF2YVBhcnNlcihuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpLnNldExhbmd1YWdlTGV2ZWwoSkFWQV85KSk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHVuZGVyc2NvcmVJZGVudGlmaWVycygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoImEuYi5fLmMuZCA9IGFjdChfLCBfIC0+IF8pOyIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCA1KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDE3KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDIwKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDI1KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1vZHVsZVJlcXVpcmVzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IGphdmFQYXJzZXIucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoIm1vZHVsZSB4e3JlcXVpcmVzICIgKyBhbGxNb2RpZmllcnMgKyAiIGE7fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMCkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTApIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTApIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEwKSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEwKSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTApICdmaW5hbCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMCkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMCkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTApICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTApICdwcml2YXRlJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEwKSAncHJvdGVjdGVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEwKSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTApICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMCkgJ3B1YmxpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4iCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VNZXRob2QoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcigiaW50ZXJmYWNlIFh7IiArIGFsbE1vZGlmaWVycyArICJpbnQgeCgpe307fSIpKTsKKyAgICAgICAgYXNzZXJ0UHJvYmxlbXMocmVzdWx0LAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpIENhbiBoYXZlIG9ubHkgb25lIG9mICdmaW5hbCcsICdhYnN0cmFjdCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpIENhbiBoYXZlIG9ubHkgb25lIG9mICduYXRpdmUnLCAnc3RyaWN0ZnAnLiIsCisgICAgICAgICAgICAgICAgIihsaW5lIDEsY29sIDEzKSBDYW5ub3QgYmUgJ2Fic3RyYWN0JyBhbmQgYWxzbyAncHJpdmF0ZScsICdzdGF0aWMnLCAnZmluYWwnLCAnbmF0aXZlJywgJ3N0cmljdGZwJywgJ3N5bmNocm9uaXplZCcuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICd0cmFuc2llbnQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIiwKKyAgICAgICAgICAgICAgICAiKGxpbmUgMSxjb2wgMTMpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4iLAorICAgICAgICAgICAgICAgICIobGluZSAxLGNvbCAxMykgJ3RyYW5zaXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuIgorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbW9kdWxlcygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKCJvcGVuIG1vZHVsZSB4IHt9IikpOworICAgICAgICBhc3NlcnROb1Byb2JsZW1zKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0cnlXaXRoUmVzb3VyY2VSZWZlcmVuY2UoKSB7CisgICAgICAgIFBhcnNlUmVzdWx0PFN0YXRlbWVudD4gcmVzdWx0ID0gamF2YVBhcnNlci5wYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKCJ0cnkoYS5iLmMpe30iKSk7CisgICAgICAgIGFzc2VydE5vUHJvYmxlbXMocmVzdWx0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9DbG9uZVZpc2l0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvQ2xvbmVWaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTY2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvQ2xvbmVWaXNpdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5UeXBlOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgQ2xvbmVWaXNpdG9yVGVzdCB7CisgICAgQ29tcGlsYXRpb25Vbml0IGN1OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjdSA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgY3UgPSBudWxsOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2xvbmVKYXZhRG9jVGVzdCgpIHsKKyAgICAgICAgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBib2R5RGVjbGFyYXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICAgICAgYm9keURlY2xhcmF0aW9uTGlzdC5hZGQobmV3IEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpLnNldEphdmFkb2NDb21tZW50KCJqYXZhZG9jIikpOworICAgICAgICBib2R5RGVjbGFyYXRpb25MaXN0LmFkZChuZXcgQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpLnNldEphdmFkb2NDb21tZW50KCJqYXZhZG9jIikpOworICAgICAgICBib2R5RGVjbGFyYXRpb25MaXN0LmFkZChuZXcgRW51bUNvbnN0YW50RGVjbGFyYXRpb24oKS5zZXRKYXZhZG9jQ29tbWVudCgiamF2YWRvYyIpKTsKKyAgICAgICAgYm9keURlY2xhcmF0aW9uTGlzdC5hZGQobmV3IEZpZWxkRGVjbGFyYXRpb24oKS5zZXRKYXZhZG9jQ29tbWVudCgiamF2YWRvYyIpKTsKKyAgICAgICAgYm9keURlY2xhcmF0aW9uTGlzdC5hZGQobmV3IEluaXRpYWxpemVyRGVjbGFyYXRpb24oKS5zZXRKYXZhZG9jQ29tbWVudCgiamF2YWRvYyIpKTsKKyAgICAgICAgYm9keURlY2xhcmF0aW9uTGlzdC5hZGQobmV3IE1ldGhvZERlY2xhcmF0aW9uKCkuc2V0SmF2YWRvY0NvbW1lbnQoImphdmFkb2MiKSk7CisKKyAgICAgICAgTm9kZUxpc3Q8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlRGVjbGFyYXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICAgICAgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IG5ldyBBbm5vdGF0aW9uRGVjbGFyYXRpb24oKTsKKyAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLnNldE5hbWUoIm5ub3RhdGlvbkRlY2xhcmF0aW9uVGVzdCIpOworICAgICAgICB0eXBlRGVjbGFyYXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uc2V0SmF2YWRvY0NvbW1lbnQoImphdmFkb2MiKSk7CisKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjIgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjIuc2V0TmFtZSgiZW1wdHlUeXBlRGVjbGFyYXRpb25UZXN0Iik7CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbkxpc3QuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjIuc2V0SmF2YWRvY0NvbW1lbnQoImphdmFkb2MiKSk7CisKKyAgICAgICAgRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiA9IG5ldyBFbnVtRGVjbGFyYXRpb24oKTsKKyAgICAgICAgZW51bURlY2xhcmF0aW9uLnNldE5hbWUoImVudW1EZWNsYXJhdGlvblRlc3QiKTsKKyAgICAgICAgdHlwZURlY2xhcmF0aW9uTGlzdC5hZGQoZW51bURlY2xhcmF0aW9uLnNldEphdmFkb2NDb21tZW50KCJqYXZhZG9jIikpOworCisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCk7CisgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5zZXROYW1lKCJjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25UZXN0Iik7CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbkxpc3QuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5zZXRKYXZhZG9jQ29tbWVudCgiamF2YWRvYyIpKTsKKworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uMSA9IG5ldyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uMS5zZXROYW1lKCJlbXB0eVR5cGVEZWNsYXJhdGlvblRlc3QxIik7CisgICAgICAgIHR5cGVEZWNsYXJhdGlvbkxpc3QuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjIuc2V0TWVtYmVycyhib2R5RGVjbGFyYXRpb25MaXN0KSk7CisKKyAgICAgICAgY3Uuc2V0VHlwZXModHlwZURlY2xhcmF0aW9uTGlzdCk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdUNsb25lID0gKENvbXBpbGF0aW9uVW5pdCkgbmV3IENsb25lVmlzaXRvcigpLnZpc2l0KGN1LCBudWxsKTsKKworICAgICAgICBOb2RlTGlzdDxUeXBlRGVjbGFyYXRpb248Pz4+IHR5cGVEZWNsYXJhdGlvbkxpc3RDbG9uZSA9IGN1Q2xvbmUuZ2V0VHlwZXMoKTsKKyAgICAgICAgSXRlcmF0b3I8VHlwZURlY2xhcmF0aW9uPD8+PiB0eXBlSXRyID0gdHlwZURlY2xhcmF0aW9uTGlzdENsb25lLml0ZXJhdG9yKCk7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiB0eXBlRGVjbGFyYXRpb247CisgICAgICAgIHdoaWxlICh0eXBlSXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgdHlwZURlY2xhcmF0aW9uID0gdHlwZUl0ci5uZXh0KCk7CisgICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVEZWNsYXJhdGlvbi5nZXRDb21tZW50KCkuZ2V0KCkuZ2V0Q29udGVudCgpLCAiIGphdmFkb2MiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8Qm9keURlY2xhcmF0aW9uPD8+PiBib2R5SXRyID0gdHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChib2R5SXRyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBCb2R5RGVjbGFyYXRpb248Pz4gYm9keURlY2xhcmF0aW9uID0gYm9keUl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhib2R5RGVjbGFyYXRpb24uZ2V0Q29tbWVudCgpLmdldCgpLmdldENvbnRlbnQoKSwgIiBqYXZhZG9jIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2xvbmVBbm5vdGF0aW9uT25XaWxkY2FyZFR5cGVBcmd1bWVudCgpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gcGFyc2VUeXBlKCJMaXN0PEBDID8gZXh0ZW5kcyBPYmplY3Q+IikuY2xvbmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaXN0PEBDID8gZXh0ZW5kcyBPYmplY3Q+IiwgdHlwZS50b1N0cmluZygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9IYXNoQ29kZVZpc2l0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvSGFzaENvZGVWaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWZiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvSGFzaENvZGVWaXNpdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSGFzaENvZGVWaXNpdG9yVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgcDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYIHsgfSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgcDIgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYIHsgfSIpOworICAgICAgICBhc3NlcnRFcXVhbHMocDEuaGFzaENvZGUoKSwgcDIuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgcDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYIHsgfSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgcDIgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBZIHsgfSIpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMocDEuaGFzaENvZGUoKSwgcDIuaGFzaENvZGUoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Nb2RpZmllclZpc2l0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTBjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTW9kaWZpZXJWaXNpdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3I7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb247CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJWaXNpdG9yVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtYWtlU3VyZVBhcmVudExpc3RzQ2FuQmVNb2RpZmllZCgpIHsKKyAgICAgICAgTm9kZUxpc3Q8U3RyaW5nTGl0ZXJhbEV4cHI+IGxpc3QgPSBuZXcgTm9kZUxpc3Q8PigpOworICAgICAgICBsaXN0LmFkZChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoInQiKSk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBTdHJpbmdMaXRlcmFsRXhwcigiYSIpKTsKKyAgICAgICAgbGlzdC5hZGQobmV3IFN0cmluZ0xpdGVyYWxFeHByKCJiIikpOworICAgICAgICBsaXN0LmFkZChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoImMiKSk7CisKKyAgICAgICAgbGlzdC5hY2NlcHQobmV3IE1vZGlmaWVyVmlzaXRvcjxWb2lkPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChmaW5hbCBTdHJpbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gbi5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgbGlzdC5hZGRGaXJzdChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoImV4dHJhICIgKyB2KSk7CisgICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUobmV3IFN0cmluZ0xpdGVyYWxFeHByKCJ0IikpOworCisgICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCJhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdMaXRlcmFsRXhwcigieCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoImIiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJleHRyYSBjIiwgbGlzdC5nZXQoMCkuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXh0cmEgYiIsIGxpc3QuZ2V0KDEpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImV4dHJhIGEiLCBsaXN0LmdldCgyKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJleHRyYSB0IiwgbGlzdC5nZXQoMykuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieCIsIGxpc3QuZ2V0KDQpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBsaXN0LmdldCg1KS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJpbmFyeUV4cHJSZXR1cm5zTGVmdEV4cHJlc3Npb25XaGVuUmlnaHRTaWRlSXNSZW1vdmVkKCkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oIjErMiIpOworICAgICAgICBWaXNpdGFibGUgcmVzdWx0ID0gZXhwcmVzc2lvbi5hY2NlcHQobmV3IE1vZGlmaWVyVmlzaXRvcjxWb2lkPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoSW50ZWdlckxpdGVyYWxFeHByIGludGVnZXJMaXRlcmFsRXhwciwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZWdlckxpdGVyYWxFeHByLmdldFZhbHVlKCkuZXF1YWxzKCIxIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnRlZ2VyTGl0ZXJhbEV4cHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBiaW5hcnlFeHByUmV0dXJuc1JpZ2h0RXhwcmVzc2lvbldoZW5MZWZ0U2lkZUlzUmVtb3ZlZCgpIHsKKyAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCIxKzIiKTsKKyAgICAgICAgZmluYWwgVmlzaXRhYmxlIHJlc3VsdCA9IGV4cHJlc3Npb24uYWNjZXB0KG5ldyBNb2RpZmllclZpc2l0b3I8Vm9pZD4oKSB7CisgICAgICAgICAgICBwdWJsaWMgVmlzaXRhYmxlIHZpc2l0KEludGVnZXJMaXRlcmFsRXhwciBpbnRlZ2VyTGl0ZXJhbEV4cHIsIFZvaWQgYXJnKSB7CisgICAgICAgICAgICAgICAgaWYgKGludGVnZXJMaXRlcmFsRXhwci5nZXRWYWx1ZSgpLmVxdWFscygiMiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlckxpdGVyYWxFeHByOworICAgICAgICAgICAgfQorICAgICAgICB9LCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmllbGREZWNsYXJhdGlvbkNhbnRTdXJ2aXZlV2l0aG91dFZhcmlhYmxlcygpIHsKKyAgICAgICAgZmluYWwgQm9keURlY2xhcmF0aW9uPD8+IGJvZHlEZWNsYXJhdGlvbiA9IEphdmFQYXJzZXIucGFyc2VCb2R5RGVjbGFyYXRpb24oImludCB4PTE7Iik7CisKKyAgICAgICAgZmluYWwgVmlzaXRhYmxlIHJlc3VsdCA9IGJvZHlEZWNsYXJhdGlvbi5hY2NlcHQobmV3IE1vZGlmaWVyVmlzaXRvcjxWb2lkPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9yIHgsIFZvaWQgYXJnKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyaWFibGVEZWNsYXJhdGlvbkNhbnRTdXJ2aXZlV2l0aG91dFZhcmlhYmxlcygpIHsKKyAgICAgICAgZmluYWwgQm9keURlY2xhcmF0aW9uPD8+IGJvZHlEZWNsYXJhdGlvbiA9IEphdmFQYXJzZXIucGFyc2VCb2R5RGVjbGFyYXRpb24oInZvaWQgeCgpIHtpbnQgeD0xO30iKTsKKworICAgICAgICBmaW5hbCBWaXNpdGFibGUgcmVzdWx0ID0gYm9keURlY2xhcmF0aW9uLmFjY2VwdChuZXcgTW9kaWZpZXJWaXNpdG9yPFZvaWQ+KCkgeworICAgICAgICAgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3IgeCwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIHgoKSB7IiArIEVPTCArICJ9IiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL05vQ29tbWVudEVxdWFsc1Zpc2l0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyY2RmOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Ob0NvbW1lbnRFcXVhbHNWaXNpdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsNCisNCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7DQoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7DQorDQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0Ow0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7DQorDQorcHVibGljIGNsYXNzIE5vQ29tbWVudEVxdWFsc1Zpc2l0b3JUZXN0IHsNCisNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsNCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBwMSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFggeyB9Iik7DQorICAgICAgICBDb21waWxhdGlvblVuaXQgcDIgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYIHsgfSIpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShOb0NvbW1lbnRFcXVhbHNWaXNpdG9yLmVxdWFscyhwMSwgcDIpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzV2l0aERpZmZlcmVudENvbW1lbnRzKCkgew0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAxID0gSmF2YVBhcnNlci5wYXJzZSgiLyogYSAqLyBjbGFzcyBYIHsgLyoqIGIgKi99IC8vYyIpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAyID0gSmF2YVBhcnNlci5wYXJzZSgiLyogYiAqLyBjbGFzcyBYIHsgfSAgLy9jIik7DQorICAgICAgICBhc3NlcnRUcnVlKE5vQ29tbWVudEVxdWFsc1Zpc2l0b3IuZXF1YWxzKHAxLCBwMikpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RFcXVhbHMoKSB7DQorICAgICAgICBDb21waWxhdGlvblVuaXQgcDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYIHsgfSIpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAyID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWSB7IH0iKTsNCisgICAgICAgIGFzc2VydEZhbHNlKE5vQ29tbWVudEVxdWFsc1Zpc2l0b3IuZXF1YWxzKHAxLCBwMikpOw0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9hc3QvdmlzaXRvci9Ob0NvbW1lbnRIYXNoQ29kZVZpc2l0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTm9Db21tZW50SGFzaENvZGVWaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjU2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvTm9Db21tZW50SGFzaENvZGVWaXNpdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yOw0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7DQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0Ow0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7DQoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsNCisNCitwdWJsaWMgY2xhc3MgTm9Db21tZW50SGFzaENvZGVWaXNpdG9yVGVzdCB7DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7DQorICAgICAgICBDb21waWxhdGlvblVuaXQgcDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYIHsgfSIpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAyID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWCB7IH0iKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhwMS5oYXNoQ29kZSgpLCBwMi5oYXNoQ29kZSgpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzV2l0aERpZmZlcmVudENvbW1lbnRzKCkgew0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAxID0gSmF2YVBhcnNlci5wYXJzZSgiLyogYSAqLyBjbGFzcyBYIHsgLyoqIGIgKi99IC8vYyIpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAyID0gSmF2YVBhcnNlci5wYXJzZSgiLyogYiAqLyBjbGFzcyBYIHsgfSAgLy9jIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMocDEuaGFzaENvZGUoKSwgcDIuaGFzaENvZGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMocDEuZ2V0Q29tbWVudHMoKS5zaXplKCksIDMpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAyLmdldENvbW1lbnRzKCkuc2l6ZSgpLCAyKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxzKCkgew0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHAxID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWCB7IH0iKTsNCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBwMiA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFkgeyB9Iik7DQorICAgICAgICBhc3NlcnROb3RFcXVhbHMocDEuaGFzaENvZGUoKSwgcDIuaGFzaENvZGUoKSk7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1RyZWVWaXNpdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2FzdC92aXNpdG9yL1RyZWVWaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDM3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYXN0L3Zpc2l0b3IvVHJlZVZpc2l0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQXJyYXlJbml0aWFsaXplckV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydEVxdWFsc05vRW9sOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFRyZWVWaXNpdG9yVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc1ZhbGlkQnJlYWR0aEZpcnN0VHJhdmVyc2FsKCkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiKDIrMykrKDQrNSkiKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgVHJlZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBUcmVlVmlzaXRvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCI8IikuYXBwZW5kKG5vZGUpLmFwcGVuZCgiPiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB2aXNpdG9yLnZpc2l0QnJlYWR0aEZpcnN0KGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjwoMiArIDMpICsgKDQgKyA1KT4gPCgyICsgMyk+IDwoNCArIDUpPiA8MiArIDM+IDw0ICsgNT4gPDI+IDwzPiA8ND4gPDU+ICIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlNzQzQ29uY3VycmVudE1vZGlmaWNhdGlvblByb2JsZW0oKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKCJuZXcgaW50W117MSwyLDMsNH0iKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFRyZWVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgVHJlZVZpc2l0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoTm9kZSBub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJbnRlZ2VyTGl0ZXJhbEV4cHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnROb2RlKCkuaWZQcmVzZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCAtPiAoKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBwYXJlbnQpLmdldFZhbHVlcygpLmFkZChuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIxIikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiPCIpLmFwcGVuZChub2RlKS5hcHBlbmQoIj4gIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHZpc2l0b3IudmlzaXRQcmVPcmRlcihleHByZXNzaW9uKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpc1ZhbGlkUHJlT3JkZXJUcmF2ZXJzYWwoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbmV3IFRyZWVWaXNpdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKE5vZGUgbm9kZSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIjwiKS5hcHBlbmQobm9kZSkuYXBwZW5kKCI+ICIpOworICAgICAgICAgICAgfQorICAgICAgICB9LnZpc2l0UHJlT3JkZXIoSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oIigyKzMpKyg0KzUpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjwoMiArIDMpICsgKDQgKyA1KT4gPCgyICsgMyk+IDwyICsgMz4gPDI+IDwzPiA8KDQgKyA1KT4gPDQgKyA1PiA8ND4gPDU+ICIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzVmFsaWRQb3N0T3JkZXJUcmF2ZXJzYWwoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbmV3IFRyZWVWaXNpdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKE5vZGUgbm9kZSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIjwiKS5hcHBlbmQobm9kZSkuYXBwZW5kKCI+ICIpOworICAgICAgICAgICAgfQorICAgICAgICB9LnZpc2l0UG9zdE9yZGVyKEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKCIoMiszKSsoNCs1KSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8Mj4gPDM+IDwyICsgMz4gPCgyICsgMyk+IDw0PiA8NT4gPDQgKyA1PiA8KDQgKyA1KT4gPCgyICsgMykgKyAoNCArIDUpPiAiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmVPcmRlckNvbmN1cnJlbnRNb2RpZmljYXRpb25Jc09rKCkgeworICAgICAgICBuZXcgVHJlZVZpc2l0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoTm9kZSBub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJbnRlZ2VyTGl0ZXJhbEV4cHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRQYXJlbnROb2RlKCkuaWZQcmVzZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCAtPiAoKEFycmF5SW5pdGlhbGl6ZXJFeHByKSBwYXJlbnQpLmdldFZhbHVlcygpLmFkZChuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIxIikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0udmlzaXRQcmVPcmRlcihKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigibmV3IGludFtdezEsMiwzLDR9IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcG9zdE9yZGVyQ29uY3VycmVudE1vZGlmaWNhdGlvbklzT2soKSB7CisgICAgICAgIG5ldyBUcmVlVmlzaXRvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEludGVnZXJMaXRlcmFsRXhwcikgeworICAgICAgICAgICAgICAgICAgICBub2RlLmdldFBhcmVudE5vZGUoKS5pZlByZXNlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IC0+ICgoQXJyYXlJbml0aWFsaXplckV4cHIpIHBhcmVudCkuZ2V0VmFsdWVzKCkuYWRkKG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjEiKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS52aXNpdFBvc3RPcmRlcihKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigibmV3IGludFtdezEsMiwzLDR9IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyZW50cygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHtpbnQgeD0xO30iKTsKKyAgICAgICAgU2ltcGxlTmFtZSB4ID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIlgiKS5nZXQoKS5nZXRNZW1iZXIoMCkuYXNGaWVsZERlY2xhcmF0aW9uKCkuZ2V0VmFyaWFibGUoMCkuZ2V0TmFtZSgpOworCisgICAgICAgIE5vZGUuUGFyZW50c1Zpc2l0b3IgdmlzaXRvciA9IG5ldyBOb2RlLlBhcmVudHNWaXNpdG9yKHgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInggPSAxIiwgdmlzaXRvci5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IHggPSAxOyIsIHZpc2l0b3IubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHNOb0VvbCgiY2xhc3MgWCB7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGludCB4ID0gMTtcbiIgKworICAgICAgICAgICAgICAgICJ9IiwgdmlzaXRvci5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJjbGFzcyBYIHtcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgaW50IHggPSAxO1xuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIHZpc2l0b3IubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHZpc2l0b3IuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzVmFsaWREaXJlY3RDaGlsZHJlblRyYXZlcnNhbCgpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oIigyKzMpKyg0KzUpIik7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIFRyZWVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgVHJlZVZpc2l0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoTm9kZSBub2RlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiPCIpLmFwcGVuZChub2RlKS5hcHBlbmQoIj4gIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdmlzaXRvci52aXNpdERpcmVjdENoaWxkcmVuKGV4cHJlc3Npb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjwoMiArIDMpPiA8KDQgKyA1KT4gIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvQmFzaWNKQmVoYXZlVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9CYXNpY0pCZWhhdmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwZmU2YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvQmFzaWNKQmVoYXZlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQ7CisKKworaW1wb3J0IGNvbS5naXRodWIudmFsZmlyc3QuamJlaGF2ZS5qdW5pdC5tb25pdG9yaW5nLkpVbml0UmVwb3J0aW5nUnVubmVyOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuY29uZmlndXJhdGlvbi5Nb3N0VXNlZnVsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmZhaWx1cmVzLkZhaWxpbmdVcG9uUGVuZGluZ1N0ZXA7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5pby5Mb2FkRnJvbUNsYXNzcGF0aDsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmlvLlN0b3J5RmluZGVyOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuanVuaXQuSlVuaXRTdG9yaWVzOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUucmVwb3J0ZXJzLkZvcm1hdDsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLnJlcG9ydGVycy5TdG9yeVJlcG9ydGVyQnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qYmVoYXZlLmNvcmUuaW8uQ29kZUxvY2F0aW9ucy5jb2RlTG9jYXRpb25Gcm9tQ2xhc3M7CisKK2Fic3RyYWN0IGNsYXNzIEJhc2ljSkJlaGF2ZVRlc3QgZXh0ZW5kcyBKVW5pdFN0b3JpZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3Rvcmllc1BhdGg7CisKKyAgICBwdWJsaWMgQmFzaWNKQmVoYXZlVGVzdChTdHJpbmcgc3Rvcmllc1BhdGgpIHsKKyAgICAgICAgdGhpcy5zdG9yaWVzUGF0aCA9IHN0b3JpZXNQYXRoOworICAgICAgICBKVW5pdFJlcG9ydGluZ1J1bm5lci5yZWNvbW1lbmRlZENvbnRyb2xzKGNvbmZpZ3VyZWRFbWJlZGRlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IE1vc3RVc2VmdWxDb25maWd1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAvLyB3aGVyZSB0byBmaW5kIHRoZSBzdG9yaWVzCisgICAgICAgICAgICAgICAgLnVzZVN0b3J5TG9hZGVyKG5ldyBMb2FkRnJvbUNsYXNzcGF0aCh0aGlzLmdldENsYXNzKCkpKQorICAgICAgICAgICAgICAgIC8vIEZhaWxzIGlmIFN0ZXBzIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICAudXNlUGVuZGluZ1N0ZXBTdHJhdGVneShuZXcgRmFpbGluZ1Vwb25QZW5kaW5nU3RlcCgpKQorICAgICAgICAgICAgICAgIC8vIENPTlNPTEUgYW5kIEhUTUwgcmVwb3J0aW5nCisgICAgICAgICAgICAgICAgLnVzZVN0b3J5UmVwb3J0ZXJCdWlsZGVyKG5ldyBTdG9yeVJlcG9ydGVyQnVpbGRlcigpLndpdGhEZWZhdWx0Rm9ybWF0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZvcm1hdHMoRm9ybWF0LkNPTlNPTEUsIEZvcm1hdC5IVE1MKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBzdG9yeVBhdGhzKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0b3J5RmluZGVyKCkuZmluZFBhdGhzKGNvZGVMb2NhdGlvbkZyb21DbGFzcyh0aGlzLmdldENsYXNzKCkpLCBzdG9yaWVzUGF0aCwgIiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9Db21tZW50UGFyc2luZ1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvQ29tbWVudFBhcnNpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmMzYxOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvQ29tbWVudFBhcnNpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHMuQ29tbWVudFBhcnNpbmdTdGVwczsKK2ltcG9ydCBjb20uZ2l0aHViLnZhbGZpcnN0LmpiZWhhdmUuanVuaXQubW9uaXRvcmluZy5KVW5pdFJlcG9ydGluZ1J1bm5lcjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLnN0ZXBzLkluamVjdGFibGVTdGVwc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5zdGVwcy5JbnN0YW5jZVN0ZXBzRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BSdW5XaXRoKEpVbml0UmVwb3J0aW5nUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIENvbW1lbnRQYXJzaW5nVGVzdCBleHRlbmRzIEJhc2ljSkJlaGF2ZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluamVjdGFibGVTdGVwc0ZhY3Rvcnkgc3RlcHNGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlU3RlcHNGYWN0b3J5KGNvbmZpZ3VyYXRpb24oKSwgbmV3IENvbW1lbnRQYXJzaW5nU3RlcHMoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbW1lbnRQYXJzaW5nVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoIioqL2JkZC9jb21tZW50Ki5zdG9yeSIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9Db21wYXJpbmdUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL0NvbXBhcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNhZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9Db21wYXJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHMuQ29tcGFyaW5nU3RlcHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5TaGFyZWRTdGVwczsKK2ltcG9ydCBjb20uZ2l0aHViLnZhbGZpcnN0LmpiZWhhdmUuanVuaXQubW9uaXRvcmluZy5KVW5pdFJlcG9ydGluZ1J1bm5lcjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLnN0ZXBzLkluamVjdGFibGVTdGVwc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5zdGVwcy5JbnN0YW5jZVN0ZXBzRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitAUnVuV2l0aChKVW5pdFJlcG9ydGluZ1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb21wYXJpbmdUZXN0IGV4dGVuZHMgQmFzaWNKQmVoYXZlVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0YWJsZVN0ZXBzRmFjdG9yeSBzdGVwc0ZhY3RvcnkoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdGUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZVN0ZXBzRmFjdG9yeShjb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IFNoYXJlZFN0ZXBzKHN0YXRlKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29tcGFyaW5nU3RlcHMoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbXBhcmluZ1Rlc3QoKSB7CisgICAgICAgIHN1cGVyKCIqKi9iZGQvY29tcGFyaW5nKi5zdG9yeSIpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL01hbmlwdWxhdGlvblRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvTWFuaXB1bGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjQ2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL01hbmlwdWxhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5NYW5pcHVsYXRpb25TdGVwczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnN0ZXBzLlNoYXJlZFN0ZXBzOworaW1wb3J0IGNvbS5naXRodWIudmFsZmlyc3QuamJlaGF2ZS5qdW5pdC5tb25pdG9yaW5nLkpVbml0UmVwb3J0aW5nUnVubmVyOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuc3RlcHMuSW5qZWN0YWJsZVN0ZXBzRmFjdG9yeTsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLnN0ZXBzLkluc3RhbmNlU3RlcHNGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK0BSdW5XaXRoKEpVbml0UmVwb3J0aW5nUnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIE1hbmlwdWxhdGlvblRlc3QgZXh0ZW5kcyBCYXNpY0pCZWhhdmVUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmplY3RhYmxlU3RlcHNGYWN0b3J5IHN0ZXBzRmFjdG9yeSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBzdGF0ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlU3RlcHNGYWN0b3J5KGNvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgU2hhcmVkU3RlcHMoc3RhdGUpLAorICAgICAgICAgICAgICAgIG5ldyBNYW5pcHVsYXRpb25TdGVwcyhzdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyBNYW5pcHVsYXRpb25UZXN0KCkgeworICAgICAgICBzdXBlcigiKiovYmRkL21hbmlwdWxhdGlvbiouc3RvcnkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1BhcnNpbmdUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1BhcnNpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1ZDU3YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvUGFyc2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5QYXJzaW5nU3RlcHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5TaGFyZWRTdGVwczsKK2ltcG9ydCBjb20uZ2l0aHViLnZhbGZpcnN0LmpiZWhhdmUuanVuaXQubW9uaXRvcmluZy5KVW5pdFJlcG9ydGluZ1J1bm5lcjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLnN0ZXBzLkluamVjdGFibGVTdGVwc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5zdGVwcy5JbnN0YW5jZVN0ZXBzRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitAUnVuV2l0aChKVW5pdFJlcG9ydGluZ1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBQYXJzaW5nVGVzdCBleHRlbmRzIEJhc2ljSkJlaGF2ZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluamVjdGFibGVTdGVwc0ZhY3Rvcnkgc3RlcHNGYWN0b3J5KCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHN0YXRlID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VTdGVwc0ZhY3RvcnkoY29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBTaGFyZWRTdGVwcyhzdGF0ZSksCisgICAgICAgICAgICAgICAgbmV3IFBhcnNpbmdTdGVwcyhzdGF0ZSkpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJzaW5nVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoIioqL2JkZC9wYXJzaW5nKi5zdG9yeSIpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1Bvc2l0aW9uUmFuZ2VUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1Bvc2l0aW9uUmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmNWIyOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvUG9zaXRpb25SYW5nZVRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5Qb3NpdGlvblJhbmdlU3RlcHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5TaGFyZWRTdGVwczsKK2ltcG9ydCBjb20uZ2l0aHViLnZhbGZpcnN0LmpiZWhhdmUuanVuaXQubW9uaXRvcmluZy5KVW5pdFJlcG9ydGluZ1J1bm5lcjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLnN0ZXBzLkluamVjdGFibGVTdGVwc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5zdGVwcy5JbnN0YW5jZVN0ZXBzRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitAUnVuV2l0aChKVW5pdFJlcG9ydGluZ1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBQb3NpdGlvblJhbmdlVGVzdCBleHRlbmRzIEJhc2ljSkJlaGF2ZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluamVjdGFibGVTdGVwc0ZhY3Rvcnkgc3RlcHNGYWN0b3J5KCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHN0YXRlID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VTdGVwc0ZhY3RvcnkoY29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBTaGFyZWRTdGVwcyhzdGF0ZSksCisgICAgICAgICAgICAgICAgbmV3IFBvc2l0aW9uUmFuZ2VTdGVwcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9zaXRpb25SYW5nZVRlc3QoKSB7CisgICAgICAgIHN1cGVyKCIqKi9iZGQvcG9zaXRpb25fcmFuZ2UqLnN0b3J5Iik7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvUHJldHR5UHJpbnRpbmdUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1ByZXR0eVByaW50aW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDBkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1ByZXR0eVByaW50aW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQ7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnN0ZXBzLlByZXR0eVByaW50aW5nU3RlcHM7CitpbXBvcnQgY29tLmdpdGh1Yi52YWxmaXJzdC5qYmVoYXZlLmp1bml0Lm1vbml0b3JpbmcuSlVuaXRSZXBvcnRpbmdSdW5uZXI7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5zdGVwcy5JbmplY3RhYmxlU3RlcHNGYWN0b3J5OworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuc3RlcHMuSW5zdGFuY2VTdGVwc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUnVuV2l0aChKVW5pdFJlcG9ydGluZ1J1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBQcmV0dHlQcmludGluZ1Rlc3QgZXh0ZW5kcyBCYXNpY0pCZWhhdmVUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmplY3RhYmxlU3RlcHNGYWN0b3J5IHN0ZXBzRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZVN0ZXBzRmFjdG9yeShjb25maWd1cmF0aW9uKCksIG5ldyBQcmV0dHlQcmludGluZ1N0ZXBzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBQcmV0dHlQcmludGluZ1Rlc3QoKSB7CisgICAgICAgIHN1cGVyKCIqKi9iZGQvcHJldHR5X3ByaW50aW5nKi5zdG9yeSIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9UZXN0VXRpbHMuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvVGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0YTExMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvVGVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBUZXN0VXRpbHMgeworCisgICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRTYW1wbGVTdHJlYW0oU3RyaW5nIHNhbXBsZU5hbWUpIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBUZXN0VXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3NhbXBsZXMvIgorICAgICAgICAgICAgICAgICsgc2FtcGxlTmFtZSArICIuamF2YSIpOworICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4YW1wbGUgbm90IGZvdW5kLCBjaGVjayB5b3VyIHRlc3QuIFNhbXBsZSBuYW1lOiAiICsgc2FtcGxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9WaXNpdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9WaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmMyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL1Zpc2l0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHMuU2hhcmVkU3RlcHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwcy5WaXNpdG9yU3RlcHM7CitpbXBvcnQgY29tLmdpdGh1Yi52YWxmaXJzdC5qYmVoYXZlLmp1bml0Lm1vbml0b3JpbmcuSlVuaXRSZXBvcnRpbmdSdW5uZXI7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5zdGVwcy5JbmplY3RhYmxlU3RlcHNGYWN0b3J5OworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuc3RlcHMuSW5zdGFuY2VTdGVwc0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworQFJ1bldpdGgoSlVuaXRSZXBvcnRpbmdSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgVmlzaXRvclRlc3QgZXh0ZW5kcyBCYXNpY0pCZWhhdmVUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmplY3RhYmxlU3RlcHNGYWN0b3J5IHN0ZXBzRmFjdG9yeSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBzdGF0ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZVN0ZXBzRmFjdG9yeShjb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IFNoYXJlZFN0ZXBzKHN0YXRlKSwKKyAgICAgICAgICAgICAgICBuZXcgVmlzaXRvclN0ZXBzKHN0YXRlKSk7CisgICAgfQorCisgICAgcHVibGljIFZpc2l0b3JUZXN0KCkgeworICAgICAgICBzdXBlcigiKiovYmRkL3Zpc2l0b3IqLnN0b3J5Iik7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9Db21tZW50UGFyc2luZ1N0ZXBzLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL0NvbW1lbnRQYXJzaW5nU3RlcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU3YzQzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9Db21tZW50UGFyc2luZ1N0ZXBzLmphdmEKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VSZXN1bHQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlJhbmdlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLlByZXR0eVByaW50ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5BbGlhczsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLkdpdmVuOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuVGhlbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLldoZW47CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5tb2RlbC5FeGFtcGxlc1RhYmxlOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuc3RlcHMuUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZS5yYW5nZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5UZXN0VXRpbHMuZ2V0U2FtcGxlU3RyZWFtOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnN0ZXBzLlNoYXJlZFN0ZXBzLmdldE1lbWJlckJ5VHlwZUFuZFBvc2l0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLio7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC50ZXh0LklzRXF1YWxJZ25vcmluZ1doaXRlU3BhY2UuZXF1YWxUb0lnbm9yaW5nV2hpdGVTcGFjZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgQ29tbWVudFBhcnNpbmdTdGVwcyB7CisKKyAgICBwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7CisgICAgcHJpdmF0ZSBDb21tZW50c0NvbGxlY3Rpb24gY29tbWVudHNDb2xsZWN0aW9uOworICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZVVuZGVyVGVzdDsKKyAgICBwcml2YXRlIFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCk7CisgICAgcHJpdmF0ZSBQcmV0dHlQcmludGVyIHByZXR0eVByaW50ZXIgPSBuZXcgUHJldHR5UHJpbnRlcihuZXcgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24oKSk7CisKKyAgICBAR2l2ZW4oInRoZSBjbGFzczokY2xhc3NTcmMiKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuVGhlQ2xhc3MoU3RyaW5nIGNsYXNzU3JjKSB7CisgICAgICAgIHRoaXMuc291cmNlVW5kZXJUZXN0ID0gY2xhc3NTcmMudHJpbSgpOworICAgIH0KKworICAgIEBXaGVuKCJyZWFkIHNhbXBsZSBcIiRzYW1wbGVOYW1lXCIgdXNpbmcgZW5jb2RpbmcgXCIkZW5jb2RpbmdcIiIpCisgICAgcHVibGljIHZvaWQgZ2l2ZW5UaGVDbGFzc1dpdGhFbmNvZGluZyhTdHJpbmcgc2FtcGxlTmFtZSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzb3VyY2VVbmRlclRlc3QgPSBudWxsOworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHBhcnNlUmVzdWx0ID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKSkucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoZ2V0U2FtcGxlU3RyZWFtKHNhbXBsZU5hbWUpLCBDaGFyc2V0LmZvck5hbWUoZW5jb2RpbmcpKSk7CisgICAgICAgIGNvbW1lbnRzQ29sbGVjdGlvbiA9IHBhcnNlUmVzdWx0LmdldENvbW1lbnRzQ29sbGVjdGlvbigpLm9yRWxzZShuZXcgQ29tbWVudHNDb2xsZWN0aW9uKCkpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBjb21tZW50IHBhcnNlciIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZUNsYXNzSXNQYXJzZWRCeVRoZUNvbW1lbnRQYXJzZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHBhcnNlUmVzdWx0ID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKSkucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoc291cmNlVW5kZXJUZXN0KSk7CisgICAgICAgIGNvbW1lbnRzQ29sbGVjdGlvbiA9IHBhcnNlUmVzdWx0LmdldENvbW1lbnRzQ29sbGVjdGlvbigpLm9yRWxzZShuZXcgQ29tbWVudHNDb2xsZWN0aW9uKCkpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgZG8gbm90IGNvbnNpZGVyIGFubm90YXRpb25zIGFzIG5vZGUgc3RhcnQgZm9yIGNvZGUgYXR0cmlidXRpb24gaXMgJHZhbHVlIG9uIHRoZSBKYXZhIHBhcnNlciIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZURvTm90Q29uc2lkZXJBbm5vdGF0aW9uc0FzTm9kZVN0YXJ0Rm9yQ29kZUF0dHJpYnV0aW9uSXNUcnVlT25UaGVKYXZhUGFyc2VyKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXREb05vdENvbnNpZGVyQW5ub3RhdGlvbnNBc05vZGVTdGFydEZvckNvZGVBdHRyaWJ1dGlvbih2YWx1ZSk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBkbyBub3QgYXNzaWduIGNvbW1lbnRzIHByZWNlZGluZyBlbXB0eSBsaW5lcyBpcyAkdmFsdWUgb24gdGhlIEphdmEgcGFyc2VyIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlRG9Ob3RBc3NpZ25Db21tZW50c1ByZWNlZGluZ0VtcHR5TGluZXNJc1RydWVPblRoZUphdmFQYXJzZXIoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBjb25maWd1cmF0aW9uLnNldERvTm90QXNzaWduQ29tbWVudHNQcmVjZWRpbmdFbXB0eUxpbmVzKHZhbHVlKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVDbGFzc0lzUGFyc2VkQnlUaGVKYXZhUGFyc2VyKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKGNvbmZpZ3VyYXRpb24pLnBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKHNvdXJjZVVuZGVyVGVzdCkpOworICAgICAgICBjb21waWxhdGlvblVuaXQgPSByZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBKYXZhIHBhcnNlciBjYW5ub3QgcGFyc2UgaXQgYmVjYXVzZSBvZiBhbiBlcnJvciIpCisgICAgcHVibGljIHZvaWQgamF2YVBhcnNlckNhbm5vdFBhcnNlQmVjYXVzZU9mTGV4aWNhbEVycm9ycygpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0PiByZXN1bHQgPSBuZXcgSmF2YVBhcnNlcihjb25maWd1cmF0aW9uKS5wYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihzb3VyY2VVbmRlclRlc3QpKTsKKyAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3NmdWwoKSkgeworICAgICAgICAgICAgZmFpbCgiTGV4aWNhbCBlcnJvciBleHBlY3RlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRoZW4oInRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgJGV4cGVjdGVkQ291bnQiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVUb3RhbE51bWJlck9mQ29tbWVudHNJcyhpbnQgZXhwZWN0ZWRDb3VudCkgeworICAgICAgICBhc3NlcnRUaGF0KGNvbW1lbnRzQ29sbGVjdGlvbi5zaXplKCksIGlzKGV4cGVjdGVkQ291bnQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgQ29tbWVudD4gVCBnZXRDb21tZW50QXQoU2V0PFQ+IHNldCwgaW50IGluZGV4KSB7CisgICAgICAgIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIFQgY29tbWVudCA9IG51bGw7CisgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBjb21tZW50ID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tbWVudDsKKyAgICB9CisKKyAgICBAVGhlbigibGluZSBjb21tZW50ICRwb3NpdGlvbiBpcyBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbkxpbmVDb21tZW50SXMoaW50IHBvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIExpbmVDb21tZW50IGxpbmVDb21tZW50VW5kZXJUZXN0ID0gZ2V0Q29tbWVudEF0KGNvbW1lbnRzQ29sbGVjdGlvbi5nZXRMaW5lQ29tbWVudHMoKSwgcG9zaXRpb24gLSAxKTsKKworICAgICAgICBhc3NlcnRUaGF0KGxpbmVDb21tZW50VW5kZXJUZXN0LmdldENvbnRlbnQoKSwgaXMoZXhwZWN0ZWRDb250ZW50KSk7CisgICAgfQorCisgICAgQFRoZW4oImJsb2NrIGNvbW1lbnQgJHBvc2l0aW9uIGlzIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQmxvY2tDb21tZW50SXMoaW50IHBvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIEJsb2NrQ29tbWVudCBsaW5lQ29tbWVudFVuZGVyVGVzdCA9IGdldENvbW1lbnRBdChjb21tZW50c0NvbGxlY3Rpb24uZ2V0QmxvY2tDb21tZW50cygpLCBwb3NpdGlvbiAtIDEpOworCisgICAgICAgIGFzc2VydFRoYXQobGluZUNvbW1lbnRVbmRlclRlc3QuZ2V0Q29udGVudCgpLCBpcyhlcXVhbFRvSWdub3JpbmdXaGl0ZVNwYWNlKGV4cGVjdGVkQ29udGVudCkpKTsKKyAgICB9CisKKyAgICBAVGhlbigiSmF2YWRvYyBjb21tZW50ICRwb3NpdGlvbiBpcyBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbkphdmFkb2NDb21tZW50SXMoaW50IHBvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIEphdmFkb2NDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSBnZXRDb21tZW50QXQoY29tbWVudHNDb2xsZWN0aW9uLmdldEphdmFkb2NDb21tZW50cygpLCBwb3NpdGlvbiAtIDEpOworCisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb250ZW50KCksIGlzKGVxdWFsVG9JZ25vcmluZ1doaXRlU3BhY2UoZXhwZWN0ZWRDb250ZW50KSkpOworICAgIH0KKworICAgIEBUaGVuKCJ0aGUgbGluZSBjb21tZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOiAkdGFibGUiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVMaW5lQ29tbWVudHNIYXZlVGhlRm9sbG93aW5nUG9zaXRpb25zKEV4YW1wbGVzVGFibGUgZXhhbXBsZXNUYWJsZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKFBhcmFtZXRlcnMgZXhhbXBsZVJvdyA6IGV4YW1wbGVzVGFibGUuZ2V0Um93c0FzUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBDb21tZW50IGV4cGVjdGVkTGluZUNvbW1lbnQgPSB0b0NvbW1lbnQoZXhhbXBsZVJvdywgbmV3IExpbmVDb21tZW50KCkpOworICAgICAgICAgICAgQ29tbWVudCBsaW5lQ29tbWVudFVuZGVyVGVzdCA9IGdldENvbW1lbnRBdChjb21tZW50c0NvbGxlY3Rpb24uZ2V0TGluZUNvbW1lbnRzKCksIGluZGV4KTsKKworICAgICAgICAgICAgUmFuZ2UgdW5kZXJUZXN0UmFuZ2UgPSBsaW5lQ29tbWVudFVuZGVyVGVzdC5nZXRSYW5nZSgpLmdldCgpOworICAgICAgICAgICAgUmFuZ2UgZXhwZWN0ZWRSYW5nZSA9IGV4cGVjdGVkTGluZUNvbW1lbnQuZ2V0UmFuZ2UoKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1bmRlclRlc3RSYW5nZS5iZWdpbi5saW5lLCBpcyhleHBlY3RlZFJhbmdlLmJlZ2luLmxpbmUpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodW5kZXJUZXN0UmFuZ2UuYmVnaW4uY29sdW1uLCBpcyhleHBlY3RlZFJhbmdlLmJlZ2luLmNvbHVtbikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1bmRlclRlc3RSYW5nZS5lbmQubGluZSwgaXMoZXhwZWN0ZWRSYW5nZS5lbmQubGluZSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1bmRlclRlc3RSYW5nZS5lbmQuY29sdW1uLCBpcyhleHBlY3RlZFJhbmdlLmVuZC5jb2x1bW4pKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGhlbigidGhlIGJsb2NrIGNvbW1lbnRzIGhhdmUgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6ICR0YWJsZSIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUJsb2NrQ29tbWVudHNIYXZlVGhlRm9sbG93aW5nUG9zaXRpb25zKEV4YW1wbGVzVGFibGUgZXhhbXBsZXNUYWJsZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKFBhcmFtZXRlcnMgZXhhbXBsZVJvdyA6IGV4YW1wbGVzVGFibGUuZ2V0Um93c0FzUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBDb21tZW50IGV4cGVjdGVkTGluZUNvbW1lbnQgPSB0b0NvbW1lbnQoZXhhbXBsZVJvdywgbmV3IEJsb2NrQ29tbWVudCgpKTsKKyAgICAgICAgICAgIENvbW1lbnQgbGluZUNvbW1lbnRVbmRlclRlc3QgPSBnZXRDb21tZW50QXQoY29tbWVudHNDb2xsZWN0aW9uLmdldEJsb2NrQ29tbWVudHMoKSwgaW5kZXgpOworCisgICAgICAgICAgICBSYW5nZSB1bmRlclRlc3RSYW5nZSA9IGxpbmVDb21tZW50VW5kZXJUZXN0LmdldFJhbmdlKCkuZ2V0KCk7CisgICAgICAgICAgICBSYW5nZSBleHBlY3RlZFJhbmdlID0gZXhwZWN0ZWRMaW5lQ29tbWVudC5nZXRSYW5nZSgpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHVuZGVyVGVzdFJhbmdlLmJlZ2luLmxpbmUsIGlzKGV4cGVjdGVkUmFuZ2UuYmVnaW4ubGluZSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1bmRlclRlc3RSYW5nZS5iZWdpbi5jb2x1bW4sIGlzKGV4cGVjdGVkUmFuZ2UuYmVnaW4uY29sdW1uKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHVuZGVyVGVzdFJhbmdlLmVuZC5saW5lLCBpcyhleHBlY3RlZFJhbmdlLmVuZC5saW5lKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHVuZGVyVGVzdFJhbmdlLmVuZC5jb2x1bW4sIGlzKGV4cGVjdGVkUmFuZ2UuZW5kLmNvbHVtbikpOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUaGVuKCJ0aGUgSmF2YWRvYyBjb21tZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOiAkdGFibGUiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVKYXZhZG9jQ29tbWVudHNIYXZlVGhlRm9sbG93aW5nUG9zaXRpb25zKEV4YW1wbGVzVGFibGUgZXhhbXBsZXNUYWJsZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKFBhcmFtZXRlcnMgZXhhbXBsZVJvdyA6IGV4YW1wbGVzVGFibGUuZ2V0Um93c0FzUGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBDb21tZW50IGV4cGVjdGVkTGluZUNvbW1lbnQgPSB0b0NvbW1lbnQoZXhhbXBsZVJvdywgbmV3IEJsb2NrQ29tbWVudCgpKTsKKyAgICAgICAgICAgIENvbW1lbnQgbGluZUNvbW1lbnRVbmRlclRlc3QgPSBnZXRDb21tZW50QXQoY29tbWVudHNDb2xsZWN0aW9uLmdldEphdmFkb2NDb21tZW50cygpLCBpbmRleCk7CisKKyAgICAgICAgICAgIFJhbmdlIHVuZGVyVGVzdFJhbmdlID0gbGluZUNvbW1lbnRVbmRlclRlc3QuZ2V0UmFuZ2UoKS5nZXQoKTsKKyAgICAgICAgICAgIFJhbmdlIGV4cGVjdGVkUmFuZ2UgPSBleHBlY3RlZExpbmVDb21tZW50LmdldFJhbmdlKCkuZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQodW5kZXJUZXN0UmFuZ2UuYmVnaW4ubGluZSwgaXMoZXhwZWN0ZWRSYW5nZS5iZWdpbi5saW5lKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHVuZGVyVGVzdFJhbmdlLmJlZ2luLmNvbHVtbiwgaXMoZXhwZWN0ZWRSYW5nZS5iZWdpbi5jb2x1bW4pKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodW5kZXJUZXN0UmFuZ2UuZW5kLmxpbmUsIGlzKGV4cGVjdGVkUmFuZ2UuZW5kLmxpbmUpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodW5kZXJUZXN0UmFuZ2UuZW5kLmNvbHVtbiwgaXMoZXhwZWN0ZWRSYW5nZS5lbmQuY29sdW1uKSk7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgfQorCisgICAgQFRoZW4oIml0IGlzIHByaW50ZWQgYXM6JHNyYyIpCisgICAgcHVibGljIHZvaWQgaXNQcmludGVkQXMoU3RyaW5nIHNyYykgeworICAgICAgICBhc3NlcnRUaGF0KHByZXR0eVByaW50ZXIucHJpbnQoY29tcGlsYXRpb25Vbml0KS50cmltKCksIGlzKHNyYy50cmltKCkpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGNvbW1lbnRlZCIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUNvbXBpbGF0aW9uVW5pdElzTm90Q29tbWVudGVkKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbXBpbGF0aW9uVW5pdC5nZXRDb21tZW50KCkuaXNQcmVzZW50KCkpOworICAgIH0KKworICAgIEBUaGVuKCJ0aGUgY29tcGlsYXRpb24gaXMgY29tbWVudGVkIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVGhlQ29tcGlsYXRpb25Jc0NvbW1lbnRlZENvbXBpbGF0aW9uVW5pdENvbW1lbnQoU3RyaW5nIGV4cGVjdGVkQ29udGVudCkgeworICAgICAgICBhc3NlcnRUaGF0KGNvbXBpbGF0aW9uVW5pdC5nZXRDb21tZW50KCkuZ2V0KCkuZ2V0Q29udGVudCgpLCBpcyhleHBlY3RlZENvbnRlbnQpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzICRleHBlY3RlZENvdW50IGNvbnRhaW5lZCBjb21tZW50cyIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUNvbXBpbGF0aW9uVW5pdEhhc0NvbnRhaW5lZENvbW1lbnRzKGludCBleHBlY3RlZENvdW50KSB7CisgICAgICAgIGFzc2VydFRoYXQoY29tcGlsYXRpb25Vbml0LmdldENvbW1lbnRzKCkuc2l6ZSgpLCBpcyhleHBlY3RlZENvdW50KSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAkZXhwZWN0ZWRDb3VudCBvcnBoYW4gY29tbWVudHMiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVDb21waWxhdGlvblVuaXRIYXNFeHBlY3RlZENvdW50T3JwaGFuQ29tbWVudHMoaW50IGV4cGVjdGVkQ291bnQpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvblVuaXQuZ2V0T3JwaGFuQ29tbWVudHMoKS5zaXplKCksIGlzKGV4cGVjdGVkQ291bnQpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIGNvbXBpbGF0aW9uIHVuaXQgb3JwaGFuIGNvbW1lbnQgJHBvc2l0aW9uIGlzIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVGhlQ29tcGlsYXRpb25Vbml0T3JwaGFuQ29tbWVudElzKGludCBwb3NpdGlvbiwgU3RyaW5nIGV4cGVjdGVkQ29udGVudCkgeworICAgICAgICBDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0T3JwaGFuQ29tbWVudHMoKS5nZXQocG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21tZW50VW5kZXJUZXN0LmdldENvbnRlbnQoKSwgaXMoZXF1YWxUb0lnbm9yaW5nV2hpdGVTcGFjZShleHBlY3RlZENvbnRlbnQpKSk7CisgICAgfQorCisgICAgQFRoZW4oImNvbW1lbnQgJGNvbW1lbnRQb3NpdGlvbiBpbiBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBhbiBvcnBoYW4iKQorICAgIHB1YmxpYyB2b2lkIHRoZW5Db21tZW50SW5Db21waWxhdGlvblVuaXRJc05vdEFuT3JwaGFuKGludCBjb21tZW50UG9zaXRpb24pIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkuZ2V0KGNvbW1lbnRQb3NpdGlvbiAtIDEpOworICAgICAgICBhc3NlcnRUaGF0KGNvbW1lbnRVbmRlclRlc3QuaXNPcnBoYW4oKSwgaXMoZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGhlbigiY29tbWVudCAkY29tbWVudFBvc2l0aW9uIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgYW4gb3JwaGFuIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQ29tbWVudEluQ29tcGlsYXRpb25Vbml0SXNBbk9ycGhhbihpbnQgY29tbWVudFBvc2l0aW9uKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudFVuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBbGxDb250YWluZWRDb21tZW50cygpLmdldChjb21tZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21tZW50VW5kZXJUZXN0LmlzT3JwaGFuKCksIGlzKHRydWUpKTsKKyAgICB9CisKKyAgICBAVGhlbigiY29tbWVudCAkY29tbWVudFBvc2l0aW9uIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgXCIkZXhwZWN0ZWRDb250ZW50XCIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5Db21tZW50SW5Db21waWxhdGlvblVuaXRJcyhpbnQgcG9zaXRpb24sIFN0cmluZyBleHBlY3RlZENvbnRlbnQpIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkuZ2V0KHBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb250ZW50KCksIGlzKGVxdWFsVG9JZ25vcmluZ1doaXRlU3BhY2UoZXhwZWN0ZWRDb250ZW50KSkpOworICAgIH0KKworICAgIEBUaGVuKCJjbGFzcyAkcG9zaXRpb24gaXMgbm90IGNvbW1lbnRlZCIpCisgICAgcHVibGljIHZvaWQgdGhlbkNsYXNzSXNOb3RDb21tZW50ZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKHBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY2xhc3NVbmRlclRlc3QuZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGhlbigiY2xhc3MgJHBvc2l0aW9uIGlzIGNvbW1lbnRlZCBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbkNsYXNzSXNDb21tZW50ZWQoaW50IHBvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKHBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NVbmRlclRlc3QuZ2V0Q29tbWVudCgpLmdldCgpLmdldENvbnRlbnQoKSwgaXMoZXhwZWN0ZWRDb250ZW50KSk7CisgICAgfQorCisgICAgQFRoZW4oImNsYXNzICRwb3NpdGlvbiBoYXMgJGV4cGVjdGVkQ291bnQgdG90YWwgY29udGFpbmVkIGNvbW1lbnRzIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQ2xhc3NIYXNUb3RhbENvbnRhaW5lZENvbW1lbnRzKGludCBwb3NpdGlvbiwgaW50IGV4cGVjdGVkQ291bnQpIHsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uPD8+IGNsYXNzVW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUocG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc1VuZGVyVGVzdC5nZXRBbGxDb250YWluZWRDb21tZW50cygpLnNpemUoKSwgaXMoZXhwZWN0ZWRDb3VudCkpOworICAgIH0KKworICAgIEBUaGVuKCJjbGFzcyAkcG9zaXRpb24gaGFzICRleHBlY3RlZENvdW50IG9ycGhhbiBjb21tZW50IikKKyAgICBAQWxpYXMoImNsYXNzICRwb3NpdGlvbiBoYXMgJGV4cGVjdGVkQ291bnQgb3JwaGFuIGNvbW1lbnRzIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQ2xhc3NIYXNPcnBoYW5Db21tZW50cyhpbnQgcG9zaXRpb24sIGludCBleHBlY3RlZENvdW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKHBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NVbmRlclRlc3QuZ2V0T3JwaGFuQ29tbWVudHMoKS5zaXplKCksIGlzKGV4cGVjdGVkQ291bnQpKTsKKyAgICB9CisKKyAgICBAVGhlbigiY2xhc3MgJGNsYXNzUG9zaXRpb24gb3JwaGFuIGNvbW1lbnQgJGNvbW1lbnRQb3NpdGlvbiBpcyBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbkNsYXNzT3JwaGFuQ29tbWVudElzKGludCBjbGFzc1Bvc2l0aW9uLCBpbnQgY29tbWVudFBvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gY2xhc3NVbmRlclRlc3QuZ2V0T3JwaGFuQ29tbWVudHMoKS5nZXQoY29tbWVudFBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb250ZW50KCksIGlzKGVxdWFsVG9JZ25vcmluZ1doaXRlU3BhY2UoZXhwZWN0ZWRDb250ZW50KSkpOworICAgIH0KKworICAgIEBUaGVuKCJtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGlzIGNvbW1lbnRlZCBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZEluQ2xhc3NJc0NvbW1lbnRlZChpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVW5kZXJUZXN0ID0gZ2V0TWVtYmVyQnlUeXBlQW5kUG9zaXRpb24oY2xhc3NVbmRlclRlc3QsIG1ldGhvZFBvc2l0aW9uIC0gMSwKKyAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kVW5kZXJUZXN0LmdldENvbW1lbnQoKS5nZXQoKS5nZXRDb250ZW50KCksIGVxdWFsVG9JZ25vcmluZ1doaXRlU3BhY2UoZXhwZWN0ZWRDb250ZW50KSk7CisgICAgfQorCisgICAgQFRoZW4oIm1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaGFzICRleHBlY3RlZENvdW50IHRvdGFsIGNvbnRhaW5lZCBjb21tZW50cyIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZEluQ2xhc3NIYXNUb3RhbENvbnRhaW5lZENvbW1lbnRzKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIGludCBleHBlY3RlZENvdW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVW5kZXJUZXN0ID0gZ2V0TWVtYmVyQnlUeXBlQW5kUG9zaXRpb24oY2xhc3NVbmRlclRlc3QsIG1ldGhvZFBvc2l0aW9uIC0gMSwKKyAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kVW5kZXJUZXN0LmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkuc2l6ZSgpLCBpcyhleHBlY3RlZENvdW50KSk7CisgICAgfQorCisgICAgQFRoZW4oImNvbW1lbnQgJGNvbW1lbnRQb3NpdGlvbiBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGlzIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQ29tbWVudEluTWV0aG9kSW5DbGFzc0lzKGludCBjb21tZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIFN0cmluZyBleHBlY3RlZENvbnRlbnQpIHsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uPD8+IGNsYXNzVW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUoY2xhc3NQb3NpdGlvbiAtIDEpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgbWV0aG9kUG9zaXRpb24gLSAxLAorICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gbWV0aG9kVW5kZXJUZXN0LmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkuZ2V0KGNvbW1lbnRQb3NpdGlvbiAtIDEpOworICAgICAgICBhc3NlcnRUaGF0KGNvbW1lbnRVbmRlclRlc3QuZ2V0Q29udGVudCgpLCBpcyhlcXVhbFRvSWdub3JpbmdXaGl0ZVNwYWNlKGV4cGVjdGVkQ29udGVudCkpKTsKKyAgICB9CisKKyAgICBAVGhlbigibWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBoYXMgJGV4cGVjdGVkQ291bnQgb3JwaGFuIGNvbW1lbnRzIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuTWV0aG9kSW5DbGFzc0hhc09ycGhhbkNvbW1lbnRzKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIGludCBleHBlY3RlZENvdW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVW5kZXJUZXN0ID0gZ2V0TWVtYmVyQnlUeXBlQW5kUG9zaXRpb24oY2xhc3NVbmRlclRlc3QsIG1ldGhvZFBvc2l0aW9uIC0gMSwKKyAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kVW5kZXJUZXN0LmdldE9ycGhhbkNvbW1lbnRzKCkuc2l6ZSgpLCBpcyhleHBlY3RlZENvdW50KSk7CisgICAgfQorCisgICAgQFRoZW4oImJsb2NrIHN0YXRlbWVudCBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGhhcyAkZXhwZWN0ZWRDb3VudCB0b3RhbCBjb250YWluZWQgY29tbWVudHMiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5CbG9ja1N0YXRlbWVudEluTWV0aG9kSW5DbGFzc0hhc1RvdGFsQ29udGFpbmVkQ29tbWVudHMoaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwgaW50IGV4cGVjdGVkQ291bnQpIHsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uPD8+IGNsYXNzVW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUoY2xhc3NQb3NpdGlvbiAtIDEpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgbWV0aG9kUG9zaXRpb24gLSAxLAorICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrU3RtdFVuZGVyVGVzdCA9IG1ldGhvZFVuZGVyVGVzdC5nZXRCb2R5KCkub3JFbHNlKG51bGwpOworICAgICAgICBhc3NlcnRUaGF0KGJsb2NrU3RtdFVuZGVyVGVzdC5nZXRBbGxDb250YWluZWRDb21tZW50cygpLnNpemUoKSwgaXMoZXhwZWN0ZWRDb3VudCkpOworICAgIH0KKworICAgIEBUaGVuKCJibG9jayBzdGF0ZW1lbnQgaW4gbWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBoYXMgJGV4cGVjdGVkQ291bnQgb3JwaGFuIGNvbW1lbnRzIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQmxvY2tTdGF0ZW1lbnRJbk1ldGhvZEluQ2xhc3NIYXNPcnBoYW5Db21tZW50cyhpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uLCBpbnQgZXhwZWN0ZWRDb3VudCkgeworICAgICAgICBUeXBlRGVjbGFyYXRpb248Pz4gY2xhc3NVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZShjbGFzc1Bvc2l0aW9uIC0gMSk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFVuZGVyVGVzdCA9IGdldE1lbWJlckJ5VHlwZUFuZFBvc2l0aW9uKGNsYXNzVW5kZXJUZXN0LCBtZXRob2RQb3NpdGlvbiAtIDEsCisgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24uY2xhc3MpOworICAgICAgICBCbG9ja1N0bXQgYmxvY2tTdG10VW5kZXJUZXN0ID0gbWV0aG9kVW5kZXJUZXN0LmdldEJvZHkoKS5vckVsc2UobnVsbCk7CisgICAgICAgIGFzc2VydFRoYXQoYmxvY2tTdG10VW5kZXJUZXN0LmdldE9ycGhhbkNvbW1lbnRzKCkuc2l6ZSgpLCBpcyhleHBlY3RlZENvdW50KSk7CisgICAgfQorCisgICAgQFRoZW4oImJsb2NrIHN0YXRlbWVudCBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIG9ycGhhbiBjb21tZW50ICRjb21tZW50UG9zaXRpb24gaXMgXCIkZXhwZWN0ZWRDb250ZW50XCIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5CbG9ja1N0YXRlbWVudEluTWV0aG9kSW5DbGFzc0lzKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIGludCBjb21tZW50UG9zaXRpb24sIFN0cmluZyBleHBlY3RlZENvbnRlbnQpIHsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uPD8+IGNsYXNzVW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUoY2xhc3NQb3NpdGlvbiAtIDEpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgbWV0aG9kUG9zaXRpb24gLSAxLAorICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrU3RtdFVuZGVyVGVzdCA9IG1ldGhvZFVuZGVyVGVzdC5nZXRCb2R5KCkub3JFbHNlKG51bGwpOworICAgICAgICBDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSBibG9ja1N0bXRVbmRlclRlc3QuZ2V0T3JwaGFuQ29tbWVudHMoKS5nZXQoY29tbWVudFBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb250ZW50KCksIGlzKGVxdWFsVG9JZ25vcmluZ1doaXRlU3BhY2UoZXhwZWN0ZWRDb250ZW50KSkpOworICAgIH0KKworICAgIEBUaGVuKCJ0eXBlIG9mIG1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgY29tbWVudGVkIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVHlwZU9mTWV0aG9kSW5DbGFzc0lzQ29tbWVudGVkKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIFN0cmluZyBleHBlY3RlZENvbnRlbnQpIHsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uPD8+IGNsYXNzVW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUoY2xhc3NQb3NpdGlvbiAtIDEpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgbWV0aG9kUG9zaXRpb24gLSAxLAorICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gbWV0aG9kVW5kZXJUZXN0LmdldFR5cGUoKS5nZXRDb21tZW50KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb250ZW50KCksIGlzKGVxdWFsVG9JZ25vcmluZ1doaXRlU3BhY2UoZXhwZWN0ZWRDb250ZW50KSkpOworICAgIH0KKworICAgIEBUaGVuKCJmaWVsZCAkZmllbGRQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBjb250YWlucyAkZXhwZWN0ZWRDb3VudCBjb21tZW50cyIpCisgICAgcHVibGljIHZvaWQgdGhlbkZpZWxkSW5DbGFzc0NvbnRhaW5zQ29tbWVudHMoaW50IGZpZWxkUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uLCBpbnQgZXhwZWN0ZWRDb3VudCkgeworICAgICAgICBUeXBlRGVjbGFyYXRpb248Pz4gY2xhc3NVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZShjbGFzc1Bvc2l0aW9uIC0gMSk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGRVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgZmllbGRQb3NpdGlvbiAtIDEsCisgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoZmllbGRVbmRlclRlc3QuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKS5zaXplKCksIGlzKGV4cGVjdGVkQ291bnQpKTsKKyAgICB9CisKKyAgICBAVGhlbigiZmllbGQgJGZpZWxkUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgbm90IGNvbW1lbnRlZCIpCisgICAgcHVibGljIHZvaWQgdGhlbkZpZWxkSW5DbGFzc0lzTm90Q29tbWVudGVkKGludCBmaWVsZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbikgeworICAgICAgICBUeXBlRGVjbGFyYXRpb248Pz4gY2xhc3NVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZShjbGFzc1Bvc2l0aW9uIC0gMSk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGRVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgZmllbGRQb3NpdGlvbiAtIDEsCisgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZmllbGRVbmRlclRlc3QuZ2V0Q29tbWVudCgpLmlzUHJlc2VudCgpKTsKKyAgICB9CisKKyAgICBAVGhlbigiZmllbGQgJGZpZWxkUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgY29tbWVudGVkIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuRmllbGRJbkNsYXNzSXNDb21tZW50ZWQoaW50IGZpZWxkUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50KSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZFVuZGVyVGVzdCA9IGdldE1lbWJlckJ5VHlwZUFuZFBvc2l0aW9uKGNsYXNzVW5kZXJUZXN0LCBmaWVsZFBvc2l0aW9uIC0gMSwKKyAgICAgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gZmllbGRVbmRlclRlc3QuZ2V0Q29tbWVudCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGNvbW1lbnRVbmRlclRlc3QuZ2V0Q29udGVudCgpLCBpcyhlcXVhbFRvSWdub3JpbmdXaGl0ZVNwYWNlKGV4cGVjdGVkQ29udGVudCkpKTsKKyAgICB9CisKKyAgICBAVGhlbigidmFyaWFibGUgJHZhcmlhYmxlUG9zaXRpb24gdmFsdWUgb2YgZmllbGQgJGZpZWxkUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgY29tbWVudGVkIFwiJGV4cGVjdGVkQ29udGVudFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVmFyaWFibGVWYWx1ZU9mRmllbGRJbkNsYXNzSXNDb21tZW50ZWQoaW50IHZhcmlhYmxlUG9zaXRpb24sIGludCBmaWVsZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwgU3RyaW5nIGV4cGVjdGVkQ29udGVudCkgeworICAgICAgICBUeXBlRGVjbGFyYXRpb248Pz4gY2xhc3NVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZShjbGFzc1Bvc2l0aW9uIC0gMSk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGRVbmRlclRlc3QgPSBnZXRNZW1iZXJCeVR5cGVBbmRQb3NpdGlvbihjbGFzc1VuZGVyVGVzdCwgZmllbGRQb3NpdGlvbiAtIDEsCisgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbi5jbGFzcyk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZVVuZGVyVGVzdCA9IGZpZWxkVW5kZXJUZXN0LmdldFZhcmlhYmxlKHZhcmlhYmxlUG9zaXRpb24gLSAxKTsKKyAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZVVuZGVyVGVzdCA9IHZhcmlhYmxlVW5kZXJUZXN0LmdldEluaXRpYWxpemVyKCkub3JFbHNlKG51bGwpOworICAgICAgICBDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSB2YWx1ZVVuZGVyVGVzdC5nZXRDb21tZW50KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb250ZW50KCksIGlzKGV4cGVjdGVkQ29udGVudCkpOworICAgIH0KKworICAgIEBUaGVuKCJjb21tZW50ICRjb21tZW50UG9zaXRpb24gaW4gY29tcGlsYXRpb24gdW5pdCBwYXJlbnQgaXMgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQ29tbWVudEluQ29tcGlsYXRpb25Vbml0UGFyZW50SXNDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oaW50IGNvbW1lbnRQb3NpdGlvbikgeworICAgICAgICBDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKS5nZXQoY29tbWVudFBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRQYXJlbnROb2RlKCkuZ2V0KCksIGluc3RhbmNlT2YoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRoZW4oImNvbW1lbnQgJGNvbW1lbnRQb3NpdGlvbiBpbiBjb21waWxhdGlvbiB1bml0IGNvbW1lbnRlZCBub2RlIGlzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpCisgICAgcHVibGljIHZvaWQgdGhlbkNvbW1lbnRJbkNvbXBpbGF0aW9uVW5pdENvbW1lbnRlZE5vZGVJc0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbihpbnQgY29tbWVudFBvc2l0aW9uKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudFVuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBbGxDb250YWluZWRDb21tZW50cygpLmdldChjb21tZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21tZW50VW5kZXJUZXN0LmdldENvbW1lbnRlZE5vZGUoKS5nZXQoKSwgaW5zdGFuY2VPZihDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGhlbigiY29tbWVudCAkY29tbWVudFBvc2l0aW9uIGluIGNvbXBpbGF0aW9uIHVuaXQgY29tbWVudGVkIG5vZGUgaXMgRmllbGREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIHZvaWQgdGhlbkNvbW1lbnRJbkNvbXBpbGF0aW9uVW5pdENvbW1lbnRlZE5vZGVJc0ZpZWxkRGVjbGFyYXRpb24oaW50IGNvbW1lbnRQb3NpdGlvbikgeworICAgICAgICBDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKS5nZXQoY29tbWVudFBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb21tZW50ZWROb2RlKCkuZ2V0KCksIGluc3RhbmNlT2YoRmllbGREZWNsYXJhdGlvbi5jbGFzcykpOworICAgIH0KKworICAgIEBUaGVuKCJjb21tZW50ICRjb21tZW50UG9zaXRpb24gaW4gY29tcGlsYXRpb24gdW5pdCBjb21tZW50ZWQgbm9kZSBpcyBJbnRlZ2VyTGl0ZXJhbEV4cHIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5Db21tZW50SW5Db21waWxhdGlvblVuaXRDb21tZW50ZWROb2RlSXNJbnRlZ2VyTGl0ZXJhbEV4cHIoaW50IGNvbW1lbnRQb3NpdGlvbikgeworICAgICAgICBDb21tZW50IGNvbW1lbnRVbmRlclRlc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QWxsQ29udGFpbmVkQ29tbWVudHMoKS5nZXQoY29tbWVudFBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tbWVudFVuZGVyVGVzdC5nZXRDb21tZW50ZWROb2RlKCkuZ2V0KCksIGluc3RhbmNlT2YoSW50ZWdlckxpdGVyYWxFeHByLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRoZW4oImNvbW1lbnQgJGNvbW1lbnRQb3NpdGlvbiBpbiBjb21waWxhdGlvbiB1bml0IGNvbW1lbnRlZCBub2RlIGlzIEV4cHJlc3Npb25TdG10IikKKyAgICBwdWJsaWMgdm9pZCB0aGVuQ29tbWVudEluQ29tcGlsYXRpb25Vbml0Q29tbWVudGVkTm9kZUlzSW50ZWdlckV4cHJlc3Npb25TdG10KGludCBjb21tZW50UG9zaXRpb24pIHsKKyAgICAgICAgQ29tbWVudCBjb21tZW50VW5kZXJUZXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFsbENvbnRhaW5lZENvbW1lbnRzKCkuZ2V0KGNvbW1lbnRQb3NpdGlvbiAtIDEpOworICAgICAgICBhc3NlcnRUaGF0KGNvbW1lbnRVbmRlclRlc3QuZ2V0Q29tbWVudGVkTm9kZSgpLmdldCgpLCBpbnN0YW5jZU9mKEV4cHJlc3Npb25TdG10LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRoZW4oImNvbW1lbnQgJGNvbW1lbnRQb3NpdGlvbiBpbiBjb21waWxhdGlvbiB1bml0IGNvbW1lbnRlZCBub2RlIGlzIFByaW1pdGl2ZVR5cGUiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5Db21tZW50SW5Db21waWxhdGlvblVuaXRDb21tZW50ZWROb2RlSXNJbnRlZ2VyUHJpbWl0aXZlVHlwZShpbnQgY29tbWVudFBvc2l0aW9uKSB7CisgICAgICAgIENvbW1lbnQgY29tbWVudFVuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBbGxDb250YWluZWRDb21tZW50cygpLmdldChjb21tZW50UG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21tZW50VW5kZXJUZXN0LmdldENvbW1lbnRlZE5vZGUoKS5nZXQoKSwgaW5zdGFuY2VPZihQcmltaXRpdmVUeXBlLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb21tZW50IHRvQ29tbWVudChQYXJhbWV0ZXJzIHJvdywgQ29tbWVudCBjb21tZW50KSB7CisgICAgICAgIGNvbW1lbnQuc2V0UmFuZ2UocmFuZ2UoSW50ZWdlci5wYXJzZUludChyb3cudmFsdWVzKCkuZ2V0KCJiZWdpbkxpbmUiKSksCisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyb3cudmFsdWVzKCkuZ2V0KCJiZWdpbkNvbHVtbiIpKSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJvdy52YWx1ZXMoKS5nZXQoImVuZExpbmUiKSksCisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyb3cudmFsdWVzKCkuZ2V0KCJlbmRDb2x1bW4iKSkpKTsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9Db21wYXJpbmdTdGVwcy5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9Db21wYXJpbmdTdGVwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzg5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL0NvbXBhcmluZ1N0ZXBzLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuR2l2ZW47CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5UaGVuOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCitwdWJsaWMgY2xhc3MgQ29tcGFyaW5nU3RlcHMgeworCisgICAgcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgZmlyc3Q7CisgICAgcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgc2Vjb25kOworCisgICAgLyoKKyAgICAgKiBHaXZlbiBzdGVwcworICAgICAqLworCisgICAgQEdpdmVuKCJ0aGUgZmlyc3QgY2xhc3M6JGNsYXNzU3JjIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlblRoZUZpcnN0Q2xhc3MoU3RyaW5nIGNsYXNzU3JjKSB7CisgICAgICAgIHRoaXMuZmlyc3QgPSBKYXZhUGFyc2VyLnBhcnNlKGNsYXNzU3JjLnRyaW0oKSk7CisgICAgfQorCisgICAgQEdpdmVuKCJ0aGUgc2Vjb25kIGNsYXNzOiRjbGFzc1NyYyIpCisgICAgcHVibGljIHZvaWQgZ2l2ZW5UaGVTZWNvbmRDbGFzcyhTdHJpbmcgY2xhc3NTcmMpIHsKKyAgICAgICAgdGhpcy5zZWNvbmQgPSBKYXZhUGFyc2VyLnBhcnNlKGNsYXNzU3JjLnRyaW0oKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGVuIHN0ZXBzCisgICAgICovCisKKyAgICBAVGhlbigidGhleSBhcmUgZXF1YWxzIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVGhleUFyZUVxdWFscygpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdCwgaXMoZXF1YWxUbyhzZWNvbmQpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL0V4aXN0ZW5jZU9mUGFyZW50Tm9kZVZlcmlmaWVyLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL0V4aXN0ZW5jZU9mUGFyZW50Tm9kZVZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkODFiNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc3RlcHMvRXhpc3RlbmNlT2ZQYXJlbnROb2RlVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5IYXNQYXJlbnROb2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRoZSA8Y29kZT5FeGlzdGVuY2VPZlBhcmVudE5vZGVWZXJpZmllcjwvY29kZT4gdmVyaWZpZXMgdGhhdCBlYWNoIG5vZGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGEgcGFyZW50IHNldC4KKyAqLworY2xhc3MgRXhpc3RlbmNlT2ZQYXJlbnROb2RlVmVyaWZpZXIgeworCisgICAgcHVibGljIHZvaWQgdmVyaWZ5KENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHRocm93cyBBc3NlcnRpb25FcnJvciB7CisgICAgICAgIG5ldyBWZXJpZmllcigpLnZpc2l0KGNvbXBpbGF0aW9uVW5pdCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVyaWZpZXIgZXh0ZW5kcyBWb2lkVmlzaXRvckFkYXB0ZXI8Vm9pZD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFBhcmVudElzU2V0KEhhc1BhcmVudE5vZGU8Pz4gbikgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChuICsgIiBoYXMgbm8gcGFyZW50IHNldCEiLCBuLmdldFBhcmVudE5vZGUoKS5vckVsc2UobnVsbCksIGlzKG5vdE51bGxWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQXJyYXlBY2Nlc3NFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQXJyYXlDcmVhdGlvbkV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChBcnJheUluaXRpYWxpemVyRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEFzc2VydFN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChBc3NpZ25FeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQmluYXJ5RXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEJsb2NrQ29tbWVudCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChCbG9ja1N0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChCb29sZWFuTGl0ZXJhbEV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChCcmVha1N0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChDYXN0RXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KENhdGNoQ2xhdXNlIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQ2hhckxpdGVyYWxFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQ2xhc3NFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQ2xhc3NPckludGVyZmFjZVR5cGUgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChDb21waWxhdGlvblVuaXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQ29uZGl0aW9uYWxFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KENvbnRpbnVlU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KERvU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KERvdWJsZUxpdGVyYWxFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoRW1wdHlTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoRW5jbG9zZWRFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChFbnVtRGVjbGFyYXRpb24gbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChFeHByZXNzaW9uU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZpZWxkQWNjZXNzRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChGb3JlYWNoU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZvclN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChJZlN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoSW5zdGFuY2VPZkV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChKYXZhZG9jQ29tbWVudCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChMYWJlbGVkU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KExpbmVDb21tZW50IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KExhbWJkYUV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChMb25nTGl0ZXJhbEV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChNYXJrZXJBbm5vdGF0aW9uRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1lbWJlclZhbHVlUGFpciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZENhbGxFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTmFtZUV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE51bGxMaXRlcmFsRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdENyZWF0aW9uRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFBhcmFtZXRlciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFByaW1pdGl2ZVR5cGUgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOYW1lIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoU2ltcGxlTmFtZSBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEFycmF5VHlwZSBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEFycmF5Q3JlYXRpb25MZXZlbCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEludGVyc2VjdGlvblR5cGUgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChVbmlvblR5cGUgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChSZXR1cm5TdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChTdHJpbmdMaXRlcmFsRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFN1cGVyRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFN3aXRjaEVudHJ5U3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFN3aXRjaFN0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChTeW5jaHJvbml6ZWRTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVGhpc0V4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChUaHJvd1N0bXQgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChUcnlTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChUeXBlUGFyYW1ldGVyIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVW5hcnlFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVW5rbm93blR5cGUgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIGFzc2VydFBhcmVudElzU2V0KG4pOworICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRvciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgYXNzZXJ0UGFyZW50SXNTZXQobik7CisgICAgICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFZvaWRUeXBlIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoV2hpbGVTdG10IG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoV2lsZGNhcmRUeXBlIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBhc3NlcnRQYXJlbnRJc1NldChuKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc3RlcHMvTWFuaXB1bGF0aW9uU3RlcHMuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc3RlcHMvTWFuaXB1bGF0aW9uU3RlcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTdiZjBkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9NYW5pcHVsYXRpb25TdGVwcy5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnN0ZXBzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuQmxvY2tTdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlRyeVN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuQWxpYXM7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5HaXZlbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLlRoZW47CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5XaGVuOworCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZU5hbWU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Qubm9kZUxpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHMuU2hhcmVkU3RlcHMuZ2V0TWV0aG9kQnlQb3NpdGlvbkFuZENsYXNzUG9zaXRpb247CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBNYW5pcHVsYXRpb25TdGVwcyB7CisKKyAgICAvKiBGaWVsZHMgdXNlZCB0byBtYWludGFpbiBzdGVwIHN0YXRlIHdpdGhpbiB0aGlzIHN0ZXAgY2xhc3MgKi8KKyAgICBwcml2YXRlIEJsb2NrU3RtdCBibG9ja1N0bXQ7CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgc3RhdGVtZW50OworICAgIHByaXZhdGUgVHJ5U3RtdCB0cnlTdG10OworICAgIHByaXZhdGUgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJMaXN0OworICAgIHByaXZhdGUgQ2hhbmdlTWV0aG9kTmFtZVRvVXBwZXJDYXNlVmlzaXRvciBjaGFuZ2VNZXRob2ROYW1lVG9VcHBlckNhc2VWaXNpdG9yOworICAgIHByaXZhdGUgQWRkTmV3SW50UGFyYW1ldGVyQ2FsbGVkVmFsdWVWaXNpdG9yIGFkZE5ld0ludFBhcmFtZXRlckNhbGxlZFZhbHVlVmlzaXRvcjsKKworICAgIC8qIE1hcCB0aGF0IG1haW50YWlucyBzaGFyZXMgc3RhdGUgYWNyb3NzIHN0ZXAgY2xhc3Nlcy4gIElmIG1hbmlwdWxhdGluZyB0aGUgb2JqZWN0cyBpbiB0aGUgbWFwIHlvdSBtdXN0IHVwZGF0ZSB0aGUgc3RhdGUgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdGU7CisKKyAgICBwdWJsaWMgTWFuaXB1bGF0aW9uU3RlcHMoTWFwPFN0cmluZywgT2JqZWN0PiBzdGF0ZSkgeworICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgfQorCisgICAgQEdpdmVuKCJhIEJsb2NrU3RtdCIpCisgICAgcHVibGljIHZvaWQgZ2l2ZW5BQmxvY2tTdGF0ZW1lbnQoKSB7CisgICAgICAgIGJsb2NrU3RtdCA9IG5ldyBCbG9ja1N0bXQoKTsKKyAgICB9CisKKyAgICBAR2l2ZW4oImEgU3RhdGVtZW50IikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFTdGF0ZW1lbnQoKSB7CisgICAgICAgIHN0YXRlbWVudCA9IG51bGw7CisgICAgfQorCisgICAgQEdpdmVuKCJhIFRyeVN0bXQiKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuQVRyeVN0bXQoKSB7CisgICAgICAgIHRyeVN0bXQgPSBuZXcgVHJ5U3RtdCgpOworICAgIH0KKworICAgIEBHaXZlbigiYSBMaXN0IG9mIFZhcmlhYmxlRGVjbGFyYXRpb25zIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFMaXN0T2ZWYXJpYWJsZURlY2xhcmF0aW9ucygpIHsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJMaXN0ID0gbmV3IE5vZGVMaXN0PD4oKTsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJMaXN0LmFkZChuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKSk7CisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByTGlzdC5hZGQobmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCkpOworICAgIH0KKworICAgIEBHaXZlbigiYSBDaGFuZ2VOYW1lVG9VcHBlckNhc2VWaXNpdG9yIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFDaGFuZ2VOYW1lVG9VcHBlckNhc2VWaXNpdG9yKCkgeworICAgICAgICBjaGFuZ2VNZXRob2ROYW1lVG9VcHBlckNhc2VWaXNpdG9yID0gbmV3IENoYW5nZU1ldGhvZE5hbWVUb1VwcGVyQ2FzZVZpc2l0b3IoKTsKKyAgICB9CisKKyAgICBAR2l2ZW4oImEgQWRkTmV3SW50UGFyYW1ldGVyQ2FsbGVkVmFsdWVWaXNpdG9yIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFBZGROZXdQYXJhbWV0ZXJDYWxsZWRWYWx1ZVZpc2l0b3IoKSB7CisgICAgICAgIGFkZE5ld0ludFBhcmFtZXRlckNhbGxlZFZhbHVlVmlzaXRvciA9IG5ldyBBZGROZXdJbnRQYXJhbWV0ZXJDYWxsZWRWYWx1ZVZpc2l0b3IoKTsKKyAgICB9CisKKyAgICBAV2hlbigiaXMgdGhlIFN0cmluZyBcIiR2YWx1ZVwiIGlzIHBhcnNlZCBieSB0aGUgSmF2YVBhcnNlciB1c2luZyBwYXJzZUJsb2NrIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuSXNUaGVTdHJpbmdJc1BhcnNlZEJ5VGhlSmF2YVBhcnNlcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYmxvY2tTdG10ID0gSmF2YVBhcnNlci5wYXJzZUJsb2NrKHZhbHVlKTsKKyAgICB9CisKKyAgICBAV2hlbigiaXMgdGhlIFN0cmluZyBcIiR2YWx1ZVwiIGlzIHBhcnNlZCBieSB0aGUgSmF2YVBhcnNlciB1c2luZyBwYXJzZVN0YXRlbWVudCIpCisgICAgcHVibGljIHZvaWQgd2hlbklzVGhlU3RyaW5nSXNQYXJzZWRCeVRoZUphdmFQYXJzZXJVc2luZ1BhcnNlU3RhdGVtZW50KFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdGF0ZW1lbnQgPSBKYXZhUGFyc2VyLnBhcnNlU3RhdGVtZW50KHZhbHVlKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIExpc3Qgb2YgVmFyaWFibGVEZWNsYXJhdGlvbnMgYXJlIHNldCBhcyB0aGUgcmVzb3VyY2VzIG9uIFRyeVN0bXQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVMaXN0T2ZWYXJpYWJsZURlY2xhcmF0aW9uc0FyZVNldEFzVGhlUmVzb3VyY2VzT25UcnlTdG10KCkgeworICAgICAgICB0cnlTdG10LnNldFJlc291cmNlcyh2YXJpYWJsZURlY2xhcmF0aW9uRXhwckxpc3QpOworICAgIH0KKworICAgIEBXaGVuKCJlbXB0eSBsaXN0IGlzIHNldCBhcyB0aGUgcmVzb3VyY2VzIG9uIFRyeVN0bXQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5OdWxsSXNTZXRBc1RoZVJlc291cmNlc09uVHJ5U3RtdCgpIHsKKyAgICAgICAgdHJ5U3RtdC5zZXRSZXNvdXJjZXMobmV3IE5vZGVMaXN0PD4oKSk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGlzIHNldCB0byBcIiRwYWNrYWdlTmFtZVwiIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlUGFja2FnZURlY2xhcmF0aW9uSXNTZXRUbyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5zZXRQYWNrYWdlRGVjbGFyYXRpb24obmV3IFBhY2thZ2VEZWNsYXJhdGlvbihwYXJzZU5hbWUocGFja2FnZU5hbWUpKSk7CisgICAgICAgIHN0YXRlLnB1dCgiY3UxIiwgY29tcGlsYXRpb25Vbml0KTsKKyAgICB9CisKKyAgICBAV2hlbigiYSBwdWJsaWMgY2xhc3MgY2FsbGVkIFwiJGNsYXNzTmFtZVwiIGlzIGFkZGVkIHRvIHRoZSBDb21waWxhdGlvblVuaXQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5BQ2xhc3NDYWxsZWRJc0FkZGVkVG9UaGVDb21waWxhdGlvblVuaXQoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgVHlwZURlY2xhcmF0aW9uPD8+IHR5cGUgPSBuZXcgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKSwgZmFsc2UsICJDcmVhdGVDbGFzcyIpOworICAgICAgICBjb21waWxhdGlvblVuaXQuc2V0VHlwZXMobm9kZUxpc3QodHlwZSkpOworICAgICAgICBzdGF0ZS5wdXQoImN1MSIsIGNvbXBpbGF0aW9uVW5pdCk7CisgICAgfQorCisgICAgQFdoZW4oImEgcHVibGljIHN0YXRpYyBtZXRob2QgY2FsbGVkIFwiJG1ldGhvZE5hbWVcIiByZXR1cm5pbmcgdm9pZCBpcyBhZGRlZCB0byBjbGFzcyAkcG9zaXRpb24gaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5BU3RhdGljTWV0aG9kQ2FsbGVkUmV0dXJuaW5nSXNBZGRlZFRvQ2xhc3NJblRoZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgbWV0aG9kTmFtZSwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBUeXBlRGVjbGFyYXRpb248Pz4gdHlwZSA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKHBvc2l0aW9uIC0gMSk7CisgICAgICAgIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKG1vZGlmaWVycywgbmV3IFZvaWRUeXBlKCksIG1ldGhvZE5hbWUpOworICAgICAgICBtb2RpZmllcnMuYWRkKE1vZGlmaWVyLlNUQVRJQyk7CisgICAgICAgIG1ldGhvZC5zZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgdHlwZS5hZGRNZW1iZXIobWV0aG9kKTsKKyAgICAgICAgc3RhdGUucHV0KCJjdTEiLCBjb21waWxhdGlvblVuaXQpOworICAgIH0KKworICAgIEBXaGVuKCIkdHlwZU5hbWUgdmFyYXJncyBjYWxsZWQgXCIkcGFyYW1ldGVyTmFtZVwiIGFyZSBhZGRlZCB0byBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVmFyYXJnc0NhbGxlZEFyZUFkZGVkVG9NZXRob2RJbkNsYXNzKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHBhcmFtZXRlck5hbWUsIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKGNvbXBpbGF0aW9uVW5pdCwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pCisgICAgICAgICAgICAgICAgLmFkZEFuZEdldFBhcmFtZXRlcih0eXBlTmFtZSwgcGFyYW1ldGVyTmFtZSkKKyAgICAgICAgICAgICAgICAuc2V0VmFyQXJncyh0cnVlKTsKKyAgICB9CisKKyAgICBAV2hlbigiYSBCbG9ja1N0bXQgaXMgYWRkZWQgdG8gbWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiIpCisgICAgcHVibGljIHZvaWQgd2hlbkFCbG9ja1N0bXRJc0FkZGVkVG9NZXRob2RJbkNsYXNzKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKGNvbXBpbGF0aW9uVW5pdCwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworICAgICAgICBtZXRob2Quc2V0Qm9keShuZXcgQmxvY2tTdG10KCkpOworICAgIH0KKworICAgIEBXaGVuKCIkY2xhc3NOYW1lLiRmaWVsZE5hbWUuJG1ldGhvZE5hbWUoXCIkc3RyaW5nVmFsdWVcIik7IGlzIGFkZGVkIHRvIHRoZSBib2R5IG9mIG1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24iKQorICAgIHB1YmxpYyB2b2lkIHdoZW5IZWxsb1dvcmxkSXNBZGRlZFRvVGhlQm9keU9mTWV0aG9kSW5DbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBnZXRNZXRob2RCeVBvc2l0aW9uQW5kQ2xhc3NQb3NpdGlvbihjb21waWxhdGlvblVuaXQsIG1ldGhvZFBvc2l0aW9uLCBjbGFzc1Bvc2l0aW9uKTsKKyAgICAgICAgTmFtZUV4cHIgY2xhenogPSBuZXcgTmFtZUV4cHIoY2xhc3NOYW1lKTsKKyAgICAgICAgRmllbGRBY2Nlc3NFeHByIGZpZWxkID0gbmV3IEZpZWxkQWNjZXNzRXhwcihjbGF6eiwgZmllbGROYW1lKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IG5ldyBNZXRob2RDYWxsRXhwcihmaWVsZCwgbWV0aG9kTmFtZSk7CisgICAgICAgIGNhbGwuYWRkQXJndW1lbnQobmV3IFN0cmluZ0xpdGVyYWxFeHByKHN0cmluZ1ZhbHVlKSk7CisgICAgICAgIG1ldGhvZC5nZXRCb2R5KCkuZ2V0KCkuYWRkU3RhdGVtZW50KGNhbGwpOworICAgIH0KKworICAgIEBXaGVuKCJtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGhhcyBpdCdzIG5hbWUgY29udmVydGVkIHRvIHVwcGVyY2FzZSIpCisgICAgcHVibGljIHZvaWQgd2hlbk1ldGhvZEluQ2xhc3NIYXNJdHNOYW1lQ29udmVydGVkVG9VcHBlcmNhc2UoaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbikgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gZ2V0TWV0aG9kQnlQb3NpdGlvbkFuZENsYXNzUG9zaXRpb24oY29tcGlsYXRpb25Vbml0LCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIG1ldGhvZC5zZXROYW1lKG1ldGhvZC5nZXROYW1lQXNTdHJpbmcoKS50b1VwcGVyQ2FzZSgpKTsKKyAgICB9CisKKyAgICBAV2hlbigibWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBoYXMgYW4gaW50IHBhcmFtZXRlciBjYWxsZWQgXCIkcGFyYW1OYW1lXCIgYWRkZWQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5NZXRob2RJbkNsYXNzSGFzQW5JbnRBcmd1bWVudENhbGxlZEFkZGVkKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIFN0cmluZyBwYXJhbU5hbWUpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKGNvbXBpbGF0aW9uVW5pdCwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworICAgICAgICBtZXRob2QuYWRkUGFyYW1ldGVyKGludFR5cGUoKSwgcGFyYW1OYW1lKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgY2xvbmVkIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlQ29tcGlsYXRpb25Vbml0SXNDbG9uZWQoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgc3RhdGUucHV0KCJjdTEiLCBjb21waWxhdGlvblVuaXQuY2xvbmUoKSk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBDaGFuZ2VOYW1lVG9VcHBlckNhc2VWaXNpdG9yIHZpc2l0cyB0byBjb21waWxhdGlvbiB1bml0IikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlVmlzaXRvclZpc2l0c1RvQ29tcGlsYXRpb25Vbml0KCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgY2hhbmdlTWV0aG9kTmFtZVRvVXBwZXJDYXNlVmlzaXRvci52aXNpdChjb21waWxhdGlvblVuaXQsIG51bGwpOworICAgICAgICBzdGF0ZS5wdXQoImN1MSIsIGNvbXBpbGF0aW9uVW5pdCk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBBZGROZXdJbnRQYXJhbWV0ZXJDYWxsZWRWYWx1ZVZpc2l0b3IgdmlzaXRzIHRvIGNvbXBpbGF0aW9uIHVuaXQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVBZGROZXdQYXJhbWV0ZXJDYWxsZWRWYWx1ZVZpc2l0b3JWaXNpdHNUb0NvbXBpbGF0aW9uVW5pdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIGFkZE5ld0ludFBhcmFtZXRlckNhbGxlZFZhbHVlVmlzaXRvci52aXNpdChjb21waWxhdGlvblVuaXQsIG51bGwpOworICAgICAgICBzdGF0ZS5wdXQoImN1MSIsIGNvbXBpbGF0aW9uVW5pdCk7CisgICAgfQorCisgICAgQFRoZW4oImlzIG5vdCBlcXVhbCB0byBudWxsIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuSXNOb3RFcXVhbFRvTnVsbCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhjb21waWxhdGlvblVuaXQsIG51bGwpOworICAgIH0KKworICAgIEBUaGVuKCJpcyBub3QgZXF1YWwgdG8gJHZhbHVlIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuSXNOb3RFcXVhbFRvKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGNvbXBpbGF0aW9uVW5pdCwgdmFsdWUpOworICAgIH0KKworICAgIEBUaGVuKCJTdGF0ZW1lbnQgJHBvc2l0aW9uIGluIEJsb2NrU3RtdCB0b1N0cmluZyBpcyBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUJsb2NrU3RtdENvbnRlbnRJcyhpbnQgcG9zaXRpb24sIFN0cmluZyBleHBlY3RlZENvbnRlbnQpIHsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudFVuZGVyVGVzdCA9IGJsb2NrU3RtdC5nZXRTdGF0ZW1lbnQocG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdGF0ZW1lbnRVbmRlclRlc3QudG9TdHJpbmcoKSwgaXMoZXhwZWN0ZWRDb250ZW50KSk7CisgICAgfQorCisgICAgQFRoZW4oIlN0YXRlbWVudCB0b1N0cmluZyBpcyBcIiRleHBlY3RlZENvbnRlbnRcIiIpCisgICAgcHVibGljIHZvaWQgdGhlblN0YXRlbWVudFRvU3RyaW5nSXN4WHkoU3RyaW5nIGV4cGVjdGVkQ29udGVudCkgeworICAgICAgICBhc3NlcnRUaGF0KHN0YXRlbWVudC50b1N0cmluZygpLCBpcyhleHBlY3RlZENvbnRlbnQpKTsKKyAgICB9CisKKyAgICBAVGhlbigiYWxsIHRoZSBWYXJpYWJsZURlY2xhcmF0aW9ucyBwYXJlbnQgaXMgdGhlIFRyeVN0bXQiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5BbGxUaGVWYXJpYWJsZURlY2xhcmF0aW9uc1BhcmVudElzVGhlVHJ5U3RtdCgpIHsKKyAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJMaXN0LmZvckVhY2goZXhwciAtPiBhc3NlcnRUaGF0KGV4cHIuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLCBpcyh0cnlTdG10KSkpOworICAgIH0KKworICAgIEBUaGVuKCJ0aGUgVHJ5U3RtdCBoYXMgbm8gY2hpbGQgbm9kZXMiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVUcnlTdG10SGFzTm90Q2hpbGROb2RlcygpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0cnlTdG10LmdldENoaWxkTm9kZXMoKS5zaXplKCksIGlzKDApKTsKKyAgICB9CisKKyAgICBAVGhlbigibWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBoYXMgdGhlIG5hbWUgXCIkZXhwZWN0ZWROYW1lXCIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5NZXRob2RJbkNsYXNzSGFzVGhlTmFtZShpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWROYW1lKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBnZXRNZXRob2RCeVBvc2l0aW9uQW5kQ2xhc3NQb3NpdGlvbihjb21waWxhdGlvblVuaXQsIG1ldGhvZFBvc2l0aW9uLCBjbGFzc1Bvc2l0aW9uKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRob2QuZ2V0TmFtZUFzU3RyaW5nKCksIGlzKGV4cGVjdGVkTmFtZSkpOworICAgIH0KKworICAgIEBUaGVuKCJtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGhhcyAkZXhwZWN0ZWRDb3VudCBwYXJhbWV0ZXJzIikKKyAgICBAQWxpYXMoIm1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaGFzICRleHBlY3RlZENvdW50IHBhcmFtZXRlciIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZEluQ2xhc3NIYXNBcmd1bWVudHMoaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwgaW50IGV4cGVjdGVkQ291bnQpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKGNvbXBpbGF0aW9uVW5pdCwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworCisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCksIGlzKGV4cGVjdGVkQ291bnQpKTsKKyAgICB9CisKKyAgICBAVGhlbigibWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBwYXJhbWV0ZXIgJHBhcmFtZXRlclBvc2l0aW9uIGlzIHR5cGUgaW50IGNhbGxlZCBcIiRleHBlY3RlZE5hbWVcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZEluQ2xhc3NQYXJhbWV0ZXJJc1R5cGVJbnRDYWxsZWQoaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwgaW50IHBhcmFtZXRlclBvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWROYW1lKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSBnZXRNZXRob2RCeVBvc2l0aW9uQW5kQ2xhc3NQb3NpdGlvbihjb21waWxhdGlvblVuaXQsIG1ldGhvZFBvc2l0aW9uLCBjbGFzc1Bvc2l0aW9uKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG1ldGhvZC5nZXRQYXJhbWV0ZXIocGFyYW1ldGVyUG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXJhbWV0ZXIuZ2V0VHlwZSgpLCBpcyhpbnRUeXBlKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXJhbWV0ZXIuZ2V0TmFtZUFzU3RyaW5nKCksIGlzKGV4cGVjdGVkTmFtZSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYW5nZU1ldGhvZE5hbWVUb1VwcGVyQ2FzZVZpc2l0b3IgZXh0ZW5kcyBWb2lkVmlzaXRvckFkYXB0ZXI8Vm9pZD4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIG4uc2V0TmFtZShuLmdldE5hbWVBc1N0cmluZygpLnRvVXBwZXJDYXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWRkTmV3SW50UGFyYW1ldGVyQ2FsbGVkVmFsdWVWaXNpdG9yIGV4dGVuZHMgVm9pZFZpc2l0b3JBZGFwdGVyPFZvaWQ+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICBuLmFkZFBhcmFtZXRlcihpbnRUeXBlKCksICJ2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1BhcnNpbmdTdGVwcy5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9QYXJzaW5nU3RlcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTYzMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9QYXJzaW5nU3RlcHMuamF2YQpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZC5zdGVwczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlJldHVyblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLkdpdmVuOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuVGhlbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLldoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMucHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHMuU2hhcmVkU3RlcHMuZ2V0TWVtYmVyQnlUeXBlQW5kUG9zaXRpb247CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHMuU2hhcmVkU3RlcHMuZ2V0TWV0aG9kQnlQb3NpdGlvbkFuZENsYXNzUG9zaXRpb247CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXNOdWxsLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitwdWJsaWMgY2xhc3MgUGFyc2luZ1N0ZXBzIHsKKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBzdGF0ZTsKKworICAgIHB1YmxpYyBQYXJzaW5nU3RlcHMoTWFwPFN0cmluZywgT2JqZWN0PiBzdGF0ZSkgeworICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlVW5kZXJUZXN0OworCisgICAgLyoKKyAgICAgKiBHaXZlbiBzdGVwcworICAgICAqLworCisgICAgQEdpdmVuKCJ0aGUgY2xhc3M6JGNsYXNzU3JjIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlblRoZUNsYXNzKFN0cmluZyBjbGFzc1NyYykgeworICAgICAgICB0aGlzLnNvdXJjZVVuZGVyVGVzdCA9IGNsYXNzU3JjLnRyaW0oKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogV2hlbiBzdGVwcworICAgICAqLworCisgICAgQFdoZW4oIkkgdGFrZSB0aGUgQXJyYXlDcmVhdGlvbkV4cHIiKQorICAgIHB1YmxpYyB2b2lkIGlUYWtlVGhlQXJyYXlDcmVhdGlvbkV4cHIoKSB7CisgICAgICAgIHNldFNlbGVjdGVkTm9kZUZyb21Db21waWxhdGlvblVuaXQoQXJyYXlDcmVhdGlvbkV4cHIuY2xhc3MpOworICAgIH0KKworICAgIEBXaGVuKCJJIHRha2UgdGhlIFBhY2thZ2VEZWNsYXJhdGlvbiIpCisgICAgcHVibGljIHZvaWQgaVRha2VUaGVQYWNrYWdlRGVjbGFyYXRpb24oKSB7CisgICAgICAgIHNldFNlbGVjdGVkTm9kZUZyb21Db21waWxhdGlvblVuaXQoUGFja2FnZURlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAV2hlbigiSSB0YWtlIHRoZSBPYmplY3RDcmVhdGlvbkV4cHIiKQorICAgIHB1YmxpYyB2b2lkIGlUYWtlVGhlT2JqZWN0Q3JlYXRpb25FeHByKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBzZXRTZWxlY3RlZE5vZGVGcm9tQ29tcGlsYXRpb25Vbml0KE9iamVjdENyZWF0aW9uRXhwci5jbGFzcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGVuIHN0ZXBzCisgICAgICovCisKKyAgICBAVGhlbigiY29uc3RydWN0b3IgJGNvbnN0cnVjdG9yUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gZGVjbGFyYXRpb24gYXMgYSBTdHJpbmcgaXMgXCIkZXhwZWN0ZWRTdHJpbmdcIiIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUNvbnN0cnVjdG9yRGVjbGFyYXRpb25Bc0FTdHJpbmdJcyhpbnQgY29uc3RydWN0b3JQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIFN0cmluZyBleHBlY3RlZFN0cmluZykgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXp6ID0gKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbikgY29tcGlsYXRpb25Vbml0LmdldFR5cGUoY2xhc3NQb3NpdGlvbiAtIDEpOworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yID0gKENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIGNsYXp6LmdldE1lbWJlcihjb25zdHJ1Y3RvclBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoY29uc3RydWN0b3IuZ2V0RGVjbGFyYXRpb25Bc1N0cmluZygpLCBpcyhleHBlY3RlZFN0cmluZykpOworICAgIH0KKworICAgIEBUaGVuKCJjb25zdHJ1Y3RvciAkY29uc3RydWN0b3JQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBkZWNsYXJhdGlvbiBzaG9ydCBmb3JtIGFzIGEgU3RyaW5nIGlzIFwiJGV4cGVjdGVkU3RyaW5nXCIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5Db25zdHJ1Y3RvckluQ2xhc3NEZWNsYXJhdGlvblNob3J0Rm9ybUFzQVN0cmluZ0lzKGludCBjb25zdHJ1Y3RvclBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZShjbGFzc1Bvc2l0aW9uIC0gMSk7CisgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgY2xhenouZ2V0TWVtYmVyKGNvbnN0cnVjdG9yUG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb25zdHJ1Y3Rvci5nZXREZWNsYXJhdGlvbkFzU3RyaW5nKGZhbHNlLCBmYWxzZSksIGlzKGV4cGVjdGVkU3RyaW5nKSk7CisgICAgfQorCisgICAgQFRoZW4oIm1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gZGVjbGFyYXRpb24gYXMgYSBTdHJpbmcgaXMgXCIkZXhwZWN0ZWRTdHJpbmdcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZDFJbkNsYXNzMURlY2xhcmF0aW9uQXNBU3RyaW5nSXMoaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhenogPSAoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZShjbGFzc1Bvc2l0aW9uIC0gMSk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgY2xhenouZ2V0TWVtYmVyKG1ldGhvZFBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kLmdldERlY2xhcmF0aW9uQXNTdHJpbmcoKSwgaXMoZXhwZWN0ZWRTdHJpbmcpKTsKKyAgICB9CisKKyAgICBAVGhlbigibWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBkZWNsYXJhdGlvbiBhcyBhIFN0cmluZyBzaG9ydCBmb3JtIGlzIFwiJGV4cGVjdGVkU3RyaW5nXCIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5NZXRob2RJbkNsYXNzRGVjbGFyYXRpb25Bc0FTdHJpbmdTaG9ydEZvcm1JcyhpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGF6eiA9IChDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24pIGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBjbGF6ei5nZXRNZW1iZXIobWV0aG9kUG9zaXRpb24gLSAxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRob2QuZ2V0RGVjbGFyYXRpb25Bc1N0cmluZyhmYWxzZSwgZmFsc2UpLCBpcyhleHBlY3RlZFN0cmluZykpOworICAgIH0KKworICAgIEBUaGVuKCJmaWVsZCAkZmllbGRQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBjb250YWlucyBhbm5vdGF0aW9uICRhbm5vdGF0aW9uUG9zaXRpb24gdmFsdWUgaXMgXCIkZXhwZWN0ZWRWYWx1ZVwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuRmllbGRJbkNsYXNzQ29udGFpbnNBbm5vdGF0aW9uVmFsdWVJcyhpbnQgZmllbGRQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIGludCBhbm5vdGF0aW9uUG9zaXRpb24sIFN0cmluZyBleHBlY3RlZFZhbHVlKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworCisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiBjbGFzc1VuZGVyVGVzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlKGNsYXNzUG9zaXRpb24gLSAxKTsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZFVuZGVyVGVzdCA9IGdldE1lbWJlckJ5VHlwZUFuZFBvc2l0aW9uKGNsYXNzVW5kZXJUZXN0LCBmaWVsZFBvc2l0aW9uIC0gMSwKKyAgICAgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uLmNsYXNzKTsKKyAgICAgICAgQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvblVuZGVyVGVzdCA9IGZpZWxkVW5kZXJUZXN0LmdldEFubm90YXRpb24oYW5ub3RhdGlvblBvc2l0aW9uIC0gMSk7CisgICAgICAgIGFzc2VydFRoYXQoYW5ub3RhdGlvblVuZGVyVGVzdC5nZXRDaGlsZE5vZGVzKCkuZ2V0KDEpLnRvU3RyaW5nKCksIGlzKGV4cGVjdGVkVmFsdWUpKTsKKyAgICB9CisKKyAgICBAVGhlbigibGFtYmRhIGluIHN0YXRlbWVudCAkc3RhdGVtZW50UG9zaXRpb24gaW4gbWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBpcyBjYWxsZWQgJGV4cGVjdGVkTmFtZSIpCisgICAgcHVibGljIHZvaWQgdGhlbkxhbWJkYUluQ2xhc3NJc0NhbGxlZChpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sIFN0cmluZyBleHBlY3RlZE5hbWUpIHsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IGdldFN0YXRlbWVudEluTWV0aG9kSW5DbGFzcyhzdGF0ZW1lbnRQb3NpdGlvbiwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBleHByZXNzaW9uID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByKSAoKEV4cHJlc3Npb25TdG10KSBzdGF0ZW1lbnQpLmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlRGVjbGFyYXRvciA9IGV4cHJlc3Npb24uZ2V0VmFyaWFibGUoMCk7CisgICAgICAgIGFzc2VydFRoYXQodmFyaWFibGVEZWNsYXJhdG9yLmdldE5hbWVBc1N0cmluZygpLCBpcyhleHBlY3RlZE5hbWUpKTsKKyAgICB9CisKKyAgICBAVGhlbigibGFtYmRhIGluIHN0YXRlbWVudCAkc3RhdGVtZW50UG9zaXRpb24gaW4gbWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBib2R5IGlzIFwiJGV4cGVjdGVkQm9keVwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuTGFtYmRhSW5TdGF0ZW1lbnRJbk1ldGhvZEluQ2xhc3NCb2R5KGludCBzdGF0ZW1lbnRQb3NpdGlvbiwgaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZEJvZHkpIHsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gZ2V0TGFtYmRhRXhwckluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIGFzc2VydFRoYXQobGFtYmRhRXhwci5nZXRCb2R5KCkudG9TdHJpbmcoKSwgaXMoZXhwZWN0ZWRCb2R5KSk7CisgICAgfQorCisgICAgQFRoZW4oImxhbWJkYSBpbiBtZXRob2QgY2FsbCBpbiBzdGF0ZW1lbnQgJHN0YXRlbWVudFBvc2l0aW9uIGluIG1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gYm9keSBpcyBcIiRleHBlY3RlZEJvZHlcIiIpCisgICAgcHVibGljIHZvaWQgdGhlbkxhbWJkYUluTWV0aG9kQ2FsbEluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzQm9keShpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRCb2R5KSB7CisgICAgICAgIEV4cHJlc3Npb25TdG10IHN0YXRlbWVudCA9IGdldFN0YXRlbWVudEluTWV0aG9kSW5DbGFzcyhzdGF0ZW1lbnRQb3NpdGlvbiwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pLmFzRXhwcmVzc2lvblN0bXQoKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgPSBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLmFzVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoKTsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHZhcmlhYmxlRGVjbGFyYXRvciA9IHZhcmlhYmxlRGVjbGFyYXRpb25FeHByLmdldFZhcmlhYmxlKDApOworICAgICAgICBNZXRob2RDYWxsRXhwciBtZXRob2RDYWxsRXhwciA9IChNZXRob2RDYWxsRXhwcikgdmFyaWFibGVEZWNsYXJhdG9yLmdldEluaXRpYWxpemVyKCkub3JFbHNlKG51bGwpOworICAgICAgICBDYXN0RXhwciBjYXN0RXhwciA9IG1ldGhvZENhbGxFeHByLmdldEFyZ3VtZW50KDApLmFzQ2FzdEV4cHIoKTsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gY2FzdEV4cHIuZ2V0RXhwcmVzc2lvbigpLmFzTGFtYmRhRXhwcigpOworICAgICAgICBhc3NlcnRUaGF0KGxhbWJkYUV4cHIuZ2V0Qm9keSgpLnRvU3RyaW5nKCksIGlzKGV4cGVjdGVkQm9keSkpOworICAgIH0KKworICAgIEBUaGVuKCJsYW1iZGEgaW4gc3RhdGVtZW50ICRzdGF0ZW1lbnRQb3NpdGlvbiBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGJsb2NrIHN0YXRlbWVudCBpcyBudWxsIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuTGFtYmRhSW5TdGF0ZW1lbnRJbk1ldGhvZEluQ2xhc3NCbG9ja1N0YXRlbWVudElzTnVsbChpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gZ2V0TGFtYmRhRXhwckluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIEJsb2NrU3RtdCBibG9ja1N0bXQgPSBsYW1iZGFFeHByLmdldEJvZHkoKS5hc0Jsb2NrU3RtdCgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYmxvY2tTdG10LmdldFN0YXRlbWVudHMoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUaGVuKCJsYW1iZGEgaW4gc3RhdGVtZW50ICRzdGF0ZW1lbnRQb3NpdGlvbiBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGhhcyBwYXJhbWV0ZXJzIHdpdGggbm9uLW51bGwgdHlwZSIpCisgICAgcHVibGljIHZvaWQgdGhlbkxhbWJkYUluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzSGFzUGFyYW1ldGVyc1dpdGhOb25OdWxsVHlwZShpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gZ2V0TGFtYmRhRXhwckluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IGxhbWJkYUV4cHIuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHBhcmFtZXRlci5nZXRUeXBlKCksIGlzKG5vdE51bGxWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGhlbigibGFtYmRhIGluIHN0YXRlbWVudCAkc3RhdGVtZW50UG9zaXRpb24gaW4gbWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBibG9jayBzdGF0ZW1lbnQgaXMgXCIkZXhwZWN0ZWRCb2R5XCIiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5MYW1iZGFJblN0YXRlbWVudEluTWV0aG9kSW5DbGFzc0Jsb2NrU3RhdGVtZW50KGludCBzdGF0ZW1lbnRQb3NpdGlvbiwgaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRCb2R5KSB7CisgICAgICAgIExhbWJkYUV4cHIgbGFtYmRhRXhwciA9IGdldExhbWJkYUV4cHJJblN0YXRlbWVudEluTWV0aG9kSW5DbGFzcyhzdGF0ZW1lbnRQb3NpdGlvbiwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworICAgICAgICBCbG9ja1N0bXQgYmxvY2tTdG10ID0gbGFtYmRhRXhwci5nZXRCb2R5KCkuYXNCbG9ja1N0bXQoKTsKKyAgICAgICAgU3RhdGVtZW50IGxhbWJkYVN0bXQgPSBibG9ja1N0bXQuZ2V0U3RhdGVtZW50KDApOworICAgICAgICBhc3NlcnRUaGF0KGxhbWJkYVN0bXQudG9TdHJpbmcoKSwgaXMoZXhwZWN0ZWRCb2R5KSk7CisgICAgfQorCisgICAgQFRoZW4oImxhbWJkYSBpbiBzdGF0ZW1lbnQgJHN0YXRlbWVudFBvc2l0aW9uIGluIG1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgcGFyZW50IG9mIGNvbnRhaW5lZCBib2R5IikKKyAgICBwdWJsaWMgdm9pZCB0aGVuTGFtYmRhSW5TdGF0ZW1lbnRJbk1ldGhvZEluQ2xhc3NJc1BhcmVudE9mQ29udGFpbmVkQm9keShpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gZ2V0TGFtYmRhRXhwckluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIFN0YXRlbWVudCBib2R5ID0gbGFtYmRhRXhwci5nZXRCb2R5KCk7CisgICAgICAgIGFzc2VydFRoYXQoYm9keS5nZXRQYXJlbnROb2RlKCkuZ2V0KCksIGlzKGxhbWJkYUV4cHIpKTsKKyAgICB9CisKKyAgICBAVGhlbigibGFtYmRhIGluIHN0YXRlbWVudCAkc3RhdGVtZW50UG9zaXRpb24gaW4gbWV0aG9kICRtZXRob2RQb3NpdGlvbiBpbiBjbGFzcyAkY2xhc3NQb3NpdGlvbiBpcyBwYXJlbnQgb2YgY29udGFpbmVkIHBhcmFtZXRlciIpCisgICAgcHVibGljIHZvaWQgdGhlbkxhbWJkYUluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzSXNQYXJlbnRPZkNvbnRhaW5lZFBhcmFtZXRlcihpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgTGFtYmRhRXhwciBsYW1iZGFFeHByID0gZ2V0TGFtYmRhRXhwckluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBsYW1iZGFFeHByLmdldFBhcmFtZXRlcigwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXJhbWV0ZXIuZ2V0UGFyZW50Tm9kZSgpLmdldCgpLCBpcyhsYW1iZGFFeHByKSk7CisgICAgfQorCisgICAgQFRoZW4oIm1ldGhvZCByZWZlcmVuY2UgaW4gc3RhdGVtZW50ICRzdGF0ZW1lbnRQb3NpdGlvbiBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIHNjb3BlIGlzICRleHBlY3RlZE5hbWUiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5NZXRob2RSZWZlcmVuY2VJblN0YXRlbWVudEluTWV0aG9kSW5DbGFzc0lzU2NvcGUoaW50IHN0YXRlbWVudFBvc2l0aW9uLCBpbnQgbWV0aG9kUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xhc3NQb3NpdGlvbiwgU3RyaW5nIGV4cGVjdGVkTmFtZSkgeworICAgICAgICBFeHByZXNzaW9uU3RtdCBzdGF0ZW1lbnRVbmRlclRlc3QgPSBnZXRTdGF0ZW1lbnRJbk1ldGhvZEluQ2xhc3Moc3RhdGVtZW50UG9zaXRpb24sIG1ldGhvZFBvc2l0aW9uLCBjbGFzc1Bvc2l0aW9uKS5hc0V4cHJlc3Npb25TdG10KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRVbmRlclRlc3QuZmluZEFsbChNZXRob2RSZWZlcmVuY2VFeHByLmNsYXNzKS5zaXplKCkpOworICAgICAgICBNZXRob2RSZWZlcmVuY2VFeHByIG1ldGhvZFJlZmVyZW5jZVVuZGVyVGVzdCA9IHN0YXRlbWVudFVuZGVyVGVzdC5maW5kRmlyc3QoTWV0aG9kUmVmZXJlbmNlRXhwci5jbGFzcykuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kUmVmZXJlbmNlVW5kZXJUZXN0LmdldFNjb3BlKCkudG9TdHJpbmcoKSwgaXMoZXhwZWN0ZWROYW1lKSk7CisgICAgfQorCisgICAgQFRoZW4oIm1ldGhvZCByZWZlcmVuY2UgaW4gc3RhdGVtZW50ICRzdGF0ZW1lbnRQb3NpdGlvbiBpbiBtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGluIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGlkZW50aWZpZXIgaXMgJGV4cGVjdGVkTmFtZSIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZFJlZmVyZW5jZUluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzSWRlbnRpZmllcklzQ29tcGFyZUJ5QWdlKGludCBzdGF0ZW1lbnRQb3NpdGlvbiwgaW50IG1ldGhvZFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xhc3NQb3NpdGlvbiwgU3RyaW5nIGV4cGVjdGVkTmFtZSkgeworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50VW5kZXJUZXN0ID0gZ2V0U3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRVbmRlclRlc3QuZmluZEFsbChNZXRob2RSZWZlcmVuY2VFeHByLmNsYXNzKS5zaXplKCkpOworICAgICAgICBNZXRob2RSZWZlcmVuY2VFeHByIG1ldGhvZFJlZmVyZW5jZVVuZGVyVGVzdCA9IHN0YXRlbWVudFVuZGVyVGVzdC5maW5kRmlyc3QoTWV0aG9kUmVmZXJlbmNlRXhwci5jbGFzcykuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kUmVmZXJlbmNlVW5kZXJUZXN0LmdldElkZW50aWZpZXIoKSwgaXMoZXhwZWN0ZWROYW1lKSk7CisgICAgfQorCisgICAgQFRoZW4oIm1ldGhvZCAkbWV0aG9kUG9zaXRpb24gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgYSBkZWZhdWx0IG1ldGhvZCIpCisgICAgcHVibGljIHZvaWQgdGhlbk1ldGhvZENsYXNzSXNBRGVmYXVsdE1ldGhvZChpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RVbmRlclRlc3QgPSBnZXRNZXRob2RCeVBvc2l0aW9uQW5kQ2xhc3NQb3NpdGlvbihjb21waWxhdGlvblVuaXQsCisgICAgICAgICAgICAgICAgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZFVuZGVyVGVzdC5pc0RlZmF1bHQoKSwgaXModHJ1ZSkpOworICAgIH0KKworICAgIEBUaGVuKCJtZXRob2QgJG1ldGhvZFBvc2l0aW9uIGNsYXNzICRjbGFzc1Bvc2l0aW9uIGlzIG5vdCBhIGRlZmF1bHQgbWV0aG9kIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuTWV0aG9kQ2xhc3NJc05vdEFEZWZhdWx0TWV0aG9kKGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFVuZGVyVGVzdCA9IGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKGNvbXBpbGF0aW9uVW5pdCwKKyAgICAgICAgICAgICAgICBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kVW5kZXJUZXN0LmlzRGVmYXVsdCgpLCBpcyhmYWxzZSkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RhdGVtZW50IGdldFN0YXRlbWVudEluTWV0aG9kSW5DbGFzcyhpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKGNvbXBpbGF0aW9uVW5pdCwgbWV0aG9kUG9zaXRpb24sIGNsYXNzUG9zaXRpb24pOworICAgICAgICByZXR1cm4gbWV0aG9kLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoc3RhdGVtZW50UG9zaXRpb24gLSAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExhbWJkYUV4cHIgZ2V0TGFtYmRhRXhwckluU3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKGludCBzdGF0ZW1lbnRQb3NpdGlvbiwgaW50IG1ldGhvZFBvc2l0aW9uLCBpbnQgY2xhc3NQb3NpdGlvbikgeworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZ2V0U3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbik7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIGV4cHJlc3Npb24gPSAoKEV4cHJlc3Npb25TdG10KSBzdGF0ZW1lbnQpLmdldEV4cHJlc3Npb24oKS5hc1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2YXJpYWJsZURlY2xhcmF0b3IgPSBleHByZXNzaW9uLmdldFZhcmlhYmxlKDApOworICAgICAgICByZXR1cm4gKExhbWJkYUV4cHIpIHZhcmlhYmxlRGVjbGFyYXRvci5nZXRJbml0aWFsaXplcigpLm9yRWxzZShudWxsKTsKKyAgICB9CisKKyAgICBAVGhlbigiYWxsIG5vZGVzIHJlZmVyIHRvIHRoZWlyIHBhcmVudCIpCisgICAgcHVibGljIHZvaWQgYWxsTm9kZXNSZWZlclRvVGhlaXJQYXJlbnQoKSB7CisgICAgICAgIGFzc2VydEFsbE5vZGVzT2ZUaGVDb21waWxhdGlvblVuaXRIYXZlVGhlaXJQYXJlbnRTZXQoImN1MSIpOworICAgIH0KKworICAgIEBUaGVuKCJhbGwgbm9kZXMgb2YgdGhlIHNlY29uZCBjb21waWxhdGlvbiB1bml0IHJlZmVyIHRvIHRoZWlyIHBhcmVudCIpCisgICAgcHVibGljIHZvaWQgdGhlbkFsbE5vZGVzT2ZUaGVTZWNvbmRDb21waWxhdGlvblVuaXRSZWZlclRvVGhlaXJQYXJlbnQoKSB7CisgICAgICAgIGFzc2VydEFsbE5vZGVzT2ZUaGVDb21waWxhdGlvblVuaXRIYXZlVGhlaXJQYXJlbnRTZXQoImN1MiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBbGxOb2Rlc09mVGhlQ29tcGlsYXRpb25Vbml0SGF2ZVRoZWlyUGFyZW50U2V0KFN0cmluZyBzdGF0ZUtleSkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KHN0YXRlS2V5KTsKKyAgICAgICAgRXhpc3RlbmNlT2ZQYXJlbnROb2RlVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIgPSBuZXcgRXhpc3RlbmNlT2ZQYXJlbnROb2RlVmVyaWZpZXIoKTsKKyAgICAgICAgcGFyZW50VmVyaWZpZXIudmVyaWZ5KGNvbXBpbGF0aW9uVW5pdCk7CisgICAgfQorCisgICAgQFRoZW4oIlRoZW5FeHByIGluIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIG9mIHRoZSBzdGF0ZW1lbnQgJHN0YXRlbWVudFBvc2l0aW9uIGluIG1ldGhvZCAkbWV0aG9kUG9zaXRpb24gaW4gY2xhc3MgJGNsYXNzUG9zaXRpb24gaXMgTGFtYmRhRXhwciIpCisgICAgcHVibGljIHZvaWQgdGhlbkxhbWJkYUluQ29uZGl0aW9uYWxFeHByZXNzaW9uSW5NZXRob2RJbkNsYXNzSXNQYXJlbnRPZkNvbnRhaW5lZFBhcmFtZXRlcihpbnQgc3RhdGVtZW50UG9zaXRpb24sIGludCBtZXRob2RQb3NpdGlvbiwgaW50IGNsYXNzUG9zaXRpb24pIHsKKyAgICAgICAgUmV0dXJuU3RtdCByZXR1cm5TdG10ID0gZ2V0U3RhdGVtZW50SW5NZXRob2RJbkNsYXNzKHN0YXRlbWVudFBvc2l0aW9uLCBtZXRob2RQb3NpdGlvbiwgY2xhc3NQb3NpdGlvbikuYXNSZXR1cm5TdG10KCk7CisgICAgICAgIENvbmRpdGlvbmFsRXhwciBjb25kaXRpb25hbEV4cHIgPSAoQ29uZGl0aW9uYWxFeHByKSByZXR1cm5TdG10LmdldEV4cHJlc3Npb24oKS5vckVsc2UobnVsbCk7CisgICAgICAgIGFzc2VydFRoYXQoY29uZGl0aW9uYWxFeHByLmdldEVsc2VFeHByKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGlzKExhbWJkYUV4cHIuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBiZWdpbiBsaW5lIGlzICRsaW5lIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVGhlQmVnaW5MaW5lSXMoaW50IGxpbmUpIHsKKyAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHN0YXRlLmdldCgic2VsZWN0ZWROb2RlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhsaW5lLCBub2RlLmdldEJlZ2luKCkuZ2V0KCkubGluZSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBiZWdpbiBjb2x1bW4gaXMgJGNvbHVtbiIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUJlZ2luQ29sdW1uSXMoaW50IGNvbHVtbikgeworICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgc3RhdGUuZ2V0KCJzZWxlY3RlZE5vZGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbHVtbiwgbm9kZS5nZXRCZWdpbigpLmdldCgpLmNvbHVtbik7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBlbmQgbGluZSBpcyAkbGluZSIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUVuZExpbmVJcyhpbnQgbGluZSkgeworICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgc3RhdGUuZ2V0KCJzZWxlY3RlZE5vZGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpbmUsIG5vZGUuZ2V0RW5kKCkuZ2V0KCkubGluZSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBlbmQgY29sdW1uIGlzICRjb2x1bW4iKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVFbmRDb2x1bW5JcyhpbnQgY29sdW1uKSB7CisgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBzdGF0ZS5nZXQoInNlbGVjdGVkTm9kZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29sdW1uLCBub2RlLmdldEVuZCgpLmdldCgpLmNvbHVtbik7CisgICAgfQorCisgICAgQFRoZW4oIm5vIGVycm9ycyBhcmUgcmVwb3J0ZWQiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5Ob0Vycm9yc0FyZVJlcG9ydGVkKCkgeworICAgICAgICAvLyB0aGlzIGlzIHByZXNlbnQganVzdCBmb3IgcmVhZGFiaWxpdHkgaW4gdGhlIHNjZW5hcmlvIHNwZWNpZmljYXRpb24KKyAgICAgICAgLy8gaWYgdGhlIGNvZGUgaXMgbm90IHBhcnNlZCB0aGVuIGV4Y2VwdGlvbnMgYXJlIHRocm93biBiZWZvcmUgcmVhY2hpbmcgdGhpcyBzdGVwCisgICAgfQorCisgICAgQFRoZW4oInRoZSBwYWNrYWdlIG5hbWUgaXMgJHBhY2thZ2UiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVQYWNrYWdlTmFtZUlzKFN0cmluZyBleHBlY3RlZCkgeworICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSA9IChQYWNrYWdlRGVjbGFyYXRpb24pIHN0YXRlLmdldCgic2VsZWN0ZWROb2RlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbm9kZS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbm9kZS5nZXROYW1lKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSB0eXBlJ3MgZGlhbW9uZCBvcGVyYXRvciBmbGFnIHNob3VsZCBiZSAkZXhwZWN0ZWRWYWx1ZSIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZVVzZXNEaWFtb25kT3BlcmF0b3JTaG91bGRCZUJvb2xlYW5Bc1N0cmluZyhib29sZWFuIGV4cGVjdGVkVmFsdWUpIHsKKyAgICAgICAgT2JqZWN0Q3JlYXRpb25FeHByIGV4cHIgPSAoT2JqZWN0Q3JlYXRpb25FeHByKSBzdGF0ZS5nZXQoInNlbGVjdGVkTm9kZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZXhwci5nZXRUeXBlKCkuaXNVc2luZ0RpYW1vbmRPcGVyYXRvcigpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIEphdmEgcGFyc2VyIGNhbm5vdCBwYXJzZSBpdCBiZWNhdXNlIG9mIGFuIGVycm9yIikKKyAgICBwdWJsaWMgdm9pZCBqYXZhUGFyc2VyQ2Fubm90UGFyc2VCZWNhdXNlT2ZMZXhpY2FsRXJyb3JzKCkgeworICAgICAgICBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+IHJlc3VsdCA9IG5ldyBKYXZhUGFyc2VyKCkucGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoc291cmNlVW5kZXJUZXN0KSk7CisgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIkxleGljYWwgZXJyb3IgZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUaGVuKCJ0aGUgYXNzaWduRXhwciBwcm9kdWNlZCBkb2Vzbid0IGhhdmUgYSBudWxsIHRhcmdldCIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUFzc2lnbkV4cHJQcm9kdWNlZERvZXNudEhhdmVBTnVsbFRhcmdldCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUoMCkuYXNDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjdG9yID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRNZW1iZXIoMSkuYXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCk7CisgICAgICAgIEV4cHJlc3Npb25TdG10IGFzc2lnblN0bXQgPSBjdG9yLmdldEJvZHkoKS5nZXRTdGF0ZW1lbnQoMCkuYXNFeHByZXNzaW9uU3RtdCgpOworICAgICAgICBBc3NpZ25FeHByIGFzc2lnbkV4cHIgPSBhc3NpZ25TdG10LmdldEV4cHJlc3Npb24oKS5hc0Fzc2lnbkV4cHIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhc3NpZ25FeHByLmdldFRhcmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5hbWVFeHByLmNsYXNzLCBhc3NpZ25FeHByLmdldFRhcmdldCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNzaWduRXhwci5nZXRUYXJnZXQoKS5hc05hbWVFeHByKCkuZ2V0TmFtZUFzU3RyaW5nKCksICJtU3RyaW5nIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZUZyb21Db21waWxhdGlvblVuaXQoQ2xhc3M8PyBleHRlbmRzIE5vZGU+IG5vZGVUeXBlKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBMaXN0PD8gZXh0ZW5kcyBOb2RlPiBub2RlcyA9IGNvbXBpbGF0aW9uVW5pdC5maW5kQWxsKG5vZGVUeXBlKTsKKyAgICAgICAgaWYgKG5vZGVzLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihmb3JtYXQoIkV4YWN0bHkgb25lICVzIGV4cGVjdGVkIiwgbm9kZVR5cGUuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUucHV0KCJzZWxlY3RlZE5vZGUiLCBub2Rlcy5nZXQoMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc3RlcHMvUG9zaXRpb25SYW5nZVN0ZXBzLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1Bvc2l0aW9uUmFuZ2VTdGVwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2ZkODkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1Bvc2l0aW9uUmFuZ2VTdGVwcy5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnN0ZXBzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5SYW5nZTsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLkJlZm9yZVNjZW5hcmlvOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuR2l2ZW47CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5UaGVuOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuV2hlbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUG9zaXRpb24ucG9zOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUmFuZ2UucmFuZ2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFBvc2l0aW9uUmFuZ2VTdGVwcyB7CisKKyAgICBwcml2YXRlIFBvc2l0aW9uIHBvc2l0aW9uOworICAgIHByaXZhdGUgUG9zaXRpb24gc2Vjb25kUG9zaXRpb247CisgICAgcHJpdmF0ZSBSYW5nZSByYW5nZTsKKyAgICBwcml2YXRlIFJhbmdlIHNlY29uZFJhbmdlOworCisgICAgQEJlZm9yZVNjZW5hcmlvCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHBvc2l0aW9uID0gbnVsbDsKKyAgICAgICAgc2Vjb25kUG9zaXRpb24gPSBudWxsOworICAgICAgICByYW5nZSA9IG51bGw7CisgICAgICAgIHNlY29uZFJhbmdlID0gbnVsbDsKKyAgICB9CisgICAgLyoKKwkgKiBHaXZlbiBzdGVwcworICAgICAqLworCisgICAgQEdpdmVuKCJ0aGUgcG9zaXRpb24gJGxpbmUsICRjb2x1bW4iKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuVGhlUG9zaXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4pIHsKKyAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvcyhsaW5lLCBjb2x1bW4pOworICAgIH0KKworICAgIEBHaXZlbigidGhlIHJhbmdlICRsaW5lMSwgJGNvbHVtbjEgLSAkbGluZTIsICRjb2x1bW4yIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlblRoZVJhbmdlKGludCBsaW5lMSwgaW50IGNvbHVtbjEsIGludCBsaW5lMiwgaW50IGNvbHVtbjIpIHsKKyAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlKGxpbmUxLCBjb2x1bW4xLCBsaW5lMiwgY29sdW1uMik7CisgICAgfQorCisgICAgLyoKKwkgKiBXaGVuIHN0ZXBzCisgICAgICovCisKKyAgICBAV2hlbigiSSBjb21wYXJlIHRvIHBvc2l0aW9uICRsaW5lLCAkY29sdW1uIikKKyAgICBwdWJsaWMgdm9pZCBpQ29tcGFyZVRvUG9zaXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4pIHsKKyAgICAgICAgc2Vjb25kUG9zaXRpb24gPSBwb3MobGluZSwgY29sdW1uKTsKKyAgICB9CisKKyAgICBAV2hlbigiSSBjb21wYXJlIHRvIHJhbmdlICRsaW5lMSwgJGNvbHVtbjEgLSAkbGluZTIsICRjb2x1bW4yIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuSUNvbXBhcmVUb1JhbmdlKGludCBsaW5lMSwgaW50IGNvbHVtbjEsIGludCBsaW5lMiwgaW50IGNvbHVtbjIpIHsKKyAgICAgICAgdGhpcy5zZWNvbmRSYW5nZSA9IHJhbmdlKGxpbmUxLCBjb2x1bW4xLCBsaW5lMiwgY29sdW1uMik7CisgICAgfQorCisgICAgLyoKKwkgKiBUaGVuIHN0ZXBzCisgICAgICovCisKKyAgICBAVGhlbigidGhlIHBvc2l0aW9ucyBhcmUgZXF1YWwiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVQb3NpdGlvbnNBcmVFcXVhbCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwb3NpdGlvbi5lcXVhbHMoc2Vjb25kUG9zaXRpb24pKTsKKyAgICB9CisKKyAgICBAVGhlbigiaXQgaXMgYWZ0ZXIgdGhlIHtmaXJzdHx9IHBvc2l0aW9uIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuSXRJc0FmdGVyVGhlRmlyc3RQb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKHNlY29uZFBvc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc2Vjb25kUG9zaXRpb24uaXNBZnRlcihwb3NpdGlvbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRSYW5nZS5pc0FmdGVyKHBvc2l0aW9uKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGhlbigiaXQgaXMgYmVmb3JlIHRoZSB7Zmlyc3R8fSBwb3NpdGlvbiIpCisgICAgcHVibGljIHZvaWQgdGhlbkl0SXNCZWZvcmVUaGVGaXJzdFBvc2l0aW9uKCkgeworICAgICAgICBpZiAoc2Vjb25kUG9zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRQb3NpdGlvbi5pc0JlZm9yZShwb3NpdGlvbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRSYW5nZS5pc0JlZm9yZShwb3NpdGlvbikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRoZW4oInRoZSBwb3NpdGlvbnMgYXJlIG5vdCBlcXVhbCIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZVBvc2l0aW9uc0FyZU5vdEVxdWFsKCkgeworICAgICAgICBhc3NlcnRGYWxzZShwb3NpdGlvbi5lcXVhbHMoc2Vjb25kUG9zaXRpb24pKTsKKyAgICB9CisKKyAgICBAVGhlbigiaXQgaXMgbm90IGFmdGVyIHRoZSB7Zmlyc3R8fSBwb3NpdGlvbiIpCisgICAgcHVibGljIHZvaWQgdGhlbkl0SXNOb3RBZnRlclRoZUZpcnN0UG9zaXRpb24oKSB7CisgICAgICAgIGFzc2VydEZhbHNlKHNlY29uZFBvc2l0aW9uLmlzQWZ0ZXIocG9zaXRpb24pKTsKKyAgICB9CisKKyAgICBAVGhlbigiaXQgaXMgbm90IGJlZm9yZSB0aGUge2ZpcnN0fH0gcG9zaXRpb24iKQorICAgIHB1YmxpYyB2b2lkIHRoZW5JdElzTm90QmVmb3JlVGhlRmlyc3RQb3NpdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2Vjb25kUG9zaXRpb24uaXNCZWZvcmUocG9zaXRpb24pKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIHJhbmdlcyBhcmUgZXF1YWwiKQorICAgIHB1YmxpYyB2b2lkIHRoZVJhbmdlc0FyZUVxdWFsKCkgeworICAgICAgICBhc3NlcnRUcnVlKHJhbmdlLmVxdWFscyhzZWNvbmRSYW5nZSkpOworICAgIH0KKworICAgIEBUaGVuKCJpdCBpcyBjb250YWluZWQgaW4gdGhlIGZpcnN0IHJhbmdlIikKKyAgICBwdWJsaWMgdm9pZCBpdElzQ29udGFpbmVkSW5UaGVGaXJzdFJhbmdlKCkgeworICAgICAgICBhc3NlcnRUcnVlKHJhbmdlLmNvbnRhaW5zKHNlY29uZFJhbmdlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9QcmV0dHlQcmludGluZ1N0ZXBzLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1ByZXR0eVByaW50aW5nU3RlcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNkODAyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9QcmV0dHlQcmludGluZ1N0ZXBzLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5Nb2RpZmllclZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5HaXZlbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLlRoZW47CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5XaGVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLnJlYWRlclRvU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFByZXR0eVByaW50aW5nU3RlcHMgeworCisgICAgcHJpdmF0ZSBOb2RlIHJlc3VsdE5vZGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlVW5kZXJUZXN0OworCisgICAgQEdpdmVuKCJ0aGUge2NsYXNzfGNvbXBpbGF0aW9uIHVuaXR8ZXhwcmVzc2lvbnxibG9ja3xzdGF0ZW1lbnR8aW1wb3J0fGFubm90YXRpb258Ym9keXxjbGFzcyBib2R5fGludGVyZmFjZSBib2R5fTokY2xhc3NTcmMiKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuVGhlQ2xhc3MoU3RyaW5nIGNsYXNzU3JjKSB7CisgICAgICAgIHRoaXMuc291cmNlVW5kZXJUZXN0ID0gY2xhc3NTcmMudHJpbSgpOworICAgIH0KKworICAgIEBHaXZlbigidGhlIHtjbGFzc3xjb21waWxhdGlvbiB1bml0fGV4cHJlc3Npb258YmxvY2t8c3RhdGVtZW50fGltcG9ydHxhbm5vdGF0aW9ufGJvZHl8Y2xhc3MgYm9keXxpbnRlcmZhY2UgYm9keX0gaW4gdGhlIGZpbGUgXCIkY2xhc3NGaWxlXCIiKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuVGhlQ2xhc3NJblRoZUZpbGUoU3RyaW5nIGNsYXNzRmlsZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi4uL3NhbXBsZXMvIiArIGNsYXNzRmlsZSk7CisgICAgICAgIHNvdXJjZVVuZGVyVGVzdCA9IHJlYWRlclRvU3RyaW5nKG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKHVybC50b1VSSSgpKSkpLnRyaW0oKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIHtjbGFzc3xjb21waWxhdGlvbiB1bml0fSBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlQ2xhc3NJc1BhcnNlZEJ5VGhlSmF2YVBhcnNlcigpIHsKKyAgICAgICAgcmVzdWx0Tm9kZSA9IHBhcnNlKHNvdXJjZVVuZGVyVGVzdCk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBleHByZXNzaW9uIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVFeHByZXNzaW9uSXNQYXJzZWRCeVRoZUphdmFQYXJzZXIoKSB7CisgICAgICAgIHJlc3VsdE5vZGUgPSBwYXJzZUV4cHJlc3Npb24oc291cmNlVW5kZXJUZXN0KTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIGJsb2NrIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVCbG9ja0lzUGFyc2VkQnlUaGVKYXZhUGFyc2VyKCkgeworICAgICAgICByZXN1bHROb2RlID0gcGFyc2VCbG9jayhzb3VyY2VVbmRlclRlc3QpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgc3RhdGVtZW50IGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVTdGF0ZW1lbnRJc1BhcnNlZEJ5VGhlSmF2YVBhcnNlcigpIHsKKyAgICAgICAgcmVzdWx0Tm9kZSA9IHBhcnNlU3RhdGVtZW50KHNvdXJjZVVuZGVyVGVzdCk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBpbXBvcnQgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlciIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZUltcG9ydElzUGFyc2VkQnlUaGVKYXZhUGFyc2VyKCkgeworICAgICAgICByZXN1bHROb2RlID0gcGFyc2VJbXBvcnQoc291cmNlVW5kZXJUZXN0KTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIGFubm90YXRpb24gaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlciIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZUFubm90YXRpb25Jc1BhcnNlZEJ5VGhlSmF2YVBhcnNlcigpIHsKKyAgICAgICAgcmVzdWx0Tm9kZSA9IHBhcnNlQW5ub3RhdGlvbihzb3VyY2VVbmRlclRlc3QpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgYW5ub3RhdGlvbiBib2R5IGRlY2xhcmF0aW9uIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVCb2R5RGVjbGFyYXRpb25Jc1BhcnNlZEJ5VGhlSmF2YVBhcnNlcigpIHsKKyAgICAgICAgcmVzdWx0Tm9kZSA9IHBhcnNlQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvbihzb3VyY2VVbmRlclRlc3QpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgY2xhc3MgYm9keSBkZWNsYXJhdGlvbiBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlQ2xhc3NCb2R5RGVjbGFyYXRpb25Jc1BhcnNlZEJ5VGhlSmF2YVBhcnNlcigpIHsKKyAgICAgICAgcmVzdWx0Tm9kZSA9IHBhcnNlQm9keURlY2xhcmF0aW9uKHNvdXJjZVVuZGVyVGVzdCk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBpbnRlcmZhY2UgYm9keSBkZWNsYXJhdGlvbiBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlSW50ZXJmYWNlQm9keURlY2xhcmF0aW9uSXNQYXJzZWRCeVRoZUphdmFQYXJzZXIoKSB7CisgICAgICAgIHJlc3VsdE5vZGUgPSBwYXJzZUJvZHlEZWNsYXJhdGlvbihzb3VyY2VVbmRlclRlc3QpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgY2xhc3MgaXMgdmlzaXRlZCBieSBhbiBlbXB0eSBNb2RpZmllclZpc2l0b3JBZGFwdGVyIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlQ2xhc3NJc1Zpc2l0ZWRCeUFuRW1wdHlNb2RpZmllclZpc2l0b3JBZGFwdGVyKCkgeworICAgICAgICAobmV3IE1vZGlmaWVyVmlzaXRvcjxWb2lkPigpIHsKKyAgICAgICAgfSkudmlzaXQoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0Tm9kZSwgbnVsbCk7CisgICAgfQorCisgICAgQFRoZW4oIml0IGlzIHByaW50ZWQgYXM6JHNyYyIpCisgICAgcHVibGljIHZvaWQgaXNQcmludGVkQXMoU3RyaW5nIHNyYykgeworICAgICAgICBhc3NlcnRFcXVhbHMoc3JjLnRyaW0oKSwgcmVzdWx0Tm9kZS50b1N0cmluZygpLnRyaW0oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9TaGFyZWRTdGVwcy5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zdGVwcy9TaGFyZWRTdGVwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjdjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1NoYXJlZFN0ZXBzLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQuc3RlcHM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQm9keURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5HaXZlbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLlRoZW47CitpbXBvcnQgb3JnLmpiZWhhdmUuY29yZS5hbm5vdGF0aW9ucy5XaGVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jc0VxdWFsLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzTm90Lm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LnRleHQuSXNFcXVhbElnbm9yaW5nV2hpdGVTcGFjZS5lcXVhbFRvSWdub3JpbmdXaGl0ZVNwYWNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBTaGFyZWRTdGVwcyB7CisKKyAgICAvKiBNYXAgdGhhdCBtYWludGFpbnMgc2hhcmVzIHN0YXRlIGFjcm9zcyBzdGVwIGNsYXNzZXMuICBJZiBtYW5pcHVsYXRpbmcgdGhlIG9iamVjdHMgaW4gdGhlIG1hcCB5b3UgbXVzdCB1cGRhdGUgdGhlIHN0YXRlICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHN0YXRlOworCisgICAgcHVibGljIFNoYXJlZFN0ZXBzKE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdGUpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgIH0KKworICAgIC8qCisgICAgICogR2l2ZW4gc3RlcHMKKyAgICAgKi8KKworICAgIEBHaXZlbigiYSBDb21waWxhdGlvblVuaXQiKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuQUNvbXBpbGF0aW9uVW5pdCgpIHsKKyAgICAgICAgc3RhdGUucHV0KCJjdTEiLCBuZXcgQ29tcGlsYXRpb25Vbml0KCkpOworICAgIH0KKworICAgIEBHaXZlbigiYSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0IikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFTZWNvbmRDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIHN0YXRlLnB1dCgiY3UyIiwgbmV3IENvbXBpbGF0aW9uVW5pdCgpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFdoZW4gc3RlcHMKKyAgICAgKi8KKworICAgIEBXaGVuKCJ0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6JGNsYXNzU3JjIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlRm9sbG93aW5nU291cmNlSXNQYXJzZWQoU3RyaW5nIGNsYXNzU3JjKSB7CisgICAgICAgIHN0YXRlLnB1dCgiY3UxIiwgSmF2YVBhcnNlci5wYXJzZShjbGFzc1NyYy50cmltKCkpKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkICh0cmltbWluZyBzcGFjZSk6JGNsYXNzU3JjIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlRm9sbG93aW5nU291cmNlSXNQYXJzZWRUcmltbWluZ1NwYWNlKFN0cmluZyBjbGFzc1NyYykgeworICAgICAgICBzdGF0ZS5wdXQoImN1MSIsIEphdmFQYXJzZXIucGFyc2UoY2xhc3NTcmMudHJpbSgpKSk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBmb2xsb3dpbmcgc291cmNlcyBpcyBwYXJzZWQgYnkgdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQ6JGNsYXNzU3JjIikKKyAgICBwdWJsaWMgdm9pZCB3aGVuVGhlRm9sbG93aW5nU291cmNlc0lzUGFyc2VkQnl0VGhlU2Vjb25kQ29tcGlsYXRpb25Vbml0KFN0cmluZyBjbGFzc1NyYykgeworICAgICAgICBzdGF0ZS5wdXQoImN1MiIsIEphdmFQYXJzZXIucGFyc2UoY2xhc3NTcmMudHJpbSgpKSk7CisgICAgfQorCisgICAgQFdoZW4oImZpbGUgXCIkZmlsZU5hbWVcIiBpcyBwYXJzZWQiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVKYXZhRmlsZUlzUGFyc2VkKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiLi4vc2FtcGxlcy8iICsgZmlsZU5hbWUpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZSh1cmwudG9VUkkoKSkpOworICAgICAgICBzdGF0ZS5wdXQoImN1MSIsIGNvbXBpbGF0aW9uVW5pdCk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBDb21waWxhdGlvblVuaXQgaXMgZXF1YWwgdG8gdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVDb21waWxhdGlvblVuaXRJc0VxdWFsVG9UaGVTZWNvbmRDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0MiA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UyIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvblVuaXQsIGlzKGVxdWFsVG8oY29tcGlsYXRpb25Vbml0MikpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIENvbXBpbGF0aW9uVW5pdCBoYXMgdGhlIHNhbWUgaGFzaGNvZGUgdG8gdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVDb21waWxhdGlvblVuaXRIYXNUaGVTYW1lSGFzaGNvZGVUb1RoZVNlY29uZENvbXBpbGF0aW9uVW5pdCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQyID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTIiKTsKKworICAgICAgICBhc3NlcnRUaGF0KGNvbXBpbGF0aW9uVW5pdC5oYXNoQ29kZSgpLCBpcyhlcXVhbFRvKGNvbXBpbGF0aW9uVW5pdDIuaGFzaENvZGUoKSkpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIENvbXBpbGF0aW9uVW5pdCBpcyBub3QgZXF1YWwgdG8gdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVDb21waWxhdGlvblVuaXRJc05vdEVxdWFsVG9UaGVTZWNvbmRDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0MiA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UyIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvblVuaXQsIG5vdChlcXVhbFRvKGNvbXBpbGF0aW9uVW5pdDIpKSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSBDb21waWxhdGlvblVuaXQgaGFzIGEgZGlmZmVyZW50IGhhc2hjb2RlIHRvIHRoZSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0IikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVGhlQ29tcGlsYXRpb25Vbml0SGFzQURpZmZlcmVudEhhc2hjb2RlVG9UaGVTZWNvbmRDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0MiA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UyIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjb21waWxhdGlvblVuaXQuaGFzaENvZGUoKSwgbm90KGVxdWFsVG8oY29tcGlsYXRpb25Vbml0Mi5oYXNoQ29kZSgpKSkpOworICAgIH0KKworICAgIEBUaGVuKCJ0aGUgZXhwZWN0ZWQgc291cmNlIHNob3VsZCBiZTokY2xhc3NTcmMiKQorICAgIHB1YmxpYyB2b2lkIHRoZW5UaGVFeHBlY3RlZFNvdXJjZXNTaG91bGRCZShTdHJpbmcgY2xhc3NTcmMpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIGFzc2VydFRoYXQoY29tcGlsYXRpb25Vbml0LnRvU3RyaW5nKCksIENvcmVNYXRjaGVycy5pcyhlcXVhbFRvSWdub3JpbmdXaGl0ZVNwYWNlKGNsYXNzU3JjKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBCb2R5RGVjbGFyYXRpb248Pz4+IFQgZ2V0TWVtYmVyQnlUeXBlQW5kUG9zaXRpb24oVHlwZURlY2xhcmF0aW9uPD8+IHR5cGVEZWNsYXJhdGlvbiwgaW50IHBvc2l0aW9uLCBDbGFzczxUPiB0eXBlQ2xhc3MpIHsKKyAgICAgICAgaW50IHR5cGVDb3VudCA9IDA7CisgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uPD8+IGRlY2xhcmF0aW9uIDogdHlwZURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmdldENsYXNzKCkuZXF1YWxzKHR5cGVDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUNvdW50ID09IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVCkgZGVjbGFyYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHR5cGVDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIG1lbWJlciAiICsgdHlwZUNsYXNzICsgIiBhdCBwb3NpdGlvbjogIiArIHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlY2xhcmF0aW9uIGdldE1ldGhvZEJ5UG9zaXRpb25BbmRDbGFzc1Bvc2l0aW9uKENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kUG9zaXRpb24sIGludCBjbGFzc1Bvc2l0aW9uKSB7CisgICAgICAgIFR5cGVEZWNsYXJhdGlvbjw/PiB0eXBlID0gY29tcGlsYXRpb25Vbml0LmdldFR5cGUoY2xhc3NQb3NpdGlvbiAtIDEpOworCisgICAgICAgIGludCBtZW1iZXJDb3VudCA9IDA7CisgICAgICAgIGludCBtZXRob2RDb3VudCA9IDA7CisgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uPD8+IGJvZHlEZWNsYXJhdGlvbiA6IHR5cGUuZ2V0TWVtYmVycygpKSB7CisgICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kQ291bnQgPT0gbWV0aG9kUG9zaXRpb24gLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTWV0aG9kRGVjbGFyYXRpb24pIHR5cGUuZ2V0TWVtYmVyKG1lbWJlckNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0aG9kQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWJlckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWV0aG9kIG5vdCBmb3VuZCBhdCBwb3NpdGlvbiAiICsgbWV0aG9kUG9zaXRpb24gKyAiaW4gY2xhc3MgIiArIGNsYXNzUG9zaXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc3RlcHMvVmlzaXRvclN0ZXBzLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1Zpc2l0b3JTdGVwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMjBlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3N0ZXBzL1Zpc2l0b3JTdGVwcy5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnN0ZXBzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5DbG9uZVZpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLkdlbmVyaWNWaXNpdG9yQWRhcHRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQudmlzaXRvcnMuUG9zaXRpb25UZXN0VmlzaXRvcjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLkdpdmVuOworaW1wb3J0IG9yZy5qYmVoYXZlLmNvcmUuYW5ub3RhdGlvbnMuVGhlbjsKK2ltcG9ydCBvcmcuamJlaGF2ZS5jb3JlLmFubm90YXRpb25zLldoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBWaXNpdG9yU3RlcHMgeworCisgICAgLyogRmllbGRzIHVzZWQgdG8gbWFpbnRhaW4gc3RlcCBzdGF0ZSB3aXRoaW4gdGhpcyBzdGVwIGNsYXNzICovCisgICAgcHJpdmF0ZSBWb2lkVmlzaXRvckFkYXB0ZXI8QXRvbWljUmVmZXJlbmNlPFN0cmluZz4+IHRvVXBwZXJDYXNlVmFyaWFibGVOYW1lVmlzaXRvcjsKKyAgICBwcml2YXRlIFZvaWRWaXNpdG9yQWRhcHRlcjxBdG9taWNSZWZlcmVuY2U8U3RyaW5nPj4gY29sbGVjdFZhcmlhYmxlTmFtZVZpc2l0b3I7CisgICAgcHJpdmF0ZSBQb3NpdGlvblRlc3RWaXNpdG9yIHBvc2l0aW9uVGVzdFZpc2l0b3I7CisgICAgcHJpdmF0ZSBHZW5lcmljVmlzaXRvckFkYXB0ZXI8U3RyaW5nLCBWb2lkPiBuYW1lUmV0dXJuaW5nVmlzaXRvcjsKKyAgICBwcml2YXRlIEdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXI8U3RyaW5nLCBWb2lkPiBhbGxOYW1lUmV0dXJuaW5nVmlzaXRvcjsKKyAgICBwcml2YXRlIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IGNvbGxlY3RlZFZhcmlhYmxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyByZXR1cm5lZFZhcmlhYmxlTmFtZTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiByZXR1cm5lZFZhcmlhYmxlTmFtZXM7CisKKyAgICAvKiBNYXAgdGhhdCBtYWludGFpbnMgc2hhcmVzIHN0YXRlIGFjcm9zcyBzdGVwIGNsYXNzZXMuICBJZiBtYW5pcHVsYXRpbmcgdGhlIG9iamVjdHMgaW4gdGhlIG1hcCB5b3UgbXVzdCB1cGRhdGUgdGhlIHN0YXRlICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHN0YXRlOworCisgICAgcHVibGljIFZpc2l0b3JTdGVwcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHN0YXRlKSB7CisgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICB9CisKKyAgICBAR2l2ZW4oImEgVm9pZFZpc2l0b3JBZGFwdGVyIHdpdGggYSB2aXNpdCBtZXRob2QgdGhhdCBjaGFuZ2VzIHZhcmlhYmxlIG5hbWVzIHRvIHVwcGVyY2FzZSIpCisgICAgcHVibGljIHZvaWQgZ2l2ZW5BVm9pZFZpc2l0b3JBZGFwdGVyV2l0aEFWaXNpdE1ldGhvZFRoYXRDaGFuZ2VzVmFyaWFibGVOYW1lc1RvVXBwZXJjYXNlKCkgeworICAgICAgICB0b1VwcGVyQ2FzZVZhcmlhYmxlTmFtZVZpc2l0b3IgPSBuZXcgVm9pZFZpc2l0b3JBZGFwdGVyPEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9yIG4sIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IGFyZykgeworICAgICAgICAgICAgICAgIG4uc2V0TmFtZShuLmdldE5hbWVBc1N0cmluZygpLnRvVXBwZXJDYXNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBHaXZlbigiYSBWb2lkVmlzaXRvckFkYXB0ZXIgd2l0aCBhIHZpc2l0IG1ldGhvZCBhbmQgY29sbGVjdHMgdGhlIHZhcmlhYmxlIG5hbWVzIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFWb2lkVmlzaXRvckFkYXB0ZXJXaXRoQVZpc2l0TWV0aG9kVGhhdENvbGxlY3RzVGhlVmFyaWFibGVOYW1lKCkgeworICAgICAgICBjb2xsZWN0VmFyaWFibGVOYW1lVmlzaXRvciA9IG5ldyBWb2lkVmlzaXRvckFkYXB0ZXI8QXRvbWljUmVmZXJlbmNlPFN0cmluZz4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3IgbiwgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gYXJnKSB7CisgICAgICAgICAgICAgICAgYXJnLnNldChhcmcuZ2V0KCkgKyBuLmdldE5hbWUoKSArICI7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoUGFyYW1ldGVyIG4sIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IGFyZykgeworICAgICAgICAgICAgICAgIGFyZy5zZXQoYXJnLmdldCgpICsgbi5nZXROYW1lKCkgKyAiOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBHaXZlbigiYSBHZW5lcmljVmlzaXRvckFkYXB0ZXIgd2l0aCBhIHZpc2l0IG1ldGhvZCB0aGF0IHJldHVybnMgdmFyaWFibGUgbmFtZXMiKQorICAgIHB1YmxpYyB2b2lkIGdpdmVuQUdlbmVyaWNWaXNpdG9yQWRhcHRlcldpdGhBVmlzaXRNZXRob2RUaGF0UmV0dXJuc1ZhcmlhYmxlTmFtZXMoKSB7CisgICAgICAgIG5hbWVSZXR1cm5pbmdWaXNpdG9yID0gbmV3IEdlbmVyaWNWaXNpdG9yQWRhcHRlcjxTdHJpbmcsIFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRvciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgICAgIHJldHVybiBuLmdldE5hbWVBc1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBHaXZlbigiYSBHZW5lcmljTGlzdFZpc2l0b3JBZGFwdGVyIHdpdGggYSB2aXNpdCBtZXRob2QgdGhhdCByZXR1cm5zIGFsbCB2YXJpYWJsZSBuYW1lcyIpCisgICAgcHVibGljIHZvaWQgZ2l2ZW5BR2VuZXJpY0xpc3RWaXNpdG9yQWRhcHRlcldpdGhBVmlzaXRNZXRob2RUaGF0UmV0dXJuc0FsbFZhcmlhYmxlTmFtZXMoKSB7CisgICAgICAgIGFsbE5hbWVSZXR1cm5pbmdWaXNpdG9yID0gbmV3IEdlbmVyaWNMaXN0VmlzaXRvckFkYXB0ZXI8U3RyaW5nLCBWb2lkPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiB2aXNpdChWYXJpYWJsZURlY2xhcmF0b3IgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAR2l2ZW4oImEgVm9pZFZpc2l0b3JBZGFwdGVyIHdpdGggYSB2aXNpdCBtZXRob2QgdGhhdCBhc3NlcnRzIHNlbnNpYmxlIGxpbmUgcG9zaXRpb25zIikKKyAgICBwdWJsaWMgdm9pZCBnaXZlbkFWb2lkVmlzaXRvckFkYXB0ZXJXaXRoQVZpc2l0TWV0aG9kVGhhdEFzc2VydHNTZW5zaWJsZUxpbmVQb3NpdGlvbnMoKSB7CisgICAgICAgIHBvc2l0aW9uVGVzdFZpc2l0b3IgPSBuZXcgUG9zaXRpb25UZXN0VmlzaXRvcigpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgQ29tcGlsYXRpb25Vbml0IGlzIGNsb25lZCB0byB0aGUgc2Vjb25kIENvbXBpbGF0aW9uVW5pdCIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZVNlY29uZENvbXBpbGF0aW9uVW5pdElzQ2xvbmVkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgc3RhdGUuZ2V0KCJjdTEiKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDIgPSAoQ29tcGlsYXRpb25Vbml0KSBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBDbG9uZVZpc2l0b3IoKSwgbnVsbCk7CisgICAgICAgIHN0YXRlLnB1dCgiY3UyIiwgY29tcGlsYXRpb25Vbml0Mik7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBDb21waWxhdGlvblVuaXQgaXMgdmlzaXRlZCBieSB0aGUgdG8gdXBwZXJjYXNlIHZpc2l0b3IiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVDb21waWxhdGlvblVuaXRJc1Zpc2l0ZWRCeVRoZVZpc3RvcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIHRvVXBwZXJDYXNlVmFyaWFibGVOYW1lVmlzaXRvci52aXNpdChjb21waWxhdGlvblVuaXQsIG51bGwpOworICAgICAgICBzdGF0ZS5wdXQoImN1MSIsIGNvbXBpbGF0aW9uVW5pdCk7CisgICAgfQorCisgICAgQFdoZW4oInRoZSBDb21waWxhdGlvblVuaXQgaXMgdmlzaXRlZCBieSB0aGUgdmFyaWFibGUgbmFtZSBjb2xsZWN0b3IgdmlzaXRvciIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZUNvbXBpbGF0aW9uVW5pdElzVmlzaXRlZEJ5VGhlVmFyaWFibGVOYW1lQ29sbGVjdG9yVmlzaXRvcigpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIGNvbGxlY3RlZFZhcmlhYmxlTmFtZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigiIik7CisgICAgICAgIGNvbGxlY3RWYXJpYWJsZU5hbWVWaXNpdG9yLnZpc2l0KGNvbXBpbGF0aW9uVW5pdCwgY29sbGVjdGVkVmFyaWFibGVOYW1lKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIENvbXBpbGF0aW9uVW5pdCBpcyB2aXNpdGVkIGJ5IHRoZSB2aXNpdG9yIHRoYXQgcmV0dXJucyB2YXJpYWJsZSBuYW1lcyIpCisgICAgcHVibGljIHZvaWQgd2hlblRoZUNvbXBpbGF0aW9uVW5pdElzVmlzaXRlZEJ5VGhlVmlzaXRvclRoYXRSZXR1cm5zVmFyaWFibGVOYW1lcygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHN0YXRlLmdldCgiY3UxIik7CisgICAgICAgIHJldHVybmVkVmFyaWFibGVOYW1lID0gbmFtZVJldHVybmluZ1Zpc2l0b3IudmlzaXQoY29tcGlsYXRpb25Vbml0LCBudWxsKTsKKyAgICB9CisKKyAgICBAV2hlbigidGhlIENvbXBpbGF0aW9uVW5pdCBpcyB2aXNpdGVkIGJ5IHRoZSB2aXNpdG9yIHRoYXQgcmV0dXJucyBhbGwgdmFyaWFibGUgbmFtZXMiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVDb21waWxhdGlvblVuaXRJc1Zpc2l0ZWRCeVRoZVZpc2l0b3JUaGF0UmV0dXJuc0FsbFZhcmlhYmxlTmFtZXMoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICByZXR1cm5lZFZhcmlhYmxlTmFtZXMgPSBhbGxOYW1lUmV0dXJuaW5nVmlzaXRvci52aXNpdChjb21waWxhdGlvblVuaXQsIG51bGwpOworICAgIH0KKworICAgIEBXaGVuKCJ0aGUgQ29tcGlsYXRpb25Vbml0IGlzIHZpc2l0ZWQgYnkgdGhlIFBvc2l0aW9uVGVzdFZpc2l0b3IiKQorICAgIHB1YmxpYyB2b2lkIHdoZW5UaGVDb21waWxhdGlvblVuaXRJc1Zpc2l0ZWRCeVRoZVBvc2l0aW9uVGVzdFZpc2l0b3IoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBzdGF0ZS5nZXQoImN1MSIpOworICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KHBvc2l0aW9uVGVzdFZpc2l0b3IsIG51bGwpOworICAgIH0KKworICAgIEBUaGVuKCJ0aGUgY29sbGVjdGVkIHZhcmlhYmxlIG5hbWUgaXMgXCIkbmFtZVVuZGVyVGVzdFwiIikKKyAgICBwdWJsaWMgdm9pZCB0aGVuVGhlQ29sbGVjdGVkVmFyaWFibGVOYW1lSXMoU3RyaW5nIG5hbWVVbmRlclRlc3QpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChjb2xsZWN0ZWRWYXJpYWJsZU5hbWUuZ2V0KCksIGlzKG5hbWVVbmRlclRlc3QpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIHJldHVybiB2YXJpYWJsZSBuYW1lIGlzIFwiJG5hbWVVbmRlclRlc3RcIiIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZVJldHVyblZhcmlhYmxlTmFtZUlzKFN0cmluZyBuYW1lVW5kZXJUZXN0KSB7CisgICAgICAgIGFzc2VydFRoYXQocmV0dXJuZWRWYXJpYWJsZU5hbWUsIGlzKG5hbWVVbmRlclRlc3QpKTsKKyAgICB9CisKKyAgICBAVGhlbigidGhlIGZpcnN0IHJldHVybiB2YXJpYWJsZSBuYW1lIGlzIFwiJG5hbWVVbmRlclRlc3RcIiIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZUZpcnN0UmV0dXJuVmFyaWFibGVOYW1lSXMoU3RyaW5nIG5hbWVVbmRlclRlc3QpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5lZFZhcmlhYmxlTmFtZXMuZ2V0KDApLCBpcyhuYW1lVW5kZXJUZXN0KSk7CisgICAgfQorCisgICAgQFRoZW4oInRoZSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgdmlzaXRlZCBpcyAkZXhwZWN0ZWRDb3VudCIpCisgICAgcHVibGljIHZvaWQgdGhlblRoZVRvdGFsTnVtYmVyT2ZOb2Rlc1Zpc2l0ZWRJcyhpbnQgZXhwZWN0ZWRDb3VudCkgeworICAgICAgICBhc3NlcnRUaGF0KHBvc2l0aW9uVGVzdFZpc2l0b3IuZ2V0TnVtYmVyT2ZOb2Rlc1Zpc2l0ZWQoKSwgaXMoZXhwZWN0ZWRDb3VudCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvdmlzaXRvcnMvUG9zaXRpb25UZXN0VmlzaXRvci5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC92aXNpdG9ycy9Qb3NpdGlvblRlc3RWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhMzMxZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvdmlzaXRvcnMvUG9zaXRpb25UZXN0VmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYmRkLnZpc2l0b3JzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBvc2l0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbk9yRXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CisKK3B1YmxpYyBjbGFzcyBQb3NpdGlvblRlc3RWaXNpdG9yIGV4dGVuZHMgVm9pZFZpc2l0b3JBZGFwdGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZOb2Rlc1Zpc2l0ZWQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIGRvVGVzdChuLmdldE5hbWUoKSk7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NlcnRTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFzc2lnbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmluYXJ5RXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja0NvbW1lbnQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmxvY2tTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCcmVha1N0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2FzdEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVFeHByIG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBkb1Rlc3Qobi5nZXROYW1lKCkpOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbXBpbGF0aW9uVW5pdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb25kaXRpb25hbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5U3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbmNsb3NlZEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW51bURlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBkb1Rlc3Qobi5nZXROYW1lKCkpOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFeHByZXNzaW9uU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRmllbGREZWNsYXJhdGlvbiBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluc3RhbmNlT2ZFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEludGVnZXJMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBKYXZhZG9jQ29tbWVudCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMYWJlbGVkU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBkb1Rlc3Qobi5nZXROYW1lKCkpOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoU2ltcGxlTmFtZSBuLCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChBcnJheVR5cGUgbiwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoQXJyYXlDcmVhdGlvbkxldmVsIG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoVW5pb25UeXBlIG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFJldHVyblN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3VwZXJFeHByIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTd2l0Y2hTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhyb3dTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTG9jYWxDbGFzc0RlY2xhcmF0aW9uU3RtdCBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUeXBlUGFyYW1ldGVyIG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVm9pZFR5cGUgbiwgZmluYWwgT2JqZWN0IGFyZykgeworICAgICAgICBkb1Rlc3Qobik7CisgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgV2hpbGVTdG10IG4sIGZpbmFsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgZG9UZXN0KG4pOworICAgICAgICBzdXBlci52aXNpdChuLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFdpbGRjYXJkVHlwZSBuLCBmaW5hbCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChVbmtub3duVHlwZSBuLCBPYmplY3QgYXJnKSB7CisgICAgICAgIGRvVGVzdChuKTsKKyAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0KGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICBQb3NpdGlvbiBiZWdpbiA9IG5vZGUuZ2V0UmFuZ2UoKS5nZXQoKS5iZWdpbjsKKyAgICAgICAgUG9zaXRpb24gZW5kID0gbm9kZS5nZXRSYW5nZSgpLmdldCgpLmVuZDsKKyAgICAgICAgYXNzZXJ0VGhhdChiZWdpbi5saW5lLCBpcyhncmVhdGVyVGhhbk9yRXF1YWxUbygwKSkpOworICAgICAgICBhc3NlcnRUaGF0KGJlZ2luLmNvbHVtbiwgaXMoZ3JlYXRlclRoYW5PckVxdWFsVG8oMCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbmQubGluZSwgaXMoZ3JlYXRlclRoYW5PckVxdWFsVG8oMCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbmQuY29sdW1uLCBpcyhncmVhdGVyVGhhbk9yRXF1YWxUbygwKSkpOworCisgICAgICAgIGlmIChiZWdpbi5saW5lID09IGVuZC5saW5lKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGJlZ2luLmNvbHVtbiwgaXMobGVzc1RoYW5PckVxdWFsVG8oZW5kLmNvbHVtbikpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYmVnaW4ubGluZSwgaXMobGVzc1RoYW5PckVxdWFsVG8oZW5kLmxpbmUpKSk7CisgICAgICAgIH0KKyAgICAgICAgbnVtYmVyT2ZOb2Rlc1Zpc2l0ZWQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mTm9kZXNWaXNpdGVkKCkgeworICAgICAgICByZXR1cm4gbnVtYmVyT2ZOb2Rlc1Zpc2l0ZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0NsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjUzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVpbGRlcnMvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJ1aWxkZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdCB7CisgICAgQ29tcGlsYXRpb25Vbml0IGN1OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBjdSA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgY3UgPSBudWxsOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEV4dGVuZHMoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB0ZXN0Q2xhc3MgPSBjdS5hZGRDbGFzcygidGVzdCIpOworICAgICAgICB0ZXN0Q2xhc3MuYWRkRXh0ZW5kZWRUeXBlKExpc3QuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3UuZ2V0SW1wb3J0cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wb3J0ICIgKyBMaXN0LmNsYXNzLmdldE5hbWUoKSArICI7IiArIEVPTCwKKyAgICAgICAgICAgICAgICBjdS5nZXRJbXBvcnQoMCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0Q2xhc3MuZ2V0RXh0ZW5kZWRUeXBlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMaXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgdGVzdENsYXNzLmdldEV4dGVuZGVkVHlwZXMoMCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEltcGxlbWVudHMoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB0ZXN0Q2xhc3MgPSBjdS5hZGRDbGFzcygidGVzdCIpOworICAgICAgICB0ZXN0Q2xhc3MuYWRkSW1wbGVtZW50ZWRUeXBlKEZ1bmN0aW9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1LmdldEltcG9ydHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltcG9ydCAiICsgRnVuY3Rpb24uY2xhc3MuZ2V0TmFtZSgpICsgIjsiICsgRU9MLAorICAgICAgICAgICAgICAgIGN1LmdldEltcG9ydCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3RDbGFzcy5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZ1bmN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgdGVzdENsYXNzLmdldEltcGxlbWVudGVkVHlwZXMoMCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9idWlsZGVycy9Db21waWxhdGlvblVuaXRCdWlsZGVyc1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9idWlsZGVycy9Db21waWxhdGlvblVuaXRCdWlsZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFjN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0NvbXBpbGF0aW9uVW5pdEJ1aWxkZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuYnVpbGRlcnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkFubm90YXRpb25EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtRGVjbGFyYXRpb247CisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRCdWlsZGVyc1Rlc3QgeworICAgIHByaXZhdGUgZmluYWwgQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3IENvbXBpbGF0aW9uVW5pdCgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSW1wb3J0KCkgeworICAgICAgICBjdS5hZGRJbXBvcnQoTWFwLmNsYXNzKTsKKyAgICAgICAgY3UuYWRkSW1wb3J0KE1hcC5jbGFzcyk7CisgICAgICAgIGN1LmFkZEltcG9ydChMaXN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGN1LmdldEltcG9ydHMoKS5zaXplKCkpOworICAgICAgICBjdS5hZGRJbXBvcnQoIm15SW1wb3J0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBjdS5nZXRJbXBvcnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgIiArIE1hcC5jbGFzcy5nZXROYW1lKCkgKyAiOyIgKyBFT0wsIGN1LmdldEltcG9ydCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgIiArIExpc3QuY2xhc3MuZ2V0TmFtZSgpICsgIjsiICsgRU9MLCBjdS5nZXRJbXBvcnQoMSkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wb3J0IG15SW1wb3J0OyIgKyBFT0wsIGN1LmdldEltcG9ydCgyKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBjbGFzcyB0ZXN0SW5uZXJDbGFzcyB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRJbXBvcnRBbm9ueW1vdXNDbGFzcygpIHsKKyAgICAgICAgY3UuYWRkSW1wb3J0KHRlc3RJbm5lckNsYXNzLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgIiArIHRlc3RJbm5lckNsYXNzLmNsYXNzLmdldE5hbWUoKS5yZXBsYWNlKCIkIiwgIi4iKSArICI7IiArIEVPTCwKKyAgICAgICAgICAgICAgICBjdS5nZXRJbXBvcnQoMCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRJbXBvcnRJbm5lckNsYXNzKCkgeworICAgICAgICBPYmplY3QgYW5vbnltb3VzID0gbmV3IE9iamVjdCgpIHsKKworICAgICAgICB9OworICAgICAgICBjdS5hZGRJbXBvcnQoYW5vbnltb3VzLmdldENsYXNzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENsYXNzKCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbXlDbGFzc0RlY2xhcmF0aW9uID0gY3UuYWRkQ2xhc3MoInRlc3RDbGFzcyIsIE1vZGlmaWVyLlBSSVZBVEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3UuZ2V0VHlwZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RDbGFzcyIsIGN1LmdldFR5cGUoMCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzLCBjdS5nZXRUeXBlKDApLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG15Q2xhc3NEZWNsYXJhdGlvbi5pc1ByaXZhdGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG15Q2xhc3NEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRJbnRlcmZhY2UoKSB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBteUludGVyZmFjZURlY2xhcmF0aW9uID0gY3UuYWRkSW50ZXJmYWNlKCJ0ZXN0SW50ZXJmYWNlIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjdS5nZXRUeXBlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdEludGVyZmFjZSIsIGN1LmdldFR5cGUoMCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRUcnVlKG15SW50ZXJmYWNlRGVjbGFyYXRpb24uaXNQdWJsaWMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uY2xhc3MsIGN1LmdldFR5cGUoMCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUobXlJbnRlcmZhY2VEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRFbnVtKCkgeworICAgICAgICBFbnVtRGVjbGFyYXRpb24gbXlFbnVtRGVjbGFyYXRpb24gPSBjdS5hZGRFbnVtKCJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjdS5nZXRUeXBlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGN1LmdldFR5cGUoMCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRUcnVlKG15RW51bURlY2xhcmF0aW9uLmlzUHVibGljKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRW51bURlY2xhcmF0aW9uLmNsYXNzLCBjdS5nZXRUeXBlKDApLmdldENsYXNzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIG15QW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gY3UuYWRkQW5ub3RhdGlvbkRlY2xhcmF0aW9uKCJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjdS5nZXRUeXBlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGN1LmdldFR5cGUoMCkuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRUcnVlKG15QW5ub3RhdGlvbkRlY2xhcmF0aW9uLmlzUHVibGljKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQW5ub3RhdGlvbkRlY2xhcmF0aW9uLmNsYXNzLCBjdS5nZXRUeXBlKDApLmdldENsYXNzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENsYXNzQnlOYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoY3UuYWRkQ2xhc3MoInRlc3QiKSwgY3UuZ2V0Q2xhc3NCeU5hbWUoInRlc3QiKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZXJmYWNlQnlOYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoY3UuYWRkSW50ZXJmYWNlKCJ0ZXN0IiksIGN1LmdldEludGVyZmFjZUJ5TmFtZSgidGVzdCIpLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbnVtQnlOYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoY3UuYWRkRW51bSgidGVzdCIpLCBjdS5nZXRFbnVtQnlOYW1lKCJ0ZXN0IikuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGN1LmFkZEFubm90YXRpb25EZWNsYXJhdGlvbigidGVzdCIpLCBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoInRlc3QiKS5nZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0VudW1EZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0VudW1EZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVpbGRlcnMvRW51bURlY2xhcmF0aW9uQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJ1aWxkZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEVudW1EZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRJbXBsZW1lbnRzKCkgeworICAgICAgICBFbnVtRGVjbGFyYXRpb24gdGVzdEVudW0gPSBjdS5hZGRFbnVtKCJ0ZXN0Iik7CisgICAgICAgIHRlc3RFbnVtLmFkZEltcGxlbWVudGVkVHlwZShGdW5jdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjdS5nZXRJbXBvcnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgIiArIEZ1bmN0aW9uLmNsYXNzLmdldE5hbWUoKSArICI7IiArIEVPTCwKKyAgICAgICAgICAgICAgICBjdS5nZXRJbXBvcnQoMCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0RW51bS5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZ1bmN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgdGVzdEVudW0uZ2V0SW1wbGVtZW50ZWRUeXBlcygwKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRW51bUNvbnN0YW50KCkgeworICAgICAgICBFbnVtRGVjbGFyYXRpb24gdGVzdEVudW0gPSBjdS5hZGRFbnVtKCJ0ZXN0Iik7CisgICAgICAgIHRlc3RFbnVtLmFkZEVudW1Db25zdGFudCgiTVlfRU5VTV9DT05TVEFOVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGVzdEVudW0uZ2V0RW50cmllcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTVlfRU5VTV9DT05TVEFOVCIsIHRlc3RFbnVtLmdldEVudHJ5KDApLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVpbGRlcnMvRmllbGREZWNsYXJhdGlvbkJ1aWxkZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0ZpZWxkRGVjbGFyYXRpb25CdWlsZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI0YWRkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL0ZpZWxkRGVjbGFyYXRpb25CdWlsZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJ1aWxkZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGUuaW50VHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uQnVpbGRlcnNUZXN0IHsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBjdSA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKyAgICBwcml2YXRlIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB0ZXN0Q2xhc3MgPSBjdS5hZGRDbGFzcygidGVzdENsYXNzIik7CisgICAgcHJpdmF0ZSBFbnVtRGVjbGFyYXRpb24gdGVzdEVudW0gPSBjdS5hZGRFbnVtKCJ0ZXN0RW51bSIpOworCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE9ycGhhbkZpZWxkR2V0dGVyKCkgeworICAgICAgICBuZXcgRmllbGREZWNsYXJhdGlvbigpLmNyZWF0ZUdldHRlcigpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RPcnBoYW5GaWVsZFNldHRlcigpIHsKKyAgICAgICAgbmV3IEZpZWxkRGVjbGFyYXRpb24oKS5jcmVhdGVTZXR0ZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVHZXR0ZXJJbkFDbGFzcygpIHsKKyAgICAgICAgdGVzdENsYXNzLmFkZFByaXZhdGVGaWVsZChpbnQuY2xhc3MsICJteUZpZWxkIikuY3JlYXRlR2V0dGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0ZXN0Q2xhc3MuZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgdGVzdENsYXNzLmdldE1lbWJlcigxKS5nZXRDbGFzcygpKTsKKyAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kc1dpdGhOYW1lID0gdGVzdENsYXNzLmdldE1ldGhvZHNCeU5hbWUoImdldE15RmllbGQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldGhvZHNXaXRoTmFtZS5zaXplKCkpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBnZXR0ZXIgPSBtZXRob2RzV2l0aE5hbWUuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldE15RmllbGQiLCBnZXR0ZXIuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIGdldHRlci5nZXRUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXR1cm5TdG10LmNsYXNzLCBnZXR0ZXIuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXR0ZXJJbkFDbGFzcygpIHsKKyAgICAgICAgdGVzdENsYXNzLmFkZFByaXZhdGVGaWVsZChpbnQuY2xhc3MsICJteUZpZWxkIikuY3JlYXRlU2V0dGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0ZXN0Q2xhc3MuZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgdGVzdENsYXNzLmdldE1lbWJlcigxKS5nZXRDbGFzcygpKTsKKyAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kc1dpdGhOYW1lID0gdGVzdENsYXNzLmdldE1ldGhvZHNCeU5hbWUoInNldE15RmllbGQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldGhvZHNXaXRoTmFtZS5zaXplKCkpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBtZXRob2RzV2l0aE5hbWUuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInNldE15RmllbGQiLCBzZXR0ZXIuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHNldHRlci5nZXRQYXJhbWV0ZXIoMCkuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRXhwcmVzc2lvblN0bXQuY2xhc3MsIHNldHRlci5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50KDApLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXMubXlGaWVsZCA9IG15RmllbGQ7Iiwgc2V0dGVyLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoMCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlR2V0dGVySW5FbnVtKCkgeworICAgICAgICB0ZXN0RW51bS5hZGRQcml2YXRlRmllbGQoaW50LmNsYXNzLCAibXlGaWVsZCIpLmNyZWF0ZUdldHRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdGVzdEVudW0uZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgdGVzdEVudW0uZ2V0TWVtYmVyKDEpLmdldENsYXNzKCkpOworICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzV2l0aE5hbWUgPSB0ZXN0RW51bS5nZXRNZXRob2RzQnlOYW1lKCJnZXRNeUZpZWxkIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RzV2l0aE5hbWUuc2l6ZSgpKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gZ2V0dGVyID0gbWV0aG9kc1dpdGhOYW1lLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRNeUZpZWxkIiwgZ2V0dGVyLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBnZXR0ZXIuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmV0dXJuU3RtdC5jbGFzcywgZ2V0dGVyLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoMCkuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2V0dGVySW5FbnVtKCkgeworICAgICAgICB0ZXN0RW51bS5hZGRQcml2YXRlRmllbGQoaW50LmNsYXNzLCAibXlGaWVsZCIpLmNyZWF0ZVNldHRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdGVzdEVudW0uZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZXRob2REZWNsYXJhdGlvbi5jbGFzcywgdGVzdEVudW0uZ2V0TWVtYmVyKDEpLmdldENsYXNzKCkpOworICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzV2l0aE5hbWUgPSB0ZXN0RW51bS5nZXRNZXRob2RzQnlOYW1lKCJzZXRNeUZpZWxkIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtZXRob2RzV2l0aE5hbWUuc2l6ZSgpKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gc2V0dGVyID0gbWV0aG9kc1dpdGhOYW1lLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZXRNeUZpZWxkIiwgc2V0dGVyLmdldE5hbWVBc1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBzZXR0ZXIuZ2V0UGFyYW1ldGVyKDApLmdldFR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEV4cHJlc3Npb25TdG10LmNsYXNzLCBzZXR0ZXIuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzLm15RmllbGQgPSBteUZpZWxkOyIsIHNldHRlci5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50KDApLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVHZXR0ZXJXaXRoQU5vblZhbGlkRmllbGQoKSB7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gbXlQcml2YXRlRmllbGQgPSB0ZXN0Q2xhc3MuYWRkUHJpdmF0ZUZpZWxkKGludC5jbGFzcywgIm15RmllbGQiKTsKKyAgICAgICAgbXlQcml2YXRlRmllbGQuZ2V0VmFyaWFibGVzKCkuYWRkKG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoaW50VHlwZSgpLCAic2Vjb25kRmllbGQiKSk7CisgICAgICAgIG15UHJpdmF0ZUZpZWxkLmNyZWF0ZUdldHRlcigpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXR0ZXJXaXRoQU5vblZhbGlkRmllbGQoKSB7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gbXlQcml2YXRlRmllbGQgPSB0ZXN0Q2xhc3MuYWRkUHJpdmF0ZUZpZWxkKGludC5jbGFzcywgIm15RmllbGQiKTsKKyAgICAgICAgbXlQcml2YXRlRmllbGQuZ2V0VmFyaWFibGVzKCkuYWRkKG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoaW50VHlwZSgpLCAic2Vjb25kRmllbGQiKSk7CisgICAgICAgIG15UHJpdmF0ZUZpZWxkLmNyZWF0ZVNldHRlcigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL05vZGVXaXRoQW5ub3RhdGlvbnNCdWlsZGVyc1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9idWlsZGVycy9Ob2RlV2l0aEFubm90YXRpb25zQnVpbGRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyMjAxNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9idWlsZGVycy9Ob2RlV2l0aEFubm90YXRpb25zQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJ1aWxkZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTm9ybWFsQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBOb2RlV2l0aEFubm90YXRpb25zQnVpbGRlcnNUZXN0IHsKKyAgICBwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBjdSA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKyAgICBwcml2YXRlIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiB0ZXN0Q2xhc3MgPSBjdS5hZGRDbGFzcygidGVzdENsYXNzIik7IDsKKworICAgIEBpbnRlcmZhY2UgaGV5IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb24oKSB7CisgICAgICAgIE5vcm1hbEFubm90YXRpb25FeHByIGFubm90YXRpb24gPSB0ZXN0Q2xhc3MuYWRkQW5kR2V0QW5ub3RhdGlvbihoZXkuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYnVpbGRlcnMuTm9kZVdpdGhBbm5vdGF0aW9uc0J1aWxkZXJzVGVzdC5oZXk7IiwgY3UuZ2V0SW1wb3J0KDApLnRvU3RyaW5nKCkudHJpbSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3RDbGFzcy5nZXRBbm5vdGF0aW9ucygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhbm5vdGF0aW9uLCB0ZXN0Q2xhc3MuZ2V0QW5ub3RhdGlvbigwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOb3JtYWxBbm5vdGF0aW9uRXhwci5jbGFzcywgdGVzdENsYXNzLmdldEFubm90YXRpb24oMCkuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTWFya2VyQW5ub3RhdGlvbigpIHsKKyAgICAgICAgdGVzdENsYXNzLmFkZE1hcmtlckFubm90YXRpb24oInRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3RDbGFzcy5nZXRBbm5vdGF0aW9ucygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHsKKyAgICAgICAgdGVzdENsYXNzLmFkZFNpbmdsZU1lbWJlckFubm90YXRpb24oInRlc3QiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3RDbGFzcy5nZXRBbm5vdGF0aW9ucygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCB0ZXN0Q2xhc3MuZ2V0QW5ub3RhdGlvbigwKS5hc1NpbmdsZU1lbWJlckFubm90YXRpb25FeHByKCkuZ2V0TWVtYmVyVmFsdWUoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0Fubm90YXRpb25QcmVzZW50KCkgeworICAgICAgICB0ZXN0Q2xhc3MuYWRkTWFya2VyQW5ub3RhdGlvbihoZXkuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHRlc3RDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KGhleS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25CeU5hbWUoKSB7CisgICAgICAgIE5vcm1hbEFubm90YXRpb25FeHByIGFubm90YXRpb24gPSB0ZXN0Q2xhc3MuYWRkQW5kR2V0QW5ub3RhdGlvbihoZXkuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoYW5ub3RhdGlvbiwgdGVzdENsYXNzLmdldEFubm90YXRpb25CeU5hbWUoImhleSIpLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uQnlDbGFzcygpIHsKKyAgICAgICAgTm9ybWFsQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvbiA9IHRlc3RDbGFzcy5hZGRBbmRHZXRBbm5vdGF0aW9uKGhleS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhhbm5vdGF0aW9uLCB0ZXN0Q2xhc3MuZ2V0QW5ub3RhdGlvbkJ5Q2xhc3MoaGV5LmNsYXNzKS5nZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL05vZGVXaXRoTWVtYmVyc0J1aWxkZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL05vZGVXaXRoTWVtYmVyc0J1aWxkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzFmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVpbGRlcnMvTm9kZVdpdGhNZW1iZXJzQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5idWlsZGVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIE5vZGVXaXRoTWVtYmVyc0J1aWxkZXJzVGVzdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IGN1LmFkZENsYXNzKCJ0ZXN0Iik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGaWVsZCgpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBhZGRGaWVsZCA9IGNsYXNzRGVjbGFyYXRpb24uYWRkRmllbGQoaW50LmNsYXNzLCAiZmllbGROYW1lIiwgTW9kaWZpZXIuUFJJVkFURSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjbGFzc0RlY2xhcmF0aW9uLmdldE1lbWJlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkRmllbGQsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWVsZE5hbWUiLCBhZGRGaWVsZC5nZXRWYXJpYWJsZSgwKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTWV0aG9kKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBhZGRNZXRob2QgPSBjbGFzc0RlY2xhcmF0aW9uLmFkZE1ldGhvZCgiZm9vIiwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRNZXRob2QsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGRNZXRob2QuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEN0b3IoKSB7CisgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gYWRkQ3RvciA9IGNsYXNzRGVjbGFyYXRpb24uYWRkQ29uc3RydWN0b3IoTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRDdG9yLCBjbGFzc0RlY2xhcmF0aW9uLmdldE1lbWJlcigwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjbGFzc0RlY2xhcmF0aW9uLmdldE5hbWUoKSwgYWRkQ3Rvci5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEluaXRpYWxpemVycygpIHsKKyAgICAgICAgY2xhc3NEZWNsYXJhdGlvbi5hZGRJbml0aWFsaXplcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2xhc3NEZWNsYXJhdGlvbi5nZXRNZW1iZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEluaXRpYWxpemVyRGVjbGFyYXRpb24uY2xhc3MsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApLmdldENsYXNzKCkpOworCisgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uYWRkU3RhdGljSW5pdGlhbGl6ZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNsYXNzRGVjbGFyYXRpb24uZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbml0aWFsaXplckRlY2xhcmF0aW9uLmNsYXNzLCBjbGFzc0RlY2xhcmF0aW9uLmdldE1lbWJlcigwKS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2RzV2l0aE5hbWUoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGFkZE1ldGhvZCA9IGNsYXNzRGVjbGFyYXRpb24uYWRkTWV0aG9kKCJmb28iLCBNb2RpZmllci5QVUJMSUMpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBhZGRNZXRob2QyID0gY2xhc3NEZWNsYXJhdGlvbi5hZGRNZXRob2QoImZvbyIsIE1vZGlmaWVyLlBVQkxJQykuYWRkUGFyYW1ldGVyKGludC5jbGFzcywgIm92ZXJsb2FkIik7CisgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHNCeU5hbWUgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE1ldGhvZHNCeU5hbWUoImZvbyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWV0aG9kc0J5TmFtZS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldGhvZHNCeU5hbWUuY29udGFpbnMoYWRkTWV0aG9kKSk7CisgICAgICAgIGFzc2VydFRydWUobWV0aG9kc0J5TmFtZS5jb250YWlucyhhZGRNZXRob2QyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0aG9kcygpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gYWRkTWV0aG9kID0gY2xhc3NEZWNsYXJhdGlvbi5hZGRNZXRob2QoImZvbyIsIE1vZGlmaWVyLlBVQkxJQyk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGFkZE1ldGhvZDIgPSBjbGFzc0RlY2xhcmF0aW9uLmFkZE1ldGhvZCgiZm9vIiwgTW9kaWZpZXIuUFVCTElDKS5hZGRQYXJhbWV0ZXIoaW50LmNsYXNzLCAib3ZlcmxvYWQiKTsKKworICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1ldGhvZHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXRob2RzLmNvbnRhaW5zKGFkZE1ldGhvZCkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldGhvZHMuY29udGFpbnMoYWRkTWV0aG9kMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZHNXaXRoUGFyYW1ldGVyVHlwZXMoKSB7CisgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uYWRkTWV0aG9kKCJmb28iLCBNb2RpZmllci5QVUJMSUMpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBhZGRNZXRob2QyID0gY2xhc3NEZWNsYXJhdGlvbi5hZGRNZXRob2QoImZvbyIsIE1vZGlmaWVyLlBVQkxJQykuYWRkUGFyYW1ldGVyKGludC5jbGFzcywgIm92ZXJsb2FkIik7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VUeXBlIHR5cGUgPSBwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKCJMaXN0Iik7CisgICAgICAgIHR5cGUuc2V0VHlwZUFyZ3VtZW50cyhwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKCJTdHJpbmciKSk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFdpdGhMaXN0UGFyYW0gPSBjbGFzc0RlY2xhcmF0aW9uLmFkZE1ldGhvZCgiZm9vTGlzdCIsIE1vZGlmaWVyLlBVQkxJQykuYWRkUGFyYW1ldGVyKHR5cGUsICJvdmVybG9hZCIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBhZGRNZXRob2QzID0gY2xhc3NEZWNsYXJhdGlvbi5hZGRNZXRob2QoImZvbzIiLCBNb2RpZmllci5QVUJMSUMpLmFkZFBhcmFtZXRlcihpbnQuY2xhc3MsICJvdmVybG9hZCIpOworCisgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHNCeVBhcmFtID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRNZXRob2RzQnlQYXJhbWV0ZXJUeXBlcyhpbnQuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWV0aG9kc0J5UGFyYW0uc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXRob2RzQnlQYXJhbS5jb250YWlucyhhZGRNZXRob2QyKSk7CisgICAgICAgIGFzc2VydFRydWUobWV0aG9kc0J5UGFyYW0uY29udGFpbnMoYWRkTWV0aG9kMykpOworICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzQnlQYXJhbTIgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE1ldGhvZHNCeVBhcmFtZXRlclR5cGVzKCJMaXN0PFN0cmluZz4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldGhvZHNCeVBhcmFtMi5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1ldGhvZHNCeVBhcmFtMi5jb250YWlucyhtZXRob2RXaXRoTGlzdFBhcmFtKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRXaXRoTmFtZSgpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBhZGRGaWVsZCA9IGNsYXNzRGVjbGFyYXRpb24uYWRkRmllbGQoaW50LmNsYXNzLCAiZmllbGROYW1lIiwgTW9kaWZpZXIuUFJJVkFURSk7CisgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uYWRkRmllbGQoZmxvYXQuY2xhc3MsICJzZWNvbmRGaWVsZCIsIE1vZGlmaWVyLlBSSVZBVEUpOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkQnlOYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRGaWVsZEJ5TmFtZSgiZmllbGROYW1lIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRGaWVsZCwgZmllbGRCeU5hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpZWxkcygpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaXJzdEZpZWxkID0gY2xhc3NEZWNsYXJhdGlvbi5hZGRGaWVsZChpbnQuY2xhc3MsICJmaWVsZE5hbWUiLCBNb2RpZmllci5QUklWQVRFKTsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBzZWNvbmRGaWVsZCA9IGNsYXNzRGVjbGFyYXRpb24uYWRkRmllbGQoZmxvYXQuY2xhc3MsICJzZWNvbmRGaWVsZCIsIE1vZGlmaWVyLlBSSVZBVEUpOworCisgICAgICAgIExpc3Q8RmllbGREZWNsYXJhdGlvbj4gZmllbGRzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRGaWVsZHMoKTsKKworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkcy5jb250YWlucyhmaXJzdEZpZWxkKSk7CisgICAgICAgIGFzc2VydFRydWUoZmllbGRzLmNvbnRhaW5zKHNlY29uZEZpZWxkKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL05vZGVXaXRoUGFyYW1ldGVyc0J1aWxkZXJzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL05vZGVXaXRoUGFyYW1ldGVyc0J1aWxkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDBhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVpbGRlcnMvTm9kZVdpdGhQYXJhbWV0ZXJzQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJ1aWxkZXJzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgTm9kZVdpdGhQYXJhbWV0ZXJzQnVpbGRlcnNUZXN0IHsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBjdSA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlcigpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gYWRkTWV0aG9kID0gY3UuYWRkQ2xhc3MoInRlc3QiKS5hZGRNZXRob2QoImZvbyIsIE1vZGlmaWVyLlBVQkxJQyk7CisgICAgICAgIGFkZE1ldGhvZC5hZGRQYXJhbWV0ZXIoaW50LmNsYXNzLCAieWF5Iik7CisgICAgICAgIFBhcmFtZXRlciBteU5ld1BhcmFtID0gYWRkTWV0aG9kLmFkZEFuZEdldFBhcmFtZXRlcihMaXN0LmNsYXNzLCAibXlMaXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjdS5nZXRJbXBvcnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgIiArIExpc3QuY2xhc3MuZ2V0TmFtZSgpICsgIjsiICsgRU9MLCBjdS5nZXRJbXBvcnQoMCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBhZGRNZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieWF5IiwgYWRkTWV0aG9kLmdldFBhcmFtZXRlcigwKS5nZXROYW1lQXNTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGlzdCIsIGFkZE1ldGhvZC5nZXRQYXJhbWV0ZXIoMSkuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobXlOZXdQYXJhbSwgYWRkTWV0aG9kLmdldFBhcmFtZXRlcigxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1CeU5hbWUoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGFkZE1ldGhvZCA9IGN1LmFkZENsYXNzKCJ0ZXN0IikuYWRkTWV0aG9kKCJmb28iLCBNb2RpZmllci5QVUJMSUMpOworICAgICAgICBQYXJhbWV0ZXIgYWRkQW5kR2V0UGFyYW1ldGVyID0gYWRkTWV0aG9kLmFkZEFuZEdldFBhcmFtZXRlcihpbnQuY2xhc3MsICJ5YXkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZEFuZEdldFBhcmFtZXRlciwgYWRkTWV0aG9kLmdldFBhcmFtZXRlckJ5TmFtZSgieWF5IikuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFtQnlUeXBlKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBhZGRNZXRob2QgPSBjdS5hZGRDbGFzcygidGVzdCIpLmFkZE1ldGhvZCgiZm9vIiwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgUGFyYW1ldGVyIGFkZEFuZEdldFBhcmFtZXRlciA9IGFkZE1ldGhvZC5hZGRBbmRHZXRQYXJhbWV0ZXIoaW50LmNsYXNzLCAieWF5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRBbmRHZXRQYXJhbWV0ZXIsIGFkZE1ldGhvZC5nZXRQYXJhbWV0ZXJCeVR5cGUoImludCIpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZEFuZEdldFBhcmFtZXRlciwgYWRkTWV0aG9kLmdldFBhcmFtZXRlckJ5VHlwZShpbnQuY2xhc3MpLmdldCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9idWlsZGVycy9Ob2RlV2l0aFRocm93bkV4Y2VwdGlvbnNCdWlsZGVyc1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9idWlsZGVycy9Ob2RlV2l0aFRocm93bkV4Y2VwdGlvbnNCdWlsZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc1NjA2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1aWxkZXJzL05vZGVXaXRoVGhyb3duRXhjZXB0aW9uc0J1aWxkZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5idWlsZGVyczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIE5vZGVXaXRoVGhyb3duRXhjZXB0aW9uc0J1aWxkZXJzVGVzdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3MoKSB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGFkZE1ldGhvZCA9IGN1LmFkZENsYXNzKCJ0ZXN0IikuYWRkTWV0aG9kKCJmb28iLCBNb2RpZmllci5QVUJMSUMpOworICAgICAgICBhZGRNZXRob2QuYWRkVGhyb3duRXhjZXB0aW9uKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhZGRNZXRob2QuZ2V0VGhyb3duRXhjZXB0aW9ucygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBhZGRNZXRob2QuaXNUaHJvd24oSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgIGFkZE1ldGhvZC5hZGRUaHJvd25FeGNlcHRpb24ocGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZSgiVGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFkZE1ldGhvZC5nZXRUaHJvd25FeGNlcHRpb25zKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IiwgYWRkTWV0aG9kLmdldFRocm93bkV4Y2VwdGlvbigxKS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9KYXZhZG9jRXh0cmFjdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvSmF2YWRvY0V4dHJhY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc0MGIzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvSmF2YWRvY0V4dHJhY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVByb2JsZW1FeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5DaGFyc2V0czsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK3B1YmxpYyBjbGFzcyBKYXZhZG9jRXh0cmFjdG9yVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhblBhcnNlQWxsSmF2YWRvY3NJbkphdmFQYXJzZXIoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc0RpcihuZXcgRmlsZSgiLi4iKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGZpbGUsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgICAgICAgbmV3IFZvaWRWaXNpdG9yQWRhcHRlcjxPYmplY3Q+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEphdmFkb2NDb21tZW50IG4sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIudmlzaXQobiwgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgbi5wYXJzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0udmlzaXQoY3UsIG51bGwpOworICAgICAgICB9IGNhdGNoIChQYXJzZVByb2JsZW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFUlJPUiBQUk9DRVNTSU5HICIrIGZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaXIoRmlsZSBkaXIpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBmb3IgKEZpbGUgY2hpbGQgOiBkaXIubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjaGlsZC5pc0ZpbGUoKSAmJiBjaGlsZC5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShjaGlsZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGlyKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL0phdmFkb2NUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9KYXZhZG9jVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzdkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvamF2YWRvYy9KYXZhZG9jVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuamF2YWRvYzsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb24uSmF2YWRvY0Rlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5qYXZhZG9jLmRlc2NyaXB0aW9uLkphdmFkb2NEZXNjcmlwdGlvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb24uSmF2YWRvY0lubGluZVRhZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgSmF2YWRvY1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0b1RleHRGb3JFbXB0eUphdmFkb2MoKSB7CisgICAgICAgIEphdmFkb2MgamF2YWRvYyA9IG5ldyBKYXZhZG9jKG5ldyBKYXZhZG9jRGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgamF2YWRvYy50b1RleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0b1RleHRGb3JKYXZhZG9jV2l0aFR3b0xpbmVzT2ZKdXN0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIEphdmFkb2MgamF2YWRvYyA9IG5ldyBKYXZhZG9jKEphdmFkb2NEZXNjcmlwdGlvbi5wYXJzZVRleHQoImZpcnN0IGxpbmUiICsgRU9MICsgInNlY29uZCBsaW5lIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpcnN0IGxpbmUiICsgRU9MICsgInNlY29uZCBsaW5lIiArIEVPTCwgamF2YWRvYy50b1RleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0b1RleHRGb3JKYXZhZG9jV2l0aFR3b0xpbmVzT2ZKdXN0RGVzY3JpcHRpb25BbmRPbmVCbG9ja1RhZygpIHsKKyAgICAgICAgSmF2YWRvYyBqYXZhZG9jID0gbmV3IEphdmFkb2MoSmF2YWRvY0Rlc2NyaXB0aW9uLnBhcnNlVGV4dCgiZmlyc3QgbGluZSIgKyBFT0wgKyAic2Vjb25kIGxpbmUiKSk7CisgICAgICAgIGphdmFkb2MuYWRkQmxvY2tUYWcoImZvbyIsICJzb21ldGhpbmcgdXNlZnVsIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZmlyc3QgbGluZSIgKyBFT0wgKyAic2Vjb25kIGxpbmUiICsgRU9MICsgRU9MICsgIkBmb28gc29tZXRoaW5nIHVzZWZ1bCIgKyBFT0wsIGphdmFkb2MudG9UZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9Db21tZW50Rm9yRW1wdHlKYXZhZG9jKCkgeworICAgICAgICBKYXZhZG9jIGphdmFkb2MgPSBuZXcgSmF2YWRvYyhuZXcgSmF2YWRvY0Rlc2NyaXB0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEphdmFkb2NDb21tZW50KCIiICsgRU9MICsgIlx0XHQgIiksIGphdmFkb2MudG9Db21tZW50KCJcdFx0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9Db21tZW50b3JKYXZhZG9jV2l0aFR3b0xpbmVzT2ZKdXN0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIEphdmFkb2MgamF2YWRvYyA9IG5ldyBKYXZhZG9jKEphdmFkb2NEZXNjcmlwdGlvbi5wYXJzZVRleHQoImZpcnN0IGxpbmUiICsgRU9MICsgInNlY29uZCBsaW5lIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEphdmFkb2NDb21tZW50KCIiICsgRU9MICsgIlx0XHQgKiBmaXJzdCBsaW5lIiArIEVPTCArICJcdFx0ICogc2Vjb25kIGxpbmUiICsgRU9MICsgIlx0XHQgIiksIGphdmFkb2MudG9Db21tZW50KCJcdFx0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdG9Db21tZW50Rm9ySmF2YWRvY1dpdGhUd29MaW5lc09mSnVzdERlc2NyaXB0aW9uQW5kT25lQmxvY2tUYWcoKSB7CisgICAgICAgIEphdmFkb2MgamF2YWRvYyA9IG5ldyBKYXZhZG9jKEphdmFkb2NEZXNjcmlwdGlvbi5wYXJzZVRleHQoImZpcnN0IGxpbmUiICsgRU9MICsgInNlY29uZCBsaW5lIikpOworICAgICAgICBqYXZhZG9jLmFkZEJsb2NrVGFnKCJmb28iLCAic29tZXRoaW5nIHVzZWZ1bCIpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEphdmFkb2NDb21tZW50KCIiICsgRU9MICsgIlx0XHQgKiBmaXJzdCBsaW5lIiArIEVPTCArICJcdFx0ICogc2Vjb25kIGxpbmUiICsgRU9MICsgIlx0XHQgKiAiICsgRU9MICsgIlx0XHQgKiBAZm9vIHNvbWV0aGluZyB1c2VmdWwiICsgRU9MICsgIlx0XHQgIiksIGphdmFkb2MudG9Db21tZW50KCJcdFx0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGVzY3JpcHRpb25BbmRCbG9ja1RhZ3NBcmVSZXRyaWV2YWJsZSgpIHsKKyAgICAgICAgSmF2YWRvYyBqYXZhZG9jID0gSmF2YVBhcnNlci5wYXJzZUphdmFkb2MoImZpcnN0IGxpbmUiICsgRU9MICsgInNlY29uZCBsaW5lIiArIEVPTCArIEVPTCArICJAcGFyYW0gbm9kZSBhIG5vZGUiICsgRU9MICsgIkByZXR1cm4gcmVzdWx0IHRoZSByZXN1bHQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXJzdCBsaW5lIiArIEVPTCArICJzZWNvbmQgbGluZSIsIGphdmFkb2MuZ2V0RGVzY3JpcHRpb24oKS50b1RleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBqYXZhZG9jLmdldEJsb2NrVGFncygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbmxpbmVUYWdzQXJlUGFyc2FibGUoKSB7CisgICAgICAgIFN0cmluZyBkb2NUZXh0ID0KKyAgICAgICAgICAgICAgICAiUmV0dXJucyB0aGUge0BsaW5rIFRPRmlsZW5hbWV9cyBvZiBhbGwgZmlsZXMgdGhhdCBleGlzdGVkIGR1cmluZyB0aGUgcmVxdWVzdGVkIiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAie0BsaW5rIFRPVmVyc2lvbn0uIiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiIiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiQHBhcmFtIHZlcnNpb25JRCB0aGUgaWQgb2YgdGhlIHtAbGluayBUT1ZlcnNpb259LiIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIkByZXR1cm4gdGhlIGZpbGVuYW1lcyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIkB0aHJvd3MgSW52YWxpZElERXhjZXB0aW9uIGlmIHRoZSB7QGxpbmsgSVBlcnNpc3RlbmNlfSBkb2Vzbid0IHJlY29nbml6ZSB0aGUgZ2l2ZW4gdmVyc2lvbklELiIgKyBFT0w7CisgICAgICAgIFN0cmluZyBqYXZhZG9jID0gSmF2YVBhcnNlci5wYXJzZUphdmFkb2MoZG9jVGV4dCkudG9UZXh0KCk7CisgICAgICAgIGFzc2VydFRydWUoamF2YWRvYy5jb250YWlucygie0BsaW5rIFRPVmVyc2lvbn0iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBlbXB0eUxpbmVzQmV0d2VlbkJsb2NrVGFnc0dldHNGaWx0ZXJlZCgpIHsKKyAgICAgICAgU3RyaW5nIGNvbW1lbnQgPSAiICogVGhlIHR5cGUgb2YgdGhlIE9iamVjdCB0byBiZSBtYXBwZWQuIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAqIFRoaXMgaW50ZXJmYWNlIG1hcHMgdGhlIGdpdmVuIE9iamVjdHMgdG8gZXhpc3Rpbmcgb25lcyBpbiB0aGUgZGF0YWJhc2UgYW5kIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAqIHNhdmVzIHRoZW0uIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAqICIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgKiBAYXV0aG9yIGNlbnNvcmVkIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAqICIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgKiBAcGFyYW0gPFQ+IiArIEVPTDsKKyAgICAgICAgSmF2YWRvYyBqYXZhZG9jID0gSmF2YVBhcnNlci5wYXJzZUphdmFkb2MoY29tbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBqYXZhZG9jLmdldEJsb2NrVGFncygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBibG9ja1RhZ01vZGlmaWNhdGlvbldvcmtzKCkgeworICAgICAgICBKYXZhZG9jIGphdmFkb2MgPSBuZXcgSmF2YWRvYyhuZXcgSmF2YWRvY0Rlc2NyaXB0aW9uKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBqYXZhZG9jLmdldEJsb2NrVGFncygpLnNpemUoKSk7CisgICAgICAgIEphdmFkb2NCbG9ja1RhZyBibG9ja1RhZyA9IG5ldyBKYXZhZG9jQmxvY2tUYWcoSmF2YWRvY0Jsb2NrVGFnLlR5cGUuUkVUVVJOLCAiYSB2YWx1ZSIpOworICAgICAgICBqYXZhZG9jLmFkZEJsb2NrVGFnKGJsb2NrVGFnKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgamF2YWRvYy5nZXRCbG9ja1RhZ3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYmxvY2tUYWcsIGphdmFkb2MuZ2V0QmxvY2tUYWdzKCkuZ2V0KDApKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYmxvY2tUYWcsIGphdmFkb2MuZ2V0QmxvY2tUYWdzKCkucmVtb3ZlKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGphdmFkb2MuZ2V0QmxvY2tUYWdzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlc2NyaXB0aW9uTW9kaWZpY2F0aW9uV29ya3MoKSB7CisgICAgICAgIEphdmFkb2NEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ldyBKYXZhZG9jRGVzY3JpcHRpb24oKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGVzY3JpcHRpb24uZ2V0RWxlbWVudHMoKS5zaXplKCkpOworCisgICAgICAgIEphdmFkb2NEZXNjcmlwdGlvbkVsZW1lbnQgaW5saW5lVGFnID0gbmV3IEphdmFkb2NJbmxpbmVUYWcoImluaGVyaXREb2MiLCBKYXZhZG9jSW5saW5lVGFnLlR5cGUuSU5IRVJJVF9ET0MsICIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZXNjcmlwdGlvbi5hZGRFbGVtZW50KGlubGluZVRhZykpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBkZXNjcmlwdGlvbi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbmxpbmVUYWcsIGRlc2NyaXB0aW9uLmdldEVsZW1lbnRzKCkuZ2V0KDApKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoaW5saW5lVGFnLCBkZXNjcmlwdGlvbi5nZXRFbGVtZW50cygpLnJlbW92ZSgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBkZXNjcmlwdGlvbi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFkb2MvZGVzY3JpcHRpb24vSmF2YWRvY0lubGluZVRhZ1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL2Rlc2NyaXB0aW9uL0phdmFkb2NJbmxpbmVUYWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ZWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9qYXZhZG9jL2Rlc2NyaXB0aW9uL0phdmFkb2NJbmxpbmVUYWdUZXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTcgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmphdmFkb2MuZGVzY3JpcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEphdmFkb2NJbmxpbmVUYWdUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgamF2YWRvY0lubGluZVRhZ1Nob3VsZFBlcnNpc3RDdXN0b21UYWdOYW1lcygpIHsKKyAgICAgICAgU3RyaW5nIHRhZyA9IEphdmFkb2NJbmxpbmVUYWcuZnJvbVRleHQoIntAZm9vIHNvbWV0aGluZ30iKS50b1RleHQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGFnLCAiQGZvbyBzb21ldGhpbmciKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21hbnVhbC9CdWxrUGFyc2VUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWFudWFsL0J1bGtQYXJzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk2NTFmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21hbnVhbC9CdWxrUGFyc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1hbnVhbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm9ibGVtOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Mb2c7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVJvb3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlNvdXJjZVppcDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uLkxhbmd1YWdlTGV2ZWwuSkFWQV8xMDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC5KQVZBXzk7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Db2RlR2VuZXJhdGlvblV0aWxzLmY7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5Tb3VyY2VSb290LkNhbGxiYWNrLlJlc3VsdC5ET05UX1NBVkU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuZG93bmxvYWQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMudGVtcG9yYXJ5RGlyZWN0b3J5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29tcGFyYXRvci5jb21wYXJpbmc7CisKK3B1YmxpYyBjbGFzcyBCdWxrUGFyc2VUZXN0IHsKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIHRoaXMgd2lsbCBkb3dubG9hZCBhIHZlcnNpb24gb2YgdGhlIE9wZW5KREssIHVuemlwIGl0LCBhbmQgcGFyc2UgaXQuIElmIGl0IHRocm93cyBhIHN0YWNrIG92ZXJmbG93CisgICAgICogZXhjZXB0aW9uLCBpbmNyZWFzZSB0aGUgSlZNJ3Mgc3RhY2sgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMb2cuc2V0QWRhcHRlcihuZXcgTG9nLlN0YW5kYXJkT3V0U3RhbmRhcmRFcnJvckFkYXB0ZXIoKSk7CisgICAgICAgIC8vIFRoaXMgY29udGFpbnMgYWxsIGtpbmRzIG9mIHRlc3QgY2FzZXMgc28gaXQgd2lsbCBsZWFkIHRvIGEgbG90IG9mIGVycm9yczoKKyAgICAgICAgbmV3IEJ1bGtQYXJzZVRlc3QoKS5wYXJzZU9wZW5KZGtMYW5nVG9vbHNSZXBvc2l0b3J5KCk7CisgICAgICAgIC8vIFRoaXMgY29udGFpbnMgdGhlIEpESyBzb3VyY2UgY29kZSwgc28gaXQgc2hvdWxkIGhhdmUgemVybyBlcnJvcnM6CisgICAgICAgIG5ldyBCdWxrUGFyc2VUZXN0KCkucGFyc2VKZGtTcmNaaXAoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VPcGVuSmRrTGFuZ1Rvb2xzUmVwb3NpdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggd29ya2RpciA9IENvZGVHZW5lcmF0aW9uVXRpbHMubWF2ZW5Nb2R1bGVSb290KEJ1bGtQYXJzZVRlc3QuY2xhc3MpLnJlc29sdmUoUGF0aHMuZ2V0KHRlbXBvcmFyeURpcmVjdG9yeSgpLCAiamF2YXBhcnNlcl9idWxrcGFyc2V0ZXN0IikpOworICAgICAgICB3b3JrZGlyLnRvRmlsZSgpLm1rZGlycygpOworICAgICAgICBQYXRoIG9wZW5KZGtaaXBQYXRoID0gd29ya2Rpci5yZXNvbHZlKCJsYW5ndG9vbHMuemlwIik7CisgICAgICAgIGlmIChGaWxlcy5ub3RFeGlzdHMob3Blbkpka1ppcFBhdGgpKSB7CisgICAgICAgICAgICBMb2cuaW5mbygiRG93bmxvYWRpbmcgSkRLIGxhbmd0b29scyIpOworICAgICAgICAgICAgLyogRm91bmQgYnkgY2hvb3NpbmcgYSB0YWcgaGVyZTogaHR0cDovL2hnLm9wZW5qZGsuamF2YS5uZXQvamRrOS9qZGs5L2xhbmd0b29scy90YWdzCisgICAgICAgICAgICAgdGhlbiBjb3B5aW5nIHRoZSAiemlwIiBsaW5rIHRvIHRoZSBsaW5lIGJlbG93OiAqLyAKKyAgICAgICAgICAgIGRvd25sb2FkKG5ldyBVUkwoImh0dHA6Ly9oZy5vcGVuamRrLmphdmEubmV0L2pkazEwL2pkazEwL2xhbmd0b29scy9hcmNoaXZlLzE5MjkzZWEzOTk5Zi56aXAiKSwgb3Blbkpka1ppcFBhdGgpOworICAgICAgICB9CisgICAgICAgIGJ1bGtUZXN0KG5ldyBTb3VyY2VaaXAob3Blbkpka1ppcFBhdGgpLCAib3Blbmpka19zcmNfcmVwb190ZXN0X3Jlc3VsdHMudHh0IiwgbmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKEpBVkFfMTApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VKZGtTcmNaaXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIFVidW50dSBzdG9yZXMgdGhlIGNvbnRlbnRzIG9mIHBhY2thZ2Ugb3Blbmpkay04LXNyYworICAgICAgICBQYXRoIHBhdGggPSBQYXRocy5nZXQoIi91c3IvbGliL2p2bS9vcGVuamRrLTkvc3JjLnppcCIpOworICAgICAgICBidWxrVGVzdChuZXcgU291cmNlWmlwKHBhdGgpLCAib3Blbmpka19zcmNfemlwX3Rlc3RfcmVzdWx0cy50eHQiLCBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpLnNldExhbmd1YWdlTGV2ZWwoSkFWQV85KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZU93blNvdXJjZUNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWxrVGVzdCgKKyAgICAgICAgICAgICAgICBuZXcgU291cmNlUm9vdChDb2RlR2VuZXJhdGlvblV0aWxzLm1hdmVuTW9kdWxlUm9vdChCdWxrUGFyc2VUZXN0LmNsYXNzKS5yZXNvbHZlKCIuLiIpKSwgCisgICAgICAgICAgICAgICAgImphdmFwYXJzZXJfdGVzdF9yZXN1bHRzLnR4dCIsIAorICAgICAgICAgICAgICAgIG5ldyBQYXJzZXJDb25maWd1cmF0aW9uKCkuc2V0TGFuZ3VhZ2VMZXZlbChKQVZBXzkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBidWxrVGVzdChTb3VyY2VSb290IHNvdXJjZVJvb3QsIFN0cmluZyB0ZXN0UmVzdWx0c0ZpbGVOYW1lLCBQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNvdXJjZVJvb3Quc2V0UGFyc2VyQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgVHJlZU1hcDxQYXRoLCBMaXN0PFByb2JsZW0+PiByZXN1bHRzID0gbmV3IFRyZWVNYXA8Pihjb21wYXJpbmcobyAtPiBvLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpOworICAgICAgICBzb3VyY2VSb290LnBhcnNlUGFyYWxsZWxpemVkKChsb2NhbFBhdGgsIGFic29sdXRlUGF0aCwgcmVzdWx0KSAtPiB7CisgICAgICAgICAgICBpZiAoIWxvY2FsUGF0aC50b1N0cmluZygpLmNvbnRhaW5zKCJ0YXJnZXQiKSkgeworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KGxvY2FsUGF0aCwgcmVzdWx0LmdldFByb2JsZW1zKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBET05UX1NBVkU7CisgICAgICAgIH0pOworICAgICAgICB3cml0ZVJlc3VsdHMocmVzdWx0cywgdGVzdFJlc3VsdHNGaWxlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYnVsa1Rlc3QoU291cmNlWmlwIHNvdXJjZVJvb3QsIFN0cmluZyB0ZXN0UmVzdWx0c0ZpbGVOYW1lLCBQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNvdXJjZVJvb3Quc2V0UGFyc2VyQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgVHJlZU1hcDxQYXRoLCBMaXN0PFByb2JsZW0+PiByZXN1bHRzID0gbmV3IFRyZWVNYXA8Pihjb21wYXJpbmcobyAtPiBvLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpOworICAgICAgICBzb3VyY2VSb290LnBhcnNlKChwYXRoLCByZXN1bHQpIC0+IHsKKyAgICAgICAgICAgIGlmICghcGF0aC50b1N0cmluZygpLmNvbnRhaW5zKCJ0YXJnZXQiKSkgeworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KHBhdGgsIHJlc3VsdC5nZXRQcm9ibGVtcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB3cml0ZVJlc3VsdHMocmVzdWx0cywgdGVzdFJlc3VsdHNGaWxlTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUmVzdWx0cyhUcmVlTWFwPFBhdGgsIExpc3Q8UHJvYmxlbT4+IHJlc3VsdHMsIFN0cmluZyB0ZXN0UmVzdWx0c0ZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMb2cuaW5mbygiV3JpdGluZyByZXN1bHRzLi4uIik7CisKKyAgICAgICAgUGF0aCB0ZXN0UmVzdWx0cyA9IENvZGVHZW5lcmF0aW9uVXRpbHMubWF2ZW5Nb2R1bGVSb290KEJ1bGtQYXJzZVRlc3QuY2xhc3MpLnJlc29sdmUoUGF0aHMuZ2V0KCIuLiIsICJqYXZhcGFyc2VyLXRlc3RpbmciLCAic3JjIiwgInRlc3QiLCAicmVzb3VyY2VzIiwgImNvbSIsICJnaXRodWIiLCAiamF2YXBhcnNlciIsICJidWxrX3Rlc3RfcmVzdWx0cyIpKS5ub3JtYWxpemUoKTsKKyAgICAgICAgdGVzdFJlc3VsdHMudG9GaWxlKCkubWtkaXJzKCk7CisgICAgICAgIHRlc3RSZXN1bHRzID0gdGVzdFJlc3VsdHMucmVzb2x2ZSh0ZXN0UmVzdWx0c0ZpbGVOYW1lKTsKKworICAgICAgICBpbnQgcHJvYmxlbVRvdGFsID0gMDsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBGaWxlcy5uZXdCdWZmZXJlZFdyaXRlcih0ZXN0UmVzdWx0cykpIHsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFBhdGgsIExpc3Q8UHJvYmxlbT4+IGZpbGUgOiByZXN1bHRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZmlsZS5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2UoIlxcIiwgIi8iKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFByb2JsZW0gcHJvYmxlbSA6IGZpbGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUocHJvYmxlbS5nZXRWZXJib3NlTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvYmxlbVRvdGFsKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoZigiJXMgcHJvYmxlbXMgaW4gJXMgZmlsZXMiLCBwcm9ibGVtVG90YWwsIHJlc3VsdHMuc2l6ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBMb2cuaW5mbygiUmVzdWx0cyBhcmUgaW4gJXMiLCB0ZXN0UmVzdWx0cyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tZXRhbW9kZWwvQmFzZU5vZGVNZXRhTW9kZWxUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jhc2VOb2RlTWV0YU1vZGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTU4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL0Jhc2VOb2RlTWV0YU1vZGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLm1ldGFtb2RlbDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5TdHJpbmdMaXRlcmFsRXhwcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworY2xhc3MgVGVzdE1ldGFNb2RlbCBleHRlbmRzIEJhc2VOb2RlTWV0YU1vZGVsIHsKKworICAgIHB1YmxpYyBUZXN0TWV0YU1vZGVsKCkgeworICAgICAgICBzdXBlcihPcHRpb25hbC5lbXB0eSgpLCBTdHJpbmdMaXRlcmFsRXhwci5jbGFzcywgInN0cmkiLCAiY29tLmphcGEiLCB0cnVlLCB0cnVlKTsKKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBCYXNlTm9kZU1ldGFNb2RlbFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldHRlcnMoKSB7CisgICAgICAgIFRlc3RNZXRhTW9kZWwgdGVzdCA9IG5ldyBUZXN0TWV0YU1vZGVsKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0TWV0YU1vZGVsIiwgdGVzdC5nZXRNZXRhTW9kZWxGaWVsZE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvbWV0YW1vZGVsL1Byb3BlcnR5TWV0YU1vZGVsVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Qcm9wZXJ0eU1ldGFNb2RlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzMzZDgxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21ldGFtb2RlbC9Qcm9wZXJ0eU1ldGFNb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tZXRhbW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eU1ldGFNb2RlbFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd2hlblByb3BlcnR5SXNWZXJ5U2ltcGxlVGhlblR5cGVJbmZvSXNDb3JyZWN0KCkgeworICAgICAgICBQcm9wZXJ0eU1ldGFNb2RlbCBiZXJ0ID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG51bGwsICJiZXJ0IiwgaW50LmNsYXNzLCBPcHRpb25hbC5lbXB0eSgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIGJlcnQuZ2V0VHlwZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgYmVydC5nZXRUeXBlTmFtZUdlbmVyaWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgYmVydC5nZXRUeXBlTmFtZUZvckdldHRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBiZXJ0LmdldFR5cGVOYW1lRm9yU2V0dGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd2hlblByb3BlcnR5SXNWZXJ5Q29tcGxleFRoZW5UeXBlSW5mb0lzQ29ycmVjdCgpIHsKKyAgICAgICAgUHJvcGVydHlNZXRhTW9kZWwgYmVydCA9IG5ldyBQcm9wZXJ0eU1ldGFNb2RlbChudWxsLCAiYmVydCIsIEJvZHlEZWNsYXJhdGlvbi5jbGFzcywgT3B0aW9uYWwuZW1wdHkoKSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCb2R5RGVjbGFyYXRpb24iLCBiZXJ0LmdldFR5cGVOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJvZHlEZWNsYXJhdGlvbjw/PiIsIGJlcnQuZ2V0VHlwZU5hbWVHZW5lcmlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9wdGlvbmFsPE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4+IiwgYmVydC5nZXRUeXBlTmFtZUZvckdldHRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb2RlTGlzdDxCb2R5RGVjbGFyYXRpb248Pz4+IiwgYmVydC5nZXRUeXBlTmFtZUZvclNldHRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHdoZW5Qcm9wZXJ0eUlzQW5FbnVtVGhlblR5cGVJbmZvSXNDb3JyZWN0KCkgeworICAgICAgICBQcm9wZXJ0eU1ldGFNb2RlbCBiZXJ0ID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG51bGwsICJiZXJ0IiwgTW9kaWZpZXIuY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNb2RpZmllciIsIGJlcnQuZ2V0VHlwZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTW9kaWZpZXIiLCBiZXJ0LmdldFR5cGVOYW1lR2VuZXJpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFbnVtU2V0PE1vZGlmaWVyPiIsIGJlcnQuZ2V0VHlwZU5hbWVGb3JHZXR0ZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRW51bVNldDxNb2RpZmllcj4iLCBiZXJ0LmdldFR5cGVOYW1lRm9yU2V0dGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWV0YU1vZGVsRmllbGROYW1lKCkgeworICAgICAgICBQcm9wZXJ0eU1ldGFNb2RlbCBiZXJ0ID0gbmV3IFByb3BlcnR5TWV0YU1vZGVsKG51bGwsICJiZXJ0IiwgTW9kaWZpZXIuY2xhc3MsIE9wdGlvbmFsLmVtcHR5KCksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiZXJ0UHJvcGVydHlNZXRhTW9kZWwiLCBiZXJ0LmdldE1ldGFNb2RlbEZpZWxkTmFtZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tb2R1bGVzL01vZHVsZURlY2xhcmF0aW9uVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL21vZHVsZXMvTW9kdWxlRGVjbGFyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlYmU1NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9tb2R1bGVzL01vZHVsZURlY2xhcmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5tb2R1bGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFUb2tlbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuSW50ZWdlckxpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5NYXJrZXJBbm5vdGF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5tb2R1bGVzLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLkNvbmNyZXRlU3ludGF4TW9kZWw7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSURFTlRJRklFUjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXIucGFyc2VOYW1lOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VyQ29uZmlndXJhdGlvbi5MYW5ndWFnZUxldmVsLkpBVkFfOTsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLkVPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIE1vZHVsZURlY2xhcmF0aW9uVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyc2VyIGphdmFQYXJzZXIgPSBuZXcgSmF2YVBhcnNlcihuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpLnNldExhbmd1YWdlTGV2ZWwoSkFWQV85KSk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBwYXJzZShTdHJpbmcgY29kZSkgeworICAgICAgICByZXR1cm4gamF2YVBhcnNlci5wYXJzZShQYXJzZVN0YXJ0LkNPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGNvZGUpKS5nZXRSZXN1bHQoKS5nZXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1vZHVsZUluZm9LZXl3b3Jkc0FyZVNlZW5Bc0lkZW50aWZpZXJzKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgiY2xhc3MgbW9kdWxlIHsgfSIpOworICAgICAgICBKYXZhVG9rZW4gbW9kdWxlVG9rZW4gPSBjdS5nZXRDbGFzc0J5TmFtZSgibW9kdWxlIikuZ2V0KCkuZ2V0TmFtZSgpLmdldFRva2VuUmFuZ2UoKS5nZXQoKS5nZXRCZWdpbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoSURFTlRJRklFUiwgbW9kdWxlVG9rZW4uZ2V0S2luZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlOTg4UmVxdWlyZVRyYW5zaXRpdmVTaG91bGRSZXF1aXJlQU1vZHVsZUNhbGxlZFRyYW5zaXRpdmUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJtb2R1bGUgWCB7IHJlcXVpcmVzIHRyYW5zaXRpdmU7IH0iKTsKKyAgICAgICAgTW9kdWxlUmVxdWlyZXNTdG10IHJlcXVpcmVzVHJhbnNpdGl2ZSA9IChNb2R1bGVSZXF1aXJlc1N0bXQpIGN1LmdldE1vZHVsZSgpLmdldCgpLmdldE1vZHVsZVN0bXRzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRyYW5zaXRpdmUiLCByZXF1aXJlc1RyYW5zaXRpdmUuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSURFTlRJRklFUiwgcmVxdWlyZXNUcmFuc2l0aXZlLmdldE5hbWUoKS5nZXRUb2tlblJhbmdlKCkuZ2V0KCkuZ2V0QmVnaW4oKS5nZXRLaW5kKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgamxzRXhhbXBsZTEoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKAorICAgICAgICAgICAgICAgICJARm9vKDEpIEBGb28oMikgQEJhciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgTS5OIHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVzIEEuQjsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVzIHRyYW5zaXRpdmUgQy5EOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVxdWlyZXMgc3RhdGljIEUuRjsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVzIHRyYW5zaXRpdmUgc3RhdGljIEcuSDsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIGV4cG9ydHMgUC5ROyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgZXhwb3J0cyBSLlMgdG8gVDEuVTEsIFQyLlUyOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3BlbnMgUC5ROyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3BlbnMgUi5TIHRvIFQxLlUxLCBUMi5VMjsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHVzZXMgVi5XOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcHJvdmlkZXMgWC5ZIHdpdGggWjEuWjIsIFozLlo0OyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKworICAgICAgICBNb2R1bGVEZWNsYXJhdGlvbiBtb2R1bGUgPSBjdS5nZXRNb2R1bGUoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNLk4iLCBtb2R1bGUuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG1vZHVsZS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydFRoYXQobW9kdWxlLmdldEFubm90YXRpb25zKCkpLmNvbnRhaW5zRXhhY3RseSgKKyAgICAgICAgICAgICAgICBuZXcgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIobmV3IE5hbWUoIkZvbyIpLCBuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIxIikpLAorICAgICAgICAgICAgICAgIG5ldyBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcihuZXcgTmFtZSgiRm9vIiksIG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjIiKSksCisgICAgICAgICAgICAgICAgbmV3IE1hcmtlckFubm90YXRpb25FeHByKG5ldyBOYW1lKCJCYXIiKSkpOworCisgICAgICAgIE1vZHVsZVJlcXVpcmVzU3RtdCBtb2R1bGVSZXF1aXJlc1N0bXQgPSBtb2R1bGUuZ2V0TW9kdWxlU3RtdHMoKS5nZXQoMCkuYXNNb2R1bGVSZXF1aXJlc1N0bXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtb2R1bGVSZXF1aXJlc1N0bXQuZ2V0TmFtZUFzU3RyaW5nKCkpLmlzRXF1YWxUbygiQS5CIik7CisgICAgICAgIGFzc2VydFRoYXQobW9kdWxlUmVxdWlyZXNTdG10LmdldE1vZGlmaWVycygpKS5pc0VtcHR5KCk7CisKKyAgICAgICAgTW9kdWxlRXhwb3J0c1N0bXQgbW9kdWxlRXhwb3J0c1N0bXQgPSBtb2R1bGUuZ2V0TW9kdWxlU3RtdHMoKS5nZXQoNSkuYXNNb2R1bGVFeHBvcnRzU3RtdCgpOworICAgICAgICBhc3NlcnRUaGF0KG1vZHVsZUV4cG9ydHNTdG10LmdldE5hbWVBc1N0cmluZygpKS5pc0VxdWFsVG8oIlIuUyIpOworICAgICAgICBhc3NlcnRUaGF0KG1vZHVsZUV4cG9ydHNTdG10LmdldE1vZHVsZU5hbWVzKCkpLmNvbnRhaW5zRXhhY3RseShwYXJzZU5hbWUoIlQxLlUxIiksIHBhcnNlTmFtZSgiVDIuVTIiKSk7CisKKyAgICAgICAgTW9kdWxlT3BlbnNTdG10IG1vZHVsZU9wZW5zU3RtdCA9IG1vZHVsZS5nZXRNb2R1bGVTdG10cygpLmdldCg3KS5hc01vZHVsZU9wZW5zU3RtdCgpOworICAgICAgICBhc3NlcnRUaGF0KG1vZHVsZU9wZW5zU3RtdC5nZXROYW1lQXNTdHJpbmcoKSkuaXNFcXVhbFRvKCJSLlMiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtb2R1bGVPcGVuc1N0bXQuZ2V0TW9kdWxlTmFtZXMoKSkuY29udGFpbnNFeGFjdGx5KHBhcnNlTmFtZSgiVDEuVTEiKSwgcGFyc2VOYW1lKCJUMi5VMiIpKTsKKworICAgICAgICBNb2R1bGVVc2VzU3RtdCBtb2R1bGVVc2VzU3RtdCA9IG1vZHVsZS5nZXRNb2R1bGVTdG10cygpLmdldCg4KS5hc01vZHVsZVVzZXNTdG10KCk7CisgICAgICAgIGFzc2VydFRoYXQobW9kdWxlVXNlc1N0bXQuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpLmlzRXF1YWxUbygiVi5XIik7CisKKyAgICAgICAgTW9kdWxlUHJvdmlkZXNTdG10IG1vZHVsZVByb3ZpZGVzU3RtdCA9IG1vZHVsZS5nZXRNb2R1bGVTdG10cygpLmdldCg5KS5hc01vZHVsZVByb3ZpZGVzU3RtdCgpOworICAgICAgICBhc3NlcnRUaGF0KG1vZHVsZVByb3ZpZGVzU3RtdC5nZXRUeXBlKCkudG9TdHJpbmcoKSkuaXNFcXVhbFRvKCJYLlkiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtb2R1bGVQcm92aWRlc1N0bXQuZ2V0V2l0aFR5cGVzKCkpLmNvbnRhaW5zRXhhY3RseSgKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NPckludGVyZmFjZVR5cGUocGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZSgiWjEiKSwgIloyIiksCisgICAgICAgICAgICAgICAgbmV3IENsYXNzT3JJbnRlcmZhY2VUeXBlKHBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGUoIlozIiksICJaNCIpKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgamxzRXhhbXBsZTJIYXNBbk9wZW5Nb2R1bGUoKSB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKCJvcGVuIG1vZHVsZSBNLk4ge30iKTsKKworICAgICAgICBNb2R1bGVEZWNsYXJhdGlvbiBtb2R1bGUgPSBjdS5nZXRNb2R1bGUoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNLk4iLCBtb2R1bGUuZ2V0TmFtZUFzU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbW9kdWxlLmlzT3BlbigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludGluZygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2UoCisgICAgICAgICAgICAgICAgIkBGb28oMSkgQEZvbygyKSBAQmFyICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBNLk4geyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVxdWlyZXMgQS5COyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVxdWlyZXMgdHJhbnNpdGl2ZSBDLkQ7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICByZXF1aXJlcyBzdGF0aWMgRS5GOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVxdWlyZXMgdHJhbnNpdGl2ZSBzdGF0aWMgRy5IOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgZXhwb3J0cyBQLlE7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICBleHBvcnRzIFIuUyB0byBUMS5VMSwgVDIuVTI7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICBvcGVucyBQLlE7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICBvcGVucyBSLlMgdG8gVDEuVTEsIFQyLlUyOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgdXNlcyBWLlc7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICBwcm92aWRlcyBYLlkgd2l0aCBaMS5aMiwgWjMuWjQ7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAifSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiQEZvbygxKSBARm9vKDIpIEBCYXIgIiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIE0uTiB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlcXVpcmVzIEEuQjsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVxdWlyZXMgdHJhbnNpdGl2ZSBDLkQ7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlcXVpcmVzIHN0YXRpYyBFLkY7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlcXVpcmVzIHN0YXRpYyB0cmFuc2l0aXZlIEcuSDsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZXhwb3J0cyBQLlE7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGV4cG9ydHMgUi5TIHRvIFQxLlUxLCBUMi5VMjsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgb3BlbnMgUC5ROyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBvcGVucyBSLlMgdG8gVDEuVTEsIFQyLlUyOyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB1c2VzIFYuVzsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcHJvdmlkZXMgWC5ZIHdpdGggWjEuWjIsIFozLlo0OyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIn0iICsgRU9MLCBjdS50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENzbVByaW50aW5nKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgKKyAgICAgICAgICAgICAgICAiQEZvbygxKSBARm9vKDIpIEBCYXIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAib3BlbiBtb2R1bGUgTS5OIHsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVzIEEuQjsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVzIHRyYW5zaXRpdmUgQy5EOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVxdWlyZXMgc3RhdGljIEUuRjsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVzIHRyYW5zaXRpdmUgc3RhdGljIEcuSDsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIGV4cG9ydHMgUC5ROyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgZXhwb3J0cyBSLlMgdG8gVDEuVTEsIFQyLlUyOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3BlbnMgUC5ROyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3BlbnMgUi5TIHRvIFQxLlUxLCBUMi5VMjsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIHVzZXMgVi5XOyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgcHJvdmlkZXMgWC5ZIHdpdGggWjEuWjIsIFozLlo0OyIgKworICAgICAgICAgICAgICAgICAgICAgICAgIn0iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIkBGb28oMSkgQEZvbygyKSBAQmFyIiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAib3BlbiBtb2R1bGUgTS5OIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVxdWlyZXMgQS5COyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICByZXF1aXJlcyB0cmFuc2l0aXZlIEMuRDsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVxdWlyZXMgc3RhdGljIEUuRjsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcmVxdWlyZXMgc3RhdGljIHRyYW5zaXRpdmUgRy5IOyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBleHBvcnRzIFAuUTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZXhwb3J0cyBSLlMgdG8gVDEuVTEsIFQyLlUyOyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBvcGVucyBQLlE7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG9wZW5zIFIuUyB0byBUMS5VMSwgVDIuVTI7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHVzZXMgVi5XOyIgKyBFT0wgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwcm92aWRlcyBYLlkgd2l0aCBaMS5aMiwgWjMuWjQ7IiArIEVPTCArCisgICAgICAgICAgICAgICAgICAgICAgICAifSIgKyBFT0wsIENvbmNyZXRlU3ludGF4TW9kZWwuZ2VuZXJpY1ByZXR0eVByaW50KGN1KSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Db25jcmV0ZVN5bnRheE1vZGVsQWNjZXB0YW5jZVRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0NvbmNyZXRlU3ludGF4TW9kZWxBY2NlcHRhbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDdhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Db25jcmV0ZVN5bnRheE1vZGVsQWNjZXB0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlsczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBDb25jcmV0ZVN5bnRheE1vZGVsQWNjZXB0YW5jZVRlc3QgeworICAgIHByaXZhdGUgZmluYWwgUGF0aCByb290RGlyID0gQ29kZUdlbmVyYXRpb25VdGlscy5tYXZlbk1vZHVsZVJvb3QoQ29uY3JldGVTeW50YXhNb2RlbEFjY2VwdGFuY2VUZXN0LmNsYXNzKS5yZXNvbHZlKCJzcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUiKTsKKworICAgIHByaXZhdGUgU3RyaW5nIHByZXR0eVByaW50KE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gQ29uY3JldGVTeW50YXhNb2RlbC5nZW5lcmljUHJldHR5UHJpbnQobm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJldHR5UHJpbnRlZEV4cGVjdGF0aW9uKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gVGVzdFV0aWxzLnJlYWRSZXNvdXJjZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvIiArIG5hbWUgKyAiX3ByZXR0eXByaW50ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50aW5nRXhhbXBsZVByZXR0eVByaW50VmlzaXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2Uocm9vdERpci5yZXNvbHZlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludFZpc2l0b3IuamF2YSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXR0eVByaW50ZWRFeHBlY3RhdGlvbigiUHJldHR5UHJpbnRWaXNpdG9yIiksIHByZXR0eVByaW50KGN1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludGluZ0V4YW1wbGVKYXZhQ29uY2VwdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKHJvb3REaXIucmVzb2x2ZSgiY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvSmF2YUNvbmNlcHRzLmphdmEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmV0dHlQcmludGVkRXhwZWN0YXRpb24oIkphdmFDb25jZXB0cyIpLCBwcmV0dHlQcmludChjdSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvQ29uY3JldGVTeW50YXhNb2RlbFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0NvbmNyZXRlU3ludGF4TW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4ZjkwYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0NvbmNyZXRlU3ludGF4TW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkNsYXNzRXhwcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIENvbmNyZXRlU3ludGF4TW9kZWxUZXN0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHByaW50KE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gQ29uY3JldGVTeW50YXhNb2RlbC5nZW5lcmljUHJldHR5UHJpbnQobm9kZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludFNpbXBsZUNsYXNzRXhwcigpIHsKKyAgICAgICAgQ2xhc3NFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiRm9vLmNsYXNzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiRm9vLmNsYXNzIiwgcHJpbnQoZXhwcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBcnJheUNsYXNzRXhwcigpIHsKKyAgICAgICAgQ2xhc3NFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiRm9vW10uY2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb29bXS5jbGFzcyIsIHByaW50KGV4cHIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50R2VuZXJpY0NsYXNzRXhwcigpIHsKKyAgICAgICAgQ2xhc3NFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiRm9vPFN0cmluZz4uY2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb288U3RyaW5nPi5jbGFzcyIsIHByaW50KGV4cHIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50U2ltcGxlc3RDbGFzcygpIHsKKyAgICAgICAgTm9kZSBub2RlID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgQSB7fSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEEgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiArIEVPTCwgcHJpbnQobm9kZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBQ2xhc3NXaXRoRmllbGQoKSB7CisgICAgICAgIE5vZGUgbm9kZSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIEEgeyBpbnQgYTsgfSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEEgeyIgKyBFT0wKKyAgICAgICAgICAgICAgICArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICBpbnQgYTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSIgKyBFT0wsIHByaW50KG5vZGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50UGFyYW1ldGVycygpIHsKKyAgICAgICAgTm9kZSBub2RlID0gSmF2YVBhcnNlci5wYXJzZUJvZHlEZWNsYXJhdGlvbigiaW50IHgoaW50IHksIGludCB6KSB7fSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludCB4KGludCB5LCBpbnQgeikgeyIgKyBFT0wgKyAifSIsIHByaW50KG5vZGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50UmVjZWl2ZXJQYXJhbWV0ZXIoKSB7CisgICAgICAgIE5vZGUgbm9kZSA9IEphdmFQYXJzZXIucGFyc2VCb2R5RGVjbGFyYXRpb24oImludCB4KFggQS5CLnRoaXMsIGludCB5LCBpbnQgeikge30iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQgeChYIEEuQi50aGlzLCBpbnQgeSwgaW50IHopIHsiICsgRU9MICsgIn0iLCBwcmludChub2RlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFuRW1wdHlJbnRlcmZhY2UoKSB7CisgICAgICAgIE5vZGUgbm9kZSA9IEphdmFQYXJzZXIucGFyc2UoImludGVyZmFjZSBBIHt9Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50ZXJmYWNlIEEgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiArIEVPTCwgcHJpbnQobm9kZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBbkVtcHR5SW50ZXJmYWNlV2l0aE1vZGlmaWVyKCkgeworICAgICAgICBOb2RlIG5vZGUgPSBKYXZhUGFyc2VyLnBhcnNlKCJwdWJsaWMgaW50ZXJmYWNlIEEge30iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdWJsaWMgaW50ZXJmYWNlIEEgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiArIEVPTCwgcHJpbnQobm9kZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0RvdFByaW50ZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Eb3RQcmludGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTE0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Eb3RQcmludGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyOw0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7DQorDQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0Ow0KKw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247DQorDQorcHVibGljIGNsYXNzIERvdFByaW50ZXJUZXN0IHsNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhUeXBlKCkgew0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0gImRpZ3JhcGggeyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm4wIFtsYWJlbD1cInJvb3QgKE1ldGhvZENhbGxFeHByKVwiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMSBbbGFiZWw9XCJuYW1lIChTaW1wbGVOYW1lKVwiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMCAtPiBuMTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMiBbbGFiZWw9XCJpZGVudGlmaWVyPSd4J1wiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMSAtPiBuMjsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMyBbbGFiZWw9XCJhcmd1bWVudHNcIl07IiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAibjAgLT4gbjM7IiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAibjQgW2xhYmVsPVwiYXJndW1lbnQgKEludGVnZXJMaXRlcmFsRXhwcilcIl07IiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAibjMgLT4gbjQ7IiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAibjUgW2xhYmVsPVwidmFsdWU9JzEnXCJdOyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm40IC0+IG41OyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm42IFtsYWJlbD1cImFyZ3VtZW50IChJbnRlZ2VyTGl0ZXJhbEV4cHIpXCJdOyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm4zIC0+IG42OyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm43IFtsYWJlbD1cInZhbHVlPScxJ1wiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuNiAtPiBuNzsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJ9IjsNCisNCisgICAgICAgIERvdFByaW50ZXIgZG90UHJpbnRlciA9IG5ldyBEb3RQcmludGVyKHRydWUpOw0KKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oIngoMSwxKSIpOw0KKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IGRvdFByaW50ZXIub3V0cHV0KGV4cHJlc3Npb24pOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3V0cHV0LCBvdXRwdXQpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0VHlwZSgpIHsNCisgICAgICAgIFN0cmluZyBleHBlY3RlZE91dHB1dCA9ICJkaWdyYXBoIHsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMCBbbGFiZWw9XCJyb290XCJdOyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm4xIFtsYWJlbD1cIm9wZXJhdG9yPSdQTFVTJ1wiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMCAtPiBuMTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMiBbbGFiZWw9XCJsZWZ0XCJdOyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm4wIC0+IG4yOyIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIm4zIFtsYWJlbD1cInZhbHVlPScxJ1wiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMiAtPiBuMzsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuNCBbbGFiZWw9XCJyaWdodFwiXTsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuMCAtPiBuNDsiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJuNSBbbGFiZWw9XCJ2YWx1ZT0nMSdcIl07IiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAibjQgLT4gbjU7IiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAifSI7DQorDQorICAgICAgICBEb3RQcmludGVyIGRvdFByaW50ZXIgPSBuZXcgRG90UHJpbnRlcihmYWxzZSk7DQorICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiMSsxIik7DQorICAgICAgICBTdHJpbmcgb3V0cHV0ID0gZG90UHJpbnRlci5vdXRwdXQoZXhwcmVzc2lvbik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRPdXRwdXQsIG91dHB1dCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvSnNvblByaW50ZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9Kc29uUHJpbnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI2MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvSnNvblByaW50ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBKc29uUHJpbnRlclRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhUeXBlKCkgeworICAgICAgICBKc29uUHJpbnRlciBqc29uUHJpbnRlciA9IG5ldyBKc29uUHJpbnRlcih0cnVlKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKCJ4KDEsMSkiKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0ganNvblByaW50ZXIub3V0cHV0KGV4cHJlc3Npb24pOworCisgICAgICAgIGFzc2VydEVxdWFscygie1widHlwZVwiOlwiTWV0aG9kQ2FsbEV4cHJcIixcIm5hbWVcIjp7XCJ0eXBlXCI6XCJTaW1wbGVOYW1lXCIsXCJpZGVudGlmaWVyXCI6XCJ4XCJ9LFwiYXJndW1lbnRzXCI6W3tcInR5cGVcIjpcIkludGVnZXJMaXRlcmFsRXhwclwiLFwidmFsdWVcIjpcIjFcIn0se1widHlwZVwiOlwiSW50ZWdlckxpdGVyYWxFeHByXCIsXCJ2YWx1ZVwiOlwiMVwifV19Iiwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0VHlwZSgpIHsKKyAgICAgICAgSnNvblByaW50ZXIganNvblByaW50ZXIgPSBuZXcgSnNvblByaW50ZXIoZmFsc2UpOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24oIjErMSIpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBqc29uUHJpbnRlci5vdXRwdXQoZXhwcmVzc2lvbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJvcGVyYXRvclwiOlwiUExVU1wiLFwibGVmdFwiOntcInZhbHVlXCI6XCIxXCJ9LFwicmlnaHRcIjp7XCJ2YWx1ZVwiOlwiMVwifX0iLCBvdXRwdXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVzY2FwaW5nKCkgeworICAgICAgICBKc29uUHJpbnRlciBqc29uUHJpbnRlciA9IG5ldyBKc29uUHJpbnRlcihmYWxzZSk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBleHByZXNzaW9uID0gcGFyc2UoImNsYXNzIFggey8vaGlcIiIgKyBFT0wgKyAiaW50IHg7fSIpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBqc29uUHJpbnRlci5vdXRwdXQoZXhwcmVzc2lvbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJ0eXBlc1wiOlt7XCJpc0ludGVyZmFjZVwiOlwiZmFsc2VcIixcIm5hbWVcIjp7XCJpZGVudGlmaWVyXCI6XCJYXCIsXCJjb21tZW50XCI6e1wiY29udGVudFwiOlwiaGlcXFwiXCJ9fSxcIm1lbWJlcnNcIjpbe1widmFyaWFibGVzXCI6W3tcIm5hbWVcIjp7XCJpZGVudGlmaWVyXCI6XCJ4XCJ9LFwidHlwZVwiOntcInR5cGVcIjpcIklOVFwifX1dfV19XX0iLCBvdXRwdXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNzdWUxMzM4KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBUZXN0IHsiICsKKyAgICAgICAgICAgICAgICAiICBwdWJsaWMgdm9pZCBtZXRob2QoKSB7IiArCisgICAgICAgICAgICAgICAgIiAgICBTdHJpbmcuZm9ybWF0KFwiSSdtIHVzaW5nICVzXCIsIFwiSmF2YVBhcnNlclwiKTsiICsKKyAgICAgICAgICAgICAgICAiICB9IiArCisgICAgICAgICAgICAgICAgIn0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCA9IHBhcnNlKGNvZGUpOworICAgICAgICBKc29uUHJpbnRlciBwcmludGVyID0gbmV3IEpzb25QcmludGVyKHRydWUpOworICAgICAgICBwcmludGVyLm91dHB1dCh1bml0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTQyMSgpIHsKKyAgICAgICAgLy8gSGFuZGxlIG11bHRpLWxpbmUgc3RyaW5ncyBpbiBKU09OIG91dHB1dAorICAgICAgICBTdHJpbmcgY29kZSA9ICIvKiBcbiIgKworICAgICAgICAgICAgICAgICIqIFNvbWUgY29tbWVudFxuIiArCisgICAgICAgICAgICAgICAgIiovXG4iICsKKyAgICAgICAgICAgICAgICAicHVibGljIGNsYXNzIFRlc3Qge30iOworICAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCA9IHBhcnNlKGNvZGUpOworICAgICAgICBKc29uUHJpbnRlciBwcmludGVyID0gbmV3IEpzb25QcmludGVyKHRydWUpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBwcmludGVyLm91dHB1dCh1bml0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIntcInR5cGVcIjpcIkNvbXBpbGF0aW9uVW5pdFwiLFwidHlwZXNcIjpbe1widHlwZVwiOlwiQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uXCIsXCJpc0ludGVyZmFjZVwiOlwiZmFsc2VcIixcIm5hbWVcIjp7XCJ0eXBlXCI6XCJTaW1wbGVOYW1lXCIsXCJpZGVudGlmaWVyXCI6XCJUZXN0XCJ9LFwiY29tbWVudFwiOntcInR5cGVcIjpcIkJsb2NrQ29tbWVudFwiLFwiY29udGVudFwiOlwiIFxcbiogU29tZSBjb21tZW50XFxuXCJ9fV19Iiwgb3V0cHV0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvUHJldHR5UHJpbnRWaXNpdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvUHJldHR5UHJpbnRWaXNpdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTE2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludFZpc2l0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5DYXN0RXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuQ2xhc3NFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydEVxdWFsc05vRW9sOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFByZXR0eVByaW50VmlzaXRvclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXhpbXVtQ29tbW9uVHlwZVdpdGhvdXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmRlMSA9IEphdmFQYXJzZXIucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50IGFbXSwgYltdIik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50W10iLCB2ZGUxLmdldE1heGltdW1Db21tb25UeXBlKCkuZ2V0KCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmRlMiA9IEphdmFQYXJzZXIucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50W11bXSBhW10sIGJbXSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdW11bXSIsIHZkZTIuZ2V0TWF4aW11bUNvbW1vblR5cGUoKS5nZXQoKS50b1N0cmluZygpKTsKKworICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciB2ZGUzID0gSmF2YVBhcnNlci5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25FeHByKCJpbnRbXVtdIGEsIGJbXSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdW10iLCB2ZGUzLmdldE1heGltdW1Db21tb25UeXBlKCkuZ2V0KCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXhpbXVtQ29tbW9uVHlwZVdpdGhBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgdmRlMSA9IEphdmFQYXJzZXIucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigiaW50IGEgQEZvbyBbXSwgYltdIik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgdmRlMS5nZXRNYXhpbXVtQ29tbW9uVHlwZSgpLmdldCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByIHZkZTIgPSBKYXZhUGFyc2VyLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIoImludFtdQEZvbyBbXSBhW10sIGJbXSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdIEBGb28gW11bXSIsIHZkZTIuZ2V0TWF4aW11bUNvbW1vblR5cGUoKS5nZXQoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwcmludChOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmV0dHlQcmludGVyKCkucHJpbnQobm9kZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludFNpbXBsZUNsYXNzRXhwcigpIHsKKyAgICAgICAgQ2xhc3NFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiRm9vLmNsYXNzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiRm9vLmNsYXNzIiwgcHJpbnQoZXhwcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBcnJheUNsYXNzRXhwcigpIHsKKyAgICAgICAgQ2xhc3NFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiRm9vW10uY2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb29bXS5jbGFzcyIsIHByaW50KGV4cHIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50R2VuZXJpY0NsYXNzRXhwcigpIHsKKyAgICAgICAgQ2xhc3NFeHByIGV4cHIgPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiRm9vPFN0cmluZz4uY2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb288U3RyaW5nPi5jbGFzcyIsIHByaW50KGV4cHIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50U2ltcGxlc3RDbGFzcygpIHsKKyAgICAgICAgTm9kZSBub2RlID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgQSB7fSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEEgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiArIEVPTCwgcHJpbnQobm9kZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBQ2xhc3NXaXRoRmllbGQoKSB7CisgICAgICAgIE5vZGUgbm9kZSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIEEgeyBpbnQgYTsgfSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEEgeyIgKyBFT0wKKyAgICAgICAgICAgICAgICArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICBpbnQgYTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSIgKyBFT0wsIHByaW50KG5vZGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50QVJlY2VpdmVyUGFyYW1ldGVyKCkgeworICAgICAgICBOb2RlIG5vZGUgPSBKYXZhUGFyc2VyLnBhcnNlQm9keURlY2xhcmF0aW9uKCJpbnQgeChATyBYIEEuQi50aGlzLCBpbnQgeSkgeyB9Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50IHgoQE8gWCBBLkIudGhpcywgaW50IHkpIHsiICsgRU9MICsgIn0iLCBwcmludChub2RlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludExhbWJkYUludGVyc2VjdGlvblR5cGVBc3NpZ25tZW50KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICB2b2lkIGYoKSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICBSdW5uYWJsZSByID0gKFJ1bm5hYmxlICYgU2VyaWFsaXphYmxlKSAoKCkgLT4ge30pOyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgciA9IChSdW5uYWJsZSAmIFNlcmlhbGl6YWJsZSkoKSAtPiB7fTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIHIgPSAoUnVubmFibGUgJiBJKSgpIC0+IHt9OyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgIH19IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGN1LmdldFR5cGUoMCkuZ2V0TWVtYmVyKDApOworCisgICAgICAgIGFzc2VydEVxdWFscygiUnVubmFibGUgciA9IChSdW5uYWJsZSAmIFNlcmlhbGl6YWJsZSkgKCgpIC0+IHsiICsgRU9MICsgIn0pOyIsIHByaW50KG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEludGVyc2VjdGlvblR5cGUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gIihSdW5uYWJsZSAmIFNlcmlhbGl6YWJsZSkgKCgpIC0+IHt9KSI7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKGNvZGUpOworICAgICAgICBUeXBlIHR5cGUgPSAoKENhc3RFeHByKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSdW5uYWJsZSAmIFNlcmlhbGl6YWJsZSIsIHByaW50KHR5cGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50TGFtYmRhSW50ZXJzZWN0aW9uVHlwZVJldHVybigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgT2JqZWN0IGYoKSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAmIFNlcmlhbGl6YWJsZSkoYzEsIGMyKSAtPiBjMS5nZXRLZXkoKS5jb21wYXJlVG8oYzIuZ2V0S2V5KCkpOyAiICsgRU9MCisgICAgICAgICAgICAgICAgKyAifX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgY3UuZ2V0VHlwZSgwKS5nZXRNZW1iZXIoMCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAmIFNlcmlhbGl6YWJsZSkgKGMxLCBjMikgLT4gYzEuZ2V0S2V5KCkuY29tcGFyZVRvKGMyLmdldEtleSgpKTsiLCBwcmludChtZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRDbGFzc1dpdGhvdXRKYXZhRG9jQnV0V2l0aENvbW1lbnQoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gU3RyaW5nLmZvcm1hdCgiLyoqIGphdmFkb2MgKi8gcHVibGljIGNsYXNzIEEgeyAlcy8vIHN0dWZmJXN9IiwgRU9MLCBFT0wpOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBpZ25vcmVKYXZhRG9jID0gbmV3IFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKCkuc2V0UHJpbnRKYXZhZG9jKGZhbHNlKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBjdS50b1N0cmluZyhpZ25vcmVKYXZhRG9jKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoInB1YmxpYyBjbGFzcyBBIHslcyAgICAvLyBzdHVmZiVzfSVzIiwgRU9MLCBFT0wsIEVPTCksIGNvbnRlbnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRJbXBvcnRzRGVmYXVsdE9yZGVyKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJpbXBvcnQgeC55Lno7aW1wb3J0IGEuYi5jO2ltcG9ydCBzdGF0aWMgYi5jLmQ7Y2xhc3MgYyB7fSI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gY3UudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm9Fb2woImltcG9ydCB4LnkuejtcbiIgKworICAgICAgICAgICAgICAgICJpbXBvcnQgYS5iLmM7XG4iICsKKyAgICAgICAgICAgICAgICAiaW1wb3J0IHN0YXRpYyBiLmMuZDtcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICJjbGFzcyBjIHtcbiIgKworICAgICAgICAgICAgICAgICJ9XG4iLCBjb250ZW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50SW1wb3J0c09yZGVyZWQoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImltcG9ydCB4LnkuejtpbXBvcnQgYS5iLmM7aW1wb3J0IHN0YXRpYyBiLmMuZDtjbGFzcyBjIHt9IjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24gb3JkZXJJbXBvcnRzID0gbmV3IFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKCkuc2V0T3JkZXJJbXBvcnRzKHRydWUpOworICAgICAgICBTdHJpbmcgY29udGVudCA9IGN1LnRvU3RyaW5nKG9yZGVySW1wb3J0cyk7CisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJpbXBvcnQgc3RhdGljIGIuYy5kO1xuIiArCisgICAgICAgICAgICAgICAgImltcG9ydCBhLmIuYztcbiIgKworICAgICAgICAgICAgICAgICJpbXBvcnQgeC55Lno7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiY2xhc3MgYyB7XG4iICsKKyAgICAgICAgICAgICAgICAifVxuIiwgY29udGVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtdWx0aWxpbmVKYXZhZG9jR2V0c0Zvcm1hdHRlZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3IENvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICBjdS5hZGRDbGFzcygiWCIpLmFkZE1ldGhvZCgiYWJjIikuc2V0SmF2YWRvY0NvbW1lbnQoImxpbmUxXG4gICBsaW5lMiAqXG4gKiBsaW5lMyIpOworCisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJwdWJsaWMgY2xhc3MgWCB7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIC8qKlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKiBsaW5lMVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKiAgIGxpbmUyICpcbiIgKworICAgICAgICAgICAgICAgICIgICAgICogbGluZTNcbiIgKworICAgICAgICAgICAgICAgICIgICAgICovXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHZvaWQgYWJjKCkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICB9XG4iICsKKyAgICAgICAgICAgICAgICAifVxuIiwgY3UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBlbXB0eUphdmFkb2NHZXRzRm9ybWF0dGVkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCk7CisgICAgICAgIGN1LmFkZENsYXNzKCJYIikuYWRkTWV0aG9kKCJhYmMiKS5zZXRKYXZhZG9jQ29tbWVudCgiIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm9Fb2woInB1YmxpYyBjbGFzcyBYIHtcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgLyoqXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAqL1xuIiArCisgICAgICAgICAgICAgICAgIiAgICB2b2lkIGFiYygpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIGN1LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXVsdGlsaW5lSmF2YWRvY1dpdGhMb3RzT2ZFbXB0eUxpbmVzR2V0c0Zvcm1hdHRlZE5lYXRseSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3IENvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICBjdS5hZGRDbGFzcygiWCIpLmFkZE1ldGhvZCgiYWJjIikuc2V0SmF2YWRvY0NvbW1lbnQoIlxuXG5cbiBhYlxuXG5cbiBjZFxuXG5cbiIpOworCisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJwdWJsaWMgY2xhc3MgWCB7XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIC8qKlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKiBhYlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKiBjZFxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgKi9cbiIgKworICAgICAgICAgICAgICAgICIgICAgdm9pZCBhYmMoKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIH1cbiIgKworICAgICAgICAgICAgICAgICJ9XG4iLCBjdS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNpbmdsZWxpbmVKYXZhZG9jR2V0c0Zvcm1hdHRlZCgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gbmV3IENvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICBjdS5hZGRDbGFzcygiWCIpLmFkZE1ldGhvZCgiYWJjIikuc2V0SmF2YWRvY0NvbW1lbnQoImxpbmUxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm9Fb2woInB1YmxpYyBjbGFzcyBYIHtcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgLyoqXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAqIGxpbmUxXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAqL1xuIiArCisgICAgICAgICAgICAgICAgIiAgICB2b2lkIGFiYygpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIGN1LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2luZ2xlbGluZUNvbW1lbnRHZXRzRm9ybWF0dGVkKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCk7CisgICAgICAgIGN1LmFkZENsYXNzKCJYIikuYWRkTWV0aG9kKCJhYmMiKS5zZXRDb21tZW50KG5ldyBMaW5lQ29tbWVudCgiICAgbGluZTEgIFxuICIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHNOb0VvbCgicHVibGljIGNsYXNzIFgge1xuIiArCisgICAgICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAvLyBsaW5lMVxuIiArCisgICAgICAgICAgICAgICAgIiAgICB2b2lkIGFiYygpIHtcbiIgKworICAgICAgICAgICAgICAgICIgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIGN1LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmxvY2tjb21tZW50R2V0c05vRm9ybWF0dGluZygpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgQSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHB1YmxpYyB2b2lkIGhlbGxvV29ybGQoU3RyaW5nIGdyZWV0aW5nLCBTdHJpbmcgbmFtZSkge1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgLy9zZGZzZGZzZGZcbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgICAgICAvL3NkZmRzXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAvKlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZ2ZkZ2ZkZ2ZkZ2ZkZ2ZkXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgKi9cbiIgKworICAgICAgICAgICAgICAgICIgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIpOworCisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJjbGFzcyBBIHtcbiIgKworICAgICAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgICAgICIgICAgcHVibGljIHZvaWQgaGVsbG9Xb3JsZChTdHJpbmcgZ3JlZXRpbmcsIFN0cmluZyBuYW1lKSB7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgIC8vIHNkZnNkZnNkZlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAvLyBzZGZkc1xuIiArCisgICAgICAgICAgICAgICAgIiAgICAvKlxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZ2ZkZ2ZkZ2ZkZ2ZkZ2ZkXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAgKi9cbiIgKworICAgICAgICAgICAgICAgICIgICAgfVxuIiArCisgICAgICAgICAgICAgICAgIn1cbiIsIGN1LnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50ZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjM2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5UZXN0VXRpbHMuYXNzZXJ0RXF1YWxzTm9Fb2w7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgUHJldHR5UHJpbnRlclRlc3QgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJldHR5UHJpbnRGaWVsZChTdHJpbmcgY29kZSkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmV0dHlQcmludGVyKCkucHJpbnQoY3UuZmluZEZpcnN0KEZpZWxkRGVjbGFyYXRpb24uY2xhc3MpLmdldCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwcmV0dHlQcmludFZhcihTdHJpbmcgY29kZSkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmV0dHlQcmludGVyKCkucHJpbnQoY3UuZmluZEFsbChWYXJpYWJsZURlY2xhcmF0aW9uRXhwci5jbGFzcykuZ2V0KDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50aW5nQXJyYXlGaWVsZHMoKSB7CisgICAgICAgIFN0cmluZyBjb2RlOworICAgICAgICBjb2RlID0gImNsYXNzIEEgeyBpbnQgYSwgYltdOyB9IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQgYSwgYltdOyIsIHByZXR0eVByaW50RmllbGQoY29kZSkpOworCisgICAgICAgIGNvZGUgPSAiY2xhc3MgQSB7IGludFtdIGFbXSwgYltdOyB9IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRbXVtdIGEsIGI7IiwgcHJldHR5UHJpbnRGaWVsZChjb2RlKSk7CisKKyAgICAgICAgY29kZSA9ICJjbGFzcyBBIHsgaW50W10gYVtdW10sIGI7IH0iOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdIGFbXVtdLCBiOyIsIHByZXR0eVByaW50RmllbGQoY29kZSkpOworCisgICAgICAgIGNvZGUgPSAiY2xhc3MgQSB7IGludFtdIGEsIGI7IH0iOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdIGEsIGI7IiwgcHJldHR5UHJpbnRGaWVsZChjb2RlKSk7CisKKyAgICAgICAgY29kZSA9ICJjbGFzcyBBIHsgaW50IGFbXSwgYltdOyB9IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRbXSBhLCBiOyIsIHByZXR0eVByaW50RmllbGQoY29kZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRpbmdBcnJheVZhcmlhYmxlcygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGU7CisgICAgICAgIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKCl7IGludCBhLCBiW107IH19IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQgYSwgYltdIiwgcHJldHR5UHJpbnRWYXIoY29kZSkpOworCisgICAgICAgIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKCl7IGludFtdIGFbXSwgYltdOyB9fSI7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50W11bXSBhLCBiIiwgcHJldHR5UHJpbnRWYXIoY29kZSkpOworCisgICAgICAgIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKCl7IGludFtdIGFbXVtdLCBiOyB9fSI7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50W10gYVtdW10sIGIiLCBwcmV0dHlQcmludFZhcihjb2RlKSk7CisKKyAgICAgICAgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oKXsgaW50W10gYSwgYjsgfX0iOworICAgICAgICBhc3NlcnRFcXVhbHMoImludFtdIGEsIGIiLCBwcmV0dHlQcmludFZhcihjb2RlKSk7CisKKyAgICAgICAgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oKXsgaW50IGFbXSwgYltdOyB9fSI7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50W10gYSwgYiIsIHByZXR0eVByaW50VmFyKGNvZGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwcmV0dHlQcmludENvbmZpZ3VyYWJsZShTdHJpbmcgY29kZSkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShjb2RlKTsKKyAgICAgICAgUHJldHR5UHJpbnRlciBwcmludGVyID0gbmV3IFByZXR0eVByaW50ZXIobmV3IFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKCkuc2V0VmlzaXRvckZhY3RvcnkoVGVzdFZpc2l0b3I6Om5ldykpOworICAgICAgICByZXR1cm4gcHJpbnRlci5wcmludChjdS5maW5kRmlyc3QoQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uLmNsYXNzKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludFVzZVRlc3RWaXNpdG9yKCkgeworICAgICAgICBTdHJpbmcgY29kZTsKKyAgICAgICAgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oKXsgaW50IGEsIGJbXTsgfX0iOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBwcmV0dHlQcmludENvbmZpZ3VyYWJsZShjb2RlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmV0dHlDb2x1bW5BbGlnblBhcmFtZXRlcnNfZW5hYmxlZCgpIHsKKyAgICAgICAgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCJcdCIpCisgICAgICAgICAgICAgICAgLnNldENvbHVtbkFsaWduUGFyYW1ldGVycyh0cnVlKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgRU9MID0gY29uZmlnLmdldEVuZE9mTGluZUNoYXJhY3RlcigpOworCisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEV4YW1wbGUgeyB2b2lkIGZvbyhPYmplY3QgYXJnMCxPYmplY3QgYXJnMSl7IG15TWV0aG9kKDEsIDIsIDMsIDUsIE9iamVjdC5jbGFzcyk7IH0gfSI7CisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJjbGFzcyBFeGFtcGxlIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiIiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0dm9pZCBmb28oT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0XHRteU1ldGhvZCgxLCIgKyBFT0wgKworICAgICAgICAgICAgICAgICJcdFx0ICAgICAgICAgMiwiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiXHRcdCAgICAgICAgIDMsIiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0XHQgICAgICAgICA1LCIgKyBFT0wgKworICAgICAgICAgICAgICAgICJcdFx0ICAgICAgICAgT2JqZWN0LmNsYXNzKTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiXHR9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iICsgRU9MICsKKyAgICAgICAgICAgICAgICAiIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBQcmV0dHlQcmludGVyKGNvbmZpZykucHJpbnQocGFyc2UoY29kZSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByZXR0eUNvbHVtbkFsaWduUGFyYW1ldGVyc19kaXNhYmxlZCgpIHsKKyAgICAgICAgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBFT0wgPSBjb25maWcuZ2V0RW5kT2ZMaW5lQ2hhcmFjdGVyKCk7CisKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgRXhhbXBsZSB7IHZvaWQgZm9vKE9iamVjdCBhcmcwLE9iamVjdCBhcmcxKXsgbXlNZXRob2QoMSwgMiwgMywgNSwgT2JqZWN0LmNsYXNzKTsgfSB9IjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gImNsYXNzIEV4YW1wbGUgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIHZvaWQgZm9vKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICAgIG15TWV0aG9kKDEsIDIsIDMsIDUsIE9iamVjdC5jbGFzcyk7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICB9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iICsgRU9MICsKKyAgICAgICAgICAgICAgICAiIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBQcmV0dHlQcmludGVyKGNvbmZpZykucHJpbnQocGFyc2UoY29kZSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByZXR0eUFsaWduTWV0aG9kQ2FsbENoYWluc19lbmFibGVkKCkgeworICAgICAgICBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIlx0IikKKyAgICAgICAgICAgICAgICAuc2V0Q29sdW1uQWxpZ25GaXJzdE1ldGhvZENoYWluKHRydWUpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBFT0wgPSBjb25maWcuZ2V0RW5kT2ZMaW5lQ2hhcmFjdGVyKCk7CisKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgRXhhbXBsZSB7IHZvaWQgZm9vKCkgeyBJbnRTdHJlYW0ucmFuZ2UoMCwgMTApLmZpbHRlcih4IC0+IHggJSAyID09IDApLm1hcCh4IC0+IHggKiBJbnRTdHJlYW0ub2YoMSwzLDUsMSkuc3VtKCkpLmZvckVhY2goU3lzdGVtLm91dDo6cHJpbnRsbik7IH0gfSI7CisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJjbGFzcyBFeGFtcGxlIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiIiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0dm9pZCBmb28oKSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0XHRJbnRTdHJlYW0ucmFuZ2UoMCwgMTApIiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0XHQgICAgICAgICAuZmlsdGVyKHggLT4geCAlIDIgPT0gMCkiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiXHRcdCAgICAgICAgIC5tYXAoeCAtPiB4ICogSW50U3RyZWFtLm9mKDEsIDMsIDUsIDEpIiArIEVPTCArCisgICAgICAgICAgICAgICAgIlx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdW0oKSkiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiXHRcdCAgICAgICAgIC5mb3JFYWNoKFN5c3RlbS5vdXQ6OnByaW50bG4pOyIgKyBFT0wgKworICAgICAgICAgICAgICAgICJcdH0iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIiOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFByZXR0eVByaW50ZXIoY29uZmlnKS5wcmludChwYXJzZShjb2RlKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJldHR5QWxpZ25NZXRob2RDYWxsQ2hhaW5zX2Rpc2FibGVkKCkgeworICAgICAgICBQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIEVPTCA9IGNvbmZpZy5nZXRFbmRPZkxpbmVDaGFyYWN0ZXIoKTsKKworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBFeGFtcGxlIHsgdm9pZCBmb28oKSB7IEludFN0cmVhbS5yYW5nZSgwLCAxMCkuZmlsdGVyKHggLT4geCAlIDIgPT0gMCkubWFwKHggLT4geCAqIEludFN0cmVhbS5vZigxLDMsNSwxKS5zdW0oKSkuZm9yRWFjaChTeXN0ZW0ub3V0OjpwcmludGxuKTsgfSB9IjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gImNsYXNzIEV4YW1wbGUgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIHZvaWQgZm9vKCkgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICAgIEludFN0cmVhbS5yYW5nZSgwLCAxMCkuZmlsdGVyKHggLT4geCAlIDIgPT0gMCkubWFwKHggLT4geCAqIEludFN0cmVhbS5vZigxLCAzLCA1LCAxKS5zdW0oKSkuZm9yRWFjaChTeXN0ZW0ub3V0OjpwcmludGxuKTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIH0iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIiOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFByZXR0eVByaW50ZXIoY29uZmlnKS5wcmludChwYXJzZShjb2RlKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZW51bUNvbnN0YW50c0hvcml6b250YWxseSgpIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2UoImVudW0gWHtBLCBCLCBDLCBELCBFfSIpOworICAgICAgICBhc3NlcnRFcXVhbHNOb0VvbCgiZW51bSBYIHtcblxuICAgIEEsIEIsIEMsIEQsIEVcbn1cbiIsIG5ldyBQcmV0dHlQcmludGVyKCkucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGVudW1Db25zdGFudHNWZXJ0aWNhbGx5KCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZSgiZW51bSBYe0EsIEIsIEMsIEQsIEUsIEZ9Iik7CisgICAgICAgIGFzc2VydEVxdWFsc05vRW9sKCJlbnVtIFgge1xuXG4gICAgQSxcbiAgICBCLFxuICAgIEMsXG4gICAgRCxcbiAgICBFLFxuICAgIEZcbn1cbiIsIG5ldyBQcmV0dHlQcmludGVyKCkucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50aW5nSW5jb25zaXN0ZW50VmFyaWFibGVzKCkgeworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBwYXJzZUJvZHlEZWNsYXJhdGlvbigiaW50IGEsIGI7IikuYXNGaWVsZERlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQgYSwgYjsiLCBmaWVsZERlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGUoMCkuc2V0VHlwZShQcmltaXRpdmVUeXBlLmRvdWJsZVR5cGUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI/Pz8gYSwgYjsiLCBmaWVsZERlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZpZWxkRGVjbGFyYXRpb24uZ2V0VmFyaWFibGUoMSkuc2V0VHlwZShQcmltaXRpdmVUeXBlLmRvdWJsZVR5cGUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb3VibGUgYSwgYjsiLCBmaWVsZERlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1Rlc3RWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9UZXN0VmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmUzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9UZXN0VmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdFZpc2l0b3IgZXh0ZW5kcyBQcmV0dHlQcmludFZpc2l0b3IgeworCisgICAgcHVibGljIFRlc3RWaXNpdG9yKFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIHByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKSB7CisgICAgICAgIHN1cGVyKHByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludCgidGVzdCIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9YbWxQcmludGVyVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvWG1sUHJpbnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ5ODkxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvWG1sUHJpbnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBYbWxQcmludGVyVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFR5cGUoKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKCIxKzEiKTsKKyAgICAgICAgWG1sUHJpbnRlciB4bWxPdXRwdXQgPSBuZXcgWG1sUHJpbnRlcih0cnVlKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0geG1sT3V0cHV0Lm91dHB1dChleHByZXNzaW9uKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjxyb290IHR5cGU9J0JpbmFyeUV4cHInIG9wZXJhdG9yPSdQTFVTJz48bGVmdCB0eXBlPSdJbnRlZ2VyTGl0ZXJhbEV4cHInIHZhbHVlPScxJz48L2xlZnQ+PHJpZ2h0IHR5cGU9J0ludGVnZXJMaXRlcmFsRXhwcicgdmFsdWU9JzEnPjwvcmlnaHQ+PC9yb290PiIsIG91dHB1dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dFR5cGUoKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKCIxKzEiKTsKKworICAgICAgICBYbWxQcmludGVyIHhtbE91dHB1dCA9IG5ldyBYbWxQcmludGVyKGZhbHNlKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0geG1sT3V0cHV0Lm91dHB1dChleHByZXNzaW9uKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjxyb290IG9wZXJhdG9yPSdQTFVTJz48bGVmdCB2YWx1ZT0nMSc+PC9sZWZ0PjxyaWdodCB2YWx1ZT0nMSc+PC9yaWdodD48L3Jvb3Q+Iiwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0KCkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiYSgxLDIpIik7CisKKyAgICAgICAgWG1sUHJpbnRlciB4bWxPdXRwdXQgPSBuZXcgWG1sUHJpbnRlcih0cnVlKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0geG1sT3V0cHV0Lm91dHB1dChleHByZXNzaW9uKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjxyb290IHR5cGU9J01ldGhvZENhbGxFeHByJz48bmFtZSB0eXBlPSdTaW1wbGVOYW1lJyBpZGVudGlmaWVyPSdhJz48L25hbWU+PGFyZ3VtZW50cz48YXJndW1lbnQgdHlwZT0nSW50ZWdlckxpdGVyYWxFeHByJyB2YWx1ZT0nMSc+PC9hcmd1bWVudD48YXJndW1lbnQgdHlwZT0nSW50ZWdlckxpdGVyYWxFeHByJyB2YWx1ZT0nMic+PC9hcmd1bWVudD48L2FyZ3VtZW50cz48L3Jvb3Q+Iiwgb3V0cHV0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvWWFtbFByaW50ZXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9ZYW1sUHJpbnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzVjZDgxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvWWFtbFByaW50ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7DQorDQoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsNCisNCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7DQorDQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuRXhwcmVzc2lvbjsNCisNCitwdWJsaWMgY2xhc3MgWWFtbFByaW50ZXJUZXN0IHsNCisNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhUeXBlKCkgew0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0gIi0tLSIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gInJvb3QoVHlwZT1NZXRob2RDYWxsRXhwcik6ICIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIiAgICBuYW1lKFR5cGU9U2ltcGxlTmFtZSk6ICIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIiAgICAgICAgaWRlbnRpZmllcjogXCJ4XCIiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgYXJndW1lbnRzOiAiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgICAgIC0gYXJndW1lbnQoVHlwZT1JbnRlZ2VyTGl0ZXJhbEV4cHIpOiAiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgICAgICAgICB2YWx1ZTogXCIxXCIiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgICAgIC0gYXJndW1lbnQoVHlwZT1JbnRlZ2VyTGl0ZXJhbEV4cHIpOiAiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgICAgICAgICB2YWx1ZTogXCIxXCIiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIuLi4iOw0KKw0KKyAgICAgICAgWWFtbFByaW50ZXIgeWFtbFByaW50ZXIgPSBuZXcgWWFtbFByaW50ZXIodHJ1ZSk7DQorICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigieCgxLDEpIik7DQorICAgICAgICBTdHJpbmcgb3V0cHV0ID0geWFtbFByaW50ZXIub3V0cHV0KGV4cHJlc3Npb24pOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3V0cHV0LCBvdXRwdXQpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0VHlwZSgpIHsNCisgICAgICAgIFN0cmluZyBleHBlY3RlZE91dHB1dCA9ICItLS0iICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICJyb290OiAiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgb3BlcmF0b3I6IFwiUExVU1wiIiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAiICAgIGxlZnQ6ICIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIiAgICAgICAgdmFsdWU6IFwiMVwiIiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAiICAgIHJpZ2h0OiAiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsNCisgICAgICAgIGV4cGVjdGVkT3V0cHV0ICs9ICIgICAgICAgIHZhbHVlOiBcIjFcIiIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIi4uLiI7DQorDQorICAgICAgICBZYW1sUHJpbnRlciB5YW1sUHJpbnRlciA9IG5ldyBZYW1sUHJpbnRlcihmYWxzZSk7DQorICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBKYXZhUGFyc2VyLnBhcnNlRXhwcmVzc2lvbigiMSsxIik7DQorICAgICAgICBTdHJpbmcgb3V0cHV0ID0geWFtbFByaW50ZXIub3V0cHV0KGV4cHJlc3Npb24pOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3V0cHV0LCBvdXRwdXQpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoQ29sb25Gb2xsb3dlZEJ5U3BhY2VJblZhbHVlKCkgew0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0gIi0tLSIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gInJvb3QoVHlwZT1TdHJpbmdMaXRlcmFsRXhwcik6ICIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIiAgICB2YWx1ZTogXCJhXFxcXDogYlwiIiArIFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7DQorICAgICAgICBleHBlY3RlZE91dHB1dCArPSAiLi4uIjsNCisNCisgICAgICAgIFlhbWxQcmludGVyIHlhbWxQcmludGVyID0gbmV3IFlhbWxQcmludGVyKHRydWUpOw0KKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gSmF2YVBhcnNlci5wYXJzZUV4cHJlc3Npb24oIlwiYVxcXFw6IGJcIiIpOw0KKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHlhbWxQcmludGVyLm91dHB1dChleHByZXNzaW9uKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE91dHB1dCwgb3V0cHV0KTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aENvbG9uRm9sbG93ZWRCeUxpbmVTZXBhcmF0b3JJblZhbHVlKCkgew0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0gIi0tLSIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gInJvb3QoVHlwZT1TdHJpbmdMaXRlcmFsRXhwcik6ICIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIiAgICB2YWx1ZTogXCJhXFxcXDpcXFxcbmJcIiIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgKz0gIi4uLiI7DQorDQorICAgICAgICBZYW1sUHJpbnRlciB5YW1sUHJpbnRlciA9IG5ldyBZYW1sUHJpbnRlcih0cnVlKTsNCisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKCJcImFcXFxcOlxcXFxuYlwiIik7DQorICAgICAgICBTdHJpbmcgb3V0cHV0ID0geWFtbFByaW50ZXIub3V0cHV0KGV4cHJlc3Npb24pOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkT3V0cHV0LCBvdXRwdXQpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg4NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9BYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlRlc3RVdGlscy5yZWFkUmVzb3VyY2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjdTsKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCisgICAgcHJvdGVjdGVkIHZvaWQgY29uc2lkZXJDb2RlKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGN1ID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKEphdmFQYXJzZXIucGFyc2UoY29kZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNvbnNpZGVyRXhwcmVzc2lvbihTdHJpbmcgY29kZSkgeworICAgICAgICBleHByZXNzaW9uID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKEphdmFQYXJzZXIucGFyc2VFeHByZXNzaW9uKGNvZGUpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnNpZGVyRXhhbXBsZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29kZSA9IHJlYWRFeGFtcGxlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWFkRXhhbXBsZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZFJlc291cmNlKCJjb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy8iICsgcmVzb3VyY2VOYW1lICsgIi5qYXZhLnR4dCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFRyYW5zZm9ybWVkKFN0cmluZyBleGFtcGxlTmFtZSwgTm9kZSBub2RlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRDb2RlID0gcmVhZEV4YW1wbGUoZXhhbXBsZU5hbWUgKyAiX2V4cGVjdGVkIik7CisgICAgICAgIFN0cmluZyBhY3R1YWxDb2RlID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KG5vZGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb2RlLCBhY3R1YWxDb2RlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRVbmNoYW5nZWQoU3RyaW5nIGV4YW1wbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29kZSA9IGNvbnNpZGVyRXhhbXBsZShleGFtcGxlTmFtZSArICJfb3JpZ2luYWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvZGUsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSAhPSBudWxsID8gY3UgOiBleHByZXNzaW9uKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZyhTdHJpbmcgZXhwZWN0ZWRQYXJ0aWFsQ29kZSwgTm9kZSBub2RlKSB7CisgICAgICAgIFN0cmluZyBhY3R1YWxDb2RlID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KG5vZGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQYXJ0aWFsQ29kZSwgYWN0dWFsQ29kZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0RpZmZlcmVuY2VUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0RpZmZlcmVuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiOThjMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vRGlmZmVyZW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDQyOCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5QYWNrYWdlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm9ic2VydmVyLk9ic2VydmFibGVQcm9wZXJ0eTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuRXhwcmVzc2lvblN0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLkNvbmNyZXRlU3ludGF4TW9kZWw7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21FbGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWwuQ3NtSW5kZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmNvbmNyZXRlc3ludGF4bW9kZWwuQ3NtVG9rZW47CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21VbmluZGVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLkxleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuVHlwZXMuZW9sVG9rZW5LaW5kOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5UeXBlcy5zcGFjZVRva2VuS2luZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi5EaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50Lio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgRGlmZmVyZW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZURpZmZlcmVuY2VFbXB0eSgpIHsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBhID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGIgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbChDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGEsIGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGlmZi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYWxjdWxhdGVEaWZmZXJlbmNlQUlzRW1wdHkoKSB7CisgICAgICAgIE5vZGUgbjEgPSBuZXcgRmllbGREZWNsYXJhdGlvbigpOworICAgICAgICBOb2RlIG4yID0gbmV3IE1ldGhvZERlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBhID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGIgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbChBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiksCisgICAgICAgICAgICAgICAgbmV3IENzbUNoaWxkKG4xKSwKKyAgICAgICAgICAgICAgICBuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pLAorICAgICAgICAgICAgICAgIG5ldyBDc21DaGlsZChuMikpKTsKKyAgICAgICAgRGlmZmVyZW5jZSBkaWZmID0gRGlmZmVyZW5jZS5jYWxjdWxhdGUoYSwgYik7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBkaWZmLmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTikpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21DaGlsZChuMSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJQQVJFTikpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21DaGlsZChuMikpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhbGN1bGF0ZURpZmZlcmVuY2VCSXNFbXB0eSgpIHsKKyAgICAgICAgTm9kZSBuMSA9IG5ldyBGaWVsZERlY2xhcmF0aW9uKCk7CisgICAgICAgIE5vZGUgbjIgPSBuZXcgTWV0aG9kRGVjbGFyYXRpb24oKTsKKworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGEgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbChBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTiksCisgICAgICAgICAgICAgICAgbmV3IENzbUNoaWxkKG4xKSwKKyAgICAgICAgICAgICAgICBuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SUEFSRU4pLAorICAgICAgICAgICAgICAgIG5ldyBDc21DaGlsZChuMikpKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBiID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICBEaWZmZXJlbmNlIGRpZmYgPSBEaWZmZXJlbmNlLmNhbGN1bGF0ZShhLCBiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGRpZmYuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVtb3ZlZChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21DaGlsZChuMSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlbW92ZWQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVtb3ZlZChuZXcgQ3NtQ2hpbGQobjIpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldCgzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21waWxhdGlvblVuaXRFeGFtcGxlV2l0aFBhY2thZ2VTZXREaWZmKCkgeworICAgICAgICBjb25zaWRlckNvZGUoImNsYXNzIEEge30iKTsKKyAgICAgICAgQ3NtRWxlbWVudCBlbGVtZW50ID0gQ29uY3JldGVTeW50YXhNb2RlbC5mb3JDbGFzcyhjdS5nZXRDbGFzcygpKTsKKyAgICAgICAgUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiA9IG5ldyBQYWNrYWdlRGVjbGFyYXRpb24obmV3IE5hbWUobmV3IE5hbWUoImZvbyIpLCAiYmFyIikpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbU9yaWdpbmFsID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWxlbWVudCwgY3UpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbUNoYW5nZWQgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJQcm9wZXJ0eUNoYW5nZShlbGVtZW50LCBjdSwgT2JzZXJ2YWJsZVByb3BlcnR5LlBBQ0tBR0VfREVDTEFSQVRJT04sIG51bGwsIHBhY2thZ2VEZWNsYXJhdGlvbik7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGRpZmYuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkZWQobmV3IENzbUNoaWxkKHBhY2thZ2VEZWNsYXJhdGlvbikpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGN1LmdldFR5cGUoMCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFubm90YXRpb25EZWNsYXJhdGlvbkV4YW1wbGVXaXRoTW9kaWZpZXJBZGRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxX29yaWdpbmFsIik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENsYXNzKCkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbU9yaWdpbmFsID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21DaGFuZ2VkID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLCBPYnNlcnZhYmxlUHJvcGVydHkuTU9ESUZJRVJTLCBFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcyksIEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKSk7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgZGlmZi5yZW1vdmVJbmRlbnRhdGlvbkVsZW1lbnRzKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBVQkxJQykpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkZWQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSU5URVJGQUNFKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TmFtZSgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxCUkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDEpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigyKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMykpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDQpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig1KSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUkJSQUNFKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBkaWZmLmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFubm90YXRpb25EZWNsYXJhdGlvbkV4YW1wbGVXaXRoTmFtZUNoYW5nZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMV9vcmlnaW5hbCIpOworICAgICAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25EZWNsYXJhdGlvbiljdS5nZXRUeXBlKDApOworICAgICAgICBDc21FbGVtZW50IGVsZW1lbnQgPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRDbGFzcygpKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21PcmlnaW5hbCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGVsZW1lbnQsIGFubm90YXRpb25EZWNsYXJhdGlvbik7CisgICAgICAgIFNpbXBsZU5hbWUgbmV3TmFtZSA9IG5ldyBTaW1wbGVOYW1lKCJOZXdOYW1lIik7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlclByb3BlcnR5Q2hhbmdlKGVsZW1lbnQsIGFubm90YXRpb25EZWNsYXJhdGlvbiwgT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE5hbWUoKSwgbmV3TmFtZSk7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgZGlmZi5yZW1vdmVJbmRlbnRhdGlvbkVsZW1lbnRzKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSU5URVJGQUNFKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TmFtZSgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRlZChuZXcgQ3NtQ2hpbGQobmV3TmFtZSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigxKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMikpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDMpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig0KSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNSkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJCUkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgZGlmZi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uRGVjbGFyYXRpb25FeGFtcGxlV2l0aEphdmFkb2NBZGRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENsYXNzKCkpOworICAgICAgICBKYXZhZG9jQ29tbWVudCBjb21tZW50ID0gbmV3IEphdmFkb2NDb21tZW50KCJDb29sIHRoaXMgYW5ub3RhdGlvbiEiKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21PcmlnaW5hbCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGVsZW1lbnQsIGFubm90YXRpb25EZWNsYXJhdGlvbik7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlclByb3BlcnR5Q2hhbmdlKGVsZW1lbnQsIGFubm90YXRpb25EZWNsYXJhdGlvbiwgT2JzZXJ2YWJsZVByb3BlcnR5LkNPTU1FTlQsIG51bGwsIGNvbW1lbnQpOworICAgICAgICBEaWZmZXJlbmNlIGRpZmYgPSBEaWZmZXJlbmNlLmNhbGN1bGF0ZShjc21PcmlnaW5hbCwgY3NtQ2hhbmdlZCk7CisgICAgICAgIGRpZmYucmVtb3ZlSW5kZW50YXRpb25FbGVtZW50cygpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBVQkxJQykpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5BVCkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5JTlRFUkZBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXROYW1lKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigwKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMSkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDIpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigzKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDUpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGRpZmYuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYW5ub3RhdGlvbkRlY2xhcmF0aW9uRXhhbXBsZVdpdGhKYXZhZG9jUmVtb3ZlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU5X29yaWdpbmFsIik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENsYXNzKCkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbU9yaWdpbmFsID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21DaGFuZ2VkID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLCBPYnNlcnZhYmxlUHJvcGVydHkuQ09NTUVOVCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENvbW1lbnQoKS5nZXQoKSwgbnVsbCk7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgZGlmZi5yZW1vdmVJbmRlbnRhdGlvbkVsZW1lbnRzKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUFVCTElDKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFUKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklOVEVSRkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE5hbWUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigxKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMikpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDMpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig0KSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNSkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJCUkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgZGlmZi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uRGVjbGFyYXRpb25FeGFtcGxlV2l0aE1vZGlmaWVyUmVtb3ZlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENsYXNzKCkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbU9yaWdpbmFsID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21DaGFuZ2VkID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uLCBPYnNlcnZhYmxlUHJvcGVydHkuTU9ESUZJRVJTLCBFbnVtU2V0Lm9mKE1vZGlmaWVyLlBVQkxJQyksIEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSk7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgZGlmZi5yZW1vdmVJbmRlbnRhdGlvbkVsZW1lbnRzKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlbW92ZWQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUFVCTElDKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFUKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklOVEVSRkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE5hbWUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigxKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMikpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDMpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig0KSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNSkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJCUkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgZGlmZi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0VmFsdWVJbkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG1kID0gY29uc2lkZXJBbWQoImludCBmb28oKSBkZWZhdWx0IDEwOyIpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbU9yaWdpbmFsID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUobWQpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbUNoYW5nZWQgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJQcm9wZXJ0eUNoYW5nZShtZCwgT2JzZXJ2YWJsZVByb3BlcnR5LkRFRkFVTFRfVkFMVUUsIG1kLmdldERlZmF1bHRWYWx1ZSgpLCBudWxsKTsKKyAgICAgICAgRGlmZmVyZW5jZSBkaWZmID0gRGlmZmVyZW5jZS5jYWxjdWxhdGUoY3NtT3JpZ2luYWwsIGNzbUNoYW5nZWQpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChtZC5nZXRUeXBlKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKG1kLmdldE5hbWUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLl9ERUZBVUxUKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkKG5ldyBDc21DaGlsZChtZC5nZXREZWZhdWx0VmFsdWUoKS5nZXQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TRU1JQ09MT04pKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGRpZmYuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkZWREZWZhdWx0VmFsdWVJbkFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG1kID0gY29uc2lkZXJBbWQoImludCBmb28oKTsiKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21PcmlnaW5hbCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKG1kKTsKKyAgICAgICAgRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWUgPSBuZXcgSW50ZWdlckxpdGVyYWxFeHByKCgiMTAiKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlclByb3BlcnR5Q2hhbmdlKG1kLCBPYnNlcnZhYmxlUHJvcGVydHkuREVGQVVMVF9WQUxVRSwgbnVsbCwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgRGlmZmVyZW5jZSBkaWZmID0gRGlmZmVyZW5jZS5jYWxjdWxhdGUoY3NtT3JpZ2luYWwsIGNzbUNoYW5nZWQpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChtZC5nZXRUeXBlKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKG1kLmdldE5hbWUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRlZChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkZWQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuX0RFRkFVTFQpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhZGRlZChuZXcgQ3NtQ2hpbGQoZGVmYXVsdFZhbHVlKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNFTUlDT0xPTikpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgZGlmZi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRlZE1vZGlmaWVyVG9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgeworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gY29uc2lkZXJDZCgiQSgpe30iKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21PcmlnaW5hbCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGNkKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21DaGFuZ2VkID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyUHJvcGVydHlDaGFuZ2UoY2QsIE9ic2VydmFibGVQcm9wZXJ0eS5NT0RJRklFUlMsCisgICAgICAgICAgICAgICAgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBFbnVtU2V0Lm9mKE1vZGlmaWVyLlBVQkxJQykpOworICAgICAgICBEaWZmZXJlbmNlIGRpZmYgPSBEaWZmZXJlbmNlLmNhbGN1bGF0ZShjc21PcmlnaW5hbCwgY3NtQ2hhbmdlZCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZGVkKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBVQkxJQykpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWRkZWQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbUNoaWxkKGNkLmdldE5hbWUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoa2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhrZXB0KG5ldyBDc21DaGlsZChjZC5nZXRCb2R5KCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGRpZmYuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjaW5nTmFtZUZvckVudW1Db25zdGFudERlY2xhcmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZWNkID0gY29uc2lkZXJFY2QoIkEiKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuZXdOYW1lID0gbmV3IFNpbXBsZU5hbWUoIkIiKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc21PcmlnaW5hbCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxGb3JOb2RlKGVjZCk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlclByb3BlcnR5Q2hhbmdlKGVjZCwgT2JzZXJ2YWJsZVByb3BlcnR5Lk5BTUUsCisgICAgICAgICAgICAgICAgZWNkLmdldE5hbWUoKSwgbmV3TmFtZSk7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5yZW1vdmVkKG5ldyBDc21DaGlsZChlY2QuZ2V0TmFtZSgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmFkZGVkKG5ldyBDc21DaGlsZChuZXdOYW1lKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBkaWZmLmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ1N0YXRlbWVudFRvRW1wdHlNZXRob2RCb2R5KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oY2hhciBwMSwgaW50IHAyKSB7fSB9IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIFN0YXRlbWVudCBzID0gbmV3IEV4cHJlc3Npb25TdG10KG5ldyBCaW5hcnlFeHByKAorICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjEwIiksIG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjIiKSwgQmluYXJ5RXhwci5PcGVyYXRvci5QTFVTCisgICAgICAgICkpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtT3JpZ2luYWwgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShtLmdldEJvZHkoKS5nZXQoKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlckxpc3RBZGRpdGlvbihtLmdldEJvZHkoKS5nZXQoKSwgT2JzZXJ2YWJsZVByb3BlcnR5LlNUQVRFTUVOVFMsIDAsIHMpOworICAgICAgICBEaWZmZXJlbmNlIGRpZmYgPSBEaWZmZXJlbmNlLmNhbGN1bGF0ZShjc21PcmlnaW5hbCwgY3NtQ2hhbmdlZCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQuYWRkZWQobmV3IENzbUluZGVudCgpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQuYWRkZWQobmV3IENzbUNoaWxkKHMpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQuYWRkZWQobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmFkZGVkKG5ldyBDc21VbmluZGVudCgpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGRpZmYuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWV0aG9kRGVjbGFyYXRpb25SZW1vdmluZ1BhcmFtZXRlcigpIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWQgPSBjb25zaWRlck1kKCJwdWJsaWMgdm9pZCBmb28oZmxvYXQgZil7fSIpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbU9yaWdpbmFsID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUobWQpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbUNoYW5nZWQgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJMaXN0UmVtb3ZhbChtZCwgT2JzZXJ2YWJsZVByb3BlcnR5LlBBUkFNRVRFUlMsIDApOworICAgICAgICBEaWZmZXJlbmNlIGRpZmYgPSBEaWZmZXJlbmNlLmNhbGN1bGF0ZShjc21PcmlnaW5hbCwgY3NtQ2hhbmdlZCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5QVUJMSUMpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KG5ldyBDc21DaGlsZChtZC5nZXRUeXBlKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KG5ldyBDc21DaGlsZChtZC5nZXROYW1lKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQucmVtb3ZlZChuZXcgQ3NtQ2hpbGQobWQuZ2V0UGFyYW1ldGVyKDApKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtQ2hpbGQobWQuZ2V0Qm9keSgpLmdldCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBkaWZmLmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZERlY2xhcmF0aW9uQWRkaW5nUGFyYW1ldGVyKCkgeworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZCA9IGNvbnNpZGVyTWQoInB1YmxpYyB2b2lkIGZvbygpe30iKTsKKyAgICAgICAgUGFyYW1ldGVyIG5ld1BhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIobmV3IEFycmF5VHlwZShQcmltaXRpdmVUeXBlLmludFR5cGUoKSksIG5ldyBTaW1wbGVOYW1lKCJmb28iKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtT3JpZ2luYWwgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShtZCk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlckxpc3RBZGRpdGlvbihtZCwgT2JzZXJ2YWJsZVByb3BlcnR5LlBBUkFNRVRFUlMsIDAsIG5ld1BhcmFtZXRlcik7CisgICAgICAgIERpZmZlcmVuY2UgZGlmZiA9IERpZmZlcmVuY2UuY2FsY3VsYXRlKGNzbU9yaWdpbmFsLCBjc21DaGFuZ2VkKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBVQkxJQykpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQobmV3IENzbUNoaWxkKG1kLmdldFR5cGUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQobmV3IENzbUNoaWxkKG1kLmdldE5hbWUoKSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxQQVJFTikpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5hZGRlZChuZXcgQ3NtQ2hpbGQobmV3UGFyYW1ldGVyKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChuZXcgQ3NtQ2hpbGQobWQuZ2V0Qm9keSgpLmdldCgpKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBkaWZmLmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBjb25zaWRlckFtZChTdHJpbmcgY29kZSkgeworICAgICAgICBjb25zaWRlckNvZGUoIkBpbnRlcmZhY2UgQUQgeyAiICsgY29kZSArICIgfSIpOworICAgICAgICByZXR1cm4gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiljdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkFEIikuZ2V0KCkuZ2V0TWVtYmVyKDApOworICAgIH0KKworICAgIHByaXZhdGUgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zaWRlckNkKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiY2xhc3MgQSB7ICIgKyBjb2RlICsgIiB9Iik7CisgICAgICAgIHJldHVybiAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgY3UuZ2V0VHlwZSgwKS5nZXRNZW1iZXJzKCkuZ2V0KDApOworICAgIH0KKworICAgIHByaXZhdGUgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29uc2lkZXJFY2QoU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJlbnVtIEEgeyAiICsgY29kZSArICIgfSIpOworICAgICAgICByZXR1cm4gKChFbnVtRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgwKSkuZ2V0RW50cmllcygpLmdldCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGNvbnNpZGVyTWQoU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJjbGFzcyBBIHsgIiArIGNvZGUgKyAiIH0iKTsKKyAgICAgICAgcmV0dXJuIChNZXRob2REZWNsYXJhdGlvbikgY3UuZ2V0VHlwZSgwKS5nZXRNZW1iZXJzKCkuZ2V0KDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9MZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlNTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkphdmFkb2NDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qub2JzZXJ2ZXIuT2JzZXJ2YWJsZVByb3BlcnR5OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkV4cHJlc3Npb25TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuQ29uY3JldGVTeW50YXhNb2RlbDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5jb25jcmV0ZXN5bnRheG1vZGVsLkNzbUVsZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIuY29uY3JldGVzeW50YXhtb2RlbC5Dc21Ub2tlbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlRva2VuVHlwZXMuZW9sVG9rZW5LaW5kOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuVG9rZW5UeXBlcy5zcGFjZVRva2VuS2luZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbXBpbGF0aW9uVW5pdEV4YW1wbGVPcmlnaW5hbCgpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJjbGFzcyBBIHt9Iik7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoY3UuZ2V0Q2xhc3MoKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtT3JpZ2luYWwgPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsRm9yTm9kZShlbGVtZW50LCBjdSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjc21PcmlnaW5hbC5lbGVtZW50cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChjdS5nZXRUeXBlKDApKSwgY3NtT3JpZ2luYWwuZWxlbWVudHMuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbU9yaWdpbmFsLmVsZW1lbnRzLmdldCgxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21waWxhdGlvblVuaXRFeGFtcGxlV2l0aFBhY2thZ2VTZXQoKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiY2xhc3MgQSB7fSIpOworICAgICAgICBDc21FbGVtZW50IGVsZW1lbnQgPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGN1LmdldENsYXNzKCkpOworICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gbmV3IFBhY2thZ2VEZWNsYXJhdGlvbihuZXcgTmFtZShuZXcgTmFtZSgiZm9vIiksICJiYXIiKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtQ2hhbmdlZCA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlclByb3BlcnR5Q2hhbmdlKGVsZW1lbnQsIGN1LCBPYnNlcnZhYmxlUHJvcGVydHkuUEFDS0FHRV9ERUNMQVJBVElPTiwgbnVsbCwgcGFja2FnZURlY2xhcmF0aW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNzbUNoYW5nZWQuZWxlbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQocGFja2FnZURlY2xhcmF0aW9uKSwgY3NtQ2hhbmdlZC5lbGVtZW50cy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChjdS5nZXRUeXBlKDApKSwgY3NtQ2hhbmdlZC5lbGVtZW50cy5nZXQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtQ2hhbmdlZC5lbGVtZW50cy5nZXQoMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYW5ub3RhdGlvbkRlY2xhcmF0aW9uTW9kaWZpZXJzRXhhbXBsZU9yaWdpbmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTFfb3JpZ2luYWwiKTsKKyAgICAgICAgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgwKTsKKyAgICAgICAgQ3NtRWxlbWVudCBlbGVtZW50ID0gQ29uY3JldGVTeW50YXhNb2RlbC5mb3JDbGFzcyhhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0Q2xhc3MoKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgY3NtLnJlbW92ZUluZGVudGF0aW9uRWxlbWVudHMoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSU5URVJGQUNFKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE5hbWUoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigwKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDEpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMikpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigzKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDQpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNSkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJCUkFDRSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBjc20uZWxlbWVudHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFubm90YXRpb25EZWNsYXJhdGlvbk1vZGlmaWVyc0V4YW1wbGVNb2RpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxX29yaWdpbmFsIik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENsYXNzKCkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNzbSA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKS5jYWxjdWxhdGVkU3ludGF4TW9kZWxBZnRlclByb3BlcnR5Q2hhbmdlKGVsZW1lbnQsIGFubm90YXRpb25EZWNsYXJhdGlvbiwgT2JzZXJ2YWJsZVByb3BlcnR5Lk1PRElGSUVSUywgRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpLCBFbnVtU2V0Lm9mKE1vZGlmaWVyLlBVQkxJQykpOworICAgICAgICBjc20ucmVtb3ZlSW5kZW50YXRpb25FbGVtZW50cygpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5QVUJMSUMpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuQVQpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuSU5URVJGQUNFKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE5hbWUoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MQlJBQ0UpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigwKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDEpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMikpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigzKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDQpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNSkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlJCUkFDRSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpLCBjc20uZWxlbWVudHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFubm90YXRpb25EZWNsYXJhdGlvbk5hbWVFeGFtcGxlTW9kaWZpZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMV9vcmlnaW5hbCIpOworICAgICAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25EZWNsYXJhdGlvbiljdS5nZXRUeXBlKDApOworICAgICAgICBDc21FbGVtZW50IGVsZW1lbnQgPSBDb25jcmV0ZVN5bnRheE1vZGVsLmZvckNsYXNzKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRDbGFzcygpKTsKKyAgICAgICAgU2ltcGxlTmFtZSBuZXdOYW1lID0gbmV3IFNpbXBsZU5hbWUoIk5ld05hbWUiKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc20gPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJQcm9wZXJ0eUNoYW5nZShlbGVtZW50LCBhbm5vdGF0aW9uRGVjbGFyYXRpb24sIE9ic2VydmFibGVQcm9wZXJ0eS5OQU1FLAorICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXROYW1lKCksIG5ld05hbWUpOworICAgICAgICBjc20ucmVtb3ZlSW5kZW50YXRpb25FbGVtZW50cygpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5BVCksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5JTlRFUkZBQ0UpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChuZXdOYW1lKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxCUkFDRSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDApKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMSkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigyKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDMpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoNCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig1KSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUkJSQUNFKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGNzbS5lbGVtZW50cy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYW5ub3RhdGlvbkRlY2xhcmF0aW9KYXZhZG9jRXhhbXBsZU9yaWdpbmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTNfb3JpZ2luYWwiKTsKKyAgICAgICAgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgwKTsKKyAgICAgICAgQ3NtRWxlbWVudCBlbGVtZW50ID0gQ29uY3JldGVTeW50YXhNb2RlbC5mb3JDbGFzcyhhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0Q2xhc3MoKSk7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWxlbWVudCwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKKyAgICAgICAgY3NtLnJlbW92ZUluZGVudGF0aW9uRWxlbWVudHMoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUFVCTElDKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFUKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklOVEVSRkFDRSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXROYW1lKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigxKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDIpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMykpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig0KSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDUpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgY3NtLmVsZW1lbnRzLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhbm5vdGF0aW9uRGVjbGFyYXRpb0phdmFkb2NFeGFtcGxlQWRkaW5nSmF2YWRvYygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvbkRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCk7CisgICAgICAgIENzbUVsZW1lbnQgZWxlbWVudCA9IENvbmNyZXRlU3ludGF4TW9kZWwuZm9yQ2xhc3MoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldENsYXNzKCkpOworICAgICAgICBKYXZhZG9jQ29tbWVudCBjb21tZW50ID0gbmV3IEphdmFkb2NDb21tZW50KCJDb29sIHRoaXMgYW5ub3RhdGlvbiEiKTsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNhbGN1bGF0ZWRTeW50YXhNb2RlbCBjc20gPSBuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yKCkuY2FsY3VsYXRlZFN5bnRheE1vZGVsQWZ0ZXJQcm9wZXJ0eUNoYW5nZShlbGVtZW50LCBhbm5vdGF0aW9uRGVjbGFyYXRpb24sIE9ic2VydmFibGVQcm9wZXJ0eS5DT01NRU5ULCBudWxsLCBjb21tZW50KTsKKyAgICAgICAgY3NtLnJlbW92ZUluZGVudGF0aW9uRWxlbWVudHMoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUFVCTElDKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihzcGFjZVRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkFUKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLklOVEVSRkFDRSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oc3BhY2VUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXROYW1lKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKHNwYWNlVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcigxKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDIpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRNZW1iZXIoMykpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENzbVRva2VuKGVvbFRva2VuS2luZCgpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ3NtQ2hpbGQoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldE1lbWJlcig0KSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oZW9sVG9rZW5LaW5kKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZChhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0TWVtYmVyKDUpKSwgY3NtLmVsZW1lbnRzLmdldChpKyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDc21Ub2tlbihlb2xUb2tlbktpbmQoKSksIGNzbS5lbGVtZW50cy5nZXQoaSsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ3NtVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgY3NtLmVsZW1lbnRzLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW1wbGVFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVjZCA9IGNvbnNpZGVyRWNkKCJBIik7CisgICAgICAgIExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5DYWxjdWxhdGVkU3ludGF4TW9kZWwgY3NtID0gbmV3IExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvcigpLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEZvck5vZGUoZWNkKTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkKGVjZC5nZXROYW1lKCkpLCBjc20uZWxlbWVudHMuZ2V0KGkrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoaSwgY3NtLmVsZW1lbnRzLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjc21Nb2RlbEFmdGVyQWRkaW5nU3RhdGVtZW50VG9FbXB0eUJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yIGxkYyA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKTsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDMiKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBjdS5nZXRDbGFzc0J5TmFtZSgiTXlSZW5hbWVkQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5nZXRNZXRob2RzQnlOYW1lKCJzZXRBRmllbGQiKS5nZXQoMCk7CisgICAgICAgIFN0YXRlbWVudCBhc3NpZ25TdGF0ZW1lbnQgPSBuZXcgRXhwcmVzc2lvblN0bXQoCisgICAgICAgICAgICAgICAgbmV3IEFzc2lnbkV4cHIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRBY2Nlc3NFeHByKG5ldyBUaGlzRXhwcigpLCJhRmllbGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYW1lRXhwcigiYUZpZWxkIiksCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25FeHByLk9wZXJhdG9yLkFTU0lHTgorICAgICAgICAgICAgICAgICkpOworICAgICAgICBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IuQ2FsY3VsYXRlZFN5bnRheE1vZGVsIGNhbGN1bGF0ZWRTeW50YXhNb2RlbCA9CisgICAgICAgICAgICAgICAgbGRjLmNhbGN1bGF0ZWRTeW50YXhNb2RlbEFmdGVyTGlzdEFkZGl0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uY3JldGVTeW50YXhNb2RlbC5mb3JDbGFzcyhCbG9ja1N0bXQuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YWJsZVByb3BlcnR5LlNUQVRFTUVOVFMsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXIuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25TdGF0ZW1lbnQpOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxCUkFDRSksIGNhbGN1bGF0ZWRTeW50YXhNb2RlbC5lbGVtZW50cy5nZXQoaW5kZXgrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3NtRWxlbWVudC5uZXdsaW5lKCksIGNhbGN1bGF0ZWRTeW50YXhNb2RlbC5lbGVtZW50cy5nZXQoaW5kZXgrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3NtRWxlbWVudC5pbmRlbnQoKSwgY2FsY3VsYXRlZFN5bnRheE1vZGVsLmVsZW1lbnRzLmdldChpbmRleCsrKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNDaGlsZChjYWxjdWxhdGVkU3ludGF4TW9kZWwuZWxlbWVudHMuZ2V0KGluZGV4KyspLCBFeHByZXNzaW9uU3RtdC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3NtRWxlbWVudC5uZXdsaW5lKCksIGNhbGN1bGF0ZWRTeW50YXhNb2RlbC5lbGVtZW50cy5nZXQoaW5kZXgrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ3NtRWxlbWVudC51bmluZGVudCgpLCBjYWxjdWxhdGVkU3ludGF4TW9kZWwuZWxlbWVudHMuZ2V0KGluZGV4KyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpLCBjYWxjdWxhdGVkU3ludGF4TW9kZWwuZWxlbWVudHMuZ2V0KGluZGV4KyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluZGV4LCBjYWxjdWxhdGVkU3ludGF4TW9kZWwuZWxlbWVudHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRpZmZlcmVuY2VBZnRlcmRkaW5nU3RhdGVtZW50VG9FbXB0eUJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yIGxkYyA9IG5ldyBMZXhpY2FsRGlmZmVyZW5jZUNhbGN1bGF0b3IoKTsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDMiKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBjdS5nZXRDbGFzc0J5TmFtZSgiTXlSZW5hbWVkQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5nZXRNZXRob2RzQnlOYW1lKCJzZXRBRmllbGQiKS5nZXQoMCk7CisgICAgICAgIFN0YXRlbWVudCBhc3NpZ25TdGF0ZW1lbnQgPSBuZXcgRXhwcmVzc2lvblN0bXQoCisgICAgICAgICAgICAgICAgbmV3IEFzc2lnbkV4cHIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRBY2Nlc3NFeHByKG5ldyBUaGlzRXhwcigpLCJhRmllbGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYW1lRXhwcigiYUZpZWxkIiksCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25FeHByLk9wZXJhdG9yLkFTU0lHTgorICAgICAgICAgICAgICAgICkpOworICAgICAgICBEaWZmZXJlbmNlIGRpZmYgPSBsZGMuY2FsY3VsYXRlTGlzdEFkZGl0aW9uRGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICBPYnNlcnZhYmxlUHJvcGVydHkuU1RBVEVNRU5UUywKKyAgICAgICAgICAgICAgICBzZXR0ZXIuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIGFzc2lnblN0YXRlbWVudCk7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmtlcHQoQ3NtRWxlbWVudC50b2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkxCUkFDRSkpLCBkaWZmLmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERpZmZlcmVuY2UuRGlmZmVyZW5jZUVsZW1lbnQua2VwdChDc21FbGVtZW50Lm5ld2xpbmUoKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5hZGRlZChDc21FbGVtZW50LmluZGVudCgpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKSk7CisgICAgICAgIGFzc2VydFRydWUoaXNBZGRlZENoaWxkKGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKyksIEV4cHJlc3Npb25TdG10LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmFkZGVkKENzbUVsZW1lbnQubmV3bGluZSgpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50LmFkZGVkKENzbUVsZW1lbnQudW5pbmRlbnQoKSksIGRpZmYuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGlmZmVyZW5jZS5EaWZmZXJlbmNlRWxlbWVudC5rZXB0KENzbUVsZW1lbnQudG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpKSwgZGlmZi5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbmRleCwgZGlmZi5nZXRFbGVtZW50cygpLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQWRkZWRDaGlsZChEaWZmZXJlbmNlLkRpZmZlcmVuY2VFbGVtZW50IGVsZW1lbnQsIENsYXNzPD8gZXh0ZW5kcyBOb2RlPiBjaGlsZENsYXNzKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50LmlzQWRkZWQoKSAmJiBpc0NoaWxkKGVsZW1lbnQuZ2V0RWxlbWVudCgpLCBjaGlsZENsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDaGlsZChDc21FbGVtZW50IGVsZW1lbnQsIENsYXNzPD8gZXh0ZW5kcyBOb2RlPiBjaGlsZENsYXNzKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgTGV4aWNhbERpZmZlcmVuY2VDYWxjdWxhdG9yLkNzbUNoaWxkICYmIGNoaWxkQ2xhc3MuaXNJbnN0YW5jZSgoKExleGljYWxEaWZmZXJlbmNlQ2FsY3VsYXRvci5Dc21DaGlsZCllbGVtZW50KS5nZXRDaGlsZCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29uc2lkZXJFY2QoU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJlbnVtIEEgeyAiICsgY29kZSArICIgfSIpOworICAgICAgICByZXR1cm4gKChFbnVtRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgwKSkuZ2V0RW50cmllcygpLmdldCgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0xleGljYWxQcmVzZXJ2aW5nUHJpbnRlclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vTGV4aWNhbFByZXNlcnZpbmdQcmludGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmRhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL0xleGljYWxQcmVzZXJ2aW5nUHJpbnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNTEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVW5pb25UeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5WaXNpdGFibGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLk5PREVfVEVYVF9EQVRBOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVGVzdFV0aWxzLmFzc2VydEVxdWFsc05vRW9sOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyVGVzdCBleHRlbmRzIEFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0IHsKKyAgICBwcml2YXRlIE5vZGVUZXh0IGdldFRleHRGb3JOb2RlKE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXREYXRhKE5PREVfVEVYVF9EQVRBKTsKKyAgICB9CisKKworICAgIC8vCisgICAgLy8gVGVzdHMgb24gVGV4dE5vZGUgZGVmaW5pdGlvbgorICAgIC8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkRm9yU2ltcGxlc3RDbGFzcygpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJjbGFzcyBBIHt9Iik7CisKKyAgICAgICAgLy8gQ1UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldFRleHRGb3JOb2RlKGN1KS5udW1iZXJPZkVsZW1lbnRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZ2V0VGV4dEZvck5vZGUoY3UpLmdldFRleHRFbGVtZW50KDApIGluc3RhbmNlb2YgQ2hpbGRUZXh0RWxlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLCAoKENoaWxkVGV4dEVsZW1lbnQpZ2V0VGV4dEZvck5vZGUoY3UpLmdldFRleHRFbGVtZW50KDApKS5nZXRDaGlsZCgpKTsKKworICAgICAgICAvLyBDbGFzcworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NBID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGdldFRleHRGb3JOb2RlKGNsYXNzQSkubnVtYmVyT2ZFbGVtZW50cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyIsIGdldFRleHRGb3JOb2RlKGNsYXNzQSkuZ2V0VGV4dEVsZW1lbnQoMCkuZXhwYW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCBnZXRUZXh0Rm9yTm9kZShjbGFzc0EpLmdldFRleHRFbGVtZW50KDEpLmV4cGFuZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgZ2V0VGV4dEZvck5vZGUoY2xhc3NBKS5nZXRUZXh0RWxlbWVudCgyKS5leHBhbmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiICIsIGdldFRleHRGb3JOb2RlKGNsYXNzQSkuZ2V0VGV4dEVsZW1lbnQoMykuZXhwYW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInsiLCBnZXRUZXh0Rm9yTm9kZShjbGFzc0EpLmdldFRleHRFbGVtZW50KDQpLmV4cGFuZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ9IiwgZ2V0VGV4dEZvck5vZGUoY2xhc3NBKS5nZXRUZXh0RWxlbWVudCg1KS5leHBhbmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZ2V0VGV4dEZvck5vZGUoY2xhc3NBKS5nZXRUZXh0RWxlbWVudCg2KS5leHBhbmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBnZXRUZXh0Rm9yTm9kZShjbGFzc0EpLmdldFRleHRFbGVtZW50KDYpIGluc3RhbmNlb2YgVG9rZW5UZXh0RWxlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscyhHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLkVPRiwgKChUb2tlblRleHRFbGVtZW50KWdldFRleHRGb3JOb2RlKGNsYXNzQSkuZ2V0VGV4dEVsZW1lbnQoNikpLmdldFRva2VuS2luZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkRm9yRmllbGQoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEge2ludCBpO30iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNsYXNzQSA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCk7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmQgPSBjbGFzc0EuZ2V0RmllbGRCeU5hbWUoImkiKS5nZXQoKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dChmZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJpbnQiLCAiICIsICJpIiwgIjsiKSwKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLm1hcChUZXh0RWxlbWVudDo6ZXhwYW5kKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkRm9yVmFyaWFibGVEZWNsYXJhdG9yKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHtpbnQgaTt9IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0EgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZkID0gY2xhc3NBLmdldEZpZWxkQnlOYW1lKCJpIikuZ2V0KCk7CisgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvciB2ZCA9IGZkLmdldFZhcmlhYmxlcygpLmdldCgwKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dCh2ZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJpIiksCisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoVGV4dEVsZW1lbnQ6OmV4cGFuZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja05vZGVUZXh0Q3JlYXRlZEZvck1ldGhvZCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7dm9pZCBmb28oaW50IHAxLCBmbG9hdCBwMikgeyB9fSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NBID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWQgPSBjbGFzc0EuZ2V0TWV0aG9kc0J5TmFtZSgiZm9vIikuZ2V0KDApOworICAgICAgICBOb2RlVGV4dCBub2RlVGV4dCA9IExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5nZXRPckNyZWF0ZU5vZGVUZXh0KG1kKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoInZvaWQiLCAiICIsICJmb28iLCAiKCIsICJpbnQgcDEiLCAiLCIsICIgIiwgImZsb2F0IHAyIiwgIikiLCAiICIsICJ7IH0iKSwKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLm1hcChUZXh0RWxlbWVudDo6ZXhwYW5kKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkRm9yTWV0aG9kUGFyYW1ldGVyKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt2b2lkIGZvbyhpbnQgcDEsIGZsb2F0IHAyKSB7IH19IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0EgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZCA9IGNsYXNzQS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCk7CisgICAgICAgIFBhcmFtZXRlciBwMSA9IG1kLmdldFBhcmFtZXRlckJ5TmFtZSgicDEiKS5nZXQoKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dChwMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJpbnQiLCAiICIsICJwMSIpLAorICAgICAgICAgICAgICAgIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc3RyZWFtKCkubWFwKFRleHRFbGVtZW50OjpleHBhbmQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tOb2RlVGV4dENyZWF0ZWRGb3JQcmltaXRpdmVUeXBlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt2b2lkIGZvbyhpbnQgcDEsIGZsb2F0IHAyKSB7IH19IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjbGFzc0EgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZCA9IGNsYXNzQS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCk7CisgICAgICAgIFBhcmFtZXRlciBwMSA9IG1kLmdldFBhcmFtZXRlckJ5TmFtZSgicDEiKS5nZXQoKTsKKyAgICAgICAgVHlwZSB0ID0gcDEuZ2V0VHlwZSgpOworICAgICAgICBOb2RlVGV4dCBub2RlVGV4dCA9IExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5nZXRPckNyZWF0ZU5vZGVUZXh0KHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiaW50IiksCisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoVGV4dEVsZW1lbnQ6OmV4cGFuZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja05vZGVUZXh0Q3JlYXRlZEZvclNpbXBsZUltcG9ydCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiaW1wb3J0IGEuYi5jLkQ7IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGltcCA9IChJbXBvcnREZWNsYXJhdGlvbiljdS5nZXRDaGlsZE5vZGVzKCkuZ2V0KDApOworICAgICAgICBOb2RlVGV4dCBub2RlVGV4dCA9IExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5nZXRPckNyZWF0ZU5vZGVUZXh0KGltcCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJpbXBvcnQiLCAiICIsICJhLmIuYy5EIiwgIjsiLCAiIiksCisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoVGV4dEVsZW1lbnQ6OmV4cGFuZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja05vZGVUZXh0Q3JlYXRlZEdlbmVyaWNUeXBlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHtQYXJzZVJlc3VsdDxUPiByZXN1bHQ7fSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRGaWVsZEJ5TmFtZSgicmVzdWx0IikuZ2V0KCk7CisgICAgICAgIE5vZGUgdCA9IGZpZWxkLmdldENvbW1vblR5cGUoKTsKKyAgICAgICAgTm9kZSB0MiA9IGZpZWxkLmdldFZhcmlhYmxlKDApLmdldFR5cGUoKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dChmaWVsZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJQYXJzZVJlc3VsdCIsICI8IiwgIlQiLCAiPiIsICIgIiwgInJlc3VsdCIsICI7IiksCisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoVGV4dEVsZW1lbnQ6OmV4cGFuZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja05vZGVUZXh0Q3JlYXRlZEFubm90YXRpb25EZWNsYXJhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7IFN0cmluZyBhdXRob3IoKTsgfSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb24gYWQgPSBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkNsYXNzUHJlYW1ibGUiKS5nZXQoKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dChhZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJwdWJsaWMiLCAiICIsICJAIiwgImludGVyZmFjZSIsICIgIiwgIkNsYXNzUHJlYW1ibGUiLCAiICIsICJ7IiwgIiAiLCAiU3RyaW5nIGF1dGhvcigpOyIsICIgIiwgIn0iLCAiIiksCisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoVGV4dEVsZW1lbnQ6OmV4cGFuZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja05vZGVUZXh0Q3JlYXRlZEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7IFN0cmluZyBhdXRob3IoKTsgfSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb24gYWQgPSBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkNsYXNzUHJlYW1ibGUiKS5nZXQoKTsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG1kID0gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbilhZC5nZXRNZW1iZXIoMCk7CisgICAgICAgIE5vZGVUZXh0IG5vZGVUZXh0ID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmdldE9yQ3JlYXRlTm9kZVRleHQobWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiU3RyaW5nIiwgIiAiLCAiYXV0aG9yIiwgIigiLCAiKSIsICI7IiksCisgICAgICAgICAgICAgICAgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zdHJlYW0oKS5tYXAoVGV4dEVsZW1lbnQ6OmV4cGFuZCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja05vZGVUZXh0Q3JlYXRlZEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbldpdGhBcnJheVR5cGUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInB1YmxpYyBAaW50ZXJmYWNlIENsYXNzUHJlYW1ibGUgeyBTdHJpbmdbXSBhdXRob3IoKTsgfSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBBbm5vdGF0aW9uRGVjbGFyYXRpb24gYWQgPSBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkNsYXNzUHJlYW1ibGUiKS5nZXQoKTsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG1kID0gKEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbilhZC5nZXRNZW1iZXIoMCk7CisgICAgICAgIE5vZGVUZXh0IG5vZGVUZXh0ID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmdldE9yQ3JlYXRlTm9kZVRleHQobWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiU3RyaW5nW10iLCAiICIsICJhdXRob3IiLCAiKCIsICIpIiwgIjsiKSwKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLm1hcChUZXh0RWxlbWVudDo6ZXhwYW5kKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uQXJyYXlUeXBlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJwdWJsaWMgQGludGVyZmFjZSBDbGFzc1ByZWFtYmxlIHsgU3RyaW5nW10gYXV0aG9yKCk7IH0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgQW5ub3RhdGlvbkRlY2xhcmF0aW9uIGFkID0gY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCk7CisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBtZCA9IChBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24pYWQuZ2V0TWVtYmVyKDApLmFzQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCk7CisgICAgICAgIFR5cGUgdHlwZSA9IG1kLmdldFR5cGUoKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIlN0cmluZyIsICJbIiwgIl0iKSwKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLm1hcChUZXh0RWxlbWVudDo6ZXhwYW5kKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uV2l0aENvbW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlM19vcmlnaW5hbCIpOworCisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBtZCA9IChBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24pY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCkuZ2V0TWVtYmVyKDUpLmFzQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCk7CisgICAgICAgIE5vZGVUZXh0IG5vZGVUZXh0ID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmdldE9yQ3JlYXRlTm9kZVRleHQobWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiU3RyaW5nW10iLCAiICIsICJyZXZpZXdlcnMiLCAiKCIsICIpIiwgIjsiKSwKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLm1hcChUZXh0RWxlbWVudDo6ZXhwYW5kKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrTm9kZVRleHRDcmVhdGVkQXJyYXlDcmVhdGlvbkxldmVsV2l0aG91dEV4cHJlc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4cHJlc3Npb24oIm5ldyBpbnRbXSIpOworCisgICAgICAgIEFycmF5Q3JlYXRpb25FeHByIGFycmF5Q3JlYXRpb25FeHByID0gKEFycmF5Q3JlYXRpb25FeHByKWV4cHJlc3Npb24uYXNBcnJheUNyZWF0aW9uRXhwcigpOworICAgICAgICBBcnJheUNyZWF0aW9uTGV2ZWwgYXJyYXlDcmVhdGlvbkxldmVsID0gYXJyYXlDcmVhdGlvbkV4cHIuZ2V0TGV2ZWxzKCkuZ2V0KDApOworICAgICAgICBOb2RlVGV4dCBub2RlVGV4dCA9IExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5nZXRPckNyZWF0ZU5vZGVUZXh0KGFycmF5Q3JlYXRpb25MZXZlbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJbIiwgIl0iKSwKKyAgICAgICAgICAgICAgICBub2RlVGV4dC5nZXRFbGVtZW50cygpLnN0cmVhbSgpLm1hcChUZXh0RWxlbWVudDo6ZXhwYW5kKS5maWx0ZXIoZSAtPiAhZS5pc0VtcHR5KCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tOb2RlVGV4dENyZWF0ZWRBcnJheUNyZWF0aW9uTGV2ZWxXaXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeHByZXNzaW9uKCJuZXcgaW50WzEyM10iKTsKKworICAgICAgICBBcnJheUNyZWF0aW9uRXhwciBhcnJheUNyZWF0aW9uRXhwciA9IChBcnJheUNyZWF0aW9uRXhwcilleHByZXNzaW9uLmFzQXJyYXlDcmVhdGlvbkV4cHIoKTsKKyAgICAgICAgQXJyYXlDcmVhdGlvbkxldmVsIGFycmF5Q3JlYXRpb25MZXZlbCA9IGFycmF5Q3JlYXRpb25FeHByLmdldExldmVscygpLmdldCgwKTsKKyAgICAgICAgTm9kZVRleHQgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dChhcnJheUNyZWF0aW9uTGV2ZWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiWyIsICIxMjMiLCAiXSIpLAorICAgICAgICAgICAgICAgIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc3RyZWFtKCkubWFwKFRleHRFbGVtZW50OjpleHBhbmQpLmZpbHRlcihlIC0+ICFlLmlzRW1wdHkoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUZXN0cyBvbiBmaW5kSW5kZW50YXRpb24KKyAgICAvLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaW5kSW5kZW50YXRpb25Gb3JBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb25XaXRob3V0Q29tbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIE5vZGUgbm9kZSA9IGN1LmdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgiQ2xhc3NQcmVhbWJsZSIpLmdldCgpLmdldE1lbWJlcig0KTsKKyAgICAgICAgTGlzdDxUb2tlblRleHRFbGVtZW50PiBpbmRlbnRhdGlvbiA9IExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5maW5kSW5kZW50YXRpb24obm9kZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIgIiwgIiAiLCAiICIpLCBpbmRlbnRhdGlvbi5zdHJlYW0oKS5tYXAoVG9rZW5UZXh0RWxlbWVudDo6ZXhwYW5kKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZpbmRJbmRlbnRhdGlvbkZvckFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbldpdGhDb21tZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTNfb3JpZ2luYWwiKTsKKyAgICAgICAgTm9kZSBub2RlID0gY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCkuZ2V0TWVtYmVyKDUpOworICAgICAgICBMaXN0PFRva2VuVGV4dEVsZW1lbnQ+IGluZGVudGF0aW9uID0gTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmZpbmRJbmRlbnRhdGlvbihub2RlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoIiAiLCAiICIsICIgIiksIGluZGVudGF0aW9uLnN0cmVhbSgpLm1hcChUb2tlblRleHRFbGVtZW50OjpleHBhbmQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGVzdHMgb24gcHJpbnRpbmcKKyAgICAvLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFTdXBlclNpbXBsZUNVV2l0aG91dENoYW5nZXMoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEge30iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvZGUsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU3VwZXJTaW1wbGVDbGFzc1dpdGhBRmllbGRBZGRlZCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7fSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2xhc3NBID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKTsKKyAgICAgICAgY2xhc3NBLmFkZEZpZWxkKCJpbnQiLCAibXlGaWVsZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEEgeyIgKyBFT0wgKyAiICAgIGludCBteUZpZWxkOyIrRU9MKyJ9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGNsYXNzQSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU3VwZXJTaW1wbGVDbGFzc1dpdGhvdXRDaGFuZ2VzKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt9IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhjb2RlLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2ltcGxlQ1VXaXRob3V0Q2hhbmdlcygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgLyphIGNvbW1lbnQqLyBBIHtcdFx0IitFT0wrIiBpbnQgZjsiK0VPTCtFT0wrRU9MKyIgICAgICAgICB2b2lkIGZvbyhpbnQgcCAgKSB7IHJldHVybiAgJ3onICBcdDsgfX0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvZGUsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29kZSwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIGZvbyhpbnQgcCAgKSB7IHJldHVybiAgJ3onICBcdDsgfSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1ldGhvZHNCeU5hbWUoImZvbyIpLmdldCgwKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2ltcGxlQ2xhc3NSZW1vdmluZ0FGaWVsZCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgLyphIGNvbW1lbnQqLyBBIHtcdFx0IitFT0wrIiBpbnQgZjsiK0VPTCtFT0wrRU9MKyIgICAgICAgICB2b2lkIGZvbyhpbnQgcCAgKSB7IHJldHVybiAgJ3onICBcdDsgfX0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGMgPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpOworICAgICAgICBjLmdldE1lbWJlcnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgLyphIGNvbW1lbnQqLyBBIHtcdFx0IisgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICAgICAgICB2b2lkIGZvbyhpbnQgcCAgKSB7IHJldHVybiAgJ3onICBcdDsgfX0iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoYykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2ltcGxlTWV0aG9kQWRkaW5nQVBhcmFtZXRlclRvQU1ldGhvZFdpdGhaZXJvUGFyYW1ldGVycygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKCkge30gfSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCk7CisgICAgICAgIG0uYWRkUGFyYW1ldGVyKCJmbG9hdCIsICJwMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZvaWQgZm9vKGZsb2F0IHAxKSB7fSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChtKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFTaW1wbGVNZXRob2RBZGRpbmdBUGFyYW1ldGVyVG9BTWV0aG9kV2l0aE9uZVBhcmFtZXRlcigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKGNoYXIgcDEpIHt9IH0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbSA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWV0aG9kc0J5TmFtZSgiZm9vIikuZ2V0KDApOworICAgICAgICBtLmFkZFBhcmFtZXRlcigiZmxvYXQiLCAicDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIGZvbyhjaGFyIHAxLCBmbG9hdCBwMikge30iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQobSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2ltcGxlTWV0aG9kUmVtb3ZpbmdBUGFyYW1ldGVyVG9BTWV0aG9kV2l0aE9uZVBhcmFtZXRlcigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKGZsb2F0IHAxKSB7fSB9IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG0gPSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1ldGhvZHNCeU5hbWUoImZvbyIpLmdldCgwKTsKKyAgICAgICAgbS5nZXRQYXJhbWV0ZXJzKCkucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInZvaWQgZm9vKCkge30iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQobSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2ltcGxlTWV0aG9kUmVtb3ZpbmdQYXJhbWV0ZXJPbmVGcm9tTWV0aG9kV2l0aFR3b1BhcmFtZXRlcnMoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyB2b2lkIGZvbyhjaGFyIHAxLCBpbnQgcDIpIHt9IH0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbSA9IGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWV0aG9kc0J5TmFtZSgiZm9vIikuZ2V0KDApOworICAgICAgICBtLmdldFBhcmFtZXRlcnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCBmb28oaW50IHAyKSB7fSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChtKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFTaW1wbGVNZXRob2RSZW1vdmluZ1BhcmFtZXRlclR3b0Zyb21NZXRob2RXaXRoVHdvUGFyYW1ldGVycygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IHZvaWQgZm9vKGNoYXIgcDEsIGludCBwMikge30gfSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCk7CisgICAgICAgIG0uZ2V0UGFyYW1ldGVycygpLnJlbW92ZSgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIGZvbyhjaGFyIHAxKSB7fSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChtKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFTaW1wbGVNZXRob2RBZGRpbmdBU3RhdGVtZW50KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsgdm9pZCBmb28oY2hhciBwMSwgaW50IHAyKSB7fSB9IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIFN0YXRlbWVudCBzID0gbmV3IEV4cHJlc3Npb25TdG10KG5ldyBCaW5hcnlFeHByKAorICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjEwIiksIG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjIiKSwgQmluYXJ5RXhwci5PcGVyYXRvci5QTFVTCisgICAgICAgICkpOworICAgICAgICBOb2RlTGlzdDxTdGF0ZW1lbnQ+IHN0bXRzID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCkuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKTsKKyAgICAgICAgc3RtdHMuYWRkKHMpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZXRob2RzQnlOYW1lKCJmb28iKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCBmb28oY2hhciBwMSwgaW50IHAyKSB7IitFT0wgKworICAgICAgICAgICAgICAgICIgICAgMTAgKyAyOyIrIEVPTCArCisgICAgICAgICAgICAgICAgIn0iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQobSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2ltcGxlSW1wb3J0KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJpbXBvcnQgYS5iLmMuRDsiOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgSW1wb3J0RGVjbGFyYXRpb24gaW1wID0gKEltcG9ydERlY2xhcmF0aW9uKWN1LmdldENoaWxkTm9kZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wb3J0IGEuYi5jLkQ7IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGltcCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBbm90aGVySW1wb3J0KCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIEltcG9ydERlY2xhcmF0aW9uIGltcCA9IChJbXBvcnREZWNsYXJhdGlvbiljdS5nZXRDaGlsZE5vZGVzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsiLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoaW1wKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFTdGF0aWNJbXBvcnQoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlU3RhcnQuKjsiOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgSW1wb3J0RGVjbGFyYXRpb24gaW1wID0gKEltcG9ydERlY2xhcmF0aW9uKWN1LmdldENoaWxkTm9kZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC4qOyIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChpbXApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrQW5uaWRhdGVkVHlwZVBhcmFtZXRlcnNQcmludGluZygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IHByaXZhdGUgZmluYWwgU3RhY2s8SXRlcmF0b3I8VHJpcGxlPj4gaXRzID0gbmV3IFN0YWNrPEl0ZXJhdG9yPFRyaXBsZT4+KCk7IH0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgQSB7IHByaXZhdGUgZmluYWwgU3RhY2s8SXRlcmF0b3I8VHJpcGxlPj4gaXRzID0gbmV3IFN0YWNrPEl0ZXJhdG9yPFRyaXBsZT4+KCk7IH0iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50QVNpbmdsZUNhdGNoKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt7dHJ5IHsgZG9pdCgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge319fSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEEge3t0cnkgeyBkb2l0KCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fX19IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFNdWx0aUNhdGNoKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt7dHJ5IHsgZG9pdCgpOyB9IGNhdGNoIChFeGNlcHRpb24gfCBBc3NlcnRpb25FcnJvciBlKSB7fX19IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgQSB7e3RyeSB7IGRvaXQoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIHwgQXNzZXJ0aW9uRXJyb3IgZSkge319fSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRBU2luZ2xlQ2F0Y2hUeXBlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt7dHJ5IHsgZG9pdCgpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge319fSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKyAgICAgICAgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBpbml0aWFsaXplckRlY2xhcmF0aW9uID0gKEluaXRpYWxpemVyRGVjbGFyYXRpb24pY3UuZ2V0VHlwZSgwKS5nZXRNZW1iZXJzKCkuZ2V0KDApOworICAgICAgICBUcnlTdG10IHRyeVN0bXQgPSAoVHJ5U3RtdClpbml0aWFsaXplckRlY2xhcmF0aW9uLmdldEJvZHkoKS5nZXRTdGF0ZW1lbnRzKCkuZ2V0KDApOworICAgICAgICBDYXRjaENsYXVzZSBjYXRjaENsYXVzZSA9IHRyeVN0bXQuZ2V0Q2F0Y2hDbGF1c2VzKCkuZ2V0KDApOworICAgICAgICBUeXBlIGNhdGNoVHlwZSA9IGNhdGNoQ2xhdXNlLmdldFBhcmFtZXRlcigpLmdldFR5cGUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4Y2VwdGlvbiIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjYXRjaFR5cGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50VW5pb25UeXBlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHt7dHJ5IHsgZG9pdCgpOyB9IGNhdGNoIChFeGNlcHRpb24gfCBBc3NlcnRpb25FcnJvciBlKSB7fX19IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworICAgICAgICBJbml0aWFsaXplckRlY2xhcmF0aW9uIGluaXRpYWxpemVyRGVjbGFyYXRpb24gPSAoSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiljdS5nZXRUeXBlKDApLmdldE1lbWJlcnMoKS5nZXQoMCk7CisgICAgICAgIFRyeVN0bXQgdHJ5U3RtdCA9IChUcnlTdG10KWluaXRpYWxpemVyRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldFN0YXRlbWVudHMoKS5nZXQoMCk7CisgICAgICAgIENhdGNoQ2xhdXNlIGNhdGNoQ2xhdXNlID0gdHJ5U3RtdC5nZXRDYXRjaENsYXVzZXMoKS5nZXQoMCk7CisgICAgICAgIFVuaW9uVHlwZSB1bmlvblR5cGUgPSAoVW5pb25UeXBlKWNhdGNoQ2xhdXNlLmdldFBhcmFtZXRlcigpLmdldFR5cGUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4Y2VwdGlvbiB8IEFzc2VydGlvbkVycm9yIiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KHVuaW9uVHlwZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRQYXJhbWV0ZXJIYXZpbmdVbmlvblR5cGUoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEge3t0cnkgeyBkb2l0KCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiB8IEFzc2VydGlvbkVycm9yIGUpIHt9fX0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisgICAgICAgIEluaXRpYWxpemVyRGVjbGFyYXRpb24gaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiA9IChJbml0aWFsaXplckRlY2xhcmF0aW9uKWN1LmdldFR5cGUoMCkuZ2V0TWVtYmVycygpLmdldCgwKTsKKyAgICAgICAgVHJ5U3RtdCB0cnlTdG10ID0gKFRyeVN0bXQpaW5pdGlhbGl6ZXJEZWNsYXJhdGlvbi5nZXRCb2R5KCkuZ2V0U3RhdGVtZW50cygpLmdldCgwKTsKKyAgICAgICAgQ2F0Y2hDbGF1c2UgY2F0Y2hDbGF1c2UgPSB0cnlTdG10LmdldENhdGNoQ2xhdXNlcygpLmdldCgwKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGNhdGNoQ2xhdXNlLmdldFBhcmFtZXRlcigpOworCisgICAgICAgIGFzc2VydEVxdWFscygiRXhjZXB0aW9uIHwgQXNzZXJ0aW9uRXJyb3IgZSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChwYXJhbWV0ZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50TGFtYmFXaXRoVW50eXBlZFBhcmFtcygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7RnVuY3Rpb248U3RyaW5nLFN0cmluZz4gZiA9IGEgLT4gYTt9IjsKKyAgICAgICAgY29uc2lkZXJDb2RlKGNvZGUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgQSB7RnVuY3Rpb248U3RyaW5nLFN0cmluZz4gZiA9IGEgLT4gYTt9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludEFNb2R1bGVJbmZvU3BlY2lmaWNLZXl3b3JkVXNlZEFzSWRlbnRpZmllcjEoKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiY2xhc3MgbW9kdWxlIHsgfSIpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJtb2R1bGUiKS5nZXQoKS5zZXROYW1lKCJ4eXoiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIHh5eiB7IH0iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50QU1vZHVsZUluZm9TcGVjaWZpY0tleXdvcmRVc2VkQXNJZGVudGlmaWVyMigpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJjbGFzcyB4eXogeyB9Iik7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoInh5eiIpLmdldCgpLnNldE5hbWUoIm1vZHVsZSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgbW9kdWxlIHsgfSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIC8vIElzc3VlIDgyMzogc2V0UGFja2FnZURlY2xhcmF0aW9uIG9uIENVIHN0YXJ0aW5nIHdpdGggYSBjb21tZW50CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWFjdFRvU2V0UGFja2FnZURlY2xhcmF0aW9uT25DdVN0YXJ0aW5nV2l0aENvbW1lbnQoKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiLy8gSGV5LCB0aGlzIGlzIGEgY29tbWVudFxuIiArCisgICAgICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAgICAgIi8vIEFub3RoZXIgb25lXG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiY2xhc3MgQSB7fSIpOworICAgICAgICBjdS5zZXRQYWNrYWdlRGVjbGFyYXRpb24oIm9yZy5qYXZhcGFyc2VyLmxleGljYWxwcmVzZXJ2YXRpb24uZXhhbXBsZXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW50TGFtYmRhSW50ZXJzZWN0aW9uVHlwZUFzc2lnbm1lbnQoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgIHZvaWQgZigpIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgIFJ1bm5hYmxlIHIgPSAoUnVubmFibGUgJiBTZXJpYWxpemFibGUpICgoKSAtPiB7fSk7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICByID0gKFJ1bm5hYmxlICYgU2VyaWFsaXphYmxlKSgpIC0+IHt9OyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICAgciA9IChSdW5uYWJsZSAmIEkpKCkgLT4ge307IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgfX0iOworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvZGUsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpbnRMYW1iZGFJbnRlcnNlY3Rpb25UeXBlUmV0dXJuKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJjbGFzcyBBIHsiICsgRU9MCisgICAgICAgICAgICAgICAgKyAiICBPYmplY3QgZigpIHsiICsgRU9MCisgICAgICAgICAgICAgICAgKyAiICAgIHJldHVybiAoQ29tcGFyYXRvcjxNYXAuRW50cnk8SywgVj4+ICYgU2VyaWFsaXphYmxlKShjMSwgYzIpIC0+IGMxLmdldEtleSgpLmNvbXBhcmVUbyhjMi5nZXRLZXkoKSk7ICIgKyBFT0wKKyAgICAgICAgICAgICAgICArICJ9fSI7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY29kZSwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgLy8gU2VlIGlzc3VlICM4NTUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhbmRsZU92ZXJyaWRlQW5ub3RhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicHVibGljIGNsYXNzIFRlc3RQYWdlIGV4dGVuZHMgUGFnZSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgQE92ZXJyaWRlIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQYWdlKCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKworICAgICAgICBjdS5nZXRUeXBlcygpCisgICAgICAgICAgICAgICAgLmZvckVhY2godHlwZSAtPiB0eXBlLmdldE1lbWJlcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gobWVtYmVyIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2REZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uQnlOYW1lKCJPdmVycmlkZSIpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbi5hZGRBbm5vdGF0aW9uKCJPdmVycmlkZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIEBPdmVycmlkZSgpIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIEBPdmVycmlkZSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGFnZSgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByZXNlcnZlU3BhY2VBc0lzRm9yQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlYWRFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmciKSwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW5hbWVBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZyIpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBU2ltcGxlQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKCJNeVJlbmFtZWRDbGFzcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVhZEV4YW1wbGUoIkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZ19zdGVwMSIpLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRoZUxleGljYWxQcmVzZXJ2YXRpb25TdHJpbmdGb3JBbkFkZGVkTWV0aG9kU2hvdWxkQmVJbmRlbnRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nIik7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkFTaW1wbGVDbGFzcyIpLmdldCgpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoIk15UmVuYW1lZENsYXNzIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIHNldHRlciA9IGN1CisgICAgICAgICAgICAgICAgLmdldENsYXNzQnlOYW1lKCJNeVJlbmFtZWRDbGFzcyIpLmdldCgpCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgic2V0QUZpZWxkIiwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdWJsaWMgdm9pZCBzZXRBRmllbGQoKSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICB9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KHNldHRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkTWV0aG9kVG9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZyIpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBU2ltcGxlQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKCJNeVJlbmFtZWRDbGFzcyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBjdQorICAgICAgICAgICAgICAgIC5nZXRDbGFzc0J5TmFtZSgiTXlSZW5hbWVkQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoInNldEFGaWVsZCIsIE1vZGlmaWVyLlBVQkxJQyk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZWFkRXhhbXBsZSgiQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAyIiksIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nUGFyYW1ldGVyVG9BbkFkZGVkTWV0aG9kSW5BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZyIpOworCisgICAgICAgIGN1LmdldENsYXNzQnlOYW1lKCJBU2ltcGxlQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKCJNeVJlbmFtZWRDbGFzcyIpOworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBjdQorICAgICAgICAgICAgICAgIC5nZXRDbGFzc0J5TmFtZSgiTXlSZW5hbWVkQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoInNldEFGaWVsZCIsIE1vZGlmaWVyLlBVQkxJQyk7CisgICAgICAgIHNldHRlci5hZGRQYXJhbWV0ZXIoImJvb2xlYW4iLCAiYUZpZWxkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZWFkRXhhbXBsZSgiQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAzIiksIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmluZEluZGVudGF0aW9uT2ZFbXB0eU1ldGhvZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAzIik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gc2V0dGVyID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIk15UmVuYW1lZENsYXNzIikuZ2V0KCkKKyAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kc0J5TmFtZSgic2V0QUZpZWxkIikuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLmZpbmRJbmRlbnRhdGlvbihzZXR0ZXIpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZmluZEluZGVudGF0aW9uKHNldHRlci5nZXRCb2R5KCkuZ2V0KCkpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaW5kSW5kZW50YXRpb25PZk1ldGhvZFdpdGhTdGF0ZW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDQiKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBjdS5nZXRDbGFzc0J5TmFtZSgiTXlSZW5hbWVkQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5nZXRNZXRob2RzQnlOYW1lKCJzZXRBRmllbGQiKS5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZmluZEluZGVudGF0aW9uKHNldHRlcikuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5maW5kSW5kZW50YXRpb24oc2V0dGVyLmdldEJvZHkoKS5nZXQoKSkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5maW5kSW5kZW50YXRpb24oc2V0dGVyLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnQoMCkpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdTdGF0ZW1lbnRUb0FuQWRkZWRNZXRob2RJbkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nIik7CisKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkFTaW1wbGVDbGFzcyIpLmdldCgpCisgICAgICAgICAgICAgICAgLnNldE5hbWUoIk15UmVuYW1lZENsYXNzIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIHNldHRlciA9IGN1CisgICAgICAgICAgICAgICAgLmdldENsYXNzQnlOYW1lKCJNeVJlbmFtZWRDbGFzcyIpLmdldCgpCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgic2V0QUZpZWxkIiwgTW9kaWZpZXIuUFVCTElDKTsKKyAgICAgICAgc2V0dGVyLmFkZFBhcmFtZXRlcigiYm9vbGVhbiIsICJhRmllbGQiKTsKKyAgICAgICAgc2V0dGVyLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuYWRkKG5ldyBFeHByZXNzaW9uU3RtdCgKKyAgICAgICAgICAgICAgICBuZXcgQXNzaWduRXhwcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEFjY2Vzc0V4cHIobmV3IFRoaXNFeHByKCksImFGaWVsZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVFeHByKCJhRmllbGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbkV4cHIuT3BlcmF0b3IuQVNTSUdOCisgICAgICAgICAgICAgICAgKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVhZEV4YW1wbGUoIkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZ19zdGVwNCIpLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ1N0YXRlbWVudFRvQW5BZGRlZE1ldGhvZEluQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nRnJvbVN0ZXAzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDMiKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBzZXR0ZXIgPSBjdS5nZXRDbGFzc0J5TmFtZSgiTXlSZW5hbWVkQ2xhc3MiKS5nZXQoKQorICAgICAgICAgICAgICAgIC5nZXRNZXRob2RzQnlOYW1lKCJzZXRBRmllbGQiKS5nZXQoMCk7CisgICAgICAgIHNldHRlci5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmFkZChuZXcgRXhwcmVzc2lvblN0bXQoCisgICAgICAgICAgICAgICAgbmV3IEFzc2lnbkV4cHIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRBY2Nlc3NFeHByKG5ldyBUaGlzRXhwcigpLCJhRmllbGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOYW1lRXhwcigiYUZpZWxkIiksCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25FeHByLk9wZXJhdG9yLkFTU0lHTgorICAgICAgICAgICAgICAgICkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlYWRFeGFtcGxlKCJBU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDQiKSwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub2RlVGV4dEZvck1ldGhvZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXA0Iik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gc2V0dGVyID0gY3UuZ2V0Q2xhc3NCeU5hbWUoIk15UmVuYW1lZENsYXNzIikuZ2V0KCkKKyAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kc0J5TmFtZSgic2V0QUZpZWxkIikuZ2V0KDApOworICAgICAgICBOb2RlVGV4dCBub2RlVGV4dDsKKworICAgICAgICBub2RlVGV4dCA9IGdldFRleHRGb3JOb2RlKHNldHRlcik7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBVQkxJQykpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzQ2hpbGRPZkNsYXNzKFZvaWRUeXBlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNQQUNFKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNDaGlsZE9mQ2xhc3MoU2ltcGxlTmFtZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc0NoaWxkT2ZDbGFzcyhQYXJhbWV0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc1Rva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNQQUNFKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNDaGlsZE9mQ2xhc3MoQmxvY2tTdG10LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbmRleCwgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworCisgICAgICAgIG5vZGVUZXh0ID0gZ2V0VGV4dEZvck5vZGUoc2V0dGVyLmdldEJvZHkoKS5nZXQoKSk7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc1Rva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNOZXdsaW5lKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzQ2hpbGRPZkNsYXNzKEV4cHJlc3Npb25TdG10LmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNOZXdsaW5lKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluZGV4LCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnNpemUoKSk7CisKKyAgICAgICAgbm9kZVRleHQgPSBnZXRUZXh0Rm9yTm9kZShzZXR0ZXIuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKSk7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc0NoaWxkT2ZDbGFzcyhBc3NpZ25FeHByLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNFTUlDT0xPTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXgsIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vZGVUZXh0Rm9yTW9kaWZpZWRNZXRob2QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZ19zdGVwMyIpOworCisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIHNldHRlciA9IGN1LmdldENsYXNzQnlOYW1lKCJNeVJlbmFtZWRDbGFzcyIpLmdldCgpCisgICAgICAgICAgICAgICAgLmdldE1ldGhvZHNCeU5hbWUoInNldEFGaWVsZCIpLmdldCgwKTsKKyAgICAgICAgc2V0dGVyLmdldEJvZHkoKS5nZXQoKS5nZXRTdGF0ZW1lbnRzKCkuYWRkKG5ldyBFeHByZXNzaW9uU3RtdCgKKyAgICAgICAgICAgICAgICBuZXcgQXNzaWduRXhwcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEFjY2Vzc0V4cHIobmV3IFRoaXNFeHByKCksImFGaWVsZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVFeHByKCJhRmllbGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbkV4cHIuT3BlcmF0b3IuQVNTSUdOCisgICAgICAgICAgICAgICAgKSkpOworICAgICAgICBOb2RlVGV4dCBub2RlVGV4dDsKKworICAgICAgICBub2RlVGV4dCA9IGdldFRleHRGb3JOb2RlKHNldHRlcik7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlBVQkxJQykpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzQ2hpbGRPZkNsYXNzKFZvaWRUeXBlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNQQUNFKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNDaGlsZE9mQ2xhc3MoU2ltcGxlTmFtZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5MUEFSRU4pKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc0NoaWxkT2ZDbGFzcyhQYXJhbWV0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc1Rva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuUlBBUkVOKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNQQUNFKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNDaGlsZE9mQ2xhc3MoQmxvY2tTdG10LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbmRleCwgbm9kZVRleHQuZ2V0RWxlbWVudHMoKS5zaXplKCkpOworCisgICAgICAgIG5vZGVUZXh0ID0gZ2V0VGV4dEZvck5vZGUoc2V0dGVyLmdldEJvZHkoKS5nZXQoKSk7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc1Rva2VuKEdlbmVyYXRlZEphdmFQYXJzZXJDb25zdGFudHMuTEJSQUNFKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNOZXdsaW5lKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzQ2hpbGRPZkNsYXNzKEV4cHJlc3Npb25TdG10LmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNOZXdsaW5lKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5TUEFDRSkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuZ2V0KGluZGV4KyspLmlzVG9rZW4oR2VuZXJhdGVkSmF2YVBhcnNlckNvbnN0YW50cy5SQlJBQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluZGV4LCBub2RlVGV4dC5nZXRFbGVtZW50cygpLnNpemUoKSk7CisKKyAgICAgICAgbm9kZVRleHQgPSBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuZ2V0T3JDcmVhdGVOb2RlVGV4dChzZXR0ZXIuZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudCgwKSk7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlVGV4dC5nZXRFbGVtZW50cygpLmdldChpbmRleCsrKS5pc0NoaWxkT2ZDbGFzcyhBc3NpZ25FeHByLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZVRleHQuZ2V0RWxlbWVudHMoKS5nZXQoaW5kZXgrKykuaXNUb2tlbihHZW5lcmF0ZWRKYXZhUGFyc2VyQ29uc3RhbnRzLlNFTUlDT0xPTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXgsIG5vZGVUZXh0LmdldEVsZW1lbnRzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaXNzdWUgIzkyNgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkQVNlY29uZFN0YXRlbWVudFRvRXhpc3RpbmdNZXRob2QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIk1ldGhvZFdpdGhPbmVTdGF0ZW1lbnQiKTsKKworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGN1LmdldFR5cGUoMCkuZ2V0TWV0aG9kc0J5TmFtZSgic29tZU1ldGhvZCIpLmdldCgwKTsKKyAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLmdldCgpLmdldFN0YXRlbWVudHMoKS5hZGQobmV3IEV4cHJlc3Npb25TdG10KAorICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZURlY2xhcmF0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFQYXJzZXIucGFyc2VDbGFzc09ySW50ZXJmYWNlVHlwZSgiU3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0MiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdMaXRlcmFsRXhwcigiIikpKQorICAgICAgICApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdWJsaWMgdm9pZCBzb21lTWV0aG9kKCkgeyIgKyBFT0wKKyAgICAgICAgICAgICAgICArICIgICAgICAgIFN0cmluZyB0ZXN0ID0gXCJcIjsiICsgRU9MCisgICAgICAgICAgICAgICAgKyAiICAgICAgICBTdHJpbmcgdGVzdDIgPSBcIlwiOyIgKyBFT0wKKyAgICAgICAgICAgICAgICArICIgICAgfSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChtZXRob2REZWNsYXJhdGlvbikpOworICAgIH0KKworICAgIC8vIFNlZSBpc3N1ZSAjODY2CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtb3ZlT3ZlcnJpZGVBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicHVibGljIGNsYXNzIFRlc3RQYWdlIGV4dGVuZHMgUGFnZSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIEBPdmVycmlkZSB2b2lkIGluaXRpYWxpemVQYWdlKCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKworICAgICAgICBjdS5nZXRUeXBlcygpCisgICAgICAgICAgICAgICAgLmZvckVhY2godHlwZSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0TWVtYmVycygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gobWVtYmVyIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmlmTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kRGVjbGFyYXRpb24gLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25CeU5hbWUoIk92ZXJyaWRlIikuaXNQcmVzZW50KCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtZXRob2REZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpLmlzTm9uRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRXhwciBhbm5vdGF0aW9uRXhwciA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25zKCkuZ2V0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRXhwci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbi5hZGRNYXJrZXJBbm5vdGF0aW9uKCJPdmVycmlkZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdWJsaWMgY2xhc3MgVGVzdFBhZ2UgZXh0ZW5kcyBQYWdlIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBAT3ZlcnJpZGUiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBhZ2UoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgLy8gU2VlIGlzc3VlICM4NjYKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1vdmVPckFkZE92ZXJyaWRlQW5ub3RhdGlvbnMoKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCBAT3ZlcnJpZGUgdm9pZCBpbml0aWFsaXplUGFnZSgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5zZXR1cChjdSk7CisKKyAgICAgICAgY3UuZ2V0VHlwZXMoKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKHR5cGUgLT4geworICAgICAgICAgICAgICAgICAgICB0eXBlLmdldE1lbWJlcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG1lbWJlciAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uQnlOYW1lKCJPdmVycmlkZSIpLmlzUHJlc2VudCgpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWV0aG9kRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbnMoKS5pc05vbkVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkV4cHIgYW5ub3RhdGlvbkV4cHIgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9ucygpLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkV4cHIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRGVjbGFyYXRpb24uYWRkTWFya2VyQW5ub3RhdGlvbigiT3ZlcnJpZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIEBPdmVycmlkZSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBAT3ZlcnJpZGUiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBhZ2UoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgLy8gU2VlIGlzc3VlICM4NjUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhbmRsZUFkZGluZ01hcmtlckFubm90YXRpb24oKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIEBPdmVycmlkZSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGFnZSgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5zZXR1cChjdSk7CisKKyAgICAgICAgY3UuZ2V0VHlwZXMoKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKHR5cGUgLT4geworICAgICAgICAgICAgICAgICAgICB0eXBlLmdldE1lbWJlcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG1lbWJlciAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWV0aG9kRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbkJ5TmFtZSgiT3ZlcnJpZGUiKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLmFkZE1hcmtlckFubm90YXRpb24oIk92ZXJyaWRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdWJsaWMgY2xhc3MgVGVzdFBhZ2UgZXh0ZW5kcyBQYWdlIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBAT3ZlcnJpZGUiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIHZvaWQgdGVzdCgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgQE92ZXJyaWRlIiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQYWdlKCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSIsIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5wcmludChjdSkpOworICAgIH0KKworICAgIC8vIFNlZSBpc3N1ZSAjODY1CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVPdmVycmlkZU1hcmtlckFubm90YXRpb24oKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gInB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIHRlc3QoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQYWdlKCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKworICAgICAgICBjdS5nZXRUeXBlcygpCisgICAgICAgICAgICAgICAgLmZvckVhY2godHlwZSAtPiB0eXBlLmdldE1lbWJlcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gobWVtYmVyIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmlmTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kRGVjbGFyYXRpb24gLT4gbWV0aG9kRGVjbGFyYXRpb24uYWRkTWFya2VyQW5ub3RhdGlvbigiT3ZlcnJpZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBjbGFzcyBUZXN0UGFnZSBleHRlbmRzIFBhZ2UgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIEBPdmVycmlkZSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBAT3ZlcnJpZGUiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBhZ2UoKSB7fSIgKyBFT0wgKworICAgICAgICAgICAgICAgICJ9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgLy8gU2VlIGlzc3VlICM4NjUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhbmRsZU92ZXJyaWRlQW5ub3RhdGlvbkFsdGVybmF0aXZlKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJwdWJsaWMgY2xhc3MgVGVzdFBhZ2UgZXh0ZW5kcyBQYWdlIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGFnZSgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iOworCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5zZXR1cChjdSk7CisKKyAgICAgICAgY3UuZ2V0VHlwZXMoKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKHR5cGUgLT4gdHlwZS5nZXRNZW1iZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG1lbWJlciAtPiAgbWVtYmVyLmlmTWV0aG9kRGVjbGFyYXRpb24obWV0aG9kRGVjbGFyYXRpb24gLT4gbWV0aG9kRGVjbGFyYXRpb24uYWRkQW5ub3RhdGlvbigiT3ZlcnJpZGUiKSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdWJsaWMgY2xhc3MgVGVzdFBhZ2UgZXh0ZW5kcyBQYWdlIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBAT3ZlcnJpZGUoKSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0KCkge30iICsgRU9MICsKKyAgICAgICAgICAgICAgICBFT0wgKworICAgICAgICAgICAgICAgICIgICBAT3ZlcnJpZGUoKSIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGFnZSgpIHt9IiArIEVPTCArCisgICAgICAgICAgICAgICAgIn0iLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGludm9rZU1vZGlmaWVyVmlzaXRvcigpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgT2JqZWN0IGYoKSB7IiArIEVPTAorICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gKENvbXBhcmF0b3I8TWFwLkVudHJ5PEssIFY+PiAmIFNlcmlhbGl6YWJsZSkoYzEsIGMyKSAtPiBjMS5nZXRLZXkoKS5jb21wYXJlVG8oYzIuZ2V0S2V5KCkpOyAiICsgRU9MCisgICAgICAgICAgICAgICAgKyAifX0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGNvZGUpOworICAgICAgICBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIuc2V0dXAoY3UpOworICAgICAgICBjdS5hY2NlcHQobmV3IE1vZGlmaWVyVmlzaXRvcjw+KCksIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFuZGxlRGVwcmVjYXRlZEFubm90YXRpb25GaW5hbENsYXNzKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJwdWJsaWMgZmluYWwgY2xhc3MgQSB7fSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKworICAgICAgICBjdS5nZXRUeXBlcygpLmZvckVhY2godHlwZSAtPiB0eXBlLmFkZEFuZEdldEFubm90YXRpb24oRGVwcmVjYXRlZC5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQERlcHJlY2F0ZWQoKSIgKyBFT0wgKworICAgICAgICAgICAgICAgICJwdWJsaWMgZmluYWwgY2xhc3MgQSB7fSIgLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFuZGxlRGVwcmVjYXRlZEFubm90YXRpb25BYnN0cmFjdENsYXNzKCkgeworICAgICAgICBTdHJpbmcgY29kZSA9ICJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQSB7fSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKworICAgICAgICBjdS5nZXRUeXBlcygpLmZvckVhY2godHlwZSAtPiB0eXBlLmFkZEFuZEdldEFubm90YXRpb24oRGVwcmVjYXRlZC5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQERlcHJlY2F0ZWQoKSIgKyBFT0wgKworICAgICAgICAgICAgICAgICJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQSB7fSIgLCBMZXhpY2FsUHJlc2VydmluZ1ByaW50ZXIucHJpbnQoY3UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzc3VlMTI0NCgpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAicHVibGljIGNsYXNzIEZvbyB7IiArIEVPTCArIEVPTAorICAgICAgICAgICAgICAgICsgIi8vIFNvbWUgY29tbWVudCIgKyBFT0wgKyBFT0wgLy8gZG9lcyB3b3JrIHdpdGggb25seSBvbmUgXG4KKyAgICAgICAgICAgICAgICArICJwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKCkge30iICsgRU9MICsgIn0iOworICAgICAgICBDb21waWxhdGlvblVuaXQgb3JpZ2luYWxDdSA9IEphdmFQYXJzZXIucGFyc2UoY29kZSk7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IExleGljYWxQcmVzZXJ2aW5nUHJpbnRlci5zZXR1cChvcmlnaW5hbEN1KTsKKworICAgICAgICBjdS5maW5kQWxsKENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbi5jbGFzcykuc3RyZWFtKCkuZm9yRWFjaChjIC0+IHsKKyAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBjLmdldE1ldGhvZHNCeU5hbWUoIndyaXRlRXh0ZXJuYWwiKTsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kIDogbWV0aG9kcykgeworICAgICAgICAgICAgICAgIGMucmVtb3ZlKG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHNOb0VvbCgicHVibGljIGNsYXNzIEZvbyB7XG4iICsKKyAgICAgICAgICAgICAgICAiLy8gU29tZSBjb21tZW50XG5cbiIgKworICAgICAgICAgICAgICAgICJ9IiwgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnByaW50KGN1KSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFkZEZvb0NhbGxNb2RpZmllclZpc2l0b3IgZXh0ZW5kcyBNb2RpZmllclZpc2l0b3I8Vm9pZD4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpc2l0YWJsZSB2aXNpdChNZXRob2RDYWxsRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgLy8gQWRkIGEgY2FsbCB0byBmb28oKSBvbiBldmVyeSBmb3VuZCBtZXRob2QgY2FsbAorICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RDYWxsRXhwcihuLCAiZm9vIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZWUgaXNzdWUgMTI3NworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1vZGlmaWVyVmlzaXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb2RlID0gImNsYXNzIEEgeyIgKyBFT0wgKworICAgICAgICAgICAgICAgICIgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZSA9IFwiaGVsbG9cIjsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgdm9pZCBiYXIoKSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiaGVsbG9cIik7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIH0iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKyAgICAgICAgY3UuYWNjZXB0KG5ldyBBZGRGb29DYWxsTW9kaWZpZXJWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDYWxsTW9kaWZpZXJWaXNpdG9yIGV4dGVuZHMgTW9kaWZpZXJWaXNpdG9yPFZvaWQ+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaXNpdGFibGUgdmlzaXQoTWV0aG9kQ2FsbEV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgICAgIC8vIEFkZCBhIGNhbGwgdG8gZm9vKCkgb24gZXZlcnkgZm91bmQgbWV0aG9kIGNhbGwKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWV0aG9kQ2FsbEV4cHIobi5jbG9uZSgpLCAiZm9vIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGludm9rZU1vZGlmaWVyVmlzaXRvcklzc3VlMTI5NygpIHsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSAiY2xhc3MgQSB7IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIHB1YmxpYyB2b2lkIGJhcigpIHsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKTsiICsgRU9MICsKKyAgICAgICAgICAgICAgICAiICAgICAvLyBjb21tZW50IiArIEVPTCArCisgICAgICAgICAgICAgICAgIiAgIH0iICsgRU9MICsKKyAgICAgICAgICAgICAgICAifSI7CisKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShjb2RlKTsKKyAgICAgICAgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLnNldHVwKGN1KTsKKyAgICAgICAgY3UuYWNjZXB0KG5ldyBDYWxsTW9kaWZpZXJWaXNpdG9yKCksIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi9UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4OWRkMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb247CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuVmFyaWFibGVEZWNsYXJhdG9yOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuTnVsbExpdGVyYWxFeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5SZXR1cm5TdG10OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5BcnJheVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCisvKioKKyAqIFRoZXNlIHRlc3RzIGFyZSBtb3JlICJoaWdoIGxldmVsIiB0aGFuIHRoZSBvbmVzIGluIExleGljYWxQcmVzZXJ2aW5nUHJpbnRlclRlc3QuCisgKiBUaGUgaWRlYSBpcyB0byBwZXJmb3JtIHNvbWUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBjb2RlLCBwcmludCBpdCBiYWNrIGFuZCBzZWUgaWYgdGhlIGdlbmVyYXRlZCBjb2RlCisgKiBpcyB0aGUgZXhwZWN0ZWQgb25lLiBXZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgTGV4aWNhbFByZXNlcnZpbmdQcmludGVyLCBqdXN0IHRoZSB2aXNpYmxlIHJlc3VsdC4KKyAqLworcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uc1Rlc3QgZXh0ZW5kcyAgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB1bmNoYW5nZWRTaW1wbGVDbGFzc2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VW5jaGFuZ2VkKCJFeGFtcGxlMSIpOworICAgICAgICBhc3NlcnRVbmNoYW5nZWQoIkV4YW1wbGUyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB1bmNoYW5nZWRDb21wbGV4RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFVuY2hhbmdlZCgiRXhhbXBsZTQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGUxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJFeGFtcGxlMV9vcmlnaW5hbCIpOworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJhIikuZ2V0KCkuc2V0TW9kaWZpZXJzKEVudW1TZXQub2YoTW9kaWZpZXIuU1RBVElDKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlMSIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGUyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJFeGFtcGxlMl9vcmlnaW5hbCIpOworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJhIikuZ2V0KCkuZ2V0VmFyaWFibGUoMCkuc2V0SW5pdGlhbGl6ZXIoIjEwIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlMiIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGUzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJFeGFtcGxlM19vcmlnaW5hbCIpOworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJhIikuZ2V0KCkuZ2V0VmFyaWFibGUoMCkuc2V0SW5pdGlhbGl6ZXIoKEV4cHJlc3Npb24pIG51bGwpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiRXhhbXBsZTMiLCBjdSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBleGFtcGxlNSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiRXhhbXBsZTVfb3JpZ2luYWwiKTsKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRGaWVsZEJ5TmFtZSgiYSIpLmdldCgpLmdldFZhcmlhYmxlKDApLnNldEluaXRpYWxpemVyKG5ldyBOdWxsTGl0ZXJhbEV4cHIoKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlNSIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGU2KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJFeGFtcGxlNl9vcmlnaW5hbCIpOworICAgICAgICBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldEZpZWxkQnlOYW1lKCJhIikuZ2V0KCkuZ2V0VmFyaWFibGUoMCkuc2V0TmFtZSgic29tZU90aGVyTmFtZSIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiRXhhbXBsZTYiLCBjdSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBleGFtcGxlNygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiRXhhbXBsZTdfb3JpZ2luYWwiKTsKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRGaWVsZEJ5TmFtZSgiYSIpLmdldCgpLmdldFZhcmlhYmxlKDApLnNldFR5cGUobmV3IEFycmF5VHlwZShQcmltaXRpdmVUeXBlLmludFR5cGUoKSkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiRXhhbXBsZTciLCBjdSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBleGFtcGxlOCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiRXhhbXBsZThfb3JpZ2luYWwiKTsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmZCA9IChGaWVsZERlY2xhcmF0aW9uKSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1lbWJlcigwKS5hc0ZpZWxkRGVjbGFyYXRpb24oKTsKKyAgICAgICAgZmQuYWRkVmFyaWFibGUobmV3IFZhcmlhYmxlRGVjbGFyYXRvcihQcmltaXRpdmVUeXBlLmludFR5cGUoKSwgImIiKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlOCIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGU5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJFeGFtcGxlOV9vcmlnaW5hbCIpOworICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZkID0gKEZpZWxkRGVjbGFyYXRpb24pIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzRmllbGREZWNsYXJhdGlvbigpOworICAgICAgICBmZC5hZGRWYXJpYWJsZShuZXcgVmFyaWFibGVEZWNsYXJhdG9yKG5ldyBBcnJheVR5cGUoUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCkpLCAiYiIpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWQoIkV4YW1wbGU5IiwgY3UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXhhbXBsZTEwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJFeGFtcGxlMTBfb3JpZ2luYWwiKTsKKyAgICAgICAgY3UuZ2V0Q2xhc3NCeU5hbWUoIkEiKS5nZXQoKS5nZXRNZW1iZXJzKCkucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiRXhhbXBsZTEwIiwgY3UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXhhbXBsZVBhcmFtMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiRXhhbXBsZV9wYXJhbTFfb3JpZ2luYWwiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgbWQuYWRkUGFyYW1ldGVyKCJpbnQiLCAicDEiKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWQoIkV4YW1wbGVfcGFyYW0xIiwgY3UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXhhbXBsZVBhcmFtMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiRXhhbXBsZV9wYXJhbTFfb3JpZ2luYWwiKTsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWQgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGN1LmdldENsYXNzQnlOYW1lKCJBIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzTWV0aG9kRGVjbGFyYXRpb24oKTsKKyAgICAgICAgbWQuYWRkUGFyYW1ldGVyKG5ldyBBcnJheVR5cGUoUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCkpLCAicDEiKTsKKyAgICAgICAgbWQuYWRkUGFyYW1ldGVyKCJjaGFyIiwgInAyIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlX3BhcmFtMiIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGVQYXJhbTMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkV4YW1wbGVfcGFyYW0zX29yaWdpbmFsIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1lbWJlcigwKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIG1kLmdldFBhcmFtZXRlcnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlX3BhcmFtMyIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGVQYXJhbTQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkV4YW1wbGVfcGFyYW0zX29yaWdpbmFsIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1lbWJlcigwKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIG1kLmdldFBhcmFtZXRlcnMoKS5yZW1vdmUoMSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJFeGFtcGxlX3BhcmFtNCIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4YW1wbGVQYXJhbTUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkV4YW1wbGVfcGFyYW0zX29yaWdpbmFsIik7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBjdS5nZXRDbGFzc0J5TmFtZSgiQSIpLmdldCgpLmdldE1lbWJlcigwKS5hc01ldGhvZERlY2xhcmF0aW9uKCk7CisgICAgICAgIG1kLnNldFR5cGUoUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiRXhhbXBsZV9wYXJhbTViIiwgY3UpOworICAgICAgICBtZC5nZXRCb2R5KCkuZ2V0KCkuZ2V0U3RhdGVtZW50cygpLmFkZChuZXcgUmV0dXJuU3RtdChuZXcgTmFtZUV4cHIoInAxIikpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWQoIkV4YW1wbGVfcGFyYW01IiwgY3UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9BcnJheUNyZWF0aW9uTGV2ZWxUcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvQXJyYXlDcmVhdGlvbkxldmVsVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2ZmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvQXJyYXlDcmVhdGlvbkxldmVsVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24udHJhbnNmb3JtYXRpb25zLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQXJyYXlDcmVhdGlvbkxldmVsOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFycmF5Q3JlYXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc2Zvcm1pbmcgQXJyYXlDcmVhdGlvbkxldmVsIGFuZCB2ZXJpZnlpbmcgdGhlIExleGljYWxQcmVzZXJ2YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheUNyZWF0aW9uTGV2ZWxUcmFuc2Zvcm1hdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgcHJvdGVjdGVkIEFycmF5Q3JlYXRpb25MZXZlbCBjb25zaWRlcihTdHJpbmcgY29kZSkgeworICAgICAgICBjb25zaWRlckV4cHJlc3Npb24oIm5ldyBpbnQiICsgY29kZSk7CisgICAgICAgIEFycmF5Q3JlYXRpb25FeHByIGFycmF5Q3JlYXRpb25FeHByID0gZXhwcmVzc2lvbi5hc0FycmF5Q3JlYXRpb25FeHByKCk7CisgICAgICAgIHJldHVybiBhcnJheUNyZWF0aW9uRXhwci5nZXRMZXZlbHMoKS5nZXQoMCk7CisgICAgfQorCisgICAgLy8gRGltZW5zaW9uCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ0RpbWVuc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5Q3JlYXRpb25MZXZlbCBpdCA9IGNvbnNpZGVyKCJbXSIpOworICAgICAgICBpdC5zZXREaW1lbnNpb24obmV3IEludGVnZXJMaXRlcmFsRXhwcigiMTAiKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoIlsxMF0iLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ0RpbWVuc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5Q3JlYXRpb25MZXZlbCBpdCA9IGNvbnNpZGVyKCJbMTBdIik7CisgICAgICAgIGl0LnJlbW92ZURpbWVuc2lvbigpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJbXSIsIGl0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2luZ0RpbWVuc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5Q3JlYXRpb25MZXZlbCBpdCA9IGNvbnNpZGVyKCJbMTBdIik7CisgICAgICAgIGl0LnNldERpbWVuc2lvbihuZXcgSW50ZWdlckxpdGVyYWxFeHByKCIxMiIpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiWzEyXSIsIGl0KTsKKyAgICB9CisKKyAgICAvLyBBbm5vdGF0aW9ucworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdBbm5vdGF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlDcmVhdGlvbkxldmVsIGl0ID0gY29uc2lkZXIoIltdIik7CisgICAgICAgIGl0LmFkZEFubm90YXRpb24oIm15QW5ubyIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJAbXlBbm5vKCkiKyBVdGlscy5FT0wrIltdIiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdBbm5vdGF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlDcmVhdGlvbkxldmVsIGl0ID0gY29uc2lkZXIoIkBteUFubm8gW10iKTsKKyAgICAgICAgaXQuZ2V0QW5ub3RhdGlvbnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoIltdIiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjaW5nQW5ub3RhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5Q3JlYXRpb25MZXZlbCBpdCA9IGNvbnNpZGVyKCJAbXlBbm5vIFtdIik7CisgICAgICAgIGl0LmdldEFubm90YXRpb25zKCkuc2V0KDAsIG5ldyBOb3JtYWxBbm5vdGF0aW9uRXhwcihuZXcgTmFtZSgibXlPdGhlckFubm8iKSwgbmV3IE5vZGVMaXN0PD4oKSkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJAbXlPdGhlckFubm8oKSBbXSIsIGl0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9Db21waWxhdGlvblVuaXRUcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvQ29tcGlsYXRpb25Vbml0VHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDAzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvQ29tcGlsYXRpb25Vbml0VHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24udHJhbnNmb3JtYXRpb25zLmFzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuUGFja2FnZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5OYW1lOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlscy5VdGlscy5FT0w7CisKKy8qKgorICogVHJhbnNmb3JtaW5nIENvbXBpbGF0aW9uVW5pdCBhbmQgdmVyaWZ5aW5nIHRoZSBMZXhpY2FsUHJlc2VydmF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgorICovCitwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0VHJhbnNmb3JtYXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0IHsKKworICAgIC8vIHBhY2thZ2VEZWNsYXJhdGlvbgorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdQYWNrYWdlRGVjbGFyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckNvZGUoImNsYXNzIEEge30iKTsKKyAgICAgICAgY3Uuc2V0UGFja2FnZURlY2xhcmF0aW9uKG5ldyBQYWNrYWdlRGVjbGFyYXRpb24obmV3IE5hbWUobmV3IE5hbWUoImZvbyIpLCAiYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicGFja2FnZSBmb28uYmFyOyIrIEVPTCArIEVPTCArICJjbGFzcyBBIHt9IiwgY3UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdQYWNrYWdlRGVjbGFyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckNvZGUoInBhY2thZ2UgZm9vLmJhcjsgY2xhc3MgQSB7fSIpOworICAgICAgICBjdS5yZW1vdmVQYWNrYWdlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiY2xhc3MgQSB7fSIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2luZ1BhY2thZ2VEZWNsYXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgicGFja2FnZSBmb28uYmFyOyBjbGFzcyBBIHt9Iik7CisgICAgICAgIGN1LnNldFBhY2thZ2VEZWNsYXJhdGlvbihuZXcgUGFja2FnZURlY2xhcmF0aW9uKG5ldyBOYW1lKG5ldyBOYW1lKCJmb28yIiksICJiYXoiKSkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwYWNrYWdlIGZvbzIuYmF6OyIgKworICAgICAgICAgICAgICAgIEVPTCArIEVPTCArCisgICAgICAgICAgICAgICAgIiBjbGFzcyBBIHt9IiwgY3UpOworICAgIH0KKworICAgIC8vIGltcG9ydHMKKworICAgIC8vIHR5cGVzCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9Bbm5vdGF0aW9uRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9Bbm5vdGF0aW9uRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmZmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0Fubm90YXRpb25EZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi50cmFuc2Zvcm1hdGlvbnMuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Bbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlByaW1pdGl2ZVR5cGU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi5BYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVHJhbnNmb3JtaW5nIEFubm90YXRpb25EZWNsYXJhdGlvbiBhbmQgdmVyaWZ5aW5nIHRoZSBMZXhpY2FsUHJlc2VydmF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgorICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdW5jaGFuZ2VkRXhhbXBsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRVbmNoYW5nZWQoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMSIpOworICAgICAgICBhc3NlcnRVbmNoYW5nZWQoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMyIpOworICAgICAgICBhc3NlcnRVbmNoYW5nZWQoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlOSIpOworICAgIH0KKworICAgIC8vIG5hbWUKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hhbmdpbmdOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTFfb3JpZ2luYWwiKTsKKyAgICAgICAgY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCkuc2V0TmFtZSgiTmV3TmFtZSIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxIiwgY3UpOworICAgIH0KKworICAgIC8vIG1vZGlmaWVycworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMV9vcmlnaW5hbCIpOworICAgICAgICBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkNsYXNzUHJlYW1ibGUiKS5nZXQoKS5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QVUJMSUMpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWQoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMiIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92aW5nTW9kaWZpZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTNfb3JpZ2luYWwiKTsKKyAgICAgICAgY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCkuc2V0TW9kaWZpZXJzKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTMiLCBjdSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb25zaWRlckV4YW1wbGUoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlM19vcmlnaW5hbCIpOworICAgICAgICBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkNsYXNzUHJlYW1ibGUiKS5nZXQoKS5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QUk9URUNURUQpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWQoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNCIsIGN1KTsKKyAgICB9CisKKyAgICAvLyBtZW1iZXJzCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ01lbWJlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIGN1LmdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgiQ2xhc3NQcmVhbWJsZSIpLmdldCgpLmFkZE1lbWJlcihuZXcgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCksICJmb28iLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTUiLCBjdSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ01lbWJlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIGN1LmdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgiQ2xhc3NQcmVhbWJsZSIpLmdldCgpLmdldE1lbWJlcigyKS5yZW1vdmUoKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWQoIkFubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNiIsIGN1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2luZ01lbWJlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsIik7CisgICAgICAgIGN1LmdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgiQ2xhc3NQcmVhbWJsZSIpLmdldCgpLnNldE1lbWJlcigyLCBuZXcgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCksICJmb28iLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTciLCBjdSk7CisgICAgfQorCisgICAgLy8gamF2YWRvYworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdKYXZhZG9jKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTNfb3JpZ2luYWwiKTsKKyAgICAgICAgY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCkuc2V0SmF2YWRvY0NvbW1lbnQoIkNvb2wgdGhpcyBhbm5vdGF0aW9uISIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU4IiwgY3UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdKYXZhZG9jKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uc2lkZXJFeGFtcGxlKCJBbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTlfb3JpZ2luYWwiKTsKKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gY3UuZ2V0QW5ub3RhdGlvbkRlY2xhcmF0aW9uQnlOYW1lKCJDbGFzc1ByZWFtYmxlIikuZ2V0KCkuZ2V0SmF2YWRvY0NvbW1lbnQoKS5nZXQoKS5yZW1vdmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlbW92ZWQpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU5IiwgY3UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjaW5nSmF2YWRvYygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbnNpZGVyRXhhbXBsZSgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU5X29yaWdpbmFsIik7CisgICAgICAgIGN1LmdldEFubm90YXRpb25EZWNsYXJhdGlvbkJ5TmFtZSgiQ2xhc3NQcmVhbWJsZSIpLmdldCgpLnNldEphdmFkb2NDb21tZW50KCJTdXBlciBleHRyYSBjb29sIHRoaXMgYW5ub3RhdGlvbiEhISIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZCgiQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxMCIsIGN1KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0Fubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU1NTI4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi90cmFuc2Zvcm1hdGlvbnMvYXN0L2JvZHkvQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLnRyYW5zZm9ybWF0aW9ucy5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlTGlzdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5JbnRlZ2VyTGl0ZXJhbEV4cHI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5hbWU7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLk5vcm1hbEFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRyYW5zZm9ybWluZyBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gYW5kIHZlcmlmeWluZyB0aGUgTGV4aWNhbFByZXNlcnZhdGlvbiB3b3JrcyBhcyBleHBlY3RlZC4KKyAqLworcHVibGljIGNsYXNzIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIGNvbnNpZGVyKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiQGludGVyZmFjZSBBRCB7ICIgKyBjb2RlICsgIiB9Iik7CisgICAgICAgIHJldHVybiBjdS5nZXRBbm5vdGF0aW9uRGVjbGFyYXRpb25CeU5hbWUoIkFEIikuZ2V0KCkuZ2V0TWVtYmVyKDApLmFzQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uKCk7CisgICAgfQorCisgICAgLy8gTmFtZQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2luZ05hbWUoKSB7CisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBtZCA9IGNvbnNpZGVyKCJpbnQgZm9vKCk7Iik7CisgICAgICAgIG1kLnNldE5hbWUoImJhciIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJpbnQgYmFyKCk7IiwgbWQpOworICAgIH0KKworICAgIC8vIFR5cGUKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hhbmdpbmdUeXBlKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbWQgPSBjb25zaWRlcigiaW50IGZvbygpOyIpOworICAgICAgICBtZC5zZXRUeXBlKCJTdHJpbmciKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiU3RyaW5nIGZvbygpOyIsIG1kKTsKKyAgICB9CisKKyAgICAvLyBNb2RpZmllcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nTW9kaWZpZXJzKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbWQgPSBjb25zaWRlcigiaW50IGZvbygpOyIpOworICAgICAgICBtZC5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QVUJMSUMpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIGludCBmb28oKTsiLCBtZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ01vZGlmaWVycygpIHsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG1kID0gY29uc2lkZXIoInB1YmxpYyBpbnQgZm9vKCk7Iik7CisgICAgICAgIG1kLnNldE1vZGlmaWVycyhFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJpbnQgZm9vKCk7IiwgbWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjaW5nTW9kaWZpZXJzKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbWQgPSBjb25zaWRlcigicHVibGljIGludCBmb28oKTsiKTsKKyAgICAgICAgbWQuc2V0TW9kaWZpZXJzKEVudW1TZXQub2YoTW9kaWZpZXIuUFJPVEVDVEVEKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInByb3RlY3RlZCBpbnQgZm9vKCk7IiwgbWQpOworICAgIH0KKworICAgIC8vIERlZmF1bHQgdmFsdWUKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nRGVmYXVsdFZhbHVlKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbWQgPSBjb25zaWRlcigiaW50IGZvbygpOyIpOworICAgICAgICBtZC5zZXREZWZhdWx0VmFsdWUobmV3IEludGVnZXJMaXRlcmFsRXhwcigiMTAiKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoImludCBmb28oKSBkZWZhdWx0IDEwOyIsIG1kKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92aW5nRGVmYXVsdFZhbHVlKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gbWQgPSBjb25zaWRlcigiaW50IGZvbygpIGRlZmF1bHQgMTA7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBtZC5nZXREZWZhdWx0VmFsdWUoKS5nZXQoKS5yZW1vdmUoKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoImludCBmb28oKTsiLCBtZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdEZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBtZCA9IGNvbnNpZGVyKCJpbnQgZm9vKCkgZGVmYXVsdCAxMDsiKTsKKyAgICAgICAgbWQuc2V0RGVmYXVsdFZhbHVlKG5ldyBJbnRlZ2VyTGl0ZXJhbEV4cHIoIjExIikpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJpbnQgZm9vKCkgZGVmYXVsdCAxMTsiLCBtZCk7CisgICAgfQorCisgICAgLy8gQW5ub3RhdGlvbnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nQW5ub3RhdGlvbigpIHsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIGl0ID0gY29uc2lkZXIoImludCBmb28oKTsiKTsKKyAgICAgICAgaXQuYWRkQW5ub3RhdGlvbigibXlBbm5vIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoIkBteUFubm8oKSIgKyBFT0wgKyAiaW50IGZvbygpOyIsIGl0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ1R3b0Fubm90YXRpb25zKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigiaW50IGZvbygpOyIpOworICAgICAgICBpdC5hZGRBbm5vdGF0aW9uKCJteUFubm8iKTsKKyAgICAgICAgaXQuYWRkQW5ub3RhdGlvbigibXlBbm5vMiIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJAbXlBbm5vKCkiICsgRU9MICsgIkBteUFubm8yKCkiICsgRU9MICsgImludCBmb28oKTsiLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ0Fubm90YXRpb25PblNvbWVMaW5lKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigiQG15QW5ubyBpbnQgZm9vKCk7Iik7CisgICAgICAgIGl0LmdldEFubm90YXRpb25zKCkucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJpbnQgZm9vKCk7IiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdBbm5vdGF0aW9uT25QcmV2TGluZSgpIHsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIGl0ID0gY29uc2lkZXIoIkBteUFubm8iICsgRU9MICsgImludCBmb28oKTsiKTsKKyAgICAgICAgaXQuZ2V0QW5ub3RhdGlvbnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoImludCBmb28oKTsiLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdBbm5vdGF0aW9uKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigiQG15QW5ubyBpbnQgZm9vKCk7Iik7CisgICAgICAgIGl0LmdldEFubm90YXRpb25zKCkuc2V0KDAsIG5ldyBOb3JtYWxBbm5vdGF0aW9uRXhwcihuZXcgTmFtZSgibXlPdGhlckFubm8iKSwgbmV3IE5vZGVMaXN0PD4oKSkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJAbXlPdGhlckFubm8oKSBpbnQgZm9vKCk7IiwgaXQpOworICAgIH0KKworICAgIC8vIEphdmFkb2MKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nSmF2YWRvYygpIHsKKyAgICAgICAgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIGl0ID0gY29uc2lkZXIoImludCBmb28oKTsiKTsKKyAgICAgICAgaXQuc2V0SmF2YWRvY0NvbW1lbnQoIkNvb2wgdGhpcyBhbm5vdGF0aW9uISIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJAaW50ZXJmYWNlIEFEIHsgLyoqIENvb2wgdGhpcyBhbm5vdGF0aW9uISovIiArIEVPTCArCisgICAgICAgICAgICAgICAgImludCBmb28oKTsgfSIsIGl0LmdldFBhcmVudE5vZGUoKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ0phdmFkb2MoKSB7CisgICAgICAgIEFubm90YXRpb25NZW1iZXJEZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCIvKiogQ29vbCB0aGlzIGFubm90YXRpb24hKi8gaW50IGZvbygpOyIpOworICAgICAgICBhc3NlcnRUcnVlKGl0LmdldEphdmFkb2NDb21tZW50KCkuZ2V0KCkucmVtb3ZlKCkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJAaW50ZXJmYWNlIEFEIHsgIGludCBmb28oKTsgfSIsIGl0LmdldFBhcmVudE5vZGUoKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdKYXZhZG9jKCkgeworICAgICAgICBBbm5vdGF0aW9uTWVtYmVyRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigiLyoqIENvb2wgdGhpcyBhbm5vdGF0aW9uISovIGludCBmb28oKTsiKTsKKyAgICAgICAgaXQuc2V0SmF2YWRvY0NvbW1lbnQoIlN1cGVyIGV4dHJhIGNvb2wgdGhpcyBhbm5vdGF0aW9uISEhIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoIkBpbnRlcmZhY2UgQUQgeyAvKiogU3VwZXIgZXh0cmEgY29vbCB0aGlzIGFubm90YXRpb24hISEqLyBpbnQgZm9vKCk7IH0iLCBpdC5nZXRQYXJlbnROb2RlKCkuZ2V0KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi90cmFuc2Zvcm1hdGlvbnMvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi90cmFuc2Zvcm1hdGlvbnMvYXN0L2JvZHkvQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTgwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24udHJhbnNmb3JtYXRpb25zLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk5vZGVMaXN0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5DbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkZpZWxkRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlZhcmlhYmxlRGVjbGFyYXRvcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLkFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlci5wYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworCisvKioKKyAqIFRyYW5zZm9ybWluZyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gYW5kIHZlcmlmeWluZyB0aGUgTGV4aWNhbFByZXNlcnZhdGlvbiB3b3JrcyBhcyBleHBlY3RlZC4KKyAqLworcHVibGljIGNsYXNzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNvbnNpZGVyKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZShjb2RlKTsKKyAgICAgICAgcmV0dXJuIGN1LmdldFR5cGUoMCkuYXNDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKTsKKyAgICB9CisKKyAgICAvLyBOYW1lCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNldHRpbmdOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNpZCA9IGNvbnNpZGVyKCJjbGFzcyBBIHt9Iik7CisgICAgICAgIGNpZC5zZXROYW1lKCJCIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoImNsYXNzIEIge30iLCBjaWQpOworICAgIH0KKworICAgIC8vIGlzSW50ZXJmYWNlCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsYXNzVG9JbnRlcmZhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoImNsYXNzIEEge30iKTsKKyAgICAgICAgY2lkLnNldEludGVyZmFjZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiaW50ZXJmYWNlIEEge30iLCBjaWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlVG9DbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjaWQgPSBjb25zaWRlcigiaW50ZXJmYWNlIEEge30iKTsKKyAgICAgICAgY2lkLnNldEludGVyZmFjZShmYWxzZSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoImNsYXNzIEEge30iLCBjaWQpOworICAgIH0KKworICAgIC8vIHR5cGVQYXJhbWV0ZXJzCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ1R5cGVQYXJhbWV0ZXJXaGVuVGhlcmVBcmVOb25lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNpZCA9IGNvbnNpZGVyKCJjbGFzcyBBIHt9Iik7CisgICAgICAgIGNpZC5hZGRUeXBlUGFyYW1ldGVyKG5ldyBUeXBlUGFyYW1ldGVyKCJUIiwgbmV3IE5vZGVMaXN0PD4oKSkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJjbGFzcyBBPFQ+IHt9IiwgY2lkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ1R5cGVQYXJhbWV0ZXJBc0ZpcnN0V2hlblRoZXJlQXJlU29tZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjaWQgPSBjb25zaWRlcigiY2xhc3MgQTxVPiB7fSIpOworICAgICAgICBjaWQuZ2V0VHlwZVBhcmFtZXRlcnMoKS5hZGRGaXJzdChuZXcgVHlwZVBhcmFtZXRlcigiVCIsIG5ldyBOb2RlTGlzdDw+KCkpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiY2xhc3MgQTxULCBVPiB7fSIsIGNpZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdUeXBlUGFyYW1ldGVyQXNMYXN0V2hlblRoZXJlQXJlU29tZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjaWQgPSBjb25zaWRlcigiY2xhc3MgQTxVPiB7fSIpOworICAgICAgICBjaWQuYWRkVHlwZVBhcmFtZXRlcihuZXcgVHlwZVBhcmFtZXRlcigiVCIsIG5ldyBOb2RlTGlzdDw+KCkpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiY2xhc3MgQTxVLCBUPiB7fSIsIGNpZCk7CisgICAgfQorCisgICAgLy8gZXh0ZW5kZWRUeXBlcworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdFeHRlbmRlZFR5cGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNpZCA9IGNvbnNpZGVyKCJjbGFzcyBBIHt9Iik7CisgICAgICAgIGNpZC5hZGRFeHRlbmRlZFR5cGUoIkZvbyIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJjbGFzcyBBIGV4dGVuZHMgRm9vIHt9IiwgY2lkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92aW5nRXh0ZW5kZWRUeXBlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjaWQgPSBjb25zaWRlcigicHVibGljIGNsYXNzIEEgZXh0ZW5kcyBGb28ge30iKTsKKyAgICAgICAgY2lkLmdldEV4dGVuZGVkVHlwZXMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyBjbGFzcyBBIHt9IiwgY2lkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2luZ0V4dGVuZGVkVHlwZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoInB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgRm9vIHt9Iik7CisgICAgICAgIGNpZC5nZXRFeHRlbmRlZFR5cGVzKCkuc2V0KDAsIHBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGUoIkJhciIpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIGNsYXNzIEEgZXh0ZW5kcyBCYXIge30iLCBjaWQpOworICAgIH0KKworICAgIC8vIGltcGxlbWVudGVkVHlwZXMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nSW1wbGVtZW50ZWRUeXBlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBjaWQgPSBjb25zaWRlcigiY2xhc3MgQSB7fSIpOworICAgICAgICBjaWQuYWRkSW1wbGVtZW50ZWRUeXBlKCJGb28iKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiY2xhc3MgQSBpbXBsZW1lbnRzIEZvbyB7fSIsIGNpZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ0ltcGxlbWVudGVkVHlwZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoInB1YmxpYyBjbGFzcyBBIGltcGxlbWVudHMgRm9vIHt9Iik7CisgICAgICAgIGNpZC5nZXRJbXBsZW1lbnRlZFR5cGVzKCkucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwdWJsaWMgY2xhc3MgQSB7fSIsIGNpZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdJbXBsZW1lbnRlZFR5cGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNpZCA9IGNvbnNpZGVyKCJwdWJsaWMgY2xhc3MgQSBpbXBsZW1lbnRzIEZvbyB7fSIpOworICAgICAgICBjaWQuZ2V0SW1wbGVtZW50ZWRUeXBlcygpLnNldCgwLCBwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKCJCYXIiKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyBjbGFzcyBBIGltcGxlbWVudHMgQmFyIHt9IiwgY2lkKTsKKyAgICB9CisKKyAgICAvLyBNb2RpZmllcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nTW9kaWZpZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNpZCA9IGNvbnNpZGVyKCJjbGFzcyBBIHt9Iik7CisgICAgICAgIGNpZC5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QVUJMSUMpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIGNsYXNzIEEge30iLCBjaWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoInB1YmxpYyBjbGFzcyBBIHt9Iik7CisgICAgICAgIGNpZC5zZXRNb2RpZmllcnMoRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiY2xhc3MgQSB7fSIsIGNpZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoInB1YmxpYyBjbGFzcyBBIHt9Iik7CisgICAgICAgIGNpZC5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QUk9URUNURUQpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHJvdGVjdGVkIGNsYXNzIEEge30iLCBjaWQpOworICAgIH0KKworICAgIC8vIG1lbWJlcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nRmllbGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoImNsYXNzIEEge30iKTsKKyAgICAgICAgY2lkLmFkZEZpZWxkKCJpbnQiLCAiZm9vIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoImNsYXNzIEEgeyIgKyBFT0wgKyAiICAgIGludCBmb287IiArIEVPTCArICJ9IiwgY2lkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92aW5nRmllbGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gY2lkID0gY29uc2lkZXIoInB1YmxpYyBjbGFzcyBBIHsgaW50IGZvbzsgfSIpOworICAgICAgICBjaWQuZ2V0TWVtYmVycygpLnJlbW92ZSgwKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIGNsYXNzIEEge30iLCBjaWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjaW5nRmllbGRXaXRoQW5vdGhlckZpZWxkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIGNpZCA9IGNvbnNpZGVyKCJwdWJsaWMgY2xhc3MgQSB7ZmxvYXQgZjt9Iik7CisgICAgICAgIGNpZC5nZXRNZW1iZXJzKCkuc2V0KDAsIG5ldyBGaWVsZERlY2xhcmF0aW9uKEVudW1TZXQubm9uZU9mKE1vZGlmaWVyLmNsYXNzKSwgbmV3IFZhcmlhYmxlRGVjbGFyYXRvcihQcmltaXRpdmVUeXBlLmludFR5cGUoKSwgImJhciIpKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyBjbGFzcyBBIHtpbnQgYmFyO30iLCBjaWQpOworICAgIH0KKworICAgIC8vIEFubm90YXRpb25zCisKKyAgICAvLyBKYXZhZG9jCisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0NvbnN0cnVjdG9yRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODlhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9Db25zdHJ1Y3RvckRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLnRyYW5zZm9ybWF0aW9ucy5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNvbnN0cnVjdG9yRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCisvKioKKyAqIFRyYW5zZm9ybWluZyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGFuZCB2ZXJpZnlpbmcgdGhlIExleGljYWxQcmVzZXJ2YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0IHsKKworICAgIHByb3RlY3RlZCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNvbnNpZGVyKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiY2xhc3MgQSB7ICIgKyBjb2RlICsgIiB9Iik7CisgICAgICAgIHJldHVybiBjdS5nZXRUeXBlKDApLmdldE1lbWJlcnMoKS5nZXQoMCkuYXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCk7CisgICAgfQorCisgICAgLy8gTmFtZQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSBjb25zaWRlcigiQSgpe30iKTsKKyAgICAgICAgY2Quc2V0TmFtZSgiQiIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJCKCl7fSIsIGNkKTsKKyAgICB9CisKKyAgICAvLyBKYXZhRG9jCisKKyAgICAvLyBNb2RpZmllcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nTW9kaWZpZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IGNvbnNpZGVyKCJBKCl7fSIpOworICAgICAgICBjZC5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QVUJMSUMpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIEEoKXt9IiwgY2QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gY29uc2lkZXIoInB1YmxpYyBBKCl7fSIpOworICAgICAgICBjZC5zZXRNb2RpZmllcnMoRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiQSgpe30iLCBjZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gY29uc2lkZXIoInB1YmxpYyBBKCl7fSIpOworICAgICAgICBjZC5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QUk9URUNURUQpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHJvdGVjdGVkIEEoKXt9IiwgY2QpOworICAgIH0KKworICAgIC8vIFBhcmFtZXRlcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nUGFyYW1ldGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY2QgPSBjb25zaWRlcigiQSgpe30iKTsKKyAgICAgICAgY2QuYWRkUGFyYW1ldGVyKFByaW1pdGl2ZVR5cGUuZG91YmxlVHlwZSgpLCAiZCIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJBKGRvdWJsZSBkKXt9IiwgY2QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdPbmx5UGFyYW1ldGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IGNvbnNpZGVyKCJwdWJsaWMgQShkb3VibGUgZCl7fSIpOworICAgICAgICBjZC5nZXRQYXJhbWV0ZXJzKCkucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwdWJsaWMgQSgpe30iLCBjZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ0ZpcnN0UGFyYW1ldGVyT2ZNYW55KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IGNvbnNpZGVyKCJwdWJsaWMgQShkb3VibGUgZCwgZmxvYXQgZil7fSIpOworICAgICAgICBjZC5nZXRQYXJhbWV0ZXJzKCkucmVtb3ZlKDApOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwdWJsaWMgQShmbG9hdCBmKXt9IiwgY2QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdMYXN0UGFyYW1ldGVyT2ZNYW55KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjZCA9IGNvbnNpZGVyKCJwdWJsaWMgQShkb3VibGUgZCwgZmxvYXQgZil7fSIpOworICAgICAgICBjZC5nZXRQYXJhbWV0ZXJzKCkucmVtb3ZlKDEpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwdWJsaWMgQShkb3VibGUgZCl7fSIsIGNkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2luZ09ubHlQYXJhbWV0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIGNkID0gY29uc2lkZXIoInB1YmxpYyBBKGZsb2F0IGYpe30iKTsKKyAgICAgICAgY2QuZ2V0UGFyYW1ldGVycygpLnNldCgwLCBuZXcgUGFyYW1ldGVyKG5ldyBBcnJheVR5cGUoUHJpbWl0aXZlVHlwZS5pbnRUeXBlKCkpLCBuZXcgU2ltcGxlTmFtZSgiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIEEoaW50W10gZm9vKXt9IiwgY2QpOworICAgIH0KKworICAgIC8vIFRocm93bkV4Y2VwdGlvbnMKKworICAgIC8vIEJvZHkKKworICAgIC8vIEFubm90YXRpb25zCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0VudW1Db25zdGFudERlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjcxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9FbnVtQ29uc3RhbnREZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLnRyYW5zZm9ybWF0aW9ucy5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRW51bURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRyYW5zZm9ybWluZyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBhbmQgdmVyaWZ5aW5nIHRoZSBMZXhpY2FsUHJlc2VydmF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgorICovCitwdWJsaWMgY2xhc3MgRW51bUNvbnN0YW50RGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgcHJvdGVjdGVkIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGNvbnNpZGVyKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiZW51bSBBIHsgIiArIGNvZGUgKyAiIH0iKTsKKyAgICAgICAgcmV0dXJuIGN1LmdldFR5cGUoMCkuYXNFbnVtRGVjbGFyYXRpb24oKS5nZXRFbnRyaWVzKCkuZ2V0KDApOworICAgIH0KKworICAgIC8vIE5hbWUKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2V0dGluZ05hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlY2QgPSBjb25zaWRlcigiQSIpOworICAgICAgICBlY2Quc2V0TmFtZSgiQiIpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJCIiwgZWNkKTsKKyAgICB9CisKKyAgICAvLyBBbm5vdGF0aW9ucworCisgICAgLy8gSmF2YWRvYworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9FbnVtRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9FbnVtRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhOGZhMwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0VudW1EZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLnRyYW5zZm9ybWF0aW9ucy5hc3QuYm9keTsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTW9kaWZpZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkVudW1EZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlci5sZXhpY2FscHJlc2VydmF0aW9uLkFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworLyoqCisgKiBUcmFuc2Zvcm1pbmcgRW51bURlY2xhcmF0aW9uIGFuZCB2ZXJpZnlpbmcgdGhlIExleGljYWxQcmVzZXJ2YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbiBjb25zaWRlcihTdHJpbmcgY29kZSkgeworICAgICAgICBjb25zaWRlckNvZGUoY29kZSk7CisgICAgICAgIHJldHVybiBjdS5nZXRUeXBlKDApLmFzRW51bURlY2xhcmF0aW9uKCk7CisgICAgfQorCisgICAgLy8gTmFtZQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXR0aW5nTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEVudW1EZWNsYXJhdGlvbiBjaWQgPSBjb25zaWRlcigiZW51bSBBIHsgRTEsIEUyIH0iKTsKKyAgICAgICAgY2lkLnNldE5hbWUoIkIiKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiZW51bSBCIHsgRTEsIEUyIH0iLCBjaWQpOworICAgIH0KKworICAgIC8vIGltcGxlbWVudGVkVHlwZXMKKworICAgIC8vIE1vZGlmaWVycworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhZGRpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBFbnVtRGVjbGFyYXRpb24gZWQgPSBjb25zaWRlcigiZW51bSBBIHsgRTEsIEUyIH0iKTsKKyAgICAgICAgZWQuc2V0TW9kaWZpZXJzKEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyBlbnVtIEEgeyBFMSwgRTIgfSIsIGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92aW5nTW9kaWZpZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bURlY2xhcmF0aW9uIGVkID0gY29uc2lkZXIoInB1YmxpYyBlbnVtIEEgeyBFMSwgRTIgfSIpOworICAgICAgICBlZC5zZXRNb2RpZmllcnMoRW51bVNldC5ub25lT2YoTW9kaWZpZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiZW51bSBBIHsgRTEsIEUyIH0iLCBlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdNb2RpZmllcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBFbnVtRGVjbGFyYXRpb24gZWQgPSBjb25zaWRlcigicHVibGljIGVudW0gQSB7IEUxLCBFMiB9Iik7CisgICAgICAgIGVkLnNldE1vZGlmaWVycyhFbnVtU2V0Lm9mKE1vZGlmaWVyLlBST1RFQ1RFRCkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwcm90ZWN0ZWQgZW51bSBBIHsgRTEsIEUyIH0iLCBlZCk7CisgICAgfQorCisgICAgLy8gbWVtYmVycworCisgICAgLy8gQW5ub3RhdGlvbnMKKworICAgIC8vIEphdmFkb2MKKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi90cmFuc2Zvcm1hdGlvbnMvYXN0L2JvZHkvRmllbGREZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0ZjVkOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0ZpZWxkRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi50cmFuc2Zvcm1hdGlvbnMuYXN0LmJvZHk7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lk1vZGlmaWVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCisvKioKKyAqIFRyYW5zZm9ybWluZyBGaWVsZERlY2xhcmF0aW9uIGFuZCB2ZXJpZnlpbmcgdGhlIExleGljYWxQcmVzZXJ2YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZERlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0TGV4aWNhbFByZXNlcnZpbmdUZXN0IHsKKworICAgIHByb3RlY3RlZCBGaWVsZERlY2xhcmF0aW9uIGNvbnNpZGVyKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiY2xhc3MgQSB7ICIgKyBjb2RlICsgIiB9Iik7CisgICAgICAgIHJldHVybiBjdS5nZXRUeXBlKDApLmdldE1lbWJlcnMoKS5nZXQoMCkuYXNGaWVsZERlY2xhcmF0aW9uKCk7CisgICAgfQorCisgICAgLy8gSmF2YURvYworCisgICAgLy8gTW9kaWZpZXJzCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFkZGluZ01vZGlmaWVycygpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCJpbnQgQTsiKTsKKyAgICAgICAgaXQuc2V0TW9kaWZpZXJzKEVudW1TZXQub2YoTW9kaWZpZXIuUFVCTElDKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyBpbnQgQTsiLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ01vZGlmaWVycygpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCJwdWJsaWMgaW50IEE7Iik7CisgICAgICAgIGl0LnNldE1vZGlmaWVycyhFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJpbnQgQTsiLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNpbmdNb2RpZmllcnMoKSB7CisgICAgICAgIEZpZWxkRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigiaW50IEE7Iik7CisgICAgICAgIGl0LnNldE1vZGlmaWVycyhFbnVtU2V0Lm9mKE1vZGlmaWVyLlBST1RFQ1RFRCkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwcm90ZWN0ZWQgaW50IEE7IiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hhbmdpbmdUeXBlcygpIHsKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCJpbnQgYSwgYjsiKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiaW50IGEsIGI7IiwgaXQpOworICAgICAgICBpdC5nZXRWYXJpYWJsZSgwKS5zZXRUeXBlKCJYeXoiKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiIGEsIGI7IiwgaXQpOworICAgICAgICBpdC5nZXRWYXJpYWJsZSgxKS5zZXRUeXBlKCJYeXoiKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygiWHl6IGEsIGI7IiwgaXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL2xleGljYWxwcmVzZXJ2YXRpb24vdHJhbnNmb3JtYXRpb25zL2FzdC9ib2R5L0luaXRpYWxpemVyRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9Jbml0aWFsaXplckRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGFjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9Jbml0aWFsaXplckRlY2xhcmF0aW9uVHJhbnNmb3JtYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24udHJhbnNmb3JtYXRpb25zLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkluaXRpYWxpemVyRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXIubGV4aWNhbHByZXNlcnZhdGlvbi5BYnN0cmFjdExleGljYWxQcmVzZXJ2aW5nVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVHJhbnNmb3JtaW5nIEluaXRpYWxpemVyRGVjbGFyYXRpb24gYW5kIHZlcmlmeWluZyB0aGUgTGV4aWNhbFByZXNlcnZhdGlvbiB3b3JrcyBhcyBleHBlY3RlZC4KKyAqLworcHVibGljIGNsYXNzIEluaXRpYWxpemVyRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgcHJvdGVjdGVkIEluaXRpYWxpemVyRGVjbGFyYXRpb24gY29uc2lkZXIoU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgY29uc2lkZXJDb2RlKCJjbGFzcyBBIHsgIiArIGNvZGUgKyAiIH0iKTsKKyAgICAgICAgcmV0dXJuIGN1LmdldFR5cGUoMCkuZ2V0TWVtYmVycygpLmdldCgwKS5hc0luaXRpYWxpemVyRGVjbGFyYXRpb24oKTsKKyAgICB9CisKKyAgICAvLyBKYXZhRG9jCisKKyAgICAvLyBCb2R5CisKKyAgICAvLyBJc1N0YXRpYworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnN0YW5jZVRvU3RhdGljKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5pdGlhbGl6ZXJEZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCJ7IC8qc29tZSBjb21tZW50Ki8gfSIpOworICAgICAgICBpdC5zZXRTdGF0aWModHJ1ZSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInN0YXRpYyB7IC8qc29tZSBjb21tZW50Ki8gfSIsIGl0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0YXRpY1RvSW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbml0aWFsaXplckRlY2xhcmF0aW9uIGl0ID0gY29uc2lkZXIoInN0YXRpYyB7IC8qc29tZSBjb21tZW50Ki8gfSIpOworICAgICAgICBpdC5zZXRTdGF0aWMoZmFsc2UpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJ7IC8qc29tZSBjb21tZW50Ki8gfSIsIGl0KTsKKyAgICB9CisKKyAgICAvLyBBbm5vdGF0aW9ucworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi90cmFuc2Zvcm1hdGlvbnMvYXN0L2JvZHkvTWV0aG9kRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9sZXhpY2FscHJlc2VydmF0aW9uL3RyYW5zZm9ybWF0aW9ucy9hc3QvYm9keS9NZXRob2REZWNsYXJhdGlvblRyYW5zZm9ybWF0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk0ZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvbGV4aWNhbHByZXNlcnZhdGlvbi90cmFuc2Zvcm1hdGlvbnMvYXN0L2JvZHkvTWV0aG9kRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24udHJhbnNmb3JtYXRpb25zLmFzdC5ib2R5OworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuU2ltcGxlTmFtZTsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuQXJyYXlUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5wcmludGVyLmxleGljYWxwcmVzZXJ2YXRpb24uQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCisvKioKKyAqIFRyYW5zZm9ybWluZyBNZXRob2REZWNsYXJhdGlvbiBhbmQgdmVyaWZ5aW5nIHRoZSBMZXhpY2FsUHJlc2VydmF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkLgorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kRGVjbGFyYXRpb25UcmFuc2Zvcm1hdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RMZXhpY2FsUHJlc2VydmluZ1Rlc3QgeworCisgICAgcHJvdGVjdGVkIE1ldGhvZERlY2xhcmF0aW9uIGNvbnNpZGVyKFN0cmluZyBjb2RlKSB7CisgICAgICAgIGNvbnNpZGVyQ29kZSgiY2xhc3MgQSB7ICIgKyBjb2RlICsgIiB9Iik7CisgICAgICAgIHJldHVybiBjdS5nZXRUeXBlKDApLmdldE1lbWJlcnMoKS5nZXQoMCkuYXNNZXRob2REZWNsYXJhdGlvbigpOworICAgIH0KKworICAgIC8vIE5hbWUKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2V0dGluZ05hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCJ2b2lkIEEoKXt9Iik7CisgICAgICAgIGl0LnNldE5hbWUoIkIiKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygidm9pZCBCKCl7fSIsIGl0KTsKKyAgICB9CisKKyAgICAvLyBKYXZhRG9jCisKKyAgICAvLyBNb2RpZmllcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nTW9kaWZpZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigidm9pZCBBKCl7fSIpOworICAgICAgICBpdC5zZXRNb2RpZmllcnMoRW51bVNldC5vZihNb2RpZmllci5QVUJMSUMpKTsKKyAgICAgICAgYXNzZXJ0VHJhbnNmb3JtZWRUb1N0cmluZygicHVibGljIHZvaWQgQSgpe30iLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ01vZGlmaWVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGl0ID0gY29uc2lkZXIoInB1YmxpYyB2b2lkIEEoKXt9Iik7CisgICAgICAgIGl0LnNldE1vZGlmaWVycyhFbnVtU2V0Lm5vbmVPZihNb2RpZmllci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJ2b2lkIEEoKXt9IiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjaW5nTW9kaWZpZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigicHVibGljIHZvaWQgQSgpe30iKTsKKyAgICAgICAgaXQuc2V0TW9kaWZpZXJzKEVudW1TZXQub2YoTW9kaWZpZXIuUFJPVEVDVEVEKSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInByb3RlY3RlZCB2b2lkIEEoKXt9IiwgaXQpOworICAgIH0KKworICAgIC8vIFBhcmFtZXRlcnMKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWRkaW5nUGFyYW1ldGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIGl0ID0gY29uc2lkZXIoInZvaWQgZm9vKCl7fSIpOworICAgICAgICBpdC5hZGRQYXJhbWV0ZXIoUHJpbWl0aXZlVHlwZS5kb3VibGVUeXBlKCksICJkIik7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInZvaWQgZm9vKGRvdWJsZSBkKXt9IiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdPbmx5UGFyYW1ldGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigicHVibGljIHZvaWQgZm9vKGRvdWJsZSBkKXt9Iik7CisgICAgICAgIGl0LmdldFBhcmFtZXRlcnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyB2b2lkIGZvbygpe30iLCBpdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZW1vdmluZ0ZpcnN0UGFyYW1ldGVyT2ZNYW55KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigicHVibGljIHZvaWQgZm9vKGRvdWJsZSBkLCBmbG9hdCBmKXt9Iik7CisgICAgICAgIGl0LmdldFBhcmFtZXRlcnMoKS5yZW1vdmUoMCk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyB2b2lkIGZvbyhmbG9hdCBmKXt9IiwgaXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVtb3ZpbmdMYXN0UGFyYW1ldGVyT2ZNYW55KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gaXQgPSBjb25zaWRlcigicHVibGljIHZvaWQgZm9vKGRvdWJsZSBkLCBmbG9hdCBmKXt9Iik7CisgICAgICAgIGl0LmdldFBhcmFtZXRlcnMoKS5yZW1vdmUoMSk7CisgICAgICAgIGFzc2VydFRyYW5zZm9ybWVkVG9TdHJpbmcoInB1YmxpYyB2b2lkIGZvbyhkb3VibGUgZCl7fSIsIGl0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2luZ09ubHlQYXJhbWV0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBpdCA9IGNvbnNpZGVyKCJwdWJsaWMgdm9pZCBmb28oZmxvYXQgZil7fSIpOworICAgICAgICBpdC5nZXRQYXJhbWV0ZXJzKCkuc2V0KDAsIG5ldyBQYXJhbWV0ZXIobmV3IEFycmF5VHlwZShQcmltaXRpdmVUeXBlLmludFR5cGUoKSksIG5ldyBTaW1wbGVOYW1lKCJmb28iKSkpOworICAgICAgICBhc3NlcnRUcmFuc2Zvcm1lZFRvU3RyaW5nKCJwdWJsaWMgdm9pZCBmb28oaW50W10gZm9vKXt9IiwgaXQpOworICAgIH0KKworICAgIC8vIFRocm93bkV4Y2VwdGlvbnMKKworICAgIC8vIEJvZHkKKworICAgIC8vIEFubm90YXRpb25zCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcmVtb3ZlL05vZGVSZW1vdmFsVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3JlbW92ZS9Ob2RlUmVtb3ZhbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjIwYmIxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3JlbW92ZS9Ob2RlUmVtb3ZhbFRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucmVtb3ZlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuRmllbGREZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgTm9kZVJlbW92YWxUZXN0IHsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBjdSA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUNsYXNzRnJvbUNvbXBpbGF0aW9uVW5pdCgpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHRlc3RDbGFzcyA9IGN1LmFkZENsYXNzKCJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjdS5nZXRUeXBlcygpLnNpemUoKSk7CisgICAgICAgIGJvb2xlYW4gcmVtb3ZlID0gdGVzdENsYXNzLnJlbW92ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVtb3ZlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1LmdldFR5cGVzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaWVsZEZyb21DbGFzcygpIHsKKyAgICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uIHRlc3RDbGFzcyA9IGN1LmFkZENsYXNzKCJ0ZXN0Iik7CisKKyAgICAgICAgRmllbGREZWNsYXJhdGlvbiBhZGRGaWVsZCA9IHRlc3RDbGFzcy5hZGRGaWVsZChTdHJpbmcuY2xhc3MsICJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0Q2xhc3MuZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGJvb2xlYW4gcmVtb3ZlID0gYWRkRmllbGQucmVtb3ZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZW1vdmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdGVzdENsYXNzLmdldE1lbWJlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVN0YXRlbWVudEZyb21NZXRob2RCb2R5KCkgeworICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gdGVzdENsYXNzID0gY3UuYWRkQ2xhc3MoInRlc3RDIik7CisKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gYWRkTWV0aG9kID0gdGVzdENsYXNzLmFkZE1ldGhvZCgidGVzdE0iKTsKKyAgICAgICAgQmxvY2tTdG10IG1ldGhvZEJvZHkgPSBhZGRNZXRob2QuY3JlYXRlQm9keSgpOworICAgICAgICBTdGF0ZW1lbnQgYWRkU3RhdGVtZW50ID0gbWV0aG9kQm9keS5hZGRBbmRHZXRTdGF0ZW1lbnQoInRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1ldGhvZEJvZHkuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7CisgICAgICAgIGJvb2xlYW4gcmVtb3ZlID0gYWRkU3RhdGVtZW50LnJlbW92ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVtb3ZlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldGhvZEJvZHkuZ2V0U3RhdGVtZW50cygpLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL0NvZGVHZW5lcmF0aW9uVXRpbHNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvQ29kZUdlbmVyYXRpb25VdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZlN2FkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL0NvZGVHZW5lcmF0aW9uVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBDb2RlR2VuZXJhdGlvblV0aWxzVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZXR0ZXJzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInNldFZhbHVlIiwgc2V0dGVyTmFtZSgidmFsdWUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2V0Qmx1ZSIsIHNldHRlck5hbWUoImlzQmx1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldHRlcnMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0VmFsdWUiLCBnZXR0ZXJOYW1lKE9iamVjdC5jbGFzcywgInZhbHVlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlzQmx1ZSIsIGdldHRlck5hbWUoQm9vbGVhbi5jbGFzcywgImlzQmx1ZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc0JsdWUiLCBnZXR0ZXJOYW1lKEJvb2xlYW4uY2xhc3MsICJibHVlIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1BhaXJUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvUGFpclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTViODRhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1BhaXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFBhaXJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcGFpciA9IG5ldyBQYWlyPD4oImFiYyIsICJkZWYiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjxhYmMsIGRlZj4iLCBwYWlyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nTnVsbHMoKSB7CisgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHBhaXIgPSBuZXcgUGFpcjw+KG51bGwsIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygiPG51bGwsIG51bGw+IiwgcGFpci50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlUm9vdFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Tb3VyY2VSb290VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmI1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlUm9vdFRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVJlc3VsdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgU291cmNlUm9vdFRlc3QgeworICAgIHByaXZhdGUgZmluYWwgUGF0aCByb290ID0gQ29kZUdlbmVyYXRpb25VdGlscy5jbGFzc0xvYWRlclJvb3QoU291cmNlUm9vdFRlc3QuY2xhc3MpLnJlc29sdmUoImNvbS9naXRodWIvamF2YXBhcnNlci91dGlscy8iKTsKKyAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVJvb3Qgc291cmNlUm9vdCA9IG5ldyBTb3VyY2VSb290KHJvb3QpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZVRlc3REaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIExpc3Q8UGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4gcGFyc2VSZXN1bHRzID0gc291cmNlUm9vdC50cnlUb1BhcnNlKCk7CisgICAgICAgIExpc3Q8Q29tcGlsYXRpb25Vbml0PiB1bml0cyA9IHNvdXJjZVJvb3QuZ2V0Q29tcGlsYXRpb25Vbml0cygpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCB1bml0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHVuaXRzLnN0cmVhbSgpLmFsbE1hdGNoKHVuaXQgLT4gIXVuaXQuZ2V0VHlwZXMoKS5pc0VtcHR5KCkgfHwgdW5pdC5nZXRNb2R1bGUoKS5pc1ByZXNlbnQoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHBhcnNlUmVzdWx0cy5zdHJlYW0oKS5hbnlNYXRjaChjdSAtPiBjdS5nZXRSZXN1bHQoKS5nZXQoKS5nZXRTdG9yYWdlKCkuZ2V0KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuY29udGFpbnMoInNvdXJjZSIgKyBGaWxlLnNlcGFyYXRvciArICJyb290IikpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBmaWxlQXNSb290SXNOb3RBbGxvd2VkKCkgeworICAgICAgICBQYXRoIHBhdGggPSBDb2RlR2VuZXJhdGlvblV0aWxzLmNsYXNzTG9hZGVyUm9vdChTb3VyY2VSb290VGVzdC5jbGFzcykucmVzb2x2ZSgiL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9CbGEuamF2YSIpOworICAgICAgICBuZXcgU291cmNlUm9vdChwYXRoKTsKKyAgICB9CisgICAgCisgICAgCisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9Tb3VyY2VaaXBUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlWmlwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTgwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvU291cmNlWmlwVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0Ow0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsNCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOw0KK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOw0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOw0KKw0KK3B1YmxpYyBjbGFzcyBTb3VyY2VaaXBUZXN0IHsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBQYXRoIHRlc3REaXIgPSBDb2RlR2VuZXJhdGlvblV0aWxzLm1hdmVuTW9kdWxlUm9vdChTb3VyY2VaaXBUZXN0LmNsYXNzKQ0KKyAgICAgICAgICAgIC5yZXNvbHZlKFBhdGhzLmdldCgiLi4iLCAiamF2YXBhcnNlci10ZXN0aW5nIiwgInNyYyIsICJ0ZXN0IiwgInJlc291cmNlcyIsICJjb20iLCAiZ2l0aHViIiwgImphdmFwYXJzZXIiLA0KKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZV96aXAiKSkNCisgICAgICAgICAgICAubm9ybWFsaXplKCk7DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHBhcnNlVGVzdERpcmVjdG9yeSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFNvdXJjZVppcCBzb3VyY2VaaXAgPSBuZXcgU291cmNlWmlwKHRlc3REaXIucmVzb2x2ZSgidGVzdC56aXAiKSk7DQorICAgICAgICBMaXN0PFBhaXI8UGF0aCwgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4+IHJlc3VsdHMgPSBzb3VyY2VaaXAucGFyc2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXN1bHRzLnNpemUoKSk7DQorICAgICAgICBMaXN0PENvbXBpbGF0aW9uVW5pdD4gdW5pdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgICAgIGZvciAoUGFpcjxQYXRoLCBQYXJzZVJlc3VsdDxDb21waWxhdGlvblVuaXQ+PiBwciA6IHJlc3VsdHMpIHsNCisgICAgICAgICAgICB1bml0cy5hZGQocHIuYi5nZXRSZXN1bHQoKS5nZXQoKSk7DQorICAgICAgICB9DQorICAgICAgICBhc3NlcnRUcnVlKHVuaXRzLnN0cmVhbSgpLm5vbmVNYXRjaCh1bml0IC0+IHVuaXQuZ2V0VHlwZXMoKS5pc0VtcHR5KCkpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCBwYXJzZVRlc3REaXJlY3RvcnlXaXRoQ2FsbGJhY2soKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTb3VyY2VaaXAgc291cmNlWmlwID0gbmV3IFNvdXJjZVppcCh0ZXN0RGlyLnJlc29sdmUoInRlc3QuemlwIikpOw0KKyAgICAgICAgTGlzdDxQYWlyPFBhdGgsIFBhcnNlUmVzdWx0PENvbXBpbGF0aW9uVW5pdD4+PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7DQorDQorICAgICAgICBzb3VyY2VaaXAucGFyc2UoKHBhdGgsIHJlc3VsdCkgLT4gcmVzdWx0cy5hZGQobmV3IFBhaXI8PihwYXRoLCByZXN1bHQpKSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0cy5zaXplKCkpOw0KKyAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IHVuaXRzID0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgICAgICBmb3IgKFBhaXI8UGF0aCwgUGFyc2VSZXN1bHQ8Q29tcGlsYXRpb25Vbml0Pj4gcHIgOiByZXN1bHRzKSB7DQorICAgICAgICAgICAgdW5pdHMuYWRkKHByLmIuZ2V0UmVzdWx0KCkuZ2V0KCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXNzZXJ0VHJ1ZSh1bml0cy5zdHJlYW0oKS5ub25lTWF0Y2godW5pdCAtPiB1bml0LmdldFR5cGVzKCkuaXNFbXB0eSgpKSk7DQorICAgIH0NCisNCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykNCisgICAgcHVibGljIHZvaWQgZGlyQXNaaXBJc05vdEFsbG93ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgbmV3IFNvdXJjZVppcCh0ZXN0RGlyLnJlc29sdmUoInRlc3QiKSkucGFyc2UoKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdChleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzKQ0KKyAgICBwdWJsaWMgdm9pZCBmaWxlQXNaaXBJc05vdEFsbG93ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgbmV3IFNvdXJjZVppcCh0ZXN0RGlyLnJlc29sdmUoInRlc3QudHh0IikpLnBhcnNlKCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Rlc3RVdGlscy5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Rlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjE3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVGVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52YWxpZGF0b3IuSmF2YTlWYWxpZGF0b3I7CitpbXBvcnQgb2todHRwMy5Pa0h0dHBDbGllbnQ7CitpbXBvcnQgb2todHRwMy5SZXF1ZXN0OworaW1wb3J0IG9raHR0cDMuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlckNvbmZpZ3VyYXRpb24uTGFuZ3VhZ2VMZXZlbC4qOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUHJvdmlkZXJzLnByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuQ29kZUdlbmVyYXRpb25VdGlscy5mOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuRU9MOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMubm9ybWFsaXplRW9sSW5UZXh0QmxvY2s7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5mYWlsOworCitwdWJsaWMgY2xhc3MgVGVzdFV0aWxzIHsKKyAgICAvKioKKyAgICAgKiBUYWtlcyBjYXJlIG9mIHNldHRpbmcgYWxsIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgdG8gcGxhdGZvcm0gc3BlY2lmaWMgb25lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSByZXNvdXJjZUFzU3RyZWFtID0gVGVzdFV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VBc1N0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmFpbCgibm90IGZvdW5kOiAiICsgcmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlQXNTdHJlYW0sICJ1dGYtOCIpOworICAgICAgICAgICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpLmFwcGVuZChVdGlscy5FT0wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlT2YoQ2xhc3M8Pz4gZXhwZWN0ZWRUeXBlLCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGV4cGVjdGVkVHlwZS5pc0Fzc2lnbmFibGVGcm9tKGluc3RhbmNlLmdldENsYXNzKCkpLCBmKCIlcyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgJXMuIiwgaW5zdGFuY2UuZ2V0Q2xhc3MoKSwgZXhwZWN0ZWRUeXBlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW56aXAgYSB6aXAgZmlsZSBpbnRvIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnppcChQYXRoIHppcEZpbGUsIFBhdGggb3V0cHV0Rm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMb2cuaW5mbygiVW56aXBwaW5nICVzIHRvICVzIiwgemlwRmlsZSwgb3V0cHV0Rm9sZGVyKTsKKworICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNCAqIDEwMjRdOworCisgICAgICAgIG91dHB1dEZvbGRlci50b0ZpbGUoKS5ta2RpcnMoKTsKKworICAgICAgICB0cnkgKFppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUudG9GaWxlKCkpKSkgeworICAgICAgICAgICAgWmlwRW50cnkgemUgPSB6aXMuZ2V0TmV4dEVudHJ5KCk7CisKKyAgICAgICAgICAgIHdoaWxlICh6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGF0aCBuZXdGaWxlID0gb3V0cHV0Rm9sZGVyLnJlc29sdmUoemUuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgIGlmICh6ZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy50cmFjZSgibWtkaXIgJXMiLCBuZXdGaWxlLnRvQWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBuZXdGaWxlLnRvRmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKCJ1bnppcCAlcyIsIG5ld0ZpbGUudG9BYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdGaWxlLnRvRmlsZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gemlzLnJlYWQoYnVmZmVyKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6aXMuY2xvc2VFbnRyeSgpOworICAgICAgICAgICAgICAgIHplID0gemlzLmdldE5leHRFbnRyeSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgTG9nLmluZm8oIlVuemlwcGVkICVzIHRvICVzIiwgemlwRmlsZSwgb3V0cHV0Rm9sZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb3dubG9hZCBhIGZpbGUgZnJvbSBhIFVSTCB0byBkaXNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dubG9hZChVUkwgdXJsLCBQYXRoIGRlc3RpbmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPa0h0dHBDbGllbnQgY2xpZW50ID0gbmV3IE9rSHR0cENsaWVudCgpOworICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAudXJsKHVybCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC5uZXdDYWxsKHJlcXVlc3QpLmV4ZWN1dGUoKTsKKyAgICAgICAgRmlsZXMud3JpdGUoZGVzdGluYXRpb24sIHJlc3BvbnNlLmJvZHkoKS5ieXRlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wb3JhcnlEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbGxlY3Rpb25zKENvbGxlY3Rpb248Pz4gZXhwZWN0ZWQsIENvbGxlY3Rpb248Pz4gYWN0dWFsKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChPYmplY3QgZSA6IGV4cGVjdGVkKSB7CisgICAgICAgICAgICBpZiAoYWN0dWFsLmNvbnRhaW5zKGUpKSB7CisgICAgICAgICAgICAgICAgYWN0dWFsLnJlbW92ZShlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiTWlzc2luZzogIikuYXBwZW5kKGUpLmFwcGVuZChFT0wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoT2JqZWN0IGEgOiBhY3R1YWwpIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoIlVuZXhwZWN0ZWQ6ICIpLmFwcGVuZChhKS5hcHBlbmQoRU9MKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzID0gb3V0LnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwocyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFByb2JsZW1zKFBhcnNlUmVzdWx0PD8+IHJlc3VsdCwgU3RyaW5nLi4uIGV4cGVjdGVkQXJnKSB7CisgICAgICAgIGFzc2VydFByb2JsZW1zKHJlc3VsdC5nZXRQcm9ibGVtcygpLCBleHBlY3RlZEFyZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFByb2JsZW1zKExpc3Q8UHJvYmxlbT4gcmVzdWx0LCBTdHJpbmcuLi4gZXhwZWN0ZWRBcmcpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gYWN0dWFsID0gcmVzdWx0LnN0cmVhbSgpLm1hcChQcm9ibGVtOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBIYXNoU2V0PD4oYXNMaXN0KGV4cGVjdGVkQXJnKSk7CisgICAgICAgIGFzc2VydENvbGxlY3Rpb25zKGV4cGVjdGVkLCBhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnROb1Byb2JsZW1zKFBhcnNlUmVzdWx0PD8+IHJlc3VsdCkgeworICAgICAgICBhc3NlcnRQcm9ibGVtcyhyZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFeHByZXNzaW9uVmFsaWQoU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgSmF2YVBhcnNlciBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKEpBVkFfOSkpOworICAgICAgICBQYXJzZVJlc3VsdDxFeHByZXNzaW9uPiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFBhcnNlU3RhcnQuRVhQUkVTU0lPTiwgcHJvdmlkZXIoZXhwcmVzc2lvbikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzdWx0LmlzU3VjY2Vzc2Z1bCgpLCByZXN1bHQuZ2V0UHJvYmxlbXMoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCAiYWN0dWFsIiBlcXVhbHMgImV4cGVjdGVkIiwgYW5kIHRoYXQgYW55IEVPTCBjaGFyYWN0ZXJzIGluICJhY3R1YWwiIGFyZSBjb3JyZWN0IGZvciB0aGUgcGxhdGZvcm0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc05vRW9sKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgeworICAgICAgICBhc3NlcnRFcXVhbHMobm9ybWFsaXplRW9sSW5UZXh0QmxvY2soZXhwZWN0ZWQsIEVPTCksIGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1V0aWxzVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1V0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWNmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgVXRpbHNUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcmVhbWluZ1RvQ2FtZWxDYXNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHNjcmVhbWluZ1RvQ2FtZWxDYXNlKCJBQkMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjRGVmIiwgc2NyZWFtaW5nVG9DYW1lbENhc2UoIkFCQ19ERUYiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgc2NyZWFtaW5nVG9DYW1lbENhc2UoIkFCQ18iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzY3JlYW1pbmdFbXB0eVN0cmluZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjYW1lbENhc2VUb1NjcmVhbWluZygiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFCQyIsIGNhbWVsQ2FzZVRvU2NyZWFtaW5nKCJhYmMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSEVMTE9fSEVMTE8iLCBjYW1lbENhc2VUb1NjcmVhbWluZygiSGVsbG9IZWxsbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBUEVfVEFJTCIsIGNhbWVsQ2FzZVRvU2NyZWFtaW5nKCJhcGVUYWlsIikpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGNhcGl0YWxpemVPbkVtcHR5U3RyaW5nKCkgeworICAgICAgICBjYXBpdGFsaXplKCIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhcGl0YWxpemVPblN0cmluZ09mT25lQ2hhcmFjdGVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkYiLCBjYXBpdGFsaXplKCJmIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2FwaXRhbGl6ZU9uU3RyaW5nT2ZUd29DaGFyYWN0ZXJzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvIiwgY2FwaXRhbGl6ZSgiZm8iKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgZGVjYXBpdGFsaXplT25FbXB0eVN0cmluZygpIHsKKyAgICAgICAgZGVjYXBpdGFsaXplKCIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlY2FwaXRhbGl6ZU9uU3RyaW5nT2ZPbmVDaGFyYWN0ZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZiIsIGRlY2FwaXRhbGl6ZSgiRiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlY2FwaXRhbGl6ZU9uU3RyaW5nT2ZUd29DaGFyYWN0ZXJzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImZvIiwgZGVjYXBpdGFsaXplKCJGbyIpKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub3JtYWxpemVFb2xJblRleHRCbG9jaygpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFV0aWxzLm5vcm1hbGl6ZUVvbEluVGV4dEJsb2NrKCJcclxuIFxyIFxuIiwgIlEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJRIFEgUSIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbVRyYWlsaW5nU3BhY2VzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHRyaW1UcmFpbGluZ1NwYWNlcygiYWJjIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAgYWJjIiwgdHJpbVRyYWlsaW5nU3BhY2VzKCIgIGFiYyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCB0cmltVHJhaWxpbmdTcGFjZXMoImFiYyAgIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAgYWJjIiwgdHJpbVRyYWlsaW5nU3BhY2VzKCIgIGFiYyAgIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHRyaW1UcmFpbGluZ1NwYWNlcygiYWJjXHRcMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0cmltVHJhaWxpbmdTcGFjZXMoIiAgICAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgdHJpbVRyYWlsaW5nU3BhY2VzKCIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Zpc2l0b3JMaXN0VGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL1Zpc2l0b3JMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTQ0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVmlzaXRvckxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuDQorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4NCisgKg0KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuDQorICoNCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YNCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UNCisgKg0KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kDQorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4NCisgKg0KKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKi8NCisNCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsNCisNCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOw0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Ow0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3I7DQorDQorcHVibGljIGNsYXNzIFZpc2l0b3JMaXN0VGVzdCB7DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JBZGRBbGwoKSB7DQorICAgICAgICBMaXN0PENvbXBpbGF0aW9uVW5pdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgVmlzaXRvckxpc3Q8Q29tcGlsYXRpb25Vbml0PiB2TGlzdCA9IG5ldyBWaXNpdG9yTGlzdDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOw0KKyAgICAgICAgdkxpc3QuYWRkQWxsKGxpc3QpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQ0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmdldChpKSwgdkxpc3QuZ2V0KGkpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yQWRkQWxsQXRJbmRleCgpIHsNCisgICAgICAgIExpc3Q8Q29tcGlsYXRpb25Vbml0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBZe30iKSk7DQorICAgICAgICBWaXNpdG9yTGlzdDxDb21waWxhdGlvblVuaXQ+IHZMaXN0ID0gbmV3IFZpc2l0b3JMaXN0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICB2TGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgQXt9IikpOw0KKyAgICAgICAgdkxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIEJ7fSIpKTsNCisgICAgICAgIHZMaXN0LmFkZEFsbCgyLCBsaXN0KTsNCisgICAgICAgIHZMaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBDe30iKSk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspDQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0KGkpLCB2TGlzdC5nZXQoMiArIGkpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yTGlzdENvbnRhaW5zKCkgew0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgxID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7DQorICAgICAgICBWaXNpdG9yTGlzdDxDb21waWxhdGlvblVuaXQ+IGxpc3QgPSBuZXcgVmlzaXRvckxpc3Q8PihuZXcgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IoKSwNCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvcigpKTsNCisgICAgICAgIGxpc3QuYWRkKHgxKTsNCisgICAgICAgIGFzc2VydFRydWUobGlzdC5jb250YWlucyh4MSkpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JMaXN0Q29udGFpbnNBbGwoKSB7DQorICAgICAgICBMaXN0PENvbXBpbGF0aW9uVW5pdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgVmlzaXRvckxpc3Q8Q29tcGlsYXRpb25Vbml0PiB2TGlzdCA9IG5ldyBWaXNpdG9yTGlzdDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOw0KKyAgICAgICAgdkxpc3QuYWRkQWxsKGxpc3QpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZSh2TGlzdC5zaXplKCkgPT0gMiAmJiB2TGlzdC5jb250YWluc0FsbChsaXN0KSk7DQorICAgIH0NCisNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgdmlzaXRvckxpc3RJdGVyYXRvcigpIHsNCisgICAgICAgIFZpc2l0b3JMaXN0PENvbXBpbGF0aW9uVW5pdD4gbGlzdCA9IG5ldyBWaXNpdG9yTGlzdDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgxID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7DQorICAgICAgICBsaXN0LmFkZCh4MSk7DQorICAgICAgICBDb21waWxhdGlvblVuaXQgeDIgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsNCisgICAgICAgIGxpc3QuYWRkKHgyKTsNCisgICAgICAgIEl0ZXJhdG9yPENvbXBpbGF0aW9uVW5pdD4gaXRyID0gbGlzdC5pdGVyYXRvcigpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHgxLCBpdHIubmV4dCgpKTsNCisgICAgICAgIGl0ci5yZW1vdmUoKTsNCisgICAgICAgIGFzc2VydFRydWUobGlzdC5zaXplKCkgPT0gMSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoeDIsIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgaXRyLnJlbW92ZSgpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0LnNpemUoKSA9PSAwKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yTGlzdExpc3RJdGVyYXRvcigpIHsNCisgICAgICAgIFZpc2l0b3JMaXN0PENvbXBpbGF0aW9uVW5pdD4gbGlzdCA9IG5ldyBWaXNpdG9yTGlzdDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgxID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7DQorICAgICAgICBsaXN0LmFkZCh4MSk7DQorICAgICAgICBDb21waWxhdGlvblVuaXQgeDIgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsNCisgICAgICAgIGxpc3QuYWRkKHgyKTsNCisgICAgICAgIEl0ZXJhdG9yPENvbXBpbGF0aW9uVW5pdD4gaXRyID0gbGlzdC5saXN0SXRlcmF0b3IoMik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoeDEsIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgaXRyLnJlbW92ZSgpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0LnNpemUoKSA9PSAzKTsNCisgICAgICAgIGFzc2VydEVxdWFscyh4MiwgaXRyLm5leHQoKSk7DQorICAgICAgICBpdHIucmVtb3ZlKCk7DQorICAgICAgICBhc3NlcnRUcnVlKGxpc3Quc2l6ZSgpID09IDIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JMaXN0UmVtb3ZlKCkgew0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgxID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7DQorICAgICAgICBWaXNpdG9yTGlzdDxDb21waWxhdGlvblVuaXQ+IGxpc3QgPSBuZXcgVmlzaXRvckxpc3Q8PihuZXcgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IoKSwNCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvcigpKTsNCisgICAgICAgIGxpc3QuYWRkKHgxKTsNCisgICAgICAgIGFzc2VydFRydWUobGlzdC5yZW1vdmUoeDEpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yTGlzdFJlbW92ZUFsbCgpIHsNCisgICAgICAgIExpc3Q8Q29tcGlsYXRpb25Vbml0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBWaXNpdG9yTGlzdDxDb21waWxhdGlvblVuaXQ+IHZMaXN0ID0gbmV3IFZpc2l0b3JMaXN0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICB2TGlzdC5hZGRBbGwobGlzdCk7DQorICAgICAgICB2TGlzdC5yZW1vdmVBbGwobGlzdCk7DQorICAgICAgICBhc3NlcnRUcnVlKHZMaXN0LnNpemUoKSA9PSAwKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yTGlzdFJldGFpbkFsbCgpIHsNCisgICAgICAgIExpc3Q8Q29tcGlsYXRpb25Vbml0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBWaXNpdG9yTGlzdDxDb21waWxhdGlvblVuaXQ+IHZMaXN0ID0gbmV3IFZpc2l0b3JMaXN0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICB2TGlzdC5hZGRBbGwobGlzdCk7DQorICAgICAgICB2TGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgdkxpc3QucmV0YWluQWxsKGxpc3QpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZSh2TGlzdC5zaXplKCkgPT0gMik7DQorICAgIH0NCisNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgdmlzaXRvckxpc3RTdWJMaXN0KCkgew0KKyAgICAgICAgVmlzaXRvckxpc3Q8Q29tcGlsYXRpb25Vbml0PiBsaXN0ID0gbmV3IFZpc2l0b3JMaXN0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBsaXN0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBhc3NlcnRUcnVlKGxpc3Quc2l6ZSgpID09IDQpOw0KKyAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IHN1YkxzdCA9IGxpc3Quc3ViTGlzdCgxLCAzKTsNCisgICAgICAgIGFzc2VydFRydWUoc3ViTHN0LnNpemUoKSA9PSAyKTsNCisgICAgICAgIHN1YkxzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShzdWJMc3Quc2l6ZSgpID09IDMpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0LnNpemUoKSA9PSA1KTsNCisNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yTGlzdFRvQXJyYXkoKSB7DQorICAgICAgICBMaXN0PENvbXBpbGF0aW9uVW5pdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IHZMaXN0ID0gbmV3IFZpc2l0b3JMaXN0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICB2TGlzdC5hZGRBbGwobGlzdCk7DQorICAgICAgICBmb3IgKENvbXBpbGF0aW9uVW5pdCB1IDogdkxpc3QudG9BcnJheShuZXcgQ29tcGlsYXRpb25Vbml0WzJdKSkNCisgICAgICAgICAgICBhc3NlcnRUcnVlKHZMaXN0LmNvbnRhaW5zKHUpKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVmlzaXRvck1hcFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDRiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVmlzaXRvck1hcFRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci51dGlsczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudmlzaXRvci5PYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLk9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgVmlzaXRvck1hcFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbm9ybWFsRXF1YWxzRG9lc0RlZXBDb21wYXJlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgeDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgyID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7CisKKyAgICAgICAgTWFwPENvbXBpbGF0aW9uVW5pdCwgSW50ZWdlcj4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBtYXAucHV0KHgxLCAxKTsKKyAgICAgICAgbWFwLnB1dCh4MiwgMik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXAuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG9iamVjdElkZW50aXR5RXF1YWxzRG9lc1NoYWxsb3dDb21wYXJlKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgeDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgyID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7CisKKyAgICAgICAgTWFwPENvbXBpbGF0aW9uVW5pdCwgSW50ZWdlcj4gbWFwID0gbmV3IFZpc2l0b3JNYXA8PihuZXcgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IoKSwgbmV3IE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvcigpKTsKKyAgICAgICAgbWFwLnB1dCh4MSwgMSk7CisgICAgICAgIG1hcC5wdXQoeDIsIDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmlzaXRvck1hcEdldCgpeworICAgIAlDb21waWxhdGlvblVuaXQgeDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsKKworICAgICAgICBNYXA8Q29tcGlsYXRpb25Vbml0LCBJbnRlZ2VyPiBtYXAgPSBuZXcgVmlzaXRvck1hcDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLCBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOworICAgICAgICBtYXAucHV0KHgxLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIChpbnQpbWFwLmdldCh4MSkpOworICAgIH0KKyAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JNYXBDb250YWluc0tleSgpeworICAgIAlDb21waWxhdGlvblVuaXQgeDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsKKworICAgICAgICBNYXA8Q29tcGlsYXRpb25Vbml0LCBJbnRlZ2VyPiBtYXAgPSBuZXcgVmlzaXRvck1hcDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLCBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOworICAgICAgICBtYXAucHV0KHgxLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoeDEpKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yTWFwUHV0QWxsKCl7CisgICAgCUNvbXBpbGF0aW9uVW5pdCB4MSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpOworICAgIAlDb21waWxhdGlvblVuaXQgeDIgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBZe30iKTsKKyAgICAJTWFwPENvbXBpbGF0aW9uVW5pdCwgSW50ZWdlcj4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgIAltYXAucHV0KHgxLCAxKTsKKyAgICAJbWFwLnB1dCh4MiwgMik7CisgICAgCU1hcDxDb21waWxhdGlvblVuaXQsIEludGVnZXI+IHZpc2l0b3JNYXAgPSBuZXcgVmlzaXRvck1hcDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLCBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOworICAgICAgICB2aXNpdG9yTWFwLnB1dEFsbChtYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmlzaXRvck1hcC5zaXplKCkpOworICAgIH0KKyAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpeworICAgICAgICBDb21waWxhdGlvblVuaXQgeDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsKKyAgICAgICAgVmlzaXRvck1hcDxDb21waWxhdGlvblVuaXQsIEludGVnZXI+IG1hcCA9IG5ldyBWaXNpdG9yTWFwPD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7CisgICAgICAgIG1hcC5wdXQoeDEsIDEpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSh4MSkpOworICAgICAgICAKKyAgICAgICAgbWFwLnJlbW92ZSh4MSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRGYWxzZShtYXAuY29udGFpbnNLZXkoeDEpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVmlzaXRvclNldFRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9WaXNpdG9yU2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzczMGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvVmlzaXRvclNldFRlc3QuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4NCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4NCisgKg0KKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZg0KKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yDQorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQ0KKyAqDQorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQNCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLg0KKyAqDQorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzOw0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7DQoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsNCisNCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7DQoraW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0Ow0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yOw0KK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3I7DQorDQorcHVibGljIGNsYXNzIFZpc2l0b3JTZXRUZXN0IHsNCisNCisgICAgQFRlc3QNCisgICAgcHVibGljIHZvaWQgbm9ybWFsRXF1YWxzRG9lc0RlZXBDb21wYXJlKCkgew0KKyAgICAgICAgU2V0PENvbXBpbGF0aW9uVW5pdD4gc2V0ID0gbmV3IEhhc2hTZXQ8PigpOw0KKyAgICAgICAgc2V0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBzZXQuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBzZXQuc2l6ZSgpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCBvYmplY3RJZGVudGl0eUVxdWFsc0RvZXNTaGFsbG93Q29tcGFyZSgpIHsNCisgICAgICAgIFNldDxDb21waWxhdGlvblVuaXQ+IHNldCA9IG5ldyBWaXNpdG9yU2V0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICBzZXQuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIHNldC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNldC5zaXplKCkpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JTZXRDb250YWlucygpIHsNCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCB4MSA9IEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpOw0KKyAgICAgICAgU2V0PENvbXBpbGF0aW9uVW5pdD4gc2V0ID0gbmV3IFZpc2l0b3JTZXQ8PihuZXcgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IoKSwNCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvcigpKTsNCisgICAgICAgIHNldC5hZGQoeDEpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXQuY29udGFpbnMoeDEpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yU2V0Q29udGFpbnNBbGwoKSB7DQorICAgICAgICBMaXN0PENvbXBpbGF0aW9uVW5pdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgbGlzdC5hZGQoSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9IikpOw0KKyAgICAgICAgU2V0PENvbXBpbGF0aW9uVW5pdD4gc2V0ID0gbmV3IFZpc2l0b3JTZXQ8PihuZXcgT2JqZWN0SWRlbnRpdHlIYXNoQ29kZVZpc2l0b3IoKSwNCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdElkZW50aXR5RXF1YWxzVmlzaXRvcigpKTsNCisgICAgICAgIHNldC5hZGRBbGwobGlzdCk7DQorICAgICAgICBhc3NlcnRUcnVlKHNldC5zaXplKCkgPT0gMiAmJiBzZXQuY29udGFpbnNBbGwobGlzdCkpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JTZXRJdGVyYXRvcigpIHsNCisgICAgICAgIFNldDxDb21waWxhdGlvblVuaXQ+IHNldCA9IG5ldyBWaXNpdG9yU2V0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICBDb21waWxhdGlvblVuaXQgeDEgPSBKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKTsNCisgICAgICAgIHNldC5hZGQoeDEpOw0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgyID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7DQorICAgICAgICBzZXQuYWRkKHgyKTsNCisgICAgICAgIEl0ZXJhdG9yPENvbXBpbGF0aW9uVW5pdD4gaXRyID0gc2V0Lml0ZXJhdG9yKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoeDEsIGl0ci5uZXh0KCkpOw0KKyAgICAgICAgaXRyLnJlbW92ZSgpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXQuc2l6ZSgpID09IDEpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHgyLCBpdHIubmV4dCgpKTsNCisgICAgICAgIGl0ci5yZW1vdmUoKTsNCisgICAgICAgIGFzc2VydFRydWUoc2V0LnNpemUoKSA9PSAwKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yU2V0UmVtb3ZlKCkgew0KKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHgxID0gSmF2YVBhcnNlci5wYXJzZSgiY2xhc3MgWHt9Iik7DQorICAgICAgICBTZXQ8Q29tcGlsYXRpb25Vbml0PiBzZXQgPSBuZXcgVmlzaXRvclNldDw+KG5ldyBPYmplY3RJZGVudGl0eUhhc2hDb2RlVmlzaXRvcigpLA0KKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SWRlbnRpdHlFcXVhbHNWaXNpdG9yKCkpOw0KKyAgICAgICAgc2V0LmFkZCh4MSk7DQorICAgICAgICBhc3NlcnRUcnVlKHNldC5yZW1vdmUoeDEpKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yU2V0UmVtb3ZlQWxsKCkgew0KKyAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgICAgIGxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIGxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIFNldDxDb21waWxhdGlvblVuaXQ+IHNldCA9IG5ldyBWaXNpdG9yU2V0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICBzZXQuYWRkQWxsKGxpc3QpOw0KKyAgICAgICAgc2V0LnJlbW92ZUFsbChsaXN0KTsNCisgICAgICAgIGFzc2VydFRydWUoc2V0LnNpemUoKSA9PSAwKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdG9yU2V0UmV0YWluQWxsKCkgew0KKyAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgICAgIGxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIGxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIFNldDxDb21waWxhdGlvblVuaXQ+IHNldCA9IG5ldyBWaXNpdG9yU2V0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICBzZXQuYWRkQWxsKGxpc3QpOw0KKyAgICAgICAgc2V0LmFkZChKYXZhUGFyc2VyLnBhcnNlKCJjbGFzcyBYe30iKSk7DQorICAgICAgICBzZXQucmV0YWluQWxsKGxpc3QpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXQuc2l6ZSgpID09IDIpOw0KKyAgICB9DQorDQorICAgIEBUZXN0DQorICAgIHB1YmxpYyB2b2lkIHZpc2l0b3JTZXRUb0FycmF5KCkgew0KKyAgICAgICAgTGlzdDxDb21waWxhdGlvblVuaXQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisgICAgICAgIGxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIGxpc3QuYWRkKEphdmFQYXJzZXIucGFyc2UoImNsYXNzIFh7fSIpKTsNCisgICAgICAgIFNldDxDb21waWxhdGlvblVuaXQ+IHNldCA9IG5ldyBWaXNpdG9yU2V0PD4obmV3IE9iamVjdElkZW50aXR5SGFzaENvZGVWaXNpdG9yKCksDQorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJZGVudGl0eUVxdWFsc1Zpc2l0b3IoKSk7DQorICAgICAgICBzZXQuYWRkQWxsKGxpc3QpOw0KKyAgICAgICAgZm9yIChDb21waWxhdGlvblVuaXQgdSA6IHNldC50b0FycmF5KG5ldyBDb21waWxhdGlvblVuaXRbMl0pKQ0KKyAgICAgICAgICAgIGFzc2VydFRydWUoc2V0LmNvbnRhaW5zKHUpKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvdmVyc2lvbi9KYXZhMTBQb3N0UHJvY2Vzc29yVGVzdC5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ZlcnNpb24vSmF2YTEwUG9zdFByb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjlhZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ZlcnNpb24vSmF2YTEwUG9zdFByb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci52ZXJzaW9uOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlBhcnNlUmVzdWx0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLlZhclR5cGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIuUGFyc2VTdGFydC5TVEFURU1FTlQ7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZXJDb25maWd1cmF0aW9uLkxhbmd1YWdlTGV2ZWwuSkFWQV8xMDsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSmF2YTEwUG9zdFByb2Nlc3NvclRlc3QgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcnNlciBqYXZhUGFyc2VyID0gbmV3IEphdmFQYXJzZXIobmV3IFBhcnNlckNvbmZpZ3VyYXRpb24oKS5zZXRMYW5ndWFnZUxldmVsKEpBVkFfMTApKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFySXNBVHlwZSgpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQ8U3RhdGVtZW50PiByZXN1bHQgPSBqYXZhUGFyc2VyLnBhcnNlKFNUQVRFTUVOVCwgcHJvdmlkZXIoInZhciB4PVwiXCI7IikpOworCisgICAgICAgIExpc3Q8VmFyVHlwZT4gYWxsVmFyVHlwZXMgPSByZXN1bHQuZ2V0UmVzdWx0KCkuZ2V0KCkuZmluZEFsbChWYXJUeXBlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsVmFyVHlwZXMuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NoYW5naW5nTWV0aG9kc0Zyb21BQ2xhc3NXaXRoQVZpc2l0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NoYW5naW5nTWV0aG9kc0Zyb21BQ2xhc3NXaXRoQVZpc2l0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3Y2ZjYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvQ2hhbmdpbmdNZXRob2RzRnJvbUFDbGFzc1dpdGhBVmlzaXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIud2lraV9zYW1wbGVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDaGFuZ2luZ01ldGhvZHNGcm9tQUNsYXNzV2l0aEFWaXNpdG9yVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludGluZ1RoZUNvbXBpbGF0aW9uVW5pdFRvU3lzdGVtT3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoVGVzdEZpbGVUb2tlbiBmID0gbmV3IFRlc3RGaWxlVG9rZW4oInRlc3QuamF2YSIpKSB7CisgICAgICAgICAgICBNZXRob2RDaGFuZ2VyXzEubWFpbihuZXcgU3RyaW5nW117fSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NoYW5naW5nTWV0aG9kc0Zyb21BQ2xhc3NXaXRob3V0QVZpc2l0b3JUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NoYW5naW5nTWV0aG9kc0Zyb21BQ2xhc3NXaXRob3V0QVZpc2l0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwMWZmNQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvQ2hhbmdpbmdNZXRob2RzRnJvbUFDbGFzc1dpdGhvdXRBVmlzaXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIud2lraV9zYW1wbGVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDaGFuZ2luZ01ldGhvZHNGcm9tQUNsYXNzV2l0aG91dEFWaXNpdG9yVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludGluZ1RoZUNvbXBpbGF0aW9uVW5pdFRvU3lzdGVtT3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoVGVzdEZpbGVUb2tlbiBmID0gbmV3IFRlc3RGaWxlVG9rZW4oInRlc3QuamF2YSIpKSB7CisgICAgICAgICAgICBNZXRob2RDaGFuZ2VyXzIubWFpbihuZXcgU3RyaW5nW117fSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NsYXNzQ3JlYXRvci5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9DbGFzc0NyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFkOTFiCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9DbGFzc0NyZWF0b3IuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIud2lraV9zYW1wbGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Nb2RpZmllcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LlBhY2thZ2VEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuUGFyYW1ldGVyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Quc3RtdC5CbG9ja1N0bXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLkNsYXNzT3JJbnRlcmZhY2VUeXBlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5Wb2lkVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGU7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyLnBhcnNlTmFtZTsKKworcHVibGljIGNsYXNzIENsYXNzQ3JlYXRvciB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlcyB0aGUgY29tcGlsYXRpb24gdW5pdAorICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVDVSgpOworCisgICAgICAgIC8vIHByaW50cyB0aGUgY3JlYXRlZCBjb21waWxhdGlvbiB1bml0CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIHRoZSBjb21waWxhdGlvbiB1bml0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNVKCkgeworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCk7CisgICAgICAgIC8vIHNldCB0aGUgcGFja2FnZQorICAgICAgICBjdS5zZXRQYWNrYWdlRGVjbGFyYXRpb24obmV3IFBhY2thZ2VEZWNsYXJhdGlvbihwYXJzZU5hbWUoImphdmEucGFyc2VyLnRlc3QiKSkpOworCisgICAgICAgIC8vIG9yIGEgc2hvcnRjdXQKKyAgICAgICAgY3Uuc2V0UGFja2FnZURlY2xhcmF0aW9uKCJqYXZhLnBhcnNlci50ZXN0Iik7CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSB0eXBlIGRlY2xhcmF0aW9uIAorICAgICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gdHlwZSA9IGN1LmFkZENsYXNzKCJHZW5lcmF0ZWRDbGFzcyIpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIG1ldGhvZAorICAgICAgICBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMgPSBFbnVtU2V0Lm9mKE1vZGlmaWVyLlBVQkxJQyk7CisgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IG5ldyBNZXRob2REZWNsYXJhdGlvbihtb2RpZmllcnMsIG5ldyBWb2lkVHlwZSgpLCAibWFpbiIpOworICAgICAgICBtb2RpZmllcnMuYWRkKE1vZGlmaWVyLlNUQVRJQyk7CisgICAgICAgIG1ldGhvZC5zZXRNb2RpZmllcnMobW9kaWZpZXJzKTsKKyAgICAgICAgdHlwZS5hZGRNZW1iZXIobWV0aG9kKTsKKyAgICAgICAgCisgICAgICAgIC8vIG9yIGEgc2hvcnRjdXQKKyAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWFpbjIgPSB0eXBlLmFkZE1ldGhvZCgibWFpbjIiLCBNb2RpZmllci5QVUJMSUMsIE1vZGlmaWVyLlNUQVRJQyk7CisKKyAgICAgICAgLy8gYWRkIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcihwYXJzZUNsYXNzT3JJbnRlcmZhY2VUeXBlKCJTdHJpbmciKSwgImFyZ3MiKTsKKyAgICAgICAgcGFyYW0uc2V0VmFyQXJncyh0cnVlKTsKKyAgICAgICAgbWV0aG9kLmFkZFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgIAorICAgICAgICAvLyBvciBhIHNob3J0Y3V0CisgICAgICAgIG1haW4yLmFkZEFuZEdldFBhcmFtZXRlcihTdHJpbmcuY2xhc3MsICJhcmdzIikuc2V0VmFyQXJncyh0cnVlKTsKKworICAgICAgICAvLyBhZGQgYSBib2R5IHRvIHRoZSBtZXRob2QKKyAgICAgICAgQmxvY2tTdG10IGJsb2NrID0gbmV3IEJsb2NrU3RtdCgpOworICAgICAgICBtZXRob2Quc2V0Qm9keShibG9jayk7CisKKyAgICAgICAgLy8gYWRkIGEgc3RhdGVtZW50IHRvIHRoZSBtZXRob2QgYm9keQorICAgICAgICBOYW1lRXhwciBjbGF6eiA9IG5ldyBOYW1lRXhwcigiU3lzdGVtIik7CisgICAgICAgIEZpZWxkQWNjZXNzRXhwciBmaWVsZCA9IG5ldyBGaWVsZEFjY2Vzc0V4cHIoY2xhenosICJvdXQiKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHIgY2FsbCA9IG5ldyBNZXRob2RDYWxsRXhwcihmaWVsZCwgInByaW50bG4iKTsKKyAgICAgICAgY2FsbC5hZGRBcmd1bWVudChuZXcgU3RyaW5nTGl0ZXJhbEV4cHIoIkhlbGxvIFdvcmxkISIpKTsKKyAgICAgICAgYmxvY2suYWRkU3RhdGVtZW50KGNhbGwpOworCisgICAgICAgIHJldHVybiBjdTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NyZWF0aW5nQUNvbXBpbGF0aW9uVW5pdEZyb21TY3JhdGNoLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0NyZWF0aW5nQUNvbXBpbGF0aW9uVW5pdEZyb21TY3JhdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyNTZkMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvQ3JlYXRpbmdBQ29tcGlsYXRpb25Vbml0RnJvbVNjcmF0Y2guamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIud2lraV9zYW1wbGVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDcmVhdGluZ0FDb21waWxhdGlvblVuaXRGcm9tU2NyYXRjaCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludGluZ1RoZUNvbXBpbGF0aW9uVW5pdFRvU3lzdGVtT3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzQ3JlYXRvci5tYWluKG5ldyBTdHJpbmdbXXt9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL0N1UHJpbnRlci5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9DdVByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY1M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9DdVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIud2lraV9zYW1wbGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIEN1UHJpbnRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlcyBhbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSBmaWxlIHRvIGJlIHBhcnNlZAorICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJ0ZXN0LmphdmEiKTsKKworICAgICAgICAvLyBwYXJzZSB0aGUgZmlsZQorICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGluKTsKKworICAgICAgICAvLyBwcmludHMgdGhlIHJlc3VsdGluZyBjb21waWxhdGlvbiB1bml0IHRvIGRlZmF1bHQgc3lzdGVtIG91dHB1dAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3UudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9NZXRob2RDaGFuZ2VyXzEuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvTWV0aG9kQ2hhbmdlcl8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2NDg2NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvTWV0aG9kQ2hhbmdlcl8xLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLndpa2lfc2FtcGxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgTWV0aG9kQ2hhbmdlcl8xIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBwYXJzZSBhIGZpbGUKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZSgidGVzdC5qYXZhIikpOworCisgICAgICAgIC8vIHZpc2l0IGFuZCBjaGFuZ2UgdGhlIG1ldGhvZHMgbmFtZXMgYW5kIHBhcmFtZXRlcnMKKyAgICAgICAgY3UuYWNjZXB0KG5ldyBNZXRob2RDaGFuZ2VyVmlzaXRvcigpLCBudWxsKTsKKworICAgICAgICAvLyBwcmludHMgdGhlIGNoYW5nZWQgY29tcGlsYXRpb24gdW5pdAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSB2aXNpdG9yIGltcGxlbWVudGF0aW9uIGZvciB2aXNpdGluZyBNZXRob2REZWNsYXJhdGlvbiBub2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXRob2RDaGFuZ2VyVmlzaXRvciBleHRlbmRzIFZvaWRWaXNpdG9yQWRhcHRlcjxWb2lkPiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBuLCBWb2lkIGFyZykgeworICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gdXBwZXIgY2FzZQorICAgICAgICAgICAgbi5zZXROYW1lKG4uZ2V0TmFtZUFzU3RyaW5nKCkudG9VcHBlckNhc2UoKSk7CisKKyAgICAgICAgICAgIC8vIGFkZCBhIG5ldyBwYXJhbWV0ZXIgdG8gdGhlIG1ldGhvZAorICAgICAgICAgICAgbi5hZGRQYXJhbWV0ZXIoImludCIsICJ2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9NZXRob2RDaGFuZ2VyXzIuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvTWV0aG9kQ2hhbmdlcl8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwYzcyZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvTWV0aG9kQ2hhbmdlcl8yLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLndpa2lfc2FtcGxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuTm9kZUxpc3Q7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5LlR5cGVEZWNsYXJhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5QcmltaXRpdmVUeXBlLmludFR5cGU7CisKK3B1YmxpYyBjbGFzcyBNZXRob2RDaGFuZ2VyXzIgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZXMgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgZmlsZSB0byBiZSBwYXJzZWQKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgidGVzdC5qYXZhIik7CisgICAgICAgIAorICAgICAgICAvLyBwYXJzZSB0aGUgZmlsZQorICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGluKTsKKworICAgICAgICAvLyBjaGFuZ2UgdGhlIG1ldGhvZHMgbmFtZXMgYW5kIHBhcmFtZXRlcnMKKyAgICAgICAgY2hhbmdlTWV0aG9kcyhjdSk7CisKKyAgICAgICAgLy8gcHJpbnRzIHRoZSBjaGFuZ2VkIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGN1LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hhbmdlTWV0aG9kcyhDb21waWxhdGlvblVuaXQgY3UpIHsKKyAgICAgICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIHR5cGVzIGluIHRoZSBmaWxlCisgICAgICAgIE5vZGVMaXN0PFR5cGVEZWNsYXJhdGlvbjw/Pj4gdHlwZXMgPSBjdS5nZXRUeXBlcygpOworICAgICAgICBmb3IgKFR5cGVEZWNsYXJhdGlvbjw/PiB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIGZpZWxkcywgbWV0aG9kcywgZXRjLiBpbiB0aGlzIHR5cGUKKyAgICAgICAgICAgIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgICAgICAgICAgZm9yIChCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbWVtYmVycykgeworICAgICAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSAoTWV0aG9kRGVjbGFyYXRpb24pIG1lbWJlcjsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlTWV0aG9kKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGFuZ2VNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbikgeworICAgICAgICAvLyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byB1cHBlciBjYXNlCisgICAgICAgIG4uc2V0TmFtZShuLmdldE5hbWVBc1N0cmluZygpLnRvVXBwZXJDYXNlKCkpOworCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgbmV3IHBhcmFtZXRlcgorICAgICAgICBuLmFkZFBhcmFtZXRlcihpbnRUeXBlKCksICJ2YWx1ZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvTWV0aG9kUHJpbnRlci5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9NZXRob2RQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxZTViZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvTWV0aG9kUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci53aWtpX3NhbXBsZXM7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuSmF2YVBhcnNlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yQWRhcHRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCitwdWJsaWMgY2xhc3MgTWV0aG9kUHJpbnRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlcyBhbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSBmaWxlIHRvIGJlIHBhcnNlZAorICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJ0ZXN0LmphdmEiKTsKKworICAgICAgICAvLyBwYXJzZSBpdAorICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBKYXZhUGFyc2VyLnBhcnNlKGluKTsKKworICAgICAgICAvLyB2aXNpdCBhbmQgcHJpbnQgdGhlIG1ldGhvZHMgbmFtZXMKKyAgICAgICAgY3UuYWNjZXB0KG5ldyBNZXRob2RWaXNpdG9yKCksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSB2aXNpdG9yIGltcGxlbWVudGF0aW9uIGZvciB2aXNpdGluZyBNZXRob2REZWNsYXJhdGlvbiBub2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXRob2RWaXNpdG9yIGV4dGVuZHMgVm9pZFZpc2l0b3JBZGFwdGVyPFZvaWQ+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG4sIFZvaWQgYXJnKSB7CisgICAgICAgICAgICAvKiBoZXJlIHlvdSBjYW4gYWNjZXNzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QuCisgICAgICAgICAgICAgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZm9yIGFsbCBtZXRob2RzIGluIHRoaXMgCisgICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0LCBpbmNsdWRpbmcgaW5uZXIgY2xhc3MgbWV0aG9kcyAqLworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG4uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0KG4sIGFyZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL1ByaW50aW5nVGhlQ29tcGlsYXRpb25Vbml0VG9TeXN0ZW1PdXRwdXRUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL1ByaW50aW5nVGhlQ29tcGlsYXRpb25Vbml0VG9TeXN0ZW1PdXRwdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhOTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvUHJpbnRpbmdUaGVDb21waWxhdGlvblVuaXRUb1N5c3RlbU91dHB1dFRlc3QuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSsO6bGlvIFZpbG1hciBHZXNzZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMTMtMjAxNiBUaGUgSmF2YVBhcnNlciBUZWFtLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEphdmFQYXJzZXIuCisgKgorICogSmF2YVBhcnNlciBjYW4gYmUgdXNlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiBhKSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIGIpIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIGJvdGggbGljZW5zZXMgaW4gTElDRU5DRS5MR1BMIGFuZAorICogTElDRU5DRS5BUEFDSEUuIFBsZWFzZSByZWZlciB0byB0aG9zZSBmaWxlcyBmb3IgZGV0YWlscy4KKyAqCisgKiBKYXZhUGFyc2VyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIud2lraV9zYW1wbGVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBQcmludGluZ1RoZUNvbXBpbGF0aW9uVW5pdFRvU3lzdGVtT3V0cHV0VGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmludGluZ1RoZUNvbXBpbGF0aW9uVW5pdFRvU3lzdGVtT3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoVGVzdEZpbGVUb2tlbiBmID0gbmV3IFRlc3RGaWxlVG9rZW4oInRlc3QuamF2YSIpKSB7CisgICAgICAgICAgICBDdVByaW50ZXIubWFpbihuZXcgU3RyaW5nW117fSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvVGVzdEZpbGVUb2tlbi5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9UZXN0RmlsZVRva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyN2MzZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvVGVzdEZpbGVUb2tlbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci53aWtpX3NhbXBsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKKy8qKgorICogQ3JlYXRlcyBhIHRlbXBvcmFyeSB0ZXN0IGZpbGUgdGhhdCBhIHNhbXBsZSBjYW4gdXNlLiBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHJld3JpdGUgdGhlIHNhbXBsZXMgdG8gZml0IHRoZW0gaW50bworICogdGhlc2UgdGVzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RmlsZVRva2VuIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZW5hbWU7CisKKyAgICBwdWJsaWMgVGVzdEZpbGVUb2tlbihTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJUZXN0RmlsZS5qYXZhIik7IE91dHB1dFN0cmVhbSBvID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpKTsKKyAgICAgICAgICAgICAgICBJT1V0aWxzLmNvcHkoaSwgbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgYm9vbGVhbiBkZWxldGVkID0gbmV3IEZpbGUoZmlsZW5hbWUpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRlbGV0ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvVmlzaXRpbmdDbGFzc01ldGhvZHNUZXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL1Zpc2l0aW5nQ2xhc3NNZXRob2RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTkxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL1Zpc2l0aW5nQ2xhc3NNZXRob2RzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci53aWtpX3NhbXBsZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFZpc2l0aW5nQ2xhc3NNZXRob2RzVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKFRlc3RGaWxlVG9rZW4gZiA9IG5ldyBUZXN0RmlsZVRva2VuKCJ0ZXN0LmphdmEiKSkgeworICAgICAgICAgICAgTWV0aG9kUHJpbnRlci5tYWluKG5ldyBTdHJpbmdbXXt9KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvcmVtb3Zlbm9kZS9ELmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL3JlbW92ZW5vZGUvRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTI1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL3JlbW92ZW5vZGUvRC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci53aWtpX3NhbXBsZXMucmVtb3Zlbm9kZTsKKworcHVibGljIGNsYXNzIEQgeworCisgICAgcHVibGljIHZvaWQgZm9vKGludCBlKSB7CisgICAgICAgIGludCBhID0gMjA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9yZW1vdmVub2RlL01vZGlmaWVyVmlzaXRvclRlc3QuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvcmVtb3Zlbm9kZS9Nb2RpZmllclZpc2l0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyMmM5NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9qYXZhL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvcmVtb3Zlbm9kZS9Nb2RpZmllclZpc2l0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLndpa2lfc2FtcGxlcy5yZW1vdmVub2RlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5WYXJpYWJsZURlY2xhcmF0b3I7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkludGVnZXJMaXRlcmFsRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuTW9kaWZpZXJWaXNpdG9yOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBNb2RpZmllclZpc2l0b3JUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcGFyc2UgdGhlIGZpbGUKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YVBhcnNlci5wYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKCJmb3JHaXRIdWJUZXN0LmphdmEiKSk7CisKKyAgICAgICAgLy8gVGhlIHZpc2l0b3Igc2hvdWxkIHJlbW92ZSBhbGwgYT0yMCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCisgICAgICAgIGN1LmFjY2VwdChuZXcgTXlWaXNpdG9yKCksIG51bGwpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdS50b1N0cmluZygpKTsKKyAgICB9Cit9CisKK2NsYXNzIE15VmlzaXRvciBleHRlbmRzIE1vZGlmaWVyVmlzaXRvcjxWb2lkPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5vZGUgdmlzaXQoVmFyaWFibGVEZWNsYXJhdG9yIGRlY2xhcmF0b3IsIFZvaWQgYXJncykgeworICAgICAgICBpZiAoZGVjbGFyYXRvci5nZXROYW1lQXNTdHJpbmcoKS5lcXVhbHMoImEiKQorICAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsaXplciBpcyBvcHRpb25hbCwgZmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgb25lCisgICAgICAgICAgICAgICAgJiYgZGVjbGFyYXRvci5nZXRJbml0aWFsaXplcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBkZWNsYXJhdG9yLmdldEluaXRpYWxpemVyKCkuZ2V0KCk7CisgICAgICAgICAgICAvLyBXZSdyZSBsb29raW5nIGZvciBhIGxpdGVyYWwgaW50ZWdlci4KKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgSW50ZWdlckxpdGVyYWxFeHByKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgb25lLiBJcyBpdCBsaXRlcmFsIGludGVnZXIgMjA/CisgICAgICAgICAgICAgICAgaWYgKCgoSW50ZWdlckxpdGVyYWxFeHByKSBleHByZXNzaW9uKS5nZXRWYWx1ZSgpLmVxdWFscygiMjAiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5pbmcgbnVsbCBtZWFucyAicmVtb3ZlIHRoaXMgVmFyaWFibGVEZWNsYXJhdG9yIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlY2xhcmF0b3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9yZW1vdmVub2RlL1JlbW92ZURlbGV0ZU5vZGVGcm9tQXN0LmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvamF2YS9jb20vZ2l0aHViL2phdmFwYXJzZXIvd2lraV9zYW1wbGVzL3JlbW92ZW5vZGUvUmVtb3ZlRGVsZXRlTm9kZUZyb21Bc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc1NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L2phdmEvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9yZW1vdmVub2RlL1JlbW92ZURlbGV0ZU5vZGVGcm9tQXN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLndpa2lfc2FtcGxlcy5yZW1vdmVub2RlOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLndpa2lfc2FtcGxlcy5UZXN0RmlsZVRva2VuOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgUmVtb3ZlRGVsZXRlTm9kZUZyb21Bc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvZGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoVGVzdEZpbGVUb2tlbiBmID0gbmV3IFRlc3RGaWxlVG9rZW4oImZvckdpdEh1YlRlc3QuamF2YSIpKSB7CisgICAgICAgICAgICBNb2RpZmllclZpc2l0b3JUZXN0Lm1haW4oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rlc3RGaWxlSXNvODg1OTEuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL1Rlc3RGaWxlSXNvODg1OTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc3Zjk0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvVGVzdEZpbGVJc284ODU5MS5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0RmlsZSB7CisKKyAgICBwdWJsaWMgU3RyaW5nIHN0cu9uZyA9ICJTdHJhbmdlIGF0dHJpYnV0ZSBuYW1lIFtjaGVjayB0aGUgaV0iOworCit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvY29tbWVudF9hdHRyaWJ1dGlvbl9zY2VuYXJpb3Muc3RvcnkgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvY29tbWVudF9hdHRyaWJ1dGlvbl9zY2VuYXJpb3Muc3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwOWZjOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9jb21tZW50X2F0dHJpYnV0aW9uX3NjZW5hcmlvcy5zdG9yeQpAQCAtMCwwICsxLDQ5OCBAQAorU2NlbmFyaW86IEEgQ2xhc3MgV2l0aCBMaW5lIENvbW1lbnRzIGlzIHByb2Nlc3NlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworcHVibGljIGNsYXNzIENsYXNzV2l0aExpbmVDb21tZW50cyB7CisKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKCl7CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGE9MDsgLy8gc2Vjb25kIGNvbW1lbnQKKyAgICAgICAgLy8gdGhpcmQgY29tbWVudAorICAgICAgICAvLyBmb3VydGggY29tbWVudAorICAgIH0KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGNvbW1lbnRlZAorVGhlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgMCBvcnBoYW4gY29tbWVudHMKK1RoZW4gY2xhc3MgMSBoYXMgNCB0b3RhbCBjb250YWluZWQgY29tbWVudHMKK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBoYXMgNCB0b3RhbCBjb250YWluZWQgY29tbWVudHMKK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBoYXMgMCBvcnBoYW4gY29tbWVudHMKK1RoZW4gYmxvY2sgc3RhdGVtZW50IGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIDQgdG90YWwgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIGJsb2NrIHN0YXRlbWVudCBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyAzIG9ycGhhbiBjb21tZW50cworCisKKworU2NlbmFyaW86IEEgQ2xhc3MgV2l0aCBMaW5lIENvbW1lbnRzIGlzIHByb2Nlc3NlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworLyoqSmF2YWRvYyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzKi8KK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhPcnBoYW5Db21tZW50cyB7CisgICAgLy9hIGZpcnN0IGNvbW1lbnQgZmxvYXRpbmcgaW4gdGhlIGNsYXNzCisKKyAgICAvL2NvbW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgbWV0aG9kCisgICAgdm9pZCBmb28oKXsKKyAgICAgICAgLypjb21tZW50IGZsb2F0aW5nIGluc2lkZSB0aGUgbWV0aG9kKi8KKyAgICB9CisKKyAgICAvL2Egc2Vjb25kIGNvbW1lbnQgZmxvYXRpbmcgaW4gdGhlIGNsYXNzCit9CisKKy8vT3JwaGFuIGNvbW1lbnQgaW5zaWRlIHRoZSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGNvbW1lbnRlZAorVGhlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgNiBjb250YWluZWQgY29tbWVudHMKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgb3JwaGFuIGNvbW1lbnQgMSBpcyAiT3JwaGFuIGNvbW1lbnQgaW5zaWRlIHRoZSBDb21waWxhdGlvblVuaXQiCitUaGVuIGNsYXNzIDEgb3JwaGFuIGNvbW1lbnQgMSBpcyAiYSBmaXJzdCBjb21tZW50IGZsb2F0aW5nIGluIHRoZSBjbGFzcyIKK1RoZW4gY2xhc3MgMSBvcnBoYW4gY29tbWVudCAyIGlzICJhIHNlY29uZCBjb21tZW50IGZsb2F0aW5nIGluIHRoZSBjbGFzcyIKK1RoZW4gY2xhc3MgMSBpcyBjb21tZW50ZWQgIkphdmFkb2MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcyIKK1RoZW4gY2xhc3MgMSBoYXMgNCB0b3RhbCBjb250YWluZWQgY29tbWVudHMKK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBoYXMgMCBvcnBoYW4gY29tbWVudHMKK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyBjb21tZW50ZWQgImNvbW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgbWV0aG9kIgorVGhlbiBjb21tZW50IDEgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyAiY29tbWVudCBmbG9hdGluZyBpbnNpZGUgdGhlIG1ldGhvZCIKK1RoZW4gYmxvY2sgc3RhdGVtZW50IGluIG1ldGhvZCAxIGluIGNsYXNzIDEgb3JwaGFuIGNvbW1lbnQgMSBpcyAiY29tbWVudCBmbG9hdGluZyBpbnNpZGUgdGhlIG1ldGhvZCIKKworCitTY2VuYXJpbzogQSBDbGFzcyBXaXRoIE9ycGhhbiBDb21tZW50IGluIENsYXNzIERlY2xhcmF0aW9uIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgLypDb21tZW50MSovIEEgeworICAgIC8vY29tbWVudDIKKyAgICAvLyBjb21tZW50MworICAgIGludCBhOworICAgIC8qKmNvbW1lbnQ0CisgICAgKgorICAgICogKi8KKyAgICAvL2NvbW1lbnQ1Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGNsYXNzIDEgaXMgbm90IGNvbW1lbnRlZAorVGhlbiBjbGFzcyAxIG9ycGhhbiBjb21tZW50IDEgaXMgIkNvbW1lbnQyIgorCisKK1NjZW5hcmlvOiBBIENsYXNzIFdpdGggTGluZSBDb21tZW50cyBpbiBNdWx0aXBsZSBNZXRob2RzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworcHVibGljIGNsYXNzIENsYXNzV2l0aExpbmVDb21tZW50c0luTXVsdGlwbGVNZXRob2RzIHsKKworICAgIHB1YmxpYyB2b2lkIGFNZXRob2QoKSB7CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGEgPSAwOyAvL3NlY29uZCBjb21tZW50CisgICAgICAgIC8vIHRoaXJkIGNvbW1lbnQKKyAgICAgICAgLy8gZm91cnRoIGNvbW1lbnQKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbm90aGVyTWV0aG9kKCkgeworICAgICAgICAvLyBhIHVuaXF1ZSBjb21tZW50CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGEgPSAwOyAvL3NlY29uZCBjb21tZW50CisgICAgICAgIC8vIHRoaXJkIGNvbW1lbnQKKyAgICAgICAgLy8gZm91cnRoIGNvbW1lbnQKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyA5IGNvbnRhaW5lZCBjb21tZW50cworVGhlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgMCBvcnBoYW4gY29tbWVudHMKK1RoZW4gY2xhc3MgMSBpcyBub3QgY29tbWVudGVkCitUaGVuIGNsYXNzIDEgaGFzIDkgdG90YWwgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIDQgdG90YWwgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIDAgb3JwaGFuIGNvbW1lbnRzCitUaGVuIGJsb2NrIHN0YXRlbWVudCBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyA0IHRvdGFsIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBibG9jayBzdGF0ZW1lbnQgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBoYXMgMyBvcnBoYW4gY29tbWVudHMKK1RoZW4gbWV0aG9kIDIgaW4gY2xhc3MgMSBoYXMgNSB0b3RhbCBjb250YWluZWQgY29tbWVudHMKK1RoZW4gbWV0aG9kIDIgaW4gY2xhc3MgMSBoYXMgMCBvcnBoYW4gY29tbWVudHMKK1RoZW4gYmxvY2sgc3RhdGVtZW50IGluIG1ldGhvZCAyIGluIGNsYXNzIDEgaGFzIDUgdG90YWwgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIGJsb2NrIHN0YXRlbWVudCBpbiBtZXRob2QgMiBpbiBjbGFzcyAxIGhhcyA0IG9ycGhhbiBjb21tZW50cworCisKKworU2NlbmFyaW86IEEgQ2xhc3MgV2l0aCBMaW5lIENvbW1lbnRzIGluIE11bHRpcGxlIE1ldGhvZHMgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CitwYWNrYWdlIGphcGEucGFyc2VyLmNvbW1lbnRzOworCitwdWJsaWMgY2xhc3MgQ2xhc3NXaXRoTGluZUNvbW1lbnRJbnNpZGVCbG9ja0NvbW1lbnQgeworCisgICAgLyogY29tbWVudCB0byBhIG1ldGhvZCAqLworICAgIHZvaWQgZm9vKCl7fQorCisgICAgLyovLyBMaW5lIENvbW1lbnQgcHV0IGltbWVkaWF0ZWx5IGFmdGVyIGJsb2NrIGNvbW1lbnQKKworICAgIC8vLy8gQ29tbWVudCBkZWJhdWNoZXJ5CisKKyAgICBhbm90aGVyIG9ycGhhbi4KKyAgICBJdCBzcGFucyBvdmVyIG1vcmUgbGluZXMgKi8KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyBjb21tZW50ZWQgIiBjb21tZW50IHRvIGEgbWV0aG9kICIKK1RoZW4gY2xhc3MgMSBvcnBoYW4gY29tbWVudCAxIGlzICIvLyBMaW5lIENvbW1lbnQgcHV0IGltbWVkaWF0ZWx5IGFmdGVyIGJsb2NrIGNvbW1lbnQKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8gQ29tbWVudCBkZWJhdWNoZXJ5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG9ycGhhbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBzcGFucyBvdmVyIG1vcmUgbGluZXMgIgorCisKKworU2NlbmFyaW86IEEgQ2xhc3MgV2l0aCBMaW5lIENvbW1lbnRzIG9uIEZpZWxkcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIHRoZSBjbGFzczoKK3BhY2thZ2UgamFwYS5wYXJzZXIuY29tbWVudHM7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTQzIHsKKyAgICAvL0Nhc2UgMQorICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkMSA9IG51bGw7IC8vZmllbGQxCisKKyAgICAvL0Nhc2UgMgorICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkMgorICAgICAgICAgICAgPSBudWxsOyAvL2ZpZWxkMgorCit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyA0IGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjbGFzcyAxIGhhcyA0IHRvdGFsIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjbGFzcyAxIGhhcyAxIG9ycGhhbiBjb21tZW50CitUaGVuIGNsYXNzIDEgb3JwaGFuIGNvbW1lbnQgMSBpcyAiQ2FzZSAxIgorVGhlbiBmaWVsZCAxIGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworIS0tVGhlbiBmaWVsZCAyIGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworVGhlbiBmaWVsZCAxIGluIGNsYXNzIDEgaXMgY29tbWVudGVkICJmaWVsZDEiCitUaGVuIGZpZWxkIDIgaW4gY2xhc3MgMSBpcyBjb21tZW50ZWQgIkNhc2UgMiIKK1RoZW4gdmFyaWFibGUgMSB2YWx1ZSBvZiBmaWVsZCAyIGluIGNsYXNzIDEgaXMgY29tbWVudGVkICJmaWVsZDIiCisKKworU2NlbmFyaW86IEFub3RoZXIgQ2xhc3MgV2l0aCBMaW5lIENvbW1lbnRzIG9uIEZpZWxkcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIHRoZSBjbGFzczoKK3BhY2thZ2UgamFwYS5wYXJzZXIuY29tbWVudHM7CisKK3B1YmxpYyBjbGFzcyBJc3N1ZTQzdmFyaWFudCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmllbGQxID0gbnVsbDsgLy9maWVsZDEKKworICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkMgorICAgICAgICAgICAgPSBudWxsOyAvL2ZpZWxkMgorCit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAyIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjbGFzcyAxIGhhcyAyIHRvdGFsIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBmaWVsZCAxIGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworIS0tVGhlbiBmaWVsZCAyIGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworVGhlbiBmaWVsZCAxIGluIGNsYXNzIDEgaXMgY29tbWVudGVkICJmaWVsZDEiCitUaGVuIHZhcmlhYmxlIDEgdmFsdWUgb2YgZmllbGQgMiBpbiBjbGFzcyAxIGlzIGNvbW1lbnRlZCAiZmllbGQyIgorCisKK1NjZW5hcmlvOiBBIENsYXNzIFdpdGggTWl4ZWQgQ29tbWVudHMgb24gRmllbGRzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5qYXZhY2M7CitwdWJsaWMgY2xhc3MgVGVzdGUgeworICAgIC8vbGluZSBjb21tZW50MQorICAgIGludCBhID0gMDsgLy9saW5lIGNvbW1lbnQyCisgICAgaW50IGIgPSAwOyAvL2xpbmUgY29tbWVudDMKKyAgICBpbnQgYyA9IDA7IC8qIG11bHRpLWxpbmUKKyAgICAgICAgICAgICAgICAqIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAqLworICAgIGludCBkID0gMDsgLyoqIG11bHRpLWxpbmUKKyAgICAgICAgICAgICAgICAqIGphdmFkb2MgKi8KKyAgICBpbnQgZSA9IDA7Cit9CisvL2ZpbmFsIGNvbW1lbnQKK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIDYgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIGNsYXNzIDEgaGFzIDUgdG90YWwgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIGNsYXNzIDEgb3JwaGFuIGNvbW1lbnQgMSBpcyAibGluZSBjb21tZW50MSIKK1RoZW4gZmllbGQgMSBpbiBjbGFzcyAxIGlzIGNvbW1lbnRlZCAibGluZSBjb21tZW50MiIKK1RoZW4gZmllbGQgMiBpbiBjbGFzcyAxIGlzIGNvbW1lbnRlZCAibGluZSBjb21tZW50MyIKK1RoZW4gZmllbGQgMyBpbiBjbGFzcyAxIGlzIG5vdCBjb21tZW50ZWQKKworCisKK1NjZW5hcmlvOiBDb21tZW50IHdpdGggYSBwcmVjZWRpbmcgbGluZSBzcGFjZSBpcyBhbiBvcnBoYW4KKworR2l2ZW4gdGhlIGNsYXNzOgorLy9jb21tZW50CisKK2NsYXNzIEEge30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgb3JwaGFuIGNvbW1lbnQgMSBpcyAiY29tbWVudCIKKworCitTY2VuYXJpbzogQ29tbWVudCB3aXRob3V0IGEgcHJlY2VkaW5nIGxpbmUgc3BhY2UgaXMgYXNzb2NpYXRlZCB0byBjbGFzcworCitHaXZlbiB0aGUgY2xhc3M6CisvL2NvbW1lbnQKK2NsYXNzIEEge30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gY2xhc3MgMSBpcyBjb21tZW50ZWQgImNvbW1lbnQiCisKKworU2NlbmFyaW86IENvbW1lbnRzIGFmdGVyIEphdmFkb2MgYXJlIGF0dHJpYnV0ZWQgdG8gdGhlIG1ldGhvZCBpZiBmbGFnIGlzIGFjdGl2ZQorCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBJc3N1ZTQweworICAgIEBHRVQKKyAgICBAUGF0aCgib3JpZ2luYWwiKQorICAgIC8qKgorICAgICogUmV0dXJuIHRoZSBvcmlnaW5hbCB1c2VyLgorICAgICovCisgICAgcHVibGljIFVzZXIgZ2V0T3JpZ2luYWxVc2VyKFN0cmluZyB1c2VyTmFtZSkgeworICAgICAgICByZXR1cm4gdXNlclNlcnZpY2UuZ2V0T3JpZ2luYWxVc2VyKHVzZXJOYW1lKTsKKyAgICB9Cit9CitXaGVuIHRoZSBkbyBub3QgY29uc2lkZXIgYW5ub3RhdGlvbnMgYXMgbm9kZSBzdGFydCBmb3IgY29kZSBhdHRyaWJ1dGlvbiBpcyB0cnVlIG9uIHRoZSBKYXZhIHBhcnNlcgorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgMSBjb250YWluZWQgY29tbWVudHMKK1RoZW4gY29tbWVudCAxIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGFuIG9ycGhhbgorVGhlbiBtZXRob2QgMSBpbiBjbGFzcyAxIGlzIGNvbW1lbnRlZCAiKiBSZXR1cm4gdGhlIG9yaWdpbmFsIHVzZXIuIgorCisKKworU2NlbmFyaW86IENvbW1lbnRzIGFmdGVyIEphdmFkb2MgYXJlIGF0dHJpYnV0ZWQgdG8gdGhlIG1ldGhvZCBpZiBmbGFnIGlzIG5vdCBhY3RpdmUKKworR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgSXNzdWU0MHsKKyAgICBAR0VUCisgICAgQFBhdGgoIm9yaWdpbmFsIikKKyAgICAvKioKKyAgICAqIFJldHVybiB0aGUgb3JpZ2luYWwgdXNlci4KKyAgICAqLworICAgIHB1YmxpYyBVc2VyIGdldE9yaWdpbmFsVXNlcihTdHJpbmcgdXNlck5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJTZXJ2aWNlLmdldE9yaWdpbmFsVXNlcih1c2VyTmFtZSk7CisgICAgfQorfQorV2hlbiB0aGUgZG8gbm90IGNvbnNpZGVyIGFubm90YXRpb25zIGFzIG5vZGUgc3RhcnQgZm9yIGNvZGUgYXR0cmlidXRpb24gaXMgZmFsc2Ugb24gdGhlIEphdmEgcGFyc2VyCitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAxIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjb21tZW50IDEgaW4gY29tcGlsYXRpb24gdW5pdCBpcyBub3QgYW4gb3JwaGFuCitUaGVuIHR5cGUgb2YgbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyBjb21tZW50ZWQgIiogUmV0dXJuIHRoZSBvcmlnaW5hbCB1c2VyLiIKKworCitTY2VuYXJpbzogQSBDbGFzcyBXaXRoIExpbmUgQ29tbWVudHMgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CisvKkNvbXBpbGF0aW9uVW5pdENvbW1lbnQqLworcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworcHVibGljIGNsYXNzIENsYXNzV2l0aE1peGVkU3R5bGVDb21tZW50cyB7CisgICAgLy8gbGluZSBjb21tZW50CisgICAgaW50IGEgPSAwOworICAgIC8vIGFub3RoZXIgbGluZSBjb21tZW50CisgICAgaW50IGIgPSAwOworICAgIC8vIGxpbmUgY29tbWVudAorICAgIGludCBjID0gMDsKKyAgICAvKiBtdWx0aS1saW5lCisgICAgICAgY29tbWVudAorICAgICovCisgICAgaW50IGQgPSAwOworICAgIC8qKgorICAgICAqIG11bHRpLWxpbmUKKyAgICAgKi8KKyAgICBpbnQgZSA9IDA7CisgICAgLy8gZmluYWwgY29tbWVudAorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiB0aGUgY29tcGlsYXRpb24gaXMgY29tbWVudGVkICJDb21waWxhdGlvblVuaXRDb21tZW50IgorVGhlbiBjbGFzcyAxIGlzIG5vdCBjb21tZW50ZWQKK1RoZW4gY2xhc3MgMSBoYXMgNiB0b3RhbCBjb250YWluZWQgY29tbWVudHMKK1RoZW4gY2xhc3MgMSBvcnBoYW4gY29tbWVudCAxIGlzICIgZmluYWwgY29tbWVudCIKK1RoZW4gZmllbGQgMSBpbiBjbGFzcyAxIGlzIGNvbW1lbnRlZCAiIGxpbmUgY29tbWVudCIKK1RoZW4gZmllbGQgMSBpbiBjbGFzcyAxIGNvbnRhaW5zIDAgY29tbWVudHMKK1RoZW4gZmllbGQgMiBpbiBjbGFzcyAxIGlzIGNvbW1lbnRlZCAiIGFub3RoZXIgbGluZSBjb21tZW50IgorVGhlbiBmaWVsZCAyIGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworVGhlbiBmaWVsZCAzIGluIGNsYXNzIDEgaXMgY29tbWVudGVkICIgbGluZSBjb21tZW50IgorVGhlbiBmaWVsZCAzIGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworVGhlbiBmaWVsZCA0IGluIGNsYXNzIDEgaXMgY29tbWVudGVkICIgbXVsdGktbGluZSBjb21tZW50IgorVGhlbiBmaWVsZCA0IGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworVGhlbiBmaWVsZCA1IGluIGNsYXNzIDEgaXMgY29tbWVudGVkICIgKiBtdWx0aS1saW5lIgorVGhlbiBmaWVsZCA1IGluIGNsYXNzIDEgY29udGFpbnMgMCBjb21tZW50cworCisKK1NjZW5hcmlvOiBBIGNsYXNzIHdpdGggb25seSBhbiBvcnBoYW4gY29tbWVudCBpcyBwcm9jZXNzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIHRoZSBjbGFzczoKK2NsYXNzIEEgeworICAgIC8vIG9ycGhhbiBjb21tZW50IgorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgMSBjb250YWluZWQgY29tbWVudHMKK1RoZW4gY29tbWVudCAxIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgYW4gb3JwaGFuCitUaGVuIGNvbW1lbnQgMSBpbiBjb21waWxhdGlvbiB1bml0IHBhcmVudCBpcyBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24KKworCisKK1NjZW5hcmlvOiBBIGNsYXNzIHdpdGggb25seSBhIGNsYXNzIGNvbW1lbnQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CisvKiBDb21tZW50IG9mIHRoZSBjbGFzcyAqLworY2xhc3MgQSB7Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAxIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjb21tZW50IDEgaW4gY29tcGlsYXRpb24gdW5pdCBpcyBub3QgYW4gb3JwaGFuCitUaGVuIGNvbW1lbnQgMSBpbiBjb21waWxhdGlvbiB1bml0IGNvbW1lbnRlZCBub2RlIGlzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorCisKKworU2NlbmFyaW86IEEgQ2xhc3MgV2l0aCB0d28gY29tbWVudHMgYXQgY2xhc3MgbGV2ZWwgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CisvKiBPcnBoYW4gY29tbWVudCAqLworLyogQ29tbWVudCBvZiB0aGUgY2xhc3MgKi8KK2NsYXNzIEEgeworfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgMiBjb250YWluZWQgY29tbWVudHMKK1RoZW4gY29tbWVudCAxIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgYW4gb3JwaGFuCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IG9ycGhhbiBjb21tZW50IDEgaXMgIk9ycGhhbiBjb21tZW50IgorVGhlbiBjb21tZW50IDIgaW4gY29tcGlsYXRpb24gdW5pdCBpcyBub3QgYW4gb3JwaGFuCitUaGVuIGNvbW1lbnQgMiBpbiBjb21waWxhdGlvbiB1bml0IGNvbW1lbnRlZCBub2RlIGlzIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgorCisKK1NjZW5hcmlvOiBBIENsYXNzIGhhcyBhIGNvbW1lbnQgYXNzb2NpYXRlZCB0byBhIGZpZWxkIHdoZW4gcHJvY2Vzc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBpbnQgYSA9IDA7IC8vIGNvbW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgZmllbGQKK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIDEgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIGNvbW1lbnQgMSBpbiBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBhbiBvcnBoYW4KK1RoZW4gY29tbWVudCAxIGluIGNvbXBpbGF0aW9uIHVuaXQgY29tbWVudGVkIG5vZGUgaXMgRmllbGREZWNsYXJhdGlvbgorCisKK1NjZW5hcmlvOiBBIENsYXNzIGhhcyBhIGNvbW1lbnQgYXNzb2NpYXRlZCB0byBhIHRoZSBsaXRlcmFsIHdoZW4gcHJvY2Vzc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBpbnQgYQorICAgICAgICA9IDA7IC8vIGNvbW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgZmllbGQKK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIDEgY29udGFpbmVkIGNvbW1lbnRzCitUaGVuIGNvbW1lbnQgMSBpbiBjb21waWxhdGlvbiB1bml0IGlzIG5vdCBhbiBvcnBoYW4KK1RoZW4gY29tbWVudCAxIGluIGNvbXBpbGF0aW9uIHVuaXQgY29tbWVudGVkIG5vZGUgaXMgSW50ZWdlckxpdGVyYWxFeHByCisKKworCitTY2VuYXJpbzogQSBDbGFzcyB3aXRoIHR3byBsaW5lIGNvbW1lbnQgd2l0aGluIGEgbWV0aG9kIHdoZW4gcHJvY2Vzc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICB2b2lkIGZvbygpIHsKKyAgICAgICAgLy8gYSBjb21tZW50CisgICAgICAgIGludCBiOyAvLyBhbm90aGVyIGNvbW1lbnQKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAyIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjb21tZW50IDEgaW4gY29tcGlsYXRpb24gdW5pdCBpcyBhbiBvcnBoYW4KK1RoZW4gY29tbWVudCAxIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgImEgY29tbWVudCIKK1RoZW4gY29tbWVudCAyIGluIGNvbXBpbGF0aW9uIHVuaXQgaXMgbm90IGFuIG9ycGhhbgorVGhlbiBjb21tZW50IDIgaW4gY29tcGlsYXRpb24gdW5pdCBpcyAiYW5vdGhlciBjb21tZW50IgorVGhlbiBjb21tZW50IDIgaW4gY29tcGlsYXRpb24gdW5pdCBjb21tZW50ZWQgbm9kZSBpcyBFeHByZXNzaW9uU3RtdAorCisKK1NjZW5hcmlvOiBBIENsYXNzIHdpdGggYW4gaW5saW5lIGNvbW1lbnQgaW5zaWRlIGEgYmxvY2sgY29tbWVudCBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIHRoZSBjbGFzczoKK2NsYXNzIEEgeworICAgIC8qIEEgYmxvY2sgY29tbWVudCB0aGF0CisgICAgLy8gQ29udGFpbnMgYSBsaW5lIGNvbW1lbnQKKyAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAxIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjb21tZW50IDEgaW4gY29tcGlsYXRpb24gdW5pdCBpcyAiQSBibG9jayBjb21tZW50IHRoYXQgLy8gQ29udGFpbnMgYSBsaW5lIGNvbW1lbnQiCisKKworU2NlbmFyaW86IEEgQ2xhc3Mgd2l0aCBhbiBpbmxpbmUgY29tbWVudCBpbmJldHdlZW4gYW5ub3RhdGlvbiBhIG1ldGhvZCBkZWNsYXJhdGlvbiBpcyBwYXJzZWQgSmF2YSBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgQSB7CisgICAgQE92ZXJyaWRlCisgICAgLy8gUmV0dXJucyBudW1iZXIgb2Ygdm93ZWxzIGluIGEgbmFtZQorICAgIHB1YmxpYyBpbnQgY291bnRWb3dlbHMoU3RyaW5nIG5hbWUpIHsKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGhhcyAxIGNvbnRhaW5lZCBjb21tZW50cworVGhlbiBjb21tZW50IDEgaW4gY29tcGlsYXRpb24gdW5pdCBjb21tZW50ZWQgbm9kZSBpcyBQcmltaXRpdmVUeXBlCisKK1NjZW5hcmlvOiBXZSBwcmludCBjb3JyZWN0bHkgdHdvIGNvbnNlY3V0aXZlIGxpbmUtY29tbWVudHMgaW4gYSBjbGFzcworIAorR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgQSB7CisgIC8vIGZvbworICAvLyBiYXIKKyAgdm9pZCBhTWV0aG9kKCl7fQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorY2xhc3MgQSB7CisKKyAgICAvLyBmb28KKyAgICAvLyBiYXIKKyAgICB2b2lkIGFNZXRob2QoKSB7CisgICAgfQorfQorCitTY2VuYXJpbzogV2UgcHJpbnQgY29ycmVjdGx5IHR3byBjb25zZWN1dGl2ZSBsaW5lLWNvbW1lbnRzIGluIGEgbWV0aG9kCisKK0dpdmVuIHRoZSBjbGFzczoKK2NsYXNzIEEgeworICB2b2lkIGFNZXRob2QoKXsKKyAgICAgLy8gZm9vCisgICAgIC8vIGJhcgorICAgICBpbnQgYTsKKyAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorY2xhc3MgQSB7CisKKyAgICB2b2lkIGFNZXRob2QoKSB7CisgICAgICAgIC8vIGZvbworICAgICAgICAvLyBiYXIKKyAgICAgICAgaW50IGE7CisgICAgfQorfQorCitTY2VuYXJpbzogV2UgcHJpbnQgY29ycmVjdGx5IG9ycGhhbiBjb21tZW50cyBpbiBhIGZvciBsb29wCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgY2FsY3VsYXJSZXN1bHRhZG9GaW5hbChMaXN0IGF2YWxpYWNvZXMpIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb257CisgICAgICAgIGZvcihBdmFsaWFjYW8gYXZhbGlhY2FvOiBhdmFsaWFjb2VzKXsKKyAgICAgICAgICAgIC8vIGlmKGF2YWxpYWNhby5vYnRlckFwcm92YWNhbygpKXsKKyAgICAgICAgICAgIC8vIGF2YWxpYWNhby5zZXRSZXN1bHRhZG9GaW5hbCgiQXByb3ZhZG8iKTsKKyAgICAgICAgICAgIC8vIH1lbHNleworICAgICAgICAgICAgLy8gYXZhbGlhY2FvLnNldFJlc3VsdGFkb0ZpbmFsKCJSZXByb3ZhZG8iKTsKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIGF2YWxpYWNhby5zZXRFbUFiZXJ0byhmYWxzZSk7CisgICAgICAgICAgICBhdmFsaWFjYW8uZWRpdGFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF2YWxpYWNvZXM7CisgICAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorY2xhc3MgQSB7CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgY2FsY3VsYXJSZXN1bHRhZG9GaW5hbChMaXN0IGF2YWxpYWNvZXMpIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBmb3IgKEF2YWxpYWNhbyBhdmFsaWFjYW8gOiBhdmFsaWFjb2VzKSB7CisgICAgICAgICAgICAvLyBpZihhdmFsaWFjYW8ub2J0ZXJBcHJvdmFjYW8oKSl7CisgICAgICAgICAgICAvLyBhdmFsaWFjYW8uc2V0UmVzdWx0YWRvRmluYWwoIkFwcm92YWRvIik7CisgICAgICAgICAgICAvLyB9ZWxzZXsKKyAgICAgICAgICAgIC8vIGF2YWxpYWNhby5zZXRSZXN1bHRhZG9GaW5hbCgiUmVwcm92YWRvIik7CisgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICBhdmFsaWFjYW8uc2V0RW1BYmVydG8oZmFsc2UpOworICAgICAgICAgICAgYXZhbGlhY2FvLmVkaXRhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdmFsaWFjb2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9jb21tZW50X3BhcnNpbmdfc2NlbmFyaW9zLnN0b3J5IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL2NvbW1lbnRfcGFyc2luZ19zY2VuYXJpb3Muc3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxZDZlNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9jb21tZW50X3BhcnNpbmdfc2NlbmFyaW9zLnN0b3J5CkBAIC0wLDAgKzEsMjgxIEBACitTY2VuYXJpbzogQSBDbGFzcyBXaXRoIExpbmUgQ29tbWVudHMgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBDb21tZW50cyBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworcHVibGljIGNsYXNzIENsYXNzV2l0aExpbmVDb21tZW50cyB7CisKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKCl7CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGE9MDsgLy8gc2Vjb25kIGNvbW1lbnQKKyAgICAgICAgLy8gdGhpcmQgY29tbWVudAorICAgICAgICAvLyBmb3VydGggY29tbWVudAorICAgIH0KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgY29tbWVudCBwYXJzZXIKK1RoZW4gdGhlIHRvdGFsIG51bWJlciBvZiBjb21tZW50cyBpcyA0CitUaGVuIGxpbmUgY29tbWVudCAxIGlzICIgZmlyc3QgY29tbWVudCIKK1RoZW4gbGluZSBjb21tZW50IDIgaXMgIiBzZWNvbmQgY29tbWVudCIKK1RoZW4gbGluZSBjb21tZW50IDMgaXMgIiB0aGlyZCBjb21tZW50IgorVGhlbiBsaW5lIGNvbW1lbnQgNCBpcyAiIGZvdXJ0aCBjb21tZW50IgorVGhlbiB0aGUgbGluZSBjb21tZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOgorfGJlZ2luTGluZXxiZWdpbkNvbHVtbnxlbmRMaW5lfGVuZENvbHVtbnwKK3w2fDl8NnwyNXwKK3w3fDE4fDd8MzV8Cit8OHw5fDh8MjV8Cit8OXw5fDl8MjZ8CisKK1NjZW5hcmlvOiBBIENsYXNzIFdpdGggQmxvY2sgQ29tbWVudHMgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBDb21tZW50cyBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworLyogY29tbWVudCB3aGljaCBpcyBub3QgYXR0cmlidXRlZCB0byB0aGUgY2xhc3MsIGl0IGZsb2F0cyBhcm91bmQgYXMgYW4gb3JwaGFuICovCisvKiBjb21tZW50IHRvIGEgY2xhc3MgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhCbG9ja0NvbW1lbnRzIHsKKworICAgIC8qIGNvbW1lbnQgdG8gYSBtZXRob2QgKi8KKyAgICB2b2lkIGZvbygpe307CisKKyAgICAvKiBjb21tZW50IHB1dCByYW5kb21seSBpbiBjbGFzczoKKworICAgIGFub3RoZXIgb3JwaGFuLgorICAgIEl0IHNwYW5zIG92ZXIgbW9yZSBsaW5lcyAqLworCit9CisKKy8qIGEgY29tbWVudCBsb3N0IGluc2lkZSBhIGNvbXBpbGF0aW9uIHVuaXQuIEl0IGlzIG9ycGhhbiwgSSBhbSBzdXJlIHlvdSBnb3QgdGhpcyBvbmUgKi8KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgY29tbWVudCBwYXJzZXIKK1RoZW4gdGhlIHRvdGFsIG51bWJlciBvZiBjb21tZW50cyBpcyA1CitUaGVuIGJsb2NrIGNvbW1lbnQgMSBpcyAiIGNvbW1lbnQgd2hpY2ggaXMgbm90IGF0dHJpYnV0ZWQgdG8gdGhlIGNsYXNzLCBpdCBmbG9hdHMgYXJvdW5kIGFzIGFuIG9ycGhhbiAiCitUaGVuIGJsb2NrIGNvbW1lbnQgMiBpcyAiIGNvbW1lbnQgdG8gYSBjbGFzcyAiCitUaGVuIGJsb2NrIGNvbW1lbnQgMyBpcyAiIGNvbW1lbnQgdG8gYSBtZXRob2QgIgorVGhlbiBibG9jayBjb21tZW50IDQgaXMgIiBjb21tZW50IHB1dCByYW5kb21seSBpbiBjbGFzczogICAgYW5vdGhlciBvcnBoYW4uICAgIEl0IHNwYW5zIG92ZXIgbW9yZSBsaW5lcyAiCitUaGVuIGJsb2NrIGNvbW1lbnQgNSBpcyAiIGEgY29tbWVudCBsb3N0IGluc2lkZSBhIGNvbXBpbGF0aW9uIHVuaXQuIEl0IGlzIG9ycGhhbiwgSSBhbSBzdXJlIHlvdSBnb3QgdGhpcyBvbmUgICIKK1RoZW4gdGhlIGJsb2NrIGNvbW1lbnRzIGhhdmUgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6Cit8YmVnaW5MaW5lfGJlZ2luQ29sdW1ufGVuZExpbmV8ZW5kQ29sdW1ufAorfDN8MXwzfDgxfAorfDR8MXw0fDI0fAorfDd8NXw3fDI5fAorfDEwfDV8MTN8MzF8Cit8MTd8MXwxN3w4OHwKKworCitTY2VuYXJpbzogQSBDbGFzcyBXaXRoIEphdmFkb2MgQ29tbWVudHMgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBDb21tZW50cyBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworLyoqIGEgcHJvcGVyIGphdmFkb2MgY29tbWVudCAqLworcHVibGljIGNsYXNzIENsYXNzV2l0aEphdmFkb2NDb21tZW50cyB7CisKKyAgICB2b2lkIGZvbygpe307CisKKworfQorLyoqIGEgZmxvYXRpbmcgamF2YWRvYyBjb21tZW50ICovCitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIGNvbW1lbnQgcGFyc2VyCitUaGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgMgorVGhlbiBKYXZhZG9jIGNvbW1lbnQgMSBpcyAiIGEgcHJvcGVyIGphdmFkb2MgY29tbWVudCAiCitUaGVuIEphdmFkb2MgY29tbWVudCAyIGlzICIgYSBmbG9hdGluZyBqYXZhZG9jIGNvbW1lbnQgIgorVGhlbiB0aGUgSmF2YWRvYyBjb21tZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOgorfGJlZ2luTGluZXxiZWdpbkNvbHVtbnxlbmRMaW5lfGVuZENvbHVtbnwKK3wzfDF8M3wzMXwKK3wxMHwxfDEwfDMzfAorCisKKworU2NlbmFyaW86IEEgQ2xhc3MgV2l0aCBPcnBoYW4gQ29tbWVudHMgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBDb21tZW50cyBQYXJzZXIKKworR2l2ZW4gdGhlIGNsYXNzOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKKworLyoqSmF2YWRvYyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzKi8KK3B1YmxpYyBjbGFzcyBDbGFzc1dpdGhPcnBoYW5Db21tZW50cyB7CisgICAgLy9hIGZpcnN0IGNvbW1lbnQgZmxvYXRpbmcgaW4gdGhlIGNsYXNzCisKKyAgICAvL2NvbW1lbnQgYXNzb2NpYXRlZCB0byB0aGUgbWV0aG9kCisgICAgdm9pZCBmb28oKXsKKyAgICAgICAgLypjb21tZW50IGZsb2F0aW5nIGluc2lkZSB0aGUgbWV0aG9kKi8KKyAgICB9CisKKyAgICAvL2Egc2Vjb25kIGNvbW1lbnQgZmxvYXRpbmcgaW4gdGhlIGNsYXNzCit9CisKKy8vT3JwaGFuIGNvbW1lbnQgaW5zaWRlIHRoZSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgY29tbWVudCBwYXJzZXIKK1RoZW4gdGhlIHRvdGFsIG51bWJlciBvZiBjb21tZW50cyBpcyA2CitUaGVuIGxpbmUgY29tbWVudCAxIGlzICJhIGZpcnN0IGNvbW1lbnQgZmxvYXRpbmcgaW4gdGhlIGNsYXNzIgorVGhlbiBsaW5lIGNvbW1lbnQgMiBpcyAiY29tbWVudCBhc3NvY2lhdGVkIHRvIHRoZSBtZXRob2QiCitUaGVuIGxpbmUgY29tbWVudCAzIGlzICJhIHNlY29uZCBjb21tZW50IGZsb2F0aW5nIGluIHRoZSBjbGFzcyIKK1RoZW4gYmxvY2sgY29tbWVudCAxIGlzICJjb21tZW50IGZsb2F0aW5nIGluc2lkZSB0aGUgbWV0aG9kIgorVGhlbiBKYXZhZG9jIGNvbW1lbnQgMSBpcyAiSmF2YWRvYyBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIgorCisKK1NjZW5hcmlvOiBBIENsYXNzIFdpdGggT3JwaGFuIENvbW1lbnRzIGlzIHByb2Nlc3NlZCBieSB0aGUgQ29tbWVudHMgUGFyc2VyCisKK0dpdmVuIHRoZSBjbGFzczoKKy8qQ29tcGlsYXRpb25Vbml0Q29tbWVudCovCitwYWNrYWdlIGphcGEucGFyc2VyLmNvbW1lbnRzOworCitwdWJsaWMgY2xhc3MgQ2xhc3NXaXRoTWl4ZWRTdHlsZUNvbW1lbnRzIHsKKyAgICAvLyBsaW5lIGNvbW1lbnQKKyAgICBpbnQgYSA9IDA7CisgICAgLy8gYW5vdGhlciBsaW5lIGNvbW1lbnQKKyAgICBpbnQgYiA9IDA7CisgICAgLy8gbGluZSBjb21tZW50CisgICAgaW50IGMgPSAwOworICAgIC8qIG11bHRpLWxpbmUKKyAgICAgICBjb21tZW50CisgICAgKi8KKyAgICBpbnQgZCA9IDA7CisgICAgLyoqCisgICAgICogbXVsdGktbGluZQorICAgICAqLworICAgIGludCBlID0gMDsKKyAgICAvLyBmaW5hbCBjb21tZW50Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIGNvbW1lbnQgcGFyc2VyCitUaGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgNworVGhlbiB0aGUgbGluZSBjb21tZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOgorfGJlZ2luTGluZXxiZWdpbkNvbHVtbnxlbmRMaW5lfGVuZENvbHVtbnwKK3w1fDV8NXwyMHwKK3w3fDV8N3wyOHwKK3w5fDV8OXwyMHwKK3wxOXw1fDE5fDIxfAorVGhlbiB0aGUgYmxvY2sgY29tbWVudHMgaGF2ZSB0aGUgZm9sbG93aW5nIHBvc2l0aW9uczoKK3xiZWdpbkxpbmV8YmVnaW5Db2x1bW58ZW5kTGluZXxlbmRDb2x1bW58Cit8MXwxfDF8MjZ8Cit8MTF8NXwxM3w2fAorVGhlbiB0aGUgSmF2YWRvYyBjb21tZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOgorfGJlZ2luTGluZXxiZWdpbkNvbHVtbnxlbmRMaW5lfGVuZENvbHVtbnwKK3wxNXw1fDE3fDd8CisKK1NjZW5hcmlvOiBBIG1ldGhvZCBjb250YWluaW5nIHR3byBjb25zZWN1dGl2ZSBsaW5lIGNvbW1lbnRzIGlzIHBhcnNlZCBjb3JyZWN0bHkKKworR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgQSB7CisgIHZvaWQgYU1ldGhvZCgpeworICAgICAvLyBmb28KKyAgICAgLy8gYmFyCisgICAgIGludCBhOworICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIGNvbW1lbnQgcGFyc2VyCitUaGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgMgorVGhlbiBsaW5lIGNvbW1lbnQgMSBpcyAiIGZvbyIKK1RoZW4gbGluZSBjb21tZW50IDIgaXMgIiBiYXIiCisKK1NjZW5hcmlvOiBDb21tZW50cyBmcm9tIGEgZmlsZSB3aXRoIGFuIG5vbi1VVEYtOCBlbmNvZGluZyBhcmUgcGFyc2VkIGNvcnJlY3RseQorCitXaGVuIHJlYWQgc2FtcGxlICJDbGFzc0luTGF0aW4xIiB1c2luZyBlbmNvZGluZyAiSVNPLTg4NTktMSIKK1RoZW4gdGhlIHRvdGFsIG51bWJlciBvZiBjb21tZW50cyBpcyAzCitUaGVuIGxpbmUgY29tbWVudCAyIGlzICIgQSBsJ8OpbWVqIGluIHBpYXPDrCBjaGUgc2VudCBkw6tzZ3VzdC4iCisKK1NjZW5hcmlvOiBTaG91bGQgbm90IHJlY29nbml6ZSAvKi8gYXMgYSBjb21tZW50CisKK0dpdmVuIHRoZSBjbGFzczoKKy8qLworY2xhc3MgRm9vIHt9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIGNvbW1lbnQgcGFyc2VyCitUaGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgMAorCitHaXZlbiB0aGUgY2xhc3M6CisvKi8KK2NsYXNzIEZvbyB7fQorVGhlbiB0aGUgSmF2YSBwYXJzZXIgY2Fubm90IHBhcnNlIGl0IGJlY2F1c2Ugb2YgYW4gZXJyb3IKKworU2NlbmFyaW86IFNob3VsZCByZWNvZ25pemUgLyovIGluc2lkZSBhIGJsb2NrIGNvbW1lbnQKKworR2l2ZW4gdGhlIGNsYXNzOgorLyogRm9vIC8qLworV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBjb21tZW50IHBhcnNlcgorVGhlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbW1lbnRzIGlzIDEKK1RoZW4gYmxvY2sgY29tbWVudCAxIGlzICIgRm9vIC8iCisKK1NjZW5hcmlvOiBBIENsYXNzIFdpdGggQ2hhcmFjdGVyIExpdGVyYWwgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBDb21tZW50cyBQYXJzZXIKK0dpdmVuIHRoZSBjbGFzczoKK2NsYXNzIEEgeworICAgIC8qKiBjb21tZW50MSAqLworICAgIHByaXZhdGUgY2hhciBjID0gJyInOworICAgIC8qKiBjb21tZW50MiAqLworICAgIHByaXZhdGUgU3RyaW5nIGQ7Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIGNvbW1lbnQgcGFyc2VyCitUaGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgMgorVGhlbiBKYXZhZG9jIGNvbW1lbnQgMSBpcyAiY29tbWVudDEiCitUaGVuIEphdmFkb2MgY29tbWVudCAyIGlzICJjb21tZW50MiIKKworU2NlbmFyaW86IERvdWJsZSBzbGFzaCBpbiBzdHJpbmcgZG9lcyBub3QgbWVzcyB1cCBjb21tZW50cyBwYXJzaW5nCitHaXZlbiB0aGUgY2xhc3M6CitwdWJsaWMgY2xhc3MgYiB7CisKKyAgICBwdWJsaWMgdm9pZCBtMSgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiXFwiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1lbnQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIG0yKCkgeworICAgICAgICByZXR1cm47CisgICAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBjb21tZW50IHBhcnNlcgorVGhlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbW1lbnRzIGlzIDEKKworU2NlbmFyaW86IFRyaXBsZSBzbGFzaCBpbiBzdHJpbmcgZG9lcyBub3QgbWVzcyB1cCBjb21tZW50cyBwYXJzaW5nCitHaXZlbiB0aGUgY2xhc3M6CitwdWJsaWMgY2xhc3MgYiB7CisKKyAgICBwdWJsaWMgdm9pZCBtMSgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiXFxcIiAvLyBzdGlsbCBpbiBzdHJpbmciOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1lbnQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIG0yKCkgeworICAgICAgICByZXR1cm47CisgICAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBjb21tZW50IHBhcnNlcgorVGhlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbW1lbnRzIGlzIDEKKworU2NlbmFyaW86IEZvdXIgc2xhc2hlcyBpbiBzdHJpbmcgZG9lcyBub3QgbWVzcyB1cCBjb21tZW50cyBwYXJzaW5nCitHaXZlbiB0aGUgY2xhc3M6CitwdWJsaWMgY2xhc3MgYiB7CisKKyAgICBwdWJsaWMgdm9pZCBtMSgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiXFxcXCIgLy8gb3V0IG9mIHRoZSBzdHJpbmciOworICAgICAgICA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbWVudAorICAgICovCisgICAgcHVibGljIHZvaWQgbTIoKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIGNvbW1lbnQgcGFyc2VyCitUaGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tbWVudHMgaXMgMgorCitTY2VuYXJpbzogRml2ZSBzbGFzaGVzIGluIHN0cmluZyBkb2VzIG5vdCBtZXNzIHVwIGNvbW1lbnRzIHBhcnNpbmcKK0dpdmVuIHRoZSBjbGFzczoKK3B1YmxpYyBjbGFzcyBiIHsKKworICAgIHB1YmxpYyB2b2lkIG0xKCkgeworICAgICAgICBTdHJpbmcgcyA9ICJcXFxcXCIgLy8gc3RpbGwgaW4gc3RyaW5nIjsKKyAgICAgICAgOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1lbnQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIG0yKCkgeworICAgICAgICByZXR1cm47CisgICAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBjb21tZW50IHBhcnNlcgorVGhlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbW1lbnRzIGlzIDEKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9jb21wYXJpbmdfc2NlbmFyaW9zLnN0b3J5IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL2NvbXBhcmluZ19zY2VuYXJpb3Muc3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhNzc4NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9jb21wYXJpbmdfc2NlbmFyaW9zLnN0b3J5CkBAIC0wLDAgKzEsMTkgQEAKK1NjZW5hcmlvOiBDb21wYXJlIENVcyBjb250YWluaW5nIGxhbWJkYXMgc2hvdWxkIG5vdCBjcmFzaCBhd2Z1bGx5CisKK0dpdmVuIHRoZSBmaXJzdCBjbGFzczoKK3B1YmxpYyBjbGFzcyBBcnJheUxpc3RHZW5lcmljRGVtbyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGRhdGEgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGRhdGEuZm9yRWFjaCggcyAtPiBTeXN0ZW0ub3V0LnByaW50bG4ocykpOworICAgIH0KK30KK0dpdmVuIHRoZSBzZWNvbmQgY2xhc3M6CitwdWJsaWMgY2xhc3MgQXJyYXlMaXN0R2VuZXJpY0RlbW8geworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBkYXRhID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBkYXRhLmZvckVhY2goIHMgLT4gU3lzdGVtLm91dC5wcmludGxuKHMpKTsKKyAgICB9Cit9CitUaGVuIHRoZXkgYXJlIGVxdWFscwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL21hbmlwdWxhdGlvbl9zY2VuYXJpb3Muc3RvcnkgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvbWFuaXB1bGF0aW9uX3NjZW5hcmlvcy5zdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI4Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL21hbmlwdWxhdGlvbl9zY2VuYXJpb3Muc3RvcnkKQEAgLTAsMCArMSwxMzcgQEAKK1NjZW5hcmlvOiBBIE5vZGUgY2FuIG9ubHkgZXZlciBiZSBlcXVhbCB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBOb2RlCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitUaGVuIGlzIG5vdCBlcXVhbCB0byBudWxsCitUaGVuIGlzIG5vdCBlcXVhbCB0byAiU29tZSBTdHJpbmcgVmFsdWUiCisKKworU2NlbmFyaW86IEEgQmxvY2tTdG10IGNhbiBiZSBjcmVhdGVkIGJ5IGEgcHJvdmlkZWQgU3RyaW5nCisKK0dpdmVuIGEgQmxvY2tTdG10CitXaGVuIGlzIHRoZSBTdHJpbmcgIntyZXR1cm4geCt5O30iIGlzIHBhcnNlZCBieSB0aGUgSmF2YVBhcnNlciB1c2luZyBwYXJzZUJsb2NrCitUaGVuIFN0YXRlbWVudCAxIGluIEJsb2NrU3RtdCB0b1N0cmluZyBpcyAicmV0dXJuIHggKyB5OyIKKworCitTY2VuYXJpbzogQSBTdGF0ZW1lbnQgY2FuIGJlIGNyZWF0ZWQgYnkgYSBwcm92aWRlZCBTdHJpbmcKKworR2l2ZW4gYSBTdGF0ZW1lbnQKK1doZW4gaXMgdGhlIFN0cmluZyAieCA9IHgreTsiIGlzIHBhcnNlZCBieSB0aGUgSmF2YVBhcnNlciB1c2luZyBwYXJzZVN0YXRlbWVudAorVGhlbiBTdGF0ZW1lbnQgdG9TdHJpbmcgaXMgInggPSB4ICsgeTsiCisKKworU2NlbmFyaW86IEFkZGluZyBkZWNsYXJhdGlvbnMgdG8gYSBUcnlTdG10IGl0IGlzIHNldCBhcyB0aGUgcGFyZW50IG9mIGFsbCBwcm92aWRlZCBkZWNsYXJhdGlvbnMKKworR2l2ZW4gYSBUcnlTdG10CitHaXZlbiBhIExpc3Qgb2YgVmFyaWFibGVEZWNsYXJhdGlvbnMKK1doZW4gdGhlIExpc3Qgb2YgVmFyaWFibGVEZWNsYXJhdGlvbnMgYXJlIHNldCBhcyB0aGUgcmVzb3VyY2VzIG9uIFRyeVN0bXQKK1RoZW4gYWxsIHRoZSBWYXJpYWJsZURlY2xhcmF0aW9ucyBwYXJlbnQgaXMgdGhlIFRyeVN0bXQKKworCitTY2VuYXJpbzogQ3JlYXRpbmcgYSBjb21wbGV0ZSBDb21waWxhdGlvblVuaXQKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gaXMgc2V0IHRvICJqYXBhLnBhcnNlci5hc3QubWFuaXB1bGF0aW9uIgorV2hlbiBhIHB1YmxpYyBjbGFzcyBjYWxsZWQgIkNyZWF0ZUNsYXNzIiBpcyBhZGRlZCB0byB0aGUgQ29tcGlsYXRpb25Vbml0CitXaGVuIGEgcHVibGljIHN0YXRpYyBtZXRob2QgY2FsbGVkICJtYWluIiByZXR1cm5pbmcgdm9pZCBpcyBhZGRlZCB0byBjbGFzcyAxIGluIHRoZSBjb21waWxhdGlvbiB1bml0CitXaGVuIFN0cmluZyB2YXJhcmdzIGNhbGxlZCAiYXJncyIgYXJlIGFkZGVkIHRvIG1ldGhvZCAxIGluIGNsYXNzIDEKK1doZW4gYSBCbG9ja1N0bXQgaXMgYWRkZWQgdG8gbWV0aG9kIDEgaW4gY2xhc3MgMQorV2hlbiBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIFdvcmxkISIpOyBpcyBhZGRlZCB0byB0aGUgYm9keSBvZiBtZXRob2QgMSBpbiBjbGFzcyAxCitUaGVuIHRoZSBleHBlY3RlZCBzb3VyY2Ugc2hvdWxkIGJlOgorcGFja2FnZSBqYXBhLnBhcnNlci5hc3QubWFuaXB1bGF0aW9uOworCitwdWJsaWMgY2xhc3MgQ3JlYXRlQ2xhc3MgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZCEiKTsKKyAgICB9Cit9CisKKworU2NlbmFyaW86IENoYW5nZSB0aGUgbmFtZSBvZiBhIG1ldGhvZCB0byBiZSB1cHBlcmNhc2UKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorcGFja2FnZSBqYXBhLnBhcnNlci5hc3QubWFuaXB1bGF0aW9uOworCitwdWJsaWMgY2xhc3MgVXBkYXRlTWV0aG9kIHsKKworICAgIHB1YmxpYyB2b2lkIGNoYW5nZVRvVXBwZXJDYXNlKCl7fQorCisgICAgcHVibGljIHZvaWQgYW5vdGhlck1ldGhvZFRvQ2hhbmdlKCl7fQorfQorV2hlbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyBpdCdzIG5hbWUgY29udmVydGVkIHRvIHVwcGVyY2FzZQorVGhlbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyB0aGUgbmFtZSAiQ0hBTkdFVE9VUFBFUkNBU0UiCisKKworU2NlbmFyaW86IENoYW5nZSB0aGUgbmFtZSBvZiBhbGwgbWV0aG9kcyB0byBiZSB1cHBlcmNhc2UgdXNpbmcgYSB2aXNpdG9yCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuYXN0Lm1hbmlwdWxhdGlvbjsKKworcHVibGljIGNsYXNzIFVwZGF0ZU1ldGhvZCB7CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VUb1VwcGVyQ2FzZSgpe30KKworICAgIHB1YmxpYyB2b2lkIGFub3RoZXJNZXRob2RUb0NoYW5nZSgpe30KK30KK0dpdmVuIGEgQ2hhbmdlTmFtZVRvVXBwZXJDYXNlVmlzaXRvcgorV2hlbiB0aGUgQ2hhbmdlTmFtZVRvVXBwZXJDYXNlVmlzaXRvciB2aXNpdHMgdG8gY29tcGlsYXRpb24gdW5pdAorVGhlbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyB0aGUgbmFtZSAiQ0hBTkdFVE9VUFBFUkNBU0UiCitUaGVuIG1ldGhvZCAyIGluIGNsYXNzIDEgaGFzIHRoZSBuYW1lICJBTk9USEVSTUVUSE9EVE9DSEFOR0UiCisKKworU2NlbmFyaW86IEFkZCBpbnQgYXJndW1lbnRzIHRvIGEgbWV0aG9kCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuYXN0Lm1hbmlwdWxhdGlvbjsKKworcHVibGljIGNsYXNzIFVwZGF0ZU1ldGhvZCB7CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VUb1VwcGVyQ2FzZShTdHJpbmcgcGFyYW1ldGVyKXt9CisKKyAgICBwdWJsaWMgdm9pZCBhbm90aGVyTWV0aG9kVG9DaGFuZ2UoKXt9Cit9CitXaGVuIG1ldGhvZCAyIGluIGNsYXNzIDEgaGFzIGFuIGludCBwYXJhbWV0ZXIgY2FsbGVkICJ2YWx1ZSIgYWRkZWQKK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBoYXMgMSBwYXJhbWV0ZXJzCitUaGVuIG1ldGhvZCAyIGluIGNsYXNzIDEgaGFzIDEgcGFyYW1ldGVyCitUaGVuIG1ldGhvZCAyIGluIGNsYXNzIDEgcGFyYW1ldGVyIDEgaXMgdHlwZSBpbnQgY2FsbGVkICJ2YWx1ZSIKKworCitTY2VuYXJpbzogQWRkIGludCBhcmd1bWVudHMgdG8gYWxsIG1ldGhvZHMgdXNpbmcgYSB2aXNpdG9yCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuYXN0Lm1hbmlwdWxhdGlvbjsKKworcHVibGljIGNsYXNzIFVwZGF0ZU1ldGhvZCB7CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VUb1VwcGVyQ2FzZShTdHJpbmcgcGFyYW1ldGVyKXt9CisKKyAgICBwdWJsaWMgdm9pZCBhbm90aGVyTWV0aG9kVG9DaGFuZ2UoKXt9Cit9CitHaXZlbiBhIEFkZE5ld0ludFBhcmFtZXRlckNhbGxlZFZhbHVlVmlzaXRvcgorV2hlbiB0aGUgQWRkTmV3SW50UGFyYW1ldGVyQ2FsbGVkVmFsdWVWaXNpdG9yIHZpc2l0cyB0byBjb21waWxhdGlvbiB1bml0CitUaGVuIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIDIgcGFyYW1ldGVycworVGhlbiBtZXRob2QgMiBpbiBjbGFzcyAxIGhhcyAxIHBhcmFtZXRlcgorVGhlbiBtZXRob2QgMSBpbiBjbGFzcyAxIHBhcmFtZXRlciAyIGlzIHR5cGUgaW50IGNhbGxlZCAidmFsdWUiCitUaGVuIG1ldGhvZCAyIGluIGNsYXNzIDEgcGFyYW1ldGVyIDEgaXMgdHlwZSBpbnQgY2FsbGVkICJ2YWx1ZSIKKworCitTY2VuYXJpbzogQ2xvbmUgYSBjb21waWxhdGlvbiB1bml0CisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuYXN0Lm1hbmlwdWxhdGlvbjsKKworcHVibGljIGNsYXNzIFVwZGF0ZU1ldGhvZCB7CisKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VUb1VwcGVyQ2FzZShTdHJpbmcgcGFyYW1ldGVyKXt9CisKKyAgICBwdWJsaWMgdm9pZCBhbm90aGVyTWV0aG9kVG9DaGFuZ2UoKXt9Cit9CitXaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGNsb25lZAorVGhlbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyB0aGUgbmFtZSAiY2hhbmdlVG9VcHBlckNhc2UiCitUaGVuIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIDEgcGFyYW1ldGVycworVGhlbiBtZXRob2QgMiBpbiBjbGFzcyAxIGhhcyAwIHBhcmFtZXRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9wYXJzaW5nX3NjZW5hcmlvcy5zdG9yeSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9wYXJzaW5nX3NjZW5hcmlvcy5zdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZlZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3BhcnNpbmdfc2NlbmFyaW9zLnN0b3J5CkBAIC0wLDAgKzEsNTAwIEBACitTY2VuYXJpbzogVGVzdCBkZWNsYXJhdGlvbiBhcyBTdHJpbmcgZm9yIGNvbnN0cnVjdG9yIG9uIHBhcnNlZCBjbGFzcworCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBDbGFzc1dpdGhBQ29uc3RydWN0b3IgeworICAgIHByb3RlY3RlZCBDbGFzc1dpdGhBQ29uc3RydWN0b3IoaW50IGEsIFN0cmluZyBiKSB0aHJvd3MgVGhpcywgQW5kVGhhdCwgQW5kV2hhdEVsc2UgeworICAgIH0KK30KK1RoZW4gY29uc3RydWN0b3IgMSBpbiBjbGFzcyAxIGRlY2xhcmF0aW9uIGFzIGEgU3RyaW5nIGlzICJwcm90ZWN0ZWQgQ2xhc3NXaXRoQUNvbnN0cnVjdG9yKGludCBhLCBTdHJpbmcgYikgdGhyb3dzIFRoaXMsIEFuZFRoYXQsIEFuZFdoYXRFbHNlIgorVGhlbiBhbGwgbm9kZXMgcmVmZXIgdG8gdGhlaXIgcGFyZW50CisKKworU2NlbmFyaW86IFRlc3QgZGVjbGFyYXRpb24gYXMgU3RyaW5nIGV4Y2x1c2luZyBtb2RpZmllcnMgYW5kIHRocm93cyBmb3IgY29uc3RydWN0b3Igb24gcGFyc2VkIGNsYXNzCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK2NsYXNzIENsYXNzV2l0aEFDb25zdHJ1Y3RvciB7CisgICAgcHJvdGVjdGVkIENsYXNzV2l0aEFDb25zdHJ1Y3RvcihpbnQgYSwgU3RyaW5nIGIpIHRocm93cyBUaGlzLCBBbmRUaGF0LCBBbmRXaGF0RWxzZSB7CisgICAgfQorfQorVGhlbiBjb25zdHJ1Y3RvciAxIGluIGNsYXNzIDEgZGVjbGFyYXRpb24gc2hvcnQgZm9ybSBhcyBhIFN0cmluZyBpcyAiQ2xhc3NXaXRoQUNvbnN0cnVjdG9yKGludCBhLCBTdHJpbmcgYikiCitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKKworCitTY2VuYXJpbzogVGVzdCBkZWNsYXJhdGlvbiBhcyBTdHJpbmcgZXhjbHVzaW5nIG1vZGlmaWVycyBhbmQgdGhyb3dzIGZvciBtZXRob2Qgb24gcGFyc2VkIGNsYXNzCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK2NsYXNzIENsYXNzV2l0aEFNZXRob2QgeworICAgIC8qY29tbWVudDEqLworICAgIGZpbmFsIHByb3RlY3RlZCAvKmNvbW1lbnQyKi8gbmF0aXZlIExpc3Q8U3RyaW5nPiAvKmNvbW1lbnQyKi8gYU1ldGhvZChpbnQgYSwgU3RyaW5nIGIpIHRocm93cyAvKmNvbW1lbnQzKi8gVGhpcywgQW5kVGhhdCwgQW5kV2hhdEVsc2UgeworCisgICAgfQorfQorVGhlbiBtZXRob2QgMSBpbiBjbGFzcyAxIGRlY2xhcmF0aW9uIGFzIGEgU3RyaW5nIGlzICJwcm90ZWN0ZWQgZmluYWwgbmF0aXZlIExpc3Q8U3RyaW5nPiBhTWV0aG9kKGludCBhLCBTdHJpbmcgYikgdGhyb3dzIFRoaXMsIEFuZFRoYXQsIEFuZFdoYXRFbHNlIgorVGhlbiBhbGwgbm9kZXMgcmVmZXIgdG8gdGhlaXIgcGFyZW50CisKKworU2NlbmFyaW86IFRlc3QgZGVjbGFyYXRpb24gYXMgU3RyaW5nIGV4Y2x1c2luZyBtb2RpZmllcnMgYW5kIHRocm93cyBmb3IgbWV0aG9kIG9uIHBhcnNlZCBjbGFzcworCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBDbGFzc1dpdGhBTWV0aG9kIHsKKyAgICAvKmNvbW1lbnQxKi8KKyAgICBmaW5hbCBwcm90ZWN0ZWQgLypjb21tZW50MiovIG5hdGl2ZSBMaXN0PFN0cmluZz4gLypjb21tZW50MiovIGFNZXRob2QoaW50IGEsIFN0cmluZyBiKSB0aHJvd3MgLypjb21tZW50MyovIFRoaXMsIEFuZFRoYXQsIEFuZFdoYXRFbHNlIHsKKworICAgIH0KK30KK1RoZW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBkZWNsYXJhdGlvbiBhcyBhIFN0cmluZyBzaG9ydCBmb3JtIGlzICJMaXN0PFN0cmluZz4gYU1ldGhvZChpbnQgYSwgU3RyaW5nIGIpIgorVGhlbiBhbGwgbm9kZXMgcmVmZXIgdG8gdGhlaXIgcGFyZW50CisKKworU2NlbmFyaW86IFRoZSBzYW1lIGNsYXNzIHNvdXJjZSBpcyBwYXJzZWQgYnkgdHdvIGRpZmZlcmVudCBjb21waWxhdGlvbiB1bml0cyBhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZSBlcXVhbAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorR2l2ZW4gYSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuY29tbWVudHM7CitwdWJsaWMgY2xhc3MgQ2xhc3NFcXVhbGl0eSB7CisKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKCl7CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGE9MDsgLy8gc2Vjb25kIGNvbW1lbnQKKyAgICB9Cit9CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlcyBpcyBwYXJzZWQgYnkgdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQ6CitwYWNrYWdlIGphcGEucGFyc2VyLmNvbW1lbnRzOworcHVibGljIGNsYXNzIENsYXNzRXF1YWxpdHkgeworCisgICAgcHVibGljIHZvaWQgYU1ldGhvZCgpeworICAgICAgICAvLyBmaXJzdCBjb21tZW50CisgICAgICAgIGludCBhPTA7IC8vIHNlY29uZCBjb21tZW50CisgICAgfQorfQorVGhlbiB0aGUgQ29tcGlsYXRpb25Vbml0IGlzIGVxdWFsIHRvIHRoZSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0CitUaGVuIHRoZSBDb21waWxhdGlvblVuaXQgaGFzIHRoZSBzYW1lIGhhc2hjb2RlIHRvIHRoZSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0CitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKK1RoZW4gYWxsIG5vZGVzIG9mIHRoZSBzZWNvbmQgY29tcGlsYXRpb24gdW5pdCByZWZlciB0byB0aGVpciBwYXJlbnQKKworCitTY2VuYXJpbzogVHdvIGRpZmZlcmVudCBjbGFzcyBzb3VyY2VzIGFyZSBwYXJzZWQgYnkgdHdvIGRpZmZlcmVudCBjb21waWxhdGlvbiB1bml0cyBhbmQgc2hvdWxkIG5vdCBiZSBlcXVhbAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorR2l2ZW4gYSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuY29tbWVudHM7CitwdWJsaWMgY2xhc3MgQ2xhc3NFcXVhbGl0eSB7CisKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKCl7CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGE9MDsgLy8gc2Vjb25kIGNvbW1lbnQKKyAgICB9Cit9CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlcyBpcyBwYXJzZWQgYnkgdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQ6CitwYWNrYWdlIGphcGEucGFyc2VyLmNvbW1lbnRzOworcHVibGljIGNsYXNzIERpZmZlcmVudENsYXNzIHsKKworICAgIHB1YmxpYyB2b2lkIGFNZXRob2QoKXsKKyAgICAgICAgLy8gZmlyc3QgY29tbWVudAorICAgICAgICBpbnQgYT0wOyAvLyBzZWNvbmQgY29tbWVudAorICAgIH0KK30KK1RoZW4gdGhlIENvbXBpbGF0aW9uVW5pdCBpcyBub3QgZXF1YWwgdG8gdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQKK1RoZW4gdGhlIENvbXBpbGF0aW9uVW5pdCBoYXMgYSBkaWZmZXJlbnQgaGFzaGNvZGUgdG8gdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQKK1RoZW4gYWxsIG5vZGVzIHJlZmVyIHRvIHRoZWlyIHBhcmVudAorVGhlbiBhbGwgbm9kZXMgb2YgdGhlIHNlY29uZCBjb21waWxhdGlvbiB1bml0IHJlZmVyIHRvIHRoZWlyIHBhcmVudAorCisKK1NjZW5hcmlvOiBDbGFzc2VzIHRoYXQgb25seSBkaWZmZXIgYnkgY29tbWVudHMgc2hvdWxkIG5vdCBiZSBlcXVhbCBvciBoYXZlIHRoZSBzYW1lIGhhc2hjb2RlCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitHaXZlbiBhIHNlY29uZCBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorcGFja2FnZSBqYXBhLnBhcnNlci5jb21tZW50czsKK3B1YmxpYyBjbGFzcyBDbGFzc0VxdWFsaXR5IHsKKworICAgIHB1YmxpYyB2b2lkIGFNZXRob2QoKXsKKyAgICAgICAgLy8gZmlyc3QgY29tbWVudAorICAgICAgICBpbnQgYT0wOyAvLyBzZWNvbmQgY29tbWVudAorICAgIH0KK30KK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzIGlzIHBhcnNlZCBieSB0aGUgc2Vjb25kIENvbXBpbGF0aW9uVW5pdDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuY29tbWVudHM7CitwdWJsaWMgY2xhc3MgQ2xhc3NFcXVhbGl0eSB7CisKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKCl7CisgICAgICAgIC8vIGZpcnN0IGNvbW1lbnQKKyAgICAgICAgaW50IGE9MDsKKyAgICB9Cit9CitUaGVuIHRoZSBDb21waWxhdGlvblVuaXQgaXMgbm90IGVxdWFsIHRvIHRoZSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0CitUaGVuIHRoZSBDb21waWxhdGlvblVuaXQgaGFzIGEgZGlmZmVyZW50IGhhc2hjb2RlIHRvIHRoZSBzZWNvbmQgQ29tcGlsYXRpb25Vbml0CitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKK1RoZW4gYWxsIG5vZGVzIG9mIHRoZSBzZWNvbmQgY29tcGlsYXRpb24gdW5pdCByZWZlciB0byB0aGVpciBwYXJlbnQKKworCitTY2VuYXJpbzogQSBjbGFzcyB3aXRoIGEgY29sb24gaW4gdGhlIGFubm9hdGlvbiB2YWx1ZSBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXIuYXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworcHVibGljIGNsYXNzIElzc3VlMzcgeworICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBTb21lQW5ub3RhdGlvbiB7CisgICAgICAgIFN0cmluZyB2YWx1ZSgpOworICAgIH0KKyAgICAvLyBQYXJzZXIgYnVnOiB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgQFNvbWVBbm5vdGF0aW9uKCJodHRwOi8vc29tZVVSTC5vcmcvIikKKyAgICBwcm90ZWN0ZWQgVGVzdCB0ZXN0OworfQorVGhlbiBmaWVsZCAxIGluIGNsYXNzIDEgY29udGFpbnMgYW5ub3RhdGlvbiAxIHZhbHVlIGlzICIiaHR0cDovL3NvbWVVUkwub3JnLyIiCitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKKworCitTY2VuYXJpbzogQSBjbGFzcyB3aXRoIGEgTGFtYmRhIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorcGFja2FnZSBiZGQuc2FtcGxlczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKK3B1YmxpYyBjbGFzcyBMYW1iZGFzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgLy8gTGFtYmRhIFJ1bm5hYmxlCisgICAgICAgIFJ1bm5hYmxlIHIxID0gKCkgLT4gU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB3b3JsZCEiKTsKKyAgICAgICAgUnVubmFibGUgcjIgPSAoKSAtPiB7fTsKKyAgICAgICAgUnVubmFibGUgcjMgPSAoKSAtPiB7IFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gd29ybGQgdHdvISIpOyB9OworCisgICAgICAgIFN0cmVhbTxDaGFyU2VxdWVuY2U+IHN0cmVhbSA9IFN0cmVhbS5nZW5lcmF0ZSgoU3VwcGxpZXI8Q2hhclNlcXVlbmNlPikgKCkgLT4gImZvbyIpOworICAgIH0KK30KK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAxIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaXMgY2FsbGVkIHIxCitUaGVuIGxhbWJkYSBpbiBzdGF0ZW1lbnQgMiBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGlzIGNhbGxlZCByMgorVGhlbiBsYW1iZGEgaW4gc3RhdGVtZW50IDMgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyBjYWxsZWQgcjMKK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAxIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgYm9keSBpcyAiU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB3b3JsZCEiKTsiCitUaGVuIGxhbWJkYSBpbiBzdGF0ZW1lbnQgMiBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGJsb2NrIHN0YXRlbWVudCBpcyBudWxsCitUaGVuIGxhbWJkYSBpbiBzdGF0ZW1lbnQgMyBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGJsb2NrIHN0YXRlbWVudCBpcyAiU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB3b3JsZCB0d28hIik7IgorVGhlbiBsYW1iZGEgaW4gc3RhdGVtZW50IDEgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyBwYXJlbnQgb2YgY29udGFpbmVkIGJvZHkKK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAzIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaXMgcGFyZW50IG9mIGNvbnRhaW5lZCBib2R5CitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKK1RoZW4gbGFtYmRhIGluIG1ldGhvZCBjYWxsIGluIHN0YXRlbWVudCA0IGluIG1ldGhvZCAxIGluIGNsYXNzIDEgYm9keSBpcyAiImZvbyI7IgorCisKK1NjZW5hcmlvOiBBIGNsYXNzIHdpdGggcGFyYW1ldGVyaXplZCBMYW1iZGFzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBQYXJzZXIKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXNyc2VyLmJkZC5wYXJzaW5nOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkTGFtYmRhcyB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBGdW5jdGlvbjxJbnRlZ2VyLFN0cmluZz4gZjEgPSAoSW50ZWdlciBpKSAtPiBTdHJpbmcudmFsdWVPZihpKTsKKyAgICAgICAgRnVuY3Rpb248SW50ZWdlcixTdHJpbmc+IGYyID0gKGkpIC0+IFN0cmluZy52YWx1ZU9mKGkpOworICAgICAgICBGdW5jdGlvbjxJbnRlZ2VyLFN0cmluZz4gZjMgPSBpIC0+IFN0cmluZy52YWx1ZU9mKGkpOworICAgIH0KK30KK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAxIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaXMgcGFyZW50IG9mIGNvbnRhaW5lZCBwYXJhbWV0ZXIKK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAyIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaXMgcGFyZW50IG9mIGNvbnRhaW5lZCBwYXJhbWV0ZXIKK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAzIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaXMgcGFyZW50IG9mIGNvbnRhaW5lZCBwYXJhbWV0ZXIKK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAxIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaXMgcGFyZW50IG9mIGNvbnRhaW5lZCBib2R5CitUaGVuIGxhbWJkYSBpbiBzdGF0ZW1lbnQgMiBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGlzIHBhcmVudCBvZiBjb250YWluZWQgYm9keQorVGhlbiBsYW1iZGEgaW4gc3RhdGVtZW50IDMgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBpcyBwYXJlbnQgb2YgY29udGFpbmVkIGJvZHkKK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAxIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIHBhcmFtZXRlcnMgd2l0aCBub24tbnVsbCB0eXBlCitUaGVuIGxhbWJkYSBpbiBzdGF0ZW1lbnQgMiBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGhhcyBwYXJhbWV0ZXJzIHdpdGggbm9uLW51bGwgdHlwZQorVGhlbiBsYW1iZGEgaW4gc3RhdGVtZW50IDMgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBoYXMgcGFyYW1ldGVycyB3aXRoIG5vbi1udWxsIHR5cGUKKworCitTY2VuYXJpbzogQSBjbGFzcyB3aXRoIG11bHRpLXBhcmFtZXRlcnMgTGFtYmRhcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFzcnNlci5iZGQucGFyc2luZzsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitwdWJsaWMgY2xhc3MgTXVsdGlQYXJhbWV0ZXJpemVkTGFtYmRhcyB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBCaUZ1bmN0aW9uPEludGVnZXIsIEludGVnZXIsIFN0cmluZz4gZiA9IChhLCBiKSAtPiBTdHJpbmcudmFsdWVPZihhKSArIFN0cmluZy52YWx1ZU9mKGIpOworICAgIH0KK30KK1RoZW4gbGFtYmRhIGluIHN0YXRlbWVudCAxIGluIG1ldGhvZCAxIGluIGNsYXNzIDEgaGFzIHBhcmFtZXRlcnMgd2l0aCBub24tbnVsbCB0eXBlCisKKworU2NlbmFyaW86IEEgY2xhc3Mgd2l0aCBhIG1ldGhvZCByZWZlcmVuY2UgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIFBhcnNlcgorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIFN0cmluZyBuYW1lOworICAgIExvY2FsRGF0ZSBiaXJ0aGRheTsKKworICAgIHB1YmxpYyB2b2lkIHNvcnRCeUFnZShQZXJzb25bXSBwZW9wbGUpeworICAgICAgICBBcnJheXMuc29ydChwZW9wbGUsIFBlcnNvbjo6Y29tcGFyZUJ5QWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlQnlBZ2UoUGVyc29uIGEsIFBlcnNvbiBiKSB7CisgICAgICAgIHJldHVybiBhLmJpcnRoZGF5LmNvbXBhcmVUbyhiLmJpcnRoZGF5KTsKKyAgICB9Cit9CitUaGVuIG1ldGhvZCByZWZlcmVuY2UgaW4gc3RhdGVtZW50IDEgaW4gbWV0aG9kIDEgaW4gY2xhc3MgMSBzY29wZSBpcyBQZXJzb24KK1RoZW4gbWV0aG9kIHJlZmVyZW5jZSBpbiBzdGF0ZW1lbnQgMSBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGlkZW50aWZpZXIgaXMgY29tcGFyZUJ5QWdlCitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKKworCitTY2VuYXJpbzogQW4gaW50ZXJmYWNlIHdpdGggYSBkZWZhdWx0IG1ldGhvZCBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK2ludGVyZmFjZSBNeUludGVyZmFjZSB7CisgICAgZGVmYXVsdCBTdHJpbmcgZG9Tb21ldGhpbmcoKXsKKyAgICAgICAgcmV0dXJuICJpbXBsZW1lbnRhdGlvbiBpbiBhbiBpbnRlcmZhY2UhIjsKKyAgICB9CisKKyAgICBTdHJpbmcgZG9Tb21ldGhpbmdFbHNlKCk7Cit9CitUaGVuIG1ldGhvZCAxIGNsYXNzIDEgaXMgYSBkZWZhdWx0IG1ldGhvZAorVGhlbiBtZXRob2QgMiBjbGFzcyAxIGlzIG5vdCBhIGRlZmF1bHQgbWV0aG9kCitUaGVuIGFsbCBub2RlcyByZWZlciB0byB0aGVpciBwYXJlbnQKKworU2NlbmFyaW86IEEgbGFtYmRhIGV4cHJlc3Npb24gaW5zaWRlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBwYXJzZWQgYnkgdGhlIEphdmEgUGFyc2VyCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3B1YmxpYyBjbGFzcyBBeworCXN0YXRpYyA8VD4gUHJlZGljYXRlPFQ+IGlzRXF1YWwoT2JqZWN0IHRhcmdldFJlZikgeworCSAgICByZXR1cm4gKG51bGwgPT0gdGFyZ2V0UmVmKT8gT2JqZWN0czo6aXNOdWxsIDogb2JqZWN0IC0+IHRhcmdldFJlZi5lcXVhbHMob2JqZWN0KTsKKwl9Cit9CitUaGVuIFRoZW5FeHByIGluIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIG9mIHRoZSBzdGF0ZW1lbnQgMSBpbiBtZXRob2QgMSBpbiBjbGFzcyAxIGlzIExhbWJkYUV4cHIKKworU2NlbmFyaW86IFBhcnNpbmcgYXJyYXkgY3JlYXRpb24gZXhwcmVzc2lvbnMgdGhlIHBvc2l0aW9ucyBhcmUgY29ycmVjdAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQgKHRyaW1taW5nIHNwYWNlKToKK3B1YmxpYyBjbGFzcyBBeworICAgIGludFtdW10gYSA9IG5ldyBpbnRbXVtde307Cit9CitXaGVuIEkgdGFrZSB0aGUgQXJyYXlDcmVhdGlvbkV4cHIKK1RoZW4gdGhlIGJlZ2luIGxpbmUgaXMgMgorVGhlbiB0aGUgYmVnaW4gY29sdW1uIGlzIDE3CitUaGVuIHRoZSBlbmQgbGluZSBpcyAyCitUaGVuIHRoZSBlbmQgY29sdW1uIGlzIDI5CisKK1NjZW5hcmlvOiBzaW1wbGUgY2FzdCBvbiBsYW1iZGEgZXhwcmVzc2lvbiBjYW4gYmUgcGFyc2VkCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK2NsYXNzIEEgeworICAgIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPENocm9ub0xvY2FsRGF0ZT4gREFURV9PUkRFUiA9CisgICAgICAgIChDb21wYXJhdG9yPENocm9ub0xvY2FsRGF0ZT4pIChkYXRlMSwgZGF0ZTIpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLmNvbXBhcmUoZGF0ZTEudG9FcG9jaERheSgpLCBkYXRlMi50b0Vwb2NoRGF5KCkpOworICAgICAgICB9OworfQorVGhlbiBhbGwgbm9kZXMgcmVmZXIgdG8gdGhlaXIgcGFyZW50CisKKworU2NlbmFyaW86IGEgY29tYmluZWQgY2FzdCBvbiBsYW1iZGEgZXhwcmVzc2lvbiBjYW4gYmUgcGFyc2VkCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK2NsYXNzIEEgeworICAgIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPENocm9ub0xvY2FsRGF0ZT4gREFURV9PUkRFUiA9CisgICAgICAgIChDb21wYXJhdG9yPENocm9ub0xvY2FsRGF0ZT4gJiBTZXJpYWxpemFibGUpIChkYXRlMSwgZGF0ZTIpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLmNvbXBhcmUoZGF0ZTEudG9FcG9jaERheSgpLCBkYXRlMi50b0Vwb2NoRGF5KCkpOworICAgICAgICB9OworfQorVGhlbiBhbGwgbm9kZXMgcmVmZXIgdG8gdGhlaXIgcGFyZW50CisKKworU2NlbmFyaW86IGEgY29tYmluZWQgY2FzdCBvbiBhIGxpdGVyYWwgY2FuIGJlIHBhcnNlZAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBBIHsKKyAgICBzdGF0aWMgaW50IGEgPSAoQ29tcGFyYXRvcjxDaHJvbm9Mb2NhbERhdGU+ICYgU2VyaWFsaXphYmxlKSAxOworfQorVGhlbiBhbGwgbm9kZXMgcmVmZXIgdG8gdGhlaXIgcGFyZW50CisKKworU2NlbmFyaW86IFBhcnNpbmcgZXhjZXNzIHNlbWljb2xvbnMgb24gQ29tcGlsYXRpb25Vbml0IGxldmVsIHNob3VsZCB3b3JrCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6Cis7CitwYWNrYWdlIGE7Cis7CitpbXBvcnQgZm9vLmE7Cis7CitjbGFzcyBBIHsgfQorOworVGhlbiBubyBlcnJvcnMgYXJlIHJlcG9ydGVkCisKK1NjZW5hcmlvOiBQYXJzaW5nIGV4Y2VzcyBzZW1pY29sb25zIGluIGFuIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gc2hvdWxkIHdvcmsKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK0BpbnRlcmZhY2UgQSB7CisgICAgOworICAgIDsKK30KK1RoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZAorCitTY2VuYXJpbzogQ2xhc3NlcyB0aGF0IGFyZSB0aHJvd24gZnJvbSBhIG1ldGhvZCBjYW4gYmUgYW5ub3RhdGVkCisKK0dpdmVuIGEgQ29tcGlsYXRpb25Vbml0CitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK2NsYXNzIEEgeworICAgIHZvaWQgYSgpIHRocm93cyBAQWJjIFggeworICAgIH0KK30KK1RoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZAorCitTY2VuYXJpbzogQ2xhc3NlcyB0aGF0IGFyZSB0aHJvd24gZnJvbSBhIGNvbnN0cnVjdG9yIGNhbiBiZSBhbm5vdGF0ZWQKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorY2xhc3MgQSB7CisgICAgQSgpIHRocm93cyBAQWJjIFggeworICAgIH0KK30KK1RoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZAorCisKK1NjZW5hcmlvOiBQYXJzaW5nIHRyYWlsaW5nIHNlbWljb2xvbnMgaW5zaWRlIHRoZSBpbXBvcnRzIGFyZWEgc2hvdWxkIHdvcmsKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgoraW1wb3J0IGZvby5hOzsKK2ltcG9ydCBmb28uYjsKKworY2xhc3MgQSB7Cit9CitUaGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQKKworCitTY2VuYXJpbzogRnVsbCBwYWNrYWdlIG5hbWUgc2hvdWxkIGJlIHBhcnNlZAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5iZGQ7CitjbGFzcyBDIHt9CitXaGVuIEkgdGFrZSB0aGUgUGFja2FnZURlY2xhcmF0aW9uCitUaGVuIHRoZSBwYWNrYWdlIG5hbWUgaXMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmJkZAorCisKK1NjZW5hcmlvOiBTdHJpbmdzIHdpdGggdW5lc2NhcGVkIG5ld2xpbmVzIGFyZSBpbGxlZ2FsIChpc3N1ZSAyMTEpCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBwdWJsaWMgdm9pZCBoZWxsb1dvcmxkKFN0cmluZyBncmVldGluZywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICJoZWxsbworICAgICAgICB3b3JsZCI7CisgICAgfQorfQorVGhlbiB0aGUgSmF2YSBwYXJzZXIgY2Fubm90IHBhcnNlIGl0IGJlY2F1c2Ugb2YgYW4gZXJyb3IKKworU2NlbmFyaW86IENoYXJzIHdpdGggdW5lc2NhcGVkIG5ld2xpbmVzIGFyZSBpbGxlZ2FsIChpc3N1ZSAyMTEpCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBwdWJsaWMgdm9pZCBoZWxsb1dvcmxkKFN0cmluZyBncmVldGluZywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICcKKyc7CisgICAgfQorfQorVGhlbiB0aGUgSmF2YSBwYXJzZXIgY2Fubm90IHBhcnNlIGl0IGJlY2F1c2Ugb2YgYW4gZXJyb3IKKworU2NlbmFyaW86IERpYW1vbmQgT3BlcmF0b3IgaW5mb3JtYXRpb24gaXMgZXhwb3NlZAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBBIHsKKyAgICBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOworfQorV2hlbiBJIHRha2UgdGhlIE9iamVjdENyZWF0aW9uRXhwcgorVGhlbiB0aGUgdHlwZSdzIGRpYW1vbmQgb3BlcmF0b3IgZmxhZyBzaG91bGQgYmUgdHJ1ZQorCitTY2VuYXJpbzogRGlhbW9uZCBPcGVyYXRvciBjYW4gYmUgcGFyc2VkIGFsc28gd2l0aCBzcGFjZSBhbmQgY29tbWVudHMKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorY2xhc3MgQSB7CisgICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PCAgLypoZWxsbyovICA+KCk7Cit9CitXaGVuIEkgdGFrZSB0aGUgT2JqZWN0Q3JlYXRpb25FeHByCitUaGVuIHRoZSB0eXBlJ3MgZGlhbW9uZCBvcGVyYXRvciBmbGFnIHNob3VsZCBiZSB0cnVlCisKK1NjZW5hcmlvOiBUeXBlIEFyZ3VtZW50cyBhcmUgbm90IHNwZWNpZmllZAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBBIHsKKyAgICBMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Cit9CitXaGVuIEkgdGFrZSB0aGUgT2JqZWN0Q3JlYXRpb25FeHByCitUaGVuIHRoZSB0eXBlJ3MgZGlhbW9uZCBvcGVyYXRvciBmbGFnIHNob3VsZCBiZSBmYWxzZQorCitTY2VuYXJpbzogVHlwZSBBcmd1bWVudHMgYXJlIHNwZWNpZmllZAorCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBBIHsKKyAgICBFaXRoZXI8T2ssIEVycm9yPiBlaXRoZXIgPSBuZXcgRWl0aGVyPE9rLCBFcnJvcj4oKTsKK30KK1doZW4gSSB0YWtlIHRoZSBPYmplY3RDcmVhdGlvbkV4cHIKK1RoZW4gdGhlIHR5cGUncyBkaWFtb25kIG9wZXJhdG9yIGZsYWcgc2hvdWxkIGJlIGZhbHNlCisKK1NjZW5hcmlvOiBBIG1ldGhvZCByZWZlcmVuY2Ugd2l0aCB0eXBlIGFyZ3VtZW50cyBpcyBwYXJzZWQgY29ycmVjdGx5CitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBYIHsgCisJdm9pZCB4KCkgeyAKKwkJYS5vckVsc2VHZXQoIFN0cmVhbTo6PElWYXJpYWJsZTw/Pj5lbXB0eSApOyAKKwl9IAorfQorVGhlbiBubyBlcnJvcnMgYXJlIHJlcG9ydGVkCisKK1NjZW5hcmlvOiBUaGUgdGFyZ2V0IG9mIHRoaXMgYXNzaWduRXhwciBpcyBub3QgbnVsbAorR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorcHVibGljIGNsYXNzIEV4YW1wbGUgeworICBwcml2YXRlIFN0cmluZyBtU3RyaW5nOworICBwdWJsaWMgRXhhbXBsZShTdHJpbmcgYXJnKSB7CisgICAgbVN0cmluZyA9IGFyZzsKKyAgfQorfQorVGhlbiB0aGUgYXNzaWduRXhwciBwcm9kdWNlZCBkb2Vzbid0IGhhdmUgYSBudWxsIHRhcmdldAorCitTY2VuYXJpbzogVHdvIGNvbW1lbnRzIGluIG9uZSBsaW5lLCBhbmQgYSB1bmljb2RlIHNwYWNlCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitwdWJsaWMgY2xhc3MgRXhhbXBsZSB7CisgIE9iamVjdCBtQXZhaWxhYmxlUHJpbWFyeUNvbm5lY3Rpb247CisgIHB1YmxpYyBFeGFtcGxlKFN0cmluZyBhcmcpIHsKKyAgICAg4oCLbUF2YWlsYWJsZVByaW1hcnlDb25uZWN0aW9uID0gb3BlbkNvbm5lY3Rpb25Mb2NrZWQobUNvbmZpZ3VyYXRpb24sCisgICAgICAgIHRydWUgLypwcmltYXJ5Q29ubmVjdGlvbiovKTsgLy8gY29tbWVudAorICB9Cit9CitUaGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQKKworU2NlbmFyaW86IGFsdGVybmF0aXZlIFtdIHBsYWNpbmdzCitHaXZlbiBhIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitjbGFzcyBJe2ludFtdYmFyKGludFtdeFtdKVtde3JldHVybiBuZXcgaW50W11bXXt9O319CitUaGVuIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQKKworU2NlbmFyaW86IHRyeSByZXF1aXJlcyByZXNvdXJjZXMsIGEgZmluYWxseSBvciBhIGNhdGNoIChpc3N1ZSA0NDIpCitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBwdWJsaWMgdm9pZCBoZWxsb1dvcmxkKCkgeworICAgICAgICB0cnkgeworICAgICAgICB9CisgICAgfQorfQorVGhlbiB0aGUgSmF2YSBwYXJzZXIgY2Fubm90IHBhcnNlIGl0IGJlY2F1c2Ugb2YgYW4gZXJyb3IKKworCitTY2VuYXJpbzogUGFydGlhbGx5IGRpbWVuc2lvbmVkIGFycmF5cyBhcmUgZmluZQorR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK1doZW4gdGhlIGZvbGxvd2luZyBzb3VyY2UgaXMgcGFyc2VkOgorY2xhc3MgWCB7CisgICAgaW50IGEgPSBuZXcgaW50IEBBIFsxMF0gQEEgWzIwXSBAQSBbXSBbXTsKKyAgICBpbnQgYiA9IG5ldyBpbnQgQEEgW10gQEEgW117ezF9fTsKK30KK1RoZW4gbm8gZXJyb3JzIGFyZSByZXBvcnRlZApkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3Bvc2l0aW9uX3JhbmdlX3NjZW5hcmlvcy5zdG9yeSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9wb3NpdGlvbl9yYW5nZV9zY2VuYXJpb3Muc3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwZTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9wb3NpdGlvbl9yYW5nZV9zY2VuYXJpb3Muc3RvcnkKQEAgLTAsMCArMSw1NSBAQAorU2NlbmFyaW86IGEgcG9zaXRpb24gaXMgZXF1YWwgdG8gYW5vdGhlciBwb3NpdGlvbiBhdCB0aGUgc2FtZSBwbGFjZQorR2l2ZW4gdGhlIHBvc2l0aW9uIDEwLCAxMAorV2hlbiBJIGNvbXBhcmUgdG8gcG9zaXRpb24gMTAsIDEwCitUaGVuIHRoZSBwb3NpdGlvbnMgYXJlIGVxdWFsCitBbmQgaXQgaXMgbm90IGJlZm9yZSB0aGUgZmlyc3QgcG9zaXRpb24KK0FuZCBpdCBpcyBub3QgYWZ0ZXIgdGhlIGZpcnN0IHBvc2l0aW9uCisKK1NjZW5hcmlvOiBhIHBvc2l0aW9uIGlzIGFmdGVyIGFub3RoZXIgcG9zaXRpb24KK0dpdmVuIHRoZSBwb3NpdGlvbiAxMCwgMTAKK1doZW4gSSBjb21wYXJlIHRvIHBvc2l0aW9uIDIwLCAyMAorVGhlbiBpdCBpcyBhZnRlciB0aGUgZmlyc3QgcG9zaXRpb24KK0FuZCB0aGUgcG9zaXRpb25zIGFyZSBub3QgZXF1YWwKK0FuZCBpdCBpcyBub3QgYmVmb3JlIHRoZSBmaXJzdCBwb3NpdGlvbgorCitTY2VuYXJpbzogYSBwb3NpdGlvbiBpcyBkaXJlY3RseSBhZnRlciBhbm90aGVyIHBvc2l0aW9uCitHaXZlbiB0aGUgcG9zaXRpb24gMTAsIDEwCitXaGVuIEkgY29tcGFyZSB0byBwb3NpdGlvbiAxMCwgMTEKK1RoZW4gaXQgaXMgYWZ0ZXIgdGhlIGZpcnN0IHBvc2l0aW9uCitBbmQgdGhlIHBvc2l0aW9ucyBhcmUgbm90IGVxdWFsCitBbmQgaXQgaXMgbm90IGJlZm9yZSB0aGUgZmlyc3QgcG9zaXRpb24KKworU2NlbmFyaW86IGEgcG9zaXRpb24gaXMgYmVmb3JlIGFub3RoZXIgcG9zaXRpb24KK0dpdmVuIHRoZSBwb3NpdGlvbiAxMCwgMTAKK1doZW4gSSBjb21wYXJlIHRvIHBvc2l0aW9uIDUsIDUKK1RoZW4gaXQgaXMgYmVmb3JlIHRoZSBmaXJzdCBwb3NpdGlvbgorQW5kIHRoZSBwb3NpdGlvbnMgYXJlIG5vdCBlcXVhbAorQW5kIGl0IGlzIG5vdCBhZnRlciB0aGUgZmlyc3QgcG9zaXRpb24KKworU2NlbmFyaW86IGEgcG9zaXRpb24gaXMgZGlyZWN0bHkgYmVmb3JlIGFub3RoZXIgcG9zaXRpb24KK0dpdmVuIHRoZSBwb3NpdGlvbiAxMCwgMTAKK1doZW4gSSBjb21wYXJlIHRvIHBvc2l0aW9uIDEwLCA5CitUaGVuIGl0IGlzIGJlZm9yZSB0aGUgZmlyc3QgcG9zaXRpb24KK0FuZCB0aGUgcG9zaXRpb25zIGFyZSBub3QgZXF1YWwKK0FuZCBpdCBpcyBub3QgYWZ0ZXIgdGhlIGZpcnN0IHBvc2l0aW9uCisKK1NjZW5hcmlvOiBhIHJhbmdlIGlzIGVxdWFsIHRvIGFub3RoZXIgcmFuZ2UKK0dpdmVuIHRoZSByYW5nZSAxMCwgMTAgLSAyMCwgMjAKK1doZW4gSSBjb21wYXJlIHRvIHJhbmdlIDEwLCAxMCAtIDIwLCAyMAorVGhlbiB0aGUgcmFuZ2VzIGFyZSBlcXVhbAorCitTY2VuYXJpbzogYSByYW5nZSBpcyBiZWZvcmUgYSBwb3NpdGlvbgorR2l2ZW4gdGhlIHBvc2l0aW9uIDIwLCAyMQorV2hlbiBJIGNvbXBhcmUgdG8gcmFuZ2UgMTAsIDEwIC0gMjAsIDIwCitUaGVuIGl0IGlzIGJlZm9yZSB0aGUgcG9zaXRpb24KKworU2NlbmFyaW86IGEgcmFuZ2UgaXMgYWZ0ZXIgYSBwb3NpdGlvbgorR2l2ZW4gdGhlIHBvc2l0aW9uIDEwLCA5CitXaGVuIEkgY29tcGFyZSB0byByYW5nZSAxMCwgMTAgLSAyMCwgMjAKK1RoZW4gaXQgaXMgYWZ0ZXIgdGhlICBwb3NpdGlvbgorCitTY2VuYXJpbzogYSByYW5nZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciByYW5nZQorR2l2ZW4gdGhlIHJhbmdlIDEwLCAxMCAtIDIwLCAyMAorV2hlbiBJIGNvbXBhcmUgdG8gcmFuZ2UgMTEsIDExIC0gMTksIDE5CitUaGVuIGl0IGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3QgcmFuZ2UKKwpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3ByZXR0eV9wcmludGluZ19qYXZhX2NvbmNlcHRzLnN0b3J5IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3ByZXR0eV9wcmludGluZ19qYXZhX2NvbmNlcHRzLnN0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2FmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvcHJldHR5X3ByaW50aW5nX2phdmFfY29uY2VwdHMuc3RvcnkKQEAgLTAsMCArMSwzOTkgQEAKK1NjZW5hcmlvOiBDaGVjayBhIHdob2xlIGxvdCBvZiB0aGluZ3MgYXQgb25jZSB0aGF0IHNob3VsZCBiZSBzZXBhcmF0ZSB0ZXN0cworCitHaXZlbiB0aGUgY2xhc3MgaW4gdGhlIGZpbGUgIkphdmFDb25jZXB0cy5qYXZhIgorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorcGFja2FnZSBqYXBhLmJkZC5zYW1wbGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgamFwYS5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK0BJZ25vcmUKK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgSmF2YUNvbmNlcHRzPFQgZXh0ZW5kcyBMaXN0PGludFtdPiwgWD4gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHN0YXRpYyBDbGFzcyBjbHoxID0gU3RyaW5nLmNsYXNzOworCisgICAgcHJvdGVjdGVkIENsYXNzIGNsejIgPSAoU3RyaW5nLmNsYXNzKTsKKworICAgIENsYXNzIGNsejMgPSBpbnQuY2xhc3M7CisKKyAgICBDbGFzcyBjbHo0ID0gKGludC5jbGFzcyk7CisKKyAgICBpbnRbXSBhcnIgPSBuZXcgaW50WzEwXTsKKworICAgIGJ5dGUgYnllID0gMDsKKworICAgIGJ5dGVbXSBieWVieWUgPSBudWxsOworCisgICAgc2hvcnQgc2gxLCBzaDIgPSAxOworCisgICAgaW50IGludFdpdGhVbmRlcnNjb3JlID0gMTIzNF81Njc4OworCisgICAgbG9uZyBsb25nV2l0aFVuZGVyc2NvcmUgPSAxMjM0XzU2NzhMOworCisgICAgZmxvYXQgZmxvYXRXaXRoVW5kZXJzY29yZSA9IDFfMjM0LjVfNjc4ZjsKKworICAgIGZsb2F0IGZsb2F0V2l0aFVuZGVyc2NvcmVBbmRFeHBvbmVudCA9IDFfMjM0ZTFfMGY7CisKKyAgICBkb3VibGUgZG91YmxlV2l0aFVuZGVyc2NvcmUgPSAxXzIzNC41XzY3ODsKKworICAgIGRvdWJsZSBkb3VibGVXaXRoVW5kZXJzY29yZUFuZEV4cG9uZW50ID0gMV8yMzRlMV8wOworCisgICAgaW50IGJpbmFyeUxpdGVyYWwgPSAwYjEwMTEwMTsKKworICAgIExpc3Q8U3RyaW5nPltdW10gYXJyTFMgPSAoTGlzdDxTdHJpbmc+W11bXSkgbmV3IExpc3Q8Pz5bMTBdW107CisKKyAgICB7CisgICAgICAgIGludCB6ID0gMCwgeSA9IDA7CisgICAgICAgIGludCBhID0gKHopICsgeTsKKyAgICAgICAgYSA9ICgreikgKyB5OworICAgICAgICBieXRlIGIgPSAoYnl0ZSkgK3k7CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IGRpYW1vbmQxID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgQERlcHJlY2F0ZWQoKQorICAgIHN0YXRpYyBjbGFzcyBVZ2x5IHsKKworICAgICAgICBzdGF0aWMgaW50IHggPSAwOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgICAgIHggPSAreDsKKyAgICAgICAgICAgIHggPSB+eDsKKyAgICAgICAgICAgIC0teDsKKyAgICAgICAgICAgIGJvb2xlYW4gYiA9ICFmYWxzZTsKKyAgICAgICAgICAgIHggJj0gMjsKKyAgICAgICAgICAgIHggfD0gMjsKKyAgICAgICAgICAgIHggXj0gMjsKKyAgICAgICAgICAgIHggLT0gMjsKKyAgICAgICAgICAgIHggJT0gMjsKKyAgICAgICAgICAgIHggLz0gMjsKKyAgICAgICAgICAgIHggKj0gMjsKKyAgICAgICAgICAgIHggPDw9IDI7CisgICAgICAgICAgICB4ID4+PSAyOworICAgICAgICAgICAgeCA+Pj49IDI7CisgICAgICAgICAgICBiID0gYiB8fCBmYWxzZTsKKyAgICAgICAgICAgIGIgPSBiIHwgZmFsc2U7CisgICAgICAgICAgICBiID0gYiAmIGZhbHNlOworICAgICAgICAgICAgYiA9IGIgXiBmYWxzZTsKKyAgICAgICAgICAgIGIgPSBiICE9IGZhbHNlOworICAgICAgICAgICAgYiA9IHggPiAxOworICAgICAgICAgICAgYiA9IHggPCAxOworICAgICAgICAgICAgYiA9IHggPj0gMTsKKyAgICAgICAgICAgIGIgPSB4IDw9IDE7CisgICAgICAgICAgICB4ID0geCA8PCAxOworICAgICAgICAgICAgeCA9IHggPj4gMTsKKyAgICAgICAgICAgIHggPSB4ID4+PiAxOworICAgICAgICAgICAgeCA9IHggLSAxOworICAgICAgICAgICAgeCA9IHggKiAxOworICAgICAgICAgICAgeCA9IHggJSAxOworICAgICAgICAgICAgeCA9IHggLyAxOworICAgICAgICB9CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQoKQorICAgIGludFtdW11bXVtdIGFycjIgPSBuZXcgaW50WzEwXVsyXVsxXVswXTsKKworICAgIHZvbGF0aWxlIGZsb2F0IGZmZiA9IDB4MS5mZmZlUCsxMjdmOworCisgICAgY2hhciBjYyA9ICdhJzsKKworICAgIGludFtdW10gYXJyMyA9IHsgeyAxLCAyIH0sIHsgMywgNCB9IH07CisKKyAgICBzdGF0aWMgaW50W11bXSBhcnI0ID0ge307CisKKyAgICBwdWJsaWMgc3RhdGljIEphdmFDb25jZXB0cyB0OworCisgICAgc3RhdGljIHsKKyAgICAgICAgYXJyNCA9IG5ldyBpbnRbXVtdIHsgeyAyIH0sIHsgMSB9IH07CisgICAgfQorCisgICAgeworICAgICAgICBhcnIzID0gbmV3IGludFtdW10geyB7IDIgfSwgeyAxIH0gfTsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBUZXN0ZSB7CisKKyAgICAgICAgYXNjLCBkZWYKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBTZXhvIHsKKworICAgICAgICBtLCBARGVwcmVjYXRlZAorICAgICAgICBmOworCisgICAgICAgIHB1YmxpYyBlbnVtIFNleG9fIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXhvKCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgZW51bSBFbnVtIHsKKworICAgICAgICBtKDEpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICB2b2lkIG1tKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICwgZigyKSB7CisKKyAgICAgICAgICAgIHZvaWQgbW0oKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgOworCisgICAgICAgIG5hdGl2ZSB2b2lkIG5ubigpOworCisgICAgICAgIHRyYW5zaWVudCBpbnQgeDsKKworICAgICAgICBwcml2YXRlIEVudW0oaW50IHgpIHsKKyAgICAgICAgICAgIHRoaXMueCA9IHg7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCB2b2lkIG1tKCk7CisgICAgfQorCisgICAgc3RyaWN0ZnAgZG91YmxlIGRkZCgpIHsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQsIEU+IEphdmFDb25jZXB0cyhpbnQgeCkgeworICAgICAgICB0aGlzLmFyclswXSA9IHg7CisgICAgICAgIFQgdmFsMSA9IG51bGw7CisgICAgICAgIEUgdmFsMiA9IG51bGw7CisgICAgICAgIHN1cGVyLjxULCBFPmNoZWNrMih2YWwxLCB2YWwyKTsKKyAgICAgICAgYm9vbGVhbiBiID0gdHJ1ZSwgeSA9IGZhbHNlOworICAgICAgICBhYnN0cmFjdCBjbGFzcyBYIHsKKworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICBwdWJsaWMgPEQ+IFgoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG0oKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgZmluYWwgY2xhc3MgWSBleHRlbmRzIFggeworCisgICAgICAgICAgICBwdWJsaWMgWSgpIHsKKyAgICAgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgICAgIEphdmFDb25jZXB0cy50aGlzLmNjID0gJ2MnOworICAgICAgICAgICAgICAgIHN1cGVyLmkgPSAxOworICAgICAgICAgICAgICAgIFkuc3VwZXIubSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWShpbnQgeSkgeworICAgICAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBZKGxvbmcgeCkgeworICAgICAgICAgICAgICAgIHRoaXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gSmF2YUNvbmNlcHRzKFN0cmluZyBzdHIpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFFXRSBleHRlbmRzIEphdmFDb25jZXB0czxMaXN0PGludFtdPiwgU3RyaW5nPiB7CisKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgZmluYWwgaW50IHogPSAwOworCisgICAgICAgIGludCBpID0gKGludCkgLTE7CisKKyAgICAgICAgcHVibGljIFFXRShTdHJpbmcuLi4geCkgeworICAgICAgICAgICAgPFN0cmluZz5zdXBlcih4WzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRV0UoaW50Li4uIHgpIHsKKyAgICAgICAgICAgIHN1cGVyKHhbMF0pOworICAgICAgICAgICAgaSA9IHhbMF07CisgICAgICAgICAgICBhc3NlcnQgdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydCAxID09IDEgOiAyOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpaWkgPSAzOworICAgICAgICAgICAgICAgIGlpaSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFiZWw6IHsKKyAgICAgICAgICAgICAgICBpbnQgaWlpID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGludCBtaW4gPSAtMjE0NzQ4MzY0ODsKKyAgICAgICAgICAgIGxvbmcgc2wgPSAxMjMxMjMxMjMxMjNsOworICAgICAgICAgICAgbG9uZyBtaW5sID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDhMOworICAgICAgICAgICAgc3dpdGNoKGkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxsOiBzd2l0Y2goaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEpOworICAgICAgICAgICAgICAgICAgICBicmVhayBsbDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludFtdIGRvU29tZXRoaW5nKCkgeworICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiB4ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IDEgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgeCA9IDI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKG5ldyBGaWxlKCJzcmMvamFwYS9wYXJzZXIvamF2YWNjL1BhcnNlci5qYXZhIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3UpOworICAgICAgICBKYXZhQ29uY2VwdHMgdGVzdGUgPSBuZXcgSmF2YUNvbmNlcHRzKDIpOworICAgICAgICBKYXZhQ29uY2VwdHMuUVdFIHF3ZSA9IHRlc3RlLm5ldyBRV0UoMSk7CisgICAgICAgIGlmICgxICsgMSA9PSAyKSB7CisgICAgICAgICAgICB0ZXN0ZSA9IG51bGw7CisgICAgICAgICAgICB0ZXN0ZSA9IG5ldyBKYXZhQ29uY2VwdHMoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgICAgIHRlc3RlID0gbmV3IEphdmFDb25jZXB0cygxKTsKKyAgICAgICAgICAgIHggPSB4ID09IDAgPyAyIDogNDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgIHggPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgZWxzZSBpZiAoZmFsc2UpCisgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCA9IDI7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB4eHg6IHdoaWxlICh4ID09IDMpIGNvbnRpbnVlIHh4eDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfSB3aGlsZSAoeCA8IDEwMCk7CisgICAgICAgIGRvIHgrKzsgd2hpbGUgKHggPCAxMDApOworICAgICAgICBmb3IgKEBEZXByZWNhdGVkIGludCBpIDogYXJyNFswXSkgeworICAgICAgICAgICAgeC0tOworICAgICAgICB9CisgICAgICAgIGZvciAoQERlcHJlY2F0ZWQgZmluYWwgaW50IGkgPSAwLCBqID0gMTsgaSA8IDEwOyB4KyspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBpLCBqOworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IDEwICYmIGogPCAyOyBpKyssIGotLSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShARGVwcmVjYXRlZCBGaWxlIGZpbGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYSA9ICgoU3RyaW5nKSAicXdlIik7CisgICAgICAgIFN0cmluZyB4ID0gKChTdHJpbmcpIGNsejEuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IHkgPSAoKEludGVnZXIpIChPYmplY3QpIHgpLmludFZhbHVlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoZmlsZSkgeworICAgICAgICAgICAgZmlsZSA9IG51bGw7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIiIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJibGFoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbmFsbHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmxhaCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaW5hbGx5Iik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImJsYWgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluMiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3aGF0ZXZlciIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIHwgRXJyb3IgZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlKGZpbGUpOworICAgIH0KKworICAgIGNsYXNzIEE8VCBleHRlbmRzIEludGVnZXIgJiBTZXJpYWxpemFibGU+IGltcGxlbWVudHMgWFhYLCBTZXJpYWxpemFibGUgeworCisgICAgICAgIHB1YmxpYyA8QUJDPiBBKEludGVnZXIgaW50ZWdlciwgQUJDIHN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSA8WT4gdm9pZCB4KE1hcDw/IGV4dGVuZHMgWCwgPyBzdXBlciBUPiB4KSB7CisgICAgICAgIEBEZXByZWNhdGVkIENvbXBhcmF0b3IgYyA9IG5ldyBDb21wYXJhdG9yKCkgeworCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBPEludGVnZXI+IGEgPSBuZXcgPFN0cmluZz4gQTxJbnRlZ2VyPihuZXcgSW50ZWdlcigxMSksICJmb28iKSB7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obnVsbCk7CisgICAgfQorfQorCitjbGFzcyBCYXNlIHsKKworICAgIHB1YmxpYyA8QSwgQj4gdm9pZCBjaGVjazIoQSB2YWwxLCBCIHZhbDIpIHsKKyAgICB9Cit9CisKK2ludGVyZmFjZSBYWFggZXh0ZW5kcyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvcHJldHR5X3ByaW50aW5nX3NjZW5hcmlvcy5zdG9yeSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9wcmV0dHlfcHJpbnRpbmdfc2NlbmFyaW9zLnN0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTBjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvcHJldHR5X3ByaW50aW5nX3NjZW5hcmlvcy5zdG9yeQpAQCAtMCwwICsxLDUxOSBAQAorU2NlbmFyaW86IFdoZW4gcHJpbnRpbmcgdGhlIGluc3RhbnRpYXRpb24gd2Ugc2hvdWxkIHVzZSB0aGUgcmlnaHQgYW1vdW50IG9mIHNwYWNlcworCitHaXZlbiB0aGUgY2xhc3M6CitwdWJsaWMgY2xhc3MgQSB7CisgICAgT2JqZWN0IGZvbyA9IG5ldyBPYmplY3QoKTsKK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3B1YmxpYyBjbGFzcyBBIHsKKworICAgIE9iamVjdCBmb28gPSBuZXcgT2JqZWN0KCk7Cit9CisKKworU2NlbmFyaW86IFdoZW4gcHJpbnRpbmcgdGhlIGxhbWJkYSBleHByZXNzaW9uIHdlIHNob3VsZCB1c2UgdGhlIHJpZ2h0IGluZGVudGF0aW9uCisKK0dpdmVuIHRoZSBjbGFzczoKK3B1YmxpYyBjbGFzcyBCIHsKKwlSdW5uYWJsZSBydW5uYWJsZSA9ICgpLT4gU3lzdGVtLm91dC5wcmludGxuKCJydW5uaW5nIik7CisgICAgQ29uc3VtZXI8SW50ZWdlcj4gY29uc3VtZXIgPSBpLT57IGkrPTE7IFN5c3RlbS5vdXQucHJpbnRsbihpKTt9OworfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorcHVibGljIGNsYXNzIEIgeworCisgICAgUnVubmFibGUgcnVubmFibGUgPSAoKSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oInJ1bm5pbmciKTsKKworICAgIENvbnN1bWVyPEludGVnZXI+IGNvbnN1bWVyID0gaSAtPiB7CisgICAgICAgIGkgKz0gMTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkpOworICAgIH07Cit9CisKKworU2NlbmFyaW86IFByaW50aW5nIG9ycGhhbiBjb21tZW50cyBpbiBlbXB0eSBtZXRob2QKK0dpdmVuIHRoZSBjbGFzczoKK2NsYXNzIEEgeworICAgIHB1YmxpYyB2b2lkIGhlbGxvV29ybGQoU3RyaW5nIGdyZWV0aW5nLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAvL3NkZnNkZnNkZgorICAgICAgICAgICAgLy9zZGZkcworICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRnZmRnZmRnZmRnZmRnZmQKKyAgICAgICAgICovCisgICAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorY2xhc3MgQSB7CisKKyAgICBwdWJsaWMgdm9pZCBoZWxsb1dvcmxkKFN0cmluZyBncmVldGluZywgU3RyaW5nIG5hbWUpIHsKKyAgICAvLyBzZGZzZGZzZGYKKyAgICAvLyBzZGZkcworICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGdmZGdmZGdmZGdmZGdmZAorICAgICAgICAgKi8KKyAgICB9Cit9CisKKworCitTY2VuYXJpbzogUHJpbnRpbmcgb3JwaGFuIGNvbW1lbnRzIGluIGVtcHR5IG1ldGhvZCAoaXNzdWUgMTkyKQorR2l2ZW4gdGhlIGNsYXNzOgorcHVibGljIGNsYXNzIFN0ZXBJbXBsZW1lbnRhdGlvbiB7CisgICAgQFN0ZXAoIkEgc3RlcCIpCisgICAgcHVibGljIHZvaWQgY29udGV4dFN0ZXAoKSB7CisgICAgICAgIC8vIEZvbyBiYXIKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitwdWJsaWMgY2xhc3MgU3RlcEltcGxlbWVudGF0aW9uIHsKKworICAgIEBTdGVwKCJBIHN0ZXAiKQorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRTdGVwKCkgeworICAgIC8vIEZvbyBiYXIKKyAgICB9Cit9CisKKworU2NlbmFyaW86IFByaW50aW5nIG9ycGhhbiBjb21tZW50cyBpbiBmb3IgbG9vcCAoaXNzdWUgMTkyKQorR2l2ZW4gdGhlIGNsYXNzOgorcHVibGljIGNsYXNzIFN0ZXBJbXBsZW1lbnRhdGlvbiB7CisgICAgcHVibGljIHZvaWQgY29udGV4dFN0ZXAoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAvLyBmb28gYmFyCisgICAgICAgIH0KKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitwdWJsaWMgY2xhc3MgU3RlcEltcGxlbWVudGF0aW9uIHsKKworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRTdGVwKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAvLyBmb28gYmFyCisgICAgICAgIH0KKyAgICB9Cit9CisKKworU2NlbmFyaW86IFByaW50aW5nIG9ycGhhbiBhbmQgYXR0cmlidXRlZCBjb21tZW50cyBpbiBmb3IgbG9vcCAoaXNzdWUgMTkyKQorR2l2ZW4gdGhlIGNsYXNzOgorcHVibGljIGNsYXNzIFN0ZXBJbXBsZW1lbnRhdGlvbiB7CitwdWJsaWMgdm9pZCBjb250ZXh0U3RlcCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIC8vIGZvbyBiYXIKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgLy8gYW5vdGhlciBmb28gYmFyCisgICAgICAgIH0KKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitwdWJsaWMgY2xhc3MgU3RlcEltcGxlbWVudGF0aW9uIHsKKworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRTdGVwKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgLy8gZm9vIGJhcgorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIC8vIGFub3RoZXIgZm9vIGJhcgorICAgICAgICB9CisgICAgfQorfQorCisKK1NjZW5hcmlvOiBBbiBlbXB0eSBFbnVtIGlzIHByaW50ZWQgY29ycmVjdGx5CitHaXZlbiB0aGUgY29tcGlsYXRpb24gdW5pdDoKK3BhY2thZ2UgdGVzdDsgZW51bSBYWVoge30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3BhY2thZ2UgdGVzdDsKKworZW51bSBYWVogeworfQorCitTY2VuYXJpbzogQW4gZW51bSB3aXRob3V0IGZpZWxkcyBoYXMgbm8gKCkgb24gaXRzIG1lbWJlcnMKK0dpdmVuIHRoZSBjb21waWxhdGlvbiB1bml0OgorcGFja2FnZSB0ZXN0OyBlbnVtIFhZWiB7QSxCLEN9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitwYWNrYWdlIHRlc3Q7CisKK2VudW0gWFlaIHsKKworICAgIEEsIEIsIEMKK30KKworU2NlbmFyaW86IFN0cmluZ3Mgd2l0aCBlc2NhcGVkIG5ld2xpbmVzIGFyZSBwYXJzZWQgY29ycmVjdGx5CitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBwdWJsaWMgdm9pZCBoZWxsb1dvcmxkKFN0cmluZyBncmVldGluZywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICJoZWxsb1xud29ybGQiOworICAgIH0KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK2NsYXNzIEEgeworCisgICAgcHVibGljIHZvaWQgaGVsbG9Xb3JsZChTdHJpbmcgZ3JlZXRpbmcsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAiaGVsbG9cbndvcmxkIjsKKyAgICB9Cit9CisKK1NjZW5hcmlvOiBBIG11bHRpLWNhdGNoIGlzIHByaW50ZWQgY29ycmVjdGx5CitHaXZlbiB0aGUgY2xhc3M6CitjbGFzcyBBIHsKKyAgICBwdWJsaWMgdm9pZCBhKCkgeworICAgICAgICB0cnkgeworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7IAorICAgICAgICB9IAorICAgIH0KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK2NsYXNzIEEgeworCisgICAgcHVibGljIHZvaWQgYSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorfQorCitTY2VuYXJpbzogQW4gZW1wdHkgaW1wb3J0IGRvZXMgbm90IGZhaWwKK0dpdmVuIHRoZSBjbGFzczoKK3BhY2thZ2UgYS5iLmM7CisKKzsKK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3BhY2thZ2UgYS5iLmM7CisKK1NjZW5hcmlvOiB3ZSBjYW4gcGFyc2UgYmxvY2tzCitHaXZlbiB0aGUgYmxvY2s6Cit7CisgICAgYT0yOworICAgIGI9MzsKK30KK1doZW4gdGhlIGJsb2NrIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3sKKyAgICBhID0gMjsKKyAgICBiID0gMzsKK30KKworU2NlbmFyaW86IHdlIGNhbiBwYXJzZSBzdGF0ZW1lbnRzCitHaXZlbiB0aGUgc3RhdGVtZW50Ogord2hpbGUgKHRydWUpIHsKK30KK1doZW4gdGhlIHN0YXRlbWVudCBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6Cit3aGlsZSAodHJ1ZSkgeworfQorCitTY2VuYXJpbzogd2UgY2FuIHBhcnNlIHN0YXRpYyBvbiBkZW1hbmQgaW1wb3J0cworR2l2ZW4gdGhlIGltcG9ydDoKK2ltcG9ydCBzdGF0aWMgYS5iLmMuQWJjLio7CitXaGVuIHRoZSBpbXBvcnQgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgoraW1wb3J0IHN0YXRpYyBhLmIuYy5BYmMuKjsKKworU2NlbmFyaW86IHdlIGNhbiBwYXJzZSBzdGF0aWMgdHlwZSBpbXBvcnRzCitHaXZlbiB0aGUgaW1wb3J0OgoraW1wb3J0IHN0YXRpYyBhLmIuYy5BYmM7CitXaGVuIHRoZSBpbXBvcnQgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgoraW1wb3J0IHN0YXRpYyBhLmIuYy5BYmM7CisKK1NjZW5hcmlvOiB3ZSBjYW4gcGFyc2Ugb24gZGVtYW5kIGltcG9ydHMKK0dpdmVuIHRoZSBpbXBvcnQ6CitpbXBvcnQgYS5iLmMuKjsKK1doZW4gdGhlIGltcG9ydCBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitpbXBvcnQgYS5iLmMuKjsKKworU2NlbmFyaW86IHdlIGNhbiBwYXJzZSB0eXBlIGltcG9ydHMKK0dpdmVuIHRoZSBpbXBvcnQ6CitpbXBvcnQgYS5iLmMuQWJjOworV2hlbiB0aGUgaW1wb3J0IGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK2ltcG9ydCBhLmIuYy5BYmM7CisKK1NjZW5hcmlvOiB3ZSBjYW4gcGFyc2UgYW5ub3RhdGlvbnMKK0dpdmVuIHRoZSBhbm5vdGF0aW9uOgorQEFiYworV2hlbiB0aGUgYW5ub3RhdGlvbiBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitAQWJjCisKK1NjZW5hcmlvOiB3ZSBjYW4gcGFyc2UgYm9keSBkZWNsYXJhdGlvbnMKK0dpdmVuIHRoZSBib2R5OgorU3RyaW5nIGF1dGhvcigpOworV2hlbiB0aGUgYW5ub3RhdGlvbiBib2R5IGRlY2xhcmF0aW9uIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK1N0cmluZyBhdXRob3IoKTsKKworU2NlbmFyaW86IHdlIGNhbiBwYXJzZSBjbGFzcyBib2R5IGRlY2xhcmF0aW9ucworR2l2ZW4gdGhlIGJvZHk6CitwdWJsaWMgaW50IHh5eigpIHt9CitXaGVuIHRoZSBjbGFzcyBib2R5IGRlY2xhcmF0aW9uIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3B1YmxpYyBpbnQgeHl6KCkgeworfQorCitTY2VuYXJpbzogd2UgY2FuIHBhcnNlIGludGVyZmFjZSBib2R5IGRlY2xhcmF0aW9ucworR2l2ZW4gdGhlIGJvZHk6CitpbnQgeHl6KCk7CitXaGVuIHRoZSBpbnRlcmZhY2UgYm9keSBkZWNsYXJhdGlvbiBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitpbnQgeHl6KCk7CisKK1NjZW5hcmlvOiBJdCBkb2Vzbid0IHRocm93IE5QRSB3aGVuIHVzaW5nIGEgbW9kaWZpZXJWaXNpdG9yQWRhcHRlcgorR2l2ZW4gdGhlIGNsYXNzOgorcHVibGljIGNsYXNzIEV4YW1wbGUgeworICBwcml2YXRlIFN0cmluZyBtU3RyaW5nOworICBwdWJsaWMgRXhhbXBsZShTdHJpbmcgYXJnKSB7CisgICAgbVN0cmluZyA9IGFyZzsKKyAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorV2hlbiB0aGUgY2xhc3MgaXMgdmlzaXRlZCBieSBhbiBlbXB0eSBNb2RpZmllclZpc2l0b3JBZGFwdGVyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitwdWJsaWMgY2xhc3MgRXhhbXBsZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBtU3RyaW5nOworCisgICAgcHVibGljIEV4YW1wbGUoU3RyaW5nIGFyZykgeworICAgICAgICBtU3RyaW5nID0gYXJnOworICAgIH0KK30KKworU2NlbmFyaW86IEphdmFEb2MgT1IgY29tbWVudCBpcyBwcmludGVkLCBub3QgYm90aC4KK0dpdmVuIHRoZSBjbGFzczoKK3B1YmxpYyBjbGFzcyBGb28geworICAgIC8qKiBUaGlzIGxpbmUgZ2V0cyBkdXBsaWNhdGVkICovCisgICAgcHVibGljIHZvaWQgZm9vKCkgeworICAgIH0KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3B1YmxpYyBjbGFzcyBGb28geworCisgICAgLyoqCisgICAgICogVGhpcyBsaW5lIGdldHMgZHVwbGljYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICB9Cit9CisKK1NjZW5hcmlvOiB2YXJpb3VzIGxhbWJhIGNhc3RzIChpc3N1ZSA0MTgpCitHaXZlbiB0aGUgY2xhc3M6CitwdWJsaWMgY2xhc3MgVGVzdExhbWJkYSB7CisgICAgdm9pZCBva01ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIChJVEYpICgpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9OworICAgIH0KKyAgICB2b2lkIGZhbGlpbmdNZXRob2QoKSB7CisgICAgICAgIHRlc3RUaGlzKGNoZWNrID8gbnVsbCA6IChJVEYpICgpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9KTsKKyAgICB9Cit9CitXaGVuIHRoZSBjbGFzcyBib2R5IGRlY2xhcmF0aW9uIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3B1YmxpYyBjbGFzcyBUZXN0TGFtYmRhIHsKKworICAgIHZvaWQgb2tNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAoSVRGKSAoKSAtPiB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICB2b2lkIGZhbGlpbmdNZXRob2QoKSB7CisgICAgICAgIHRlc3RUaGlzKGNoZWNrID8gbnVsbCA6IChJVEYpICgpIC0+IHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9KTsKKyAgICB9Cit9CisKK1NjZW5hcmlvOiBEdXBsaWNhdGUgbWV0aG9kcyBhcmUgbm90IGEgcGFyc2luZyBlcnJvciAoIzQxNikKK0dpdmVuIHRoZSBjbGFzczoKK3B1YmxpYyBjbGFzcyBGb28geworICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICB9CisgICAgcHVibGljIHZvaWQgZm9vKCkgeworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBmb28oKSB7CisgICAgfQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorcHVibGljIGNsYXNzIEZvbyB7CisKKyAgICBwdWJsaWMgdm9pZCBmb28oKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9vKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICB9Cit9CisKK1NjZW5hcmlvOiBCb3RoIGFycmF5IHN5bnRheGVzIGFyZSBzdXBwb3J0ZWQgKCM0MTYpCitHaXZlbiB0aGUgY2xhc3M6CitwdWJsaWMgY2xhc3MgRm9vIHsKKyAgICBwdWJsaWMgdm9pZCBtMShib29sZWFuW10gYm9vbEFycmF5KSB7fQorICAgIHB1YmxpYyB2b2lkIG0xKGJvb2xlYW4gYm9vbEFycmF5W10pIHt9CisgICAgcHVibGljIHZvaWQgbTEoYm9vbGVhbltdIGJvb2xBcnJheVtdKSB7fQorfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgorcHVibGljIGNsYXNzIEZvbyB7CisKKyAgICBwdWJsaWMgdm9pZCBtMShib29sZWFuW10gYm9vbEFycmF5KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbTEoYm9vbGVhbltdIGJvb2xBcnJheSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG0xKGJvb2xlYW5bXVtdIGJvb2xBcnJheSkgeworICAgIH0KK30KKworCitTY2VuYXJpbzogQXJyYXkgcGFydHMgY2FuIGJlIGFubm90YXRlZAorR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgRm9vIHsKKyAgICB2b2lkIG0xKEBCb28gYm9vbGVhbiBASW5kZXgxIFtdIEAgSW5kZXgyIFtdIGJvb2xBcnJheSkge30KK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK2NsYXNzIEZvbyB7CisKKyAgICB2b2lkIG0xKEBCb28gYm9vbGVhbiBASW5kZXgxIFtdIEBJbmRleDIgW10gYm9vbEFycmF5KSB7CisgICAgfQorfQorCitTY2VuYXJpbzogQW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZCBvbiBhbm5vdGF0aW9ucworR2l2ZW4gdGhlIGNsYXNzOgorQEMgQGludGVyZmFjZSBEIHsKK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK0BDCitAaW50ZXJmYWNlIEQgeworfQorCitTY2VuYXJpbzogQW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZCBvbiBpbnRlcmZhY2VzCitHaXZlbiB0aGUgY2xhc3M6CitAQyBpbnRlcmZhY2UgQWJjIHsKK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK0BDCitpbnRlcmZhY2UgQWJjIHsKK30KKworU2NlbmFyaW86IEFubm90YXRpb25zIGFyZSBzdXBwb3J0ZWQgb24gZW51bXMKK0dpdmVuIHRoZSBjbGFzczoKK0BDIGVudW0gQWJjIHsKK30KK1doZW4gdGhlIGNsYXNzIGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK0BDCitlbnVtIEFiYyB7Cit9CisKK1NjZW5hcmlvOiBBbm5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkIG9uIGNsYXNzZXMgKGlzc3VlIDQzNiBpcyB0aGUgY29tbWVudGVkIHBhcnQpCitHaXZlbiB0aGUgY29tcGlsYXRpb24gdW5pdDoKK0BDCitwdWJsaWMgY2xhc3MgQWJjPEBDIEEsIEBDIFggZXh0ZW5kcyBAQyBTdHJpbmcgJiBAQyBTZXJpYWxpemFibGU+IHsKKworCUBDIGludCBAQ1tdIEBDIFtdZjsKKworCUBDCisJcHVibGljIEFiYyhAQyBpbnQgcCwgTGlzdDxAQyA/IGV4dGVuZHMgT2JqZWN0PiBhYSl7CisJCUBDIGludCBiOworCX0KKwlwdWJsaWMgQEMgdm9pZCBhKEBDIGludCBvKSB7CisvKgkJdHJ5IHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworCQl9IGNhdGNoIChAQyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB8IEBDIElPRXhjZXB0aW9uIGUpIHsKKwkJfQorKi8JfQorfQorV2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitAQworcHVibGljIGNsYXNzIEFiYzxAQyBBLCBAQyBYIGV4dGVuZHMgQEMgU3RyaW5nICYgQEMgU2VyaWFsaXphYmxlPiB7CisKKyAgICBAQworICAgIGludCBAQyBbXSBAQyBbXSBmOworCisgICAgQEMKKyAgICBwdWJsaWMgQWJjKEBDIGludCBwLCBMaXN0PEBDID8gZXh0ZW5kcyBPYmplY3Q+IGFhKSB7CisgICAgICAgIEBDIGludCBiOworICAgIH0KKworICAgIEBDCisgICAgcHVibGljIHZvaWQgYShAQyBpbnQgbykgeworICAgIC8qCQl0cnkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisJCX0gY2F0Y2ggKEBDIE51bGxQb2ludGVyRXhjZXB0aW9uIHwgQEMgSU9FeGNlcHRpb24gZSkgeworCQl9CisqLworICAgIH0KK30KKworCitTY2VuYXJpbzogQW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZCBpbnNpZGUgY2F0Y2ggKGlzc3VlIDQzNikKK0dpdmVuIHRoZSBjb21waWxhdGlvbiB1bml0OgorcHVibGljIGNsYXNzIEFiYyB7CisJcHVibGljIHZvaWQgYSgpIHsKKwkJdHJ5IHsKKwkJfSBjYXRjaCAoQEMgTnVsbFBvaW50ZXJFeGNlcHRpb24gfCBAQyBJT0V4Y2VwdGlvbiBlKSB7CisJCX0KKwl9Cit9CitXaGVuIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIHBhcnNlZCBieSB0aGUgSmF2YSBwYXJzZXIKK1RoZW4gaXQgaXMgcHJpbnRlZCBhczoKK3B1YmxpYyBjbGFzcyBBYmMgeworCisgICAgcHVibGljIHZvaWQgYSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgfSBjYXRjaCAoQEMgTnVsbFBvaW50ZXJFeGNlcHRpb24gfCBAQyBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1NjZW5hcmlvOiBJbm5lciBjbGFzcyBub3RhdGlvbiBkb2VzIG5vdCBjb25mdXNlIGFubm90YXRpb25zICgjMTA3KQorR2l2ZW4gdGhlIGNsYXNzOgorY2xhc3MgQSBleHRlbmRzIEBBbm4xIEIuQEFubjIgQyB7Cit9CitXaGVuIHRoZSBjbGFzcyBpcyBwYXJzZWQgYnkgdGhlIEphdmEgcGFyc2VyCitUaGVuIGl0IGlzIHByaW50ZWQgYXM6CitjbGFzcyBBIGV4dGVuZHMgQEFubjEgQi5AQW5uMiBDIHsKK30KKworU2NlbmFyaW86IE1ha2Ugc3VyZSBpbnRlcmZhY2UgZXh0ZW5kcyBjYW4gYmUgYW5ub3RhdGVkCitHaXZlbiB0aGUgY2xhc3M6CitpbnRlcmZhY2UgQSBleHRlbmRzIEBYIEIsIEBZIEMsIEBaIEQgeworfQorV2hlbiB0aGUgY2xhc3MgaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgoraW50ZXJmYWNlIEEgZXh0ZW5kcyBAWCBCLCBAWSBDLCBAWiBEIHsKK30KKworU2NlbmFyaW86IGRlZmF1bHQgbW9kaWZpZXIgaXNuJ3QgcHJpbnRlZCB0d2ljZQorR2l2ZW4gdGhlIGNsYXNzOgoraW50ZXJmYWNlIFgge2RlZmF1bHQgU3RyaW5nIGF1dGhvcigpe319CitXaGVuIHRoZSBhbm5vdGF0aW9uIGJvZHkgZGVjbGFyYXRpb24gaXMgcGFyc2VkIGJ5IHRoZSBKYXZhIHBhcnNlcgorVGhlbiBpdCBpcyBwcmludGVkIGFzOgoraW50ZXJmYWNlIFggeworCisgICAgZGVmYXVsdCBTdHJpbmcgYXV0aG9yKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zYW1wbGVzL0NsYXNzSW5MYXRpbjEuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zYW1wbGVzL0NsYXNzSW5MYXRpbjEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZjNzBhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3NhbXBsZXMvQ2xhc3NJbkxhdGluMS5qYXZhCkBAIC0wLDAgKzEsNiBAQAorLy8gQ29tbWVudCBpbiBMYXRpbjE6CisvLyBBIGwn6W1laiBpbiBwaWFz7CBjaGUgc2VudCBk63NndXN0LgorLy8gRm9yIHRoZSBjdXJpb3MgcmVhZGVyLCB0aGlzIGlzIFBpZWRtb250ZXNlIGRpYWxlY3QKK2NsYXNzIEEgeworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3NhbXBsZXMvSmF2YUNvbmNlcHRzLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc2FtcGxlcy9KYXZhQ29uY2VwdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTZkYzkyCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYmRkL3NhbXBsZXMvSmF2YUNvbmNlcHRzLmphdmEKQEAgLTAsMCArMSwzOTcgQEAKK3BhY2thZ2UgamFwYS5iZGQuc2FtcGxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGphcGEucGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK0BJZ25vcmUKK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgSmF2YUNvbmNlcHRzPFQgZXh0ZW5kcyBMaXN0PGludFtdPiwgWD4gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHN0YXRpYyBDbGFzcyBjbHoxID0gU3RyaW5nLmNsYXNzOworCisgICAgcHJvdGVjdGVkIENsYXNzIGNsejIgPSAoU3RyaW5nLmNsYXNzKTsKKworICAgIENsYXNzIGNsejMgPSBpbnQuY2xhc3M7CisKKyAgICBDbGFzcyBjbHo0ID0gKGludC5jbGFzcyk7CisKKyAgICBpbnRbXSBhcnIgPSBuZXcgaW50WzEwXTsKKworICAgIGJ5dGUgYnllID0gMDsKKworICAgIGJ5dGUgYnllYnllW10gPSBudWxsOworCisgICAgc2hvcnQgc2gxLCBzaDIgPSAxOworCisgICAgaW50IGludFdpdGhVbmRlcnNjb3JlID0gMTIzNF81Njc4OworCisgICAgbG9uZyBsb25nV2l0aFVuZGVyc2NvcmUgPSAxMjM0XzU2NzhMOworCisgICAgZmxvYXQgZmxvYXRXaXRoVW5kZXJzY29yZSA9IDFfMjM0LjVfNjc4ZjsKKworICAgIGZsb2F0IGZsb2F0V2l0aFVuZGVyc2NvcmVBbmRFeHBvbmVudCA9IDFfMjM0ZTFfMGY7CisKKyAgICBkb3VibGUgZG91YmxlV2l0aFVuZGVyc2NvcmUgPSAxXzIzNC41XzY3ODsKKworICAgIGRvdWJsZSBkb3VibGVXaXRoVW5kZXJzY29yZUFuZEV4cG9uZW50ID0gMV8yMzRlMV8wOworCisgICAgaW50IGJpbmFyeUxpdGVyYWwgPSAwYjEwMTEwMTsKKworICAgIExpc3Q8U3RyaW5nPltdW10gYXJyTFMgPSAoTGlzdDxTdHJpbmc+W11bXSkgbmV3IExpc3Q8Pz5bMTBdW107CisKKyAgICA7CisKKyAgICB7CisgICAgICAgIGludCB6ID0gMCwgeSA9IDA7CisgICAgICAgIGludCBhID0gKHopICsgeTsKKyAgICAgICAgYSA9ICgreikgKyB5OworICAgICAgICBieXRlIGIgPSAoYnl0ZSkgK3k7CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IGRpYW1vbmQxID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgQERlcHJlY2F0ZWQoKQorICAgIHN0YXRpYyBjbGFzcyBVZ2x5IHsKKworICAgICAgICBzdGF0aWMgaW50IHggPSAwOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgICAgIHggPSAreDsKKyAgICAgICAgICAgIHggPSB+eDsKKyAgICAgICAgICAgIC0teDsKKyAgICAgICAgICAgIGJvb2xlYW4gYiA9ICFmYWxzZTsKKyAgICAgICAgICAgIHggJj0gMjsKKyAgICAgICAgICAgIHggfD0gMjsKKyAgICAgICAgICAgIHggXj0gMjsKKyAgICAgICAgICAgIHggLT0gMjsKKyAgICAgICAgICAgIHggJT0gMjsKKyAgICAgICAgICAgIHggLz0gMjsKKyAgICAgICAgICAgIHggKj0gMjsKKyAgICAgICAgICAgIHggPDw9IDI7CisgICAgICAgICAgICB4ID4+PSAyOworICAgICAgICAgICAgeCA+Pj49IDI7CisgICAgICAgICAgICBiID0gYiB8fCBmYWxzZTsKKyAgICAgICAgICAgIGIgPSBiIHwgZmFsc2U7CisgICAgICAgICAgICBiID0gYiAmIGZhbHNlOworICAgICAgICAgICAgYiA9IGIgXiBmYWxzZTsKKyAgICAgICAgICAgIGIgPSBiICE9IGZhbHNlOworICAgICAgICAgICAgYiA9IHggPiAxOworICAgICAgICAgICAgYiA9IHggPCAxOworICAgICAgICAgICAgYiA9IHggPj0gMTsKKyAgICAgICAgICAgIGIgPSB4IDw9IDE7CisgICAgICAgICAgICB4ID0geCA8PCAxOworICAgICAgICAgICAgeCA9IHggPj4gMTsKKyAgICAgICAgICAgIHggPSB4ID4+PiAxOworICAgICAgICAgICAgeCA9IHggLSAxOworICAgICAgICAgICAgeCA9IHggKiAxOworICAgICAgICAgICAgeCA9IHggJSAxOworICAgICAgICAgICAgeCA9IHggLyAxOworICAgICAgICB9CisgICAgfQorCisgICAgOworCisgICAgQERlcHJlY2F0ZWQoKQorICAgIGludFtdW11bXVtdIGFycjIgPSBuZXcgaW50WzEwXVsyXVsxXVswXTsKKworICAgIHZvbGF0aWxlIGZsb2F0IGZmZiA9IDB4MS5mZmZlUCsxMjdmOworCisgICAgY2hhciBjYyA9ICdhJzsKKworICAgIGludFtdW10gYXJyMyA9IHt7MSwgMn0sIHszLCA0fX07CisKKyAgICBzdGF0aWMgaW50W10gYXJyNFtdID0ge307CisKKyAgICBwdWJsaWMgc3RhdGljIEphdmFDb25jZXB0cyB0OworCisgICAgc3RhdGljIHsKKyAgICAgICAgYXJyNCA9IG5ldyBpbnRbXVtde3syfSwgezF9fTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGFycjMgPSBuZXcgaW50W11bXXt7Mn0sIHsxfX07CisgICAgfQorCisgICAgcHVibGljIGVudW0gVGVzdGUgeworCisgICAgICAgIGFzYywgZGVmCisgICAgfQorCisgICAgcHVibGljIGVudW0gU2V4byB7CisKKyAgICAgICAgbSwgQERlcHJlY2F0ZWQKKyAgICAgICAgZjsKKworICAgICAgICBwdWJsaWMgZW51bSBTZXhvXyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2V4bygpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGVudW0gRW51bSB7CisKKyAgICAgICAgbSgxKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHZvaWQgbW0oKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIGYoMikgeworICAgICAgICAgICAgdm9pZCBtbSgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBuYXRpdmUgdm9pZCBubm4oKTsKKworICAgICAgICB0cmFuc2llbnQgaW50IHg7CisKKyAgICAgICAgcHJpdmF0ZSBFbnVtKGludCB4KSB7CisgICAgICAgICAgICB0aGlzLnggPSB4OworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3Qgdm9pZCBtbSgpOworICAgIH0KKworICAgIHN0cmljdGZwIGRvdWJsZSBkZGQoKSB7CisgICAgICAgIHJldHVybiAwLjA7CisgICAgfQorCisgICAgcHVibGljIDxULCBFPiBKYXZhQ29uY2VwdHMoaW50IHgpIHsKKyAgICAgICAgdGhpcy5hcnJbMF0gPSB4OworICAgICAgICBUIHZhbDEgPSBudWxsOworICAgICAgICBFIHZhbDIgPSBudWxsOworICAgICAgICBzdXBlci48VCwgRT5jaGVjazIodmFsMSwgdmFsMik7CisgICAgICAgIGJvb2xlYW4gYiA9IHRydWUsIHkgPSBmYWxzZTsKKyAgICAgICAgYWJzdHJhY3QgY2xhc3MgWCB7CisKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcHVibGljIDxEPiBYKCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBEZXByZWNhdGVkCisgICAgICAgIGZpbmFsIGNsYXNzIFkgZXh0ZW5kcyBYIHsKKworICAgICAgICAgICAgcHVibGljIFkoKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgICAgICBKYXZhQ29uY2VwdHMudGhpcy5jYyA9ICdjJzsKKyAgICAgICAgICAgICAgICBzdXBlci5pID0gMTsKKyAgICAgICAgICAgICAgICBZLnN1cGVyLm0oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFkoaW50IHkpIHsKKyAgICAgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWShsb25nIHgpIHsKKyAgICAgICAgICAgICAgICB0aGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IEphdmFDb25jZXB0cyhTdHJpbmcgc3RyKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBRV0UgZXh0ZW5kcyBKYXZhQ29uY2VwdHM8TGlzdDxpbnRbXT4sIFN0cmluZz4geworCisgICAgICAgIEBEZXByZWNhdGVkCisgICAgICAgIGZpbmFsIGludCB6ID0gMDsKKworICAgICAgICBpbnQgaSA9IChpbnQpIC0xOworCisgICAgICAgIHB1YmxpYyBRV0UoU3RyaW5nLi4uIHgpIHsKKyAgICAgICAgICAgIDxTdHJpbmc+c3VwZXIoeFswXSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUVdFKGludC4uLiB4KSB7CisgICAgICAgICAgICBzdXBlcih4WzBdKTsKKyAgICAgICAgICAgIGkgPSB4WzBdOworICAgICAgICAgICAgYXNzZXJ0IHRydWU7CisgICAgICAgICAgICBhc3NlcnQgMSA9PSAxIDogMjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWlpID0gMzsKKyAgICAgICAgICAgICAgICBpaWkgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhYmVsOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpaWkgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgOworICAgICAgICAgICAgOworICAgICAgICAgICAgaW50IG1pbiA9IC0yMTQ3NDgzNjQ4OworICAgICAgICAgICAgbG9uZyBzbCA9IDEyMzEyMzEyMzEyM2w7CisgICAgICAgICAgICBsb25nIG1pbmwgPSAtOTIyMzM3MjAzNjg1NDc3NTgwOEw7CisgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxsOgorICAgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxsOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQmFzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGRvU29tZXRoaW5nKClbXSB7CisgICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+IHggPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IGludFtdezF9OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCB4ID0gMjsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFyc2UobmV3IEZpbGUoInNyYy9qYXBhL3BhcnNlci9qYXZhY2MvUGFyc2VyLmphdmEiKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdSk7CisgICAgICAgIEphdmFDb25jZXB0cyB0ZXN0ZSA9IG5ldyBKYXZhQ29uY2VwdHMoMik7CisgICAgICAgIEphdmFDb25jZXB0cy5RV0UgcXdlID0gdGVzdGUubmV3IFFXRSgxKTsKKyAgICAgICAgaWYgKDEgKyAxID09IDIpIHsKKyAgICAgICAgICAgIHRlc3RlID0gbnVsbDsKKyAgICAgICAgICAgIHRlc3RlID0gbmV3IEphdmFDb25jZXB0cygxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHggPSAzOworICAgICAgICAgICAgdGVzdGUgPSBuZXcgSmF2YUNvbmNlcHRzKDEpOworICAgICAgICAgICAgeCA9IHggPT0gMCA/IDIgOiA0OworICAgICAgICB9CisgICAgICAgIGlmICh0cnVlKQorICAgICAgICAgICAgeCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggPSAzOworICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgIHggPSAxOworICAgICAgICBlbHNlIGlmIChmYWxzZSkKKyAgICAgICAgICAgIHggPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4ID0gMjsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHh4eDoKKyAgICAgICAgICAgIHdoaWxlICh4ID09IDMpIGNvbnRpbnVlIHh4eDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfSB3aGlsZSAoeCA8IDEwMCk7CisgICAgICAgIGRvIHgrKzsgd2hpbGUgKHggPCAxMDApOworICAgICAgICBmb3IgKEBEZXByZWNhdGVkIGludCBpIDogYXJyNFswXSkgeworICAgICAgICAgICAgeC0tOworICAgICAgICB9CisgICAgICAgIGZvciAoQERlcHJlY2F0ZWQgZmluYWwgaW50IGkgPSAwLCBqID0gMTsgaSA8IDEwOyB4KyspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBpLCBqOworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IDEwICYmIGogPCAyOyBpKyssIGotLSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShARGVwcmVjYXRlZCBGaWxlIGZpbGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYSA9ICgoU3RyaW5nKSAicXdlIik7CisgICAgICAgIFN0cmluZyB4ID0gKChTdHJpbmcpIGNsejEuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IHkgPSAoKEludGVnZXIpIChPYmplY3QpIHgpLmludFZhbHVlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoZmlsZSkgeworICAgICAgICAgICAgZmlsZSA9IG51bGw7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIiIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJibGFoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbmFsbHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmxhaCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaW5hbGx5Iik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImJsYWgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbjIgPSBjcmVhdGVJbnB1dFN0cmVhbSgpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW4pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid2hhdGV2ZXIiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiB8IEVycm9yIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSmF2YVBhcnNlci5wYXJzZShmaWxlKTsKKyAgICB9CisKKyAgICBjbGFzcyBBPFQgZXh0ZW5kcyBJbnRlZ2VyICYgU2VyaWFsaXphYmxlPiBpbXBsZW1lbnRzIFhYWCwgU2VyaWFsaXphYmxlIHsKKworICAgICAgICBwdWJsaWMgPEFCQz4gQShJbnRlZ2VyIGludGVnZXIsIEFCQyBzdHJpbmcpIHRocm93cyBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFk+IHZvaWQgeChNYXA8PyBleHRlbmRzIFgsID8gc3VwZXIgVD4geCkgeworICAgICAgICBARGVwcmVjYXRlZCBDb21wYXJhdG9yIGMgPSBuZXcgQ29tcGFyYXRvcigpIHsKKworICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQTxJbnRlZ2VyPiBhID0gbmV3IDxTdHJpbmc+QTxJbnRlZ2VyPihuZXcgSW50ZWdlcigxMSksICJmb28iKSB7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obnVsbCk7CisgICAgfQorfQorCitjbGFzcyBCYXNlIHsKKworICAgIHB1YmxpYyA8QSwgQj4gdm9pZCBjaGVjazIoQSB2YWwxLCBCIHZhbDIpIHsKKyAgICB9Cit9CisKK2ludGVyZmFjZSBYWFggZXh0ZW5kcyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc2FtcGxlcy9wYWNrYWdlLWluZm8uamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC9zYW1wbGVzL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDNlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvc2FtcGxlcy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDUgQEAKKy8qKgorICogVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzIGZvciBkb2luZyBzb21lIHN0dWZmLgorICovCitAQworcGFja2FnZSBjb20uY29tcGFueS5zdHVmZjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvdmlzaXRvcl9zY2VuYXJpb3Muc3RvcnkgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9iZGQvdmlzaXRvcl9zY2VuYXJpb3Muc3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0YTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2JkZC92aXNpdG9yX3NjZW5hcmlvcy5zdG9yeQpAQCAtMCwwICsxLDY3IEBACitTY2VuYXJpbzogQSBjbGFzcyB0aGF0IGlzIHJlcGxpY2F0ZWQgdXNpbmcgYSBDbG9uZVZpc2l0b3Igc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBzb3VyY2UKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK0dpdmVuIGEgc2Vjb25kIENvbXBpbGF0aW9uVW5pdAorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitwYWNrYWdlIGphcGEucGFyc2VyOworcHVibGljIGNsYXNzIENsYXNzRXF1YWxpdHkgeworCisgICAgcHVibGljIHZvaWQgYU1ldGhvZCgpeworICAgICAgICBpbnQgYT0wOyAvLyBzZWNvbmQgY29tbWVudAorICAgIH0KK30KK1doZW4gdGhlIENvbXBpbGF0aW9uVW5pdCBpcyBjbG9uZWQgdG8gdGhlIHNlY29uZCBDb21waWxhdGlvblVuaXQKK1RoZW4gdGhlIENvbXBpbGF0aW9uVW5pdCBpcyBlcXVhbCB0byB0aGUgc2Vjb25kIENvbXBpbGF0aW9uVW5pdAorVGhlbiB0aGUgQ29tcGlsYXRpb25Vbml0IGhhcyB0aGUgc2FtZSBoYXNoY29kZSB0byB0aGUgc2Vjb25kIENvbXBpbGF0aW9uVW5pdAorCisKK1NjZW5hcmlvOiBBIGNsYXNzZXMgdmFyaWFibGUgbmFtZSBpcyBjaGFuZ2VkIHRvIHVwcGVyY2FzZSBWb2lkVmlzaXRvckFkYXB0ZXIKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK0dpdmVuIGEgVm9pZFZpc2l0b3JBZGFwdGVyIHdpdGggYSB2aXNpdCBtZXRob2QgdGhhdCBjaGFuZ2VzIHZhcmlhYmxlIG5hbWVzIHRvIHVwcGVyY2FzZQorV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitwYWNrYWdlIGphcGEucGFyc2VyOworcHVibGljIGNsYXNzIFRvVXBwZXJDbGFzcyB7CisgICAgcHJpdmF0ZSBpbnQgemVybyA9IDA7Cit9CitXaGVuIHRoZSBDb21waWxhdGlvblVuaXQgaXMgdmlzaXRlZCBieSB0aGUgdG8gdXBwZXJjYXNlIHZpc2l0b3IKK1RoZW4gdGhlIGV4cGVjdGVkIHNvdXJjZSBzaG91bGQgYmU6CitwYWNrYWdlIGphcGEucGFyc2VyOworcHVibGljIGNsYXNzIFRvVXBwZXJDbGFzcyB7CisgICAgcHJpdmF0ZSBpbnQgWkVSTyA9IDA7Cit9CisKK1NjZW5hcmlvOiBBIGNsYXNzIHdpdGggYSB0cnkgc3RhdGVtZW50IGlzIHZpc2l0ZWQgdXNpbmcgYnkgYSBWb2lkVmlzaXRvckFkYXB0ZXIKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK0dpdmVuIGEgVm9pZFZpc2l0b3JBZGFwdGVyIHdpdGggYSB2aXNpdCBtZXRob2QgYW5kIGNvbGxlY3RzIHRoZSB2YXJpYWJsZSBuYW1lcworV2hlbiB0aGUgZm9sbG93aW5nIHNvdXJjZSBpcyBwYXJzZWQ6CitwYWNrYWdlIGphcGEucGFyc2VyOworcHVibGljIGNsYXNzIFRvVXBwZXJDbGFzcyB7CisgICAgcHVibGljIHZvaWQgYU1ldGhvZCgpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHplcm8gPSAwOworICAgICAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgfQorICAgIH0KK30KK1doZW4gdGhlIENvbXBpbGF0aW9uVW5pdCBpcyB2aXNpdGVkIGJ5IHRoZSB2YXJpYWJsZSBuYW1lIGNvbGxlY3RvciB2aXNpdG9yCitUaGVuIHRoZSBjb2xsZWN0ZWQgdmFyaWFibGUgbmFtZSBpcyAiZXhjZXB0aW9uO3plcm87IgorCisKK1NjZW5hcmlvOiBBIGNsYXNzIHdpdGggYSB0cnkgc3RhdGVtZW50IGlzIHZpc2l0ZWQgdXNpbmcgYnkgYSBHZW5lcmljVmlzaXRvckFkYXB0ZXIKKworR2l2ZW4gYSBDb21waWxhdGlvblVuaXQKK0dpdmVuIGEgR2VuZXJpY1Zpc2l0b3JBZGFwdGVyIHdpdGggYSB2aXNpdCBtZXRob2QgdGhhdCByZXR1cm5zIHZhcmlhYmxlIG5hbWVzCitXaGVuIHRoZSBmb2xsb3dpbmcgc291cmNlIGlzIHBhcnNlZDoKK3BhY2thZ2UgamFwYS5wYXJzZXI7CitwdWJsaWMgY2xhc3MgVG9VcHBlckNsYXNzIHsKKyAgICBwdWJsaWMgdm9pZCBhTWV0aG9kKCl7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgemVybyA9IDA7CisgICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICB9CisgICAgfQorfQorV2hlbiB0aGUgQ29tcGlsYXRpb25Vbml0IGlzIHZpc2l0ZWQgYnkgdGhlIHZpc2l0b3IgdGhhdCByZXR1cm5zIHZhcmlhYmxlIG5hbWVzCitUaGVuIHRoZSByZXR1cm4gdmFyaWFibGUgbmFtZSBpcyAiemVybyIKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1bGtfdGVzdF9yZXN1bHRzL2phdmFwYXJzZXJfdGVzdF9yZXN1bHRzLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1bGtfdGVzdF9yZXN1bHRzL2phdmFwYXJzZXJfdGVzdF9yZXN1bHRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTlmY2JlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVsa190ZXN0X3Jlc3VsdHMvamF2YXBhcnNlcl90ZXN0X3Jlc3VsdHMudHh0CkBAIC0wLDAgKzEgQEAKKzAgcHJvYmxlbXMgaW4gMCBmaWxlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1bGtfdGVzdF9yZXN1bHRzL29wZW5qZGtfc3JjX3JlcG9fdGVzdF9yZXN1bHRzLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1bGtfdGVzdF9yZXN1bHRzL29wZW5qZGtfc3JjX3JlcG9fdGVzdF9yZXN1bHRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Q0ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVsa190ZXN0X3Jlc3VsdHMvb3Blbmpka19zcmNfcmVwb190ZXN0X3Jlc3VsdHMudHh0CkBAIC0wLDAgKzEsNjU1IEBACitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvamRrL2phdmFkb2MvZG9jbGV0L3Rlc3RBbmNob3JOYW1lcy9wa2cxL1JlZ0NsYXNzLmphdmEKKyhsaW5lIDY4LGNvbCAxNikgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L2pkay9qYXZhZG9jL2RvY2xldC90ZXN0U291cmNlVGFiL0RvdWJsZVRhYi9DLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAzMywgY29sdW1uIDIuICBFbmNvdW50ZXJlZDogInQiICgxMTYpLCBhZnRlciA6ICJcXCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L2pkay9qYXZhZG9jL2RvY2xldC90ZXN0U291cmNlVGFiL1NpbmdsZVRhYi9DLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAzMywgY29sdW1uIDIuICBFbmNvdW50ZXJlZDogInQiICgxMTYpLCBhZnRlciA6ICJcXCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L2pkay9qYXZhZG9jL2RvY2xldC90ZXN0VW5uYW1lZFBhY2thZ2UvQmFkU291cmNlLmphdmEKK1BhcnNlIGVycm9yLiBGb3VuZCAgIkp1c3QiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC9qZGsvamF2YWRvYy90b29sLzY5NjQ5MTQvRXJyb3IuamF2YQorKGxpbmUgMjUsY29sIDEyKSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCAiKCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L2pkay9qYXZhZG9jL3Rvb2wvNjk2NDkxNC9KYXZhY1dhcm5pbmcuamF2YQorKGxpbmUgMjUsY29sIDEyKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvamRrL2phdmFkb2MvdG9vbC9lbnVtL2RvY0NvbW1lbnRzL3BrZzEvT3BlcmF0aW9uLmphdmEKKyhsaW5lIDMzLGNvbCAxKSAnYWJzdHJhY3QnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC9qZGsvamF2YWRvYy90b29sL1Q0OTk0MDQ5L0ZpbGVXaXRoVGFicy5qYXZhCitMZXhpY2FsIGVycm9yIGF0IGxpbmUgMjUsIGNvbHVtbiAyLiAgRW5jb3VudGVyZWQ6ICJ0IiAoMTE2KSwgYWZ0ZXIgOiAiXFwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy82MzAyMTg0L1Q2MzAyMTg0LmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAyOCwgY29sdW1uIDkuICBFbmNvdW50ZXJlZDogIlx1ZmZmZCIgKDY1NTMzKSwgYWZ0ZXIgOiAiIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvNjQ0MDU4My9BLmphdmEKKyhsaW5lIDI1LGNvbCAyOCkgUGFyc2UgZXJyb3IuIEZvdW5kICAiMSIgPElOVEVHRVJfTElURVJBTD4sIGV4cGVjdGVkICJ9IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblR5cGVFbGVtZW50TW9kaWZpZXJzLmphdmEKKyhsaW5lIDE3LGNvbCA1KSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDE4LGNvbCA1KSAncHJpdmF0ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDIwLGNvbCA1KSAncHJvdGVjdGVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLgorKGxpbmUgMjEsY29sIDUpICdwcm90ZWN0ZWQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisobGluZSAyMyxjb2wgNSkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDI0LGNvbCA1KSAnc3RhdGljJyBpcyBub3QgYWxsb3dlZCBoZXJlLgorKGxpbmUgMjYsY29sIDUpICdmaW5hbCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDI3LGNvbCA1KSAnZmluYWwnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisobGluZSAyOSxjb2wgNSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDMwLGNvbCA1KSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLgorKGxpbmUgMzIsY29sIDUpICd2b2xhdGlsZScgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDMzLGNvbCA1KSAndm9sYXRpbGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisobGluZSAzNSxjb2wgNSkgJ3RyYW5zaWVudCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDM2LGNvbCA1KSAndHJhbnNpZW50JyBpcyBub3QgYWxsb3dlZCBoZXJlLgorKGxpbmUgMzgsY29sIDUpICduYXRpdmUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisobGluZSAzOSxjb2wgNSkgJ25hdGl2ZScgaXMgbm90IGFsbG93ZWQgaGVyZS4KKyhsaW5lIDQxLGNvbCA1KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisobGluZSA0Mixjb2wgNSkgJ3N0cmljdGZwJyBpcyBub3QgYWxsb3dlZCBoZXJlLgorKGxpbmUgNDQsY29sIDUpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLgorKGxpbmUgNDUsY29sIDUpICdkZWZhdWx0JyBpcyBub3QgYWxsb3dlZCBoZXJlLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYW5ub3RhdGlvbnMvRmluYWxSZWNlaXZlclRlc3QuamF2YQorKGxpbmUgMTEsY29sIDQzKSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICIpIiAiLCIgIkAiICJbIgorKGxpbmUgMTQsY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgIn0iCisobGluZSAxNCxjb2wgMikgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCBvbmUgb2YgICI7IiAiPCIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9pZCIgInZvbGF0aWxlIiAid2l0aCIgInsiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL25lZy9Bbm5Db21tYS5qYXZhCisobGluZSAxMixjb2wgMzUpIFBhcnNlIGVycm9yLiBGb3VuZCAiKSIsIGV4cGVjdGVkIG9uZSBvZiAgImVudW0iICJleHBvcnRzIiAibW9kdWxlIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAidG8iICJ0cmFuc2l0aXZlIiAidXNlcyIgIndpdGgiIDxJREVOVElGSUVSPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYW5ub3RhdGlvbnMvbmVnL05vRGVmYXVsdC5qYXZhCisobGluZSA4LGNvbCAxOSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ7IiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgImRlZmF1bHQiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy9uZWcvTm9EZWZhdWx0QWJzdHJhY3QuamF2YQorKGxpbmUgOCxjb2wgNSkgJ2RlZmF1bHQnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy9uZWcvTm9TdGF0aWMuamF2YQorKGxpbmUgOSxjb2wgMTgpIFBhcnNlIGVycm9yLiBGb3VuZCAieyIsIGV4cGVjdGVkIG9uZSBvZiAgIjsiICJkZWZhdWx0IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYW5ub3RhdGlvbnMvbmVnL05vU3RhdGljQWJzdHJhY3QuamF2YQorKGxpbmUgOSxjb2wgNSkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL25lZy9TeW50YXgxLmphdmEKKyhsaW5lIDE3LGNvbCAyMSkgUGFyc2UgZXJyb3IuIEZvdW5kICIsIiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJiIgIiYmIiAiKCIgIikiICIqIiAiKyIgIi0iICIvIiAiPCIgIjw9IiAiPT0iICI+IiAiPj0iICI/IiAiXiIgImluc3RhbmNlb2YiICJ8IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy9uZWcvWjEyLmphdmEKKyhsaW5lIDEwLGNvbCAxNSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ2b2lkIiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9sYXRpbGUiICJ3aXRoIiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy9uZWcvWjEzLmphdmEKKyhsaW5lIDExLGNvbCAxMSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ0aHJvd3MiLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiZGVmYXVsdCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL25lZy9aMTQuamF2YQorKGxpbmUgMTAsY29sIDEyKSBQYXJzZSBlcnJvci4gRm91bmQgIjwiLCBleHBlY3RlZCAieyIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL25lZy9aMi5qYXZhCisobGluZSAxMyxjb2wgMTcpIFBhcnNlIGVycm9yLiBGb3VuZCAiZGVmYXVsdCIsIGV4cGVjdGVkIG9uZSBvZiAgIjsiICJAIiAiWyIgInRocm93cyIgInsiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy9uZWcvWjMuamF2YQorKGxpbmUgMTMsY29sIDE3KSBQYXJzZSBlcnJvci4gRm91bmQgImRlZmF1bHQiLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiQCIgIlsiICJ0aHJvd3MiICJ7IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYW5ub3RhdGlvbnMvbmVnL1o1LmphdmEKKyhsaW5lIDEyLGNvbCAxMikgUGFyc2UgZXJyb3IuIEZvdW5kICJleHRlbmRzIiwgZXhwZWN0ZWQgInsiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy9uZWcvWjguamF2YQorKGxpbmUgMTEsY29sIDEwKSBQYXJzZSBlcnJvci4gRm91bmQgImludCIsIGV4cGVjdGVkICIpIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYW5ub3RhdGlvbnMvbmVnL1o5LmphdmEKKyhsaW5lIDEwLGNvbCAxNSkgUGFyc2UgZXJyb3IuIEZvdW5kICI8IiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9sYXRpbGUiICJ3aXRoIiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy90eXBlQW5ub3RhdGlvbnMvNjk2NzAwMi9UNjk2NzAwMi5qYXZhCisobGluZSAzMyxjb2wgMTYpIFBhcnNlIGVycm9yLiBGb3VuZCAiLi4uIiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIigiICIpIiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL3R5cGVBbm5vdGF0aW9ucy9mYWlsdXJlcy9Bbm5vdGF0ZWRDbGFzc0V4cHIuamF2YQorKGxpbmUgMTIsY29sIDE1KSBQYXJzZSBlcnJvci4gRm91bmQgIkAiLCBleHBlY3RlZCBvbmUgb2YgICIhIiAiKCIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ3aXRoIiAifiIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKyhsaW5lIDEzLGNvbCA4KSBQYXJzZSBlcnJvci4gRm91bmQgIkAiLCBleHBlY3RlZCBvbmUgb2YgICIhIiAiKCIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ3aXRoIiAifiIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKyhsaW5lIDE3LGNvbCA4KSBQYXJzZSBlcnJvci4gRm91bmQgIkAiLCBleHBlY3RlZCBvbmUgb2YgICIhIiAiKCIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ3aXRoIiAifiIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKyhsaW5lIDE4LGNvbCA4KSBQYXJzZSBlcnJvci4gRm91bmQgIkAiLCBleHBlY3RlZCBvbmUgb2YgICIhIiAiKCIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ3aXRoIiAifiIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL3R5cGVBbm5vdGF0aW9ucy9mYWlsdXJlcy9Bbm5vdGF0ZWRNZXRob2RTZWxlY3RvclRlc3QuamF2YQorKGxpbmUgMTIsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICIlPSIgIiY9IiAiKCIgIio9IiAiKysiICIrPSIgIi0tIiAiLT0iICIvPSIgIjsiICI8PD0iICI9IiAiPj49IiAiPj4+PSIgIl49IiAifD0iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy90eXBlQW5ub3RhdGlvbnMvZmFpbHVyZXMvQmFkQ2FzdC5qYXZhCisobGluZSAxMixjb2wgMTYpIFBhcnNlIGVycm9yLiBGb3VuZCAiQCIsIGV4cGVjdGVkIG9uZSBvZiAgIiEiICIoIiAiKSIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ3aXRoIiAifiIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL3R5cGVBbm5vdGF0aW9ucy9mYWlsdXJlcy9JbmNvbXBsZXRlQXJyYXkuamF2YQorKGxpbmUgMTEsY29sIDExKSBQYXJzZSBlcnJvci4gRm91bmQgIkAiLCBleHBlY3RlZCBvbmUgb2YgICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL3R5cGVBbm5vdGF0aW9ucy9mYWlsdXJlcy9JbmRleEFycmF5LmphdmEKKyhsaW5lIDEyLGNvbCAxMSkgUGFyc2UgZXJyb3IuIEZvdW5kICJAIiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIigiICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2Fubm90YXRpb25zL3R5cGVBbm5vdGF0aW9ucy9mYWlsdXJlcy9PbGRBcnJheS5qYXZhCisobGluZSAxMixjb2wgMTApIFBhcnNlIGVycm9yLiBGb3VuZCAiQCIsIGV4cGVjdGVkIG9uZSBvZiAgIl0iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9hbm5vdGF0aW9ucy90eXBlQW5ub3RhdGlvbnMvZmFpbHVyZXMvU3RhdGljRmllbGRzLmphdmEKKyhsaW5lIDEzLGNvbCAxMCkgUGFyc2UgZXJyb3IuIEZvdW5kICJAIiwgZXhwZWN0ZWQgb25lIG9mICAiKCIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ3aXRoIiA8Q0hBUkFDVEVSX0xJVEVSQUw+IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiA8SURFTlRJRklFUj4gPElOVEVHRVJfTElURVJBTD4gPExPTkdfTElURVJBTD4gPFNUUklOR19MSVRFUkFMPgorKGxpbmUgMTcsY29sIDkpIFBhcnNlIGVycm9yLiBGb3VuZCAiQCIsIGV4cGVjdGVkIG9uZSBvZiAgIiEiICIoIiAiZW51bSIgImV4cG9ydHMiICJmYWxzZSIgIm1vZHVsZSIgIm5ldyIgIm51bGwiICJvcGVuIiAib3BlbnMiICJwcm92aWRlcyIgInJlcXVpcmVzIiAic3RyaWN0ZnAiICJzdXBlciIgInRoaXMiICJ0byIgInRyYW5zaXRpdmUiICJ0cnVlIiAidXNlcyIgIndpdGgiICJ+IiA8Q0hBUkFDVEVSX0xJVEVSQUw+IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiA8SURFTlRJRklFUj4gPElOVEVHRVJfTElURVJBTD4gPExPTkdfTElURVJBTD4gPFNUUklOR19MSVRFUkFMPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvYXBpL1Q2MjY1MTM3YS5qYXZhCisobGluZSAyNCxjb2wgMSkgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCBvbmUgb2YgICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL0JhZEFubm90YXRpb24uamF2YQorKGxpbmUgMTEsY29sIDIxKSBQYXJzZSBlcnJvci4gRm91bmQgImludCIsIGV4cGVjdGVkICIpIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvQmFkSGV4Q29uc3RhbnQuamF2YQorKGxpbmUgMTIsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgICJ4TCIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kZWNsYXJhdGlvbi9tZXRob2QvTWV0aG9kVm9pZFBhcmFtZXRlci5qYXZhCisobGluZSA3LGNvbCAxNikgUGFyc2UgZXJyb3IuIEZvdW5kICJ2b2lkIiwgZXhwZWN0ZWQgb25lIG9mICAiKSIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvbGF0aWxlIiAid2l0aCIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kZWZhdWx0TWV0aG9kcy9wcml2YXRlL1ByaXZhdGUwMi5qYXZhCisobGluZSAxMyxjb2wgOSkgQ2Fubm90IGJlICdhYnN0cmFjdCcgYW5kIGFsc28gJ3ByaXZhdGUnLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGVmYXVsdE1ldGhvZHMvcHJpdmF0ZS9Qcml2YXRlMDcuamF2YQorKGxpbmUgOSxjb2wgNSkgJ3ByaXZhdGUnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kZWZhdWx0TWV0aG9kcy9wcml2YXRlL1ByaXZhdGUwOC5qYXZhCisobGluZSAxMyxjb2wgOSkgQ2FuIGhhdmUgb25seSBvbmUgb2YgJ3B1YmxpYycsICdwcml2YXRlJy4KKyhsaW5lIDE0LGNvbCA5KSBDYW5ub3QgYmUgJ2Fic3RyYWN0JyBhbmQgYWxzbyAncHJpdmF0ZScuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kZWZhdWx0TWV0aG9kcy9wcml2YXRlL1ByaXZhdGUwOS5qYXZhCisobGluZSA5LGNvbCAxNykgRHVwbGljYXRlZCBtb2RpZmllcgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGVmYXVsdE1ldGhvZHMvcHJpdmF0ZS9Qcml2YXRlMTAuamF2YQorKGxpbmUgMTEsY29sIDkpIENhbm5vdCBiZSAnYWJzdHJhY3QnIGFuZCBhbHNvICdwcml2YXRlJy4KKyhsaW5lIDE0LGNvbCA5KSBDYW5ub3QgYmUgJ2Fic3RyYWN0JyBhbmQgYWxzbyAncHJpdmF0ZScuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9EZWZpbml0ZUFzc2lnbm1lbnQvQ29uc3RhbnRJbmZpbml0ZVdoaWxlLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSA2OCwgY29sdW1uIDAuICBFbmNvdW50ZXJlZDogPEVPRj4gYWZ0ZXIgOiAiIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvQW5ub3RhdGlvbk11c3RCZU5hbWVWYWx1ZS5qYXZhCisobGluZSAzMixjb2wgMTUpIFBhcnNlIGVycm9yLiBGb3VuZCAiLCIsIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiYiICImJiIgIikiICIqIiAiKyIgIi0iICIvIiAiPCIgIjw9IiAiPT0iICI+IiAiPj0iICI/IiAiXiIgImluc3RhbmNlb2YiICJ8IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9BcnJheUFuZFJlY2VpdmVyLmphdmEKKyhsaW5lIDI3LGNvbCAyOSkgUGFyc2UgZXJyb3IuIEZvdW5kICJbIiwgZXhwZWN0ZWQgb25lIG9mICAiKSIgIiwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9Bc3NlcnRBc0lkZW50aWZpZXIyLmphdmEKKyhsaW5lIDI3LGNvbCA1KSBQYXJzZSBlcnJvci4gRm91bmQgImFzc2VydCIsIGV4cGVjdGVkIG9uZSBvZiAgImVudW0iICJleHBvcnRzIiAibW9kdWxlIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAidG8iICJ0cmFuc2l0aXZlIiAidXNlcyIgIndpdGgiIDxJREVOVElGSUVSPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvQ2FsbE11c3RCZUZpcnN0LmphdmEKKyhsaW5lIDI4LGNvbCAxOCkgUGFyc2UgZXJyb3IuIEZvdW5kICJzdXBlciIsIGV4cGVjdGVkICJ9IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvQ2FudEFzc2lnblRvVGhpcy5qYXZhCisobGluZSAyOCxjb2wgOSkgSWxsZWdhbCBsZWZ0IGhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvQ2FudEV4dGVuZEludGZBbm5vLmphdmEKKyhsaW5lIDI4LGNvbCAxMikgUGFyc2UgZXJyb3IuIEZvdW5kICJleHRlbmRzIiwgZXhwZWN0ZWQgInsiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9DYXRjaFdpdGhvdXRUcnkuamF2YQorKGxpbmUgMjcsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgImNhdGNoIiwgZXhwZWN0ZWQgIn0iCisobGluZSAzMCxjb2wgNSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ9IiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9EZWZhdWx0QWxsb3dlZEluSW50ZkFubm90YXRpb25NZW1iZXIuamF2YQorKGxpbmUgMjcsY29sIDE4KSBQYXJzZSBlcnJvci4gRm91bmQgImRlZmF1bHQiLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiQCIgIlsiICJ0aHJvd3MiICJ7IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvRG90Q2xhc3NFeHBlY3RlZC5qYXZhCisobGluZSAyNyxjb2wgMTEpIFBhcnNlIGVycm9yLiBGb3VuZCAiaW50IiwgZXhwZWN0ZWQgb25lIG9mICAiISIgIigiICJlbnVtIiAiZXhwb3J0cyIgImZhbHNlIiAibW9kdWxlIiAibmV3IiAibnVsbCIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInN1cGVyIiAidGhpcyIgInRvIiAidHJhbnNpdGl2ZSIgInRydWUiICJ1c2VzIiAid2l0aCIgIn4iIDxDSEFSQUNURVJfTElURVJBTD4gPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IDxJREVOVElGSUVSPiA8SU5URUdFUl9MSVRFUkFMPiA8TE9OR19MSVRFUkFMPiA8U1RSSU5HX0xJVEVSQUw+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9FbHNlV2l0aG91dElmLmphdmEKKyhsaW5lIDI3LGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICJlbHNlIiwgZXhwZWN0ZWQgIn0iCisobGluZSAzMCxjb2wgNSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ9IiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9FbXB0eUNoYXJMaXRlcmFsLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAyNywgY29sdW1uIDE1LiAgRW5jb3VudGVyZWQ6ICJcJyIgKDM5KSwgYWZ0ZXIgOiAiXCciCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9FbnVtQXNJZGVudGlmaWVyMi5qYXZhCisobGluZSAyNyxjb2wgOSkgJ2VudW0nIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgYXMgaXQgaXMgYSBrZXl3b3JkLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvRXhwZWN0ZWQyLmphdmEKKyhsaW5lIDMwLGNvbCAxMykgUGFyc2UgZXJyb3IuIEZvdW5kICI7IiwgZXhwZWN0ZWQgb25lIG9mICAiKCIgIkAiICJbIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvRXhwZWN0ZWQzLmphdmEKK1BhcnNlIGVycm9yLiBGb3VuZCAiaW50IiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9FeHBlY3RlZE1vZHVsZS5qYXZhCisobGluZSAyNixjb2wgMSkgUGFyc2UgZXJyb3IuIEZvdW5kICJjbGFzcyIsIGV4cGVjdGVkICJtb2R1bGUiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9GaW5hbGx5V2l0aG91dFRyeS5qYXZhCisobGluZSAyNyxjb2wgMTQpIFBhcnNlIGVycm9yLiBGb3VuZCAiZmluYWxseSIsIGV4cGVjdGVkICJ9IgorKGxpbmUgMzAsY29sIDUpIFBhcnNlIGVycm9yLiBGb3VuZCAifSIsIGV4cGVjdGVkIG9uZSBvZiAgIjsiICJAIiAiXHUwMDFhIiAiYWJzdHJhY3QiICJjbGFzcyIgImRlZmF1bHQiICJlbnVtIiAiZmluYWwiICJpbXBvcnQiICJpbnRlcmZhY2UiICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInB1YmxpYyIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidHJhbnNpZW50IiAidHJhbnNpdGl2ZSIgInZvbGF0aWxlIiA8RU9GPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvRm9yZWFjaEJhZEluaXRpYWxpemF0aW9uLmphdmEKKyhsaW5lIDI5LGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICI6IiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIigiICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDMxLGNvbCAyKSBQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkICJ9IgorKGxpbmUgMzEsY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIjwiICJAIiAiYWJzdHJhY3QiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJjbGFzcyIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJpbnRlcmZhY2UiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvaWQiICJ2b2xhdGlsZSIgIndpdGgiICJ7IiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JZGVudGlmaWVyRXhwZWN0ZWQuamF2YQorKGxpbmUgMzAsY29sIDEpIFBhcnNlIGVycm9yLiBGb3VuZCAieyIsIGV4cGVjdGVkIG9uZSBvZiAgImVudW0iICJleHBvcnRzIiAibW9kdWxlIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInN0cmljdGZwIiAidG8iICJ0cmFuc2l0aXZlIiAidXNlcyIgIndpdGgiIDxJREVOVElGSUVSPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSWxsZWdhbEFubm90YXRpb25EZWNsYXJhdGlvbi5qYXZhCisobGluZSAyNyxjb2wgNSkgUGFyc2UgZXJyb3IuIEZvdW5kICJAIiwgZXhwZWN0ZWQgIn0iCisobGluZSAyOSxjb2wgNSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ9IiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JbGxlZ2FsQ2hhci5qYXZhCitMZXhpY2FsIGVycm9yIGF0IGxpbmUgMjcsIGNvbHVtbiAxMy4gIEVuY291bnRlcmVkOiAiYCIgKDk2KSwgYWZ0ZXIgOiAiIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSWxsZWdhbENvbWJvTW9kaWZpZXJzLmphdmEKKyhsaW5lIDI3LGNvbCA1KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHVibGljJywgJ3ByaXZhdGUnLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSWxsZWdhbERvdC5qYXZhCisobGluZSAyNyxjb2wgMTIpIFBhcnNlIGVycm9yLiBGb3VuZCAiLiIsIGV4cGVjdGVkIG9uZSBvZiAgIi4uLiIgIkAiICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0lsbGVnYWxFc2NhcGVDaGFyLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAyNywgY29sdW1uIDE4LiAgRW5jb3VudGVyZWQ6ICIhIiAoMzMpLCBhZnRlciA6ICJcIlxcIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSWxsZWdhbExpbmVFbmRJbkNoYXJMaXQuamF2YQorTGV4aWNhbCBlcnJvciBhdCBsaW5lIDI3LCBjb2x1bW4gMTUuICBFbmNvdW50ZXJlZDogIlxuIiAoMTApLCBhZnRlciA6ICJcJyIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0lsbGVnYWxOb25Bc2NpaURpZ2l0LmphdmEKKyhsaW5lIDI3LGNvbCAxMykgUGFyc2UgZXJyb3IuIEZvdW5kICAiXFx1MDY2MCIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JbGxlZ2FsU3RhcnRPZkV4cHIuamF2YQorKGxpbmUgMjcsY29sIDExKSBQYXJzZSBlcnJvci4gRm91bmQgIj0iLCBleHBlY3RlZCBvbmUgb2YgICIhIiAiKCIgIisiICIrKyIgIi0iICItLSIgIkAiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZhbHNlIiAiZmxvYXQiICJpbnQiICJsb25nIiAibW9kdWxlIiAibmV3IiAibnVsbCIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzaG9ydCIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ2b2lkIiAid2l0aCIgInsiICJ+IiA8Q0hBUkFDVEVSX0xJVEVSQUw+IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiA8SURFTlRJRklFUj4gPElOVEVHRVJfTElURVJBTD4gPExPTkdfTElURVJBTD4gPFNUUklOR19MSVRFUkFMPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSWxsZWdhbFN0YXJ0T2ZTdG10LmphdmEKKyhsaW5lIDI5LGNvbCAxNykgUGFyc2UgZXJyb3IuIEZvdW5kICJ9IiwgZXhwZWN0ZWQgb25lIG9mICAiKCIgIisrIiAiLS0iICI7IiAiQCIgImFzc2VydCIgImJvb2xlYW4iICJicmVhayIgImJ5dGUiICJjaGFyIiAiY29udGludWUiICJkbyIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJmbG9hdCIgImZvciIgImlmIiAiaW50IiAibG9uZyIgIm1vZHVsZSIgIm5ldyIgIm51bGwiICJvcGVuIiAib3BlbnMiICJwcm92aWRlcyIgInJlcXVpcmVzIiAicmV0dXJuIiAic2hvcnQiICJzdHJpY3RmcCIgInN1cGVyIiAic3dpdGNoIiAic3luY2hyb25pemVkIiAidGhpcyIgInRocm93IiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInRyeSIgInVzZXMiICJ2b2lkIiAid2hpbGUiICJ3aXRoIiAieyIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKyhsaW5lIDMxLGNvbCAyKSBQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkIG9uZSBvZiAgImVsc2UiICJ9IgorKGxpbmUgMzEsY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIjwiICJAIiAiYWJzdHJhY3QiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJjbGFzcyIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJpbnRlcmZhY2UiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvaWQiICJ2b2xhdGlsZSIgIndpdGgiICJ7IiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JbGxlZ2FsU3RhcnRPZlR5cGUuamF2YQorKGxpbmUgMjcsY29sIDI3KSBQYXJzZSBlcnJvci4gRm91bmQgIikiLCBleHBlY3RlZCBvbmUgb2YgICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJkb3VibGUiICJmbG9hdCIgImludCIgImxvbmciICJzaG9ydCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0lsbGVnYWxVbmRlcnNjb3JlLmphdmEKKyhsaW5lIDI3LGNvbCAxMykgUGFyc2UgZXJyb3IuIEZvdW5kICAiXyIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JbGxlZ2FsVW5pY29kZUVzY2FwZS5qYXZhCitMZXhpY2FsIGVycm9yIGF0IGxpbmUgMjcsIGNvbHVtbiAxNS4gIEVuY291bnRlcmVkOiAiOyIgKDU5KSwgYWZ0ZXIgOiAiXFx1IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSW5pdGlhbGl6ZXJOb3RBbGxvd2VkLmphdmEKKyhsaW5lIDI3LGNvbCA1KSBBbiBpbnRlcmZhY2UgY2Fubm90IGhhdmUgaW5pdGlhbGl6ZXJzLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSW50ZXJmYWNlTm90QWxsb3dlZC5qYXZhCisobGluZSAyOCxjb2wgOSkgVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhIGxvY2FsIGludGVyZmFjZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0ludGZBbm5vdGF0aW9uQ2FudEhhdmVUeXBlUGFyYW1zLmphdmEKKyhsaW5lIDI2LGNvbCAxMikgUGFyc2UgZXJyb3IuIEZvdW5kICI8IiwgZXhwZWN0ZWQgInsiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JbnRmQW5ub3RhdGlvbnNDYW50SGF2ZVBhcmFtcy5qYXZhCisobGluZSAyNyxjb2wgMTcpIFBhcnNlIGVycm9yLiBGb3VuZCAiaW50IiwgZXhwZWN0ZWQgIikiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9JbnRmQW5ub3RhdGlvbnNDYW50SGF2ZVR5cGVQYXJhbXMuamF2YQorKGxpbmUgMjYsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgIjwiLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiQCIgImFic3RyYWN0IiAiYm9vbGVhbiIgImJ5dGUiICJjaGFyIiAiY2xhc3MiICJkZWZhdWx0IiAiZG91YmxlIiAiZW51bSIgImV4cG9ydHMiICJmaW5hbCIgImZsb2F0IiAiaW50IiAiaW50ZXJmYWNlIiAibG9uZyIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJvcGVucyIgInByaXZhdGUiICJwcm90ZWN0ZWQiICJwcm92aWRlcyIgInB1YmxpYyIgInJlcXVpcmVzIiAic2hvcnQiICJzdGF0aWMiICJzdHJpY3RmcCIgInN5bmNocm9uaXplZCIgInRvIiAidHJhbnNpZW50IiAidHJhbnNpdGl2ZSIgInVzZXMiICJ2b2xhdGlsZSIgIndpdGgiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0ludmFsaWRCaW5hcnlOdW1iZXIuamF2YQorKGxpbmUgMjcsY29sIDEzKSBQYXJzZSBlcnJvci4gRm91bmQgICJiMjAxMDAwMDEwIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0ludmFsaWRIZXhOdW1iZXIuamF2YQorKGxpbmUgMjgsY29sIDEzKSBQYXJzZSBlcnJvci4gRm91bmQgICJ4ejEzNTdhYmMiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiOyIgIjwiICI8PD0iICI8PSIgIj0iICI9PSIgIj4iICI+PSIgIj4+PSIgIj4+Pj0iICI/IiAiXiIgIl49IiAiaW5zdGFuY2VvZiIgInwiICJ8PSIgInx8IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvSW52YWxpZE1vZHVsZURpcmVjdGl2ZS9tb2R1bGUtaW5mby5qYXZhCisobGluZSAyNyxjb2wgMjEpIFBhcnNlIGVycm9yLiBGb3VuZCAgInJlc3VpcmVzIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgImV4cG9ydHMiICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJ1c2VzIiAifSIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0xvY2FsRW51bS5qYXZhCisobGluZSAyOCxjb2wgMTQpIFBhcnNlIGVycm9yLiBGb3VuZCAieyIsIGV4cGVjdGVkIG9uZSBvZiAgIiwiICI7IiAiPSIgIkAiICJbIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvTWFsZm9ybWVkRnBMaXQuamF2YQorKGxpbmUgMjgsY29sIDE1KSBQYXJzZSBlcnJvci4gRm91bmQgICJlIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL01vZGlmaWVyTm90QWxsb3dlZC5qYXZhCisobGluZSAyNixjb2wgMSkgJ3N5bmNocm9uaXplZCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL05vQW5ub3RhdGlvbnNPbkRvdENsYXNzLmphdmEKKyhsaW5lIDMwLGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICJAIiwgZXhwZWN0ZWQgb25lIG9mICAiISIgIigiICJlbnVtIiAiZXhwb3J0cyIgImZhbHNlIiAibW9kdWxlIiAibmV3IiAibnVsbCIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInN1cGVyIiAidGhpcyIgInRvIiAidHJhbnNpdGl2ZSIgInRydWUiICJ1c2VzIiAid2l0aCIgIn4iIDxDSEFSQUNURVJfTElURVJBTD4gPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IDxJREVOVElGSUVSPiA8SU5URUdFUl9MSVRFUkFMPiA8TE9OR19MSVRFUkFMPiA8U1RSSU5HX0xJVEVSQUw+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9Ob3RBbGxvd2VkQ2xhc3MuamF2YQorKGxpbmUgMjgsY29sIDE3KSBQYXJzZSBlcnJvci4gRm91bmQgImNsYXNzIiwgZXhwZWN0ZWQgb25lIG9mICAiKCIgIisrIiAiLS0iICI7IiAiQCIgImFzc2VydCIgImJvb2xlYW4iICJicmVhayIgImJ5dGUiICJjaGFyIiAiY29udGludWUiICJkbyIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJmbG9hdCIgImZvciIgImlmIiAiaW50IiAibG9uZyIgIm1vZHVsZSIgIm5ldyIgIm51bGwiICJvcGVuIiAib3BlbnMiICJwcm92aWRlcyIgInJlcXVpcmVzIiAicmV0dXJuIiAic2hvcnQiICJzdHJpY3RmcCIgInN1cGVyIiAic3dpdGNoIiAic3luY2hyb25pemVkIiAidGhpcyIgInRocm93IiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInRyeSIgInVzZXMiICJ2b2lkIiAid2hpbGUiICJ3aXRoIiAieyIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKyhsaW5lIDMxLGNvbCAyKSBQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkIG9uZSBvZiAgImVsc2UiICJ9IgorKGxpbmUgMzEsY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIjwiICJAIiAiYWJzdHJhY3QiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJjbGFzcyIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJpbnRlcmZhY2UiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvaWQiICJ2b2xhdGlsZSIgIndpdGgiICJ7IiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9Ob3RBbGxvd2VkVmFyaWFibGUuamF2YQorKGxpbmUgMjgsY29sIDE3KSBQYXJzZSBlcnJvci4gRm91bmQgImludCIsIGV4cGVjdGVkIG9uZSBvZiAgIigiICJlbnVtIiAiZXhwb3J0cyIgImZhbHNlIiAibW9kdWxlIiAibmV3IiAibnVsbCIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInN1cGVyIiAidGhpcyIgInRvIiAidHJhbnNpdGl2ZSIgInRydWUiICJ1c2VzIiAid2l0aCIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL05vdEFTdGF0ZW1lbnQuamF2YQorKGxpbmUgMjcsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgICJ4IiA8SURFTlRJRklFUj4sIGV4cGVjdGVkICJ9IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvT3JwaGFuZWQuamF2YQorKGxpbmUgMjcsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgImNhc2UiLCBleHBlY3RlZCAifSIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL1ByZW1hdHVyZUVPRi5qYXZhCisobGluZSAyNixjb2wgMjApIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIjwiICJAIiAiYWJzdHJhY3QiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJjbGFzcyIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJpbnRlcmZhY2UiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvaWQiICJ2b2xhdGlsZSIgIndpdGgiICJ7IiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9Qcm9jZXNzb3JXcm9uZ1R5cGUvUHJvY2Vzc29yV3JvbmdUeXBlLmphdmEKK1BhcnNlIGVycm9yLiBGb3VuZCAgImNsYXMiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9SZXBlYXRlZE1vZGlmaWVyLmphdmEKKyhsaW5lIDI3LGNvbCAxMikgRHVwbGljYXRlZCBtb2RpZmllcgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvVGhpc0FzSWRlbnRpZmllci5qYXZhCisobGluZSAyNyxjb2wgNSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ0aGlzIiwgZXhwZWN0ZWQgb25lIG9mICAiZW51bSIgImV4cG9ydHMiICJtb2R1bGUiICJvcGVuIiAib3BlbnMiICJwcm92aWRlcyIgInJlcXVpcmVzIiAic3RyaWN0ZnAiICJ0byIgInRyYW5zaXRpdmUiICJ1c2VzIiAid2l0aCIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9UaHJvd3NOb3RBbGxvd2VkSW5Bbm5vLmphdmEKKyhsaW5lIDI3LGNvbCAxOCkgUGFyc2UgZXJyb3IuIEZvdW5kICJ0aHJvd3MiLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiZGVmYXVsdCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL1RyeVdpdGhvdXRDYXRjaE9yRmluYWxseS5qYXZhCisobGluZSAyOSxjb2wgOSkgVHJ5IGhhcyBubyBmaW5hbGx5LCBubyBjYXRjaCwgYW5kIG5vIHJlc291cmNlcy4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL1RyeVdpdGhvdXRDYXRjaE9yRmluYWxseU9yUmVzb3VyY2UuamF2YQorKGxpbmUgMjgsY29sIDkpIFRyeSBoYXMgbm8gZmluYWxseSwgbm8gY2F0Y2gsIGFuZCBubyByZXNvdXJjZXMuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9UeXBlUmVxQ2xhc3NBcnJheS5qYXZhCisobGluZSAzMCxjb2wgMzQpIFBhcnNlIGVycm9yLiBGb3VuZCAiKSIsIGV4cGVjdGVkICJbIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvVW5jbG9zZWRDaGFyTGl0ZXJhbC5qYXZhCitMZXhpY2FsIGVycm9yIGF0IGxpbmUgMjcsIGNvbHVtbiAxNi4gIEVuY291bnRlcmVkOiAiOyIgKDU5KSwgYWZ0ZXIgOiAiXCdhIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvVW5jbG9zZWRDb21tZW50LmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAzMSwgY29sdW1uIDAuICBFbmNvdW50ZXJlZDogPEVPRj4gYWZ0ZXIgOiAiIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvVW5jbG9zZWRTdHJpbmdMaXRlcmFsLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAyNywgY29sdW1uIDIxLiAgRW5jb3VudGVyZWQ6ICJcbiIgKDEwKSwgYWZ0ZXIgOiAiXCJhYmM7IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvVW5kZXJzY29yZUFzSWRlbnRpZmllckVycm9yLmphdmEKKyhsaW5lIDI3LGNvbCAxMikgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL1VuZGVyc2NvcmVBc0lkZW50aWZpZXJXYXJuaW5nLmphdmEKKyhsaW5lIDI4LGNvbCAxMikgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL1VuZGVyc2NvcmVJbkxhbWJkYUV4cHJlc3Npb24uamF2YQorKGxpbmUgMjYsY29sIDUyKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvVW5leHBlY3RlZFRva2VuSW5Nb2R1bGVJbmZvL21vZHVsZS1pbmZvLmphdmEKK1BhcnNlIGVycm9yLiBGb3VuZCAgIndlYWsiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9kaWFncy9leGFtcGxlcy9WYXJhcmdzQW5kUmVjZWl2ZXIuamF2YQorKGxpbmUgMjcsY29sIDMwKSBQYXJzZSBlcnJvci4gRm91bmQgInRoaXMiLCBleHBlY3RlZCBvbmUgb2YgICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL0RpZ2l0cy5qYXZhCisobGluZSAxMSxjb2wgNDApIFBhcnNlIGVycm9yLiBGb3VuZCAgIlxcdTA2NjMiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiOyIgIjwiICI8PD0iICI8PSIgIj0iICI9PSIgIj4iICI+PSIgIj4+PSIgIj4+Pj0iICI/IiAiXiIgIl49IiAiaW5zdGFuY2VvZiIgInwiICJ8PSIgInx8IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZW51bS9FbnVtQXNJZGVudGlmaWVyLmphdmEKKyhsaW5lIDExLGNvbCA5KSAnZW51bScgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBhcyBpdCBpcyBhIGtleXdvcmQuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9lbnVtL0VudW1NZW1iZXJzT3JkZXIuamF2YQorKGxpbmUgMTEsY29sIDEwKSBQYXJzZSBlcnJvci4gRm91bmQgICJkIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIoIiAiKSIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9lbnVtL0V4cGxpY2l0bHlBYnN0cmFjdEVudW0xLmphdmEKKyhsaW5lIDksY29sIDEpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2VudW0vRXhwbGljaXRseUFic3RyYWN0RW51bTIuamF2YQorKGxpbmUgOSxjb2wgMSkgJ2Fic3RyYWN0JyBpcyBub3QgYWxsb3dlZCBoZXJlLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvZW51bS9FeHBsaWNpdGx5RmluYWxFbnVtMS5qYXZhCisobGluZSA5LGNvbCAxKSAnZmluYWwnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9lbnVtL0V4cGxpY2l0bHlGaW5hbEVudW0yLmphdmEKKyhsaW5lIDksY29sIDEpICdmaW5hbCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2VudW0vTG9jYWxFbnVtLmphdmEKKyhsaW5lIDExLGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICJ7IiwgZXhwZWN0ZWQgb25lIG9mICAiLCIgIjsiICI9IiAiQCIgIlsiCisobGluZSAxMyxjb2wgMikgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCAifSIKKyhsaW5lIDEzLGNvbCAyKSBQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkIG9uZSBvZiAgIjsiICI8IiAiQCIgImFic3RyYWN0IiAiYm9vbGVhbiIgImJ5dGUiICJjaGFyIiAiY2xhc3MiICJkZWZhdWx0IiAiZG91YmxlIiAiZW51bSIgImV4cG9ydHMiICJmaW5hbCIgImZsb2F0IiAiaW50IiAiaW50ZXJmYWNlIiAibG9uZyIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJvcGVucyIgInByaXZhdGUiICJwcm90ZWN0ZWQiICJwcm92aWRlcyIgInB1YmxpYyIgInJlcXVpcmVzIiAic2hvcnQiICJzdGF0aWMiICJzdHJpY3RmcCIgInN5bmNocm9uaXplZCIgInRvIiAidHJhbnNpZW50IiAidHJhbnNpdGl2ZSIgInVzZXMiICJ2b2lkIiAidm9sYXRpbGUiICJ3aXRoIiAieyIgIn0iIDxJREVOVElGSUVSPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvRU9JLmphdmEKKyhsaW5lIDEwLGNvbCAxNikgUGFyc2UgZXJyb3IuIEZvdW5kICAiZm9vYmFyXHUwMDFhIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIjsiICJAIiAiXHUwMDFhIiAiYWJzdHJhY3QiICJjbGFzcyIgImRlZmF1bHQiICJlbnVtIiAiZmluYWwiICJpbXBvcnQiICJpbnRlcmZhY2UiICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInB1YmxpYyIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidHJhbnNpZW50IiAidHJhbnNpdGl2ZSIgInZvbGF0aWxlIiA8RU9GPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvRXh0ZW5kQXJyYXkuamF2YQorKGxpbmUgMTEsY29sIDM0KSBQYXJzZSBlcnJvci4gRm91bmQgIlsiLCBleHBlY3RlZCBvbmUgb2YgICIsIiAiaW1wbGVtZW50cyIgInsiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9FeHRyYW5lb3VzRXF1YWxzLmphdmEKKyhsaW5lIDEwLGNvbCAyMikgUGFyc2UgZXJyb3IuIEZvdW5kICI9IiwgZXhwZWN0ZWQgb25lIG9mICAiISIgIigiICIrIiAiKysiICItIiAiLS0iICJAIiAiXSIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJmbG9hdCIgImludCIgImxvbmciICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInNob3J0IiAic3RyaWN0ZnAiICJzdXBlciIgInRoaXMiICJ0byIgInRyYW5zaXRpdmUiICJ0cnVlIiAidXNlcyIgInZvaWQiICJ3aXRoIiAifiIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2ZhaWxvdmVyL0ZhaWxPdmVyMDEuamF2YQorKGxpbmUgMTAsY29sIDIwKSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDEwLGNvbCAyNikgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCAifSIKKyhsaW5lIDEwLGNvbCAyNikgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCBvbmUgb2YgICI7IiAiPCIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9pZCIgInZvbGF0aWxlIiAid2l0aCIgInsiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2ZhaWxvdmVyL0ZhaWxPdmVyMTUuamF2YQorKGxpbmUgMTcsY29sIDkpIFBhcnNlIGVycm9yLiBGb3VuZCAifSIsIGV4cGVjdGVkIG9uZSBvZiAgIiU9IiAiJj0iICIqPSIgIisrIiAiKz0iICItLSIgIi09IiAiLz0iICI7IiAiPDw9IiAiPSIgIj4+PSIgIj4+Pj0iICJePSIgInw9IgorKGxpbmUgMTksY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgIn0iCisobGluZSAxOSxjb2wgMikgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCBvbmUgb2YgICI7IiAiPCIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9pZCIgInZvbGF0aWxlIiAid2l0aCIgInsiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL0Zsb2F0aW5nUG9pbnRDaGFuZ2VzL0JhZENvbnN0cnVjdG9yTW9kaWZpZXJzLmphdmEKKyhsaW5lIDEyLGNvbCA1KSAnc3RyaWN0ZnAnIGlzIG5vdCBhbGxvd2VkIGhlcmUuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9nZW5lcmljcy90eXBldmFycy81MDYwNDg1L0NvbXBhdGliaWxpdHkwMi5qYXZhCisobGluZSAzNixjb2wgOSkgJ3N0YXRpYycgaXMgbm90IGFsbG93ZWQgaGVyZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2dlbmVyaWNzL3R5cGV2YXJzLzY2ODAxMDYvVDY2ODAxMDYuamF2YQorKGxpbmUgMTEsY29sIDI0KSBQYXJzZSBlcnJvci4gRm91bmQgIlsiLCBleHBlY3RlZCBvbmUgb2YgICImIiAiLCIgIj4iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9JbGxlZ2FsQW5ub3RhdGlvbi5qYXZhCisobGluZSA5LGNvbCA1KSBQYXJzZSBlcnJvci4gRm91bmQgIkAiLCBleHBlY3RlZCAifSIKKyhsaW5lIDExLGNvbCA1KSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiQCIgIlx1MDAxYSIgImFic3RyYWN0IiAiY2xhc3MiICJkZWZhdWx0IiAiZW51bSIgImZpbmFsIiAiaW1wb3J0IiAiaW50ZXJmYWNlIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgInByaXZhdGUiICJwcm90ZWN0ZWQiICJwdWJsaWMiICJzdGF0aWMiICJzdHJpY3RmcCIgInN5bmNocm9uaXplZCIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ2b2xhdGlsZSIgPEVPRj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2luY29tcGxldGVTdGF0ZW1lbnRzL1Q4MDAwNDg0LmphdmEKKyhsaW5lIDksY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgImNhdGNoIiwgZXhwZWN0ZWQgIn0iCisobGluZSAxMCxjb2wgMjkpIFBhcnNlIGVycm9yLiBGb3VuZCAiZWxzZSIsIGV4cGVjdGVkIG9uZSBvZiAgIjsiICI8IiAiQCIgImFic3RyYWN0IiAiYm9vbGVhbiIgImJ5dGUiICJjaGFyIiAiY2xhc3MiICJkZWZhdWx0IiAiZG91YmxlIiAiZW51bSIgImV4cG9ydHMiICJmaW5hbCIgImZsb2F0IiAiaW50IiAiaW50ZXJmYWNlIiAibG9uZyIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJvcGVucyIgInByaXZhdGUiICJwcm90ZWN0ZWQiICJwcm92aWRlcyIgInB1YmxpYyIgInJlcXVpcmVzIiAic2hvcnQiICJzdGF0aWMiICJzdHJpY3RmcCIgInN5bmNocm9uaXplZCIgInRvIiAidHJhbnNpZW50IiAidHJhbnNpdGl2ZSIgInVzZXMiICJ2b2lkIiAidm9sYXRpbGUiICJ3aXRoIiAieyIgIn0iIDxJREVOVElGSUVSPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvTGFiZWxlZERlY2xhcmF0aW9uLmphdmEKKyhsaW5lIDEyLGNvbCA4KSBQYXJzZSBlcnJvci4gRm91bmQgImludCIsIGV4cGVjdGVkIG9uZSBvZiAgIigiICJlbnVtIiAiZXhwb3J0cyIgImZhbHNlIiAibW9kdWxlIiAibmV3IiAibnVsbCIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInN1cGVyIiAidGhpcyIgInRvIiAidHJhbnNpdGl2ZSIgInRydWUiICJ1c2VzIiAid2l0aCIgPENIQVJBQ1RFUl9MSVRFUkFMPiA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gPElERU5USUZJRVI+IDxJTlRFR0VSX0xJVEVSQUw+IDxMT05HX0xJVEVSQUw+IDxTVFJJTkdfTElURVJBTD4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL2xhbWJkYS84MTMxNzQyL1Q4MTMxNzQyLmphdmEKKyhsaW5lIDgsY29sIDMyKSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICIpIiAiLCIgIkAiICJbIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL0JhZExhbWJkYVBvcy5qYXZhCisobGluZSAxOCxjb2wgMjYpIFBhcnNlIGVycm9yLiBGb3VuZCAiKyIsIGV4cGVjdGVkIG9uZSBvZiAgIikiICIsIgorKGxpbmUgMTksY29sIDI2KSBQYXJzZSBlcnJvci4gRm91bmQgImluc3RhbmNlb2YiLCBleHBlY3RlZCBvbmUgb2YgICIpIiAiLCIKKyhsaW5lIDIzLGNvbCAzMCkgUGFyc2UgZXJyb3IuIEZvdW5kICIrIiwgZXhwZWN0ZWQgb25lIG9mICAiLCIgIjsiCisobGluZSAyNCxjb2wgMzMpIFBhcnNlIGVycm9yLiBGb3VuZCAiaW5zdGFuY2VvZiIsIGV4cGVjdGVkIG9uZSBvZiAgIiwiICI7IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL0JhZFN0YXRlbWVudEluTGFtYmRhLmphdmEKKyhsaW5lIDE4LGNvbCAxOSkgUGFyc2UgZXJyb3IuIEZvdW5kICAiMSIgPElOVEVHRVJfTElURVJBTD4sIGV4cGVjdGVkICJ9IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL2Z1bmNJbnRlcmZhY2VzL0xhbWJkYVRlc3QxX25lZzEuamF2YQorKGxpbmUgMTMsY29sIDY0KSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCBvbmUgb2YgICIsIiAiOyIKKyhsaW5lIDE1LGNvbCAyKSBQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkICJ9IgorKGxpbmUgMTUsY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIjwiICJAIiAiYWJzdHJhY3QiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJjbGFzcyIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJpbnRlcmZhY2UiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvaWQiICJ2b2xhdGlsZSIgIndpdGgiICJ7IiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvSWRlbnRpZmllclRlc3QuamF2YQorKGxpbmUgNDEsY29sIDExKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNDQsY29sIDE2KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNDUsY29sIDIwKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNDYsY29sIDIyKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNTEsY29sIDEzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNTEsY29sIDE1KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNTEsY29sIDIzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNTMsY29sIDEzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNTUsY29sIDEzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNjEsY29sIDIxKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNjIsY29sIDQyKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNjMsY29sIDY3KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNzAsY29sIDEzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNzEsY29sIDE0KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNzIsY29sIDE4KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNzcsY29sIDIyKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNzksY29sIDEzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNzksY29sIDE1KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgODEsY29sIDEzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgODEsY29sIDE1KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgODgsY29sIDEwKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgODgsY29sIDM4KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgOTQsY29sIDE0KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTAxLGNvbCAxNykgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDEwMSxjb2wgMjYpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxMTgsY29sIDIwKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTIzLGNvbCAxMCkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDEyOCxjb2wgMTcpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxMzEsY29sIDE3KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTM4LGNvbCAxNykgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDEzOCxjb2wgMjQpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxMzgsY29sIDMzKSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTM5LGNvbCAzOSkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDE0Myxjb2wgMTMpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxNDQsY29sIDE1KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTQ1LGNvbCAxMykgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDE1MCxjb2wgMTUpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxNTEsY29sIDE3KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTU3LGNvbCAxNikgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDE1OSxjb2wgMjUpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxNjgsY29sIDUpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAxNzIsY29sIDI2KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMTc0LGNvbCAxOSkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDE4MCxjb2wgMTEpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvbGFtYmRhRXhwcmVzc2lvbi9JbnZhbGlkRXhwcmVzc2lvbjEuamF2YQorKGxpbmUgMTUsY29sIDY2KSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDE2LGNvbCA1KSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCBvbmUgb2YgICIsIiAiOyIKKyhsaW5lIDE3LGNvbCAyKSBQYXJzZSBlcnJvci4gRm91bmQgPEVPRj4sIGV4cGVjdGVkICJ9IgorKGxpbmUgMTcsY29sIDIpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIjwiICJAIiAiYWJzdHJhY3QiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJjbGFzcyIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJpbnRlcmZhY2UiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvaWQiICJ2b2xhdGlsZSIgIndpdGgiICJ7IiAifSIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVW5kZXJzY29yZUFzSWRlbnQuamF2YQorKGxpbmUgMzAsY29sIDkpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAzMCxjb2wgOSkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDMyLGNvbCA4KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgMzIsY29sIDgpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSAzNCxjb2wgNykgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDM1LGNvbCAxMikgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDM2LGNvbCAxMCkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDM2LGNvbCAxOSkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDM4LGNvbCAxNikgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDQxLGNvbCAxOCkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDQxLGNvbCAyNSkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDQxLGNvbCAzMykgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDQ0LGNvbCAzNCkgJ18nIGlzIGEgcmVzZXJ2ZWQga2V5d29yZC4KKyhsaW5lIDQ3LGNvbCA5KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNDksY29sIDE5KSAnXycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLgorKGxpbmUgNTEsY29sIDkpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisobGluZSA1Myxjb2wgMjIpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVm9pZExhbWJkYVBhcmFtZXRlci5qYXZhCisobGluZSA3LGNvbCAxOCkgUGFyc2UgZXJyb3IuIEZvdW5kICJ2b2lkIiwgZXhwZWN0ZWQgb25lIG9mICAiISIgIigiICIpIiAiZW51bSIgImV4cG9ydHMiICJmYWxzZSIgIm1vZHVsZSIgIm5ldyIgIm51bGwiICJvcGVuIiAib3BlbnMiICJwcm92aWRlcyIgInJlcXVpcmVzIiAic3RyaWN0ZnAiICJzdXBlciIgInRoaXMiICJ0byIgInRyYW5zaXRpdmUiICJ0cnVlIiAidXNlcyIgIndpdGgiICJ+IiA8Q0hBUkFDVEVSX0xJVEVSQUw+IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiA8SURFTlRJRklFUj4gPElOVEVHRVJfTElURVJBTD4gPExPTkdfTElURVJBTD4gPFNUUklOR19MSVRFUkFMPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvbGl0ZXJhbHMvQmFkQmluYXJ5TGl0ZXJhbHMuamF2YQorKGxpbmUgMTEsY29sIDIwKSBQYXJzZSBlcnJvci4gRm91bmQgICIyIiA8SU5URUdFUl9MSVRFUkFMPiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiOyIgIjwiICI8PD0iICI8PSIgIj0iICI9PSIgIj4iICI+PSIgIj4+PSIgIj4+Pj0iICI/IiAiXiIgIl49IiAiaW5zdGFuY2VvZiIgInwiICJ8PSIgInx8IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvbGl0ZXJhbHMvQmFkVW5kZXJzY29yZUxpdGVyYWxzLmphdmEKKyhsaW5lIDE1LGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICAiXyIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9saXRlcmFscy9UNjg5MTA3OS5qYXZhCisobGluZSA4LGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICAiQiIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9tb2R1bGVzL0ludmFsaWRNb2R1bGVEaXJlY3RpdmUvbW9kdWxlLWluZm8uamF2YQorKGxpbmUgOSxjb2wgMjEpIFBhcnNlIGVycm9yLiBGb3VuZCAgInJlc3VpcmVzIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgImV4cG9ydHMiICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJ1c2VzIiAifSIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL292ZXJycmlkZWNyYXNoL0EuamF2YQorKGxpbmUgMjUsY29sIDUpIENhbiBoYXZlIG9ubHkgb25lIG9mICdwcm90ZWN0ZWQnLCAncHJpdmF0ZScuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9vdmVycnJpZGVjcmFzaC9CLmphdmEKKyhsaW5lIDEyLGNvbCA1KSBDYW4gaGF2ZSBvbmx5IG9uZSBvZiAncHJvdGVjdGVkJywgJ3ByaXZhdGUnLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvUGFyZW5zMy5qYXZhCisobGluZSAxMixjb2wgOSkgUGFyc2UgZXJyb3IuIEZvdW5kICI6IiwgZXhwZWN0ZWQgb25lIG9mICAiJT0iICImPSIgIio9IiAiKysiICIrPSIgIi0tIiAiLT0iICIvPSIgIjsiICI8PD0iICI9IiAiPj49IiAiPj4+PSIgIl49IiAifD0iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9QYXJzZUNvbmRpdGlvbmFsLmphdmEKKyhsaW5lIDIzLGNvbCAxMykgSWxsZWdhbCBsZWZ0IGhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50LgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvcGFyc2VyLzcxNTcxNjUvVDcxNTcxNjUuamF2YQorKGxpbmUgMTEsY29sIDE5KSBQYXJzZSBlcnJvci4gRm91bmQgInwiLCBleHBlY3RlZCBvbmUgb2YgICIsIiAiPiIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3BhcnNlci84MDgxNzY5L1Q4MDgxNzY5LmphdmEKKyhsaW5lIDksY29sIDIwKSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisobGluZSAxMCxjb2wgMjApIFBhcnNlIGVycm9yLiBGb3VuZCAiLiIsIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDExLGNvbCAyMCkgUGFyc2UgZXJyb3IuIEZvdW5kICIuIiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiOyIgIjwiICI8PD0iICI8PSIgIj0iICI9PSIgIj4iICI+PSIgIj4+PSIgIj4+Pj0iICI/IiAiXiIgIl49IiAiaW5zdGFuY2VvZiIgInwiICJ8PSIgInx8IgorKGxpbmUgMTIsY29sIDIwKSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisobGluZSAxNCxjb2wgMzEpIFBhcnNlIGVycm9yLiBGb3VuZCAiLiIsIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3BhcnNlci9FcnJvbmVvdXNQYXJhbWV0ZXJzLmphdmEKKyhsaW5lIDExLGNvbCAzNCkgUGFyc2UgZXJyb3IuIEZvdW5kICIuLi4iLCBleHBlY3RlZCBvbmUgb2YgICIpIiAiLCIgIkAiICJbIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvcGFyc2VyL01pc3NpbmdDbG9zaW5nQnJhY2UuamF2YQorKGxpbmUgMTMsY29sIDEpIFBhcnNlIGVycm9yLiBGb3VuZCA8RU9GPiwgZXhwZWN0ZWQgb25lIG9mICAiZWxzZSIgIn0iCisobGluZSAxMyxjb2wgMikgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCBvbmUgb2YgICI7IiAiPCIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9pZCIgInZvbGF0aWxlIiAid2l0aCIgInsiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3BhcnNlci9TaW5nbGVDb21tYUFubm90YXRpb25WYWx1ZUZhaWwuamF2YQorKGxpbmUgMzQsY29sIDExKSBQYXJzZSBlcnJvci4gRm91bmQgICIwIiA8SU5URUdFUl9MSVRFUkFMPiwgZXhwZWN0ZWQgIn0iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9wYXJzZXIvVDQ4ODEyNjkuamF2YQorKGxpbmUgMzIsY29sIDEwKSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3BvbGljeS90ZXN0My9BLmphdmEKKyhsaW5lIDUsY29sIDM2KSBQYXJzZSBlcnJvci4gRm91bmQgICIwIiA8SU5URUdFUl9MSVRFUkFMPiwgZXhwZWN0ZWQgIn0iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9wcm9jZXNzaW5nLzY5OTQ5NDYvU3ludGF4RXJyb3JUZXN0LmphdmEKKyhsaW5lIDE0LGNvbCA5KSBQYXJzZSBlcnJvci4gRm91bmQgIn0iLCBleHBlY3RlZCAiKCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3Byb2Nlc3NpbmcvZXJyb3JzL1Rlc3RQYXJzZUVycm9ycy9QYXJzZUVycm9ycy5qYXZhCisobGluZSAzNyxjb2wgMzYpIFBhcnNlIGVycm9yLiBGb3VuZCAiLCIsIGV4cGVjdGVkIG9uZSBvZiAgIi4uLiIgIkAiICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3F1aWQvVDY5OTk0MzguamF2YQorTGV4aWNhbCBlcnJvciBhdCBsaW5lIDgsIGNvbHVtbiA5LiAgRW5jb3VudGVyZWQ6ICIjIiAoMzUpLCBhZnRlciA6ICIiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9yYXdEaWFncy9FcnJvci5qYXZhCisobGluZSA5LGNvbCAxNykgUGFyc2UgZXJyb3IuIEZvdW5kIDxFT0Y+LCBleHBlY3RlZCAiKCIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL1N0b3JlQ2xhc3MuamF2YQorKGxpbmUgMTIsY29sIDkpIElsbGVnYWwgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudC4KKyhsaW5lIDEzLGNvbCA5KSBJbGxlZ2FsIGxlZnQgaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9TeW5jaHJvbml6ZWRDbGFzcy5qYXZhCisobGluZSA5LGNvbCAxKSAnc3luY2hyb25pemVkJyBpcyBub3QgYWxsb3dlZCBoZXJlLgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvVDQ5OTQwNDkvVDQ5OTQwNDkuamF2YQorKGxpbmUgMTEsY29sIDUpIFBhcnNlIGVycm9yLiBGb3VuZCAgIkJBUiIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIsIiAiOyIgIn0iCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9UNjg4MjIzNS5qYXZhCisobGluZSAxMCxjb2wgMTEpIFBhcnNlIGVycm9yLiBGb3VuZCAiOyIsIGV4cGVjdGVkIG9uZSBvZiAgIiEiICIoIiAiKyIgIisrIiAiLSIgIi0tIiAiQCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmFsc2UiICJmbG9hdCIgImludCIgImxvbmciICJtb2R1bGUiICJuZXciICJudWxsIiAib3BlbiIgIm9wZW5zIiAicHJvdmlkZXMiICJyZXF1aXJlcyIgInNob3J0IiAic3RyaWN0ZnAiICJzdXBlciIgInRoaXMiICJ0byIgInRyYW5zaXRpdmUiICJ0cnVlIiAidXNlcyIgInZvaWQiICJ3aXRoIiAieyIgIn4iIDxDSEFSQUNURVJfTElURVJBTD4gPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IDxJREVOVElGSUVSPiA8SU5URUdFUl9MSVRFUkFMPiA8TE9OR19MSVRFUkFMPiA8U1RSSU5HX0xJVEVSQUw+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9UODAyNjk2My9UeXBlQW5ub3RhdGlvbnNDcmFzaFdpdGhFcnJvbmVvdXNUcmVlVGVzdC5qYXZhCisobGluZSA5LGNvbCAxOSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ0aGlzIiwgZXhwZWN0ZWQgb25lIG9mICAiKSIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImRlZmF1bHQiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZpbmFsIiAiZmxvYXQiICJpbnQiICJsb25nIiAibW9kdWxlIiAibmF0aXZlIiAib3BlbiIgIm9wZW5zIiAicHJpdmF0ZSIgInByb3RlY3RlZCIgInByb3ZpZGVzIiAicHVibGljIiAicmVxdWlyZXMiICJzaG9ydCIgInN0YXRpYyIgInN0cmljdGZwIiAic3luY2hyb25pemVkIiAidG8iICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidXNlcyIgInZvbGF0aWxlIiAid2l0aCIgPElERU5USUZJRVI+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9UODE3MTMyNS9OUEVDbGVhcmluZ0xvY2FsQ2xhc3NOYW1lSW5kZXhlc1Rlc3QuamF2YQorKGxpbmUgMTksY29sIDQyKSBUeXBlIGFyZ3VtZW50cyBtYXkgbm90IGJlIHByaW1pdGl2ZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL1Q4MTc1MTk4L0Fubm90YXRpb25zQW5kRm9ybWFsUGFyYW1zVGVzdC5qYXZhCisobGluZSA5LGNvbCAxNCkgUGFyc2UgZXJyb3IuIEZvdW5kICJpbnQiLCBleHBlY3RlZCAiKSIKKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL1Q4MTgxNDY0L0xhbWJkYUluQW5ub3RhdGlvbnNDYXVzZXNOUEVUZXN0MS5qYXZhCisobGluZSAxMCxjb2wgMTUpIFBhcnNlIGVycm9yLiBGb3VuZCAiLT4iLCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICImIiAiJiYiICIoIiAiKSIgIioiICIrIiAiLCIgIi0iICIvIiAiPCIgIjw9IiAiPT0iICI+IiAiPj0iICI/IiAiXiIgImluc3RhbmNlb2YiICJ8IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9UODE4MTQ2NC9MYW1iZGFJbkFubm90YXRpb25zQ2F1c2VzTlBFVGVzdDIuamF2YQorKGxpbmUgMTAsY29sIDI0KSBQYXJzZSBlcnJvci4gRm91bmQgIi0+IiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJiIgIiYmIiAiKSIgIioiICIrIiAiLCIgIi0iICIvIiAiPCIgIjw9IiAiPT0iICI+IiAiPj0iICI/IiAiXiIgImluc3RhbmNlb2YiICJ8IiAifHwiCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy9UcnlXaXRoUmVzb3VyY2VzL0JhZFR3clN5bnRheC5qYXZhCisobGluZSAxNCxjb2wgNDIpIFBhcnNlIGVycm9yLiBGb3VuZCAiOyIsIGV4cGVjdGVkICIpIgorKGxpbmUgMTQsY29sIDQzKSBQYXJzZSBlcnJvci4gRm91bmQgIikiLCBleHBlY3RlZCAifSIKKyhsaW5lIDE2LGNvbCA5KSBQYXJzZSBlcnJvci4gRm91bmQgInRyeSIsIGV4cGVjdGVkIG9uZSBvZiAgIjsiICI8IiAiQCIgImFic3RyYWN0IiAiYm9vbGVhbiIgImJ5dGUiICJjaGFyIiAiY2xhc3MiICJkZWZhdWx0IiAiZG91YmxlIiAiZW51bSIgImV4cG9ydHMiICJmaW5hbCIgImZsb2F0IiAiaW50IiAiaW50ZXJmYWNlIiAibG9uZyIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJvcGVucyIgInByaXZhdGUiICJwcm90ZWN0ZWQiICJwcm92aWRlcyIgInB1YmxpYyIgInJlcXVpcmVzIiAic2hvcnQiICJzdGF0aWMiICJzdHJpY3RmcCIgInN5bmNocm9uaXplZCIgInRvIiAidHJhbnNpZW50IiAidHJhbnNpdGl2ZSIgInVzZXMiICJ2b2lkIiAidm9sYXRpbGUiICJ3aXRoIiAieyIgIn0iIDxJREVOVElGSUVSPgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvVHJ5V2l0aFJlc291cmNlcy9QbGFpblRyeS5qYXZhCisobGluZSAxMSxjb2wgOSkgVHJ5IGhhcyBubyBmaW5hbGx5LCBubyBjYXRjaCwgYW5kIG5vIHJlc291cmNlcy4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL1RyeVdpdGhSZXNvdXJjZXMvUmVzRGVjbE91dHNpZGVUcnkuamF2YQorKGxpbmUgMTQsY29sIDE0KSBQYXJzZSBlcnJvci4gRm91bmQgIj0iLCBleHBlY3RlZCBvbmUgb2YgICIoIiAiKSIKKyhsaW5lIDE0LGNvbCA0OCkgUGFyc2UgZXJyb3IuIEZvdW5kICIpIiwgZXhwZWN0ZWQgIn0iCisobGluZSAxNSxjb2wgOSkgUGFyc2UgZXJyb3IuIEZvdW5kICJyZXR1cm4iLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiPCIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9pZCIgInZvbGF0aWxlIiAid2l0aCIgInsiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL1RyeVdpdGhSZXNvdXJjZXMvVHdyRm9yVmFyaWFibGUyLmphdmEKKyhsaW5lIDEzLGNvbCAxMykgUGFyc2UgZXJyb3IuIEZvdW5kICJmaW5hbCIsIGV4cGVjdGVkIG9uZSBvZiAgIigiICJAIiAiYm9vbGVhbiIgImJ5dGUiICJjaGFyIiAiZG91YmxlIiAiZW51bSIgImV4cG9ydHMiICJmYWxzZSIgImZsb2F0IiAiaW50IiAibG9uZyIgIm1vZHVsZSIgIm5ldyIgIm51bGwiICJvcGVuIiAib3BlbnMiICJwcm92aWRlcyIgInJlcXVpcmVzIiAic2hvcnQiICJzdHJpY3RmcCIgInN1cGVyIiAidGhpcyIgInRvIiAidHJhbnNpdGl2ZSIgInRydWUiICJ1c2VzIiAidm9pZCIgIndpdGgiIDxDSEFSQUNURVJfTElURVJBTD4gPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IDxJREVOVElGSUVSPiA8SU5URUdFUl9MSVRFUkFMPiA8TE9OR19MSVRFUkFMPiA8U1RSSU5HX0xJVEVSQUw+CisobGluZSAxNSxjb2wgOSkgUGFyc2UgZXJyb3IuIEZvdW5kICJ0cnkiLCBleHBlY3RlZCBvbmUgb2YgICI7IiAiPCIgIkAiICJhYnN0cmFjdCIgImJvb2xlYW4iICJieXRlIiAiY2hhciIgImNsYXNzIiAiZGVmYXVsdCIgImRvdWJsZSIgImVudW0iICJleHBvcnRzIiAiZmluYWwiICJmbG9hdCIgImludCIgImludGVyZmFjZSIgImxvbmciICJtb2R1bGUiICJuYXRpdmUiICJvcGVuIiAib3BlbnMiICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHJvdmlkZXMiICJwdWJsaWMiICJyZXF1aXJlcyIgInNob3J0IiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0byIgInRyYW5zaWVudCIgInRyYW5zaXRpdmUiICJ1c2VzIiAidm9pZCIgInZvbGF0aWxlIiAid2l0aCIgInsiICJ9IiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFjL3VuaWNvZGUvRmlyc3RDaGFyMi5qYXZhCitQYXJzZSBlcnJvci4gRm91bmQgICJcXHUwMDcwdWJsaWMiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiOyIgIkAiICJcdTAwMWEiICJhYnN0cmFjdCIgImNsYXNzIiAiZGVmYXVsdCIgImVudW0iICJmaW5hbCIgImltcG9ydCIgImludGVyZmFjZSIgIm1vZHVsZSIgIm5hdGl2ZSIgIm9wZW4iICJwcml2YXRlIiAicHJvdGVjdGVkIiAicHVibGljIiAic3RhdGljIiAic3RyaWN0ZnAiICJzeW5jaHJvbml6ZWQiICJ0cmFuc2llbnQiICJ0cmFuc2l0aXZlIiAidm9sYXRpbGUiIDxFT0Y+CisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhYy91bmljb2RlL05vbmFzY2lpRGlnaXQuamF2YQorKGxpbmUgMTMsY29sIDE4KSBQYXJzZSBlcnJvci4gRm91bmQgICJcXHVmZjExIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDE2LGNvbCAyMSkgUGFyc2UgZXJyb3IuIEZvdW5kICAiLjAiIDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIigiICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDE3LGNvbCAyMSkgUGFyc2UgZXJyb3IuIEZvdW5kICAiXFx1ZmYxMSIgPElERU5USUZJRVI+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKiIgIio9IiAiKyIgIis9IiAiLCIgIi0iICItPSIgIi0+IiAiLyIgIi89IiAiOjoiICI7IiAiPCIgIjw8PSIgIjw9IiAiPSIgIj09IiAiPiIgIj49IiAiPj49IiAiPj4+PSIgIj8iICJeIiAiXj0iICJpbnN0YW5jZW9mIiAifCIgInw9IiAifHwiCisobGluZSAxOCxjb2wgMjEpIFBhcnNlIGVycm9yLiBGb3VuZCAgIlBcXHVmZjExIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIiE9IiAiJSIgIiU9IiAiJiIgIiYmIiAiJj0iICIqIiAiKj0iICIrIiAiKz0iICIsIiAiLSIgIi09IiAiLT4iICIvIiAiLz0iICI6OiIgIjsiICI8IiAiPDw9IiAiPD0iICI9IiAiPT0iICI+IiAiPj0iICI+Pj0iICI+Pj49IiAiPyIgIl4iICJePSIgImluc3RhbmNlb2YiICJ8IiAifD0iICJ8fCIKKyhsaW5lIDE5LGNvbCAyMSkgUGFyc2UgZXJyb3IuIEZvdW5kICAiRVxcdWZmMTEiIDxJREVOVElGSUVSPiwgZXhwZWN0ZWQgb25lIG9mICAiIT0iICIlIiAiJT0iICImIiAiJiYiICImPSIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiOyIgIjwiICI8PD0iICI8PSIgIj0iICI9PSIgIj4iICI+PSIgIj4+PSIgIj4+Pj0iICI/IiAiXiIgIl49IiAiaW5zdGFuY2VvZiIgInwiICJ8PSIgInx8IgorKGxpbmUgMjAsY29sIDE5KSBQYXJzZSBlcnJvci4gRm91bmQgIi4iLCBleHBlY3RlZCBvbmUgb2YgICIhIiAiKCIgIisiICIrKyIgIi0iICItLSIgIkAiICJib29sZWFuIiAiYnl0ZSIgImNoYXIiICJkb3VibGUiICJlbnVtIiAiZXhwb3J0cyIgImZhbHNlIiAiZmxvYXQiICJpbnQiICJsb25nIiAibW9kdWxlIiAibmV3IiAibnVsbCIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzaG9ydCIgInN0cmljdGZwIiAic3VwZXIiICJ0aGlzIiAidG8iICJ0cmFuc2l0aXZlIiAidHJ1ZSIgInVzZXMiICJ2b2lkIiAid2l0aCIgInsiICJ+IiA8Q0hBUkFDVEVSX0xJVEVSQUw+IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiA8SURFTlRJRklFUj4gPElOVEVHRVJfTElURVJBTD4gPExPTkdfTElURVJBTD4gPFNUUklOR19MSVRFUkFMPgorKGxpbmUgMjEsY29sIDIxKSBQYXJzZSBlcnJvci4gRm91bmQgICIuMCIgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+LCBleHBlY3RlZCBvbmUgb2YgICIhPSIgIiUiICIlPSIgIiYiICImJiIgIiY9IiAiKCIgIioiICIqPSIgIisiICIrPSIgIiwiICItIiAiLT0iICItPiIgIi8iICIvPSIgIjo6IiAiOyIgIjwiICI8PD0iICI8PSIgIj0iICI9PSIgIj4iICI+PSIgIj4+PSIgIj4+Pj0iICI/IiAiXiIgIl49IiAiaW5zdGFuY2VvZiIgInwiICJ8PSIgInx8IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvdW5pY29kZS9UcmlwbGVRdW90ZS5qYXZhCitMZXhpY2FsIGVycm9yIGF0IGxpbmUgMTMsIGNvbHVtbiAxNS4gIEVuY291bnRlcmVkOiAiXCciICgzOSksIGFmdGVyIDogIlwnIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvdW5pY29kZS9Vbmljb2RlQXRFT0wuamF2YQorKGxpbmUgMzMsY29sIDEzKSBQYXJzZSBlcnJvci4gRm91bmQgICJcXHUwMDBEIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkICJ9IgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvdW5pY29kZS9Vbmljb2RlQ29tbWVudERlbGltaXRlci5qYXZhCisobGluZSA0NCxjb2wgMjIpIFBhcnNlIGVycm9yLiBGb3VuZCAgInBsdWdoIiA8SURFTlRJRklFUj4sIGV4cGVjdGVkIG9uZSBvZiAgIiwiICI7IiAiPSIgIkAiICJbIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWMvVm9pZEFycmF5LmphdmEKKyhsaW5lIDEyLGNvbCA1KSBQYXJzZSBlcnJvci4gRm91bmQgIlsiLCBleHBlY3RlZCBvbmUgb2YgICJlbnVtIiAiZXhwb3J0cyIgIm1vZHVsZSIgIm9wZW4iICJvcGVucyIgInByb3ZpZGVzIiAicmVxdWlyZXMiICJzdHJpY3RmcCIgInRvIiAidHJhbnNpdGl2ZSIgInVzZXMiICJ3aXRoIiA8SURFTlRJRklFUj4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFkb2MvNjk2NDkxNC9FcnJvci5qYXZhCisobGluZSAyNSxjb2wgMTIpIFBhcnNlIGVycm9yLiBGb3VuZCAifSIsIGV4cGVjdGVkICIoIgorCitsYW5ndG9vbHMtMTkyOTNlYTM5OTlmL3Rlc3QvdG9vbHMvamF2YWRvYy82OTY0OTE0L0phdmFjV2FybmluZy5qYXZhCisobGluZSAyNSxjb2wgMTIpICdfJyBpcyBhIHJlc2VydmVkIGtleXdvcmQuCisKK2xhbmd0b29scy0xOTI5M2VhMzk5OWYvdGVzdC90b29scy9qYXZhZG9jL2VudW0vZG9jQ29tbWVudHMvcGtnMS9PcGVyYXRpb24uamF2YQorKGxpbmUgMzMsY29sIDEpICdhYnN0cmFjdCcgaXMgbm90IGFsbG93ZWQgaGVyZS4KKworbGFuZ3Rvb2xzLTE5MjkzZWEzOTk5Zi90ZXN0L3Rvb2xzL2phdmFkb2MvVDQ5OTQwNDkvRmlsZVdpdGhUYWJzLmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAyNSwgY29sdW1uIDIuICBFbmNvdW50ZXJlZDogInQiICgxMTYpLCBhZnRlciA6ICJcXCIKKworMzA0IHByb2JsZW1zIGluIDE3NSBmaWxlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1bGtfdGVzdF9yZXN1bHRzL29wZW5qZGtfc3JjX3ppcF90ZXN0X3Jlc3VsdHMudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvYnVsa190ZXN0X3Jlc3VsdHMvb3Blbmpka19zcmNfemlwX3Rlc3RfcmVzdWx0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5NWZhYwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2J1bGtfdGVzdF9yZXN1bHRzL29wZW5qZGtfc3JjX3ppcF90ZXN0X3Jlc3VsdHMudHh0CkBAIC0wLDAgKzEsNCBAQAorY29tL3N1bi94bWwvaW50ZXJuYWwvcm5nb20vcGFyc2UvY29tcGFjdC9Db21wYWN0U3ludGF4LmphdmEKK0xleGljYWwgZXJyb3IgYXQgbGluZSAyNDQsIGNvbHVtbiAzOC4gIEVuY291bnRlcmVkOiAibiIgKDExMCksIGFmdGVyIDogIlwnXFx1MDA1YyIKKworMSBwcm9ibGVtcyBpbiAxIGZpbGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvaXNzdWVfc2FtcGxlcy9Jc3N1ZTI5MC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2lzc3VlX3NhbXBsZXMvSXNzdWUyOTAuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzOWZmOAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2lzc3VlX3NhbXBsZXMvSXNzdWUyOTAuamF2YS50eHQKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcudGVzdDsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5NZXRob2REZWNsYXJhdGlvbjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3JBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCitwdWJsaWMgY2xhc3MgVGVzdENvbW1lbnRzIHsKKyAgICBTdHJpbmcgc3RyID0gIlxcIjsKKworICAgIC8qKgorICAgICAqIENvbW1lbnQgdGhhdCBpcyBpZ25vcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc29tZVRlc3RNZXRob2QoKSB7fQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENvcnJlY3QgcGF0aCBzbyB0aGF0IGl0IHdpbGwgcG9pbnQgdG8gdGhlIGZpbGUgd2l0aCB0aGlzIGNvZGUKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIuXFxzcmNcXG1haW5cXGphdmFcXG9yZ1xcdGVzdFxcVGVzdENvbW1lbnRzLmphdmEiKSkpIHsKKyAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKYXZhUGFyc2VyLnBhcnNlKGluKTsKKworICAgICAgICAgICAgbmV3IFZvaWRWaXNpdG9yQWRhcHRlcjxPYmplY3Q+KCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCwgT2JqZWN0IGFyZykgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGhvZDogIiArIG1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbW1lbnQ6ICIgKyBtZXRob2QuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKYXZhRG9jOiAiICsgbWV0aG9kLmdldEphdmFEb2MoKSArICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0udmlzaXQoY29tcGlsYXRpb25Vbml0LCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9pc3N1ZV9zYW1wbGVzL0lzc3VlNjI0LmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvaXNzdWVfc2FtcGxlcy9Jc3N1ZTYyNC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg2ZDExCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvaXNzdWVfc2FtcGxlcy9Jc3N1ZTYyNC5qYXZhLnR4dApAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHo7CitwdWJsaWMgY2xhc3MgQSAgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZ2V0RGF0YUZvckNhbGN1bCgpIHsKKworCQlhLmIoYykvLworCQkJCS5zdWNjZXNzKGRhdGEgLT4geworCQkJCQkvLyBEQVRBIFNURCBNQUNISU5FCisJCQkJCWRvc29tZXRoaW5nKCk7CisJCQkJfSkvLworCQkJCS5lcnJvcihkZWZhdWx0RXJyb3JDb25zdW1lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvaXNzdWVfc2FtcGxlcy9pc3N1ZTEwMDMuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9pc3N1ZV9zYW1wbGVzL2lzc3VlMTAwMy5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjhmNDYwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvaXNzdWVfc2FtcGxlcy9pc3N1ZTEwMDMuamF2YS50eHQKQEAgLTAsMCArMSwxNDcwIEBACitwYWNrYWdlIGNvbS50cmlndGVjaC5wcml2YXRlbWUuc2VydmVyLmFtOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5SZWNlbnRUYXNrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgY29tLnRyaWd0ZWNoLnByaXZhdGVtZS5jbGllbnQuQXBwSW50ZXJmYWNlOworaW1wb3J0IGNvbS50cmlndGVjaC5wcml2YXRlbWUuY2xpZW50Lmc7CitpbXBvcnQgY29tLnRyaWd0ZWNoLnByaXZhdGVtZS5oZWxwZXIucHJvdG8uQXBwU2V0dGluZzsKK2ltcG9ydCBjb20udHJpZ3RlY2gucHJpdmF0ZW1lLmhlbHBlci5wcm90by5BcHBUYXNrSW5mbzsKK2ltcG9ydCBjb20udHJpZ3RlY2gucHJpdmF0ZW1lLmhlbHBlci5wcm90by5pOworaW1wb3J0IGNvbS50cmlndGVjaC5wcml2YXRlbWUuaGVscGVyLnV0aWxzLms7CitpbXBvcnQgY29tLnRyaWd0ZWNoLnByaXZhdGVtZS5oZWxwZXIudXRpbHMudjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2NsYXNzIEFjdGl2aXR5U3RhY2sKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGIgPSBBY3Rpdml0eVN0YWNrLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgZmluYWwgU3BhcnNlQXJyYXk8cD4gYSA9IG5ldyBTcGFyc2VBcnJheSgpOworICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5TWFuYWdlciBjOworICBwcml2YXRlIGZpbmFsIFRBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIGQ7CisgIHByaXZhdGUgY29tLnRyaWd0ZWNoLnByaXZhdGVtZS5oZWxwZXIudXRpbHMuYTxJbnRlZ2VyLCBwPiBlID0gbmV3IGNvbS50cmlndGVjaC5wcml2YXRlbWUuaGVscGVyLnV0aWxzLmEoKTsKKyAgcHJpdmF0ZSBjb20udHJpZ3RlY2gucHJpdmF0ZW1lLmhlbHBlci51dGlscy5hPEludGVnZXIsIGY+IGYgPSBuZXcgY29tLnRyaWd0ZWNoLnByaXZhdGVtZS5oZWxwZXIudXRpbHMuYSgpOworICBwcml2YXRlIGNvbS50cmlndGVjaC5wcml2YXRlbWUuaGVscGVyLnV0aWxzLmE8SW50ZWdlciwgTGlzdDxjPj4gZyA9IG5ldyBjb20udHJpZ3RlY2gucHJpdmF0ZW1lLmhlbHBlci51dGlscy5hKCk7CisgIHByaXZhdGUgY29tLnRyaWd0ZWNoLnByaXZhdGVtZS5oZWxwZXIudXRpbHMuYTxJbnRlZ2VyLCBMaXN0PGM+PiBoID0gbmV3IGNvbS50cmlndGVjaC5wcml2YXRlbWUuaGVscGVyLnV0aWxzLmEoKTsKKworICBBY3Rpdml0eVN0YWNrKFRBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIHBhcmFtVEFjdGl2aXR5TWFuYWdlclNlcnZpY2UpCisgIHsKKyAgICB0aGlzLmQgPSBwYXJhbVRBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlOworICAgIHRoaXMuYyA9ICgoQWN0aXZpdHlNYW5hZ2VyKUFwcEludGVyZmFjZS5lKCkuaSgpLmdldFN5c3RlbVNlcnZpY2UoImFjdGl2aXR5IikpOworICB9CisKKyAgcHJpdmF0ZSBJbnRlbnQgYShpbnQgcGFyYW1JbnQsIGMgcGFyYW1jLCBJbnRlbnQgcGFyYW1JbnRlbnQsIEFjdGl2aXR5SW5mbyBwYXJhbUFjdGl2aXR5SW5mbykKKyAgeworICAgIEludGVudCBsb2NhbEludGVudDEgPSBuZXcgSW50ZW50KHBhcmFtSW50ZW50KTsKKyAgICBqIGxvY2FsaiA9IHRoaXMuZC5zdGFydFByb2Nlc3NJZk5lZWRMb2NrZWQocGFyYW1BY3Rpdml0eUluZm8ucHJvY2Vzc05hbWUsIHBhcmFtSW50LCBwYXJhbUFjdGl2aXR5SW5mby5wYWNrYWdlTmFtZSk7CisgICAgaWYgKGxvY2FsaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgSW50ZW50IGxvY2FsSW50ZW50MiA9IG5ldyBJbnRlbnQoKTsKKyAgICBsb2NhbEludGVudDIuc2V0Q2xhc3NOYW1lKEFwcEludGVyZmFjZS5lKCkuaygpLCBhKGxvY2Fsai5pLCBwYXJhbUFjdGl2aXR5SW5mbykpOworICAgIENvbXBvbmVudE5hbWUgbG9jYWxDb21wb25lbnROYW1lMSA9IGxvY2FsSW50ZW50MS5nZXRDb21wb25lbnQoKTsKKyAgICBpZiAobG9jYWxDb21wb25lbnROYW1lMSA9PSBudWxsKQorICAgICAgbG9jYWxDb21wb25lbnROYW1lMSA9IGsuYShwYXJhbUFjdGl2aXR5SW5mbyk7CisgICAgbG9jYWxJbnRlbnQyLnNldFR5cGUobG9jYWxDb21wb25lbnROYW1lMS5mbGF0dGVuVG9TdHJpbmcoKSk7CisgICAgaWYgKCgoMHg4MCAmIHBhcmFtQWN0aXZpdHlJbmZvLmZsYWdzKSAhPSAwKSB8fCAoYihsb2NhbEludGVudDEsIDEwNzM3NDE4MjQpKSkKKyAgICAgIGxvY2FsSW50ZW50Mi5hZGRGbGFncygxMDczNzQxODI0KTsKKyAgICBpZiAocGFyYW1jICE9IG51bGwpOworICAgIGZvciAoQ29tcG9uZW50TmFtZSBsb2NhbENvbXBvbmVudE5hbWUyID0gcGFyYW1jLmI7IDsgbG9jYWxDb21wb25lbnROYW1lMiA9IG51bGwpCisgICAgeworICAgICAgaSBsb2NhbGkgPSBuZXcgaShsb2NhbEludGVudDEsIHBhcmFtQWN0aXZpdHlJbmZvLCBsb2NhbENvbXBvbmVudE5hbWUyLCBwYXJhbUludCk7CisgICAgICBsb2NhbEludGVudDIucHV0RXh0cmEoIl9QTV98X2ludGVudF8iLCBsb2NhbGkuYSk7CisgICAgICBsb2NhbEludGVudDIucHV0RXh0cmEoIl9QTV98X2luZm9fIiwgbG9jYWxpLmIpOworICAgICAgbG9jYWxJbnRlbnQyLnB1dEV4dHJhKCJfUE1ffF9jYWxsZXJfIiwgbG9jYWxpLmMpOworICAgICAgbG9jYWxJbnRlbnQyLnB1dEV4dHJhKCJfUE1ffF91c2VyX2lkXyIsIGxvY2FsaS5kKTsKKyAgICAgIHJldHVybiBsb2NhbEludGVudDI7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYyBhKHAgcGFyYW1wKQorICB7CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtcC5lKQorICAgICAgeworICAgICAgICBpID0gLTEgKyBwYXJhbXAuZS5zaXplKCk7CisgICAgICAgIGlmIChpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBjIGxvY2FsYyA9IChjKXBhcmFtcC5lLmdldChpKTsKKyAgICAgICAgICBpZiAoIWxvY2FsYy5pKQorICAgICAgICAgICAgcmV0dXJuIGxvY2FsYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaS0tOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgcCBhKGludCBwYXJhbUludCwgSW50ZW50IHBhcmFtSW50ZW50KQorICB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmEuc2l6ZSgpOyBpKyspCisgICAgeworICAgICAgcCBsb2NhbHAgPSAocCl0aGlzLmEudmFsdWVBdChpKTsKKyAgICAgIGlmICgocGFyYW1JbnQgPT0gbG9jYWxwLmIpICYmIChsb2NhbHAuZCAhPSBudWxsKSAmJiAocGFyYW1JbnRlbnQuZ2V0Q29tcG9uZW50KCkuZXF1YWxzKGxvY2FscC5kLmdldENvbXBvbmVudCgpKSkpCisgICAgICAgIHJldHVybiBsb2NhbHA7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgLy8gRVJST1IgLy8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGEoaW50IHBhcmFtSW50LCBBY3Rpdml0eUluZm8gcGFyYW1BY3Rpdml0eUluZm8pCisgIHsKKyAgICAvLyBCeXRlIGNvZGU6CisgICAgLy8gICAwOiBnZXRzdGF0aWMgMjE0CXRib3gvY29tL2FuZHJvaWQvaW50ZXJuYWwvUl9IaWRlJHN0eWxlYWJsZTpXaW5kb3cJTHRib3gvUmVmU3RhdGljT2JqZWN0OworICAgIC8vICAgMzogaW52b2tldmlydHVhbCAyMTkJdGJveC9SZWZTdGF0aWNPYmplY3Q6Z2V0CSgpTGphdmEvbGFuZy9PYmplY3Q7CisgICAgLy8gICA2OiBjaGVja2Nhc3QgMjIxCVtJCisgICAgLy8gICA5OiBhc3RvcmUgOQorICAgIC8vICAgMTE6IGdldHN0YXRpYyAyMjUJdGJveC9jb20vYW5kcm9pZC9pbnRlcm5hbC9SX0hpZGUkc3R5bGVhYmxlOldpbmRvd193aW5kb3dJc1RyYW5zbHVjZW50CUx0Ym94L1JlZlN0YXRpY0ludDsKKyAgICAvLyAgIDE0OiBpbnZva2V2aXJ0dWFsIDIyOQl0Ym94L1JlZlN0YXRpY0ludDpnZXQJKClJCisgICAgLy8gICAxNzogaXN0b3JlIDEwCisgICAgLy8gICAxOTogZ2V0c3RhdGljIDIzMgl0Ym94L2NvbS9hbmRyb2lkL2ludGVybmFsL1JfSGlkZSRzdHlsZWFibGU6V2luZG93X3dpbmRvd0lzRmxvYXRpbmcJTHRib3gvUmVmU3RhdGljSW50OworICAgIC8vICAgMjI6IGludm9rZXZpcnR1YWwgMjI5CXRib3gvUmVmU3RhdGljSW50OmdldAkoKUkKKyAgICAvLyAgIDI1OiBpc3RvcmUgMTEKKyAgICAvLyAgIDI3OiBnZXRzdGF0aWMgMjM1CXRib3gvY29tL2FuZHJvaWQvaW50ZXJuYWwvUl9IaWRlJHN0eWxlYWJsZTpXaW5kb3dfd2luZG93U2hvd1dhbGxwYXBlcglMdGJveC9SZWZTdGF0aWNJbnQ7CisgICAgLy8gICAzMDogaW52b2tldmlydHVhbCAyMjkJdGJveC9SZWZTdGF0aWNJbnQ6Z2V0CSgpSQorICAgIC8vICAgMzM6IGlzdG9yZSAxMgorICAgIC8vICAgMzU6IGludm9rZXN0YXRpYyAyNDAJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vaDphCSgpTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2g7CisgICAgLy8gICAzODogYWxvYWRfMQorICAgIC8vICAgMzk6IGdldGZpZWxkIDg4CWFuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm86cGFja2FnZU5hbWUJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICA0MjogYWxvYWRfMQorICAgIC8vICAgNDM6IGdldGZpZWxkIDI0MwlhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOnRoZW1lCUkKKyAgICAvLyAgIDQ2OiBhbG9hZCA5CisgICAgLy8gICA0ODogaW52b2tldmlydHVhbCAyNDYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vaDphCShMamF2YS9sYW5nL1N0cmluZztJW0kpTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2gkYTsKKyAgICAvLyAgIDUxOiBhc3RvcmUgMTMKKyAgICAvLyAgIDUzOiBhbG9hZCAxMworICAgIC8vICAgNTU6IGlmbnVsbCArMTU0IC0+IDIwOQorICAgIC8vICAgNTg6IGFsb2FkIDEzCisgICAgLy8gICA2MDogZ2V0ZmllbGQgMjUxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2gkYTpiCUxhbmRyb2lkL2NvbnRlbnQvcmVzL1R5cGVkQXJyYXk7CisgICAgLy8gICA2MzogaWZudWxsICsxNDYgLT4gMjA5CisgICAgLy8gICA2NjogYWxvYWQgMTMKKyAgICAvLyAgIDY4OiBnZXRmaWVsZCAyNTEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vaCRhOmIJTGFuZHJvaWQvY29udGVudC9yZXMvVHlwZWRBcnJheTsKKyAgICAvLyAgIDcxOiBpbG9hZCAxMgorICAgIC8vICAgNzM6IGljb25zdF8wCisgICAgLy8gICA3NDogaW52b2tldmlydHVhbCAyNTcJYW5kcm9pZC9jb250ZW50L3Jlcy9UeXBlZEFycmF5OmdldEJvb2xlYW4JKElaKVoKKyAgICAvLyAgIDc3OiBpc3RvcmUgMTQKKyAgICAvLyAgIDc5OiBpbG9hZCAxNAorICAgIC8vICAgODE6IGlzdG9yZSA1CisgICAgLy8gICA4MzogYWxvYWQgMTMKKyAgICAvLyAgIDg1OiBnZXRmaWVsZCAyNTEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vaCRhOmIJTGFuZHJvaWQvY29udGVudC9yZXMvVHlwZWRBcnJheTsKKyAgICAvLyAgIDg4OiBpbG9hZCAxMAorICAgIC8vICAgOTA6IGljb25zdF8wCisgICAgLy8gICA5MTogaW52b2tldmlydHVhbCAyNTcJYW5kcm9pZC9jb250ZW50L3Jlcy9UeXBlZEFycmF5OmdldEJvb2xlYW4JKElaKVoKKyAgICAvLyAgIDk0OiBpc3RvcmUgMTcKKyAgICAvLyAgIDk2OiBpbG9hZCAxNworICAgIC8vICAgOTg6IGlzdG9yZSA2CisgICAgLy8gICAxMDA6IGFsb2FkIDEzCisgICAgLy8gICAxMDI6IGdldGZpZWxkIDI1MQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9oJGE6YglMYW5kcm9pZC9jb250ZW50L3Jlcy9UeXBlZEFycmF5OworICAgIC8vICAgMTA1OiBpbG9hZCAxMQorICAgIC8vICAgMTA3OiBpY29uc3RfMAorICAgIC8vICAgMTA4OiBpbnZva2V2aXJ0dWFsIDI1NwlhbmRyb2lkL2NvbnRlbnQvcmVzL1R5cGVkQXJyYXk6Z2V0Qm9vbGVhbgkoSVopWgorICAgIC8vICAgMTExOiBpc3RvcmUgMTkKKyAgICAvLyAgIDExMzogaWxvYWQgMTkKKyAgICAvLyAgIDExNTogaXN0b3JlIDcKKyAgICAvLyAgIDExNzogaWxvYWQgNworICAgIC8vICAgMTE5OiBpZm5lICsxNiAtPiAxMzUKKyAgICAvLyAgIDEyMjogaWxvYWQgNgorICAgIC8vICAgMTI0OiBpZm5lICsxMSAtPiAxMzUKKyAgICAvLyAgIDEyNzogaWNvbnN0XzAKKyAgICAvLyAgIDEyODogaXN0b3JlIDgKKyAgICAvLyAgIDEzMDogaWxvYWQgNQorICAgIC8vICAgMTMyOiBpZmVxICs2IC0+IDEzOAorICAgIC8vICAgMTM1OiBpY29uc3RfMQorICAgIC8vICAgMTM2OiBpc3RvcmUgOAorICAgIC8vICAgMTM4OiBpbG9hZCA4CisgICAgLy8gICAxNDA6IGlmZXEgKzMxIC0+IDE3MQorICAgIC8vICAgMTQzOiBpbG9hZF8wCisgICAgLy8gICAxNDQ6IGludm9rZXN0YXRpYyAyNjIJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvc3R1Yi9hOmIJKEkpTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxNDc6IGFyZXR1cm4KKyAgICAvLyAgIDE0ODogYXN0b3JlXzIKKyAgICAvLyAgIDE0OTogaWNvbnN0XzAKKyAgICAvLyAgIDE1MDogaXN0b3JlXzMKKyAgICAvLyAgIDE1MTogaWNvbnN0XzAKKyAgICAvLyAgIDE1MjogaXN0b3JlIDQKKyAgICAvLyAgIDE1NDogYWxvYWRfMgorICAgIC8vICAgMTU1OiBpbnZva2V2aXJ0dWFsIDI2NQlqYXZhL2xhbmcvVGhyb3dhYmxlOnByaW50U3RhY2tUcmFjZQkoKVYKKyAgICAvLyAgIDE1ODogaWxvYWRfMworICAgIC8vICAgMTU5OiBpc3RvcmUgNQorICAgIC8vICAgMTYxOiBpbG9hZCA0CisgICAgLy8gICAxNjM6IGlzdG9yZSA2CisgICAgLy8gICAxNjU6IGljb25zdF8wCisgICAgLy8gICAxNjY6IGlzdG9yZSA3CisgICAgLy8gICAxNjg6IGdvdG8gLTUxIC0+IDExNworICAgIC8vICAgMTcxOiBpbG9hZF8wCisgICAgLy8gICAxNzI6IGludm9rZXN0YXRpYyAyNjcJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvc3R1Yi9hOmEJKEkpTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxNzU6IGFyZXR1cm4KKyAgICAvLyAgIDE3NjogYXN0b3JlIDE1CisgICAgLy8gICAxNzg6IGlsb2FkIDUKKyAgICAvLyAgIDE4MDogaXN0b3JlIDE2CisgICAgLy8gICAxODI6IGFsb2FkIDE1CisgICAgLy8gICAxODQ6IGFzdG9yZV8yCisgICAgLy8gICAxODU6IGlsb2FkIDE2CisgICAgLy8gICAxODc6IGlzdG9yZV8zCisgICAgLy8gICAxODg6IGljb25zdF8wCisgICAgLy8gICAxODk6IGlzdG9yZSA0CisgICAgLy8gICAxOTE6IGdvdG8gLTM3IC0+IDE1NAorICAgIC8vICAgMTk0OiBhc3RvcmUgMTgKKyAgICAvLyAgIDE5NjogaWxvYWQgNgorICAgIC8vICAgMTk4OiBpc3RvcmUgNAorICAgIC8vICAgMjAwOiBpbG9hZCA1CisgICAgLy8gICAyMDI6IGlzdG9yZV8zCisgICAgLy8gICAyMDM6IGFsb2FkIDE4CisgICAgLy8gICAyMDU6IGFzdG9yZV8yCisgICAgLy8gICAyMDY6IGdvdG8gLTUyIC0+IDE1NAorICAgIC8vICAgMjA5OiBpY29uc3RfMAorICAgIC8vICAgMjEwOiBpc3RvcmUgNQorICAgIC8vICAgMjEyOiBpY29uc3RfMAorICAgIC8vICAgMjEzOiBpc3RvcmUgNgorICAgIC8vICAgMjE1OiBpY29uc3RfMAorICAgIC8vICAgMjE2OiBpc3RvcmUgNworICAgIC8vICAgMjE4OiBnb3RvIC0xMDEgLT4gMTE3CisgICAgLy8KKyAgICAvLyBFeGNlcHRpb24gdGFibGU6CisgICAgLy8gICBmcm9tCXRvCXRhcmdldAl0eXBlCisgICAgLy8gICAwCTUzCTE0OAlqYXZhL2xhbmcvVGhyb3dhYmxlCisgICAgLy8gICA1OAk3OQkxNDgJamF2YS9sYW5nL1Rocm93YWJsZQorICAgIC8vICAgODMJOTYJMTc2CWphdmEvbGFuZy9UaHJvd2FibGUKKyAgICAvLyAgIDEwMAkxMTMJMTk0CWphdmEvbGFuZy9UaHJvd2FibGUKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhKCkKKyAgeworICAgIEFycmF5TGlzdCBsb2NhbEFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QodGhpcy5jLmdldFJlY2VudFRhc2tzKDIxNDc0ODM2NDcsIDMpKTsKKyAgICBpbnQgaSA9IHRoaXMuYS5zaXplKCk7CisgICAgaW50IGogPSBpIC0gMTsKKyAgICBwIGxvY2FscDsKKyAgICBpbnQgazsKKyAgICBpZiAoaSA+IDApCisgICAgeworICAgICAgbG9jYWxwID0gKHApdGhpcy5hLnZhbHVlQXQoaik7CisgICAgICBMaXN0SXRlcmF0b3IgbG9jYWxMaXN0SXRlcmF0b3IgPSBsb2NhbEFycmF5TGlzdC5saXN0SXRlcmF0b3IoKTsKKyAgICAgIHdoaWxlIChsb2NhbExpc3RJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgIGlmICgoKEFjdGl2aXR5TWFuYWdlci5SZWNlbnRUYXNrSW5mbylsb2NhbExpc3RJdGVyYXRvci5uZXh0KCkpLmlkID09IGxvY2FscC5hKQorICAgICAgICB7CisgICAgICAgICAgayA9IDE7CisgICAgICAgICAgbG9jYWxMaXN0SXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgaWYgKGsgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy5hLnJlbW92ZUF0KGopOworICAgICAgICBiKGxvY2FscCk7CisgICAgICB9CisgICAgICBpID0gajsKKyAgICAgIGJyZWFrOworICAgICAgcmV0dXJuOworICAgICAgayA9IDA7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhKEludGVudCBwYXJhbUludGVudCwgaW50IHBhcmFtSW50KQorICB7CisgICAgcGFyYW1JbnRlbnQuc2V0RmxhZ3MocGFyYW1JbnRlbnQuZ2V0RmxhZ3MoKSAmIChwYXJhbUludCBeIDB4RkZGRkZGRkYpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYShwIHBhcmFtcCwgQ2xlYXJUYXJnZXQgcGFyYW1DbGVhclRhcmdldCwgQ29tcG9uZW50TmFtZSBwYXJhbUNvbXBvbmVudE5hbWUpCisgIHsKKyAgICBib29sZWFuIGJvb2wxID0gZmFsc2U7CisgICAgYm9vbGVhbiBib29sMzsKKyAgICBzd2l0Y2ggKGUuYVtwYXJhbUNsZWFyVGFyZ2V0Lm9yZGluYWwoKV0pCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSAxOgorICAgICAgc3luY2hyb25pemVkIChwYXJhbXAuZSkKKyAgICAgIHsKKyAgICAgICAgSXRlcmF0b3IgbG9jYWxJdGVyYXRvcjIgPSBwYXJhbXAuZS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobG9jYWxJdGVyYXRvcjIuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgKChjKWxvY2FsSXRlcmF0b3IyLm5leHQoKSkuaSA9IHRydWU7CisgICAgICAgICAgYm9vbDEgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBib29sMTsKKyAgICAgIH0KKyAgICBjYXNlIDI6CisgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtcC5lKQorICAgICAgeworICAgICAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yMSA9IHBhcmFtcC5lLml0ZXJhdG9yKCk7CisgICAgICAgIGlmIChsb2NhbEl0ZXJhdG9yMS5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICBjIGxvY2FsYyA9IChjKWxvY2FsSXRlcmF0b3IxLm5leHQoKTsKKyAgICAgICAgICBpZiAobG9jYWxjLmIuZXF1YWxzKHBhcmFtQ29tcG9uZW50TmFtZSkpCisgICAgICAgICAgeworICAgICAgICAgICAgbG9jYWxjLmkgPSB0cnVlOworICAgICAgICAgICAgYm9vbDMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWsgbGFiZWwzMDc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBib29sMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIGNhc2UgMzoKKyAgICB9CisgICAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgajsKKyAgICAgIGJvb2xlYW4gYm9vbDI7CisgICAgICBpbnQgazsKKyAgICAgIHN5bmNocm9uaXplZCAocGFyYW1wLmUpCisgICAgICB7CisgICAgICAgIGkgPSBwYXJhbXAuZS5zaXplKCk7CisgICAgICAgIGogPSBpIC0gMTsKKyAgICAgICAgYm9vbDIgPSBmYWxzZTsKKyAgICAgICAgaWYgKGkgPD0gMCkKKyAgICAgICAgICBicmVhayBsYWJlbDMxMzsKKyAgICAgICAgaWYgKCEoKGMpcGFyYW1wLmUuZ2V0KGopKS5iLmVxdWFscyhwYXJhbUNvbXBvbmVudE5hbWUpKQorICAgICAgICAgIGJyZWFrIGxhYmVsMzI1OworICAgICAgICBib29sMiA9IHRydWU7CisgICAgICAgIGJyZWFrIGxhYmVsMzEzOworICAgICAgICBpbnQgbSA9IGsgKyAxOworICAgICAgICBpZiAoayA8IC0xICsgcGFyYW1wLmUuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgKChjKXBhcmFtcC5lLmdldChtKSkuaSA9IHRydWU7CisgICAgICAgICAgayA9IG07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvb2wyOworICAgICAgfQorICAgICAgYm9vbDMgPSBib29sMTsKKyAgICAgIGxhYmVsMzA3OiBib29sMSA9IGJvb2wzOworICAgICAgYnJlYWs7CisgICAgICBsYWJlbDMxMzogaWYgKGJvb2wyKQorICAgICAgeworICAgICAgICBrID0gajsKKyAgICAgICAgY29udGludWU7CisgICAgICAgIGxhYmVsMzI1OiBpID0gajsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHAgYihpbnQgcGFyYW1JbnQsIFN0cmluZyBwYXJhbVN0cmluZykKKyAgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hLnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgIHAgbG9jYWxwID0gKHApdGhpcy5hLnZhbHVlQXQoaSk7CisgICAgICBpZiAoKHBhcmFtSW50ID09IGxvY2FscC5iKSAmJiAocGFyYW1TdHJpbmcuZXF1YWxzKGxvY2FscC5jKSkpCisgICAgICAgIHJldHVybiBsb2NhbHA7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGIoKQorICB7CisgICAgaW50IGo7CisgICAgZm9yIChpbnQgaSA9IHRoaXMuYS5zaXplKCk7IDsgaSA9IGopCisgICAgeworICAgICAgaiA9IGkgLSAxOworICAgICAgaWYgKGkgPD0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yID0gKChwKXRoaXMuYS52YWx1ZUF0KGopKS5lLml0ZXJhdG9yKCk7CisgICAgICB3aGlsZSAobG9jYWxJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICB7CisgICAgICAgIGMgbG9jYWxjID0gKGMpbG9jYWxJdGVyYXRvci5uZXh0KCk7CisgICAgICAgIGlmIChsb2NhbGMuaSkKKyAgICAgICAgICBnLmEoKS5wb3N0KG5ldyBkKHRoaXMsIGxvY2FsYykpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBiKHAgcGFyYW1wKQorICB7CisgICAgSXRlcmF0b3IgbG9jYWxJdGVyYXRvcjEgPSB0aGlzLmgua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAobG9jYWxJdGVyYXRvcjEuaGFzTmV4dCgpKQorICAgIHsKKyAgICAgIEludGVnZXIgbG9jYWxJbnRlZ2VyMiA9IChJbnRlZ2VyKWxvY2FsSXRlcmF0b3IxLm5leHQoKTsKKyAgICAgIExpc3QgbG9jYWxMaXN0MiA9IChMaXN0KXRoaXMuaC5nZXQobG9jYWxJbnRlZ2VyMik7CisgICAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yNCA9IHBhcmFtcC5lLml0ZXJhdG9yKCk7CisgICAgICB3aGlsZSAobG9jYWxJdGVyYXRvcjQuaGFzTmV4dCgpKQorICAgICAgeworICAgICAgICBjIGxvY2FsYzIgPSAoYylsb2NhbEl0ZXJhdG9yNC5uZXh0KCk7CisgICAgICAgIGlmIChsb2NhbExpc3QyLmNvbnRhaW5zKGxvY2FsYzIpKQorICAgICAgICB7CisgICAgICAgICAgdi5hKGIsICJvcHRpbWl6ZUFjdGl2aXRpZXMgc3RhcnRlZCwgYWN0aXZpdHk6ICVzIiwgbmV3IE9iamVjdFtdIHsgbG9jYWxjMiB9KTsKKyAgICAgICAgICBsb2NhbExpc3QyLnJlbW92ZShsb2NhbGMyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yMiA9IHRoaXMuZy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIHdoaWxlIChsb2NhbEl0ZXJhdG9yMi5oYXNOZXh0KCkpCisgICAgeworICAgICAgSW50ZWdlciBsb2NhbEludGVnZXIxID0gKEludGVnZXIpbG9jYWxJdGVyYXRvcjIubmV4dCgpOworICAgICAgTGlzdCBsb2NhbExpc3QxID0gKExpc3QpdGhpcy5nLmdldChsb2NhbEludGVnZXIxKTsKKyAgICAgIEl0ZXJhdG9yIGxvY2FsSXRlcmF0b3IzID0gcGFyYW1wLmUuaXRlcmF0b3IoKTsKKyAgICAgIHdoaWxlIChsb2NhbEl0ZXJhdG9yMy5oYXNOZXh0KCkpCisgICAgICB7CisgICAgICAgIGMgbG9jYWxjMSA9IChjKWxvY2FsSXRlcmF0b3IzLm5leHQoKTsKKyAgICAgICAgaWYgKGxvY2FsTGlzdDEuY29udGFpbnMobG9jYWxjMSkpCisgICAgICAgIHsKKyAgICAgICAgICB2LmEoYiwgIm9wdGltaXplQWN0aXZpdGllcyByZXN1bWVkLCBhY3Rpdml0eTogJXMiLCBuZXcgT2JqZWN0W10geyBsb2NhbGMxIH0pOworICAgICAgICAgIGxvY2FsTGlzdDEucmVtb3ZlKGxvY2FsYzEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBiKEludGVudCBwYXJhbUludGVudCwgaW50IHBhcmFtSW50KQorICB7CisgICAgcmV0dXJuIChwYXJhbUludCAmIHBhcmFtSW50ZW50LmdldEZsYWdzKCkpICE9IDA7CisgIH0KKworICBwcml2YXRlIExpc3Q8Yz4gZShpbnQgcGFyYW1JbnQpCisgIHsKKyAgICBPYmplY3QgbG9jYWxPYmplY3QgPSAoTGlzdCl0aGlzLmcuZ2V0KEludGVnZXIudmFsdWVPZihwYXJhbUludCkpOworICAgIGlmIChsb2NhbE9iamVjdCA9PSBudWxsKQorICAgIHsKKyAgICAgIGxvY2FsT2JqZWN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgdGhpcy5nLnB1dChJbnRlZ2VyLnZhbHVlT2YocGFyYW1JbnQpLCBsb2NhbE9iamVjdCk7CisgICAgfQorICAgIHJldHVybiBsb2NhbE9iamVjdDsKKyAgfQorCisgIHByaXZhdGUgZiBmKGludCBwYXJhbUludCkKKyAgeworICAgIGYgbG9jYWxmID0gKGYpdGhpcy5mLmdldChJbnRlZ2VyLnZhbHVlT2YocGFyYW1JbnQpKTsKKyAgICBpZiAobG9jYWxmID09IG51bGwpCisgICAgeworICAgICAgbG9jYWxmID0gbmV3IGYoKTsKKyAgICAgIHRoaXMuZi5wdXQoSW50ZWdlci52YWx1ZU9mKHBhcmFtSW50KSwgbG9jYWxmKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY2FsZjsKKyAgfQorCisgIC8vIEVSUk9SIC8vCisgIGZpbmFsIGludCBhKGludCBwYXJhbUludDEsIEludGVudCBwYXJhbUludGVudCwgQWN0aXZpdHlJbmZvIHBhcmFtQWN0aXZpdHlJbmZvLCBJQmluZGVyIHBhcmFtSUJpbmRlciwgYW5kcm9pZC5vcy5CdW5kbGUgcGFyYW1CdW5kbGUsIFN0cmluZyBwYXJhbVN0cmluZywgaW50IHBhcmFtSW50MikKKyAgeworICAgIC8vIEJ5dGUgY29kZToKKyAgICAvLyAgIDA6IGdldHN0YXRpYyAzMQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAzOiBhc3RvcmUgOAorICAgIC8vICAgNTogaWNvbnN0XzIKKyAgICAvLyAgIDY6IGFuZXdhcnJheSA0CWphdmEvbGFuZy9PYmplY3QKKyAgICAvLyAgIDk6IGFzdG9yZSA5CisgICAgLy8gICAxMTogYWxvYWQgOQorICAgIC8vICAgMTM6IGljb25zdF8wCisgICAgLy8gICAxNDogYWxvYWRfMworICAgIC8vICAgMTU6IGdldGZpZWxkIDQwMglhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOm5hbWUJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxODogYWFzdG9yZQorICAgIC8vICAgMTk6IGFsb2FkIDkKKyAgICAvLyAgIDIxOiBpY29uc3RfMQorICAgIC8vICAgMjI6IGFsb2FkIDQKKyAgICAvLyAgIDI0OiBhYXN0b3JlCisgICAgLy8gICAyNTogYWxvYWQgOAorICAgIC8vICAgMjc6IGxkY193IDQwNAorICAgIC8vICAgMzA6IGFsb2FkIDkKKyAgICAvLyAgIDMyOiBpbnZva2VzdGF0aWMgMzc2CWNvbS90cmlndGVjaC9wcml2YXRlbWUvaGVscGVyL3V0aWxzL3Y6YQkoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvT2JqZWN0OylWCisgICAgLy8gICAzNTogYWxvYWRfMAorICAgIC8vICAgMzY6IGludm9rZXNwZWNpYWwgNDA2CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YQkoKVYKKyAgICAvLyAgIDM5OiBhbG9hZF8wCisgICAgLy8gICA0MDogaWxvYWRfMQorICAgIC8vICAgNDE6IGFsb2FkIDQKKyAgICAvLyAgIDQzOiBpbnZva2V2aXJ0dWFsIDQwOQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmEJKElMYW5kcm9pZC9vcy9JQmluZGVyOylMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzsKKyAgICAvLyAgIDQ2OiBhc3RvcmUgMTAKKyAgICAvLyAgIDQ4OiBhbG9hZCAxMAorICAgIC8vICAgNTA6IGlmbnVsbCArNTk0IC0+IDY0NAorICAgIC8vICAgNTM6IGFsb2FkIDEwCisgICAgLy8gICA1NTogZ2V0ZmllbGQgNDEyCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2M6YQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vcDsKKyAgICAvLyAgIDU4OiBhc3RvcmUgMTEKKyAgICAvLyAgIDYwOiBnZXRzdGF0aWMgMzEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazpiCUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgNjM6IGxkY193IDQxNAorICAgIC8vICAgNjY6IGljb25zdF8xCisgICAgLy8gICA2NzogYW5ld2FycmF5IDQJamF2YS9sYW5nL09iamVjdAorICAgIC8vICAgNzA6IGR1cAorICAgIC8vICAgNzE6IGljb25zdF8wCisgICAgLy8gICA3MjogYWxvYWQgMTEKKyAgICAvLyAgIDc0OiBhYXN0b3JlCisgICAgLy8gICA3NTogaW52b2tlc3RhdGljIDM3Ngljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy92OmEJKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspVgorICAgIC8vICAgNzg6IGdldHN0YXRpYyA0MjAJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpDVVJSRU5UCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJFJldXNlVGFyZ2V0OworICAgIC8vICAgODE6IGFzdG9yZSAxMgorICAgIC8vICAgODM6IGdldHN0YXRpYyA0MjQJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDpOT1RISU5HCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OworICAgIC8vICAgODY6IGFzdG9yZSAxMworICAgIC8vICAgODg6IGFsb2FkXzIKKyAgICAvLyAgIDg5OiBsZGNfdyA0MjUKKyAgICAvLyAgIDkyOiBpbnZva2VzdGF0aWMgMTM1CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YgkoTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7SSlaCisgICAgLy8gICA5NTogaXN0b3JlIDE0CisgICAgLy8gICA5NzogYWxvYWRfMgorICAgIC8vICAgOTg6IGludm9rZXZpcnR1YWwgMTE0CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0Q29tcG9uZW50CSgpTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOworICAgIC8vICAgMTAxOiBpZm5vbm51bGwgKzM2IC0+IDEzNworICAgIC8vICAgMTA0OiBnZXRzdGF0aWMgMzEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazpiCUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgMTA3OiBsZGNfdyA0MjcKKyAgICAvLyAgIDExMDogaWNvbnN0XzAKKyAgICAvLyAgIDExMTogYW5ld2FycmF5IDQJamF2YS9sYW5nL09iamVjdAorICAgIC8vICAgMTE0OiBpbnZva2VzdGF0aWMgMzc2CWNvbS90cmlndGVjaC9wcml2YXRlbWUvaGVscGVyL3V0aWxzL3Y6YQkoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvT2JqZWN0OylWCisgICAgLy8gICAxMTc6IGFsb2FkXzIKKyAgICAvLyAgIDExODogbmV3IDEyMQlhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZQorICAgIC8vICAgMTIxOiBkdXAKKyAgICAvLyAgIDEyMjogYWxvYWRfMworICAgIC8vICAgMTIzOiBnZXRmaWVsZCA4OAlhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOnBhY2thZ2VOYW1lCUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgMTI2OiBhbG9hZF8zCisgICAgLy8gICAxMjc6IGdldGZpZWxkIDQwMglhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOm5hbWUJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxMzA6IGludm9rZXNwZWNpYWwgNDMwCWFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOjxpbml0PgkoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKKyAgICAvLyAgIDEzMzogaW52b2tldmlydHVhbCA0MzQJYW5kcm9pZC9jb250ZW50L0ludGVudDpzZXRDb21wb25lbnQJKExhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTspTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7CisgICAgLy8gICAxMzY6IHBvcAorICAgIC8vICAgMTM3OiBhbG9hZCAxMAorICAgIC8vICAgMTM5OiBpZm51bGwgKzMzIC0+IDE3MgorICAgIC8vICAgMTQyOiBhbG9hZCAxMAorICAgIC8vICAgMTQ0OiBnZXRmaWVsZCA0MzYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzpnCUkKKyAgICAvLyAgIDE0NzogaWNvbnN0XzMKKyAgICAvLyAgIDE0ODogaWZfaWNtcG5lICsyNCAtPiAxNzIKKyAgICAvLyAgIDE1MTogZ2V0c3RhdGljIDMxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YglMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDE1NDogbGRjX3cgNDM4CisgICAgLy8gICAxNTc6IGljb25zdF8wCisgICAgLy8gICAxNTg6IGFuZXdhcnJheSA0CWphdmEvbGFuZy9PYmplY3QKKyAgICAvLyAgIDE2MTogaW52b2tlc3RhdGljIDM3Ngljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy92OmEJKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspVgorICAgIC8vICAgMTY0OiBhbG9hZF8yCisgICAgLy8gICAxNjU6IGxkY193IDQzOQorICAgIC8vICAgMTY4OiBpbnZva2V2aXJ0dWFsIDEzOQlhbmRyb2lkL2NvbnRlbnQvSW50ZW50OmFkZEZsYWdzCShJKUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50OworICAgIC8vICAgMTcxOiBwb3AKKyAgICAvLyAgIDE3MjogaWxvYWQgMTQKKyAgICAvLyAgIDE3NDogaWZlcSArMjggLT4gMjAyCisgICAgLy8gICAxNzc6IGdldHN0YXRpYyAzMQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxODA6IGxkY193IDQ0MQorICAgIC8vICAgMTgzOiBpY29uc3RfMAorICAgIC8vICAgMTg0OiBhbmV3YXJyYXkgNAlqYXZhL2xhbmcvT2JqZWN0CisgICAgLy8gICAxODc6IGludm9rZXN0YXRpYyAzNzYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvdXRpbHMvdjphCShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYKKyAgICAvLyAgIDE5MDogYWxvYWRfMgorICAgIC8vICAgMTkxOiBsZGNfdyA0NDIKKyAgICAvLyAgIDE5NDogaW52b2tlc3RhdGljIDQ0NAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmEJKExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpVgorICAgIC8vICAgMTk3OiBnZXRzdGF0aWMgNDQ3CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skQ2xlYXJUYXJnZXQ6VE9QCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OworICAgIC8vICAgMjAwOiBhc3RvcmUgMTMKKyAgICAvLyAgIDIwMjogYWxvYWRfMgorICAgIC8vICAgMjAzOiBsZGNfdyA0NDgKKyAgICAvLyAgIDIwNjogaW52b2tlc3RhdGljIDEzNQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJKExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpWgorICAgIC8vICAgMjA5OiBpZmVxICszMSAtPiAyNDAKKyAgICAvLyAgIDIxMjogYWxvYWRfMgorICAgIC8vICAgMjEzOiBsZGNfdyA0MzkKKyAgICAvLyAgIDIxNjogaW52b2tlc3RhdGljIDEzNQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJKExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpWgorICAgIC8vICAgMjE5OiBpZmVxICs0MzEgLT4gNjUwCisgICAgLy8gICAyMjI6IGdldHN0YXRpYyA0NTEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDpUQVNLCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OworICAgIC8vICAgMjI1OiBhc3RvcmUgMTMKKyAgICAvLyAgIDIyNzogZ2V0c3RhdGljIDMxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YglMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDIzMDogbGRjX3cgNDUzCisgICAgLy8gICAyMzM6IGljb25zdF8wCisgICAgLy8gICAyMzQ6IGFuZXdhcnJheSA0CWphdmEvbGFuZy9PYmplY3QKKyAgICAvLyAgIDIzNzogaW52b2tlc3RhdGljIDM3Ngljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy92OmEJKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspVgorICAgIC8vICAgMjQwOiBnZXRzdGF0aWMgNDU4CWFuZHJvaWQvb3MvQnVpbGQkVkVSU0lPTjpTREtfSU5UCUkKKyAgICAvLyAgIDI0MzogYmlwdXNoIDIxCisgICAgLy8gICAyNDU6IGlmX2ljbXBsdCArMzEgLT4gMjc2CisgICAgLy8gICAyNDg6IGFsb2FkXzMKKyAgICAvLyAgIDI0OTogZ2V0ZmllbGQgNDYxCWFuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm86ZG9jdW1lbnRMYXVuY2hNb2RlCUkKKyAgICAvLyAgIDI1MjogdGFibGVzd2l0Y2gJZGVmYXVsdDorMjQgLT4gMjc2LCAxOis0MjEtPjY3MywgMjorNDM0LT42ODYKKyAgICAvLyAgIDI3NzogZ2V0ZmllbGQgNDY0CWFuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm86bGF1bmNoTW9kZQlJCisgICAgLy8gICAyODA6IHRhYmxlc3dpdGNoCWRlZmF1bHQ6KzI4IC0+IDMwOCwgMTorNDE0LT42OTQsIDI6KzQ2Ni0+NzQ2LCAzOis1MDktPjc4OQorICAgIC8vICAgMzA5OiBsZGNfdyA0NjUKKyAgICAvLyAgIDMxMjogaW52b2tlc3RhdGljIDEzNQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJKExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0kpWgorICAgIC8vICAgMzE1OiBpZmVxICsxMjkwIC0+IDE2MDUKKyAgICAvLyAgIDMxODogYWxvYWQgMTMKKyAgICAvLyAgIDMyMDogYXN0b3JlIDE5CisgICAgLy8gICAzMjI6IGFjb25zdF9udWxsCisgICAgLy8gICAzMjM6IGFzdG9yZSAxNworICAgIC8vICAgMzI1OiBhbG9hZCAxMgorICAgIC8vICAgMzI3OiBhc3RvcmUgMTgKKyAgICAvLyAgIDMyOTogaWNvbnN0XzEKKyAgICAvLyAgIDMzMDogaXN0b3JlIDIwCisgICAgLy8gICAzMzI6IGFsb2FkIDE5CisgICAgLy8gICAzMzQ6IGdldHN0YXRpYyA0MjQJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDpOT1RISU5HCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OworICAgIC8vICAgMzM3OiBpZl9hY21wbmUgKzEyNjEgLT4gMTU5OAorICAgIC8vICAgMzQwOiBhbG9hZF8yCisgICAgLy8gICAzNDE6IGxkY193IDQ0MgorICAgIC8vICAgMzQ0OiBpbnZva2VzdGF0aWMgMTM1CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YgkoTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7SSlaCisgICAgLy8gICAzNDc6IGlmZXEgKzEyNTEgLT4gMTU5OAorICAgIC8vICAgMzUwOiBnZXRzdGF0aWMgNDY4CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skQ2xlYXJUYXJnZXQ6U1BFQ19BQ1RJVklUWQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDsKKyAgICAvLyAgIDM1MzogYXN0b3JlIDIxCisgICAgLy8gICAzNTU6IGFsb2FkIDExCisgICAgLy8gICAzNTc6IGlmbm9ubnVsbCArMTYgLT4gMzczCisgICAgLy8gICAzNjA6IGFsb2FkIDE4CisgICAgLy8gICAzNjI6IGdldHN0YXRpYyA0MjAJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpDVVJSRU5UCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJFJldXNlVGFyZ2V0OworICAgIC8vICAgMzY1OiBpZl9hY21wbmUgKzggLT4gMzczCisgICAgLy8gICAzNjg6IGdldHN0YXRpYyA0NzEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpBRkZJTklUWQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDsKKyAgICAvLyAgIDM3MTogYXN0b3JlIDE4CisgICAgLy8gICAzNzM6IGFsb2FkXzMKKyAgICAvLyAgIDM3NDogaW52b2tlc3RhdGljIDQ3NAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy9rOmEJKExhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOylMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDM3NzogYXN0b3JlIDIyCisgICAgLy8gICAzNzk6IGdldHN0YXRpYyAzMQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAzODI6IGxkY193IDQ3NgorICAgIC8vICAgMzg1OiBpY29uc3RfMgorICAgIC8vICAgMzg2OiBhbmV3YXJyYXkgNAlqYXZhL2xhbmcvT2JqZWN0CisgICAgLy8gICAzODk6IGR1cAorICAgIC8vICAgMzkwOiBpY29uc3RfMAorICAgIC8vICAgMzkxOiBhbG9hZCAyMgorICAgIC8vICAgMzkzOiBhYXN0b3JlCisgICAgLy8gICAzOTQ6IGR1cAorICAgIC8vICAgMzk1OiBpY29uc3RfMQorICAgIC8vICAgMzk2OiBhbG9hZCAxNworICAgIC8vICAgMzk4OiBhYXN0b3JlCisgICAgLy8gICAzOTk6IGludm9rZXN0YXRpYyAzNzYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvdXRpbHMvdjphCShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYKKyAgICAvLyAgIDQwMjogZ2V0c3RhdGljIDQ3OAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9lOmIJW0kKKyAgICAvLyAgIDQwNTogYWxvYWQgMTgKKyAgICAvLyAgIDQwNzogaW52b2tldmlydHVhbCA0NzkJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpvcmRpbmFsCSgpSQorICAgIC8vICAgNDEwOiBpYWxvYWQKKyAgICAvLyAgIDQxMTogaXN0b3JlIDIzCisgICAgLy8gICA0MTM6IGFjb25zdF9udWxsCisgICAgLy8gICA0MTQ6IGFzdG9yZSAyNAorICAgIC8vICAgNDE2OiBpbG9hZCAyMworICAgIC8vICAgNDE4OiB0YWJsZXN3aXRjaAlkZWZhdWx0OisyNiAtPiA0NDQsIDE6KzQwMC0+ODE4LCAyOis0MTItPjgzMCwgMzorNDIzLT44NDEKKyAgICAvLyAgIDQ0NTogYWNvbnN0X251bGwKKyAgICAvLyAgIDQ0NjogPGlsbGVnYWwgb3Bjb2RlPgorICAgIC8vICAgNDQ3OiBhbG9hZCAyMgorICAgIC8vICAgNDQ5OiBpbnZva2V2aXJ0dWFsIDMzOAlqYXZhL2xhbmcvU3RyaW5nOmVxdWFscwkoTGphdmEvbGFuZy9PYmplY3Q7KVoKKyAgICAvLyAgIDQ1MjogaWZlcSArMTkgLT4gNDcxCisgICAgLy8gICA0NTU6IGFsb2FkXzAKKyAgICAvLyAgIDQ1NjogZ2V0ZmllbGQgNDAJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazplCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy9hOworICAgIC8vICAgNDU5OiBpbG9hZF8xCisgICAgLy8gICA0NjA6IGludm9rZXN0YXRpYyAzODUJamF2YS9sYW5nL0ludGVnZXI6dmFsdWVPZgkoSSlMamF2YS9sYW5nL0ludGVnZXI7CisgICAgLy8gICA0NjM6IGludm9rZXZpcnR1YWwgMzY2CWNvbS90cmlndGVjaC9wcml2YXRlbWUvaGVscGVyL3V0aWxzL2E6Z2V0CShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CisgICAgLy8gICA0NjY6IGNoZWNrY2FzdCAxNzcJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vcAorICAgIC8vICAgNDY5OiBhc3RvcmUgMjQKKyAgICAvLyAgIDQ3MTogZ2V0c3RhdGljIDMxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YglMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDQ3NDogbGRjX3cgNDgzCisgICAgLy8gICA0Nzc6IGljb25zdF8xCisgICAgLy8gICA0Nzg6IGFuZXdhcnJheSA0CWphdmEvbGFuZy9PYmplY3QKKyAgICAvLyAgIDQ4MTogZHVwCisgICAgLy8gICA0ODI6IGljb25zdF8wCisgICAgLy8gICA0ODM6IGFsb2FkIDI0CisgICAgLy8gICA0ODU6IGFhc3RvcmUKKyAgICAvLyAgIDQ4NjogaW52b2tlc3RhdGljIDM3Ngljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy92OmEJKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspVgorICAgIC8vICAgNDg5OiBhbG9hZCAyNAorICAgIC8vICAgNDkxOiBpZm5vbm51bGwgKzM4MyAtPiA4NzQKKyAgICAvLyAgIDQ5NDogaW52b2tlc3RhdGljIDQ4OQlhbmRyb2lkL29zL1N5c3RlbUNsb2NrOmVsYXBzZWRSZWFsdGltZQkoKUoKKyAgICAvLyAgIDQ5NzogbHN0b3JlIDUzCisgICAgLy8gICA0OTk6IGFsb2FkXzAKKyAgICAvLyAgIDUwMDogaWxvYWRfMQorICAgIC8vICAgNTAxOiBhY29uc3RfbnVsbAorICAgIC8vICAgNTAyOiBhbG9hZF8yCisgICAgLy8gICA1MDM6IGFsb2FkXzMKKyAgICAvLyAgIDUwNDogaW52b2tlc3BlY2lhbCA0OTEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazphCShJTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2M7TGFuZHJvaWQvY29udGVudC9JbnRlbnQ7TGFuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm87KUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50OworICAgIC8vICAgNTA3OiBhc3RvcmUgNTUKKyAgICAvLyAgIDUwOTogYWxvYWQgNTUKKyAgICAvLyAgIDUxMTogaWZudWxsICs2OCAtPiA1NzkKKyAgICAvLyAgIDUxNDogYWxvYWQgNTUKKyAgICAvLyAgIDUxNjogbGRjX3cgNDM5CisgICAgLy8gICA1MTk6IGludm9rZXZpcnR1YWwgMTM5CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6YWRkRmxhZ3MJKEkpTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7CisgICAgLy8gICA1MjI6IHBvcAorICAgIC8vICAgNTIzOiBhbG9hZCA1NQorICAgIC8vICAgNTI1OiBsZGNfdyA0OTIKKyAgICAvLyAgIDUyODogaW52b2tldmlydHVhbCAxMzkJYW5kcm9pZC9jb250ZW50L0ludGVudDphZGRGbGFncwkoSSlMYW5kcm9pZC9jb250ZW50L0ludGVudDsKKyAgICAvLyAgIDUzMTogcG9wCisgICAgLy8gICA1MzI6IGFsb2FkIDU1CisgICAgLy8gICA1MzQ6IGxkY193IDQ5MworICAgIC8vICAgNTM3OiBpbnZva2V2aXJ0dWFsIDEzOQlhbmRyb2lkL2NvbnRlbnQvSW50ZW50OmFkZEZsYWdzCShJKUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50OworICAgIC8vICAgNTQwOiBwb3AKKyAgICAvLyAgIDU0MTogZ2V0c3RhdGljIDQ1OAlhbmRyb2lkL29zL0J1aWxkJFZFUlNJT046U0RLX0lOVAlJCisgICAgLy8gICA1NDQ6IGJpcHVzaCAyMQorICAgIC8vICAgNTQ2OiBpZl9pY21wZ2UgKzMwMiAtPiA4NDgKKyAgICAvLyAgIDU0OTogYWxvYWQgNTUKKyAgICAvLyAgIDU1MTogbGRjX3cgNDk0CisgICAgLy8gICA1NTQ6IGludm9rZXZpcnR1YWwgMTM5CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6YWRkRmxhZ3MJKEkpTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7CisgICAgLy8gICA1NTc6IHBvcAorICAgIC8vICAgNTU4OiBnZXRzdGF0aWMgNDU4CWFuZHJvaWQvb3MvQnVpbGQkVkVSU0lPTjpTREtfSU5UCUkKKyAgICAvLyAgIDU2MTogYmlwdXNoIDE2CisgICAgLy8gICA1NjM6IGlmX2ljbXBsdCArMjk3IC0+IDg2MAorICAgIC8vICAgNTY2OiBpbnZva2VzdGF0aWMgNTgJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvQXBwSW50ZXJmYWNlOmUJKClMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvQXBwSW50ZXJmYWNlOworICAgIC8vICAgNTY5OiBpbnZva2V2aXJ0dWFsIDYyCWNvbS90cmlndGVjaC9wcml2YXRlbWUvY2xpZW50L0FwcEludGVyZmFjZTppCSgpTGFuZHJvaWQvY29udGVudC9Db250ZXh0OworICAgIC8vICAgNTcyOiBhbG9hZCA1NQorICAgIC8vICAgNTc0OiBhbG9hZCA1CisgICAgLy8gICA1NzY6IGludm9rZXZpcnR1YWwgNDk4CWFuZHJvaWQvY29udGVudC9Db250ZXh0OnN0YXJ0QWN0aXZpdHkJKExhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xhbmRyb2lkL29zL0J1bmRsZTspVgorICAgIC8vICAgNTc5OiBnZXRzdGF0aWMgMzEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazpiCUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgNTgyOiBhc3RvcmUgNTYKKyAgICAvLyAgIDU4NDogaWNvbnN0XzEKKyAgICAvLyAgIDU4NTogYW5ld2FycmF5IDQJamF2YS9sYW5nL09iamVjdAorICAgIC8vICAgNTg4OiBhc3RvcmUgNTcKKyAgICAvLyAgIDU5MDogYWxvYWQgNTcKKyAgICAvLyAgIDU5MjogaWNvbnN0XzAKKyAgICAvLyAgIDU5MzogaW52b2tlc3RhdGljIDQ4OQlhbmRyb2lkL29zL1N5c3RlbUNsb2NrOmVsYXBzZWRSZWFsdGltZQkoKUoKKyAgICAvLyAgIDU5NjogbGxvYWQgNTMKKyAgICAvLyAgIDU5ODogbHN1YgorICAgIC8vICAgNTk5OiBpbnZva2VzdGF0aWMgNTAzCWphdmEvbGFuZy9Mb25nOnZhbHVlT2YJKEopTGphdmEvbGFuZy9Mb25nOworICAgIC8vICAgNjAyOiBhYXN0b3JlCisgICAgLy8gICA2MDM6IGFsb2FkIDU2CisgICAgLy8gICA2MDU6IGxkY193IDUwNQorICAgIC8vICAgNjA4OiBhbG9hZCA1NworICAgIC8vICAgNjEwOiBpbnZva2VzdGF0aWMgMzc2CWNvbS90cmlndGVjaC9wcml2YXRlbWUvaGVscGVyL3V0aWxzL3Y6YQkoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvT2JqZWN0OylWCisgICAgLy8gICA2MTM6IGdldHN0YXRpYyAzMQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICA2MTY6IGFzdG9yZSAzMQorICAgIC8vICAgNjE4OiBpY29uc3RfMQorICAgIC8vICAgNjE5OiBhbmV3YXJyYXkgNAlqYXZhL2xhbmcvT2JqZWN0CisgICAgLy8gICA2MjI6IGFzdG9yZSAzMgorICAgIC8vICAgNjI0OiBhbG9hZCAzMgorICAgIC8vICAgNjI2OiBpY29uc3RfMAorICAgIC8vICAgNjI3OiBhbG9hZF8zCisgICAgLy8gICA2Mjg6IGdldGZpZWxkIDQwMglhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOm5hbWUJTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICA2MzE6IGFhc3RvcmUKKyAgICAvLyAgIDYzMjogYWxvYWQgMzEKKyAgICAvLyAgIDYzNDogbGRjX3cgNTA3CisgICAgLy8gICA2Mzc6IGFsb2FkIDMyCisgICAgLy8gICA2Mzk6IGludm9rZXN0YXRpYyAzNzYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvdXRpbHMvdjphCShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYKKyAgICAvLyAgIDY0MjogaWNvbnN0XzAKKyAgICAvLyAgIDY0MzogaXJldHVybgorICAgIC8vICAgNjQ0OiBhY29uc3RfbnVsbAorICAgIC8vICAgNjQ1OiBhc3RvcmUgMTEKKyAgICAvLyAgIDY0NzogZ290byAtNTg3IC0+IDYwCisgICAgLy8gICA2NTA6IGFsb2FkXzIKKyAgICAvLyAgIDY1MTogbGRjX3cgNDQ4CisgICAgLy8gICA2NTQ6IGludm9rZXN0YXRpYyA0NDQJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazphCShMYW5kcm9pZC9jb250ZW50L0ludGVudDtJKVYKKyAgICAvLyAgIDY1NzogZ2V0c3RhdGljIDMxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YglMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDY2MDogbGRjX3cgNTA5CisgICAgLy8gICA2NjM6IGljb25zdF8wCisgICAgLy8gICA2NjQ6IGFuZXdhcnJheSA0CWphdmEvbGFuZy9PYmplY3QKKyAgICAvLyAgIDY2NzogaW52b2tlc3RhdGljIDM3Ngljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy92OmEJKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspVgorICAgIC8vICAgNjcwOiBnb3RvIC00MzAgLT4gMjQwCisgICAgLy8gICA2NzM6IGdldHN0YXRpYyA0NTEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDpUQVNLCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OworICAgIC8vICAgNjc2OiBhc3RvcmUgMTMKKyAgICAvLyAgIDY3ODogZ2V0c3RhdGljIDUxMgljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJFJldXNlVGFyZ2V0OkRPQ1VNRU5UCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJFJldXNlVGFyZ2V0OworICAgIC8vICAgNjgxOiBhc3RvcmUgMTIKKyAgICAvLyAgIDY4MzogZ290byAtNDA3IC0+IDI3NgorICAgIC8vICAgNjg2OiBnZXRzdGF0aWMgNTE1CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skUmV1c2VUYXJnZXQ6TVVMVElQTEUJTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skUmV1c2VUYXJnZXQ7CisgICAgLy8gICA2ODk6IGFzdG9yZSAxMgorICAgIC8vICAgNjkxOiBnb3RvIC00MTUgLT4gMjc2CisgICAgLy8gICA2OTQ6IGFsb2FkXzIKKyAgICAvLyAgIDY5NTogbGRjX3cgNDM5CisgICAgLy8gICA2OTg6IGludm9rZXN0YXRpYyAxMzUJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazpiCShMYW5kcm9pZC9jb250ZW50L0ludGVudDtJKVoKKyAgICAvLyAgIDcwMTogaWZlcSArMTggLT4gNzE5CisgICAgLy8gICA3MDQ6IGFsb2FkXzIKKyAgICAvLyAgIDcwNTogbGRjX3cgNDkyCisgICAgLy8gICA3MDg6IGludm9rZXN0YXRpYyAxMzUJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazpiCShMYW5kcm9pZC9jb250ZW50L0ludGVudDtJKVoKKyAgICAvLyAgIDcxMTogaWZlcSArMjcgLT4gNzM4CisgICAgLy8gICA3MTQ6IGdldHN0YXRpYyA1MTUJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpNVUxUSVBMRQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDsKKyAgICAvLyAgIDcxNzogYXN0b3JlIDEyCisgICAgLy8gICA3MTk6IGFsb2FkIDEzCisgICAgLy8gICA3MjE6IGFzdG9yZSAxOQorICAgIC8vICAgNzIzOiBsZGNfdyA1MTcKKyAgICAvLyAgIDcyNjogYXN0b3JlIDE3CisgICAgLy8gICA3Mjg6IGFsb2FkIDEyCisgICAgLy8gICA3MzA6IGFzdG9yZSAxOAorICAgIC8vICAgNzMyOiBpY29uc3RfMQorICAgIC8vICAgNzMzOiBpc3RvcmUgMjAKKyAgICAvLyAgIDczNTogZ290byAtNDAzIC0+IDMzMgorICAgIC8vICAgNzM4OiBnZXRzdGF0aWMgNDcxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skUmV1c2VUYXJnZXQ6QUZGSU5JVFkJTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skUmV1c2VUYXJnZXQ7CisgICAgLy8gICA3NDE6IGFzdG9yZSAxMgorICAgIC8vICAgNzQzOiBnb3RvIC0yNCAtPiA3MTkKKyAgICAvLyAgIDc0NjogZ2V0c3RhdGljIDQ0Nwljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OlRPUAlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDsKKyAgICAvLyAgIDc0OTogYXN0b3JlIDE5CisgICAgLy8gICA3NTE6IGFsb2FkXzIKKyAgICAvLyAgIDc1MjogbGRjX3cgNDkyCisgICAgLy8gICA3NTU6IGludm9rZXN0YXRpYyAxMzUJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazpiCShMYW5kcm9pZC9jb250ZW50L0ludGVudDtJKVoKKyAgICAvLyAgIDc1ODogaWZlcSArMjMgLT4gNzgxCisgICAgLy8gICA3NjE6IGdldHN0YXRpYyA1MTUJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpNVUxUSVBMRQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDsKKyAgICAvLyAgIDc2NDogYXN0b3JlIDYzCisgICAgLy8gICA3NjY6IGFsb2FkIDYzCisgICAgLy8gICA3Njg6IGFzdG9yZSAxOAorICAgIC8vICAgNzcwOiBsZGNfdyA1MTkKKyAgICAvLyAgIDc3MzogYXN0b3JlIDE3CisgICAgLy8gICA3NzU6IGljb25zdF8wCisgICAgLy8gICA3NzY6IGlzdG9yZSAyMAorICAgIC8vICAgNzc4OiBnb3RvIC00NDYgLT4gMzMyCisgICAgLy8gICA3ODE6IGdldHN0YXRpYyA0NzEJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDpBRkZJTklUWQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRSZXVzZVRhcmdldDsKKyAgICAvLyAgIDc4NDogYXN0b3JlIDYzCisgICAgLy8gICA3ODY6IGdvdG8gLTIwIC0+IDc2NgorICAgIC8vICAgNzg5OiBnZXRzdGF0aWMgNDQ3CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2skQ2xlYXJUYXJnZXQ6VE9QCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OworICAgIC8vICAgNzkyOiBhc3RvcmUgMTUKKyAgICAvLyAgIDc5NDogZ2V0c3RhdGljIDQ3MQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJFJldXNlVGFyZ2V0OkFGRklOSVRZCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJFJldXNlVGFyZ2V0OworICAgIC8vICAgNzk3OiBhc3RvcmUgMTYKKyAgICAvLyAgIDc5OTogbGRjX3cgNTIxCisgICAgLy8gICA4MDI6IGFzdG9yZSAxNworICAgIC8vICAgODA0OiBhbG9hZCAxNgorICAgIC8vICAgODA2OiBhc3RvcmUgMTgKKyAgICAvLyAgIDgwODogYWxvYWQgMTUKKyAgICAvLyAgIDgxMDogYXN0b3JlIDE5CisgICAgLy8gICA4MTI6IGljb25zdF8wCisgICAgLy8gICA4MTM6IGlzdG9yZSAyMAorICAgIC8vICAgODE1OiBnb3RvIC00ODMgLT4gMzMyCisgICAgLy8gICA4MTg6IGFsb2FkXzAKKyAgICAvLyAgIDgxOTogaWxvYWRfMQorICAgIC8vICAgODIwOiBhbG9hZCAyMgorICAgIC8vICAgODIyOiBpbnZva2VzcGVjaWFsIDUyMwljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJKElMamF2YS9sYW5nL1N0cmluZzspTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL3A7CisgICAgLy8gICA4MjU6IGFzdG9yZSAyNAorICAgIC8vICAgODI3OiBnb3RvIC0zODMgLT4gNDQ0CisgICAgLy8gICA4MzA6IGFsb2FkXzAKKyAgICAvLyAgIDgzMTogaWxvYWRfMQorICAgIC8vICAgODMyOiBhbG9hZF8yCisgICAgLy8gICA4MzM6IGludm9rZXNwZWNpYWwgNTI1CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YQkoSUxhbmRyb2lkL2NvbnRlbnQvSW50ZW50OylMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vcDsKKyAgICAvLyAgIDgzNjogYXN0b3JlIDI0CisgICAgLy8gICA4Mzg6IGdvdG8gLTM5NCAtPiA0NDQKKyAgICAvLyAgIDg0MTogYWxvYWQgMTEKKyAgICAvLyAgIDg0MzogYXN0b3JlIDI0CisgICAgLy8gICA4NDU6IGdvdG8gLTQwMSAtPiA0NDQKKyAgICAvLyAgIDg0ODogYWxvYWQgNTUKKyAgICAvLyAgIDg1MDogbGRjX3cgNDk0CisgICAgLy8gICA4NTM6IGludm9rZXZpcnR1YWwgMTM5CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6YWRkRmxhZ3MJKEkpTGFuZHJvaWQvY29udGVudC9JbnRlbnQ7CisgICAgLy8gICA4NTY6IHBvcAorICAgIC8vICAgODU3OiBnb3RvIC0yOTkgLT4gNTU4CisgICAgLy8gICA4NjA6IGludm9rZXN0YXRpYyA1OAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2NsaWVudC9BcHBJbnRlcmZhY2U6ZQkoKUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2NsaWVudC9BcHBJbnRlcmZhY2U7CisgICAgLy8gICA4NjM6IGludm9rZXZpcnR1YWwgNjIJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvQXBwSW50ZXJmYWNlOmkJKClMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7CisgICAgLy8gICA4NjY6IGFsb2FkIDU1CisgICAgLy8gICA4Njg6IGludm9rZXZpcnR1YWwgNTI3CWFuZHJvaWQvY29udGVudC9Db250ZXh0OnN0YXJ0QWN0aXZpdHkJKExhbmRyb2lkL2NvbnRlbnQvSW50ZW50OylWCisgICAgLy8gICA4NzE6IGdvdG8gLTI5MiAtPiA1NzkKKyAgICAvLyAgIDg3NDogYWxvYWRfMAorICAgIC8vICAgODc1OiBnZXRmaWVsZCA3NAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmMJTGFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlcjsKKyAgICAvLyAgIDg3ODogYWxvYWQgMjQKKyAgICAvLyAgIDg4MDogZ2V0ZmllbGQgMjk3CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL3A6YQlJCisgICAgLy8gICA4ODM6IGljb25zdF8wCisgICAgLy8gICA4ODQ6IGludm9rZXZpcnR1YWwgNTMxCWFuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlcjptb3ZlVGFza1RvRnJvbnQJKElJKVYKKyAgICAvLyAgIDg4NzogaWxvYWQgMTQKKyAgICAvLyAgIDg4OTogaWZuZSArNjU0IC0+IDE1NDMKKyAgICAvLyAgIDg5MjogYWxvYWQgMjQKKyAgICAvLyAgIDg5NDogZ2V0ZmllbGQgMjAyCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL3A6ZAlMYW5kcm9pZC9jb250ZW50L0ludGVudDsKKyAgICAvLyAgIDg5NzogYXN0b3JlIDQ5CisgICAgLy8gICA4OTk6IGFsb2FkXzIKKyAgICAvLyAgIDkwMDogaWZudWxsICs2MzcgLT4gMTUzNworICAgIC8vICAgOTAzOiBhbG9hZCA0OQorICAgIC8vICAgOTA1OiBpZm51bGwgKzYzMiAtPiAxNTM3CisgICAgLy8gICA5MDg6IGFsb2FkXzIKKyAgICAvLyAgIDkwOTogaW52b2tldmlydHVhbCA1MzQJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRBY3Rpb24JKClMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDkxMjogYWxvYWQgNDkKKyAgICAvLyAgIDkxNDogaW52b2tldmlydHVhbCA1MzQJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRBY3Rpb24JKClMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDkxNzogaW52b2tlc3RhdGljIDUzOQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci9hL2Y6YQkoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVoKKyAgICAvLyAgIDkyMDogaWZuZSArNDYwIC0+IDEzODAKKyAgICAvLyAgIDkyMzogaWNvbnN0XzAKKyAgICAvLyAgIDkyNDogaXN0b3JlIDUwCisgICAgLy8gICA5MjY6IGlsb2FkIDUwCisgICAgLy8gICA5Mjg6IGlmZXEgKzYxNSAtPiAxNTQzCisgICAgLy8gICA5MzE6IGljb25zdF8xCisgICAgLy8gICA5MzI6IGlzdG9yZSAyNQorICAgIC8vICAgOTM0OiBhbG9hZCAyNAorICAgIC8vICAgOTM2OiBhbG9hZCAxMQorICAgIC8vICAgOTM4OiBpZl9hY21wbmUgKzY1MyAtPiAxNTkxCisgICAgLy8gICA5NDE6IGFsb2FkIDI0CisgICAgLy8gICA5NDM6IGludm9rZXZpcnR1YWwgNTQxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL3A6YQkoKVoKKyAgICAvLyAgIDk0NjogaWZuZSArNjQ1IC0+IDE1OTEKKyAgICAvLyAgIDk0OTogaWNvbnN0XzAKKyAgICAvLyAgIDk1MDogaXN0b3JlIDI2CisgICAgLy8gICA5NTI6IGFsb2FkIDIxCisgICAgLy8gICA5NTQ6IGdldGZpZWxkIDU0NAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrJENsZWFyVGFyZ2V0OmRlbGl2ZXJJbnRlbnQJWgorICAgIC8vICAgOTU3OiBpZm5lICsxMSAtPiA5NjgKKyAgICAvLyAgIDk2MDogaWNvbnN0XzAKKyAgICAvLyAgIDk2MTogaXN0b3JlIDI3CisgICAgLy8gICA5NjM6IGlsb2FkIDIwCisgICAgLy8gICA5NjU6IGlmZXEgKzYyMCAtPiAxNTg1CisgICAgLy8gICA5Njg6IGFsb2FkIDI0CisgICAgLy8gICA5NzA6IGFsb2FkIDIxCisgICAgLy8gICA5NzI6IGFsb2FkXzIKKyAgICAvLyAgIDk3MzogaW52b2tldmlydHVhbCAxMTQJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRDb21wb25lbnQJKClMYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7CisgICAgLy8gICA5NzY6IGludm9rZXN0YXRpYyA1NDYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazphCShMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vcDtMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjayRDbGVhclRhcmdldDtMYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7KVoKKyAgICAvLyAgIDk3OTogaXN0b3JlIDI3CisgICAgLy8gICA5ODE6IGFsb2FkIDI0CisgICAgLy8gICA5ODM6IGludm9rZXN0YXRpYyA1NDgJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazphCShMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vcDspTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2M7CisgICAgLy8gICA5ODY6IGFzdG9yZSA0NQorICAgIC8vICAgOTg4OiBpbG9hZCAxNAorICAgIC8vICAgOTkwOiBpZmVxICsyNCAtPiAxMDE0CisgICAgLy8gICA5OTM6IGlsb2FkIDIwCisgICAgLy8gICA5OTU6IGlmbmUgKzE5IC0+IDEwMTQKKyAgICAvLyAgIDk5ODogYWxvYWQgNDUKKyAgICAvLyAgIDEwMDA6IGlmbnVsbCArMTQgLT4gMTAxNAorICAgIC8vICAgMTAwMzogaWxvYWQgMjcKKyAgICAvLyAgIDEwMDU6IGlmZXEgKzkgLT4gMTAxNAorICAgIC8vICAgMTAwODogYWxvYWQgNDUKKyAgICAvLyAgIDEwMTA6IGljb25zdF8xCisgICAgLy8gICAxMDExOiBwdXRmaWVsZCAxOTMJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzppCVoKKyAgICAvLyAgIDEwMTQ6IGFsb2FkIDQ1CisgICAgLy8gICAxMDE2OiBpZm51bGwgKzU2OSAtPiAxNTg1CisgICAgLy8gICAxMDE5OiBhbG9hZCA0NQorICAgIC8vICAgMTAyMTogZ2V0ZmllbGQgMTkzCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2M6aQlaCisgICAgLy8gICAxMDI0OiBpZm5lICs1NjEgLT4gMTU4NQorICAgIC8vICAgMTAyNzogYWxvYWQgNDUKKyAgICAvLyAgIDEwMjk6IGdldGZpZWxkIDE0NAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9jOmIJTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOworICAgIC8vICAgMTAzMjogYWxvYWRfMgorICAgIC8vICAgMTAzMzogaW52b2tldmlydHVhbCAxMTQJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRDb21wb25lbnQJKClMYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7CisgICAgLy8gICAxMDM2OiBpbnZva2V2aXJ0dWFsIDIwNglhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTplcXVhbHMJKExqYXZhL2xhbmcvT2JqZWN0OylaCisgICAgLy8gICAxMDM5OiBpZmVxICs1NDYgLT4gMTU4NQorICAgIC8vICAgMTA0MjogYWxvYWQgNDUKKyAgICAvLyAgIDEwNDQ6IGlmbnVsbCArMzkgLT4gMTA4MworICAgIC8vICAgMTA0NzogYWxvYWQgMTAKKyAgICAvLyAgIDEwNDk6IGlmbnVsbCArNTAwIC0+IDE1NDkKKyAgICAvLyAgIDEwNTI6IGFsb2FkIDEwCisgICAgLy8gICAxMDU0OiBnZXRmaWVsZCAxNDQJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzpiCUxhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTsKKyAgICAvLyAgIDEwNTc6IGludm9rZXZpcnR1YWwgNTUxCWFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOmdldFBhY2thZ2VOYW1lCSgpTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxMDYwOiBhc3RvcmUgNDYKKyAgICAvLyAgIDEwNjI6IGFsb2FkIDQ1CisgICAgLy8gICAxMDY0OiBnZXRmaWVsZCA1NTQJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzpmCUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9qOworICAgIC8vICAgMTA2NzogZ2V0ZmllbGQgNTU3CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2o6ZQlMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvQXBwQ2xpZW50OworICAgIC8vICAgMTA3MDogYWxvYWQgNDYKKyAgICAvLyAgIDEwNzI6IGFsb2FkIDQ1CisgICAgLy8gICAxMDc0OiBnZXRmaWVsZCA1NjAJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzpkCUxhbmRyb2lkL29zL0lCaW5kZXI7CisgICAgLy8gICAxMDc3OiBhbG9hZF8yCisgICAgLy8gICAxMDc4OiBpbnZva2VpbnRlcmZhY2UgNTY2IDQgMAorICAgIC8vICAgMTA4MzogaWNvbnN0XzEKKyAgICAvLyAgIDEwODQ6IGlzdG9yZSAyOAorICAgIC8vICAgMTA4NjogaWxvYWQgMjcKKyAgICAvLyAgIDEwODg6IGlmZXEgKzE5IC0+IDExMDcKKyAgICAvLyAgIDEwOTE6IGFsb2FkXzAKKyAgICAvLyAgIDEwOTI6IGdldGZpZWxkIDQ1CWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YQlMYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5OworICAgIC8vICAgMTA5NTogYXN0b3JlIDQzCisgICAgLy8gICAxMDk3OiBhbG9hZCA0MworICAgIC8vICAgMTA5OTogbW9uaXRvcmVudGVyCisgICAgLy8gICAxMTAwOiBhbG9hZF8wCisgICAgLy8gICAxMTAxOiBpbnZva2VzcGVjaWFsIDU2OAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrOmIJKClWCisgICAgLy8gICAxMTA0OiBhbG9hZCA0MworICAgIC8vICAgMTEwNjogbW9uaXRvcmV4aXQKKyAgICAvLyAgIDExMDc6IGlsb2FkIDI2CisgICAgLy8gICAxMTA5OiBpZm5lIC00OTYgLT4gNjEzCisgICAgLy8gICAxMTEyOiBpbG9hZCAyOAorICAgIC8vICAgMTExNDogaWZuZSAtNTAxIC0+IDYxMworICAgIC8vICAgMTExNzogYWxvYWRfMAorICAgIC8vICAgMTExODogaWxvYWRfMQorICAgIC8vICAgMTExOTogYWxvYWQgMTAKKyAgICAvLyAgIDExMjE6IGFsb2FkXzIKKyAgICAvLyAgIDExMjI6IGFsb2FkXzMKKyAgICAvLyAgIDExMjM6IGludm9rZXNwZWNpYWwgNDkxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YQkoSUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9jO0xhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOylMYW5kcm9pZC9jb250ZW50L0ludGVudDsKKyAgICAvLyAgIDExMjY6IGFzdG9yZSAyOQorICAgIC8vICAgMTEyODogYWxvYWQgMjkKKyAgICAvLyAgIDExMzA6IGlmbnVsbCAtNTE3IC0+IDYxMworICAgIC8vICAgMTEzMzogYWxvYWQgMjQKKyAgICAvLyAgIDExMzU6IGludm9rZXN0YXRpYyA1NDgJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjazphCShMY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vcDspTGNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL2M7CisgICAgLy8gICAxMTM4OiBhc3RvcmUgMzAKKyAgICAvLyAgIDExNDA6IGFsb2FkIDMwCisgICAgLy8gICAxMTQyOiBpZm51bGwgKzIyMiAtPiAxMzY0CisgICAgLy8gICAxMTQ1OiBhbG9hZF8wCisgICAgLy8gICAxMTQ2OiBhbG9hZCAyNAorICAgIC8vICAgMTE0ODogZ2V0ZmllbGQgMjAwCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL3A6YglJCisgICAgLy8gICAxMTUxOiBhbG9hZCAzMAorICAgIC8vICAgMTE1MzogYWxvYWQgMjkKKyAgICAvLyAgIDExNTU6IGFsb2FkXzMKKyAgICAvLyAgIDExNTY6IGludm9rZXNwZWNpYWwgNDkxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YQkoSUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL3NlcnZlci9hbS9jO0xhbmRyb2lkL2NvbnRlbnQvSW50ZW50O0xhbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvOylMYW5kcm9pZC9jb250ZW50L0ludGVudDsKKyAgICAvLyAgIDExNTk6IGlmbnVsbCArMjA1IC0+IDEzNjQKKyAgICAvLyAgIDExNjI6IGFsb2FkIDMwCisgICAgLy8gICAxMTY0OiBnZXRmaWVsZCA1NjAJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9zZXJ2ZXIvYW0vYzpkCUxhbmRyb2lkL29zL0lCaW5kZXI7CisgICAgLy8gICAxMTY3OiBhc3RvcmUgMzMKKyAgICAvLyAgIDExNjk6IGdldHN0YXRpYyA1NzMJdGJveC9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyOnN0YXJ0QWN0aXZpdHkJTHRib3gvUmVmTWV0aG9kOworICAgIC8vICAgMTE3MjogaW52b2tldmlydHVhbCA1NzkJdGJveC9SZWZNZXRob2Q6cGFyYW1MaXN0CSgpW0xqYXZhL2xhbmcvQ2xhc3M7CisgICAgLy8gICAxMTc1OiBhc3RvcmUgMzQKKyAgICAvLyAgIDExNzc6IGFsb2FkIDM0CisgICAgLy8gICAxMTc5OiBhcnJheWxlbmd0aAorICAgIC8vICAgMTE4MDogYW5ld2FycmF5IDQJamF2YS9sYW5nL09iamVjdAorICAgIC8vICAgMTE4MzogYXN0b3JlIDM1CisgICAgLy8gICAxMTg1OiBhbG9hZCAzNAorICAgIC8vICAgMTE4NzogaWNvbnN0XzAKKyAgICAvLyAgIDExODg6IGFhbG9hZAorICAgIC8vICAgMTE4OTogZ2V0c3RhdGljIDU4NQl0Ym94L2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZDpUWVBFCUxqYXZhL2xhbmcvQ2xhc3M7CisgICAgLy8gICAxMTkyOiBpZl9hY21wbmUgKzIwIC0+IDEyMTIKKyAgICAvLyAgIDExOTU6IGFsb2FkIDM1CisgICAgLy8gICAxMTk3OiBpY29uc3RfMAorICAgIC8vICAgMTE5ODogZ2V0c3RhdGljIDU5MAl0Ym94L2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkOmdldEFwcGxpY2F0aW9uVGhyZWFkCUx0Ym94L1JlZk1ldGhvZDsKKyAgICAvLyAgIDEyMDE6IGludm9rZXN0YXRpYyA1OTIJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9jbGllbnQvQXBwSW50ZXJmYWNlOmcJKClMamF2YS9sYW5nL09iamVjdDsKKyAgICAvLyAgIDEyMDQ6IGljb25zdF8wCisgICAgLy8gICAxMjA1OiBhbmV3YXJyYXkgNAlqYXZhL2xhbmcvT2JqZWN0CisgICAgLy8gICAxMjA4OiBpbnZva2V2aXJ0dWFsIDU5Ngl0Ym94L1JlZk1ldGhvZDpjYWxsCShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OworICAgIC8vICAgMTIxMTogYWFzdG9yZQorICAgIC8vICAgMTIxMjogYWxvYWQgMzQKKyAgICAvLyAgIDEyMTQ6IGxkYyA3NworICAgIC8vICAgMTIxNjogaW52b2tlc3RhdGljIDYwMQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci91dGlscy9lOmEJKFtMamF2YS9sYW5nL0NsYXNzO0xqYXZhL2xhbmcvQ2xhc3M7KUkKKyAgICAvLyAgIDEyMTk6IGlzdG9yZSAzNgorICAgIC8vICAgMTIyMTogYWxvYWQgMzQKKyAgICAvLyAgIDEyMjM6IGxkY193IDYwMworICAgIC8vICAgMTIyNjogaWNvbnN0XzIKKyAgICAvLyAgIDEyMjc6IGludm9rZXN0YXRpYyA2MDYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvdXRpbHMvZTphCShbTGphdmEvbGFuZy9DbGFzcztMamF2YS9sYW5nL0NsYXNzO0kpSQorICAgIC8vICAgMTIzMDogaXN0b3JlIDM3CisgICAgLy8gICAxMjMyOiBhbG9hZCAzNAorICAgIC8vICAgMTIzNDogbGRjX3cgNjA4CisgICAgLy8gICAxMjM3OiBpbnZva2VzdGF0aWMgNjAxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvaGVscGVyL3V0aWxzL2U6YQkoW0xqYXZhL2xhbmcvQ2xhc3M7TGphdmEvbGFuZy9DbGFzczspSQorICAgIC8vICAgMTI0MDogaXN0b3JlIDM4CisgICAgLy8gICAxMjQyOiBpbG9hZCAzNgorICAgIC8vICAgMTI0NDogaWNvbnN0XzEKKyAgICAvLyAgIDEyNDU6IGlhZGQKKyAgICAvLyAgIDEyNDY6IGlzdG9yZSAzOQorICAgIC8vICAgMTI0ODogaWxvYWQgMzcKKyAgICAvLyAgIDEyNTA6IGljb25zdF8xCisgICAgLy8gICAxMjUxOiBpYWRkCisgICAgLy8gICAxMjUyOiBpc3RvcmUgNDAKKyAgICAvLyAgIDEyNTQ6IGlsb2FkIDM3CisgICAgLy8gICAxMjU2OiBpY29uc3RfMgorICAgIC8vICAgMTI1NzogaWFkZAorICAgIC8vICAgMTI1ODogaXN0b3JlIDQxCisgICAgLy8gICAxMjYwOiBhbG9hZCAzNQorICAgIC8vICAgMTI2MjogaWxvYWQgMzYKKyAgICAvLyAgIDEyNjQ6IGFsb2FkIDI5CisgICAgLy8gICAxMjY2OiBhYXN0b3JlCisgICAgLy8gICAxMjY3OiBhbG9hZCAzNQorICAgIC8vICAgMTI2OTogaWxvYWQgMzcKKyAgICAvLyAgIDEyNzE6IGFsb2FkIDMzCisgICAgLy8gICAxMjczOiBhYXN0b3JlCisgICAgLy8gICAxMjc0OiBhbG9hZCAzNQorICAgIC8vICAgMTI3NjogaWxvYWQgNDAKKyAgICAvLyAgIDEyNzg6IGFsb2FkIDYKKyAgICAvLyAgIDEyODA6IGFhc3RvcmUKKyAgICAvLyAgIDEyODE6IGFsb2FkIDM1CisgICAgLy8gICAxMjgzOiBpbG9hZCA0MQorICAgIC8vICAgMTI4NTogaWxvYWQgNworICAgIC8vICAgMTI4NzogaW52b2tlc3RhdGljIDM4NQlqYXZhL2xhbmcvSW50ZWdlcjp2YWx1ZU9mCShJKUxqYXZhL2xhbmcvSW50ZWdlcjsKKyAgICAvLyAgIDEyOTA6IGFhc3RvcmUKKyAgICAvLyAgIDEyOTE6IGlsb2FkIDM4CisgICAgLy8gICAxMjkzOiBpY29uc3RfbTEKKyAgICAvLyAgIDEyOTQ6IGlmX2ljbXBlcSArMTAgLT4gMTMwNAorICAgIC8vICAgMTI5NzogYWxvYWQgMzUKKyAgICAvLyAgIDEyOTk6IGlsb2FkIDM4CisgICAgLy8gICAxMzAxOiBhbG9hZCA1CisgICAgLy8gICAxMzAzOiBhYXN0b3JlCisgICAgLy8gICAxMzA0OiBhbG9hZCAzNQorICAgIC8vICAgMTMwNjogaWxvYWQgMzkKKyAgICAvLyAgIDEzMDg6IGFsb2FkIDI5CisgICAgLy8gICAxMzEwOiBpbnZva2V2aXJ0dWFsIDYxMQlhbmRyb2lkL2NvbnRlbnQvSW50ZW50OmdldFR5cGUJKClMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDEzMTM6IGFhc3RvcmUKKyAgICAvLyAgIDEzMTQ6IGdldHN0YXRpYyA0NTgJYW5kcm9pZC9vcy9CdWlsZCRWRVJTSU9OOlNES19JTlQJSQorICAgIC8vICAgMTMxNzogYmlwdXNoIDE4CisgICAgLy8gICAxMzE5OiBpZl9pY21wbHQgKzE2IC0+IDEzMzUKKyAgICAvLyAgIDEzMjI6IGFsb2FkIDM1CisgICAgLy8gICAxMzI0OiBpbG9hZCAzNgorICAgIC8vICAgMTMyNjogaWNvbnN0XzEKKyAgICAvLyAgIDEzMjc6IGlzdWIKKyAgICAvLyAgIDEzMjg6IGludm9rZXN0YXRpYyA1OAljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2NsaWVudC9BcHBJbnRlcmZhY2U6ZQkoKUxjb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2NsaWVudC9BcHBJbnRlcmZhY2U7CisgICAgLy8gICAxMzMxOiBpbnZva2V2aXJ0dWFsIDk4CWNvbS90cmlndGVjaC9wcml2YXRlbWUvY2xpZW50L0FwcEludGVyZmFjZTprCSgpTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxMzM0OiBhYXN0b3JlCisgICAgLy8gICAxMzM1OiBhbG9hZCAzNAorICAgIC8vICAgMTMzNzogYWxvYWQgMzUKKyAgICAvLyAgIDEzMzk6IGludm9rZXN0YXRpYyA2MTYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvdXRpbHMvaTphCShbTGphdmEvbGFuZy9DbGFzcztbTGphdmEvbGFuZy9PYmplY3Q7KVYKKyAgICAvLyAgIDEzNDI6IGdldHN0YXRpYyA1NzMJdGJveC9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyOnN0YXJ0QWN0aXZpdHkJTHRib3gvUmVmTWV0aG9kOworICAgIC8vICAgMTM0NTogZ2V0c3RhdGljIDYyMgl0Ym94L2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZTpnZXREZWZhdWx0CUx0Ym94L1JlZlN0YXRpY01ldGhvZDsKKyAgICAvLyAgIDEzNDg6IGljb25zdF8wCisgICAgLy8gICAxMzQ5OiBhbmV3YXJyYXkgNAlqYXZhL2xhbmcvT2JqZWN0CisgICAgLy8gICAxMzUyOiBpbnZva2V2aXJ0dWFsIDYyNwl0Ym94L1JlZlN0YXRpY01ldGhvZDpjYWxsCShbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OworICAgIC8vICAgMTM1NTogYWxvYWQgMzUKKyAgICAvLyAgIDEzNTc6IGNoZWNrY2FzdCA2MjkJW0xqYXZhL2xhbmcvT2JqZWN0OworICAgIC8vICAgMTM2MDogaW52b2tldmlydHVhbCA1OTYJdGJveC9SZWZNZXRob2Q6Y2FsbAkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsKKyAgICAvLyAgIDEzNjM6IHBvcAorICAgIC8vICAgMTM2NDogZ2V0c3RhdGljIDMxCWNvbS90cmlndGVjaC9wcml2YXRlbWUvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2s6YglMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDEzNjc6IGxkY193IDYzMQorICAgIC8vICAgMTM3MDogaWNvbnN0XzAKKyAgICAvLyAgIDEzNzE6IGFuZXdhcnJheSA0CWphdmEvbGFuZy9PYmplY3QKKyAgICAvLyAgIDEzNzQ6IGludm9rZXN0YXRpYyAzNzYJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvdXRpbHMvdjphCShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYKKyAgICAvLyAgIDEzNzc6IGdvdG8gLTc2NCAtPiA2MTMKKyAgICAvLyAgIDEzODA6IGFsb2FkXzIKKyAgICAvLyAgIDEzODE6IGludm9rZXZpcnR1YWwgNjM1CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0RGF0YQkoKUxhbmRyb2lkL25ldC9Vcmk7CisgICAgLy8gICAxMzg0OiBhbG9hZCA0OQorICAgIC8vICAgMTM4NjogaW52b2tldmlydHVhbCA2MzUJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXREYXRhCSgpTGFuZHJvaWQvbmV0L1VyaTsKKyAgICAvLyAgIDEzODk6IGludm9rZXN0YXRpYyA1MzkJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvYS9mOmEJKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylaCisgICAgLy8gICAxMzkyOiBpZm5lICs5IC0+IDE0MDEKKyAgICAvLyAgIDEzOTU6IGljb25zdF8wCisgICAgLy8gICAxMzk2OiBpc3RvcmUgNTAKKyAgICAvLyAgIDEzOTg6IGdvdG8gLTQ3MiAtPiA5MjYKKyAgICAvLyAgIDE0MDE6IGFsb2FkXzIKKyAgICAvLyAgIDE0MDI6IGludm9rZXZpcnR1YWwgNjExCWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0VHlwZQkoKUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgMTQwNTogYWxvYWQgNDkKKyAgICAvLyAgIDE0MDc6IGludm9rZXZpcnR1YWwgNjExCWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0VHlwZQkoKUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgMTQxMDogaW52b2tlc3RhdGljIDUzOQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci9hL2Y6YQkoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVoKKyAgICAvLyAgIDE0MTM6IGlmbmUgKzkgLT4gMTQyMgorICAgIC8vICAgMTQxNjogaWNvbnN0XzAKKyAgICAvLyAgIDE0MTc6IGlzdG9yZSA1MAorICAgIC8vICAgMTQxOTogZ290byAtNDkzIC0+IDkyNgorICAgIC8vICAgMTQyMjogYWxvYWRfMgorICAgIC8vICAgMTQyMzogaW52b2tldmlydHVhbCA2MzgJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRQYWNrYWdlCSgpTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxNDI2OiBhc3RvcmUgNTEKKyAgICAvLyAgIDE0Mjg6IGFsb2FkIDUxCisgICAgLy8gICAxNDMwOiBpZm5vbm51bGwgKzE5IC0+IDE0NDkKKyAgICAvLyAgIDE0MzM6IGFsb2FkXzIKKyAgICAvLyAgIDE0MzQ6IGludm9rZXZpcnR1YWwgMTE0CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0Q29tcG9uZW50CSgpTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOworICAgIC8vICAgMTQzNzogaWZudWxsICsxMiAtPiAxNDQ5CisgICAgLy8gICAxNDQwOiBhbG9hZF8yCisgICAgLy8gICAxNDQxOiBpbnZva2V2aXJ0dWFsIDExNAlhbmRyb2lkL2NvbnRlbnQvSW50ZW50OmdldENvbXBvbmVudAkoKUxhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTsKKyAgICAvLyAgIDE0NDQ6IGludm9rZXZpcnR1YWwgNTUxCWFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOmdldFBhY2thZ2VOYW1lCSgpTGphdmEvbGFuZy9TdHJpbmc7CisgICAgLy8gICAxNDQ3OiBhc3RvcmUgNTEKKyAgICAvLyAgIDE0NDk6IGFsb2FkIDQ5CisgICAgLy8gICAxNDUxOiBpbnZva2V2aXJ0dWFsIDYzOAlhbmRyb2lkL2NvbnRlbnQvSW50ZW50OmdldFBhY2thZ2UJKClMamF2YS9sYW5nL1N0cmluZzsKKyAgICAvLyAgIDE0NTQ6IGFzdG9yZSA1MgorICAgIC8vICAgMTQ1NjogYWxvYWQgNTIKKyAgICAvLyAgIDE0NTg6IGlmbm9ubnVsbCArMjEgLT4gMTQ3OQorICAgIC8vICAgMTQ2MTogYWxvYWQgNDkKKyAgICAvLyAgIDE0NjM6IGludm9rZXZpcnR1YWwgMTE0CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0Q29tcG9uZW50CSgpTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOworICAgIC8vICAgMTQ2NjogaWZudWxsICsxMyAtPiAxNDc5CisgICAgLy8gICAxNDY5OiBhbG9hZCA0OQorICAgIC8vICAgMTQ3MTogaW52b2tldmlydHVhbCAxMTQJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRDb21wb25lbnQJKClMYW5kcm9pZC9jb250ZW50L0NvbXBvbmVudE5hbWU7CisgICAgLy8gICAxNDc0OiBpbnZva2V2aXJ0dWFsIDU1MQlhbmRyb2lkL2NvbnRlbnQvQ29tcG9uZW50TmFtZTpnZXRQYWNrYWdlTmFtZQkoKUxqYXZhL2xhbmcvU3RyaW5nOworICAgIC8vICAgMTQ3NzogYXN0b3JlIDUyCisgICAgLy8gICAxNDc5OiBhbG9hZCA1MQorICAgIC8vICAgMTQ4MTogYWxvYWQgNTIKKyAgICAvLyAgIDE0ODM6IGludm9rZXN0YXRpYyA1MzkJY29tL3RyaWd0ZWNoL3ByaXZhdGVtZS9oZWxwZXIvYS9mOmEJKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylaCisgICAgLy8gICAxNDg2OiBpZm5lICs5IC0+IDE0OTUKKyAgICAvLyAgIDE0ODk6IGljb25zdF8wCisgICAgLy8gICAxNDkwOiBpc3RvcmUgNTAKKyAgICAvLyAgIDE0OTI6IGdvdG8gLTU2NiAtPiA5MjYKKyAgICAvLyAgIDE0OTU6IGFsb2FkXzIKKyAgICAvLyAgIDE0OTY6IGludm9rZXZpcnR1YWwgMTE0CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0Q29tcG9uZW50CSgpTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOworICAgIC8vICAgMTQ5OTogYWxvYWQgNDkKKyAgICAvLyAgIDE1MDE6IGludm9rZXZpcnR1YWwgMTE0CWFuZHJvaWQvY29udGVudC9JbnRlbnQ6Z2V0Q29tcG9uZW50CSgpTGFuZHJvaWQvY29udGVudC9Db21wb25lbnROYW1lOworICAgIC8vICAgMTUwNDogaW52b2tlc3RhdGljIDUzOQljb20vdHJpZ3RlY2gvcHJpdmF0ZW1lL2hlbHBlci9hL2Y6YQkoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVoKKyAgICAvLyAgIDE1MDc6IGlmbmUgKzkgLT4gMTUxNgorICAgIC8vICAgMTUxMDogaWNvbnN0XzAKKyAgICAvLyAgIDE1MTE6IGlzdG9yZSA1MAorICAgIC8vICAgMTUxMzogZ290byAtNTg3IC0+IDkyNgorICAgIC8vICAgMTUxNjogYWxvYWRfMgorICAgIC8vICAgMTUxNzogaW52b2tldmlydHVhbCA2NDEJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRDYXRlZ29yaWVzCSgpTGphdmEvdXRpbC9TZXQ7CisgICAgLy8gICAxNTIwOiBhbG9hZCA0OQorICAgIC8vICAgMTUyMjogaW52b2tldmlydHVhbCA2NDEJYW5kcm9pZC9jb250ZW50L0ludGVudDpnZXRDYXRlZ29yaWVzCSgpTGphdmEvdXRpbC9TZXQ7CisgICAgLy8gICAxNTI1OiBpbnZva2VzdGF0aWMgNTM5CWNvbS90cmlndGVjaC9wcml2YXRlbWUvaGVscGVyL2EvZjphCShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspWgorICAgIC8vICAgMTUyODogaWZuZSArOSAtPiAxNTM3CisgICAgLy8gICAxNTMxOiBpY29uc3RfMAorICAgIC8vICAgMTUzMjogaXN0b3JlIDUwCisgICAgLy8gICAxNTM0OiBnb3RvIC02MDggLT4gOTI2CisgICAgLy8gICAxNTM3OiBpY29uc3RfMQorICAgIC8vICAgMTUzODogaXN0b3JlIDUwCisgICAgLy8gICAxNTQwOiBnb3RvIC02MTQgLT4gOTI2CisgICAgLy8gICAxNTQzOiBpY29uc3RfMAorICAgIC8vICAgMTU0NDogaXN0b3JlIDI1CisgICAgLy8gICAxNTQ2OiBnb3RvIC02MTIgLT4gOTM0CisgICAgLy8gICAxNTQ5OiBsZGNfdyA2NDMKKyAgICAvLyAgIDE1NTI6IGFzdG9yZSA0NgorICAgIC8vICAgMTU1NDogZ290byAtNDkyIC0+IDEwNjIKKyAgICAvLyAgIDE1NTc6IGFzdG9yZSA0OAorICAgIC8vICAgMTU1OTogYWxvYWQgNDgKKyAgICAvLyAgIDE1NjE6IGludm9rZXZpcnR1YWwgNjQ0CWFuZHJvaWQvb3MvUmVtb3RlRXhjZXB0aW9uOnByaW50U3RhY2tUcmFjZQkoKVYKKyAgICAvLyAgIDE1NjQ6IGdvdG8gLTQ4MSAtPiAxMDgzCisgICAgLy8gICAxNTY3OiBhc3RvcmUgNDcKKyAgICAvLyAgIDE1Njk6IGFsb2FkIDQ3CisgICAgLy8gICAxNTcxOiBpbnZva2V2aXJ0dWFsIDY0NQlqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb246cHJpbnRTdGFja1RyYWNlCSgpVgorICAgIC8vICAgMTU3NDogZ290byAtNDkxIC0+IDEwODMKKyAgICAvLyAgIDE1Nzc6IGFzdG9yZSA0NAorICAgIC8vICAgMTU3OTogYWxvYWQgNDMKKyAgICAvLyAgIDE1ODE6IG1vbml0b3JleGl0CisgICAgLy8gICAxNTgyOiBhbG9hZCA0NAorICAgIC8vICAgMTU4NDogYXRocm93CisgICAgLy8gICAxNTg1OiBpY29uc3RfMAorICAgIC8vICAgMTU4NjogaXN0b3JlIDI4CisgICAgLy8gICAxNTg4OiBnb3RvIC01MDIgLT4gMTA4NgorICAgIC8vICAgMTU5MTogaWxvYWQgMjUKKyAgICAvLyAgIDE1OTM6IGlzdG9yZSAyNgorICAgIC8vICAgMTU5NTogZ290byAtNjQzIC0+IDk1MgorICAgIC8vICAgMTU5ODogYWxvYWQgMTkKKyAgICAvLyAgIDE2MDA6IGFzdG9yZSAyMQorICAgIC8vICAgMTYwMjogZ290byAtMTI0NyAtPiAzNTUKKyAgICAvLyAgIDE2MDU6IGFsb2FkIDEzCisgICAgLy8gICAxNjA3OiBhc3RvcmUgMTkKKyAgICAvLyAgIDE2MDk6IGFsb2FkIDEyCisgICAgLy8gICAxNjExOiBhc3RvcmUgMTgKKyAgICAvLyAgIDE2MTM6IGFjb25zdF9udWxsCisgICAgLy8gICAxNjE0OiBhc3RvcmUgMTcKKyAgICAvLyAgIDE2MTY6IGljb25zdF8wCisgICAgLy8gICAxNjE3OiBpc3RvcmUgMjAKKyAgICAvLyAgIDE2MTk6IGdvdG8gLTEyODcgLT4gMzMyCisgICAgLy8KKyAgICAvLyBFeGNlcHRpb24gdGFibGU6CisgICAgLy8gICBmcm9tCXRvCXRhcmdldAl0eXBlCisgICAgLy8gICAxMDYyCTEwODMJMTU1NwlhbmRyb2lkL29zL1JlbW90ZUV4Y2VwdGlvbgorICAgIC8vICAgMTA2MgkxMDgzCTE1NjcJamF2YS9sYW5nL051bGxQb2ludGVyRXhjZXB0aW9uCisgICAgLy8gICAxMTAwCTExMDcJMTU3NwlmaW5hbGx5CisgICAgLy8gICAxNTc5CTE1ODIJMTU3NwlmaW5hbGx5CisgIH0KKworICBmaW5hbCBjIGEoaW50IHBhcmFtSW50KQorICB7CisgICAgTGlzdCBsb2NhbExpc3QgPSBlKHBhcmFtSW50KTsKKyAgICBpZiAoIWxvY2FsTGlzdC5pc0VtcHR5KCkpCisgICAgICByZXR1cm4gKGMpbG9jYWxMaXN0LmdldCgtMSArIGxvY2FsTGlzdC5zaXplKCkpOworICAgIHJldHVybiBudWxsOworICB9CisKKyAgZmluYWwgYyBhKGludCBwYXJhbUludCwgSUJpbmRlciBwYXJhbUlCaW5kZXIpCisgIHsKKyAgICBPYmplY3QgbG9jYWxPYmplY3QxID0gbnVsbDsKKyAgICBpZiAocGFyYW1JQmluZGVyICE9IG51bGwpOworICAgIGZvciAoaW50IGkgPSAwOyA7IGkrKykKKyAgICB7CisgICAgICBwIGxvY2FscDsKKyAgICAgIGlmIChpIDwgdGhpcy5hLnNpemUoKSkKKyAgICAgIHsKKyAgICAgICAgbG9jYWxwID0gKHApdGhpcy5hLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChsb2NhbHAuYiAhPSBwYXJhbUludCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc3luY2hyb25pemVkIChsb2NhbHAuZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yID0gbG9jYWxwLmUuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGlmIChsb2NhbEl0ZXJhdG9yLmhhc05leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbG9jYWxPYmplY3QzID0gKGMpbG9jYWxJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgIGlmICgoKGMpbG9jYWxPYmplY3QzKS5kICE9IHBhcmFtSUJpbmRlcikKKyAgICAgICAgICAgICAgICBicmVhayBsYWJlbDExNjsKKyAgICAgICAgICAgICAgYnJlYWsgbGFiZWwxMTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBsb2NhbE9iamVjdDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmaW5hbCB2b2lkIGEoaW50IHBhcmFtSW50LCBTdHJpbmcgcGFyYW1TdHJpbmcpCisgIHsKKyAgICBpZiAocGFyYW1JbnQgIT0gLTEpCisgICAgICBmKHBhcmFtSW50KS5hKHBhcmFtU3RyaW5nKTsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yID0gdGhpcy5mLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICB3aGlsZSAobG9jYWxJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgIGYoKChJbnRlZ2VyKWxvY2FsSXRlcmF0b3IubmV4dCgpKS5pbnRWYWx1ZSgpKS5hKHBhcmFtU3RyaW5nKTsKKyAgICB9CisgIH0KKworICBmaW5hbCB2b2lkIGEoaiBwYXJhbWopCisgIHsKKyAgICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIHN5bmNocm9uaXplZCAodGhpcy5hKQorICAgICAgeworICAgICAgICBhKCk7CisgICAgICAgIGkgPSB0aGlzLmEuc2l6ZSgpOworICAgICAgICBqID0gaSAtIDE7CisgICAgICAgIGlmIChpIDw9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHAgbG9jYWxwID0gKHApdGhpcy5hLnZhbHVlQXQoaik7CisgICAgICAgIHN5bmNocm9uaXplZCAobG9jYWxwLmUpCisgICAgICAgIHsKKyAgICAgICAgICBJdGVyYXRvciBsb2NhbEl0ZXJhdG9yID0gbG9jYWxwLmUuaXRlcmF0b3IoKTsKKyAgICAgICAgICBpZiAobG9jYWxJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgeworICAgICAgICAgICAgYyBsb2NhbGMgPSAoYylsb2NhbEl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChsb2NhbGMuZi5nICE9IHBhcmFtai5nKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxvY2FsSXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICBpZiAobG9jYWxwLmUuaXNFbXB0eSgpKQorICAgICAgICAgICAgICB0aGlzLmEucmVtb3ZlKGxvY2FscC5hKTsKKyAgICAgICAgICAgIHRoaXMuZy5yZW1vdmUobG9jYWxjKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGludCBpID0gajsKKyAgICB9CisgIH0KKworICBmaW5hbCB2b2lkIGEoaiBwYXJhbWosIENvbXBvbmVudE5hbWUgcGFyYW1Db21wb25lbnROYW1lMSwgQ29tcG9uZW50TmFtZSBwYXJhbUNvbXBvbmVudE5hbWUyLCBJQmluZGVyIHBhcmFtSUJpbmRlciwgSW50ZW50IHBhcmFtSW50ZW50LCBTdHJpbmcgcGFyYW1TdHJpbmcsIGludCBwYXJhbUludDEsIGludCBwYXJhbUludDIsIGludCBwYXJhbUludDMpCisgIHsKKyAgICB2LmEoYiwgIm9uQWN0aXZpdHlDcmVhdGVkPj4+Pj4+Pj4+Pj4+Pj4+dG9rZW46ICVzIiwgbmV3IE9iamVjdFtdIHsgcGFyYW1JQmluZGVyIH0pOworICAgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIHAgbG9jYWxwMTsKKyAgICAgIHN5bmNocm9uaXplZCAodGhpcy5hKQorICAgICAgeworICAgICAgICBhKCk7CisgICAgICAgIGxvY2FscDEgPSAocCl0aGlzLmEuZ2V0KHBhcmFtSW50MSk7CisgICAgICAgIGlmIChsb2NhbHAxID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICBsb2NhbHAyID0gbmV3IHAocGFyYW1JbnQxLCBwYXJhbWouaiwgcGFyYW1TdHJpbmcsIHBhcmFtSW50ZW50KTsKKyAgICAgICAgICB0aGlzLmEucHV0KHBhcmFtSW50MSwgbG9jYWxwMik7CisgICAgICAgICAgYyBsb2NhbGMgPSBuZXcgYyhsb2NhbHAyLCBwYXJhbUNvbXBvbmVudE5hbWUxLCBwYXJhbUNvbXBvbmVudE5hbWUyLCBwYXJhbUlCaW5kZXIsIHBhcmFtai5qLCBwYXJhbWosIHBhcmFtSW50MiwgcGFyYW1JbnQzLCBwYXJhbVN0cmluZyk7CisgICAgICAgICAgc3luY2hyb25pemVkIChsb2NhbHAyLmUpCisgICAgICAgICAgeworICAgICAgICAgICAgbG9jYWxwMi5lLmFkZChsb2NhbGMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcCBsb2NhbHAyID0gbG9jYWxwMTsKKyAgICB9CisgIH0KKworICBmaW5hbCBMaXN0PGM+IGIoaW50IHBhcmFtSW50KQorICB7CisgICAgT2JqZWN0IGxvY2FsT2JqZWN0ID0gKExpc3QpdGhpcy5oLmdldChJbnRlZ2VyLnZhbHVlT2YocGFyYW1JbnQpKTsKKyAgICBpZiAobG9jYWxPYmplY3QgPT0gbnVsbCkKKyAgICB7CisgICAgICBsb2NhbE9iamVjdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgIHRoaXMuaC5wdXQoSW50ZWdlci52YWx1ZU9mKHBhcmFtSW50KSwgbG9jYWxPYmplY3QpOworICAgIH0KKyAgICByZXR1cm4gbG9jYWxPYmplY3Q7CisgIH0KKworICBmaW5hbCB2b2lkIGIoaW50IHBhcmFtSW50LCBJQmluZGVyIHBhcmFtSUJpbmRlcikKKyAgeworICAgIHYuYShiLCAib25BY3Rpdml0eVJlc3VtZWQ+Pj4+Pj4+Pj4+Pj4+Pj50b2tlbjogJXMiLCBuZXcgT2JqZWN0W10geyBwYXJhbUlCaW5kZXIgfSk7CisgICAgc3luY2hyb25pemVkICh0aGlzLmEpCisgICAgeworICAgICAgYSgpOworICAgICAgYyBsb2NhbGMgPSBhKHBhcmFtSW50LCBwYXJhbUlCaW5kZXIpOworICAgICAgdi5hKGIsICJvbkFjdGl2aXR5UmVzdW1lZCwgcjogJXMiLCBuZXcgT2JqZWN0W10geyBsb2NhbGMgfSk7CisgICAgICBpZiAobG9jYWxjICE9IG51bGwpCisgICAgICAgIGlmIChsb2NhbGMuYiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgYS5hKCk7CisgICAgICAgICAgYS5hKGxvY2FsYy5iLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgIGYgbG9jYWxmID0gZihwYXJhbUludCk7CisgICAgICAgICAgU3RyaW5nIHN0ciA9IGxvY2FsYy5iLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgbG9jYWxmLmEoQXBwSW50ZXJmYWNlLmUoKS5iKHN0cikpOworICAgICAgICB9CisgICAgICBzeW5jaHJvbml6ZWQgKGxvY2FsYy5hLmUpCisgICAgICB7CisgICAgICAgIGxvY2FsYy5hLmUucmVtb3ZlKGxvY2FsYyk7CisgICAgICAgIGxvY2FsYy5hLmUuYWRkKGxvY2FsYyk7CisgICAgICAgIHRoaXMuZS5wdXQoSW50ZWdlci52YWx1ZU9mKHBhcmFtSW50KSwgbG9jYWxjLmEpOworICAgICAgICBMaXN0IGxvY2FsTGlzdDIgPSBlKHBhcmFtSW50KTsKKyAgICAgICAgaWYgKCFsb2NhbExpc3QyLmNvbnRhaW5zKGxvY2FsYykpCisgICAgICAgIHsKKyAgICAgICAgICB2LmEoYiwgIm9uQWN0aXZpdHlSZXN1bWVkLCBhZGQgcjogJXMiLCBuZXcgT2JqZWN0W10geyBsb2NhbGMgfSk7CisgICAgICAgICAgbG9jYWxMaXN0Mi5hZGQobG9jYWxjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgZmluYWwgTGlzdDxBcHBTZXR0aW5nPiBjKGludCBwYXJhbUludCkKKyAgeworICAgIHJldHVybiBmKHBhcmFtSW50KS5hKCk7CisgIH0KKworICBmaW5hbCB2b2lkIGMoaW50IHBhcmFtSW50LCBJQmluZGVyIHBhcmFtSUJpbmRlcikKKyAgeworICAgIHYuYShiLCAib25BY3Rpdml0eVN0YXJ0ZWQ+Pj4+Pj4+Pj4+Pj4+Pj50b2tlbjogJXMiLCBuZXcgT2JqZWN0W10geyBwYXJhbUlCaW5kZXIgfSk7CisgICAgc3luY2hyb25pemVkICh0aGlzLmEpCisgICAgeworICAgICAgYSgpOworICAgICAgYyBsb2NhbGMgPSBhKHBhcmFtSW50LCBwYXJhbUlCaW5kZXIpOworICAgICAgdi5hKGIsICJvbkFjdGl2aXR5U3RhcnRlZCwgcjogJXMiLCBuZXcgT2JqZWN0W10geyBsb2NhbGMgfSk7CisgICAgICBMaXN0IGxvY2FsTGlzdCA9IGIocGFyYW1JbnQpOworICAgICAgaWYgKChsb2NhbGMgIT0gbnVsbCkgJiYgKCFsb2NhbExpc3QuY29udGFpbnMobG9jYWxjKSkpCisgICAgICB7CisgICAgICAgIGxvY2FsTGlzdC5hZGQobG9jYWxjKTsKKyAgICAgICAgdi5hKGIsICJvbkFjdGl2aXR5U3RhcnRlZCwgYWRkIHI6ICVzIiwgbmV3IE9iamVjdFtdIHsgbG9jYWxjIH0pOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGZpbmFsIEFwcFRhc2tJbmZvIGQoaW50IHBhcmFtSW50KQorICB7CisgICAgc3luY2hyb25pemVkICh0aGlzLmEpCisgICAgeworICAgICAgcCBsb2NhbHAgPSAocCl0aGlzLmEuZ2V0KHBhcmFtSW50KTsKKyAgICAgIGlmIChsb2NhbHAgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgaW50IGkgPSBsb2NhbHAuZS5zaXplKCk7CisgICAgICAgIGlmIChpIDw9IDApOworICAgICAgICBDb21wb25lbnROYW1lIGxvY2FsQ29tcG9uZW50TmFtZTsKKyAgICAgICAgZm9yIChBcHBUYXNrSW5mbyBsb2NhbEFwcFRhc2tJbmZvID0gbnVsbDsgOyBsb2NhbEFwcFRhc2tJbmZvID0gbmV3IEFwcFRhc2tJbmZvKGxvY2FscC5hLCBsb2NhbHAuZCwgbG9jYWxwLmQuZ2V0Q29tcG9uZW50KCksIGxvY2FsQ29tcG9uZW50TmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbG9jYWxBcHBUYXNrSW5mbzsKKyAgICAgICAgICBsb2NhbENvbXBvbmVudE5hbWUgPSAoKGMpbG9jYWxwLmUuZ2V0KGkgLSAxKSkuYjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgZmluYWwgdm9pZCBkKGludCBwYXJhbUludCwgSUJpbmRlciBwYXJhbUlCaW5kZXIpCisgIHsKKyAgICB2LmEoYiwgIm9uQWN0aXZpdHlQYXVzZWQ+Pj4+Pj4+Pj4+Pj4+Pj50b2tlbjogJXMiLCBuZXcgT2JqZWN0W10geyBwYXJhbUlCaW5kZXIgfSk7CisgICAgc3luY2hyb25pemVkICh0aGlzLmEpCisgICAgeworICAgICAgYSgpOworICAgICAgYyBsb2NhbGMgPSBhKHBhcmFtSW50LCBwYXJhbUlCaW5kZXIpOworICAgICAgdi5hKGIsICJvbkFjdGl2aXR5UGF1c2VkLCByOiAlcyIsIG5ldyBPYmplY3RbXSB7IGxvY2FsYyB9KTsKKyAgICAgIExpc3QgbG9jYWxMaXN0ID0gZShwYXJhbUludCk7CisgICAgICBpZiAoKGxvY2FsYyAhPSBudWxsKSAmJiAobG9jYWxMaXN0LmNvbnRhaW5zKGxvY2FsYykpKQorICAgICAgeworICAgICAgICBsb2NhbExpc3QucmVtb3ZlKGxvY2FsYyk7CisgICAgICAgIHYuYShiLCAib25BY3Rpdml0eVBhdXNlZCwgcmVtb3ZlIHI6ICVzIiwgbmV3IE9iamVjdFtdIHsgbG9jYWxjIH0pOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGZpbmFsIHZvaWQgZShpbnQgcGFyYW1JbnQsIElCaW5kZXIgcGFyYW1JQmluZGVyKQorICB7CisgICAgdi5hKGIsICJvbkFjdGl2aXR5U3RvcHBlZD4+Pj4+Pj4+Pj4+Pj4+PnRva2VuOiAlcyIsIG5ldyBPYmplY3RbXSB7IHBhcmFtSUJpbmRlciB9KTsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYSkKKyAgICB7CisgICAgICBhKCk7CisgICAgICBjIGxvY2FsYyA9IGEocGFyYW1JbnQsIHBhcmFtSUJpbmRlcik7CisgICAgICB2LmEoYiwgIm9uQWN0aXZpdHlTdG9wcGVkLCByOiAlcyIsIG5ldyBPYmplY3RbXSB7IGxvY2FsYyB9KTsKKyAgICAgIExpc3QgbG9jYWxMaXN0ID0gYihwYXJhbUludCk7CisgICAgICBpZiAoKGxvY2FsYyAhPSBudWxsKSAmJiAobG9jYWxMaXN0LmNvbnRhaW5zKGxvY2FsYykpKQorICAgICAgeworICAgICAgICBsb2NhbExpc3QucmVtb3ZlKGxvY2FsYyk7CisgICAgICAgIHYuYShiLCAib25BY3Rpdml0eVN0b3BwZWQsIHJlbW92ZSByOiAlcyIsIG5ldyBPYmplY3RbXSB7IGxvY2FsYyB9KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBmaW5hbCBib29sZWFuIGYoaW50IHBhcmFtSW50LCBJQmluZGVyIHBhcmFtSUJpbmRlcikKKyAgeworICAgIHYuYShiLCAib25BY3Rpdml0eURlc3Ryb3llZD4+Pj4+Pj4+Pj4+Pj4+PnRva2VuOiAlcyIsIG5ldyBPYmplY3RbXSB7IHBhcmFtSUJpbmRlciB9KTsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYSkKKyAgICB7CisgICAgICBjIGxvY2FsYyA9IGEocGFyYW1JbnQsIHBhcmFtSUJpbmRlcik7CisgICAgICB2LmEoYiwgIm9uQWN0aXZpdHlEZXN0cm95ZWQsIHI6ICVzIiwgbmV3IE9iamVjdFtdIHsgbG9jYWxjIH0pOworICAgICAgaWYgKGxvY2FsYyAhPSBudWxsKTsKKyAgICAgIHN5bmNocm9uaXplZCAobG9jYWxjLmEuZSkKKyAgICAgIHsKKyAgICAgICAgbG9jYWxjLmEuZS5yZW1vdmUobG9jYWxjKTsKKyAgICAgICAgTGlzdCBsb2NhbExpc3QyID0gZShwYXJhbUludCk7CisgICAgICAgIGlmIChsb2NhbExpc3QyLmNvbnRhaW5zKGxvY2FsYykpCisgICAgICAgIHsKKyAgICAgICAgICBsb2NhbExpc3QyLnJlbW92ZShsb2NhbGMpOworICAgICAgICAgIHYuYShiLCAib25BY3Rpdml0eURlc3Ryb3llZCwgcmVtb3ZlIHJlc3VtZWQgcjogJXMiLCBuZXcgT2JqZWN0W10geyBsb2NhbGMgfSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdCBsb2NhbExpc3QzID0gYihwYXJhbUludCk7CisgICAgICAgIGlmIChsb2NhbExpc3QzLmNvbnRhaW5zKGxvY2FsYykpCisgICAgICAgIHsKKyAgICAgICAgICBsb2NhbExpc3QzLnJlbW92ZShsb2NhbGMpOworICAgICAgICAgIHYuYShiLCAib25BY3Rpdml0eURlc3Ryb3llZCwgcmVtb3ZlIHN0YXJ0ZWQgcjogJXMiLCBuZXcgT2JqZWN0W10geyBsb2NhbGMgfSk7CisgICAgICAgIH0KKyAgICAgICAgYSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZmluYWwgU3RyaW5nIGcoaW50IHBhcmFtSW50LCBJQmluZGVyIHBhcmFtSUJpbmRlcikKKyAgeworICAgIHN5bmNocm9uaXplZCAodGhpcy5hKQorICAgIHsKKyAgICAgIGMgbG9jYWxjID0gYShwYXJhbUludCwgcGFyYW1JQmluZGVyKTsKKyAgICAgIGlmIChsb2NhbGMgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IGxvY2FsYy5iLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBmaW5hbCBDb21wb25lbnROYW1lIGgoaW50IHBhcmFtSW50LCBJQmluZGVyIHBhcmFtSUJpbmRlcikKKyAgeworICAgIHN5bmNocm9uaXplZCAodGhpcy5hKQorICAgIHsKKyAgICAgIGMgbG9jYWxjID0gYShwYXJhbUludCwgcGFyYW1JQmluZGVyKTsKKyAgICAgIGlmIChsb2NhbGMgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBsb2NhbENvbXBvbmVudE5hbWUgPSBsb2NhbGMuYzsKKyAgICAgICAgcmV0dXJuIGxvY2FsQ29tcG9uZW50TmFtZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaShpbnQgcGFyYW1JbnQsIElCaW5kZXIgcGFyYW1JQmluZGVyKQorICB7CisgICAgc3luY2hyb25pemVkICh0aGlzLmEpCisgICAgeworICAgICAgYyBsb2NhbGMgPSBhKHBhcmFtSW50LCBwYXJhbUlCaW5kZXIpOworICAgICAgaWYgKGxvY2FsYyAhPSBudWxsKQorICAgICAgeworICAgICAgICBDb21wb25lbnROYW1lIGxvY2FsQ29tcG9uZW50TmFtZSA9IGxvY2FsYy5jOworICAgICAgICBTdHJpbmcgc3RyID0gbnVsbDsKKyAgICAgICAgaWYgKGxvY2FsQ29tcG9uZW50TmFtZSAhPSBudWxsKQorICAgICAgICAgIHN0ciA9IGxvY2FsYy5jLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBmaW5hbCBDb21wb25lbnROYW1lIGooaW50IHBhcmFtSW50LCBJQmluZGVyIHBhcmFtSUJpbmRlcikKKyAgeworICAgIHN5bmNocm9uaXplZCAodGhpcy5hKQorICAgIHsKKyAgICAgIGMgbG9jYWxjID0gYShwYXJhbUludCwgcGFyYW1JQmluZGVyKTsKKyAgICAgIGlmIChsb2NhbGMgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBsb2NhbENvbXBvbmVudE5hbWUgPSBsb2NhbGMuYjsKKyAgICAgICAgcmV0dXJuIGxvY2FsQ29tcG9uZW50TmFtZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisKK30KKworLyogTG9jYXRpb246CisgKiBRdWFsaWZpZWQgTmFtZTogICAgIGNvbS50cmlndGVjaC5wcml2YXRlbWUuc2VydmVyLmFtLkFjdGl2aXR5U3RhY2sKKyAqIEphdmEgQ2xhc3MgVmVyc2lvbjogNiAoNTAuMCkKKyAqIEpELUNvcmUgVmVyc2lvbjogICAgMC42LjEtU05BUFNIT1QKKyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmcuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwYzAyNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nLmphdmEudHh0CkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmV4YW1wbGVzOworCisKKy8qKgorICogQSBjbGFzcyB3aXRoIHNvbWUgdW5jb21tb24gZm9ybWF0dGluZywgdG8gY2hlY2sgdGhlIGxleGljYWwgcHJlc2VydmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcworQVNpbXBsZUNsYXNzCit7CisKKyAgICBib29sZWFuIGFGaWVsZDsKKworICAgIHB1YmxpYyBBU2ltcGxlQ2xhc3MoYm9vbGVhbiBhRmllbGQpCisgICAgeworICAgICAgICB0aGlzLmFGaWVsZCA9IGFGaWVsZDsKKyAgICB9CisKKworICAgIC8vIFNvbWUgZW1wdHkgbGluZXMKKworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QUZpZWxkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhRmllbGQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDEuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0FTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZ19zdGVwMS5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U3MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDEuamF2YS50eHQKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZXhhbXBsZXM7CisKKworLyoqCisgKiBBIGNsYXNzIHdpdGggc29tZSB1bmNvbW1vbiBmb3JtYXR0aW5nLCB0byBjaGVjayB0aGUgbGV4aWNhbCBwcmVzZXJ2YXRpb24KKyAqLworcHVibGljIGNsYXNzCitNeVJlbmFtZWRDbGFzcworeworCisgICAgYm9vbGVhbiBhRmllbGQ7CisKKyAgICBwdWJsaWMgQVNpbXBsZUNsYXNzKGJvb2xlYW4gYUZpZWxkKQorICAgIHsKKyAgICAgICAgdGhpcy5hRmllbGQgPSBhRmllbGQ7CisgICAgfQorCisKKyAgICAvLyBTb21lIGVtcHR5IGxpbmVzCisKKworICAgIHB1YmxpYyBib29sZWFuIGdldEFGaWVsZCgpCisgICAgeworICAgICAgICByZXR1cm4gYUZpZWxkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAyLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDIuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjZWIyOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAyLmphdmEudHh0CkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmV4YW1wbGVzOworCisKKy8qKgorICogQSBjbGFzcyB3aXRoIHNvbWUgdW5jb21tb24gZm9ybWF0dGluZywgdG8gY2hlY2sgdGhlIGxleGljYWwgcHJlc2VydmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcworTXlSZW5hbWVkQ2xhc3MKK3sKKworICAgIGJvb2xlYW4gYUZpZWxkOworCisgICAgcHVibGljIEFTaW1wbGVDbGFzcyhib29sZWFuIGFGaWVsZCkKKyAgICB7CisgICAgICAgIHRoaXMuYUZpZWxkID0gYUZpZWxkOworICAgIH0KKworCisgICAgLy8gU29tZSBlbXB0eSBsaW5lcworCisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBRmllbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFGaWVsZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QUZpZWxkKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAzLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDMuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkNTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQVNpbXBsZUNsYXNzV2l0aE1vcmVGb3JtYXR0aW5nX3N0ZXAzLmphdmEudHh0CkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmV4YW1wbGVzOworCisKKy8qKgorICogQSBjbGFzcyB3aXRoIHNvbWUgdW5jb21tb24gZm9ybWF0dGluZywgdG8gY2hlY2sgdGhlIGxleGljYWwgcHJlc2VydmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcworTXlSZW5hbWVkQ2xhc3MKK3sKKworICAgIGJvb2xlYW4gYUZpZWxkOworCisgICAgcHVibGljIEFTaW1wbGVDbGFzcyhib29sZWFuIGFGaWVsZCkKKyAgICB7CisgICAgICAgIHRoaXMuYUZpZWxkID0gYUZpZWxkOworICAgIH0KKworCisgICAgLy8gU29tZSBlbXB0eSBsaW5lcworCisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBRmllbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFGaWVsZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QUZpZWxkKGJvb2xlYW4gYUZpZWxkKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0FTaW1wbGVDbGFzc1dpdGhNb3JlRm9ybWF0dGluZ19zdGVwNC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY1MzM0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9BU2ltcGxlQ2xhc3NXaXRoTW9yZUZvcm1hdHRpbmdfc3RlcDQuamF2YS50eHQKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIuZXhhbXBsZXM7CisKKworLyoqCisgKiBBIGNsYXNzIHdpdGggc29tZSB1bmNvbW1vbiBmb3JtYXR0aW5nLCB0byBjaGVjayB0aGUgbGV4aWNhbCBwcmVzZXJ2YXRpb24KKyAqLworcHVibGljIGNsYXNzCitNeVJlbmFtZWRDbGFzcworeworCisgICAgYm9vbGVhbiBhRmllbGQ7CisKKyAgICBwdWJsaWMgQVNpbXBsZUNsYXNzKGJvb2xlYW4gYUZpZWxkKQorICAgIHsKKyAgICAgICAgdGhpcy5hRmllbGQgPSBhRmllbGQ7CisgICAgfQorCisKKyAgICAvLyBTb21lIGVtcHR5IGxpbmVzCisKKworICAgIHB1YmxpYyBib29sZWFuIGdldEFGaWVsZCgpCisgICAgeworICAgICAgICByZXR1cm4gYUZpZWxkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRBRmllbGQoYm9vbGVhbiBhRmllbGQpIHsKKyAgICAgICAgdGhpcy5hRmllbGQgPSBhRmllbGQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTEwX2V4cGVjdGVkLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTEwX2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMTM3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMTBfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSwxMSBAQAorLy8gc29tZSBleGFtcGxlCisvKiogU3VwZXIgZXh0cmEgY29vbCB0aGlzIGFubm90YXRpb24hISEqLworcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxX2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMV9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDExIEBACisvLyBzb21lIGV4YW1wbGUKKworQGludGVyZmFjZSBOZXdOYW1lIHsKKyAgIFN0cmluZyBhdXRob3IoKTsKKyAgIFN0cmluZyBkYXRlKCk7CisgICBpbnQgY3VycmVudFJldmlzaW9uKCkgZGVmYXVsdCAxOworICAgU3RyaW5nIGxhc3RNb2RpZmllZCgpIGRlZmF1bHQgIk4vQSI7CisgICBTdHJpbmcgbGFzdE1vZGlmaWVkQnkoKSBkZWZhdWx0ICJOL0EiOworICAgLy8gTm90ZSB1c2Ugb2YgYXJyYXkKKyAgIFN0cmluZ1tdIHJldmlld2VycygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxX29yaWdpbmFsLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTFfb3JpZ2luYWwuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlYzk5YwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUxX29yaWdpbmFsLmphdmEudHh0CkBAIC0wLDAgKzEsMTEgQEAKKy8vIHNvbWUgZXhhbXBsZQorCitAaW50ZXJmYWNlIENsYXNzUHJlYW1ibGUgeworICAgU3RyaW5nIGF1dGhvcigpOworICAgU3RyaW5nIGRhdGUoKTsKKyAgIGludCBjdXJyZW50UmV2aXNpb24oKSBkZWZhdWx0IDE7CisgICBTdHJpbmcgbGFzdE1vZGlmaWVkKCkgZGVmYXVsdCAiTi9BIjsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWRCeSgpIGRlZmF1bHQgIk4vQSI7CisgICAvLyBOb3RlIHVzZSBvZiBhcnJheQorICAgU3RyaW5nW10gcmV2aWV3ZXJzKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTJfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlMl9leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRhODEzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTJfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSwxMSBAQAorLy8gc29tZSBleGFtcGxlCisKK3B1YmxpYyBAaW50ZXJmYWNlIENsYXNzUHJlYW1ibGUgeworICAgU3RyaW5nIGF1dGhvcigpOworICAgU3RyaW5nIGRhdGUoKTsKKyAgIGludCBjdXJyZW50UmV2aXNpb24oKSBkZWZhdWx0IDE7CisgICBTdHJpbmcgbGFzdE1vZGlmaWVkKCkgZGVmYXVsdCAiTi9BIjsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWRCeSgpIGRlZmF1bHQgIk4vQSI7CisgICAvLyBOb3RlIHVzZSBvZiBhcnJheQorICAgU3RyaW5nW10gcmV2aWV3ZXJzKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTNfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlM19leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVjOTljCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTNfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSwxMSBAQAorLy8gc29tZSBleGFtcGxlCisKK0BpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlM19vcmlnaW5hbC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGUzX29yaWdpbmFsLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNGE4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlM19vcmlnaW5hbC5qYXZhLnR4dApAQCAtMCwwICsxLDExIEBACisvLyBzb21lIGV4YW1wbGUKKworcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNF9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU0X2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWMwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNF9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDExIEBACisvLyBzb21lIGV4YW1wbGUKKworcHJvdGVjdGVkIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU1X2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYWFkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNV9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDEyIEBACisvLyBzb21lIGV4YW1wbGUKKworcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKKyAgIGludCBmb28oKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNl9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU2X2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTBlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlNl9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDEwIEBACisvLyBzb21lIGV4YW1wbGUKKworcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgU3RyaW5nIGxhc3RNb2RpZmllZCgpIGRlZmF1bHQgIk4vQSI7CisgICBTdHJpbmcgbGFzdE1vZGlmaWVkQnkoKSBkZWZhdWx0ICJOL0EiOworICAgLy8gTm90ZSB1c2Ugb2YgYXJyYXkKKyAgIFN0cmluZ1tdIHJldmlld2VycygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU3X2V4cGVjdGVkLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTdfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjNWE2MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU3X2V4cGVjdGVkLmphdmEudHh0CkBAIC0wLDAgKzEsMTEgQEAKKy8vIHNvbWUgZXhhbXBsZQorCitwdWJsaWMgQGludGVyZmFjZSBDbGFzc1ByZWFtYmxlIHsKKyAgIFN0cmluZyBhdXRob3IoKTsKKyAgIFN0cmluZyBkYXRlKCk7CisgICBpbnQgZm9vKCk7CisgICBTdHJpbmcgbGFzdE1vZGlmaWVkKCkgZGVmYXVsdCAiTi9BIjsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWRCeSgpIGRlZmF1bHQgIk4vQSI7CisgICAvLyBOb3RlIHVzZSBvZiBhcnJheQorICAgU3RyaW5nW10gcmV2aWV3ZXJzKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZThfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlOF9leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVmZDkzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZThfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSwxMiBAQAorLy8gc29tZSBleGFtcGxlCisKKy8qKiBDb29sIHRoaXMgYW5ub3RhdGlvbiEqLworcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlOV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvQW5ub3RhdGlvbkRlY2xhcmF0aW9uX0V4YW1wbGU5X2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGViODAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlOV9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDEwIEBACisvLyBzb21lIGV4YW1wbGUKK3B1YmxpYyBAaW50ZXJmYWNlIENsYXNzUHJlYW1ibGUgeworICAgU3RyaW5nIGF1dGhvcigpOworICAgU3RyaW5nIGRhdGUoKTsKKyAgIGludCBjdXJyZW50UmV2aXNpb24oKSBkZWZhdWx0IDE7CisgICBTdHJpbmcgbGFzdE1vZGlmaWVkKCkgZGVmYXVsdCAiTi9BIjsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWRCeSgpIGRlZmF1bHQgIk4vQSI7CisgICAvLyBOb3RlIHVzZSBvZiBhcnJheQorICAgU3RyaW5nW10gcmV2aWV3ZXJzKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTlfb3JpZ2luYWwuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0Fubm90YXRpb25EZWNsYXJhdGlvbl9FeGFtcGxlOV9vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdlZGNkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9Bbm5vdGF0aW9uRGVjbGFyYXRpb25fRXhhbXBsZTlfb3JpZ2luYWwuamF2YS50eHQKQEAgLTAsMCArMSwxMSBAQAorLy8gc29tZSBleGFtcGxlCisvKipDb29sIHRoaXMgYW5ub3RhdGlvbiEqLworcHVibGljIEBpbnRlcmZhY2UgQ2xhc3NQcmVhbWJsZSB7CisgICBTdHJpbmcgYXV0aG9yKCk7CisgICBTdHJpbmcgZGF0ZSgpOworICAgaW50IGN1cnJlbnRSZXZpc2lvbigpIGRlZmF1bHQgMTsKKyAgIFN0cmluZyBsYXN0TW9kaWZpZWQoKSBkZWZhdWx0ICJOL0EiOworICAgU3RyaW5nIGxhc3RNb2RpZmllZEJ5KCkgZGVmYXVsdCAiTi9BIjsKKyAgIC8vIE5vdGUgdXNlIG9mIGFycmF5CisgICBTdHJpbmdbXSByZXZpZXdlcnMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUxMF9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTEwX2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWRiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUxMF9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDMgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMTBfb3JpZ2luYWwuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUxMF9vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDIxMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMTBfb3JpZ2luYWwuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBhID0gMTA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTFfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjMWVlNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTFfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIHN0YXRpYyBpbnQgYTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUxX29yaWdpbmFsLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMV9vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYyYmNmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMV9vcmlnaW5hbC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgaW50IGE7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMl9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTJfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyMTI1NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTJfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBhID0gMTA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlMl9vcmlnaW5hbC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTJfb3JpZ2luYWwuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MmJjZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTJfb3JpZ2luYWwuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBhOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTNfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUzX2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjJiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUzX2V4cGVjdGVkLmphdmEudHh0CkBAIC0wLDAgKzEsNCBAQAorLy8gVGhpcyBpcyBteSBjbGFzcywgd2l0aCBteSBjb21tZW50CitjbGFzcyBBIHsKKyAgICBpbnQgYTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGUzX29yaWdpbmFsLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlM19vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDIxMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlM19vcmlnaW5hbC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgaW50IGEgPSAxMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU0X29yaWdpbmFsLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNF9vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ2NTFkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNF9vcmlnaW5hbC5qYXZhLnR4dApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Ob2RlOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuYm9keS5Cb2R5RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLkFubm90YXRpb25FeHByOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmltcG9ydHMuSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10LkJsb2NrU3RtdDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QudHlwZS5DbGFzc09ySW50ZXJmYWNlVHlwZTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworCitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5QYXJzZVN0YXJ0Lio7CitpbXBvcnQgc3RhdGljIGNvbS5naXRodWIuamF2YXBhcnNlci5Qcm92aWRlcnMuVVRGODsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5wcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLlByb3ZpZGVycy5yZXNvdXJjZVByb3ZpZGVyOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBQYXJzZSBKYXZhIHNvdXJjZSBjb2RlIGFuZCBjcmVhdGVzIEFic3RyYWN0IFN5bnRheCBUcmVlcy4KKyAqCisgKiBAYXV0aG9yIErDumxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXZhUGFyc2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhUGFyc2VyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBKYXZhUGFyc2VyKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbW1lbnRzSW5zZXJ0ZXIgY29tbWVudHNJbnNlcnRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIHByaXZhdGUgQVNUUGFyc2VyIGFzdFBhcnNlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgcGFyc2VyIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLiBOb3RlIHRoYXQgcGFyc2luZyBjYW4gYWxzbyBiZSBkb25lIHdpdGggdGhlIHN0YXRpYyBtZXRob2RzIG9uCisgICAgICogdGhpcyBjbGFzcy4KKyAgICAgKiBDcmVhdGluZyBhbiBpbnN0YW5jZSB3aWxsIHJlZHVjZSBzZXR1cCB0aW1lIGJldHdlZW4gcGFyc2luZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YVBhcnNlcigpIHsKKyAgICAgICAgdGhpcyhuZXcgUGFyc2VyQ29uZmlndXJhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSB0aGUgcGFyc2VyLiBOb3RlIHRoYXQgcGFyc2luZyBjYW4gYWxzbyBiZSBkb25lIHdpdGggdGhlIHN0YXRpYyBtZXRob2RzIG9uIHRoaXMgY2xhc3MuCisgICAgICogQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugd2lsbCByZWR1Y2Ugc2V0dXAgdGltZSBiZXR3ZWVuIHBhcnNpbmcgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIEphdmFQYXJzZXIoUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgICAgIGNvbW1lbnRzSW5zZXJ0ZXIgPSBuZXcgQ29tbWVudHNJbnNlcnRlcihjb25maWd1cmF0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFTVFBhcnNlciBnZXRQYXJzZXJGb3JQcm92aWRlcihQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBpZiAoYXN0UGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFzdFBhcnNlciA9IG5ldyBBU1RQYXJzZXIocHJvdmlkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXN0UGFyc2VyLnJlc2V0KHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgICAgICBhc3RQYXJzZXIuc2V0VGFiU2l6ZShjb25maWd1cmF0aW9uLmdldFRhYlNpemUoKSk7CisgICAgICAgIHJldHVybiBhc3RQYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHNvdXJjZSBjb2RlLgorICAgICAqIEl0IHRha2VzIHRoZSBzb3VyY2UgY29kZSBmcm9tIGEgUHJvdmlkZXIuCisgICAgICogVGhlIHN0YXJ0IGluZGljYXRlcyB3aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUgKGNvbXBpbGF0aW9uIHVuaXQsIGJsb2NrLCBpbXBvcnQuLi4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnQgcmVmZXIgdG8gdGhlIGNvbnN0YW50cyBpbiBQYXJzZVN0YXJ0IHRvIHNlZSB3aGF0IGNhbiBiZSBwYXJzZWQuCisgICAgICogQHBhcmFtIHByb3ZpZGVyIHJlZmVyIHRvIFByb3ZpZGVycyB0byBzZWUgaG93IHlvdSBjYW4gcmVhZCBzb3VyY2UuCisgICAgICogQHBhcmFtIDxOPiB0aGUgc3ViY2xhc3Mgb2YgTm9kZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgcGFyc2luZyBpbiB0aGUgc3RhcnQuCisgICAgICogQHJldHVybiB0aGUgcGFyc2UgcmVzdWx0LCBhIGNvbGxlY3Rpb24gb2YgZW5jb3VudGVyZWQgcHJvYmxlbXMsIGFuZCBzb21lIGV4dHJhIGRhdGEuCisgICAgICovCisgICAgcHVibGljIDxOIGV4dGVuZHMgTm9kZT4gUGFyc2VSZXN1bHQ8Tj4gcGFyc2UoUGFyc2VTdGFydDxOPiBzdGFydCwgUHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdGFydCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJvdmlkZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQVNUUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlckZvclByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIE4gcmVzdWx0Tm9kZSA9IHN0YXJ0LnBhcnNlKHBhcnNlcik7CisgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc0F0dHJpYnV0ZUNvbW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb21tZW50c0NvbGxlY3Rpb24gY29tbWVudHMgPSBwYXJzZXIuZ2V0Q29tbWVudHNDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgY29tbWVudHNJbnNlcnRlci5pbnNlcnRDb21tZW50cyhyZXN1bHROb2RlLCBjb21tZW50cy5jb3B5KCkuZ2V0Q29tbWVudHMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VSZXN1bHQ8PihyZXN1bHROb2RlLCBwYXJzZXIucHJvYmxlbXMsIHBhcnNlci5nZXRUb2tlbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldENvbW1lbnRzQ29sbGVjdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VSZXN1bHQ8PihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvdmlkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSdyZSBkb25lIHBhcnNpbmcgYW5kIGhhdmUgb3VyIHJlc3VsdCwgd2UgZG9uJ3QgY2FyZSBhYm91dCBhbnkgZXJyb3JzLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4ge0BsaW5rIElucHV0U3RyZWFtfSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4sIENoYXJzZXQgZW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihpbiwgZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gdGhlIHtAbGluayBJbnB1dFN0cmVhbX0gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICogTm90ZTogVXNlcyBVVEYtOCBlbmNvZGluZworICAgICAqCisgICAgICogQHBhcmFtIGluIHtAbGluayBJbnB1dFN0cmVhbX0gY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGluLCBVVEY4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSB7QGxpbmsgRmlsZX0gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHtAbGluayBGaWxlfSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gdGhlIGZpbGUgd2FzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgQ2hhcnNldCBlbmNvZGluZykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIoZmlsZSwgZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSB7QGxpbmsgRmlsZX0gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICogTm90ZTogVXNlcyBVVEYtOCBlbmNvZGluZworICAgICAqCisgICAgICogQHBhcmFtIGZpbGUge0BsaW5rIEZpbGV9IGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHRoZSBmaWxlIHdhcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSBmaWxlIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIGEgZmlsZSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgYWNjZXNzZWQKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShmaW5hbCBQYXRoIHBhdGgsIGZpbmFsIENoYXJzZXQgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcHJvdmlkZXIocGF0aCwgZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSBmaWxlIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuPGJyPgorICAgICAqIE5vdGU6IFVzZXMgVVRGLTggZW5jb2RpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHBhdGggdG8gYSBmaWxlIGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhlIHBhdGggY291bGQgbm90IGJlIGFjY2Vzc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgUGF0aCBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKHBhdGgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSByZXNvdXJjZSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0Ljxicj4KKyAgICAgKiBOb3RlOiBVc2VzIFVURi04IGVuY29kaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIGEgcmVzb3VyY2UgY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlLiBBcyByZXNvdXJjZSBpcworICAgICAqIGFjY2Vzc2VkIHRocm91Z2ggYSBjbGFzcyBsb2FkZXIsIGEgbGVhZGluZyAiLyIgaXMgbm90IGFsbG93ZWQgaW4gcGF0aFRvUmVzb3VyY2UKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRpbmcgdGhlIEphdmEgc291cmNlIGNvZGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRoZSBwYXRoIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlUmVzb3VyY2UoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcmVzb3VyY2VQcm92aWRlcihwYXRoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGNvZGUgY29udGFpbmVkIGluIGEgcmVzb3VyY2UgYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIGEgcmVzb3VyY2UgY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlLiBBcyByZXNvdXJjZSBpcworICAgICAqIGFjY2Vzc2VkIHRocm91Z2ggYSBjbGFzcyBsb2FkZXIsIGEgbGVhZGluZyAiLyIgaXMgbm90IGFsbG93ZWQgaW4gcGF0aFRvUmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgYWNjZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZVJlc291cmNlKGZpbmFsIFN0cmluZyBwYXRoLCBDaGFyc2V0IGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHJlc291cmNlUHJvdmlkZXIocGF0aCwgZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIEphdmEgY29kZSBjb250YWluZWQgaW4gYSByZXNvdXJjZSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gdGhhdCByZXByZXNlbnRzIGl0Ljxicj4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciB0aGUgY2xhc3NMb2FkZXIgdGhhdCBpcyBhc2tlZCB0byBsb2FkIHRoZSByZXNvdXJjZQorICAgICAqIEBwYXJhbSBwYXRoIHBhdGggdG8gYSByZXNvdXJjZSBjb250YWluaW5nIEphdmEgc291cmNlIGNvZGUuIEFzIHJlc291cmNlIGlzCisgICAgICogYWNjZXNzZWQgdGhyb3VnaCBhIGNsYXNzIGxvYWRlciwgYSBsZWFkaW5nICIvIiBpcyBub3QgYWxsb3dlZCBpbiBwYXRoVG9SZXNvdXJjZQorICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGluZyB0aGUgSmF2YSBzb3VyY2UgY29kZQorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhlIHBhdGggY291bGQgbm90IGJlIGFjY2Vzc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2VSZXNvdXJjZShmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgZmluYWwgU3RyaW5nIHBhdGgsIENoYXJzZXQgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ09NUElMQVRJT05fVU5JVCwgcmVzb3VyY2VQcm92aWRlcihjbGFzc0xvYWRlciwgcGF0aCwgZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgSmF2YSBjb2RlIGZyb20gYSBSZWFkZXIgYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBDb21waWxhdGlvblVuaXR9IHRoYXQgcmVwcmVzZW50cyBpdC48YnI+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgY29udGFpbmluZyBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoZmluYWwgUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKENPTVBJTEFUSU9OX1VOSVQsIHByb3ZpZGVyKHJlYWRlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBjb2RlIGNvbnRhaW5lZCBpbiBjb2RlIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHJldHVybiBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHNvdXJjZSBjb2RlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgcGFyc2UoU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDT01QSUxBVElPTl9VTklULCBwcm92aWRlcihjb2RlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKYXZhIGJsb2NrIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQmxvY2tTdG10fSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmxvY2tTdGF0ZW1lbnQge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGJsb2NrIGNvZGUKKyAgICAgKiBAcmV0dXJuIEJsb2NrU3RtdCByZXByZXNlbnRpbmcgdGhlIEphdmEgYmxvY2sKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJsb2NrU3RtdCBwYXJzZUJsb2NrKGZpbmFsIFN0cmluZyBibG9ja1N0YXRlbWVudCkgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKEJMT0NLLCBwcm92aWRlcihibG9ja1N0YXRlbWVudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBzdGF0ZW1lbnQgY29udGFpbmVkIGluIGEge0BsaW5rIFN0cmluZ30gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBTdGF0ZW1lbnR9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZW1lbnQge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIHN0YXRlbWVudCBjb2RlCisgICAgICogQHJldHVybiBTdGF0ZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHN0YXRlbWVudAorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RhdGVtZW50IHBhcnNlU3RhdGVtZW50KGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShTVEFURU1FTlQsIHByb3ZpZGVyKHN0YXRlbWVudCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgTm9kZT4gVCBzaW1wbGlmaWVkUGFyc2UoUGFyc2VTdGFydDxUPiBjb250ZXh0LCBQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBQYXJzZVJlc3VsdDxUPiByZXN1bHQgPSBkZWZhdWx0SW5zdGFuY2UucGFyc2UoY29udGV4dCwgcHJvdmlkZXIpOworICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2Vzc2Z1bCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldFJlc3VsdCgpLmdldCgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBQYXJzZVByb2JsZW1FeGNlcHRpb24ocmVzdWx0LmdldFByb2JsZW1zKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBpbXBvcnQgY29udGFpbmVkIGluIGEge0BsaW5rIFN0cmluZ30gYW5kIHJldHVybnMgYQorICAgICAqIHtAbGluayBJbXBvcnREZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGltcG9ydERlY2xhcmF0aW9uIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBpbXBvcnQgY29kZQorICAgICAqIEByZXR1cm4gSW1wb3J0RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGltcG9ydCBkZWNsYXJhdGlvbgorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW1wb3J0RGVjbGFyYXRpb24gcGFyc2VJbXBvcnQoZmluYWwgU3RyaW5nIGltcG9ydERlY2xhcmF0aW9uKSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoSU1QT1JUX0RFQ0xBUkFUSU9OLCBwcm92aWRlcihpbXBvcnREZWNsYXJhdGlvbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBleHByZXNzaW9uIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgRXhwcmVzc2lvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24ge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGV4cHJlc3Npb24KKyAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGV4cHJlc3Npb24KKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRXhwcmVzc2lvbj4gVCBwYXJzZUV4cHJlc3Npb24oZmluYWwgU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgcmV0dXJuIChUKSBzaW1wbGlmaWVkUGFyc2UoRVhQUkVTU0lPTiwgcHJvdmlkZXIoZXhwcmVzc2lvbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBhbm5vdGF0aW9uIGNvbnRhaW5lZCBpbiBhIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQW5ub3RhdGlvbkV4cHJ9IHRoYXQgcmVwcmVzZW50cyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHtAbGluayBTdHJpbmd9IGNvbnRhaW5pbmcgSmF2YSBhbm5vdGF0aW9uCisgICAgICogQHJldHVybiBBbm5vdGF0aW9uRXhwciByZXByZXNlbnRpbmcgdGhlIEphdmEgYW5ub3RhdGlvbgorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkV4cHIgcGFyc2VBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uKSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQU5OT1RBVElPTiwgcHJvdmlkZXIoYW5ub3RhdGlvbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgSmF2YSBhbm5vdGF0aW9uIGJvZHkgZGVjbGFyYXRpb24oZS5nIGZpZWxkcyBvciBtZXRob2RzKSBjb250YWluZWQgaW4gYQorICAgICAqIHtAbGluayBTdHJpbmd9IGFuZCByZXR1cm5zIGEge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGJvZHkge0BsaW5rIFN0cmluZ30gY29udGFpbmluZyBKYXZhIGJvZHkgZGVjbGFyYXRpb24KKyAgICAgKiBAcmV0dXJuIEJvZHlEZWNsYXJhdGlvbiByZXByZXNlbnRpbmcgdGhlIEphdmEgYW5ub3RhdGlvbgorICAgICAqIEB0aHJvd3MgUGFyc2VQcm9ibGVtRXhjZXB0aW9uIGlmIHRoZSBzb3VyY2UgY29kZSBoYXMgcGFyc2VyIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQm9keURlY2xhcmF0aW9uPD8+IHBhcnNlQW5ub3RhdGlvbkJvZHlEZWNsYXJhdGlvbihmaW5hbCBTdHJpbmcgYm9keSkgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKEFOTk9UQVRJT05fQk9EWSwgcHJvdmlkZXIoYm9keSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIEphdmEgY2xhc3MgYm9keSBkZWNsYXJhdGlvbihlLmcgZmllbGRzIG9yIG1ldGhvZHMpIGFuZCByZXR1cm5zIGEKKyAgICAgKiB7QGxpbmsgQm9keURlY2xhcmF0aW9ufSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9keSB0aGUgYm9keSBvZiBhIGNsYXNzCisgICAgICogQHJldHVybiBCb2R5RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGNsYXNzIGJvZHkKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJvZHlEZWNsYXJhdGlvbjw/PiBwYXJzZUNsYXNzQm9keURlY2xhcmF0aW9uKFN0cmluZyBib2R5KSB7CisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkUGFyc2UoQ0xBU1NfQk9EWSwgcHJvdmlkZXIoYm9keSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIEphdmEgaW50ZXJmYWNlIGJvZHkgZGVjbGFyYXRpb24oZS5nIGZpZWxkcyBvciBtZXRob2RzKSBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIEJvZHlEZWNsYXJhdGlvbn0gdGhhdCByZXByZXNlbnRzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGJvZHkgdGhlIGJvZHkgb2YgYW4gaW50ZXJmYWNlCisgICAgICogQHJldHVybiBCb2R5RGVjbGFyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBKYXZhIGludGVyZmFjZSBib2R5CisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCb2R5RGVjbGFyYXRpb24gcGFyc2VJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24oU3RyaW5nIGJvZHkpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShJTlRFUkZBQ0VfQk9EWSwgcHJvdmlkZXIoYm9keSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIEphdmEgdHlwZSBuYW1lIGFuZCByZXR1cm5zIGEge0BsaW5rIENsYXNzT3JJbnRlcmZhY2VUeXBlfSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBuYW1lIGxpa2UgYS5iLmMuWCBvciBZCisgICAgICogQHJldHVybiBDbGFzc09ySW50ZXJmYWNlVHlwZSByZXByZXNlbnRpbmcgdGhlIHR5cGUKKyAgICAgKiBAdGhyb3dzIFBhcnNlUHJvYmxlbUV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGNvZGUgaGFzIHBhcnNlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzT3JJbnRlcmZhY2VUeXBlIHBhcnNlQ2xhc3NPckludGVyZmFjZVR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRQYXJzZShDTEFTU19PUl9JTlRFUkZBQ0VfVFlQRSwgcHJvdmlkZXIodHlwZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGV4cHJlc3Npb24gYW5kIHJldHVybnMgYSB7QGxpbmsgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5leHByLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByfSB0aGF0IHJlcHJlc2VudHMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVjbGFyYXRpb24gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBsaWtlIDxjb2RlPmludCB4PTI7PC9jb2RlPgorICAgICAqIEByZXR1cm4gVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgcmVwcmVzZW50aW5nIHRoZSB0eXBlCisgICAgICogQHRocm93cyBQYXJzZVByb2JsZW1FeGNlcHRpb24gaWYgdGhlIHNvdXJjZSBjb2RlIGhhcyBwYXJzZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25FeHByKFN0cmluZyBkZWNsYXJhdGlvbikgeworICAgICAgICByZXR1cm4gc2ltcGxpZmllZFBhcnNlKFZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFIsIHByb3ZpZGVyKGRlY2xhcmF0aW9uKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTVfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhNTQyMAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTVfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBhID0gbnVsbDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU1X29yaWdpbmFsLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNV9vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDIxMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNV9vcmlnaW5hbC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgaW50IGEgPSAxMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU2X2V4cGVjdGVkLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNl9leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWE3OWZlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNl9leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgaW50IHNvbWVPdGhlck5hbWUgPSAxMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU2X29yaWdpbmFsLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNl9vcmlnaW5hbC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDIxMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlNl9vcmlnaW5hbC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgaW50IGEgPSAxMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU3X2V4cGVjdGVkLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlN19leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE3ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlN19leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgaW50W10gYSA9IDEwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTdfb3JpZ2luYWwuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU3X29yaWdpbmFsLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMjEyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU3X29yaWdpbmFsLmphdmEudHh0CkBAIC0wLDAgKzEsNCBAQAorLy8gVGhpcyBpcyBteSBjbGFzcywgd2l0aCBteSBjb21tZW50CitjbGFzcyBBIHsKKyAgICBpbnQgYSA9IDEwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZThfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU4X2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjczNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU4X2V4cGVjdGVkLmphdmEudHh0CkBAIC0wLDAgKzEsNCBAQAorLy8gVGhpcyBpcyBteSBjbGFzcywgd2l0aCBteSBjb21tZW50CitjbGFzcyBBIHsKKyAgICBpbnQgYSA9IDEwLCBiOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZThfb3JpZ2luYWwuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU4X29yaWdpbmFsLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMjEyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU4X29yaWdpbmFsLmphdmEudHh0CkBAIC0wLDAgKzEsNCBAQAorLy8gVGhpcyBpcyBteSBjbGFzcywgd2l0aCBteSBjb21tZW50CitjbGFzcyBBIHsKKyAgICBpbnQgYSA9IDEwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTlfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU5X2V4cGVjdGVkLmphdmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzgxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGU5X2V4cGVjdGVkLmphdmEudHh0CkBAIC0wLDAgKzEsNCBAQAorLy8gVGhpcyBpcyBteSBjbGFzcywgd2l0aCBteSBjb21tZW50CitjbGFzcyBBIHsKKyAgICBpbnQgYSA9IDEwLCBiW107Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlOV9vcmlnaW5hbC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTlfb3JpZ2luYWwuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyMTI1NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZTlfb3JpZ2luYWwuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBhID0gMTA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtMV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTFfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3YzRhMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTFfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIHZvaWQgZm9vKGludCBwMSkgeyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtMV9vcmlnaW5hbC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTFfb3JpZ2luYWwuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwZjU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTFfb3JpZ2luYWwuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIHZvaWQgZm9vKCkgeyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtMl9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTJfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhODVlNwotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTJfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIHZvaWQgZm9vKGludFtdIHAxLCBjaGFyIHAyKSB7IH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGVfcGFyYW0zX2V4cGVjdGVkLmphdmEudHh0IGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtM19leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGM4NjZhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtM19leHBlY3RlZC5qYXZhLnR4dApAQCAtMCwwICsxLDQgQEAKKy8vIFRoaXMgaXMgbXkgY2xhc3MsIHdpdGggbXkgY29tbWVudAorY2xhc3MgQSB7CisgICAgdm9pZCBmb28oY2hhciBwMikgeyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtM19vcmlnaW5hbC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTNfb3JpZ2luYWwuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzM2JkOQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTNfb3JpZ2luYWwuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIHZvaWQgZm9vKGludCBwMSwgY2hhciBwMikgeyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtNF9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTRfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3YzRhMQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTRfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIHZvaWQgZm9vKGludCBwMSkgeyB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtNV9leHBlY3RlZC5qYXZhLnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTVfZXhwZWN0ZWQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4M2UxMgotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvRXhhbXBsZV9wYXJhbTVfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw2IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBmb28oaW50IHAxLCBjaGFyIHAyKSB7CisgICAgICAgIHJldHVybiBwMTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtNWJfZXhwZWN0ZWQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL0V4YW1wbGVfcGFyYW01Yl9leHBlY3RlZC5qYXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTNhNGZhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvbGV4aWNhbF9wcmVzZXJ2YXRpb25fc2FtcGxlcy9FeGFtcGxlX3BhcmFtNWJfZXhwZWN0ZWQuamF2YS50eHQKQEAgLTAsMCArMSw0IEBACisvLyBUaGlzIGlzIG15IGNsYXNzLCB3aXRoIG15IGNvbW1lbnQKK2NsYXNzIEEgeworICAgIGludCBmb28oaW50IHAxLCBjaGFyIHAyKSB7IH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL01ldGhvZFdpdGhPbmVTdGF0ZW1lbnQuamF2YS50eHQgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9sZXhpY2FsX3ByZXNlcnZhdGlvbl9zYW1wbGVzL01ldGhvZFdpdGhPbmVTdGF0ZW1lbnQuamF2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYjk1NQotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL2xleGljYWxfcHJlc2VydmF0aW9uX3NhbXBsZXMvTWV0aG9kV2l0aE9uZVN0YXRlbWVudC5qYXZhLnR4dApAQCAtMCwwICsxLDUgQEAKK2NsYXNzIEEgeworICAgIHB1YmxpYyB2b2lkIHNvbWVNZXRob2QoKSB7CisgICAgICAgIFN0cmluZyB0ZXN0ID0gIiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9KYXZhQ29uY2VwdHNfcHJldHR5cHJpbnRlZCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvSmF2YUNvbmNlcHRzX3ByZXR0eXByaW50ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzZDhlNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvSmF2YUNvbmNlcHRzX3ByZXR0eXByaW50ZWQKQEAgLTAsMCArMSwzOTUgQEAKK3BhY2thZ2UgamFwYS5iZGQuc2FtcGxlczsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5KYXZhUGFyc2VyOworaW1wb3J0IGphcGEucGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitASWdub3JlCitARGVwcmVjYXRlZAorcHVibGljIGNsYXNzIEphdmFDb25jZXB0czxUIGV4dGVuZHMgTGlzdDxpbnRbXT4sIFg+IGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBzdGF0aWMgQ2xhc3MgY2x6MSA9IFN0cmluZy5jbGFzczsKKworICAgIHByb3RlY3RlZCBDbGFzcyBjbHoyID0gKFN0cmluZy5jbGFzcyk7CisKKyAgICBDbGFzcyBjbHozID0gaW50LmNsYXNzOworCisgICAgQ2xhc3MgY2x6NCA9IChpbnQuY2xhc3MpOworCisgICAgaW50W10gYXJyID0gbmV3IGludFsxMF07CisKKyAgICBieXRlIGJ5ZSA9IDA7CisKKyAgICBieXRlW10gYnllYnllID0gbnVsbDsKKworICAgIHNob3J0IHNoMSwgc2gyID0gMTsKKworICAgIGludCBpbnRXaXRoVW5kZXJzY29yZSA9IDEyMzRfNTY3ODsKKworICAgIGxvbmcgbG9uZ1dpdGhVbmRlcnNjb3JlID0gMTIzNF81Njc4TDsKKworICAgIGZsb2F0IGZsb2F0V2l0aFVuZGVyc2NvcmUgPSAxXzIzNC41XzY3OGY7CisKKyAgICBmbG9hdCBmbG9hdFdpdGhVbmRlcnNjb3JlQW5kRXhwb25lbnQgPSAxXzIzNGUxXzBmOworCisgICAgZG91YmxlIGRvdWJsZVdpdGhVbmRlcnNjb3JlID0gMV8yMzQuNV82Nzg7CisKKyAgICBkb3VibGUgZG91YmxlV2l0aFVuZGVyc2NvcmVBbmRFeHBvbmVudCA9IDFfMjM0ZTFfMDsKKworICAgIGludCBiaW5hcnlMaXRlcmFsID0gMGIxMDExMDE7CisKKyAgICBMaXN0PFN0cmluZz5bXVtdIGFyckxTID0gKExpc3Q8U3RyaW5nPltdW10pIG5ldyBMaXN0PD8+WzEwXVtdOworCisgICAgeworICAgICAgICBpbnQgeiA9IDAsIHkgPSAwOworICAgICAgICBpbnQgYSA9ICh6KSArIHk7CisgICAgICAgIGEgPSAoK3opICsgeTsKKyAgICAgICAgYnl0ZSBiID0gKGJ5dGUpICt5OworICAgIH0KKworICAgIExpc3Q8U3RyaW5nPiBkaWFtb25kMSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgIEBEZXByZWNhdGVkKCkKKyAgICBzdGF0aWMgY2xhc3MgVWdseSB7CisKKyAgICAgICAgc3RhdGljIGludCB4ID0gMDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgICAgICB4ID0gK3g7CisgICAgICAgICAgICB4ID0gfng7CisgICAgICAgICAgICAtLXg7CisgICAgICAgICAgICBib29sZWFuIGIgPSAhZmFsc2U7CisgICAgICAgICAgICB4ICY9IDI7CisgICAgICAgICAgICB4IHw9IDI7CisgICAgICAgICAgICB4IF49IDI7CisgICAgICAgICAgICB4IC09IDI7CisgICAgICAgICAgICB4ICU9IDI7CisgICAgICAgICAgICB4IC89IDI7CisgICAgICAgICAgICB4ICo9IDI7CisgICAgICAgICAgICB4IDw8PSAyOworICAgICAgICAgICAgeCA+Pj0gMjsKKyAgICAgICAgICAgIHggPj4+PSAyOworICAgICAgICAgICAgYiA9IGIgfHwgZmFsc2U7CisgICAgICAgICAgICBiID0gYiB8IGZhbHNlOworICAgICAgICAgICAgYiA9IGIgJiBmYWxzZTsKKyAgICAgICAgICAgIGIgPSBiIF4gZmFsc2U7CisgICAgICAgICAgICBiID0gYiAhPSBmYWxzZTsKKyAgICAgICAgICAgIGIgPSB4ID4gMTsKKyAgICAgICAgICAgIGIgPSB4IDwgMTsKKyAgICAgICAgICAgIGIgPSB4ID49IDE7CisgICAgICAgICAgICBiID0geCA8PSAxOworICAgICAgICAgICAgeCA9IHggPDwgMTsKKyAgICAgICAgICAgIHggPSB4ID4+IDE7CisgICAgICAgICAgICB4ID0geCA+Pj4gMTsKKyAgICAgICAgICAgIHggPSB4IC0gMTsKKyAgICAgICAgICAgIHggPSB4ICogMTsKKyAgICAgICAgICAgIHggPSB4ICUgMTsKKyAgICAgICAgICAgIHggPSB4IC8gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBEZXByZWNhdGVkKCkKKyAgICBpbnRbXVtdW11bXSBhcnIyID0gbmV3IGludFsxMF1bMl1bMV1bMF07CisKKyAgICB2b2xhdGlsZSBmbG9hdCBmZmYgPSAweDEuZmZmZVArMTI3ZjsKKworICAgIGNoYXIgY2MgPSAnYSc7CisKKyAgICBpbnRbXVtdIGFycjMgPSB7IHsgMSwgMiB9LCB7IDMsIDQgfSB9OworCisgICAgc3RhdGljIGludFtdW10gYXJyNCA9IHt9OworCisgICAgcHVibGljIHN0YXRpYyBKYXZhQ29uY2VwdHMgdDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGFycjQgPSBuZXcgaW50W11bXSB7IHsgMiB9LCB7IDEgfSB9OworICAgIH0KKworICAgIHsKKyAgICAgICAgYXJyMyA9IG5ldyBpbnRbXVtdIHsgeyAyIH0sIHsgMSB9IH07CisgICAgfQorCisgICAgcHVibGljIGVudW0gVGVzdGUgeworCisgICAgICAgIGFzYywgZGVmCisgICAgfQorCisgICAgcHVibGljIGVudW0gU2V4byB7CisKKyAgICAgICAgbSwgQERlcHJlY2F0ZWQKKyAgICAgICAgZjsKKworICAgICAgICBwdWJsaWMgZW51bSBTZXhvXyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXhvKCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgZW51bSBFbnVtIHsKKworICAgICAgICBtKDEpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICB2b2lkIG1tKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICwgZigyKSB7CisKKyAgICAgICAgICAgIHZvaWQgbW0oKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgOworCisgICAgICAgIG5hdGl2ZSB2b2lkIG5ubigpOworCisgICAgICAgIHRyYW5zaWVudCBpbnQgeDsKKworICAgICAgICBwcml2YXRlIEVudW0oaW50IHgpIHsKKyAgICAgICAgICAgIHRoaXMueCA9IHg7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCB2b2lkIG1tKCk7CisgICAgfQorCisgICAgc3RyaWN0ZnAgZG91YmxlIGRkZCgpIHsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQsIEU+IEphdmFDb25jZXB0cyhpbnQgeCkgeworICAgICAgICB0aGlzLmFyclswXSA9IHg7CisgICAgICAgIFQgdmFsMSA9IG51bGw7CisgICAgICAgIEUgdmFsMiA9IG51bGw7CisgICAgICAgIHN1cGVyLjxULCBFPmNoZWNrMih2YWwxLCB2YWwyKTsKKyAgICAgICAgYm9vbGVhbiBiID0gdHJ1ZSwgeSA9IGZhbHNlOworICAgICAgICBhYnN0cmFjdCBjbGFzcyBYIHsKKworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICBwdWJsaWMgPEQ+IFgoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG0oKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgZmluYWwgY2xhc3MgWSBleHRlbmRzIFggeworCisgICAgICAgICAgICBwdWJsaWMgWSgpIHsKKyAgICAgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgICAgIEphdmFDb25jZXB0cy50aGlzLmNjID0gJ2MnOworICAgICAgICAgICAgICAgIHN1cGVyLmkgPSAxOworICAgICAgICAgICAgICAgIFkuc3VwZXIubSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWShpbnQgeSkgeworICAgICAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBZKGxvbmcgeCkgeworICAgICAgICAgICAgICAgIHRoaXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gSmF2YUNvbmNlcHRzKFN0cmluZyBzdHIpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFFXRSBleHRlbmRzIEphdmFDb25jZXB0czxMaXN0PGludFtdPiwgU3RyaW5nPiB7CisKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgZmluYWwgaW50IHogPSAwOworCisgICAgICAgIGludCBpID0gKGludCkgLTE7CisKKyAgICAgICAgcHVibGljIFFXRShTdHJpbmcuLi4geCkgeworICAgICAgICAgICAgPFN0cmluZz5zdXBlcih4WzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRV0UoaW50Li4uIHgpIHsKKyAgICAgICAgICAgIHN1cGVyKHhbMF0pOworICAgICAgICAgICAgaSA9IHhbMF07CisgICAgICAgICAgICBhc3NlcnQgdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydCAxID09IDEgOiAyOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpaWkgPSAzOworICAgICAgICAgICAgICAgIGlpaSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFiZWw6IHsKKyAgICAgICAgICAgICAgICBpbnQgaWlpID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGludCBtaW4gPSAtMjE0NzQ4MzY0ODsKKyAgICAgICAgICAgIGxvbmcgc2wgPSAxMjMxMjMxMjMxMjNsOworICAgICAgICAgICAgbG9uZyBtaW5sID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDhMOworICAgICAgICAgICAgc3dpdGNoKGkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxsOiBzd2l0Y2goaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEpOworICAgICAgICAgICAgICAgICAgICBicmVhayBsbDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludFtdIGRvU29tZXRoaW5nKCkgeworICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiB4ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IDEgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgeCA9IDI7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjdSA9IHBhcnNlKG5ldyBGaWxlKCJzcmMvamFwYS9wYXJzZXIvamF2YWNjL1BhcnNlci5qYXZhIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY3UpOworICAgICAgICBKYXZhQ29uY2VwdHMgdGVzdGUgPSBuZXcgSmF2YUNvbmNlcHRzKDIpOworICAgICAgICBKYXZhQ29uY2VwdHMuUVdFIHF3ZSA9IHRlc3RlLm5ldyBRV0UoMSk7CisgICAgICAgIGlmICgxICsgMSA9PSAyKSB7CisgICAgICAgICAgICB0ZXN0ZSA9IG51bGw7CisgICAgICAgICAgICB0ZXN0ZSA9IG5ldyBKYXZhQ29uY2VwdHMoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgICAgIHRlc3RlID0gbmV3IEphdmFDb25jZXB0cygxKTsKKyAgICAgICAgICAgIHggPSB4ID09IDAgPyAyIDogNDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJ1ZSkKKyAgICAgICAgICAgIHggPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgZWxzZSBpZiAoZmFsc2UpCisgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCA9IDI7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB4eHg6IHdoaWxlICh4ID09IDMpIGNvbnRpbnVlIHh4eDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHgrKzsKKyAgICAgICAgfSB3aGlsZSAoeCA8IDEwMCk7CisgICAgICAgIGRvIHgrKzsgd2hpbGUgKHggPCAxMDApOworICAgICAgICBmb3IgKEBEZXByZWNhdGVkIGludCBpIDogYXJyNFswXSkgeworICAgICAgICAgICAgeC0tOworICAgICAgICB9CisgICAgICAgIGZvciAoQERlcHJlY2F0ZWQgZmluYWwgaW50IGkgPSAwLCBqID0gMTsgaSA8IDEwOyB4KyspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBpLCBqOworICAgICAgICBmb3IgKGkgPSAwLCBqID0gMTsgaSA8IDEwICYmIGogPCAyOyBpKyssIGotLSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBwYXJzZShARGVwcmVjYXRlZCBGaWxlIGZpbGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYSA9ICgoU3RyaW5nKSAicXdlIik7CisgICAgICAgIFN0cmluZyB4ID0gKChTdHJpbmcpIGNsejEuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IHkgPSAoKEludGVnZXIpIChPYmplY3QpIHgpLmludFZhbHVlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoZmlsZSkgeworICAgICAgICAgICAgZmlsZSA9IG51bGw7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIiIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJibGFoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbmFsbHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmxhaCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaW5hbGx5Iik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImJsYWgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhdGNoIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluMiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3aGF0ZXZlciIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIHwgRXJyb3IgZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlKGZpbGUpOworICAgIH0KKworICAgIGNsYXNzIEE8VCBleHRlbmRzIEludGVnZXIgJiBTZXJpYWxpemFibGU+IGltcGxlbWVudHMgWFhYLCBTZXJpYWxpemFibGUgeworCisgICAgICAgIHB1YmxpYyA8QUJDPiBBKEludGVnZXIgaW50ZWdlciwgQUJDIHN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSA8WT4gdm9pZCB4KE1hcDw/IGV4dGVuZHMgWCwgPyBzdXBlciBUPiB4KSB7CisgICAgICAgIEBEZXByZWNhdGVkIENvbXBhcmF0b3IgYyA9IG5ldyBDb21wYXJhdG9yKCkgeworCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBPEludGVnZXI+IGEgPSBuZXcgPFN0cmluZz4gQTxJbnRlZ2VyPihuZXcgSW50ZWdlcigxMSksICJmb28iKSB7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obnVsbCk7CisgICAgfQorfQorCitjbGFzcyBCYXNlIHsKKworICAgIHB1YmxpYyA8QSwgQj4gdm9pZCBjaGVjazIoQSB2YWwxLCBCIHZhbDIpIHsKKyAgICB9Cit9CisKK2ludGVyZmFjZSBYWFggZXh0ZW5kcyBTZXJpYWxpemFibGUsIENsb25lYWJsZSB7Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50VmlzaXRvcl9wcmV0dHlwcmludGVkIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludFZpc2l0b3JfcHJldHR5cHJpbnRlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDA0OGNmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9QcmV0dHlQcmludFZpc2l0b3JfcHJldHR5cHJpbnRlZApAQCAtMCwwICsxLDEzNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBKw7psaW8gVmlsbWFyIEdlc3Nlci4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMy0yMDE2IFRoZSBKYXZhUGFyc2VyIFRlYW0uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSmF2YVBhcnNlci4KKyAqCisgKiBKYXZhUGFyc2VyIGNhbiBiZSB1c2VkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YKKyAqIGEpIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogYikgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZQorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgYm90aCBsaWNlbnNlcyBpbiBMSUNFTkNFLkxHUEwgYW5kCisgKiBMSUNFTkNFLkFQQUNIRS4gUGxlYXNlIHJlZmVyIHRvIHRob3NlIGZpbGVzIGZvciBkZXRhaWxzLgorICoKKyAqIEphdmFQYXJzZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworcGFja2FnZSBjb20uZ2l0aHViLmphdmFwYXJzZXIucHJpbnRlcjsKKworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmJvZHkuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkJsb2NrQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkNvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5KYXZhZG9jQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmNvbW1lbnRzLkxpbmVDb21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuZXhwci4qOworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3Qubm9kZVR5cGVzLk5vZGVXaXRoVHlwZUFyZ3VtZW50czsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFZhcmlhYmxlczsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnN0bXQuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnR5cGUuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LnZpc2l0b3IuVm9pZFZpc2l0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlBvc2l0aW9uVXRpbHMuc29ydEJ5QmVnaW5Qb3NpdGlvbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnV0aWxzLlV0aWxzLmlzTnVsbE9yRW1wdHk7CisKKy8qKgorICogT3V0cHV0cyB0aGUgQVNUIGFzIGZvcm1hdHRlZCBKYXZhIHNvdXJjZSBjb2RlLgorICoKKyAqIEBhdXRob3IgSnVsaW8gVmlsbWFyIEdlc3NlcgorICovCitwdWJsaWMgY2xhc3MgUHJldHR5UHJpbnRWaXNpdG9yIGltcGxlbWVudHMgVm9pZFZpc2l0b3I8Vm9pZD4geworCisgICAgcHJvdGVjdGVkIGZpbmFsIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU291cmNlUHJpbnRlciBwcmludGVyOworCisgICAgcHVibGljIFByZXR0eVByaW50VmlzaXRvcihQcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbiBwcmV0dHlQcmludGVyQ29uZmlndXJhdGlvbikgeworICAgICAgICBjb25maWd1cmF0aW9uID0gcHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb247CisgICAgICAgIHByaW50ZXIgPSBuZXcgU291cmNlUHJpbnRlcihjb25maWd1cmF0aW9uLmdldEluZGVudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHByaW50ZXIuZ2V0U291cmNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50TW9kaWZpZXJzKGZpbmFsIEVudW1TZXQ8TW9kaWZpZXI+IG1vZGlmaWVycykgeworICAgICAgICBpZiAobW9kaWZpZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQobW9kaWZpZXJzLnN0cmVhbSgpLm1hcChNb2RpZmllcjo6YXNTdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIgIikpICsgIiAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE1lbWJlcnMoZmluYWwgTm9kZUxpc3Q8Qm9keURlY2xhcmF0aW9uPD8+PiBtZW1iZXJzLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBmb3IgKGZpbmFsIEJvZHlEZWNsYXJhdGlvbjw/PiBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIG1lbWJlci5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50TWVtYmVyQW5ub3RhdGlvbnMoZmluYWwgTm9kZUxpc3Q8QW5ub3RhdGlvbkV4cHI+IGFubm90YXRpb25zLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uRXhwciBhIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGEuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludEFubm90YXRpb25zKGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgYm9vbGVhbiBwcmVmaXhXaXRoQVNwYWNlLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeFdpdGhBU3BhY2UpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgYW5ub3RhdGlvbi5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFR5cGVBcmdzKGZpbmFsIE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/PiBub2RlV2l0aFR5cGVBcmd1bWVudHMsIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBub2RlV2l0aFR5cGVBcmd1bWVudHMuZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KHR5cGVBcmd1bWVudHMpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI8Iik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGU+IGkgPSB0eXBlQXJndW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHQgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIj4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFR5cGVQYXJhbWV0ZXJzKGZpbmFsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IGFyZ3MsIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShhcmdzKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiPCIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxUeXBlUGFyYW1ldGVyPiBpID0gYXJncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZVBhcmFtZXRlciB0ID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgdC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJncywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKCIpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYXJncykpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIikiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRKYXZhQ29tbWVudChmaW5hbCBDb21tZW50IGphdmFjb21tZW50LCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoamF2YWNvbW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgamF2YWNvbW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0UGFja2FnZURlY2xhcmF0aW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgbi5nZXRJbXBvcnRzKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGlmICghbi5nZXRJbXBvcnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGVEZWNsYXJhdGlvbjw/Pj4gaSA9IG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBpLm5leHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQYWNrYWdlRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJwYWNrYWdlICIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCI7Iik7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWVFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0UXVhbGlmaWVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0UXVhbGlmaWVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldElkZW50aWZpZXIoKSk7CisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoU2ltcGxlTmFtZSBuLCBWb2lkIGFyZykgeworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0SWRlbnRpZmllcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBpZiAobi5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJpbnRlcmZhY2UgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJjbGFzcyAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIGlmICghbi5nZXRFeHRlbmRlZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgZXh0ZW5kcyAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q2xhc3NPckludGVyZmFjZVR5cGU+IGkgPSBuLmdldEV4dGVuZGVkVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgaW1wbGVtZW50cyAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q2xhc3NPckludGVyZmFjZVR5cGU+IGkgPSBuLmdldEltcGxlbWVudGVkVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiIHsiKTsKKyAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0TWVtYmVycygpKSkgeworICAgICAgICAgICAgcHJpbnRNZW1iZXJzKG4uZ2V0TWVtYmVycygpLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50ZXIucHJpbnQoIi8qKiIpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0Q29udGVudCgpKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIqLyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFlIDogbi5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBhZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uaXNVc2luZ0RpYW1vbmRPcGVyYXRvcigpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI8PiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRUeXBlQXJncyhuLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFubiA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgYW5uLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUeXBlQm91bmQoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0VHlwZUJvdW5kKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgJiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VHlwZSgpLmFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBmaW5hbCBMaXN0PEFycmF5VHlwZT4gYXJyYXlUeXBlQnVmZmVyID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBUeXBlIHR5cGUgPSBuOworICAgICAgICB3aGlsZSAodHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICBhcnJheVR5cGVCdWZmZXIuYWRkKGFycmF5VHlwZSk7CisgICAgICAgICAgICB0eXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICB0eXBlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBmb3IgKEFycmF5VHlwZSBhcnJheVR5cGUgOiBhcnJheVR5cGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHByaW50QW5ub3RhdGlvbnMoYXJyYXlUeXBlLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJbXSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkxldmVsIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJbIik7CisgICAgICAgIGlmIChuLmdldERpbWVuc2lvbigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldERpbWVuc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIl0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlcnNlY3Rpb25UeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICYgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisgICAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoUmVmZXJlbmNlVHlwZSBlbGVtZW50IDogbi5nZXRFbGVtZW50cygpKSB7CisgICAgICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIHwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtZW50LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgV2lsZGNhcmRUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiPyIpOworICAgICAgICBpZiAobi5nZXRFeHRlbmRlZFR5cGVzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgbi5nZXRFeHRlbmRlZFR5cGVzKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0U3VwZXJUeXBlcygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgc3VwZXIgIik7CisgICAgICAgICAgICBuLmdldFN1cGVyVHlwZXMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVua25vd25UeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgLy8gTm90aGluZyB0byBwcmludAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgaWYgKCFuLmdldFZhcmlhYmxlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbi5nZXRNYXhpbXVtQ29tbW9uVHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0b3I+IGkgPSBuLmdldFZhcmlhYmxlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2YXIgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIHZhci5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgVHlwZSBjb21tb25UeXBlID0gbi5nZXRBbmNlc3Rvck9mVHlwZShOb2RlV2l0aFZhcmlhYmxlcy5jbGFzcykuZ2V0KCkuZ2V0TWF4aW11bUNvbW1vblR5cGUoKTsKKyAgICAgICAgVHlwZSB0eXBlID0gbi5nZXRUeXBlKCk7CisgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gY29tbW9uVHlwZS5nZXRBcnJheUxldmVsKCk7IGkgPCB0eXBlLmdldEFycmF5TGV2ZWwoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJyYXlUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhhcnJheVR5cGUuZ2V0QW5ub3RhdGlvbnMoKSwgdHJ1ZSwgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIltdIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiID0gIik7CisgICAgICAgICAgICBuLmdldEluaXRpYWxpemVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUluaXRpYWxpemVyRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJ7Iik7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFZhbHVlcygpKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRWYWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBleHByID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZXhwci5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZvaWRUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBmYWxzZSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgidm9pZCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5QWNjZXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiWyIpOworICAgICAgICBuLmdldEluZGV4KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIl0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJuZXcgIik7CisgICAgICAgIG4uZ2V0RWxlbWVudFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgZm9yIChBcnJheUNyZWF0aW9uTGV2ZWwgbGV2ZWwgOiBuLmdldExldmVscygpKSB7CisgICAgICAgICAgICBsZXZlbC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRJbml0aWFsaXplcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgICAgICBuLmdldEluaXRpYWxpemVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBc3NpZ25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0VGFyZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldE9wZXJhdG9yKCkuYXNTdHJpbmcoKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJpbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRMZWZ0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldE9wZXJhdG9yKCkuYXNTdHJpbmcoKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXRSaWdodCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhc3RFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiLmNsYXNzIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ29uZGl0aW9uYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiA/ICIpOworICAgICAgICBuLmdldFRoZW5FeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiA6ICIpOworICAgICAgICBuLmdldEVsc2VFeHByKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRW5jbG9zZWRFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgaWYgKG4uZ2V0SW5uZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRJbm5lcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIikiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGaWVsZEFjY2Vzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnN0YW5jZU9mRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiIGluc3RhbmNlb2YgIik7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENoYXJMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCInIik7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiJyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvdWJsZUxpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbnRlZ2VyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvbmdMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3RyaW5nTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiXCIiKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworICAgICAgICBwcmludGVyLnByaW50KCJcIiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJvb2xlYW5MaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KFN0cmluZy52YWx1ZU9mKG4uZ2V0VmFsdWUoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE51bGxMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJudWxsIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhpc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgidGhpcyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN1cGVyRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRDbGFzc0V4cHIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRDbGFzc0V4cHIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCJzdXBlciIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1ldGhvZENhbGxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludEFyZ3VtZW50cyhuLmdldEFyZ3VtZW50cygpLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE9iamVjdENyZWF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgibmV3ICIpOworICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVBcmd1bWVudHMoKS5vckVsc2UobnVsbCkpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50QXJndW1lbnRzKG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldEFub255bW91c0NsYXNzQm9keSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiB7Iik7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgcHJpbnRNZW1iZXJzKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuZ2V0KCksIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBVbmFyeUV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0T3BlcmF0b3IoKS5pc1ByZWZpeCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0T3BlcmF0b3IoKS5hc1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0T3BlcmF0b3IoKS5pc1Bvc3RmaXgoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludChuLmdldE9wZXJhdG9yKCkuYXNTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIGlmIChuLmlzR2VuZXJpYygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgaWYgKCFuLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8UGFyYW1ldGVyPiBpID0gbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlciBwID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgcC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUaHJvd25FeGNlcHRpb25zKCkpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgdGhyb3dzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxSZWZlcmVuY2VUeXBlPiBpID0gbi5nZXRUaHJvd25FeGNlcHRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlZmVyZW5jZVR5cGUgbmFtZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIG5hbWUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgaWYgKG4uaXNEZWZhdWx0KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImRlZmF1bHQgIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRUeXBlUGFyYW1ldGVycyhuLmdldFR5cGVQYXJhbWV0ZXJzKCksIGFyZyk7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFR5cGVQYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIH0KKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0UGFyYW1ldGVycygpKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBwLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIpIik7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShuLmdldFRocm93bkV4Y2VwdGlvbnMoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiB0aHJvd3MgIik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFJlZmVyZW5jZVR5cGU+IGkgPSBuLmdldFRocm93bkV4Y2VwdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVmZXJlbmNlVHlwZSBuYW1lID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgbmFtZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFuLmdldEJvZHkoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICAgICAgbi5nZXRCb2R5KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQYXJhbWV0ZXIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIGlmIChuLmlzVmFyQXJncygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuLi4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5pc1RoaXMoKSkgeworICAgICAgICAgICAgcHJpbnRUeXBlQXJncyhuLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgidGhpcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG4uZ2V0RXhwcmVzc2lvbigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRUeXBlQXJncyhuLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgic3VwZXIiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludEFyZ3VtZW50cyhuLmdldEFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgaWYgKCFuLmdldFZhcmlhYmxlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbi5nZXRNYXhpbXVtQ29tbW9uVHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0b3I+IGkgPSBuLmdldFZhcmlhYmxlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2ID0gaS5uZXh0KCk7CisgICAgICAgICAgICB2LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRDbGFzc0RlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJhc3NlcnQgIik7CisgICAgICAgIG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0TWVzc2FnZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgOiAiKTsKKyAgICAgICAgICAgIG4uZ2V0TWVzc2FnZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigieyIpOworICAgICAgICBpZiAobi5nZXRTdGF0ZW1lbnRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RhdGVtZW50IHMgOiBuLmdldFN0YXRlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExhYmVsZWRTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0TGFiZWwoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOiAiKTsKKyAgICAgICAgbi5nZXRTdGF0ZW1lbnQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEV4cHJlc3Npb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKG4pOworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgic3dpdGNoKCIpOworICAgICAgICBuLmdldFNlbGVjdG9yKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiKSB7Iik7CisgICAgICAgIGlmIChuLmdldEVudHJpZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTd2l0Y2hFbnRyeVN0bXQgZSA6IG4uZ2V0RW50cmllcygpKSB7CisgICAgICAgICAgICAgICAgZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3dpdGNoRW50cnlTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldExhYmVsKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImNhc2UgIik7CisgICAgICAgICAgICBuLmdldExhYmVsKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI6Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJkZWZhdWx0OiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICBpZiAobi5nZXRTdGF0ZW1lbnRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdGF0ZW1lbnQgcyA6IG4uZ2V0U3RhdGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgcy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQnJlYWtTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoImJyZWFrIik7CisgICAgICAgIG4uZ2V0TGFiZWwoKS5pZlByZXNlbnQoIGwgLT4gcHJpbnRlci5wcmludCgiICIpLnByaW50KGwuZ2V0SWRlbnRpZmllcigpKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInJldHVybiIpOworICAgICAgICBpZiAobi5nZXRFeHByZXNzaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBwcmludGVyLnByaW50KCJlbnVtICIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKCFuLmdldEltcGxlbWVudGVkVHlwZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBpbXBsZW1lbnRzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0SW1wbGVtZW50ZWRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc09ySW50ZXJmYWNlVHlwZSBjID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgYy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIgeyIpOworICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICBpZiAobi5nZXRFbnRyaWVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBpID0gbi5nZXRFbnRyaWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGUgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW4uZ2V0TWVtYmVycygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCI7Iik7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW4uZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKCFuLmdldEFyZ3VtZW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRBcmd1bWVudHMobi5nZXRBcmd1bWVudHMoKSwgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW4uZ2V0Q2xhc3NCb2R5KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIiB7Iik7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgcHJpbnRNZW1iZXJzKG4uZ2V0Q2xhc3NCb2R5KCksIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIn0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5TWVtYmVyRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEluaXRpYWxpemVyRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgic3RhdGljICIpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIElmU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJpZiAoIik7CisgICAgICAgIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gdGhlbkJsb2NrID0gbi5nZXRUaGVuU3RtdCgpIGluc3RhbmNlb2YgQmxvY2tTdG10OworICAgICAgICBpZiAoLy8gYmxvY2sgc3RhdGVtZW50IHNob3VsZCBzdGFydCBvbiB0aGUgc2FtZSBsaW5lCisgICAgICAgIHRoZW5CbG9jaykKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIpIik7CisgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0VGhlblN0bXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKCF0aGVuQmxvY2spCisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIGlmIChuLmdldEVsc2VTdG10KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIGlmICh0aGVuQmxvY2spCisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbHNlSWYgPSBuLmdldEVsc2VTdG10KCkub3JFbHNlKG51bGwpIGluc3RhbmNlb2YgSWZTdG10OworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbHNlQmxvY2sgPSBuLmdldEVsc2VTdG10KCkub3JFbHNlKG51bGwpIGluc3RhbmNlb2YgQmxvY2tTdG10OworICAgICAgICAgICAgaWYgKC8vIHB1dCBjaGFpbmVkIGlmIGFuZCBzdGFydCBvZiBibG9jayBzdGF0ZW1lbnQgb24gYSBzYW1lIGxldmVsCisgICAgICAgICAgICBlbHNlSWYgfHwgZWxzZUJsb2NrKQorICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImVsc2UgIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oImVsc2UiKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4uZ2V0RWxzZVN0bXQoKS5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgICAgICBuLmdldEVsc2VTdG10KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoIShlbHNlSWYgfHwgZWxzZUJsb2NrKSkKKyAgICAgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgid2hpbGUgKCIpOworICAgICAgICBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiY29udGludWUiKTsKKyAgICAgICAgbi5nZXRMYWJlbCgpLmlmUHJlc2VudCggbCAtPiBwcmludGVyLnByaW50KCIgIikucHJpbnQobC5nZXRJZGVudGlmaWVyKCkpKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIERvU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJkbyAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiB3aGlsZSAoIik7CisgICAgICAgIG4uZ2V0Q29uZGl0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIik7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRm9yZWFjaFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiZm9yICgiKTsKKyAgICAgICAgbi5nZXRWYXJpYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgOiAiKTsKKyAgICAgICAgbi5nZXRJdGVyYWJsZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoImZvciAoIik7CisgICAgICAgIGlmIChuLmdldEluaXRpYWxpemF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRJbml0aWFsaXphdGlvbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFeHByZXNzaW9uIGUgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCI7ICIpOworICAgICAgICBpZiAobi5nZXRDb21wYXJlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0Q29tcGFyZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsgIik7CisgICAgICAgIGlmIChuLmdldFVwZGF0ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IG4uZ2V0VXBkYXRlKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRocm93U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJ0aHJvdyAiKTsKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTeW5jaHJvbml6ZWRTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInN5bmNocm9uaXplZCAoIik7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBUcnlTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInRyeSAiKTsKKyAgICAgICAgaWYgKCFuLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiKCIpOworICAgICAgICAgICAgSXRlcmF0b3I8VmFyaWFibGVEZWNsYXJhdGlvbkV4cHI+IHJlc291cmNlcyA9IG4uZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB2aXNpdChyZXNvdXJjZXMubmV4dCgpLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4uZ2V0UmVzb3VyY2VzKCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0VHJ5QmxvY2soKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRUcnlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgQ2F0Y2hDbGF1c2UgYyA6IG4uZ2V0Q2F0Y2hDbGF1c2VzKCkpIHsKKyAgICAgICAgICAgIGMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0RmluYWxseUJsb2NrKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBmaW5hbGx5ICIpOworICAgICAgICAgICAgbi5nZXRGaW5hbGx5QmxvY2soKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENhdGNoQ2xhdXNlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiBjYXRjaCAoIik7CisgICAgICAgIG4uZ2V0UGFyYW1ldGVyKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFubm90YXRpb25EZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIkBpbnRlcmZhY2UgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50bG4oIiB7Iik7CisgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgIGlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigpIik7CisgICAgICAgIGlmIChuLmdldERlZmF1bHRWYWx1ZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgZGVmYXVsdCAiKTsKKyAgICAgICAgICAgIG4uZ2V0RGVmYXVsdFZhbHVlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1hcmtlckFubm90YXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIkAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiQCIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKCIpOworICAgICAgICBuLmdldE1lbWJlclZhbHVlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIikiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOb3JtYWxBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJAIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIGlmIChuLmdldFBhaXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxNZW1iZXJWYWx1ZVBhaXI+IGkgPSBuLmdldFBhaXJzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lbWJlclZhbHVlUGFpciBtID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgbS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE1lbWJlclZhbHVlUGFpciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiID0gIik7CisgICAgICAgIG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMaW5lQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uaXNQcmludENvbW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIvLyIpOworICAgICAgICBTdHJpbmcgdG1wID0gbi5nZXRDb250ZW50KCk7CisgICAgICAgIHRtcCA9IHRtcC5yZXBsYWNlKCdccicsICcgJyk7CisgICAgICAgIHRtcCA9IHRtcC5yZXBsYWNlKCdcbicsICcgJyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbih0bXApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJsb2NrQ29tbWVudCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uaXNQcmludENvbW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIvKiIpLnByaW50KG4uZ2V0Q29udGVudCgpKS5wcmludGxuKCIqLyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KExhbWJkYUV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgZmluYWwgTm9kZUxpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbi5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJpbnRQYXIgPSBuLmlzRW5jbG9zaW5nUGFyYW1ldGVycygpOworICAgICAgICBpZiAocHJpbnRQYXIpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IHBhcmFtZXRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIHAuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcmludFBhcikgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAtPiAiKTsKKyAgICAgICAgZmluYWwgU3RhdGVtZW50IGJvZHkgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RtdCkgeworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4cHJlc3Npb24gZGlyZWN0bHkKKyAgICAgICAgICAgICgoRXhwcmVzc2lvblN0bXQpIGJvZHkpLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvZHkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RSZWZlcmVuY2VFeHByIG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIEV4cHJlc3Npb24gc2NvcGUgPSBuLmdldFNjb3BlKCk7CisgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gbi5nZXRJZGVudGlmaWVyKCk7CisgICAgICAgIGlmIChzY29wZSAhPSBudWxsKSB7CisgICAgICAgICAgICBuLmdldFNjb3BlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiOjoiKTsKKyAgICAgICAgcHJpbnRUeXBlQXJncyhuLCBhcmcpOworICAgICAgICBpZiAoaWRlbnRpZmllciAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KGlkZW50aWZpZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoVHlwZUV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgZm9yIChPYmplY3Qgbm9kZSA6IG4pIHsKKyAgICAgICAgICAgICgoTm9kZSkgbm9kZSkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJpbXBvcnQgIik7CisgICAgICAgIGlmIChuLmlzU3RhdGljKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uaXNBc3RlcmlzaygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuKiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiOyIpOworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE9ycGhhbkNvbW1lbnRzQmVmb3JlVGhpc0NoaWxkTm9kZShmaW5hbCBOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBMaXN0PE5vZGU+IGV2ZXJ5dGhpbmcgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGV2ZXJ5dGhpbmcuYWRkQWxsKHBhcmVudC5nZXRDaGlsZE5vZGVzKCkpOworICAgICAgICBzb3J0QnlCZWdpblBvc2l0aW9uKGV2ZXJ5dGhpbmcpOworICAgICAgICBpbnQgcG9zaXRpb25PZlRoZUNoaWxkID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlcnl0aGluZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGV2ZXJ5dGhpbmcuZ2V0KGkpID09IG5vZGUpCisgICAgICAgICAgICAgICAgcG9zaXRpb25PZlRoZUNoaWxkID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zaXRpb25PZlRoZUNoaWxkID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkkgYW0gbm90IGEgY2hpbGQgb2YgbXkgcGFyZW50LiIpOworICAgICAgICB9CisgICAgICAgIGludCBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gcG9zaXRpb25PZlRoZUNoaWxkIC0gMTsgaSA+PSAwICYmIHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID09IC0xOyBpLS0pIHsKKyAgICAgICAgICAgIGlmICghKGV2ZXJ5dGhpbmcuZ2V0KGkpIGluc3RhbmNlb2YgQ29tbWVudCkpCisgICAgICAgICAgICAgICAgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgPSBpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCArIDE7IGkgPCBwb3NpdGlvbk9mVGhlQ2hpbGQ7IGkrKykgeworICAgICAgICAgICAgTm9kZSBub2RlVG9QcmludCA9IGV2ZXJ5dGhpbmcuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCEobm9kZVRvUHJpbnQgaW5zdGFuY2VvZiBDb21tZW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgY29tbWVudCwgaW5zdGVhZCAiICsgbm9kZVRvUHJpbnQuZ2V0Q2xhc3MoKSArICIuIFBvc2l0aW9uIG9mIHByZXZpb3VzIGNoaWxkOiAiICsgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgKyAiLCBwb3NpdGlvbiBvZiBjaGlsZCAiICsgcG9zaXRpb25PZlRoZUNoaWxkKTsKKyAgICAgICAgICAgIG5vZGVUb1ByaW50LmFjY2VwdCh0aGlzLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICBMaXN0PE5vZGU+IGV2ZXJ5dGhpbmcgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGV2ZXJ5dGhpbmcuYWRkQWxsKG5vZGUuZ2V0Q2hpbGROb2RlcygpKTsKKyAgICAgICAgc29ydEJ5QmVnaW5Qb3NpdGlvbihldmVyeXRoaW5nKTsKKyAgICAgICAgaWYgKGV2ZXJ5dGhpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvbW1lbnRzQXRFbmQgPSAwOworICAgICAgICBib29sZWFuIGZpbmRpbmdDb21tZW50cyA9IHRydWU7CisgICAgICAgIHdoaWxlIChmaW5kaW5nQ29tbWVudHMgJiYgY29tbWVudHNBdEVuZCA8IGV2ZXJ5dGhpbmcuc2l6ZSgpKSB7CisgICAgICAgICAgICBOb2RlIGxhc3QgPSBldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKSAtIDEgLSBjb21tZW50c0F0RW5kKTsKKyAgICAgICAgICAgIGZpbmRpbmdDb21tZW50cyA9IChsYXN0IGluc3RhbmNlb2YgQ29tbWVudCk7CisgICAgICAgICAgICBpZiAoZmluZGluZ0NvbW1lbnRzKSB7CisgICAgICAgICAgICAgICAgY29tbWVudHNBdEVuZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWVudHNBdEVuZDsgaSsrKSB7CisgICAgICAgICAgICBldmVyeXRoaW5nLmdldChldmVyeXRoaW5nLnNpemUoKSAtIGNvbW1lbnRzQXRFbmQgKyBpKS5hY2NlcHQodGhpcywgbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvc291cmNlX3ppcC90ZXN0LnR4dCBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3NvdXJjZV96aXAvdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3ZTAzNAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3NvdXJjZV96aXAvdGVzdC50eHQKQEAgLTAsMCArMSBAQAorZm9vIGJhciBxdXgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zb3VyY2VfemlwL3Rlc3QuemlwIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvc291cmNlX3ppcC90ZXN0LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDliMThhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvc291cmNlX3ppcC90ZXN0LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL0EuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N0b3JhZ2UvQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZmM0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL0EuamF2YQpAQCAtMCwwICsxIEBACitwYWNrYWdlIGNvbS5ibGFibGFibGEucm9vdDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL0IuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N0b3JhZ2UvQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL0IuamF2YQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3RvcmFnZS9QcmltYXJ5VHlwZS5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvc3RvcmFnZS9QcmltYXJ5VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzk1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL1ByaW1hcnlUeXBlLmphdmEKQEAgLTAsMCArMSw1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zdG9yYWdlOworCitwdWJsaWMgY2xhc3MgUHJpbWFyeVR5cGUgeworICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N0b3JhZ2UvUHJpbWFyeVR5cGUyLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL1ByaW1hcnlUeXBlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYmNmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL1ByaW1hcnlUeXBlMi5qYXZhCkBAIC0wLDAgKzEgQEAKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnN0b3JhZ2U7CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL1ouamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3N0b3JhZ2UvWi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjg4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci9zdG9yYWdlL1ouamF2YQpAQCAtMCwwICsxIEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci5zdG9yYWdlOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzLy5hYmMvYmxhLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy8uYWJjL2JsYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy8uYWJjL2JsYS5qYXZhCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9CbGEuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL0JsYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWRiODgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9CbGEuamF2YQpAQCAtMCwwICsxLDMgQEAKK2NsYXNzIFggeworICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3V0aWxzL21vZHVsZS1pbmZvLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9tb2R1bGUtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTI0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9tb2R1bGUtaW5mby5qYXZhCkBAIC0wLDAgKzEsMiBAQAorbW9kdWxlIE0uTiB7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvc291cmNlL3Jvb3QvWS5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ2l0aHViL2phdmFwYXJzZXIvdXRpbHMvc291cmNlL3Jvb3QvWS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWIwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci91dGlscy9zb3VyY2Uvcm9vdC9ZLmphdmEKQEAgLTAsMCArMSwzIEBACitjbGFzcyBZIHsKKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvVGVzdEZpbGUuamF2YSBiL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3dpa2lfc2FtcGxlcy9UZXN0RmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGNiNWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9naXRodWIvamF2YXBhcnNlci93aWtpX3NhbXBsZXMvVGVzdEZpbGUuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5naXRodWIuamF2YXBhcnNlci53aWtpX3NhbXBsZXM7CisKK3B1YmxpYyBjbGFzcyBUZXN0RmlsZSB7CisgICAgcHVibGljIHZvaWQgZm9vKGludCBlKSB7CisgICAgICAgIGludCBhID0gMjA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWJjKCkgeworCisgICAgfQorCisgICAgcHVibGljIGludCBkZWYoKSB7CisgICAgICAgIHJldHVybiAxMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL0phdmFDb25jZXB0cy5qYXZhIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9KYXZhQ29uY2VwdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTUzZTVmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YXBhcnNlci10ZXN0aW5nL3NyYy90ZXN0L3Rlc3Rfc291cmNlY29kZS9jb20vZ2l0aHViL2phdmFwYXJzZXIvcHJpbnRlci9KYXZhQ29uY2VwdHMuamF2YQpAQCAtMCwwICsxLDM5MyBAQAorcGFja2FnZSBqYXBhLmJkZC5zYW1wbGVzOworCitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLkphdmFQYXJzZXI7CitpbXBvcnQgamFwYS5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworQElnbm9yZQorQERlcHJlY2F0ZWQKK3B1YmxpYyBjbGFzcyBKYXZhQ29uY2VwdHM8VCBleHRlbmRzIExpc3Q8aW50W10+LCBYPiBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgc3RhdGljIENsYXNzIGNsejEgPSBTdHJpbmcuY2xhc3M7CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgY2x6MiA9IChTdHJpbmcuY2xhc3MpOworCisgICAgQ2xhc3MgY2x6MyA9IGludC5jbGFzczsKKworICAgIENsYXNzIGNsejQgPSAoaW50LmNsYXNzKTsKKworICAgIGludFtdIGFyciA9IG5ldyBpbnRbMTBdOworCisgICAgYnl0ZSBieWUgPSAwOworCisgICAgYnl0ZSBieWVieWVbXSA9IG51bGw7CisKKyAgICBzaG9ydCBzaDEsIHNoMiA9IDE7CisKKyAgICBpbnQgaW50V2l0aFVuZGVyc2NvcmUgPSAxMjM0XzU2Nzg7CisKKyAgICBsb25nIGxvbmdXaXRoVW5kZXJzY29yZSA9IDEyMzRfNTY3OEw7CisKKyAgICBmbG9hdCBmbG9hdFdpdGhVbmRlcnNjb3JlID0gMV8yMzQuNV82NzhmOworCisgICAgZmxvYXQgZmxvYXRXaXRoVW5kZXJzY29yZUFuZEV4cG9uZW50ID0gMV8yMzRlMV8wZjsKKworICAgIGRvdWJsZSBkb3VibGVXaXRoVW5kZXJzY29yZSA9IDFfMjM0LjVfNjc4OworCisgICAgZG91YmxlIGRvdWJsZVdpdGhVbmRlcnNjb3JlQW5kRXhwb25lbnQgPSAxXzIzNGUxXzA7CisKKyAgICBpbnQgYmluYXJ5TGl0ZXJhbCA9IDBiMTAxMTAxOworCisgICAgTGlzdDxTdHJpbmc+W11bXSBhcnJMUyA9IChMaXN0PFN0cmluZz5bXVtdKSBuZXcgTGlzdDw/PlsxMF1bXTsKKworICAgIHsKKyAgICAgICAgaW50IHogPSAwLCB5ID0gMDsKKyAgICAgICAgaW50IGEgPSAoeikgKyB5OworICAgICAgICBhID0gKCt6KSArIHk7CisgICAgICAgIGJ5dGUgYiA9IChieXRlKSAreTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gZGlhbW9uZDEgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBARGVwcmVjYXRlZCgpCisgICAgc3RhdGljIGNsYXNzIFVnbHkgeworCisgICAgICAgIHN0YXRpYyBpbnQgeCA9IDA7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgeCA9ICt4OworICAgICAgICAgICAgeCA9IH54OworICAgICAgICAgICAgLS14OworICAgICAgICAgICAgYm9vbGVhbiBiID0gIWZhbHNlOworICAgICAgICAgICAgeCAmPSAyOworICAgICAgICAgICAgeCB8PSAyOworICAgICAgICAgICAgeCBePSAyOworICAgICAgICAgICAgeCAtPSAyOworICAgICAgICAgICAgeCAlPSAyOworICAgICAgICAgICAgeCAvPSAyOworICAgICAgICAgICAgeCAqPSAyOworICAgICAgICAgICAgeCA8PD0gMjsKKyAgICAgICAgICAgIHggPj49IDI7CisgICAgICAgICAgICB4ID4+Pj0gMjsKKyAgICAgICAgICAgIGIgPSBiIHx8IGZhbHNlOworICAgICAgICAgICAgYiA9IGIgfCBmYWxzZTsKKyAgICAgICAgICAgIGIgPSBiICYgZmFsc2U7CisgICAgICAgICAgICBiID0gYiBeIGZhbHNlOworICAgICAgICAgICAgYiA9IGIgIT0gZmFsc2U7CisgICAgICAgICAgICBiID0geCA+IDE7CisgICAgICAgICAgICBiID0geCA8IDE7CisgICAgICAgICAgICBiID0geCA+PSAxOworICAgICAgICAgICAgYiA9IHggPD0gMTsKKyAgICAgICAgICAgIHggPSB4IDw8IDE7CisgICAgICAgICAgICB4ID0geCA+PiAxOworICAgICAgICAgICAgeCA9IHggPj4+IDE7CisgICAgICAgICAgICB4ID0geCAtIDE7CisgICAgICAgICAgICB4ID0geCAqIDE7CisgICAgICAgICAgICB4ID0geCAlIDE7CisgICAgICAgICAgICB4ID0geCAvIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBARGVwcmVjYXRlZCgpCisgICAgaW50W11bXVtdW10gYXJyMiA9IG5ldyBpbnRbMTBdWzJdWzFdWzBdOworCisgICAgdm9sYXRpbGUgZmxvYXQgZmZmID0gMHgxLmZmZmVQKzEyN2Y7CisKKyAgICBjaGFyIGNjID0gJ2EnOworCisgICAgaW50W11bXSBhcnIzID0ge3sxLCAyfSwgezMsIDR9fTsKKworICAgIHN0YXRpYyBpbnRbXSBhcnI0W10gPSB7fTsKKworICAgIHB1YmxpYyBzdGF0aWMgSmF2YUNvbmNlcHRzIHQ7CisKKyAgICBzdGF0aWMgeworICAgICAgICBhcnI0ID0gbmV3IGludFtdW117ezJ9LCB7MX19OworICAgIH0KKworICAgIHsKKyAgICAgICAgYXJyMyA9IG5ldyBpbnRbXVtde3syfSwgezF9fTsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBUZXN0ZSB7CisKKyAgICAgICAgYXNjLCBkZWYKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBTZXhvIHsKKworICAgICAgICBtLCBARGVwcmVjYXRlZAorICAgICAgICBmOworCisgICAgICAgIHB1YmxpYyBlbnVtIFNleG9fIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBDbG9uZWFibGUgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXhvKCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgZW51bSBFbnVtIHsKKworICAgICAgICBtKDEpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCBtbSgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZigyKSB7CisgICAgICAgICAgICB2b2lkIG1tKCkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG5hdGl2ZSB2b2lkIG5ubigpOworCisgICAgICAgIHRyYW5zaWVudCBpbnQgeDsKKworICAgICAgICBwcml2YXRlIEVudW0oaW50IHgpIHsKKyAgICAgICAgICAgIHRoaXMueCA9IHg7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCB2b2lkIG1tKCk7CisgICAgfQorCisgICAgc3RyaWN0ZnAgZG91YmxlIGRkZCgpIHsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQsIEU+IEphdmFDb25jZXB0cyhpbnQgeCkgeworICAgICAgICB0aGlzLmFyclswXSA9IHg7CisgICAgICAgIFQgdmFsMSA9IG51bGw7CisgICAgICAgIEUgdmFsMiA9IG51bGw7CisgICAgICAgIHN1cGVyLjxULCBFPmNoZWNrMih2YWwxLCB2YWwyKTsKKyAgICAgICAgYm9vbGVhbiBiID0gdHJ1ZSwgeSA9IGZhbHNlOworICAgICAgICBhYnN0cmFjdCBjbGFzcyBYIHsKKworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICBwdWJsaWMgPEQ+IFgoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG0oKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgZmluYWwgY2xhc3MgWSBleHRlbmRzIFggeworCisgICAgICAgICAgICBwdWJsaWMgWSgpIHsKKyAgICAgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgICAgIEphdmFDb25jZXB0cy50aGlzLmNjID0gJ2MnOworICAgICAgICAgICAgICAgIHN1cGVyLmkgPSAxOworICAgICAgICAgICAgICAgIFkuc3VwZXIubSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWShpbnQgeSkgeworICAgICAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBZKGxvbmcgeCkgeworICAgICAgICAgICAgICAgIHRoaXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gSmF2YUNvbmNlcHRzKFN0cmluZyBzdHIpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFFXRSBleHRlbmRzIEphdmFDb25jZXB0czxMaXN0PGludFtdPiwgU3RyaW5nPiB7CisKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgZmluYWwgaW50IHogPSAwOworCisgICAgICAgIGludCBpID0gKGludCkgLTE7CisKKyAgICAgICAgcHVibGljIFFXRShTdHJpbmcuLi4geCkgeworICAgICAgICAgICAgPFN0cmluZz5zdXBlcih4WzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRV0UoaW50Li4uIHgpIHsKKyAgICAgICAgICAgIHN1cGVyKHhbMF0pOworICAgICAgICAgICAgaSA9IHhbMF07CisgICAgICAgICAgICBhc3NlcnQgdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydCAxID09IDEgOiAyOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpaWkgPSAzOworICAgICAgICAgICAgICAgIGlpaSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFiZWw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlpaSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICA7CisgICAgICAgICAgICA7CisgICAgICAgICAgICBpbnQgbWluID0gLTIxNDc0ODM2NDg7CisgICAgICAgICAgICBsb25nIHNsID0gMTIzMTIzMTIzMTIzbDsKKyAgICAgICAgICAgIGxvbmcgbWlubCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA4TDsKKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGw6CisgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgbGw7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBCYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZG9Tb21ldGhpbmcoKVtdIHsKKyAgICAgICAgICAgIExpc3Q8PyBleHRlbmRzIE51bWJlcj4geCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgaW50W117MX07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHggPSAyOworICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSBwYXJzZShuZXcgRmlsZSgic3JjL2phcGEvcGFyc2VyL2phdmFjYy9QYXJzZXIuamF2YSIpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGN1KTsKKyAgICAgICAgSmF2YUNvbmNlcHRzIHRlc3RlID0gbmV3IEphdmFDb25jZXB0cygyKTsKKyAgICAgICAgSmF2YUNvbmNlcHRzLlFXRSBxd2UgPSB0ZXN0ZS5uZXcgUVdFKDEpOworICAgICAgICBpZiAoMSArIDEgPT0gMikgeworICAgICAgICAgICAgdGVzdGUgPSBudWxsOworICAgICAgICAgICAgdGVzdGUgPSBuZXcgSmF2YUNvbmNlcHRzKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeCA9IDM7CisgICAgICAgICAgICB0ZXN0ZSA9IG5ldyBKYXZhQ29uY2VwdHMoMSk7CisgICAgICAgICAgICB4ID0geCA9PSAwID8gMiA6IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCA9IDM7CisgICAgICAgIGlmICh0cnVlKQorICAgICAgICAgICAgeCA9IDE7CisgICAgICAgIGVsc2UgaWYgKGZhbHNlKQorICAgICAgICAgICAgeCA9IDM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggPSAyOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgeHh4OgorICAgICAgICAgICAgd2hpbGUgKHggPT0gMykgY29udGludWUgeHh4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgeCsrOworICAgICAgICB9IHdoaWxlICh4IDwgMTAwKTsKKyAgICAgICAgZG8geCsrOyB3aGlsZSAoeCA8IDEwMCk7CisgICAgICAgIGZvciAoQERlcHJlY2F0ZWQgaW50IGkgOiBhcnI0WzBdKSB7CisgICAgICAgICAgICB4LS07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChARGVwcmVjYXRlZCBmaW5hbCBpbnQgaSA9IDAsIGogPSAxOyBpIDwgMTA7IHgrKykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAxOyBpIDwgMTAgJiYgaiA8IDI7IGkrKywgai0tKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IHBhcnNlKEBEZXByZWNhdGVkIEZpbGUgZmlsZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhID0gKChTdHJpbmcpICJxd2UiKTsKKyAgICAgICAgU3RyaW5nIHggPSAoKFN0cmluZykgY2x6MS5nZXROYW1lKCkpOworICAgICAgICBpbnQgeSA9ICgoSW50ZWdlcikgKE9iamVjdCkgeCkuaW50VmFsdWUoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChmaWxlKSB7CisgICAgICAgICAgICBmaWxlID0gbnVsbDsKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImJsYWgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYXRjaCIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmluYWxseSIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJibGFoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbmFsbHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYmxhaCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYXRjaCIpOworICAgICAgICB9CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW4gPSBjcmVhdGVJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgIElucHV0U3RyZWFtIGluMiA9IGNyZWF0ZUlucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F0Y2giKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gY3JlYXRlSW5wdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3aGF0ZXZlciIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIHwgRXJyb3IgZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKYXZhUGFyc2VyLnBhcnNlKGZpbGUpOworICAgIH0KKworICAgIGNsYXNzIEE8VCBleHRlbmRzIEludGVnZXIgJiBTZXJpYWxpemFibGU+IGltcGxlbWVudHMgWFhYLCBTZXJpYWxpemFibGUgeworCisgICAgICAgIHB1YmxpYyA8QUJDPiBBKEludGVnZXIgaW50ZWdlciwgQUJDIHN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSA8WT4gdm9pZCB4KE1hcDw/IGV4dGVuZHMgWCwgPyBzdXBlciBUPiB4KSB7CisgICAgICAgIEBEZXByZWNhdGVkIENvbXBhcmF0b3IgYyA9IG5ldyBDb21wYXJhdG9yKCkgeworCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBPEludGVnZXI+IGEgPSBuZXcgPFN0cmluZz5BPEludGVnZXI+KG5ldyBJbnRlZ2VyKDExKSwgImZvbyIpIHsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShudWxsKTsKKyAgICB9Cit9CisKK2NsYXNzIEJhc2UgeworCisgICAgcHVibGljIDxBLCBCPiB2b2lkIGNoZWNrMihBIHZhbDEsIEIgdmFsMikgeworICAgIH0KK30KKworaW50ZXJmYWNlIFhYWCBleHRlbmRzIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKK30KZGlmZiAtLWdpdCBhL2phdmFwYXJzZXItdGVzdGluZy9zcmMvdGVzdC90ZXN0X3NvdXJjZWNvZGUvY29tL2dpdGh1Yi9qYXZhcGFyc2VyL3ByaW50ZXIvUHJldHR5UHJpbnRWaXNpdG9yLmphdmEgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50VmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNGM5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhcGFyc2VyLXRlc3Rpbmcvc3JjL3Rlc3QvdGVzdF9zb3VyY2Vjb2RlL2NvbS9naXRodWIvamF2YXBhcnNlci9wcmludGVyL1ByZXR0eVByaW50VmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTQxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIErDumxpbyBWaWxtYXIgR2Vzc2VyLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEzLTIwMTYgVGhlIEphdmFQYXJzZXIgVGVhbS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBKYXZhUGFyc2VyLgorICoKKyAqIEphdmFQYXJzZXIgY2FuIGJlIHVzZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogYSkgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBiKSB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiBib3RoIGxpY2Vuc2VzIGluIExJQ0VOQ0UuTEdQTCBhbmQKKyAqIExJQ0VOQ0UuQVBBQ0hFLiBQbGVhc2UgcmVmZXIgdG8gdGhvc2UgZmlsZXMgZm9yIGRldGFpbHMuCisgKgorICogSmF2YVBhcnNlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3BhY2thZ2UgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLnByaW50ZXI7CisKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ib2R5Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5CbG9ja0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5Db21tZW50OworaW1wb3J0IGNvbS5naXRodWIuamF2YXBhcnNlci5hc3QuY29tbWVudHMuSmF2YWRvY0NvbW1lbnQ7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5jb21tZW50cy5MaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0LmV4cHIuKjsKK2ltcG9ydCBjb20uZ2l0aHViLmphdmFwYXJzZXIuYXN0Lm5vZGVUeXBlcy5Ob2RlV2l0aFR5cGVBcmd1bWVudHM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5ub2RlVHlwZXMuTm9kZVdpdGhWYXJpYWJsZXM7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC5zdG10Lio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC50eXBlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5qYXZhcGFyc2VyLmFzdC52aXNpdG9yLlZvaWRWaXNpdG9yOworCitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuUG9zaXRpb25VdGlscy5zb3J0QnlCZWdpblBvc2l0aW9uOworaW1wb3J0IHN0YXRpYyBjb20uZ2l0aHViLmphdmFwYXJzZXIudXRpbHMuVXRpbHMuaXNOdWxsT3JFbXB0eTsKKworLyoqCisgKiBPdXRwdXRzIHRoZSBBU1QgYXMgZm9ybWF0dGVkIEphdmEgc291cmNlIGNvZGUuCisgKgorICogQGF1dGhvciBKdWxpbyBWaWxtYXIgR2Vzc2VyCisgKi8KK3B1YmxpYyBjbGFzcyBQcmV0dHlQcmludFZpc2l0b3IgaW1wbGVtZW50cyBWb2lkVmlzaXRvcjxWb2lkPiB7CisgICAgcHJvdGVjdGVkIGZpbmFsIFByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisgICAgcHJvdGVjdGVkIGZpbmFsIFNvdXJjZVByaW50ZXIgcHJpbnRlcjsKKworICAgIHB1YmxpYyBQcmV0dHlQcmludFZpc2l0b3IoUHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24gcHJldHR5UHJpbnRlckNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgY29uZmlndXJhdGlvbiA9IHByZXR0eVByaW50ZXJDb25maWd1cmF0aW9uOworICAgICAgICBwcmludGVyID0gbmV3IFNvdXJjZVByaW50ZXIoY29uZmlndXJhdGlvbi5nZXRJbmRlbnQoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBwcmludGVyLmdldFNvdXJjZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE1vZGlmaWVycyhmaW5hbCBFbnVtU2V0PE1vZGlmaWVyPiBtb2RpZmllcnMpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KG1vZGlmaWVycy5zdHJlYW0oKS5tYXAoTW9kaWZpZXI6OmFzU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiICIpKSArICIgIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRNZW1iZXJzKGZpbmFsIE5vZGVMaXN0PEJvZHlEZWNsYXJhdGlvbjw/Pj4gbWVtYmVycywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgZm9yIChmaW5hbCBCb2R5RGVjbGFyYXRpb248Pz4gbWVtYmVyIDogbWVtYmVycykgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICBtZW1iZXIuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE1lbWJlckFubm90YXRpb25zKGZpbmFsIE5vZGVMaXN0PEFubm90YXRpb25FeHByPiBhbm5vdGF0aW9ucywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbkV4cHIgYSA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBhLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRBbm5vdGF0aW9ucyhmaW5hbCBOb2RlTGlzdDxBbm5vdGF0aW9uRXhwcj4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gcHJlZml4V2l0aEFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoYW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeFdpdGhBU3BhY2UpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgYW5ub3RhdGlvbi5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFR5cGVBcmdzKGZpbmFsIE5vZGVXaXRoVHlwZUFyZ3VtZW50czw/PiBub2RlV2l0aFR5cGVBcmd1bWVudHMsIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIE5vZGVMaXN0PFR5cGU+IHR5cGVBcmd1bWVudHMgPSBub2RlV2l0aFR5cGVBcmd1bWVudHMuZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KHR5cGVBcmd1bWVudHMpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI8Iik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGU+IGkgPSB0eXBlQXJndW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHQgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIj4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFR5cGVQYXJhbWV0ZXJzKGZpbmFsIE5vZGVMaXN0PFR5cGVQYXJhbWV0ZXI+IGFyZ3MsIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShhcmdzKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiPCIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxUeXBlUGFyYW1ldGVyPiBpID0gYXJncy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZVBhcmFtZXRlciB0ID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgdC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRBcmd1bWVudHMoZmluYWwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJncywgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKCIpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYXJncykpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IGFyZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIikiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRKYXZhQ29tbWVudChmaW5hbCBDb21tZW50IGphdmFjb21tZW50LCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBpZiAoamF2YWNvbW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgamF2YWNvbW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb21waWxhdGlvblVuaXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKworICAgICAgICBpZiAobi5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRQYWNrYWdlRGVjbGFyYXRpb24oKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIG4uZ2V0SW1wb3J0cygpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBpZiAoIW4uZ2V0SW1wb3J0cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFR5cGVEZWNsYXJhdGlvbjw/Pj4gaSA9IG4uZ2V0VHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBpLm5leHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInBhY2thZ2UgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50bG4oIjsiKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOYW1lRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5hbWUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0UXVhbGlmaWVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0UXVhbGlmaWVyKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldElkZW50aWZpZXIoKSk7CisKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChTaW1wbGVOYW1lIG4sIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRJZGVudGlmaWVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludE1lbWJlckFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNb2RpZmllcnMobi5nZXRNb2RpZmllcnMoKSk7CisKKyAgICAgICAgaWYgKG4uaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiaW50ZXJmYWNlICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiY2xhc3MgIik7CisgICAgICAgIH0KKworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBwcmludFR5cGVQYXJhbWV0ZXJzKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKworICAgICAgICBpZiAoIW4uZ2V0RXh0ZW5kZWRUeXBlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIGV4dGVuZHMgIik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPENsYXNzT3JJbnRlcmZhY2VUeXBlPiBpID0gbi5nZXRFeHRlbmRlZFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgaW1wbGVtZW50cyAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q2xhc3NPckludGVyZmFjZVR5cGU+IGkgPSBuLmdldEltcGxlbWVudGVkVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIgeyIpOworICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRNZW1iZXJzKCkpKSB7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKG4pOworCisgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEphdmFkb2NDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50ZXIucHJpbnQoIi8qKiIpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0Q29udGVudCgpKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIqLyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisKKyAgICAgICAgaWYgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRTY29wZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICB9CisgICAgICAgIGZvciAoQW5ub3RhdGlvbkV4cHIgYWUgOiBuLmdldEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGFlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgaWYgKG4uaXNVc2luZ0RpYW1vbmRPcGVyYXRvcigpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI8PiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRUeXBlQXJncyhuLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVHlwZVBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBmb3IgKEFubm90YXRpb25FeHByIGFubiA6IG4uZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgYW5uLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUeXBlQm91bmQoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDbGFzc09ySW50ZXJmYWNlVHlwZT4gaSA9IG4uZ2V0VHlwZUJvdW5kKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzT3JJbnRlcmZhY2VUeXBlIGMgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBjLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgJiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBQcmltaXRpdmVUeXBlIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50QW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VHlwZSgpLmFzU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEFycmF5VHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBmaW5hbCBMaXN0PEFycmF5VHlwZT4gYXJyYXlUeXBlQnVmZmVyID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBUeXBlIHR5cGUgPSBuOworICAgICAgICB3aGlsZSAodHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICBhcnJheVR5cGVCdWZmZXIuYWRkKGFycmF5VHlwZSk7CisgICAgICAgICAgICB0eXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGZvciAoQXJyYXlUeXBlIGFycmF5VHlwZSA6IGFycmF5VHlwZUJ1ZmZlcikgeworICAgICAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhhcnJheVR5cGUuZ2V0QW5ub3RhdGlvbnMoKSwgdHJ1ZSwgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIltdIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUNyZWF0aW9uTGV2ZWwgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIHRydWUsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIlsiKTsKKyAgICAgICAgaWYgKG4uZ2V0RGltZW5zaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0RGltZW5zaW9uKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiXSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEludGVyc2VjdGlvblR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBib29sZWFuIGlzRmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKFJlZmVyZW5jZVR5cGUgZWxlbWVudCA6IG4uZ2V0RWxlbWVudHMoKSkgeworICAgICAgICAgICAgZWxlbWVudC5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgJiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVuaW9uVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgdHJ1ZSwgYXJnKTsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIGVsZW1lbnQgOiBuLmdldEVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIgfCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW1lbnQuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaWxkY2FyZFR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGZhbHNlLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI/Iik7CisgICAgICAgIGlmIChuLmdldEV4dGVuZGVkVHlwZXMoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIGV4dGVuZHMgIik7CisgICAgICAgICAgICBuLmdldEV4dGVuZGVkVHlwZXMoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRTdXBlclR5cGVzKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBzdXBlciAiKTsKKyAgICAgICAgICAgIG4uZ2V0U3VwZXJUeXBlcygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVW5rbm93blR5cGUgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBwcmludAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZpZWxkRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBpZiAoIW4uZ2V0VmFyaWFibGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBuLmdldE1heGltdW1Db21tb25UeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8VmFyaWFibGVEZWNsYXJhdG9yPiBpID0gbi5nZXRWYXJpYWJsZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBmaW5hbCBWYXJpYWJsZURlY2xhcmF0b3IgdmFyID0gaS5uZXh0KCk7CisgICAgICAgICAgICB2YXIuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBUeXBlIGNvbW1vblR5cGUgPSBuLmdldEFuY2VzdG9yT2ZUeXBlKE5vZGVXaXRoVmFyaWFibGVzLmNsYXNzKS5nZXQoKS5nZXRNYXhpbXVtQ29tbW9uVHlwZSgpOworCisgICAgICAgIFR5cGUgdHlwZSA9IG4uZ2V0VHlwZSgpOworCisgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSBjb21tb25UeXBlLmdldEFycmF5TGV2ZWwoKTsgaSA8IHR5cGUuZ2V0QXJyYXlMZXZlbCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhcnJheVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludEFubm90YXRpb25zKGFycmF5VHlwZS5nZXRBbm5vdGF0aW9ucygpLCB0cnVlLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiW10iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuLmdldEluaXRpYWxpemVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgbi5nZXRJbml0aWFsaXplcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlJbml0aWFsaXplckV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgieyIpOworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRWYWx1ZXMoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RXhwcmVzc2lvbj4gaSA9IG4uZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZXhwciA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGV4cHIuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIn0iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWb2lkVHlwZSBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInZvaWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBcnJheUFjY2Vzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIlsiKTsKKyAgICAgICAgbi5nZXRJbmRleCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJdIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXJyYXlDcmVhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgibmV3ICIpOworICAgICAgICBuLmdldEVsZW1lbnRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGZvciAoQXJyYXlDcmVhdGlvbkxldmVsIGxldmVsIDogbi5nZXRMZXZlbHMoKSkgeworICAgICAgICAgICAgbGV2ZWwuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uZ2V0SW5pdGlhbGl6ZXIoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICAgICAgbi5nZXRJbml0aWFsaXplcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzaWduRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldFRhcmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRPcGVyYXRvcigpLmFzU3RyaW5nKCkpOworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIG4uZ2V0VmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCaW5hcnlFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0TGVmdCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRPcGVyYXRvcigpLmFzU3RyaW5nKCkpOworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIG4uZ2V0UmlnaHQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDYXN0RXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDbGFzc0V4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIi5jbGFzcyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIENvbmRpdGlvbmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgPyAiKTsKKyAgICAgICAgbi5nZXRUaGVuRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgOiAiKTsKKyAgICAgICAgbi5nZXRFbHNlRXhwcigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVuY2xvc2VkRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIGlmIChuLmdldElubmVyKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0SW5uZXIoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIpIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRmllbGRBY2Nlc3NFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldFNjb3BlKCkuaXNQcmVzZW50KCkpCisgICAgICAgICAgICBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIi4iKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW5zdGFuY2VPZkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiBpbnN0YW5jZW9mICIpOworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDaGFyTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiJyIpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiciKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBEb3VibGVMaXRlcmFsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KG4uZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgSW50ZWdlckxpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBMb25nTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludChuLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZ0xpdGVyYWxFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIlwiIik7CisgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiXCIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCb29sZWFuTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludChTdHJpbmcudmFsdWVPZihuLmdldFZhbHVlKCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBOdWxsTGl0ZXJhbEV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgibnVsbCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRoaXNFeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmdldENsYXNzRXhwcigpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldENsYXNzRXhwcigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoInRoaXMiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdXBlckV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0Q2xhc3NFeHByKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0Q2xhc3NFeHByKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgic3VwZXIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBNZXRob2RDYWxsRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRTY29wZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldFNjb3BlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRUeXBlQXJncyhuLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRBcmd1bWVudHMobi5nZXRBcmd1bWVudHMoKSwgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBPYmplY3RDcmVhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0U2NvcGUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRTY29wZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludCgibmV3ICIpOworCisgICAgICAgIHByaW50VHlwZUFyZ3MobiwgYXJnKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0VHlwZUFyZ3VtZW50cygpLm9yRWxzZShudWxsKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCisgICAgICAgIHByaW50QXJndW1lbnRzKG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisKKyAgICAgICAgaWYgKG4uZ2V0QW5vbnltb3VzQ2xhc3NCb2R5KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiIHsiKTsKKyAgICAgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRBbm9ueW1vdXNDbGFzc0JvZHkoKS5nZXQoKSwgYXJnKTsKKyAgICAgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIn0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFVuYXJ5RXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRPcGVyYXRvcigpLmlzUHJlZml4KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQobi5nZXRPcGVyYXRvcigpLmFzU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICAgICAgaWYgKG4uZ2V0T3BlcmF0b3IoKS5pc1Bvc3RmaXgoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludChuLmdldE9wZXJhdG9yKCkuYXNTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworICAgICAgICBwcmludFR5cGVQYXJhbWV0ZXJzKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uaXNHZW5lcmljKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIGlmICghbi5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IG4uZ2V0UGFyYW1ldGVycygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXIgcCA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIHAuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIikiKTsKKworICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkobi5nZXRUaHJvd25FeGNlcHRpb25zKCkpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgdGhyb3dzICIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxSZWZlcmVuY2VUeXBlPiBpID0gbi5nZXRUaHJvd25FeGNlcHRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlZmVyZW5jZVR5cGUgbmFtZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIG5hbWUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBpZiAobi5pc0RlZmF1bHQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiZGVmYXVsdCAiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludFR5cGVQYXJhbWV0ZXJzKG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSwgYXJnKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0VHlwZVBhcmFtZXRlcnMoKSkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0UGFyYW1ldGVycygpKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxQYXJhbWV0ZXI+IGkgPSBuLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBwLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIpIik7CisKKyAgICAgICAgaWYgKCFpc051bGxPckVtcHR5KG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIHRocm93cyAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8UmVmZXJlbmNlVHlwZT4gaSA9IG4uZ2V0VGhyb3duRXhjZXB0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWZlcmVuY2VUeXBlIG5hbWUgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBuYW1lLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW4uZ2V0Qm9keSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisgICAgICAgICAgICBuLmdldEJvZHkoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFBhcmFtZXRlciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICBpZiAobi5nZXRUeXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbi5nZXRUeXBlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4uaXNWYXJBcmdzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIi4uLiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmlzVGhpcygpKSB7CisgICAgICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJ0aGlzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobi5nZXRFeHByZXNzaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludFR5cGVBcmdzKG4sIGFyZyk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJzdXBlciIpOworICAgICAgICB9CisgICAgICAgIHByaW50QXJndW1lbnRzKG4uZ2V0QXJndW1lbnRzKCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludEFubm90YXRpb25zKG4uZ2V0QW5ub3RhdGlvbnMoKSwgZmFsc2UsIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisgICAgICAgIGlmICghbi5nZXRWYXJpYWJsZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG4uZ2V0TWF4aW11bUNvbW1vblR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIgIik7CisKKyAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0b3I+IGkgPSBuLmdldFZhcmlhYmxlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRvciB2ID0gaS5uZXh0KCk7CisgICAgICAgICAgICB2LmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExvY2FsQ2xhc3NEZWNsYXJhdGlvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRDbGFzc0RlY2xhcmF0aW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQXNzZXJ0U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJhc3NlcnQgIik7CisgICAgICAgIG4uZ2V0Q2hlY2soKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0TWVzc2FnZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgOiAiKTsKKyAgICAgICAgICAgIG4uZ2V0TWVzc2FnZSgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBCbG9ja1N0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnRsbigieyIpOworICAgICAgICBpZiAobi5nZXRTdGF0ZW1lbnRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RhdGVtZW50IHMgOiBuLmdldFN0YXRlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0VuZGluZyhuKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTGFiZWxlZFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgbi5nZXRMYWJlbCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI6ICIpOworICAgICAgICBuLmdldFN0YXRlbWVudCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVtcHR5U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRXhwcmVzc2lvblN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRPcnBoYW5Db21tZW50c0JlZm9yZVRoaXNDaGlsZE5vZGUobik7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3dpdGNoU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJzd2l0Y2goIik7CisgICAgICAgIG4uZ2V0U2VsZWN0b3IoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIpIHsiKTsKKyAgICAgICAgaWYgKG4uZ2V0RW50cmllcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBlIDogbi5nZXRFbnRyaWVzKCkpIHsKKyAgICAgICAgICAgICAgICBlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIn0iKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN3aXRjaEVudHJ5U3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBpZiAobi5nZXRMYWJlbCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCJjYXNlICIpOworICAgICAgICAgICAgbi5nZXRMYWJlbCgpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiOiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiZGVmYXVsdDoiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgaWYgKG4uZ2V0U3RhdGVtZW50cygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RhdGVtZW50IHMgOiBuLmdldFN0YXRlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEJyZWFrU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJicmVhayIpOworICAgICAgICBuLmdldExhYmVsKCkuaWZQcmVzZW50KGwgLT4gcHJpbnRlci5wcmludCgiICIpLnByaW50KGwuZ2V0SWRlbnRpZmllcigpKSk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBSZXR1cm5TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInJldHVybiIpOworICAgICAgICBpZiAobi5nZXRFeHByZXNzaW9uKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIG4uZ2V0RXhwcmVzc2lvbigpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbnVtRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisgICAgICAgIHByaW50ZXIucHJpbnQoImVudW0gIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworCisgICAgICAgIGlmICghbi5nZXRJbXBsZW1lbnRlZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIgaW1wbGVtZW50cyAiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q2xhc3NPckludGVyZmFjZVR5cGU+IGkgPSBuLmdldEltcGxlbWVudGVkVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NPckludGVyZmFjZVR5cGUgYyA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGMuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludGxuKCIgeyIpOworICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICBpZiAobi5nZXRFbnRyaWVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBpID0gbi5nZXRFbnRyaWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIGUgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBlLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW4uZ2V0TWVtYmVycygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCI7Iik7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW4uZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIudW5pbmRlbnQoKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgifSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEVudW1Db25zdGFudERlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKworICAgICAgICBpZiAoIW4uZ2V0QXJndW1lbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludEFyZ3VtZW50cyhuLmdldEFyZ3VtZW50cygpLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFuLmdldENsYXNzQm9keSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCIgeyIpOworICAgICAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgICAgIHByaW50TWVtYmVycyhuLmdldENsYXNzQm9keSgpLCBhcmcpOworICAgICAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKCJ9Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBFbXB0eU1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbml0aWFsaXplckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIGlmIChuLmlzU3RhdGljKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJZlN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiaWYgKCIpOworICAgICAgICBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBmaW5hbCBib29sZWFuIHRoZW5CbG9jayA9IG4uZ2V0VGhlblN0bXQoKSBpbnN0YW5jZW9mIEJsb2NrU3RtdDsKKyAgICAgICAgaWYgKHRoZW5CbG9jaykgLy8gYmxvY2sgc3RhdGVtZW50IHNob3VsZCBzdGFydCBvbiB0aGUgc2FtZSBsaW5lCisgICAgICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbigiKSIpOworICAgICAgICAgICAgcHJpbnRlci5pbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldFRoZW5TdG10KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIGlmICghdGhlbkJsb2NrKQorICAgICAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICBpZiAobi5nZXRFbHNlU3RtdCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBpZiAodGhlbkJsb2NrKQorICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZWxzZUlmID0gbi5nZXRFbHNlU3RtdCgpLm9yRWxzZShudWxsKSBpbnN0YW5jZW9mIElmU3RtdDsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZWxzZUJsb2NrID0gbi5nZXRFbHNlU3RtdCgpLm9yRWxzZShudWxsKSBpbnN0YW5jZW9mIEJsb2NrU3RtdDsKKyAgICAgICAgICAgIGlmIChlbHNlSWYgfHwgZWxzZUJsb2NrKSAvLyBwdXQgY2hhaW5lZCBpZiBhbmQgc3RhcnQgb2YgYmxvY2sgc3RhdGVtZW50IG9uIGEgc2FtZSBsZXZlbAorICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoImVsc2UgIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oImVsc2UiKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4uZ2V0RWxzZVN0bXQoKS5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgICAgICBuLmdldEVsc2VTdG10KCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoIShlbHNlSWYgfHwgZWxzZUJsb2NrKSkKKyAgICAgICAgICAgICAgICBwcmludGVyLnVuaW5kZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBXaGlsZVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgid2hpbGUgKCIpOworICAgICAgICBuLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIpICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBDb250aW51ZVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiY29udGludWUiKTsKKyAgICAgICAgbi5nZXRMYWJlbCgpLmlmUHJlc2VudChsIC0+IHByaW50ZXIucHJpbnQoIiAiKS5wcmludChsLmdldElkZW50aWZpZXIoKSkpOworICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgRG9TdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoImRvICIpOworICAgICAgICBuLmdldEJvZHkoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiIHdoaWxlICgiKTsKKyAgICAgICAgbi5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKTsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBGb3JlYWNoU3RtdCBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJmb3IgKCIpOworICAgICAgICBuLmdldFZhcmlhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIiA6ICIpOworICAgICAgICBuLmdldEl0ZXJhYmxlKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIEZvclN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiZm9yICgiKTsKKyAgICAgICAgaWYgKG4uZ2V0SW5pdGlhbGl6YXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPEV4cHJlc3Npb24+IGkgPSBuLmdldEluaXRpYWxpemF0aW9uKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4cHJlc3Npb24gZSA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGUuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIjsgIik7CisgICAgICAgIGlmIChuLmdldENvbXBhcmUoKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgbi5nZXRDb21wYXJlKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiOyAiKTsKKyAgICAgICAgaWYgKG4uZ2V0VXBkYXRlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxFeHByZXNzaW9uPiBpID0gbi5nZXRVcGRhdGUoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRXhwcmVzc2lvbiBlID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci5wcmludCgiKSAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgVGhyb3dTdG10IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoInRocm93ICIpOworICAgICAgICBuLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN5bmNocm9uaXplZFN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgic3luY2hyb25pemVkICgiKTsKKyAgICAgICAgbi5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIikgIik7CisgICAgICAgIG4uZ2V0Qm9keSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFRyeVN0bXQgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgidHJ5ICIpOworICAgICAgICBpZiAoIW4uZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgICAgICBJdGVyYXRvcjxWYXJpYWJsZURlY2xhcmF0aW9uRXhwcj4gcmVzb3VyY2VzID0gbi5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAocmVzb3VyY2VzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHZpc2l0KHJlc291cmNlcy5uZXh0KCksIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludCgiOyIpOworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVyLmluZGVudCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobi5nZXRSZXNvdXJjZXMoKS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRlci5wcmludCgiKSAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRUcnlCbG9jaygpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICBuLmdldFRyeUJsb2NrKCkuZ2V0KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBDYXRjaENsYXVzZSBjIDogbi5nZXRDYXRjaENsYXVzZXMoKSkgeworICAgICAgICAgICAgYy5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobi5nZXRGaW5hbGx5QmxvY2soKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiIGZpbmFsbHkgIik7CisgICAgICAgICAgICBuLmdldEZpbmFsbHlCbG9jaygpLmdldCgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQ2F0Y2hDbGF1c2UgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiIGNhdGNoICgiKTsKKyAgICAgICAgbi5nZXRQYXJhbWV0ZXIoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKSAiKTsKKyAgICAgICAgbi5nZXRCb2R5KCkuYWNjZXB0KHRoaXMsIGFyZyk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBBbm5vdGF0aW9uRGVjbGFyYXRpb24gbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRNZW1iZXJBbm5vdGF0aW9ucyhuLmdldEFubm90YXRpb25zKCksIGFyZyk7CisgICAgICAgIHByaW50TW9kaWZpZXJzKG4uZ2V0TW9kaWZpZXJzKCkpOworCisgICAgICAgIHByaW50ZXIucHJpbnQoIkBpbnRlcmZhY2UgIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50bG4oIiB7Iik7CisgICAgICAgIHByaW50ZXIuaW5kZW50KCk7CisgICAgICAgIGlmIChuLmdldE1lbWJlcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludE1lbWJlcnMobi5nZXRNZW1iZXJzKCksIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci51bmluZGVudCgpOworICAgICAgICBwcmludGVyLnByaW50KCJ9Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQW5ub3RhdGlvbk1lbWJlckRlY2xhcmF0aW9uIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50TWVtYmVyQW5ub3RhdGlvbnMobi5nZXRBbm5vdGF0aW9ucygpLCBhcmcpOworICAgICAgICBwcmludE1vZGlmaWVycyhuLmdldE1vZGlmaWVycygpKTsKKworICAgICAgICBuLmdldFR5cGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiICIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKCkiKTsKKyAgICAgICAgaWYgKG4uZ2V0RGVmYXVsdFZhbHVlKCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIiBkZWZhdWx0ICIpOworICAgICAgICAgICAgbi5nZXREZWZhdWx0VmFsdWUoKS5nZXQoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCI7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWFya2VyQW5ub3RhdGlvbkV4cHIgbiwgZmluYWwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiQCIpOworICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwciBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJAIik7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIoIik7CisgICAgICAgIG4uZ2V0TWVtYmVyVmFsdWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIE5vcm1hbEFubm90YXRpb25FeHByIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIkAiKTsKKyAgICAgICAgbi5nZXROYW1lKCkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgaWYgKG4uZ2V0UGFpcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gaSA9IG4uZ2V0UGFpcnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVtYmVyVmFsdWVQYWlyIG0gPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBtLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGVyLnByaW50KCIpIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgTWVtYmVyVmFsdWVQYWlyIG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIHByaW50SmF2YUNvbW1lbnQobi5nZXRDb21tZW50KCksIGFyZyk7CisgICAgICAgIG4uZ2V0TmFtZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCIgPSAiKTsKKyAgICAgICAgbi5nZXRWYWx1ZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIExpbmVDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1ByaW50Q29tbWVudHMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIi8vIik7CisgICAgICAgIFN0cmluZyB0bXAgPSBuLmdldENvbnRlbnQoKTsKKyAgICAgICAgdG1wID0gdG1wLnJlcGxhY2UoJ1xyJywgJyAnKTsKKyAgICAgICAgdG1wID0gdG1wLnJlcGxhY2UoJ1xuJywgJyAnKTsKKyAgICAgICAgcHJpbnRlci5wcmludGxuKHRtcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgQmxvY2tDb21tZW50IG4sIGZpbmFsIFZvaWQgYXJnKSB7CisgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1ByaW50Q29tbWVudHMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnQoIi8qIikucHJpbnQobi5nZXRDb250ZW50KCkpLnByaW50bG4oIiovIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTGFtYmRhRXhwciBuLCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworCisgICAgICAgIGZpbmFsIE5vZGVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG4uZ2V0UGFyYW1ldGVycygpOworICAgICAgICBmaW5hbCBib29sZWFuIHByaW50UGFyID0gbi5pc0VuY2xvc2luZ1BhcmFtZXRlcnMoKTsKKworICAgICAgICBpZiAocHJpbnRQYXIpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoIigiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yPFBhcmFtZXRlcj4gaSA9IHBhcmFtZXRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIHAuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcmludFBhcikgeworICAgICAgICAgICAgcHJpbnRlci5wcmludCgiKSIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRlci5wcmludCgiIC0+ICIpOworICAgICAgICBmaW5hbCBTdGF0ZW1lbnQgYm9keSA9IG4uZ2V0Qm9keSgpOworICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdG10KSB7CisgICAgICAgICAgICAvLyBQcmludCB0aGUgZXhwcmVzc2lvbiBkaXJlY3RseQorICAgICAgICAgICAgKChFeHByZXNzaW9uU3RtdCkgYm9keSkuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9keS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZFJlZmVyZW5jZUV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgRXhwcmVzc2lvbiBzY29wZSA9IG4uZ2V0U2NvcGUoKTsKKyAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBuLmdldElkZW50aWZpZXIoKTsKKyAgICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0U2NvcGUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZXIucHJpbnQoIjo6Iik7CisgICAgICAgIHByaW50VHlwZUFyZ3MobiwgYXJnKTsKKyAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnRlci5wcmludChpZGVudGlmaWVyKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoVHlwZUV4cHIgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgcHJpbnRKYXZhQ29tbWVudChuLmdldENvbW1lbnQoKSwgYXJnKTsKKyAgICAgICAgaWYgKG4uZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG4uZ2V0VHlwZSgpLmFjY2VwdCh0aGlzLCBhcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZUxpc3QgbiwgVm9pZCBhcmcpIHsKKyAgICAgICAgZm9yIChPYmplY3Qgbm9kZSA6IG4pIHsKKyAgICAgICAgICAgICgoTm9kZSkgbm9kZSkuYWNjZXB0KHRoaXMsIGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBJbXBvcnREZWNsYXJhdGlvbiBuLCBmaW5hbCBWb2lkIGFyZykgeworICAgICAgICBwcmludEphdmFDb21tZW50KG4uZ2V0Q29tbWVudCgpLCBhcmcpOworICAgICAgICBwcmludGVyLnByaW50KCJpbXBvcnQgIik7CisgICAgICAgIGlmIChuLmlzU3RhdGljKCkpIHsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoInN0YXRpYyAiKTsKKyAgICAgICAgfQorICAgICAgICBuLmdldE5hbWUoKS5hY2NlcHQodGhpcywgYXJnKTsKKyAgICAgICAgaWYgKG4uaXNBc3RlcmlzaygpKSB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCIuKiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZXIucHJpbnRsbigiOyIpOworCisgICAgICAgIHByaW50T3JwaGFuQ29tbWVudHNFbmRpbmcobik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50T3JwaGFuQ29tbWVudHNCZWZvcmVUaGlzQ2hpbGROb2RlKGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHJldHVybjsKKworICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIExpc3Q8Tm9kZT4gZXZlcnl0aGluZyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZXZlcnl0aGluZy5hZGRBbGwocGFyZW50LmdldENoaWxkTm9kZXMoKSk7CisgICAgICAgIHNvcnRCeUJlZ2luUG9zaXRpb24oZXZlcnl0aGluZyk7CisgICAgICAgIGludCBwb3NpdGlvbk9mVGhlQ2hpbGQgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVyeXRoaW5nLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZXZlcnl0aGluZy5nZXQoaSkgPT0gbm9kZSkgcG9zaXRpb25PZlRoZUNoaWxkID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zaXRpb25PZlRoZUNoaWxkID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkkgYW0gbm90IGEgY2hpbGQgb2YgbXkgcGFyZW50LiIpOworICAgICAgICB9CisgICAgICAgIGludCBwb3NpdGlvbk9mUHJldmlvdXNDaGlsZCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gcG9zaXRpb25PZlRoZUNoaWxkIC0gMTsgaSA+PSAwICYmIHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID09IC0xOyBpLS0pIHsKKyAgICAgICAgICAgIGlmICghKGV2ZXJ5dGhpbmcuZ2V0KGkpIGluc3RhbmNlb2YgQ29tbWVudCkpIHBvc2l0aW9uT2ZQcmV2aW91c0NoaWxkID0gaTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgKyAxOyBpIDwgcG9zaXRpb25PZlRoZUNoaWxkOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZVRvUHJpbnQgPSBldmVyeXRoaW5nLmdldChpKTsKKyAgICAgICAgICAgIGlmICghKG5vZGVUb1ByaW50IGluc3RhbmNlb2YgQ29tbWVudCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29tbWVudCwgaW5zdGVhZCAiICsgbm9kZVRvUHJpbnQuZ2V0Q2xhc3MoKSArICIuIFBvc2l0aW9uIG9mIHByZXZpb3VzIGNoaWxkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcG9zaXRpb25PZlByZXZpb3VzQ2hpbGQgKyAiLCBwb3NpdGlvbiBvZiBjaGlsZCAiICsgcG9zaXRpb25PZlRoZUNoaWxkKTsKKyAgICAgICAgICAgIG5vZGVUb1ByaW50LmFjY2VwdCh0aGlzLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludE9ycGhhbkNvbW1lbnRzRW5kaW5nKGZpbmFsIE5vZGUgbm9kZSkgeworICAgICAgICBMaXN0PE5vZGU+IGV2ZXJ5dGhpbmcgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGV2ZXJ5dGhpbmcuYWRkQWxsKG5vZGUuZ2V0Q2hpbGROb2RlcygpKTsKKyAgICAgICAgc29ydEJ5QmVnaW5Qb3NpdGlvbihldmVyeXRoaW5nKTsKKyAgICAgICAgaWYgKGV2ZXJ5dGhpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29tbWVudHNBdEVuZCA9IDA7CisgICAgICAgIGJvb2xlYW4gZmluZGluZ0NvbW1lbnRzID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKGZpbmRpbmdDb21tZW50cyAmJiBjb21tZW50c0F0RW5kIDwgZXZlcnl0aGluZy5zaXplKCkpIHsKKyAgICAgICAgICAgIE5vZGUgbGFzdCA9IGV2ZXJ5dGhpbmcuZ2V0KGV2ZXJ5dGhpbmcuc2l6ZSgpIC0gMSAtIGNvbW1lbnRzQXRFbmQpOworICAgICAgICAgICAgZmluZGluZ0NvbW1lbnRzID0gKGxhc3QgaW5zdGFuY2VvZiBDb21tZW50KTsKKyAgICAgICAgICAgIGlmIChmaW5kaW5nQ29tbWVudHMpIHsKKyAgICAgICAgICAgICAgICBjb21tZW50c0F0RW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tZW50c0F0RW5kOyBpKyspIHsKKyAgICAgICAgICAgIGV2ZXJ5dGhpbmcuZ2V0KGV2ZXJ5dGhpbmcuc2l6ZSgpIC0gY29tbWVudHNBdEVuZCArIGkpLmFjY2VwdCh0aGlzLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4M2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL3BvbS54bWwKQEAgLTAsMCArMSwzMzYgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5qYXZhcGFyc2VyLWNvcmU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qYXZhcGFyc2VyLXRlc3Rpbmc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qYXZhcGFyc2VyLWNvcmUtZ2VuZXJhdG9yczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmphdmFwYXJzZXItbWV0YW1vZGVsLWdlbmVyYXRvcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1tb2RlbDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1sb2dpYzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmphdmFwYXJzZXItc3ltYm9sLXNvbHZlci1jb3JlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amF2YXBhcnNlci1zeW1ib2wtc29sdmVyLXRlc3Rpbmc8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmphdmFwYXJzZXI8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8dmVyc2lvbj4zLjUuMTYtU05BUFNIT1Q8L3ZlcnNpb24+CisKKyAgICA8bmFtZT5qYXZhcGFyc2VyLXBhcmVudDwvbmFtZT4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyPC91cmw+CisgICAgPGluY2VwdGlvblllYXI+MjAwNzwvaW5jZXB0aW9uWWVhcj4KKyAgICA8ZGVzY3JpcHRpb24+SmF2YSA5IFBhcnNlciBQYXJzZXIgYW5kIEFic3RyYWN0IFN5bnRheCBUcmVlIGZvciBKYXZhPC9kZXNjcmlwdGlvbj4KKworICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5HTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC5odG1sPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+QSBidXNpbmVzcy1mcmllbmRseSBPU1MgbGljZW5zZTwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICA8L2xpY2Vuc2VzPgorCisgICAgPGRldmVsb3BlcnM+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5EYW5ueSB2YW4gQnJ1Z2dlbjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5oZXhhZ29uYWFsQGdtYWlsLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9tYXRvem9pZDwvdXJsPgorICAgICAgICAgICAgPGlkPm1hdG96b2lkPC9pZD4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5Kw7psaW8gVmlsbWFyIEdlc3NlcjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5qZ2Vzc2VyQGdtYWlsLmNvbTwvZW1haWw+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+U2ViYXN0aWFuIEtpcnNjaDwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5zZWJhc3RpYW4ua2lyc2NoQGltbW9iaWxpZW5zY291dDI0LmRlPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL3NlYmFzdGlhbmtpcnNjaDwvdXJsPgorICAgICAgICAgICAgPGlkPnNlYmFzdGlhbmtpcnNjaDwvaWQ+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+QW5kcsOpIFJvdcOpbDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL2JlZm9yZTwvdXJsPgorICAgICAgICAgICAgPGlkPmJlZm9yZTwvaWQ+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+TmljaG9sYXMgU21pdGg8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+c21pZGR5cGVuY2VAZ21haWwuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL1NtaWRkeVBlbmNlPC91cmw+CisgICAgICAgICAgICA8aWQ+U21pZGR5UGVuY2U8L2lkPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkZlZGVyaWNvIFRvbWFzc2V0dGk8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+ZmVkZXJpY29AdG9tYXNzZXR0aS5tZTwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9mdG9tYXNzZXR0aTwvdXJsPgorICAgICAgICAgICAgPGlkPmZ0b21hc3NldHRpPC9pZD4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5EaWRpZXIgVmlsbGV2YWxvaXM8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+cHRpdGplc0BmcmVlLmZyPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL3B0aXRqZXM8L3VybD4KKyAgICAgICAgICAgIDxpZD5wdGl0amVzPC9pZD4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgPC9kZXZlbG9wZXJzPgorICAgIDxjb250cmlidXRvcnM+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPlNlYmFzdGlhbiBLw7xydGVuPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPnNlYmFzdGlhbkB0b3BvYnl0ZS5kZTwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9zZWJrdXI8L3VybD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+SnVuZmVpIExpYW5nPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPmZseTJiZXN0QGdtYWlsLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9mbHkyYmVzdDwvdXJsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5KYXJra28gTWlldHRpbmVuPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL2dpdGh1Yi5jb20vam1pZXR0aW5lbjwvdXJsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5BbGV4ZXkgTW9yb3pvdjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5tb3Jvem92QGFsdGxpbnV4Lm9yZzwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9hbW9yb3pvdjwvdXJsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5Eb25ueSBOYWRvbG55PC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPmRvbm55Lm5hZG9sbnlAZ21haWwuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL2RuYWRvbG55PC91cmw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPlJhcXVlbCBQYXU8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+cmFxdWVscGF1QGdtYWlsLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9ycGF1PC91cmw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkNoYW8gU2hpPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPnN0ZXBpbnRvQGxpdmUuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL3N0ZXBpbnRvPC91cmw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPk1pY2hhZWwgU2NoaWVkZXI8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+bWljaGFlbC5zY2hpZWRlckBnbWFpbC5jb208L2VtYWlsPgorICAgICAgICAgICAgPHVybD5odHRwczovL2dpdGh1Yi5jb20vbXNjaGllZGVyPC91cmw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkNSVVogTWF4aW1pbGllbjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD5tYXhpbWlsaWVuLmNydXpAZ21haWwuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL0RlZXBTbm93TmVlTDwvdXJsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgIDwvY29udHJpYnV0b3JzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgICAgICA8amF2YS52ZXJzaW9uPjEuODwvamF2YS52ZXJzaW9uPgorCisgICAgICAgIDwhLS0gTWF2ZW4gUGx1Z2lucyAtLT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8c2NtPgorICAgICAgICA8Y29ubmVjdGlvbj5zY206Z2l0OmdpdDovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyLmdpdDwvY29ubmVjdGlvbj4KKyAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOmdpdDpnaXRAZ2l0aHViLmNvbTpqYXZhcGFyc2VyL2phdmFwYXJzZXIuZ2l0PC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIuZ2l0PC91cmw+CisgICAgICAgIDx0YWc+SEVBRDwvdGFnPgorICAgIDwvc2NtPgorCisgICAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5HaXRIdWIgSXNzdWUgVHJhY2tlcjwvc3lzdGVtPgorICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvaXNzdWVzPC91cmw+CisgICAgPC9pc3N1ZU1hbmFnZW1lbnQ+CisKKyAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKyAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgICA8aWQ+YmludHJheS1qYXZhcGFyc2VyLUphdmFQYXJzZXI8L2lkPgorICAgICAgICAgICAgPG5hbWU+amF2YXBhcnNlci1KYXZhUGFyc2VyPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL2FwaS5iaW50cmF5LmNvbS9tYXZlbi9qYXZhcGFyc2VyL0phdmFQYXJzZXIvamF2YXBhcnNlci87cHVibGlzaD0xPC91cmw+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uaGVsZ2VyLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5waC1qYXZhY2MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNsZWFuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNS4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNS4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4wLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lbHVkZXIuY292ZXJhbGxzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb3ZlcmFsbHMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj40LjMuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNvY28tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjcuOTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbE9wdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxPcHRpb24+LVhkb2NsaW50Om5vbmU8L2FkZGl0aW9uYWxPcHRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2FkZGl0aW9uYWxPcHRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My43PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFsT3B0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbE9wdGlvbj4tWGRvY2xpbnQ6bm9uZTwvYWRkaXRpb25hbE9wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYWRkaXRpb25hbE9wdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5iaXouYVF1dGUuYm5kPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ibmQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjQuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4wLjAtTTE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjAuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5pbWFsLXNuaWZmZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjE2PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS42LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnRlbXBsYXRpbmctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgIDwvYnVpbGQ+CisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmphdmFzc2lzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yMi4wLUdBPC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yMy40LWpyZTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjQuMTI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQtanVwaXRlci1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+NS4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTMuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5kb2NsaW50LWphdmE4LWRpc2FibGU8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz5bMS44LCk8L2pkaz4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9yZWFkbWUubWQgYi9yZWFkbWUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5NmZkZgotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRtZS5tZApAQCAtMCwwICsxLDkzIEBACisjIEphdmFQYXJzZXINCisNCitbIVtNYXZlbiBDZW50cmFsXShodHRwczovL2ltZy5zaGllbGRzLmlvL21hdmVuLWNlbnRyYWwvdi9jb20uZ2l0aHViLmphdmFwYXJzZXIvamF2YXBhcnNlci1jb3JlLnN2ZyldKGh0dHA6Ly9zZWFyY2gubWF2ZW4ub3JnLyNzZWFyY2glN0NnYXYlN0MxJTdDZyUzQSUyMmNvbS5naXRodWIuamF2YXBhcnNlciUyMiUyMEFORCUyMGElM0ElMjJqYXZhcGFyc2VyLWNvcmUlMjIpDQorWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvamF2YXBhcnNlci9qYXZhcGFyc2VyLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2phdmFwYXJzZXIvamF2YXBhcnNlcikNCitbIVtDb3ZlcmFnZSBTdGF0dXNdKGh0dHBzOi8vY292ZXJhbGxzLmlvL3JlcG9zL2phdmFwYXJzZXIvamF2YXBhcnNlci9iYWRnZS5zdmc/YnJhbmNoPW1hc3RlciZzZXJ2aWNlPWdpdGh1YildKGh0dHBzOi8vY292ZXJhbGxzLmlvL2dpdGh1Yi9qYXZhcGFyc2VyL2phdmFwYXJzZXI/YnJhbmNoPW1hc3RlcikNCitbIVtKb2luIHRoZSBjaGF0IGF0IGh0dHBzOi8vZ2l0dGVyLmltL2phdmFwYXJzZXIvamF2YXBhcnNlcl0oaHR0cHM6Ly9iYWRnZXMuZ2l0dGVyLmltL0pvaW4lMjBDaGF0LnN2ZyldKGh0dHBzOi8vZ2l0dGVyLmltL2phdmFwYXJzZXIvamF2YXBhcnNlcj91dG1fc291cmNlPWJhZGdlJnV0bV9tZWRpdW09YmFkZ2UmdXRtX2NhbXBhaWduPXByLWJhZGdlJnV0bV9jb250ZW50PWJhZGdlKQ0KKw0KK1RoaXMgcHJvamVjdCBjb250YWlucyBhIHNldCBvZiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIGEgSmF2YSAxLjAgLSBKYXZhIDkgUGFyc2VyIHdpdGggYWR2YW5jZWQgYW5hbHlzaXMgZnVuY3Rpb25hbGl0aWVzLg0KKw0KK091ciBtYWluIHNpdGUgaXMgYXQgW0phdmFQYXJzZXIub3JnXShodHRwOi8vamF2YXBhcnNlci5vcmcpDQorDQorIyMgU2V0dXANCisNCitUaGUgcHJvamVjdCBiaW5hcmllcyBhcmUgYXZhaWxhYmxlIGluIE1hdmVuIENlbnRyYWwuIA0KKw0KK1dlIHN0cm9uZ2x5IGFkdmlzZXMgdXNlcnMgdG8gYWRvcHQgTWF2ZW4sIEdyYWRsZSBvciBhbm90aGVyIGJ1aWxkIHN5c3RlbSBmb3IgdGhlaXIgcHJvamVjdHMuIElmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggdGhlbQ0KK3dlIHN1Z2dlc3QgdGFraW5nIGEgbG9vayBhdCB0aGUgbWF2ZW4gcXVpY2tzdGFydCBwcm9qZWN0cyANCisoW2phdmFwYXJzZXItbWF2ZW4tc2FtcGxlXShodHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyLW1hdmVuLXNhbXBsZSksIA0KK1tqYXZhc3ltYm9sc29sdmVyLW1hdmVuLXNhbXBsZV0oaHR0cHM6Ly9naXRodWIuY29tL2phdmFwYXJzZXIvamF2YXN5bWJvbHNvbHZlci1tYXZlbi1zYW1wbGUpKS4NCisNCitKdXN0IGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbWF2ZW4gY29uZmlndXJhdGlvbiBvciB0YWlsb3IgdG8geW91ciBvd24gZGVwZW5kZW5jeSBtYW5hZ2VtZW50IHN5c3RlbS4NCisNCitbUGxlYXNlIHJlZmVyIHRvIHRoZSBNaWdyYXRpb24gR3VpZGUgd2hlbiB1cGdyYWRpbmcgZnJvbSAyLjUuMSB0byAzLjAuMCtdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvd2lraS9NaWdyYXRpb24tR3VpZGUpDQorDQorKipNYXZlbioqOiANCisNCitgYGB4bWwNCis8ZGVwZW5kZW5jeT4NCisgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qYXZhcGFyc2VyPC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5qYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZTwvYXJ0aWZhY3RJZD4NCisgICAgPHZlcnNpb24+My41LjE1PC92ZXJzaW9uPg0KKzwvZGVwZW5kZW5jeT4NCitgYGANCisNCisqKkdyYWRsZSoqOg0KKw0KK2BgYA0KK2NvbXBpbGUgJ2NvbS5naXRodWIuamF2YXBhcnNlcjpqYXZhcGFyc2VyLXN5bWJvbC1zb2x2ZXItY29yZTozLjUuMTUnDQorYGBgDQorDQorU2luY2UgVmVyc2lvbiAzLjUuMTAsIHRoZSBKYXZhUGFyc2VyIHByb2plY3QgaW5jbHVkZXMgdGhlIEphdmFTeW1ib2xTb2x2ZXIuIA0KK1doaWxlIEphdmFQYXJzZXIgZ2VuZXJhdGVzIGFuIEFic3RyYWN0IFN5bnRheCBUcmVlLCBKYXZhU3ltYm9sU29sdmVyIGFuYWx5emVzIHRoYXQgQVNUIGFuZCBpcyBhYmxlIHRvIGZpbmQgDQordGhlIHJlbGF0aW9uIGJldHdlZW4gYW4gZWxlbWVudCBhbmQgaXRzIGRlY2xhcmF0aW9uIChlLmcuIGZvciBhIHZhcmlhYmxlIG5hbWUgaXQgY291bGQgYmUgYSBwYXJhbWV0ZXIgb2YgYSBtZXRob2QsIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgdHlwZSwgcG9zaXRpb24gaW4gdGhlIEFTVCwgZWN0KS4NCisNCitVc2luZyB0aGUgZGVwZW5kZW5jeSBhYm92ZSB3aWxsIGFkZCBib3RoIEphdmFQYXJzZXIgYW5kIEphdmFTeW1ib2xTb2x2ZXIgdG8geW91ciBwcm9qZWN0LiBJZiB5b3Ugb25seSBuZWVkIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgb2YgcGFyc2luZyBKYXZhIHNvdXJjZSBjb2RlIGluIG9yZGVyIHRvIHRyYXZlcnNlIGFuZCBtYW5pcHVsYXRlIHRoZSBnZW5lcmF0ZWQgQVNULCB5b3UgY2FuIHJlZHVjZSB5b3VyIHByb2plY3RzIGJvaWxlcnBsYXRlIGJ5IG9ubHkgaW5jbHVkaW5nIEphdmFQYXJzZXIgdG8geW91ciBwcm9qZWN0Og0KKw0KKyoqTWF2ZW4qKjogDQorDQorYGBgeG1sDQorPGRlcGVuZGVuY3k+DQorICAgIDxncm91cElkPmNvbS5naXRodWIuamF2YXBhcnNlcjwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+amF2YXBhcnNlci1jb3JlPC9hcnRpZmFjdElkPg0KKyAgICA8dmVyc2lvbj4zLjUuMTU8L3ZlcnNpb24+DQorPC9kZXBlbmRlbmN5Pg0KK2BgYA0KKw0KKyoqR3JhZGxlKio6DQorDQorYGBgDQorY29tcGlsZSAnY29tLmdpdGh1Yi5qYXZhcGFyc2VyOmphdmFwYXJzZXItY29yZTozLjUuMTUnDQorYGBgDQorDQorIyMgSG93IFRvIENvbXBpbGUgU291cmNlcw0KKw0KK0lmIHlvdSBjaGVja2VkIG91dCB0aGUgcHJvamVjdCBmcm9tIEdpdEh1YiB5b3UgY2FuIGJ1aWxkIHRoZSBwcm9qZWN0IHdpdGggbWF2ZW4gdXNpbmc6DQorDQorYGBgDQorbXZuIGNsZWFuIGluc3RhbGwNCitgYGANCisNCitJZiB5b3UgY2hlY2tvdXQgdGhlIHNvdXJjZXMgYW5kIHdhbnQgdG8gdmlldyB0aGUgcHJvamVjdCBpbiBhbiBJREUsIGl0IGlzIGJlc3QgdG8gZmlyc3QgZ2VuZXJhdGUgc29tZSBvZiB0aGUgc291cmNlIGZpbGVzOyBvdGhlcndpc2UgeW91IHdpbGwgZ2V0IG1hbnkgY29tcGlsYXRpb24gY29tcGxhaW50cyBpbiB0aGUgSURFLiAobXZuIGNsZWFuIGluc3RhbGwgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHlvdS4pDQorDQorYGBgDQorbXZuIGphdmFjYzpqYXZhY2MNCitgYGANCisNCitJZiB5b3UgbW9kaWZ5IHRoZSBjb2RlIG9mIHRoZSBBU1Qgbm9kZXMsIHNwZWNpZmljYWxseSBpZiB5b3UgYWRkIG9yIHJlbW92ZSBmaWVsZHMgb3Igbm9kZSBjbGFzc2VzLA0KK3RoZSBjb2RlIGdlbmVyYXRvcnMgd2lsbCB1cGRhdGUgYSBsb3Qgb2YgY29kZSBmb3IgeW91Lg0KK1RoZSBgcnVuX21ldGFtb2RlbF9nZW5lcmF0b3Iuc2hgIHNjcmlwdCB3aWxsIHJlYnVpbGQgdGhlIG1ldGFtb2RlbCwNCit3aGljaCBpcyB1c2VkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvcnMgd2hpY2ggYXJlIHJ1biBieSBgcnVuX2NvcmVfZ2VuZXJhdG9ycy5zaGANCitNYWtlIHN1cmUgdGhhdCBgamF2YXBhcnNlci1jb3JlYCBhdCBsZWFzdCBjb21waWxlcyBiZWZvcmUgeW91IHJ1biB0aGVzZS4NCisNCisjIyBNb3JlIGluZm9ybWF0aW9uDQorDQorIyMjIyBbSmF2YVBhcnNlci5vcmddKGh0dHBzOi8vd3d3LmphdmFwYXJzZXIub3JnKSBpcyB0aGUgbWFpbiBpbmZvcm1hdGlvbiBzaXRlLg0KKw0KKyMjIExpY2Vuc2UNCisNCitKYXZhUGFyc2VyIGlzIGF2YWlsYWJsZSBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIExpY2Vuc2Ugb3IgdGhlIEFwYWNoZSBMaWNlbnNlLiBZb3UgYXMgdGhlIHVzZXIgYXJlIGVudGl0bGVkIHRvIGNob29zZSB0aGUgdGVybXMgdW5kZXIgd2hpY2ggYWRvcHQgSmF2YVBhcnNlci4NCisNCitGb3IgZGV0YWlscyBhYm91dCB0aGUgTEdQTCBMaWNlbnNlIHBsZWFzZSByZWZlciB0byBbTElDRU5TRS5MR1BMXSh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhcGFyc2VyL2phdmFwYXJzZXIvYmxvYi9tYXN0ZXIvTElDRU5TRS5MR1BMKS4NCisNCitGb3IgZGV0YWlscyBhYm91dCB0aGUgQXBhY2hlIExpY2Vuc2UgcGxlYXNlIHJlZmVyIHRvIFtMSUNFTlNFLkFQQUNIRV0odHRwczovL2dpdGh1Yi5jb20vamF2YXBhcnNlci9qYXZhcGFyc2VyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UuQVBBQ0hFKS4NCmRpZmYgLS1naXQgYS9ydW5fY29yZV9nZW5lcmF0b3JzLnNoIGIvcnVuX2NvcmVfZ2VuZXJhdG9ycy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmI5MjQxCi0tLSAvZGV2L251bGwKKysrIGIvcnVuX2NvcmVfZ2VuZXJhdG9ycy5zaApAQCAtMCwwICsxLDE5IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMgUnVucyBhbGwgdGhlIGNvZGUgZ2VuZXJhdG9ycy4KKyMgSWYgdGhlIG5vZGUgc3RydWN0dXJlIHdhcyBjaGFuZ2VkLCBydW5fbWV0YW1vZGVsX2dlbmVyYXRvci5zaCBmaXJzdCEKKworIyBSZW1lbWJlciBjdXJyZW50IGRpcmVjdG9yeQorcHVzaGQgamF2YXBhcnNlci1jb3JlLWdlbmVyYXRvcnMKKworIyBHZW5lcmF0ZSBjb2RlCittdm4gY2xlYW4gcGFja2FnZSAtUCBydW4tY29yZS1nZW5lcmF0b3JzIC1Ec2tpcFRlc3RzCisKKyMgR28gYmFjayB0byBwcmV2aW91cyBkaXJlY3RvcnkKK3BvcGQKKworIyBGcmVzaCBjb2RlIGhhcyBiZWVuIGdlbmVyYXRlZCBpbiBjb3JlLCBzbyByZWJ1aWxkIHRoZSB3aG9sZSB0aGluZyBhZ2Fpbi4KK212biBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzCitpZiBbICIkPyIgLW5lIDAgXTsgdGhlbgorICAgIGV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL3J1bl9tZXRhbW9kZWxfZ2VuZXJhdG9yLnNoIGIvcnVuX21ldGFtb2RlbF9nZW5lcmF0b3Iuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjY0NGY5OAotLS0gL2Rldi9udWxsCisrKyBiL3J1bl9tZXRhbW9kZWxfZ2VuZXJhdG9yLnNoCkBAIC0wLDAgKzEsMjQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIyBSZWJ1aWxkcyB0aGUgbWV0YW1vZGVsIGJhc2VkIG9uIHRoZSBub2RlcyBpbiBqYXZhcGFyc2VyLWNvcmUKKworIyBXZSBpbnRyb3NwZWN0IHRoZSBub2RlcyBpbiBqYXZhcGFyc2VyLWNvcmUsIHNvIHdlIG5lZWQgYW4gdXBkYXRlIGJ1aWxkIG9mIGl0LiAKK212biBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzCitpZiBbICIkPyIgLW5lIDAgXTsgdGhlbgorICAgIGV4aXQgMQorZmkKKworIyBSZW1lbWJlciBjdXJyZW50IGRpcmVjdG9yeQorcHVzaGQgamF2YXBhcnNlci1tZXRhbW9kZWwtZ2VuZXJhdG9yCisKKyMgR2VuZXJhdGUgY29kZQorbXZuIGNsZWFuIHBhY2thZ2UgLVAgcnVuLW1ldGFtb2RlbC1nZW5lcmF0b3IgLURza2lwVGVzdHMKKworIyBHbyBiYWNrIHRvIHByZXZpb3VzIGRpcmVjdG9yeQorcG9wZAorCisjIEZyZXNoIGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGluIGNvcmUsIHNvIHJlYnVpbGQgdGhlIHdob2xlIHRoaW5nIGFnYWluLgorbXZuIGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2lmIFsgIiQ/IiAtbmUgMCBdOyB0aGVuCisgICAgZXhpdCAxCitmaQo=